commit d649185ef6f51f98863eb2cb11a9a85e8f16f033 Author: Rodweil, Theodor Date: Mon Aug 7 01:26:15 2023 +0200 feat: init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9f714ca --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +.DS_Store +/build +/.venv +__pycache__ +/.tox +*.egg-info + +# FAT stuff, in a filesystem sense +._* diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..f257c64 --- /dev/null +++ b/Pipfile @@ -0,0 +1,15 @@ +[[source]] +url = 'https://pypi.python.org/simple' +verify_ssl = true +name = 'pypi' + +[requires] +python_version = '3' + +[scripts] + +[dev-packages] +tox = '==3.23.0' + +[packages] +xconfluencebuilder = {editable = true, path = "."} diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 0000000..2390947 --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,401 @@ +{ + "_meta": { + "hash": { + "sha256": "e5bdadc35216204e34f2807bbf95f2997d16ea8d6ed8f2341ccc405fbb0c10ce" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.python.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "alabaster": { + "hashes": [ + "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3", + "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2" + ], + "markers": "python_version >= '3.6'", + "version": "==0.7.13" + }, + "babel": { + "hashes": [ + "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610", + "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455" + ], + "markers": "python_version >= '3.7'", + "version": "==2.12.1" + }, + "certifi": { + "hashes": [ + "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082", + "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" + ], + "markers": "python_version >= '3.6'", + "version": "==2023.7.22" + }, + "charset-normalizer": { + "hashes": [ + "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96", + "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c", + "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710", + "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706", + "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020", + "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252", + "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad", + "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329", + "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a", + "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f", + "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6", + "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4", + "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a", + "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46", + "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2", + "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23", + "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace", + "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd", + "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982", + "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10", + "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2", + "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea", + "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09", + "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5", + "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149", + "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489", + "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9", + "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80", + "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592", + "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3", + "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6", + "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed", + "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c", + "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200", + "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a", + "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e", + "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d", + "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6", + "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623", + "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669", + "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3", + "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa", + "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9", + "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2", + "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f", + "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1", + "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4", + "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a", + "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8", + "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3", + "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029", + "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f", + "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959", + "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22", + "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7", + "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952", + "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346", + "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e", + "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d", + "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299", + "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd", + "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a", + "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3", + "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037", + "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94", + "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c", + "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858", + "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a", + "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449", + "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c", + "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918", + "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1", + "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c", + "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac", + "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==3.2.0" + }, + "docutils": { + "hashes": [ + "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125", + "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==0.17.1" + }, + "idna": { + "hashes": [ + "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", + "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" + ], + "markers": "python_version >= '3.5'", + "version": "==3.4" + }, + "imagesize": { + "hashes": [ + "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", + "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.4.1" + }, + "jinja2": { + "hashes": [ + "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852", + "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61" + ], + "markers": "python_version >= '3.7'", + "version": "==3.1.2" + }, + "markupsafe": { + "hashes": [ + "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e", + "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e", + "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431", + "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686", + "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559", + "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc", + "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c", + "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0", + "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4", + "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9", + "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575", + "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba", + "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d", + "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3", + "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00", + "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155", + "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac", + "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52", + "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f", + "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8", + "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b", + "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24", + "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea", + "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198", + "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0", + "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee", + "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be", + "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2", + "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707", + "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6", + "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58", + "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779", + "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636", + "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c", + "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad", + "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee", + "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc", + "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2", + "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48", + "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7", + "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e", + "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b", + "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa", + "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5", + "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e", + "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb", + "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9", + "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57", + "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc", + "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2" + ], + "markers": "python_version >= '3.7'", + "version": "==2.1.3" + }, + "packaging": { + "hashes": [ + "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61", + "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f" + ], + "markers": "python_version >= '3.7'", + "version": "==23.1" + }, + "pygments": { + "hashes": [ + "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692", + "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29" + ], + "markers": "python_version >= '3.7'", + "version": "==2.16.1" + }, + "requests": { + "hashes": [ + "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", + "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" + ], + "markers": "python_version >= '3.7'", + "version": "==2.31.0" + }, + "snowballstemmer": { + "hashes": [ + "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", + "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a" + ], + "version": "==2.2.0" + }, + "sphinx": { + "hashes": [ + "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6", + "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226" + ], + "markers": "python_version >= '3.6'", + "version": "==4.5.0" + }, + "sphinxcontrib-applehelp": { + "hashes": [ + "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228", + "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e" + ], + "markers": "python_version >= '3.8'", + "version": "==1.0.4" + }, + "sphinxcontrib-confluencebuilder": { + "hashes": [ + "sha256:4724a142dfedf2d9c4e591ccd160d0fa3aef5de9b7cb6e2d0a98f7b3a4e1abe8", + "sha256:a8ff24b380c6ee4b3c736382b9b7da81bc345cd66a0ef0d56891bef79eff8d49" + ], + "markers": "python_version >= '3.7'", + "version": "==2.0.0" + }, + "sphinxcontrib-devhelp": { + "hashes": [ + "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e", + "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4" + ], + "markers": "python_version >= '3.5'", + "version": "==1.0.2" + }, + "sphinxcontrib-htmlhelp": { + "hashes": [ + "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff", + "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903" + ], + "markers": "python_version >= '3.8'", + "version": "==2.0.1" + }, + "sphinxcontrib-jsmath": { + "hashes": [ + "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", + "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8" + ], + "markers": "python_version >= '3.5'", + "version": "==1.0.1" + }, + "sphinxcontrib-qthelp": { + "hashes": [ + "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72", + "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6" + ], + "markers": "python_version >= '3.5'", + "version": "==1.0.3" + }, + "sphinxcontrib-serializinghtml": { + "hashes": [ + "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd", + "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952" + ], + "markers": "python_version >= '3.5'", + "version": "==1.1.5" + }, + "urllib3": { + "hashes": [ + "sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11", + "sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4" + ], + "markers": "python_version >= '3.7'", + "version": "==2.0.4" + }, + "x-confluencebuilder": { + "editable": true, + "path": "." + } + }, + "develop": { + "distlib": { + "hashes": [ + "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057", + "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8" + ], + "version": "==0.3.7" + }, + "filelock": { + "hashes": [ + "sha256:002740518d8aa59a26b0c76e10fb8c6e15eae825d34b6fdf670333fd7b938d81", + "sha256:cbb791cdea2a72f23da6ac5b5269ab0a0d161e9ef0100e653b69049a7706d1ec" + ], + "markers": "python_version >= '3.7'", + "version": "==3.12.2" + }, + "packaging": { + "hashes": [ + "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61", + "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f" + ], + "markers": "python_version >= '3.7'", + "version": "==23.1" + }, + "platformdirs": { + "hashes": [ + "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d", + "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d" + ], + "markers": "python_version >= '3.7'", + "version": "==3.10.0" + }, + "pluggy": { + "hashes": [ + "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849", + "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3" + ], + "markers": "python_version >= '3.7'", + "version": "==1.2.0" + }, + "py": { + "hashes": [ + "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719", + "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==1.11.0" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.16.0" + }, + "toml": { + "hashes": [ + "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", + "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" + ], + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==0.10.2" + }, + "tox": { + "hashes": [ + "sha256:05a4dbd5e4d3d8269b72b55600f0b0303e2eb47ad5c6fe76d3576f4c58d93661", + "sha256:e007673f3595cede9b17a7c4962389e4305d4a3682a6c5a4159a1453b4f326aa" + ], + "index": "pypi", + "version": "==3.23.0" + }, + "virtualenv": { + "hashes": [ + "sha256:43a3052be36080548bdee0b42919c88072037d50d56c28bd3f853cbe92b953ff", + "sha256:fd8a78f46f6b99a67b7ec5cf73f92357891a7b3a40fd97637c27f854aae3b9e0" + ], + "markers": "python_version >= '3.7'", + "version": "==20.24.2" + } + } +} diff --git a/samples/default/.gitignore b/samples/default/.gitignore new file mode 100644 index 0000000..f3d6549 --- /dev/null +++ b/samples/default/.gitignore @@ -0,0 +1 @@ +/build/ \ No newline at end of file diff --git a/samples/default/Pipfile b/samples/default/Pipfile new file mode 100644 index 0000000..4c48777 --- /dev/null +++ b/samples/default/Pipfile @@ -0,0 +1,13 @@ +[[source]] +url = 'https://pypi.python.org/simple' +verify_ssl = true +name = 'pypi' + +[requires] +python_version = '3' + +[scripts] +"sphinx-build" = "sphinx-build docs build --color -W -bx_confluence" + +[packages] +xconfluencebuilder = {editable = true, path = "./../.."} diff --git a/samples/default/Pipfile.lock b/samples/default/Pipfile.lock new file mode 100644 index 0000000..f7a3678 --- /dev/null +++ b/samples/default/Pipfile.lock @@ -0,0 +1,321 @@ +{ + "_meta": { + "hash": { + "sha256": "a418d82a4e7fba15036bd570926eef64c00f45efb7c30f8742b1abdc4cb1d6b3" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.python.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "alabaster": { + "hashes": [ + "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3", + "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2" + ], + "markers": "python_version >= '3.6'", + "version": "==0.7.13" + }, + "babel": { + "hashes": [ + "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610", + "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455" + ], + "markers": "python_version >= '3.7'", + "version": "==2.12.1" + }, + "certifi": { + "hashes": [ + "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7", + "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716" + ], + "markers": "python_version >= '3.6'", + "version": "==2023.5.7" + }, + "charset-normalizer": { + "hashes": [ + "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96", + "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c", + "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710", + "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706", + "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020", + "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252", + "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad", + "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329", + "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a", + "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f", + "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6", + "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4", + "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a", + "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46", + "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2", + "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23", + "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace", + "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd", + "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982", + "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10", + "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2", + "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea", + "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09", + "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5", + "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149", + "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489", + "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9", + "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80", + "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592", + "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3", + "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6", + "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed", + "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c", + "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200", + "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a", + "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e", + "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d", + "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6", + "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623", + "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669", + "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3", + "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa", + "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9", + "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2", + "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f", + "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1", + "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4", + "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a", + "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8", + "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3", + "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029", + "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f", + "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959", + "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22", + "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7", + "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952", + "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346", + "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e", + "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d", + "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299", + "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd", + "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a", + "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3", + "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037", + "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94", + "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c", + "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858", + "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a", + "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449", + "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c", + "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918", + "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1", + "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c", + "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac", + "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==3.2.0" + }, + "docutils": { + "hashes": [ + "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125", + "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==0.17.1" + }, + "idna": { + "hashes": [ + "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", + "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" + ], + "markers": "python_version >= '3.5'", + "version": "==3.4" + }, + "imagesize": { + "hashes": [ + "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", + "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.4.1" + }, + "jinja2": { + "hashes": [ + "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852", + "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61" + ], + "markers": "python_version >= '3.7'", + "version": "==3.1.2" + }, + "markupsafe": { + "hashes": [ + "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e", + "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e", + "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431", + "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686", + "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559", + "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc", + "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c", + "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0", + "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4", + "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9", + "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575", + "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba", + "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d", + "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3", + "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00", + "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155", + "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac", + "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52", + "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f", + "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8", + "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b", + "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24", + "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea", + "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198", + "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0", + "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee", + "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be", + "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2", + "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707", + "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6", + "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58", + "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779", + "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636", + "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c", + "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad", + "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee", + "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc", + "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2", + "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48", + "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7", + "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e", + "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b", + "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa", + "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5", + "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e", + "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb", + "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9", + "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57", + "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc", + "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2" + ], + "markers": "python_version >= '3.7'", + "version": "==2.1.3" + }, + "packaging": { + "hashes": [ + "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61", + "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f" + ], + "markers": "python_version >= '3.7'", + "version": "==23.1" + }, + "pygments": { + "hashes": [ + "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c", + "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1" + ], + "markers": "python_version >= '3.7'", + "version": "==2.15.1" + }, + "requests": { + "hashes": [ + "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", + "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" + ], + "markers": "python_version >= '3.7'", + "version": "==2.31.0" + }, + "snowballstemmer": { + "hashes": [ + "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", + "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a" + ], + "version": "==2.2.0" + }, + "sphinx": { + "hashes": [ + "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6", + "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226" + ], + "markers": "python_version >= '3.6'", + "version": "==4.5.0" + }, + "sphinxcontrib-applehelp": { + "hashes": [ + "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228", + "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e" + ], + "markers": "python_version >= '3.8'", + "version": "==1.0.4" + }, + "sphinxcontrib-confluencebuilder": { + "hashes": [ + "sha256:4724a142dfedf2d9c4e591ccd160d0fa3aef5de9b7cb6e2d0a98f7b3a4e1abe8", + "sha256:a8ff24b380c6ee4b3c736382b9b7da81bc345cd66a0ef0d56891bef79eff8d49" + ], + "markers": "python_version >= '3.7'", + "version": "==2.0.0" + }, + "sphinxcontrib-devhelp": { + "hashes": [ + "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e", + "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4" + ], + "markers": "python_version >= '3.5'", + "version": "==1.0.2" + }, + "sphinxcontrib-htmlhelp": { + "hashes": [ + "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff", + "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903" + ], + "markers": "python_version >= '3.8'", + "version": "==2.0.1" + }, + "sphinxcontrib-jsmath": { + "hashes": [ + "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", + "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8" + ], + "markers": "python_version >= '3.5'", + "version": "==1.0.1" + }, + "sphinxcontrib-qthelp": { + "hashes": [ + "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72", + "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6" + ], + "markers": "python_version >= '3.5'", + "version": "==1.0.3" + }, + "sphinxcontrib-serializinghtml": { + "hashes": [ + "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd", + "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952" + ], + "markers": "python_version >= '3.5'", + "version": "==1.1.5" + }, + "urllib3": { + "hashes": [ + "sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1", + "sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825" + ], + "markers": "python_version >= '3.7'", + "version": "==2.0.3" + }, + "x-confluencebuilder": { + "editable": true, + "path": "./../.." + } + }, + "develop": {} +} diff --git a/samples/default/README.md b/samples/default/README.md new file mode 100644 index 0000000..019fbec --- /dev/null +++ b/samples/default/README.md @@ -0,0 +1,27 @@ +# Default Sample + +This is a sample/reference implementation of the `xconfluencebuilder`. It +provides a Sphinx build with 2 ancestrally related pages, where the child page +contains an attachment. + +Output is directed to the `build/` directory, which will contain the regular +``sphinxcontrib.confluencebuilder`` artifacts in addition to the publishing +manifest and referenced assets. + +# Instructions + +To run this reference implementation, you are required to have +[pipenv](https://pipenv.pypa.io/en/latest/) installed on your system. + +Install the virtual environment by executing the following command from within +this directory: + +``` +$ python3 -m pipenv install +``` + +Afterwards, you can build all assets by issuing the following command + +``` +$ python3 -m pipenv run sphinx-build +``` diff --git a/samples/default/docs/_media/pexels-just-a-couple-photos-3777622.jpg b/samples/default/docs/_media/pexels-just-a-couple-photos-3777622.jpg new file mode 100644 index 0000000..2f8d125 Binary files /dev/null and b/samples/default/docs/_media/pexels-just-a-couple-photos-3777622.jpg differ diff --git a/samples/default/docs/_media/pexels-sami-aksu-14356302.jpg b/samples/default/docs/_media/pexels-sami-aksu-14356302.jpg new file mode 100644 index 0000000..477e0a8 Binary files /dev/null and b/samples/default/docs/_media/pexels-sami-aksu-14356302.jpg differ diff --git a/samples/default/docs/cats.rst b/samples/default/docs/cats.rst new file mode 100644 index 0000000..e19ad05 --- /dev/null +++ b/samples/default/docs/cats.rst @@ -0,0 +1,13 @@ +#### +Cats +#### + +What can we say... They secretly rule the world. + +.. image:: _media/pexels-just-a-couple-photos-3777622.jpg + +photo by: https://www.pexels.com/@jacp/ + +.. image:: _media/pexels-sami-aksu-14356302.jpg + +photo by: https://www.pexels.com/@sami-aksu-48867324/ diff --git a/samples/default/docs/conf.py b/samples/default/docs/conf.py new file mode 100644 index 0000000..6059fbd --- /dev/null +++ b/samples/default/docs/conf.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3 +""" +""" +__author__ = 'theodor.rodweil@victory-k.it' +__copyright__ = '2023 - Victory Karma IT' +__license__ = 'UNLICENSED' +__version__ = "1.0" + +import sys +from pathlib import Path + +# -- Project information ------------------------------------------------------- + +project = 'Default Sample' + +copyright = __copyright__ + +author = __author__ + +# `release` is supported, yet some extensions still use the deprecated `version` +release = __version__ +version = release + +extensions = ['xconfluencebuilder'] + +exclude_patterns = ['Pipfile*', 'build', '.DS_Store', '.venv'] + +confluence_server_url = 'https://confluence.adesso.de/' + +confluence_space_key = '~Tiara.Rodney@adesso.de' + +confluence_publish = True + +confluence_publish_dryrun = True + +confluence_publish_token = 'OTI5NjA5ODc4MzQ5Oh1iD55oEGu7XKRazXHAW5p8mR5r' diff --git a/samples/default/docs/confluence_conf.py b/samples/default/docs/confluence_conf.py new file mode 100644 index 0000000..3a68843 --- /dev/null +++ b/samples/default/docs/confluence_conf.py @@ -0,0 +1,132 @@ +#!/usr/bin/env python3 +"""Wrapper for Confluence Sphinx Builder + +enables support for configuration through shell environment variables + +.. warning:: + make sure to pin a concrete version of the ```` +""" +__author__ = 'theodor.rodweil@victory-k.it' +__copyright__ = '2023 - Victory Karma IT' +__license__ = 'DL-DE-BY-2.0' +__version__ = '1.2.0' + + +from dataclasses import dataclass, fields, asdict +from typing import Any, Optional, Callable, Type +from os import environ + + +#: rudimentary typecasting of serialized Python built-ins +DEFAULT_TYPECASTS = { + 'str': lambda inp: str(inp), + 'bool': lambda inp: {'true': True, 'false': False}[inp.lower()] +} + + +def get_config_from_environ( + typecasts: dict[str, Callable] = DEFAULT_TYPECASTS +) -> 'ConfluenceBuilderConfig': + """get confluence builder config from environment + + :param typecasts: a collection of built-in typecast functions + """ + props = {field.name:field.type for field in fields(ConfluenceBuilderConfig)} + + prop_names = props.keys() + + out = {} + + for environ_name in dict(environ).keys(): + + env_name = environ_name + + if env_name in prop_names: + + type_name = props[env_name].__name__ + + if type_name == 'Optional': + + type_name = props[env_name].__args__[0].__name__ + + value = typecasts[type_name]( + environ[environ_name] + ) + + if value is not None: + + out[env_name] = value + + try: + + return ConfluenceBuilderConfig(**out) + + except TypeError as err: + + raise TypeError(f'error getting config from environ: {err}') from err + + +def apply_config( + config: 'ConfluenceBuildConfig', + env: dict = globals() +) -> None: + """apply confluence builder config to runtime environment + + :param config: configuration instance object + :param env: global runtime variables instance object + """ + for key, value in asdict(config).items(): + + env[key.lower()] = value + + +@dataclass +class ConfluenceBuilderConfig: + """partial configuration of the Confluence builder for Sphinx + + see + `https://sphinxcontrib-confluencebuilder.readthedocs.io/en/stable/configuration/`_ + , for more information. + + """ + #: The URL for the Confluence instance to publish to. + CONFLUENCE_SERVER_URL: str + + #: The username value used to authenticate with the Confluence instance. + CONFLUENCE_SERVER_USER: Optional[str] = None + + #: Key of the space in Confluence to be used to publish generated documents + CONFLUENCE_SPACE_KEY: Optional[str] = None + + #: The username value used to authenticate with the Confluence instance. + CONFLUENCE_PUBLISH_DRYRUN: Optional[bool] = None + + #: A boolean that decides whether or not to allow publishing. + CONFLUENCE_PUBLISH: bool = True + + #: A boolean value to whether or not nest pages in a hierarchical ordered. + CONFLUENCE_PAGE_HIERARCHY: bool = True + + #: The password value used to authenticate with the Confluence instance. + CONFLUENCE_SERVER_PASS: Optional[str] = None + + #: The personal access token value used to authenticate with the Confluence + # instance + CONFLUENCE_PUBLISH_TOKEN: Optional[str] = None + + #: The root page found inside the configured space (confluence_space_key) + # where published pages will be a descendant of + CONFLUENCE_PARENT_PAGE: Optional[str] = None + + @staticmethod + def from_environ() -> 'ConfluenceBuilderConfig': + """get a new configuration object + """ + + return get_config_from_environ() + + def apply(self: Type, env: dict = globals()) -> None: + """apply the configuration to the current runtime environment + """ + + return apply_config(self, env) diff --git a/samples/default/docs/index.rst b/samples/default/docs/index.rst new file mode 100644 index 0000000..f6dd0e8 --- /dev/null +++ b/samples/default/docs/index.rst @@ -0,0 +1,38 @@ +############### +Default Sample~ +############### + +.. note:: + + ``confluence_conf.py`` is not required, it's just a helper module to be + able to configure ``sphinxcontrib.confluencebuilder`` through environment + variables. + +To run this sample, `pipenv `_ is required. + +First, install the *venv* by executing the following command from within the +``samples/default/`` directory: + +.. code-block:: + + $ python3 -m pipenv install + +.. note:: + + To contain the virtual environment within the current directory, create an + empty directory named ``.venv``. + +Afterwards, execute the following command: + +.. code-block:: + + $ python3 -m pipenv run build-sphinx + +The backend for the command can be inspected in ``Pipfile``. + +You should now have a directory + +.. toctree:: + :caption: Important Content + + cats diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..6af33e2 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,28 @@ +[metadata] +name = x-confluencebuilder +version = 1.0.0-alpha.1 +author = Theodor Rodweil +author_email = theodor.rodweil@victory-k.it +description = sphinxcontrib.confluencebuilder wrapper for delayed publishing +long_description = file: README.md +long_description_content_type = text/markdown + +classifiers = +´ topic = : Software Development :: Libraries :: Python Modules + Programming Language :: Python :: 3 + Operating System :: OS Independent + License :: Other/Proprietary License + +[options] +install_requires = + sphinx >=4.5,<5 + sphinxcontrib-confluencebuilder +zip_safe = true +package_dir = + =src +python_requires = >=3.7 +test_suite = test +packages = find: + +[options.packages.find] +where = src diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..f187f2c --- /dev/null +++ b/setup.py @@ -0,0 +1,4 @@ +#!/usr/bin/env python3 +import setuptools + +setuptools.setup() diff --git a/src/xconfluencebuilder/__init__.py b/src/xconfluencebuilder/__init__.py new file mode 100644 index 0000000..0ab554a --- /dev/null +++ b/src/xconfluencebuilder/__init__.py @@ -0,0 +1,426 @@ +#!/usr/bin/env python3 +"""Publishment delay wrapper sphinxcontrib.confluencebuilder + +This is a lightweight pass-through wrapper for +``sphinxcontrib.confluencebuilder``, which intercepts all ``store_*`` calls on +a ``ConfluencePublisher`` instance, dumps all data into interchange. +The index and dumps can be used in conjunction with the PowerShell +helper to delay/replay the publishment of pages and attachments for a different +Confluence instance, than what the programmatic target is. + +The builder name is ``x_confluence`` + +``Publisher``, ``Builder``, as well as ``Rest`` instances are mocked and are +supressing any HTTP connectivity should the ``confluence_publish_dry_run`` be +set to ``True``. + +.. warning:: + + ``confluence_publish_dry_run`` MUST be set to ``True`` + +Content (pages) and attachments are dumped into separate file_s and indexed. + +The output directory can be set through ``x_confluence_outdir``. + +The use-case for this implementation is as follows: + + I am currently facing the situation where i need to publish to an + air-gapped Confluence server inside a virtualised and privatised + environment (over Windows VDI). In addition, company policy forbids me from + using, or installing Python + on the VDI. I can freeload a perl executable that came bundled with Git for + Windows, but there are no other scripting means besides Windows PowerShell. + +""" +__author__ = 'theodor.rodweil@victory-k.it' +__copyright__ = '2023 - Victory Karma IT' +__license__ = 'DL-DE-BY-2.0' + +from dataclasses import dataclass, asdict +from hashlib import sha256 +import json +from mimetypes import guess_extension +from pathlib import Path +from typing import Any, Optional, ByteString, Dict, Tuple, List +from unittest.mock import patch +from uuid import uuid4 +from urllib.parse import quote_plus + +from sphinx.application import Sphinx +from sphinx.util import logging + +from sphinxcontrib.confluencebuilder import setup as _setup +from sphinxcontrib.confluencebuilder.builder import ( + ConfluenceBuilder as _ConfluenceBuilder +) +from sphinxcontrib.confluencebuilder.publisher import ( + ConfluencePublisher as _ConfluencePublisher +) +from sphinxcontrib.confluencebuilder.rest import Rest as _Rest + + +logger = logging.getLogger(__name__) + + +def generate_checksum_label(content: ByteString, width: int = 16) -> str: + """Generate a checksum to be used as a confluence content label + + :param content: content to create checksum for + :param width: cut off digest after ``width`` characters + """ + hash_ = sha256() + + hash_.update(content) + + return hash_.hexdigest()[:width] + + +@dataclass +class PageMeta: + """ + see + `https://docs.atlassian.com/ConfluenceServer/rest/8.4.0/#api/content-createContent`_, + for more information + """ + #: title of page + title: str + #: Local filesystem reference/path. The reference MUST be relative. + ref: str + #: title of Confluence page this page is a child of + ancestor_title: Optional[str] = None + + +@dataclass +class AttachmentMeta: + """ + """ + #: name of attachment, which must be unique within the container page + name: str + #: title of confluence page this attachment is contained in the title must + # be a property key of the pages object + container_page_title: str + #: MIME type of attachment + mime_type: str + #: Local filesystem reference/path. The reference MUST be relative. + ref: str + + +@dataclass +class Manifest: + """ + """ + #: + pages: List[PageMeta] + + #: + attachments: List[AttachmentMeta] + + +page_meta_key_map = { + 'title': 'Title', + 'ref': 'Ref', + 'ancestor_title': 'AncestorTitle' +} + + +attachment_meta_key_map = { + 'name': 'Name', + 'container_page_title': 'ContainerPageTitle', + 'mime_type': 'MimeType', + 'ref': 'Ref' +} + + +manifest_key_map = { + 'pages': 'Pages', + 'attachments': 'Attachments' +} + + +def sanitize_dict_keys( + obj: dict, + key_map: dict, +) -> dict: + """transform the keys of a dictionary in accordance with a map + + key-value pairs where the value is ``None`` will be discarded entirely + + :param obj: the dictionary to transform + :param key_map: a map of the keys to transform, where the key is the + original key and the value is the key to transform to + + :returns: the transformed dictionary + """ + return {key_map[k]:v for k, v in obj.items() if v is not None} + + +class Rest(_Rest): + """ + """ + def __init__(self, config): + """ + """ + + super().__init__(config) + + def __getattr__(self, name: str) -> Any: + """ + """ + return super().__getattribute__(name) + + def __setattr__(self, name: str, value: Any) -> None: + """ + """ + return super().__setattr__(name, value) + + def get(self, key, params=None): + """ + + .. note:: + this is a non-sensical mock just to make the backend happy. This + isn't required for dumping the content. + """ + return {'results': [ + { + 'id': 1234567890, + 'key': 'NULL', + 'name': 'NULL', + 'type': 'NULL' + } + ], 'size': 1, 'limit': 1, 'start': 0} + + +class ConfluencePublisher(_ConfluencePublisher): + """ + """ + def __init__(self): + """ + """ + super().__init__() + + self.dump = Manifest( + pages = [], + attachments = [] + ) + + def __getattr__(self, name: str) -> Any: + """ + """ + return super().__getattribute__(name) + + def __setattr__(self, name: str, value: Any) -> None: + """ + """ + return super().__setattr__(name, value) + + def connect(self): + """initialize a REST client and probe the target Confluence instance + + .. note:: + + Actually, i don't want the extension to initialize a connection, + but there is too much entanglement, so we're mocking the absolute + minimum for the publisher object to assume everything is fine + """ + with patch('sphinxcontrib.confluencebuilder.publisher.Rest', Rest): + + return super().connect() + + def get_page_by_id(self, page_id, expand = 'version') -> Tuple[None, List]: + """get page information with the provided page name + + :param page_id: the page identifier + :param expand: data to expand on + + :returns: page id and page object + """ + return (None, []) + + def store_attachment( + self, + page_id: str, + name: str, + data: Any, + mimetype: Any, + hash_: str, + force: bool = False + ) -> str: + """request to store an attachment on a provided page + + :returns: the attachment identifier + """ + logger.info('pass-through intercept: store_attachment') + + # 😭 i wanted to use this method so bad, but since we're ditching + # hashing altogether, this isn't necessary. We'll keep it as an + # orbituary 🪦 + # mime_extension = guess_extension(mimetype, False) + + file_name = quote_plus(name) + + output_basepath = Path(getattr(self.config, 'x_confluence_outdir')) + + file_ = output_basepath / 'attachments' / file_name + + file_.parent.mkdir(parents = True, exist_ok = True) + + file_.write_bytes(data) + + self.dump.attachments.append(AttachmentMeta( + name = name, + container_page_title = page_id, + mime_type = mimetype, + ref = str(file_.relative_to(output_basepath)) + )) + + return name + + def store_page( + self, + page_name: str, + data: Any, + parent_id: Optional[str] = None + ) -> str: + """request to store page information to a confluence instance + + :param page_name: the page title to use on the updated page + :param data: the page data to apply + :param parent_id: the id of the ancestor to use + + :returns: id of uploaded page + """ + logger.info('pass-through intercept: store_page') + + output_basepath = Path(getattr(self.config, 'x_confluence_outdir')) + + file_name = f"{quote_plus(page_name)}.xml" + + file_ = output_basepath / 'pages' / file_name + + file_.parent.mkdir(parents=True, exist_ok=True) + + file_.write_bytes(data['content'].encode('utf-8')) + + meta = { + 'title': page_name, + 'ref': str(file_.relative_to(output_basepath)) + } + + if parent_id: + meta['ancestor_title'] = parent_id + + self.dump.pages.append(PageMeta(**meta)) + + return page_name + + def store_page_by_id( + self, + page_name: str, + page_id: str, + data: Any + ) -> str: + """request to store page information on the page with a matching id + + :param page_name: the page title to use on the updated page + :param data: the page data to apply + :param parent_id: the id of the ancestor to use + + :returns: id of uploaded page + """ + logger.info('pass-through intercept: store_page_by_id') + + return 'NULL' + + def disconnect(self): + """terminate the REST client + + we're not actually terminating anything, since we mocked the connection + to make the backend happy. + + We're using this method to dump the assets and the manifest. The + manifest is transformed prior to being serialized, since the manifest's + property keys are capitalized. We think it's better to have this loosely + coupled so that pythonic variable names don't enforce the structure of + the manifest schema. + """ + file_ = (Path(getattr(self.config, 'x_confluence_outdir')) / + 'manifest.json') + + file_.parent.mkdir(parents = True, exist_ok=True) + + pre_serialize = asdict(self.dump) + + pages = [ + sanitize_dict_keys(page_meta, page_meta_key_map) + for page_meta in pre_serialize['pages'] + ] + + attachments = [ + sanitize_dict_keys(attachment_meta, attachment_meta_key_map) + for attachment_meta in pre_serialize['attachments'] + ] + + pre_serialize = { + manifest_key_map['pages']: pages, + manifest_key_map['attachments']: attachments + } + + raw = json.dumps(pre_serialize, indent=4) + + file_.write_text(raw) + + logger.info(f'content dump count: {len(self.dump.pages)}') + + logger.info(f'attachments dump count: {len(self.dump.attachments)}') + + logger.info(f'dump index: {file_}') + + +class ConfluenceBuilder(_ConfluenceBuilder): + """ + """ + name = 'x_confluence' + + def __init__(self, app: Sphinx, env = None): + """ + """ + patch_target = ('sphinxcontrib.confluencebuilder' + '.builder.ConfluencePublisher') + + with patch(patch_target, ConfluencePublisher): + + super().__init__(app, env) + + def __getattribute__(self, name: str) -> Any: + """ + """ + return super().__getattribute__(name) + + def __setattr__(self, name: str, value: Any) -> None: + """ + """ + return super().__setattr__(name, value) + + +def setup(app: Sphinx): + """ + """ + patch_target = 'sphinxcontrib.confluencebuilder.ConfluenceBuilder' + + app.add_config_value( + name = 'x_confluence_outdir', + default = str(Path(app.outdir) / 'confluence.out'), + rebuild = True + ) + + app.add_config_value( + name = 'x_confluence_manifest_basename', + default = 'manifest.json', + rebuild = True + ) + + with patch(patch_target, ConfluenceBuilder): + + logger.info(f'patching: {patch_target}') + + return _setup(app) diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..8b124ce --- /dev/null +++ b/tox.ini @@ -0,0 +1,29 @@ +[tox] +skipsdist = true +maxversion = 3.7.0 +isolated_build = True + + +[testenv:docgen] +description = HTML documentation +basepython = python3 +allowlist_externals = + tox +commands = + tox -e docgen-html + tox -e docgen-md + tox -e docgen-pdf + + +[testenv:docgen-html] +description = HTML documentation +basepython = python3 +allowlist_externals = + sphinx-build + doxygen +deps = + sphinx-git + sphinx >= 4.3.2, < 5 + urllib3 >=1.26.6, < 2 +commands = + sphinx-build -d "{toxinidir}/build/docs/_tree/html" docs "build/docs/html" --color -W -bhtml {posargs}