From 5a62016295789ab4c57904609ef1612a2a14a230 Mon Sep 17 00:00:00 2001 From: Martin Wendt Date: Fri, 27 Dec 2024 23:08:33 +0100 Subject: [PATCH] Feature/benchman (#17) * Update the jupyter notebook * Cleanup * use standalone benchman * Drop Python 3.8 support (typing) * Store name in setup.cfg (not setup.py) * tox_benchmarks.ini * Create baseline * Add benchmarks * Update tests.yml --- .../nutree.61bdee7c56e0e5f7.base.bench.json | 1535 +++++++++++++++++ .github/workflows/tests.yml | 2 +- .gitignore | 1 + CHANGELOG.md | 1 + Pipfile | 3 +- Pipfile.lock | 1319 +++++++------- docs/jupyter/tutorial.ipynb | 310 ++++ docs/sphinx/ug_benchmarks.md | 157 ++ docs/sphinx/user_guide.rst | 1 + nutree/common.py | 21 +- nutree/dot.py | 3 +- nutree/mermaid.py | 3 +- nutree/node.py | 3 +- nutree/tree.py | 6 +- nutree/tree_generator.py | 3 +- nutree/typed_tree.py | 19 +- pyproject.toml | 9 +- setup.cfg | 3 +- setup.py | 2 +- tests/conftest.py | 9 + tests/fixture.py | 4 +- tests/pytest.ini | 8 +- tests/test_bench.py | 324 ++-- tests/test_serialize.py | 4 +- tests/test_typing_concept.py | 6 +- tox.ini | 44 +- tox_benchmarks.ini | 44 + 27 files changed, 2935 insertions(+), 909 deletions(-) create mode 100644 .benchman/nutree.61bdee7c56e0e5f7.base.bench.json create mode 100644 docs/jupyter/tutorial.ipynb create mode 100644 docs/sphinx/ug_benchmarks.md create mode 100644 tox_benchmarks.ini diff --git a/.benchman/nutree.61bdee7c56e0e5f7.base.bench.json b/.benchman/nutree.61bdee7c56e0e5f7.base.bench.json new file mode 100644 index 0000000..ff15f93 --- /dev/null +++ b/.benchman/nutree.61bdee7c56e0e5f7.base.bench.json @@ -0,0 +1,1535 @@ +{ + "combine_date": "2024-12-27T21:32:29.559992+00:00", + "context": { + "client": "61bdee7c56e0e5f7", + "debug_mode": false, + "hardware": "arm64_16_GB", + "project": "nutree", + "system": "Darwin_24.1.0", + "tag": "latest", + "version": "0.11.2a1" + }, + "data": [ + { + "elap": 1.879025125, + "iterations": 1000000, + "name": "search", + "python": "3.9.20", + "sample_size": 8, + "start_time": 6.309943375, + "timings": [ + 2.9388320800000045e-07, + 2.7261066700000036e-07, + 2.6684075000000005e-07, + 2.6863754200000046e-07, + 2.710235839999999e-07 + ], + "variant": "find_all()" + }, + { + "elap": 0.23445079202065244, + "iterations": 1, + "name": "serialize_load", + "python": "3.10.15", + "sample_size": 1, + "start_time": 435956.673530833, + "timings": [ + 0.2080998329911381 + ], + "variant": "ZIP_LZMA ('.lzma')" + }, + { + "elap": 1.888255707999999, + "iterations": 100000, + "name": "iterate", + "python": "3.9.20", + "sample_size": 8, + "start_time": 12.759410083, + "timings": [ + 2.6516683300000034e-06, + 2.6543870800000136e-06, + 2.6532808299999998e-06, + 2.705696660000001e-06, + 2.679816249999991e-06 + ], + "variant": "for _ in tree: ..." + }, + { + "elap": 1.359946041018702, + "iterations": 500000, + "name": "iterate", + "python": "3.12.6", + "sample_size": 8, + "start_time": 435951.66399325, + "timings": [ + 4.058725840877742e-07, + 4.0251275000628085e-07, + 3.998702500248328e-07, + 3.9922266802750527e-07, + 3.9841258397791534e-07 + ], + "variant": "for _ in tree.iterator(UNORDERED): ..." + }, + { + "elap": 0.1939362910343334, + "iterations": 1, + "name": "serialize_load", + "python": "3.13.0rc3+", + "sample_size": 1, + "start_time": 435954.6782625, + "timings": [ + 0.1490553340408951 + ], + "variant": "uncompressed ('.json')" + }, + { + "elap": 0.32471949997125193, + "iterations": 1, + "name": "serialize_save", + "python": "3.12.6", + "sample_size": 1, + "start_time": 435956.239044375, + "timings": [ + 0.3245403750333935 + ], + "variant": "ZIP_BZIP2 ('.bz2')" + }, + { + "elap": 2.1866160000208765, + "iterations": 100000, + "name": "iterate", + "python": "3.10.15", + "sample_size": 8, + "start_time": 435946.600838458, + "timings": [ + 3.15199083997868e-06, + 3.1414283299818635e-06, + 3.1392304197652264e-06, + 3.1415054097305985e-06, + 3.133815000182949e-06 + ], + "variant": "for _ in tree.iterator(POST_ORDER): ..." + }, + { + "elap": 0.23767220799999933, + "iterations": 1, + "name": "serialize_load", + "python": "3.9.20", + "sample_size": 1, + "start_time": 28.848162583, + "timings": [ + 0.2029996660000002 + ], + "variant": "uncompressed ('.json')" + }, + { + "elap": 0.28600579098565504, + "iterations": 1, + "name": "serialize_save", + "python": "3.11.10", + "sample_size": 1, + "start_time": 435954.005476375, + "timings": [ + 0.28585333295632154 + ], + "variant": "ZIP_DEFLATED ('.zip')" + }, + { + "elap": 0.30567366699688137, + "iterations": 1, + "name": "serialize_save", + "python": "3.10.15", + "sample_size": 1, + "start_time": 435954.289086333, + "timings": [ + 0.30547970900079235 + ], + "variant": "uncompressed ('.json')" + }, + { + "elap": 1.9434720410000006, + "iterations": 1000000, + "name": "search", + "python": "3.9.20", + "sample_size": 8, + "start_time": 4.366033, + "timings": [ + 2.742077079999996e-07, + 2.756102089999999e-07, + 2.768199579999999e-07, + 2.7653975000000043e-07, + 2.7508749999999973e-07 + ], + "variant": "find()" + }, + { + "elap": 2.5654468329739757, + "iterations": 200000, + "name": "iterate", + "python": "3.12.6", + "sample_size": 8, + "start_time": 435949.0980855, + "timings": [ + 1.8251943751238287e-06, + 1.8265864599379712e-06, + 1.935386874829419e-06, + 1.8289204148459247e-06, + 1.8299822899280115e-06 + ], + "variant": "for _ in tree.iterator(RANDOM_ORDER): ..." + }, + { + "elap": 2.1243196669965982, + "iterations": 200000, + "name": "iterate", + "python": "3.12.6", + "sample_size": 8, + "start_time": 435953.024355791, + "timings": [ + 1.6103431250667198e-06, + 1.5134504201705568e-06, + 1.5143662499031052e-06, + 1.513507914787624e-06, + 1.5196564598591067e-06 + ], + "variant": "tree.visit(lambda node, memo: None)" + }, + { + "elap": 0.20720454200636595, + "iterations": 1, + "name": "serialize_load", + "python": "3.12.6", + "sample_size": 1, + "start_time": 435955.570214833, + "timings": [ + 0.17099062498891726 + ], + "variant": "uncompressed ('.json')" + }, + { + "elap": 1.722915499994997, + "iterations": 200000, + "name": "iterate", + "python": "3.13.0rc3+", + "sample_size": 8, + "start_time": 435942.313472208, + "timings": [ + 1.2223614598042332e-06, + 1.226107919937931e-06, + 1.2255139599437826e-06, + 1.226421045139432e-06, + 1.2303943748702296e-06 + ], + "variant": "for _ in tree.iterator(LEVEL_ORDER): ..." + }, + { + "elap": 0.23351870800000185, + "iterations": 1, + "name": "serialize_load", + "python": "3.9.20", + "sample_size": 1, + "start_time": 30.92470375, + "timings": [ + 0.20377599999999774 + ], + "variant": "ZIP_LZMA ('.lzma')" + }, + { + "elap": 1.323873333982192, + "iterations": 500000, + "name": "search", + "python": "3.13.0rc3+", + "sample_size": 8, + "start_time": 435928.264699916, + "timings": [ + 3.5818591609131546e-07, + 3.4776633407454937e-07, + 3.4938408399466424e-07, + 4.0771791606675833e-07, + 4.1623500001151117e-07 + ], + "variant": "by index" + }, + { + "elap": 2.054999875021167, + "iterations": 10000000, + "name": "access node.data", + "python": "3.10.15", + "sample_size": 1, + "start_time": 435936.475252416, + "timings": [ + 2.9700979095650837e-08, + 2.954680830007419e-08, + 2.9401625000173225e-08, + 2.9461737495148556e-08, + 3.163041250081733e-08 + ], + "variant": "node._data (attr)" + }, + { + "elap": 2.6980046660173684, + "iterations": 200000, + "name": "iterate", + "python": "3.10.15", + "sample_size": 8, + "start_time": 435942.133219125, + "timings": [ + 1.927068539953325e-06, + 1.9226408351096323e-06, + 1.9319452048512175e-06, + 1.908413959899917e-06, + 1.931498749763705e-06 + ], + "variant": "for _ in tree.iterator(LEVEL_ORDER): ..." + }, + { + "elap": 0.17356137500610203, + "iterations": 1, + "name": "serialize_load", + "python": "3.11.10", + "sample_size": 1, + "start_time": 435954.29178825, + "timings": [ + 0.14802125003188848 + ], + "variant": "ZIP_DEFLATED ('.zip')" + }, + { + "elap": 2.816223166999407, + "iterations": 200000, + "name": "iterate", + "python": "3.11.10", + "sample_size": 8, + "start_time": 435950.578464166, + "timings": [ + 2.00146521005081e-06, + 2.016233544854913e-06, + 2.0123108348343523e-06, + 2.015126874903217e-06, + 1.9979460400645622e-06 + ], + "variant": "tree.visit(lambda node, memo: None)" + }, + { + "elap": 1.9867887499858625, + "iterations": 2000000, + "name": "search", + "python": "3.11.10", + "sample_size": 8, + "start_time": 435931.359950166, + "timings": [ + 1.4125374998548069e-07, + 1.415208124963101e-07, + 1.4076472949818709e-07, + 1.4115337500697934e-07, + 1.5418183300062082e-07 + ], + "variant": "find_all()" + }, + { + "elap": 1.583960791991558, + "iterations": 100000, + "name": "iterate", + "python": "3.12.6", + "sample_size": 8, + "start_time": 435947.513661291, + "timings": [ + 2.307241249945946e-06, + 2.2919366700807585e-06, + 2.303882919950411e-06, + 2.303918749676086e-06, + 2.291633750428446e-06 + ], + "variant": "for _ in tree.iterator(POST_ORDER): ..." + }, + { + "elap": 0.18889250000938773, + "iterations": 1, + "name": "serialize_load", + "python": "3.11.10", + "sample_size": 1, + "start_time": 435954.786306916, + "timings": [ + 0.16316562501015142 + ], + "variant": "ZIP_BZIP2 ('.bz2')" + }, + { + "elap": 0.27257137501146644, + "iterations": 1, + "name": "serialize_save", + "python": "3.11.10", + "sample_size": 1, + "start_time": 435953.56273475, + "timings": [ + 0.2723865419975482 + ], + "variant": "uncompressed ('.json')" + }, + { + "elap": 0.5678622919949703, + "iterations": 1, + "name": "serialize_save", + "python": "3.13.0rc3+", + "sample_size": 1, + "start_time": 435955.794345416, + "timings": [ + 0.5676808750140481 + ], + "variant": "ZIP_LZMA ('.lzma')" + }, + { + "elap": 1.7050586250261404, + "iterations": 500000, + "name": "iterate", + "python": "3.10.15", + "sample_size": 8, + "start_time": 435950.556942333, + "timings": [ + 4.943419159390032e-07, + 4.92126083932817e-07, + 4.957195820752531e-07, + 4.943255840335041e-07, + 5.027715000323951e-07 + ], + "variant": "for _ in tree.iterator(UNORDERED): ..." + }, + { + "elap": 1.9452532079885714, + "iterations": 200000, + "name": "iterate", + "python": "3.13.0rc3+", + "sample_size": 8, + "start_time": 435952.3669565, + "timings": [ + 1.38945833517937e-06, + 1.3842133298749105e-06, + 1.4903327048523352e-06, + 1.3829322898527606e-06, + 1.3907443749485538e-06 + ], + "variant": "tree.visit(lambda node, memo: None)" + }, + { + "elap": 1.7685781249892898, + "iterations": 100000, + "name": "iterate", + "python": "3.10.15", + "sample_size": 8, + "start_time": 435944.831745458, + "timings": [ + 2.579723329981789e-06, + 2.567929159849882e-06, + 2.5697854202007875e-06, + 2.568831670214422e-06, + 2.566006249981001e-06 + ], + "variant": "for _ in tree.iterator(PRE_ORDER): ..." + }, + { + "elap": 2.4839111249893904, + "iterations": 200000, + "name": "iterate", + "python": "3.11.10", + "sample_size": 8, + "start_time": 435945.377573541, + "timings": [ + 1.7668266649707221e-06, + 1.885392709809821e-06, + 1.766377290186938e-06, + 1.7811587499454617e-06, + 1.7710931249894202e-06 + ], + "variant": "for _ in tree.iterator(RANDOM_ORDER): ..." + }, + { + "elap": 0.1868802919634618, + "iterations": 1, + "name": "serialize_load", + "python": "3.13.0rc3+", + "sample_size": 1, + "start_time": 435955.118030666, + "timings": [ + 0.15886929200496525 + ], + "variant": "ZIP_DEFLATED ('.zip')" + }, + { + "elap": 0.22998558299150318, + "iterations": 1, + "name": "serialize_save", + "python": "3.12.6", + "sample_size": 1, + "start_time": 435955.339963458, + "timings": [ + 0.22978741599945351 + ], + "variant": "uncompressed ('.json')" + }, + { + "elap": 2.100093624962028, + "iterations": 2000000, + "name": "search", + "python": "3.13.0rc3+", + "sample_size": 8, + "start_time": 435929.589130625, + "timings": [ + 1.489553959982004e-07, + 1.5058435400715098e-07, + 1.6693570799543521e-07, + 1.4780189548037015e-07, + 1.4795660402160138e-07 + ], + "variant": "find()" + }, + { + "elap": 2.9461581250070594, + "iterations": 50000000, + "name": "access node.data", + "python": "3.12.6", + "sample_size": 1, + "start_time": 435935.616397458, + "timings": [ + 8.678273339755833e-09, + 8.74585915938951e-09, + 8.599877499509603e-09, + 8.610334999393672e-09, + 9.159491679165513e-09 + ], + "variant": "node._data (attr)" + }, + { + "elap": 2.39747670898214, + "iterations": 200000, + "name": "iterate", + "python": "3.12.6", + "sample_size": 8, + "start_time": 435938.564050666, + "timings": [ + 1.731518335000146e-06, + 1.6952827101340517e-06, + 1.7003343752003274e-06, + 1.7275191651424393e-06, + 1.687496039958205e-06 + ], + "variant": "for _ in tree: ..." + }, + { + "elap": 0.16941141698043793, + "iterations": 1, + "name": "serialize_load", + "python": "3.11.10", + "sample_size": 1, + "start_time": 435953.835627083, + "timings": [ + 0.14489166700514033 + ], + "variant": "uncompressed ('.json')" + }, + { + "elap": 0.19197841599816456, + "iterations": 1, + "name": "serialize_load", + "python": "3.12.6", + "sample_size": 1, + "start_time": 435956.564160875, + "timings": [ + 0.16515712498221546 + ], + "variant": "ZIP_BZIP2 ('.bz2')" + }, + { + "elap": 1.8161426659789868, + "iterations": 100000, + "name": "iterate", + "python": "3.10.15", + "sample_size": 8, + "start_time": 435952.262429375, + "timings": [ + 2.6224233297398315e-06, + 2.596846250235103e-06, + 2.605844170320779e-06, + 2.82442124967929e-06, + 2.5950524996733295e-06 + ], + "variant": "tree.visit(lambda node, memo: None)" + }, + { + "elap": 1.7988457920000016, + "iterations": 100000, + "name": "iterate", + "python": "3.9.20", + "sample_size": 8, + "start_time": 23.087533208, + "timings": [ + 2.5672866700000086e-06, + 2.5809979199999945e-06, + 2.5754470900000113e-06, + 2.811245830000004e-06, + 2.561269579999994e-06 + ], + "variant": "for _ in tree.iterator(RANDOM_ORDER): ..." + }, + { + "elap": 1.771161166999999, + "iterations": 100000, + "name": "iterate", + "python": "3.9.20", + "sample_size": 8, + "start_time": 26.569842458, + "timings": [ + 2.542294579999975e-06, + 2.5502841599999827e-06, + 2.7531558400000123e-06, + 2.532317079999977e-06, + 2.544261660000018e-06 + ], + "variant": "tree.visit(lambda node, memo: None)" + }, + { + "elap": 2.203464916034136, + "iterations": 2000000, + "name": "search", + "python": "3.12.6", + "sample_size": 8, + "start_time": 435931.638303625, + "timings": [ + 1.5645241650054232e-07, + 1.5713854151545093e-07, + 1.6945670850691386e-07, + 1.5676022949628533e-07, + 1.5653922950150444e-07 + ], + "variant": "find_all()" + }, + { + "elap": 2.203962249972392, + "iterations": 200000, + "name": "iterate", + "python": "3.13.0rc3+", + "sample_size": 8, + "start_time": 435937.998066083, + "timings": [ + 1.5340014599496499e-06, + 1.7980935401283205e-06, + 1.5370147899375298e-06, + 1.5272481247666292e-06, + 1.5276845850166864e-06 + ], + "variant": "for _ in tree: ..." + }, + { + "elap": 0.660008332983125, + "iterations": 1, + "name": "serialize_save", + "python": "3.10.15", + "sample_size": 1, + "start_time": 435956.013199375, + "timings": [ + 0.6598544159787707 + ], + "variant": "ZIP_LZMA ('.lzma')" + }, + { + "elap": 1.3024402919691056, + "iterations": 500000, + "name": "search", + "python": "3.12.6", + "sample_size": 8, + "start_time": 435928.194187041, + "timings": [ + 3.608238340821117e-07, + 3.422475840197876e-07, + 3.435819159494713e-07, + 4.0363183396402747e-07, + 4.116369179682806e-07 + ], + "variant": "by index" + }, + { + "elap": 1.820829792, + "iterations": 500000, + "name": "search", + "python": "3.9.20", + "sample_size": 8, + "start_time": 2.544589333, + "timings": [ + 6.398550840000006e-07, + 5.174257499999992e-07, + 5.162199159999999e-07, + 5.193174999999997e-07, + 5.222110000000005e-07 + ], + "variant": "by index" + }, + { + "elap": 0.2157112910063006, + "iterations": 1, + "name": "serialize_save", + "python": "3.13.0rc3+", + "sample_size": 1, + "start_time": 435954.462194625, + "timings": [ + 0.21457800001371652 + ], + "variant": "uncompressed ('.json')" + }, + { + "elap": 0.1831993330270052, + "iterations": 1, + "name": "serialize_load", + "python": "3.13.0rc3+", + "sample_size": 1, + "start_time": 435956.362509875, + "timings": [ + 0.15565620799316093 + ], + "variant": "ZIP_LZMA ('.lzma')" + }, + { + "elap": 0.32014629198238254, + "iterations": 1, + "name": "serialize_save", + "python": "3.11.10", + "sample_size": 1, + "start_time": 435954.465858791, + "timings": [ + 0.3199805000331253 + ], + "variant": "ZIP_BZIP2 ('.bz2')" + }, + { + "elap": 1.7745953749981709, + "iterations": 100000, + "name": "iterate", + "python": "3.10.15", + "sample_size": 8, + "start_time": 435940.358269208, + "timings": [ + 2.5634258304489776e-06, + 2.5752362504135815e-06, + 2.56280500034336e-06, + 2.5775450002402068e-06, + 2.5646645802771674e-06 + ], + "variant": "for _ in tree.iterator(): ..." + }, + { + "elap": 0.24466266599483788, + "iterations": 1, + "name": "serialize_save", + "python": "3.13.0rc3+", + "sample_size": 1, + "start_time": 435954.872629875, + "timings": [ + 0.24446549999993294 + ], + "variant": "ZIP_DEFLATED ('.zip')" + }, + { + "elap": 2.3786546670016833, + "iterations": 200000, + "name": "iterate", + "python": "3.12.6", + "sample_size": 8, + "start_time": 435945.134487791, + "timings": [ + 1.6896133351838217e-06, + 1.6919910401338712e-06, + 1.8125854199752212e-06, + 1.694877080153674e-06, + 1.7090718750841915e-06 + ], + "variant": "for _ in tree.iterator(PRE_ORDER): ..." + }, + { + "elap": 0.6264578749999998, + "iterations": 1, + "name": "serialize_save", + "python": "3.9.20", + "sample_size": 1, + "start_time": 30.297912208, + "timings": [ + 0.6262254170000006 + ], + "variant": "ZIP_LZMA ('.lzma')" + }, + { + "elap": 2.3459407500340603, + "iterations": 200000, + "name": "iterate", + "python": "3.12.6", + "sample_size": 8, + "start_time": 435940.962069208, + "timings": [ + 1.6659877100028097e-06, + 1.6831062501296401e-06, + 1.6688604198861867e-06, + 1.8046491651330142e-06, + 1.6721404148847796e-06 + ], + "variant": "for _ in tree.iterator(): ..." + }, + { + "elap": 0.2934847499999975, + "iterations": 1, + "name": "serialize_save", + "python": "3.9.20", + "sample_size": 1, + "start_time": 28.554340708, + "timings": [ + 0.2932338329999986 + ], + "variant": "uncompressed ('.json')" + }, + { + "elap": 1.7558224169770256, + "iterations": 1000000, + "name": "search", + "python": "3.10.15", + "sample_size": 8, + "start_time": 435930.321662208, + "timings": [ + 2.858841660199687e-07, + 2.4674920900724827e-07, + 2.486434169695713e-07, + 2.483698330470361e-07, + 2.4899137503234667e-07 + ], + "variant": "find()" + }, + { + "elap": 0.22615220898296684, + "iterations": 1, + "name": "serialize_load", + "python": "3.10.15", + "sample_size": 1, + "start_time": 435954.595063791, + "timings": [ + 0.20041320798918605 + ], + "variant": "uncompressed ('.json')" + }, + { + "elap": 1.6878737079678103, + "iterations": 1000000, + "name": "search", + "python": "3.10.15", + "sample_size": 8, + "start_time": 435932.078073583, + "timings": [ + 2.4105170799884947e-07, + 2.4073170794872567e-07, + 2.6976274995831774e-07, + 2.40396499983035e-07, + 2.404870840255171e-07 + ], + "variant": "find_all()" + }, + { + "elap": 0.23229699995135888, + "iterations": 1, + "name": "serialize_load", + "python": "3.10.15", + "sample_size": 1, + "start_time": 435955.780491041, + "timings": [ + 0.2079884170088917 + ], + "variant": "ZIP_BZIP2 ('.bz2')" + }, + { + "elap": 1.768588374950923, + "iterations": 100000, + "name": "iterate", + "python": "3.10.15", + "sample_size": 8, + "start_time": 435948.787892458, + "timings": [ + 2.5864479201845826e-06, + 2.5557591702090575e-06, + 2.555790829937905e-06, + 2.563935409998521e-06, + 2.557413330068812e-06 + ], + "variant": "for _ in tree.iterator(RANDOM_ORDER): ..." + }, + { + "elap": 2.5535197499999995, + "iterations": 5000000, + "name": "access node.data", + "python": "3.9.20", + "sample_size": 1, + "start_time": 8.190563791, + "timings": [ + 7.499484999999986e-08, + 7.513561660000008e-08, + 7.569620820000011e-08, + 7.508731660000017e-08, + 7.539572499999991e-08 + ], + "variant": "node.data (property)" + }, + { + "elap": 0.5663362499908544, + "iterations": 1, + "name": "serialize_save", + "python": "3.12.6", + "sample_size": 1, + "start_time": 435956.756555458, + "timings": [ + 0.5661617909790948 + ], + "variant": "ZIP_LZMA ('.lzma')" + }, + { + "elap": 2.2151105420000015, + "iterations": 100000, + "name": "iterate", + "python": "3.9.20", + "sample_size": 8, + "start_time": 20.871938458, + "timings": [ + 3.217069170000002e-06, + 3.200510839999993e-06, + 3.222673329999992e-06, + 3.209802080000017e-06, + 3.2122650000000163e-06 + ], + "variant": "for _ in tree.iterator(POST_ORDER): ..." + }, + { + "elap": 2.092240874946583, + "iterations": 2000000, + "name": "search", + "python": "3.11.10", + "sample_size": 8, + "start_time": 435929.2663165, + "timings": [ + 1.455290835001506e-07, + 1.4542381250066683e-07, + 1.446687290153932e-07, + 1.6563285450683906e-07, + 1.45237854012521e-07 + ], + "variant": "find()" + }, + { + "elap": 2.3435257090022787, + "iterations": 1000000, + "name": "iterate", + "python": "3.13.0rc3+", + "sample_size": 8, + "start_time": 435950.022980666, + "timings": [ + 3.3761329198023305e-07, + 3.3731962501769883e-07, + 3.363305840175599e-07, + 3.3586233301321047e-07, + 3.390626669861376e-07 + ], + "variant": "for _ in tree.iterator(UNORDERED): ..." + }, + { + "elap": 1.6799284580047242, + "iterations": 5000000, + "name": "access node.data", + "python": "3.13.0rc3+", + "sample_size": 1, + "start_time": 435933.778104875, + "timings": [ + 4.94724249932915e-08, + 5.032126660225913e-08, + 4.921684160362929e-08, + 4.9082375003490596e-08, + 4.9340416595805434e-08 + ], + "variant": "node.data (property)" + }, + { + "elap": 0.2676840830245055, + "iterations": 1, + "name": "serialize_save", + "python": "3.12.6", + "sample_size": 1, + "start_time": 435955.777794958, + "timings": [ + 0.2675059589673765 + ], + "variant": "ZIP_DEFLATED ('.zip')" + }, + { + "elap": 0.19276195799466223, + "iterations": 1, + "name": "serialize_load", + "python": "3.12.6", + "sample_size": 1, + "start_time": 435956.04577225, + "timings": [ + 0.1638718749745749 + ], + "variant": "ZIP_DEFLATED ('.zip')" + }, + { + "elap": 2.1406887500197627, + "iterations": 2000000, + "name": "search", + "python": "3.12.6", + "sample_size": 8, + "start_time": 435929.497135708, + "timings": [ + 1.5127574998768978e-07, + 1.5078331247786992e-07, + 1.7198493747855538e-07, + 1.5129750000778587e-07, + 1.511933954898268e-07 + ], + "variant": "find()" + }, + { + "elap": 2.7162752500153147, + "iterations": 1000000, + "name": "iterate", + "python": "3.11.10", + "sample_size": 8, + "start_time": 435947.861847541, + "timings": [ + 3.9437945798272265e-07, + 3.9449074998265134e-07, + 3.9407295803539456e-07, + 3.943203749950044e-07, + 3.942029160098173e-07 + ], + "variant": "for _ in tree.iterator(UNORDERED): ..." + }, + { + "elap": 2.5381901250220835, + "iterations": 50000000, + "name": "access node.data", + "python": "3.13.0rc3+", + "sample_size": 1, + "start_time": 435935.458531708, + "timings": [ + 7.457043339964003e-09, + 7.463611660059541e-09, + 7.536743340315297e-09, + 7.44422834017314e-09, + 7.500530820107088e-09 + ], + "variant": "node._data (attr)" + }, + { + "elap": 2.110569750017021, + "iterations": 200000, + "name": "iterate", + "python": "3.13.0rc3+", + "sample_size": 8, + "start_time": 435940.202452375, + "timings": [ + 1.5137352052261122e-06, + 1.5104604148655198e-06, + 1.5080489599495195e-06, + 1.5160241650301032e-06, + 1.5261158350040205e-06 + ], + "variant": "for _ in tree.iterator(): ..." + }, + { + "elap": 1.8865746670000014, + "iterations": 100000, + "name": "iterate", + "python": "3.9.20", + "sample_size": 8, + "start_time": 18.984876041, + "timings": [ + 2.699959579999991e-06, + 2.703660840000026e-06, + 2.695544589999983e-06, + 2.70173125000003e-06, + 2.9324225000000224e-06 + ], + "variant": "for _ in tree.iterator(PRE_ORDER): ..." + }, + { + "elap": 0.2705083330000022, + "iterations": 1, + "name": "serialize_load", + "python": "3.9.20", + "sample_size": 1, + "start_time": 30.026953125, + "timings": [ + 0.2399419999999992 + ], + "variant": "ZIP_BZIP2 ('.bz2')" + }, + { + "elap": 0.19616562500596046, + "iterations": 1, + "name": "serialize_load", + "python": "3.11.10", + "sample_size": 1, + "start_time": 435955.569589041, + "timings": [ + 0.16162895900197327 + ], + "variant": "ZIP_LZMA ('.lzma')" + }, + { + "elap": 1.8255943339900114, + "iterations": 200000, + "name": "iterate", + "python": "3.12.6", + "sample_size": 8, + "start_time": 435943.308422791, + "timings": [ + 1.3188179148710334e-06, + 1.3098697949317285e-06, + 1.3150939598563127e-06, + 1.3188087497837842e-06, + 1.3093960451078602e-06 + ], + "variant": "for _ in tree.iterator(LEVEL_ORDER): ..." + }, + { + "elap": 1.7727552499854937, + "iterations": 5000000, + "name": "access node.data", + "python": "3.12.6", + "sample_size": 1, + "start_time": 435933.843212125, + "timings": [ + 5.2023224998265506e-08, + 5.26530749979429e-08, + 5.214526660274714e-08, + 5.2103049994912e-08, + 5.221042499179021e-08 + ], + "variant": "node.data (property)" + }, + { + "elap": 2.170303916966077, + "iterations": 200000, + "name": "iterate", + "python": "3.11.10", + "sample_size": 8, + "start_time": 435939.866904416, + "timings": [ + 1.5633804150274955e-06, + 1.5621808348805644e-06, + 1.5543943751254118e-06, + 1.5565447899280116e-06, + 1.5520858301897534e-06 + ], + "variant": "for _ in tree.iterator(LEVEL_ORDER): ..." + }, + { + "elap": 0.2813159580109641, + "iterations": 1, + "name": "serialize_save", + "python": "3.13.0rc3+", + "sample_size": 1, + "start_time": 435955.305359, + "timings": [ + 0.28107295802328736 + ], + "variant": "ZIP_BZIP2 ('.bz2')" + }, + { + "elap": 2.013351125, + "iterations": 10000000, + "name": "access node.data", + "python": "3.9.20", + "sample_size": 1, + "start_time": 10.744530458, + "timings": [ + 2.885362090000001e-08, + 2.883114589999991e-08, + 2.8644645800000035e-08, + 3.1283625000000014e-08, + 2.8915425000000107e-08 + ], + "variant": "node._data (attr)" + }, + { + "elap": 2.112843124952633, + "iterations": 1000000, + "name": "search", + "python": "3.11.10", + "sample_size": 8, + "start_time": 435927.152949833, + "timings": [ + 2.8903962497133764e-07, + 2.878984170383774e-07, + 3.571322500356473e-07, + 2.873634590068832e-07, + 3.146265420364216e-07 + ], + "variant": "by index" + }, + { + "elap": 1.5702493750141002, + "iterations": 100000, + "name": "iterate", + "python": "3.11.10", + "sample_size": 8, + "start_time": 435938.296215625, + "timings": [ + 2.1542374999262392e-06, + 2.714030829956755e-06, + 2.1930470800725743e-06, + 2.138251250144094e-06, + 2.147827500011772e-06 + ], + "variant": "for _ in tree.iterator(): ..." + }, + { + "elap": 0.33350454099999993, + "iterations": 1, + "name": "serialize_save", + "python": "3.9.20", + "sample_size": 1, + "start_time": 29.0862005, + "timings": [ + 0.3333562910000012 + ], + "variant": "ZIP_DEFLATED ('.zip')" + }, + { + "elap": 1.5381942089879885, + "iterations": 10000000, + "name": "access node.data", + "python": "3.11.10", + "sample_size": 1, + "start_time": 435935.260932541, + "timings": [ + 2.2449108399450778e-08, + 2.2265779104782268e-08, + 2.2355554095702244e-08, + 2.2380341700045393e-08, + 2.2281308402307333e-08 + ], + "variant": "node._data (attr)" + }, + { + "elap": 0.23578479199204594, + "iterations": 1, + "name": "serialize_load", + "python": "3.10.15", + "sample_size": 1, + "start_time": 435955.166285041, + "timings": [ + 0.2096443329937756 + ], + "variant": "ZIP_DEFLATED ('.zip')" + }, + { + "elap": 1.9122302499599755, + "iterations": 5000000, + "name": "access node.data", + "python": "3.11.10", + "sample_size": 1, + "start_time": 435933.348216, + "timings": [ + 5.6989691592752935e-08, + 5.6074408395215866e-08, + 5.665572499856353e-08, + 5.646135839633644e-08, + 5.628111659316346e-08 + ], + "variant": "node.data (property)" + }, + { + "elap": 1.8462202079826966, + "iterations": 100000, + "name": "iterate", + "python": "3.11.10", + "sample_size": 8, + "start_time": 435943.530923875, + "timings": [ + 2.684878750005737e-06, + 2.6744420797331257e-06, + 2.6668512501055376e-06, + 2.667028330033645e-06, + 2.6912724995054303e-06 + ], + "variant": "for _ in tree.iterator(POST_ORDER): ..." + }, + { + "elap": 1.826052125019487, + "iterations": 100000, + "name": "iterate", + "python": "3.10.15", + "sample_size": 8, + "start_time": 435938.531829416, + "timings": [ + 3.1441087502753364e-06, + 2.553851249977015e-06, + 2.558372079511173e-06, + 2.5611616601236164e-06, + 2.573229999979958e-06 + ], + "variant": "for _ in tree: ..." + }, + { + "elap": 2.503180624999999, + "iterations": 200000, + "name": "iterate", + "python": "3.9.20", + "sample_size": 8, + "start_time": 16.480977666, + "timings": [ + 1.787901250000008e-06, + 1.7882185399999884e-06, + 1.7760841650000003e-06, + 1.7891391649999911e-06, + 1.7777964600000119e-06 + ], + "variant": "for _ in tree.iterator(LEVEL_ORDER): ..." + }, + { + "elap": 2.4190120000275783, + "iterations": 200000, + "name": "iterate", + "python": "3.13.0rc3+", + "sample_size": 8, + "start_time": 435947.603550041, + "timings": [ + 1.7283818751457147e-06, + 1.7477204150054605e-06, + 1.740352289925795e-06, + 1.7490047949831932e-06, + 1.7397760399035178e-06 + ], + "variant": "for _ in tree.iterator(RANDOM_ORDER): ..." + }, + { + "elap": 1.6821404999999992, + "iterations": 500000, + "name": "iterate", + "python": "3.9.20", + "sample_size": 8, + "start_time": 24.88694325, + "timings": [ + 4.913080840000034e-07, + 4.967719180000004e-07, + 5.036882499999962e-07, + 4.956293320000001e-07, + 4.95182333999999e-07 + ], + "variant": "for _ in tree.iterator(UNORDERED): ..." + }, + { + "elap": 0.1938899999950081, + "iterations": 1, + "name": "serialize_load", + "python": "3.12.6", + "sample_size": 1, + "start_time": 435957.323216375, + "timings": [ + 0.16737300000386313 + ], + "variant": "ZIP_LZMA ('.lzma')" + }, + { + "elap": 1.495163333020173, + "iterations": 100000, + "name": "iterate", + "python": "3.11.10", + "sample_size": 8, + "start_time": 435936.800559958, + "timings": [ + 2.1665849996497853e-06, + 2.1579283301252874e-06, + 2.1572004200425e-06, + 2.1612608298892157e-06, + 2.1671491698361934e-06 + ], + "variant": "for _ in tree: ..." + }, + { + "elap": 0.3777089170180261, + "iterations": 1, + "name": "serialize_save", + "python": "3.10.15", + "sample_size": 1, + "start_time": 435955.402499541, + "timings": [ + 0.37755354098044336 + ], + "variant": "ZIP_BZIP2 ('.bz2')" + }, + { + "elap": 1.492943125020247, + "iterations": 100000, + "name": "iterate", + "python": "3.11.10", + "sample_size": 8, + "start_time": 435942.0376405, + "timings": [ + 2.1246729203267025e-06, + 2.3566075001144783e-06, + 2.1086049999576064e-06, + 2.142283329740167e-06, + 2.142948330147192e-06 + ], + "variant": "for _ in tree.iterator(PRE_ORDER): ..." + }, + { + "elap": 0.2068745830329135, + "iterations": 1, + "name": "serialize_load", + "python": "3.13.0rc3+", + "sample_size": 1, + "start_time": 435955.586978625, + "timings": [ + 0.1747563750250265 + ], + "variant": "ZIP_BZIP2 ('.bz2')" + }, + { + "elap": 2.086841624986846, + "iterations": 2000000, + "name": "search", + "python": "3.13.0rc3+", + "sample_size": 8, + "start_time": 435931.689693916, + "timings": [ + 1.4848029147833585e-07, + 1.4840583348996006e-07, + 1.6297093752655202e-07, + 1.4845862501533702e-07, + 1.4774620800744742e-07 + ], + "variant": "find_all()" + }, + { + "elap": 2.70733179198578, + "iterations": 5000000, + "name": "access node.data", + "python": "3.10.15", + "sample_size": 1, + "start_time": 435933.767454041, + "timings": [ + 8.050535839283839e-08, + 7.940759999910369e-08, + 7.95854999916628e-08, + 8.021862499881536e-08, + 7.92650418006815e-08 + ], + "variant": "node.data (property)" + }, + { + "elap": 0.5936122090206482, + "iterations": 1, + "name": "serialize_save", + "python": "3.11.10", + "sample_size": 1, + "start_time": 435954.975603166, + "timings": [ + 0.5934554159757681 + ], + "variant": "ZIP_LZMA ('.lzma')" + }, + { + "elap": 2.09840587497456, + "iterations": 200000, + "name": "iterate", + "python": "3.13.0rc3+", + "sample_size": 8, + "start_time": 435944.036857708, + "timings": [ + 1.5107052051462232e-06, + 1.497782499936875e-06, + 1.5204572951188312e-06, + 1.5067147900117562e-06, + 1.5128070852370002e-06 + ], + "variant": "for _ in tree.iterator(PRE_ORDER): ..." + }, + { + "elap": 1.4672455409890972, + "iterations": 100000, + "name": "iterate", + "python": "3.13.0rc3+", + "sample_size": 8, + "start_time": 435946.135727125, + "timings": [ + 2.100178329856135e-06, + 2.314192919875495e-06, + 2.0903537498088552e-06, + 2.1205537498462947e-06, + 2.0881470799213276e-06 + ], + "variant": "for _ in tree.iterator(POST_ORDER): ..." + }, + { + "elap": 1.8323127499999998, + "iterations": 100000, + "name": "iterate", + "python": "3.9.20", + "sample_size": 8, + "start_time": 14.648176, + "timings": [ + 2.6394345799999997e-06, + 2.6552329199999924e-06, + 2.6577254200000054e-06, + 2.675879170000002e-06, + 2.6663029199999854e-06 + ], + "variant": "for _ in tree.iterator(): ..." + }, + { + "elap": 0.3528744580000023, + "iterations": 1, + "name": "serialize_save", + "python": "3.9.20", + "sample_size": 1, + "start_time": 29.673738458, + "timings": [ + 0.3527137499999995 + ], + "variant": "ZIP_BZIP2 ('.bz2')" + }, + { + "elap": 1.7249543750076555, + "iterations": 500000, + "name": "search", + "python": "3.10.15", + "sample_size": 8, + "start_time": 435928.596118125, + "timings": [ + 5.456825819564983e-07, + 5.54217666038312e-07, + 4.884732500649989e-07, + 4.87423583981581e-07, + 4.873494160128757e-07 + ], + "variant": "by index" + }, + { + "elap": 0.25318749999999923, + "iterations": 1, + "name": "serialize_load", + "python": "3.9.20", + "sample_size": 1, + "start_time": 29.420049375, + "timings": [ + 0.208984375 + ], + "variant": "ZIP_DEFLATED ('.zip')" + }, + { + "elap": 0.3441679999814369, + "iterations": 1, + "name": "serialize_save", + "python": "3.10.15", + "sample_size": 1, + "start_time": 435954.821688333, + "timings": [ + 0.3440127090434544 + ], + "variant": "ZIP_DEFLATED ('.zip')" + } + ], + "tag": "base" +} \ No newline at end of file diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 42faaf7..c8e6468 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -41,7 +41,7 @@ jobs: sudo apt-get install graphviz python -V python -m pip install --upgrade pip - python -m pip install pydot pytest pytest-cov pytest-html rdflib ruff + python -m pip install benchman pydot pytest pytest-cov pytest-html rdflib ruff # if [ -f requirements.txt ]; then pip install -r requirements.txt; fi python -m pip install -e . python -m pip list diff --git a/.gitignore b/.gitignore index 91ccb85..025e8dd 100644 --- a/.gitignore +++ b/.gitignore @@ -133,3 +133,4 @@ tests/test_dev_local*.py .DS_Store tests/temp/ .ruff_cache/ +/.benchman diff --git a/CHANGELOG.md b/CHANGELOG.md index b18c507..6071607 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Changelog ## 0.11.2 (unreleased) +- Add benchmarks (using [Benchman](https://github.com/mar10/benchman)). ## 0.11.1 (2024-11-08) - `t0.diff(t1, ...)` adds nodes from t1 when possible, so the new status is diff --git a/Pipfile b/Pipfile index 3b97bb3..aeeca28 100644 --- a/Pipfile +++ b/Pipfile @@ -4,11 +4,12 @@ verify_ssl = true name = "pypi" [dev-packages] +benchman = "*" +# benchman = {file = "../benchman", editable = true} fabulist="*" ipykernel = "*" mypy = "*" notebook = "*" -# pandoc = "*" # jupyter nbconvert --to rst pre-commit = "*" pydot = "*" pyright = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 1494023..2dbf28b 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "99e6aaf044d19c4a02b758f5427f6d4307858f216724432f61c3854f5e338d77" + "sha256": "3c7fadfe51dbc926b571479b19fd2a3fb9d4f6172608eca10cf0ec59140715ef" }, "pipfile-spec": 6, "requires": { @@ -37,11 +37,11 @@ }, "anyio": { "hashes": [ - "sha256:4c8bc31ccdb51c7f7bd251f51c609e038d63e34219b44aa86e47576389880b4c", - "sha256:6d170c36fba3bdd840c73d3868c1e777e33676a69c3a72cf0a0d5d6d8009b61d" + "sha256:2f834749c602966b7d456a7567cafcb309f96482b5081d14ac93ccd457f9dd48", + "sha256:ea60c3723ab42ba6fff7e8ccb0488c898ec538ff4df1f1d5e642c3601d07e352" ], "markers": "python_version >= '3.9'", - "version": "==4.6.2.post1" + "version": "==4.7.0" }, "appnope": { "hashes": [ @@ -96,10 +96,11 @@ }, "asttokens": { "hashes": [ - "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24", - "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0" + "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", + "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2" ], - "version": "==2.4.1" + "markers": "python_version >= '3.8'", + "version": "==3.0.0" }, "async-lru": { "hashes": [ @@ -111,11 +112,11 @@ }, "attrs": { "hashes": [ - "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346", - "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2" + "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff", + "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308" ], - "markers": "python_version >= '3.7'", - "version": "==24.2.0" + "markers": "python_version >= '3.8'", + "version": "==24.3.0" }, "babel": { "hashes": [ @@ -133,6 +134,15 @@ "markers": "python_full_version >= '3.6.0'", "version": "==4.12.3" }, + "benchman": { + "hashes": [ + "sha256:25a4c9434eb1bf9561eb57be37f0de24d0ff9227b6856f81e0c84ca5b3172239", + "sha256:62ba8c39d25ee546d93dba35fa3ec0547e9b65bb1db4338c787165c1af4b0751" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==0.0.1" + }, "bleach": { "hashes": [ "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e", @@ -141,6 +151,14 @@ "markers": "python_version >= '3.9'", "version": "==6.2.0" }, + "build": { + "hashes": [ + "sha256:1d61c0887fa860c01971625baae8bdd338e517b836a2f70dd1f7aa3a6b2fc5b5", + "sha256:b36993e92ca9375a219c99e606a122ff365a760a2d4bba0caa09bd5278b608b7" + ], + "markers": "python_version >= '3.8'", + "version": "==1.2.2.post1" + }, "cachetools": { "hashes": [ "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292", @@ -151,11 +169,11 @@ }, "certifi": { "hashes": [ - "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", - "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9" + "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", + "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db" ], "markers": "python_version >= '3.6'", - "version": "==2024.8.30" + "version": "==2024.12.14" }, "cffi": { "hashes": [ @@ -248,122 +266,109 @@ }, "charset-normalizer": { "hashes": [ - "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621", - "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6", - "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8", - "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912", - "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", - "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b", - "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d", - "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d", - "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95", - "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e", - "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565", - "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", - "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab", - "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be", - "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", - "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907", - "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0", - "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2", - "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62", - "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62", - "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", - "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", - "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284", - "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca", - "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455", - "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858", - "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b", - "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", - "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", - "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db", - "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", - "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea", - "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6", - "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", - "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749", - "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7", - "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd", - "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99", - "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242", - "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee", - "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", - "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2", - "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51", - "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", - "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8", - "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", - "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613", - "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742", - "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe", - "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3", - "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5", - "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631", - "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7", - "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15", - "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c", - "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", - "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417", - "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", - "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", - "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca", - "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa", - "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99", - "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149", - "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41", - "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574", - "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0", - "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f", - "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", - "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654", - "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3", - "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19", - "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", - "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578", - "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9", - "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1", - "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51", - "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719", - "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", - "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a", - "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", - "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade", - "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", - "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc", - "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6", - "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", - "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", - "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6", - "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2", - "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12", - "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf", - "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", - "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7", - "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf", - "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", - "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b", - "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", - "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03", - "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4", - "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", - "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", - "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a", - "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748", - "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b", - "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", - "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482" + "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537", + "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa", + "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a", + "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294", + "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b", + "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", + "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", + "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", + "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4", + "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", + "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2", + "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", + "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", + "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", + "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", + "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", + "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", + "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496", + "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", + "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", + "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e", + "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a", + "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4", + "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca", + "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78", + "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", + "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5", + "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", + "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", + "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", + "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765", + "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6", + "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", + "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", + "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", + "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd", + "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c", + "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", + "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", + "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", + "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770", + "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824", + "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f", + "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf", + "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487", + "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d", + "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd", + "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", + "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534", + "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", + "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", + "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", + "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd", + "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", + "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9", + "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", + "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", + "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d", + "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", + "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", + "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", + "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7", + "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", + "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", + "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8", + "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41", + "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", + "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", + "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", + "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", + "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", + "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", + "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", + "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", + "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", + "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", + "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", + "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e", + "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6", + "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", + "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", + "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e", + "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", + "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", + "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c", + "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", + "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", + "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089", + "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", + "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e", + "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", + "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616" ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.4.0" + "markers": "python_version >= '3.7'", + "version": "==3.4.1" }, "click": { "hashes": [ - "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", - "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" + "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", + "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a" ], "markers": "python_version >= '3.7'", - "version": "==8.1.7" + "version": "==8.1.8" }, "colorama": { "hashes": [ @@ -386,135 +391,135 @@ "toml" ], "hashes": [ - "sha256:00a1d69c112ff5149cabe60d2e2ee948752c975d95f1e1096742e6077affd376", - "sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9", - "sha256:0294ca37f1ba500667b1aef631e48d875ced93ad5e06fa665a3295bdd1d95111", - "sha256:06babbb8f4e74b063dbaeb74ad68dfce9186c595a15f11f5d5683f748fa1d172", - "sha256:0809082ee480bb8f7416507538243c8863ac74fd8a5d2485c46f0f7499f2b491", - "sha256:0b3fb02fe73bed561fa12d279a417b432e5b50fe03e8d663d61b3d5990f29546", - "sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2", - "sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11", - "sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08", - "sha256:11a223a14e91a4693d2d0755c7a043db43d96a7450b4f356d506c2562c48642c", - "sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2", - "sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963", - "sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613", - "sha256:1f76846299ba5c54d12c91d776d9605ae33f8ae2b9d1d3c3703cf2db1a67f2c0", - "sha256:27fb4a050aaf18772db513091c9c13f6cb94ed40eacdef8dad8411d92d9992db", - "sha256:29155cd511ee058e260db648b6182c419422a0d2e9a4fa44501898cf918866cf", - "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73", - "sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117", - "sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1", - "sha256:3c65d37f3a9ebb703e710befdc489a38683a5b152242664b973a7b7b22348a4e", - "sha256:4f704f0998911abf728a7783799444fcbbe8261c4a6c166f667937ae6a8aa522", - "sha256:51b44306032045b383a7a8a2c13878de375117946d68dcb54308111f39775a25", - "sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc", - "sha256:58809e238a8a12a625c70450b48e8767cff9eb67c62e6154a642b21ddf79baea", - "sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52", - "sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a", - "sha256:5f8ae553cba74085db385d489c7a792ad66f7f9ba2ee85bfa508aeb84cf0ba07", - "sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06", - "sha256:6bd818b7ea14bc6e1f06e241e8234508b21edf1b242d49831831a9450e2f35fa", - "sha256:6f01ba56b1c0e9d149f9ac85a2f999724895229eb36bd997b61e62999e9b0901", - "sha256:73d2b73584446e66ee633eaad1a56aad577c077f46c35ca3283cd687b7715b0b", - "sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17", - "sha256:8165b796df0bd42e10527a3f493c592ba494f16ef3c8b531288e3d0d72c1f6f0", - "sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21", - "sha256:8902dd6a30173d4ef09954bfcb24b5d7b5190cf14a43170e386979651e09ba19", - "sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5", - "sha256:8ed9281d1b52628e81393f5eaee24a45cbd64965f41857559c2b7ff19385df51", - "sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3", - "sha256:9cb7fa111d21a6b55cbf633039f7bc2749e74932e3aa7cb7333f675a58a58bf3", - "sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f", - "sha256:a413a096c4cbac202433c850ee43fa326d2e871b24554da8327b01632673a076", - "sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a", - "sha256:ade3ca1e5f0ff46b678b66201f7ff477e8fa11fb537f3b55c3f0568fbfe6e718", - "sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba", - "sha256:b369ead6527d025a0fe7bd3864e46dbee3aa8f652d48df6174f8d0bac9e26e0e", - "sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27", - "sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e", - "sha256:bc66f0bf1d7730a17430a50163bb264ba9ded56739112368ba985ddaa9c3bd09", - "sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e", - "sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70", - "sha256:c481b47f6b5845064c65a7bc78bc0860e635a9b055af0df46fdf1c58cebf8e8f", - "sha256:c7c8b95bf47db6d19096a5e052ffca0a05f335bc63cef281a6e8fe864d450a72", - "sha256:c9b8e184898ed014884ca84c70562b4a82cbc63b044d366fedc68bc2b2f3394a", - "sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef", - "sha256:d541423cdd416b78626b55f123412fcf979d22a2c39fce251b350de38c15c15b", - "sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b", - "sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f", - "sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806", - "sha256:ed8fe9189d2beb6edc14d3ad19800626e1d9f2d975e436f84e19efb7fa19469b", - "sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1", - "sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c", - "sha256:fe439416eb6380de434886b00c859304338f8b19f6f54811984f3420a2e03858" + "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9", + "sha256:0aa9692b4fdd83a4647eeb7db46410ea1322b5ed94cd1715ef09d1d5922ba87f", + "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273", + "sha256:0d7a2bf79378d8fb8afaa994f91bfd8215134f8631d27eba3e0e2c13546ce994", + "sha256:0f460286cb94036455e703c66988851d970fdfd8acc2a1122ab7f4f904e4029e", + "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50", + "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e", + "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e", + "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c", + "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853", + "sha256:299e91b274c5c9cdb64cbdf1b3e4a8fe538a7a86acdd08fae52301b28ba297f8", + "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8", + "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe", + "sha256:32ee6d8491fcfc82652a37109f69dee9a830e9379166cb73c16d8dc5c2915165", + "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb", + "sha256:457574f4599d2b00f7f637a0700a6422243b3565509457b2dbd3f50703e11f59", + "sha256:489a01f94aa581dbd961f306e37d75d4ba16104bbfa2b0edb21d29b73be83609", + "sha256:4bcc276261505d82f0ad426870c3b12cb177752834a633e737ec5ee79bbdff18", + "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098", + "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd", + "sha256:4eea95ef275de7abaef630c9b2c002ffbc01918b726a39f5a4353916ec72d2f3", + "sha256:507a20fc863cae1d5720797761b42d2d87a04b3e5aeb682ef3b7332e90598f43", + "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d", + "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359", + "sha256:59af35558ba08b758aec4d56182b222976330ef8d2feacbb93964f576a7e7a90", + "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78", + "sha256:656c82b8a0ead8bba147de9a89bda95064874c91a3ed43a00e687f23cc19d53a", + "sha256:6713ba4b4ebc330f3def51df1d5d38fad60b66720948112f114968feb52d3f99", + "sha256:675cefc4c06e3b4c876b85bfb7c59c5e2218167bbd4da5075cbe3b5790a28988", + "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2", + "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0", + "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694", + "sha256:7bbd8c8f1b115b892e34ba66a097b915d3871db7ce0e6b9901f462ff3a975377", + "sha256:7ed2f37cfce1ce101e6dffdfd1c99e729dd2ffc291d02d3e2d0af8b53d13840d", + "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23", + "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312", + "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf", + "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6", + "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b", + "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c", + "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690", + "sha256:a3b204c11e2b2d883946fe1d97f89403aa1811df28ce0447439178cc7463448a", + "sha256:a534738b47b0de1995f85f582d983d94031dffb48ab86c95bdf88dc62212142f", + "sha256:a5e37dc41d57ceba70956fa2fc5b63c26dba863c946ace9705f8eca99daecdc4", + "sha256:aa744da1820678b475e4ba3dfd994c321c5b13381d1041fe9c608620e6676e25", + "sha256:ab32947f481f7e8c763fa2c92fd9f44eeb143e7610c4ca9ecd6a36adab4081bd", + "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852", + "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0", + "sha256:bc67deb76bc3717f22e765ab3e07ee9c7a5e26b9019ca19a3b063d9f4b874244", + "sha256:c0b1818063dc9e9d838c09e3a473c1422f517889436dd980f5d721899e66f315", + "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078", + "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0", + "sha256:ccc2b70a7ed475c68ceb548bf69cec1e27305c1c2606a5eb7c3afff56a1b3b27", + "sha256:d37a84878285b903c0fe21ac8794c6dab58150e9359f1aaebbeddd6412d53132", + "sha256:e2f0280519e42b0a17550072861e0bc8a80a0870de260f9796157d3fca2733c5", + "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247", + "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022", + "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b", + "sha256:ea3c8f04b3e4af80e17bab607c386a830ffc2fb88a5484e1df756478cf70d1d3", + "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18", + "sha256:f4f620668dbc6f5e909a0946a877310fb3d57aea8198bde792aae369ee1c23b5", + "sha256:fd34e7b3405f0cc7ab03d54a334c17a9e802897580d964bd8c2001f4b9fd488f" ], "markers": "python_version >= '3.9'", - "version": "==7.6.4" + "version": "==7.6.10" }, "cryptography": { "hashes": [ - "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362", - "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4", - "sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa", - "sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83", - "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff", - "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805", - "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6", - "sha256:4a02ded6cd4f0a5562a8887df8b3bd14e822a90f97ac5e544c162899bc467664", - "sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08", - "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e", - "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18", - "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f", - "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73", - "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5", - "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984", - "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd", - "sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3", - "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e", - "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405", - "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2", - "sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c", - "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995", - "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73", - "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16", - "sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7", - "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd", - "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7" - ], - "version": "==43.0.3" + "sha256:1923cb251c04be85eec9fda837661c67c1049063305d6be5721643c22dd4e2b7", + "sha256:37d76e6863da3774cd9db5b409a9ecfd2c71c981c38788d3fcfaf177f447b731", + "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b", + "sha256:404fdc66ee5f83a1388be54300ae978b2efd538018de18556dde92575e05defc", + "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543", + "sha256:62901fb618f74d7d81bf408c8719e9ec14d863086efe4185afd07c352aee1d2c", + "sha256:660cb7312a08bc38be15b696462fa7cc7cd85c3ed9c576e81f4dc4d8b2b31591", + "sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede", + "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb", + "sha256:831c3c4d0774e488fdc83a1923b49b9957d33287de923d58ebd3cec47a0ae43f", + "sha256:84111ad4ff3f6253820e6d3e58be2cc2a00adb29335d4cacb5ab4d4d34f2a123", + "sha256:8b3e6eae66cf54701ee7d9c83c30ac0a1e3fa17be486033000f2a73a12ab507c", + "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c", + "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285", + "sha256:abc998e0c0eee3c8a1904221d3f67dcfa76422b23620173e28c11d3e626c21bd", + "sha256:b15492a11f9e1b62ba9d73c210e2416724633167de94607ec6069ef724fad092", + "sha256:be4ce505894d15d5c5037167ffb7f0ae90b7be6f2a98f9a5c3442395501c32fa", + "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289", + "sha256:cd4e834f340b4293430701e772ec543b0fbe6c2dea510a5286fe0acabe153a02", + "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64", + "sha256:eb33480f1bad5b78233b0ad3e1b0be21e8ef1da745d8d2aecbb20671658b9053", + "sha256:eca27345e1214d1b9f9490d200f9db5a874479be914199194e746c893788d417", + "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e", + "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e", + "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7", + "sha256:f5e7cb1e5e56ca0933b4873c0220a78b773b24d40d186b6738080b73d3d0a756", + "sha256:f677e1268c4e23420c3acade68fac427fffcb8d19d7df95ed7ad17cdef8404f4" + ], + "version": "==44.0.0" }, "debugpy": { "hashes": [ - "sha256:11ad72eb9ddb436afb8337891a986302e14944f0f755fd94e90d0d71e9100bba", - "sha256:171899588bcd412151e593bd40d9907133a7622cd6ecdbdb75f89d1551df13c2", - "sha256:18b8f731ed3e2e1df8e9cdaa23fb1fc9c24e570cd0081625308ec51c82efe42e", - "sha256:29e1571c276d643757ea126d014abda081eb5ea4c851628b33de0c2b6245b037", - "sha256:2efb84d6789352d7950b03d7f866e6d180284bc02c7e12cb37b489b7083d81aa", - "sha256:2f729228430ef191c1e4df72a75ac94e9bf77413ce5f3f900018712c9da0aaca", - "sha256:45c30aaefb3e1975e8a0258f5bbd26cd40cde9bfe71e9e5a7ac82e79bad64e39", - "sha256:4b908291a1d051ef3331484de8e959ef3e66f12b5e610c203b5b75d2725613a7", - "sha256:4d27d842311353ede0ad572600c62e4bcd74f458ee01ab0dd3a1a4457e7e3706", - "sha256:57b00de1c8d2c84a61b90880f7e5b6deaf4c312ecbde3a0e8912f2a56c4ac9ae", - "sha256:628a11f4b295ffb4141d8242a9bb52b77ad4a63a2ad19217a93be0f77f2c28c9", - "sha256:6a9d9d6d31846d8e34f52987ee0f1a904c7baa4912bf4843ab39dadf9b8f3e0d", - "sha256:6e1c4ffb0c79f66e89dfd97944f335880f0d50ad29525dc792785384923e2211", - "sha256:703c1fd62ae0356e194f3e7b7a92acd931f71fe81c4b3be2c17a7b8a4b546ec2", - "sha256:85ce9c1d0eebf622f86cc68618ad64bf66c4fc3197d88f74bb695a416837dd55", - "sha256:90d93e4f2db442f8222dec5ec55ccfc8005821028982f1968ebf551d32b28907", - "sha256:93176e7672551cb5281577cdb62c63aadc87ec036f0c6a486f0ded337c504596", - "sha256:95fe04a573b8b22896c404365e03f4eda0ce0ba135b7667a1e57bd079793b96b", - "sha256:a6cf2510740e0c0b4a40330640e4b454f928c7b99b0c9dbf48b11efba08a8cda", - "sha256:b12515e04720e9e5c2216cc7086d0edadf25d7ab7e3564ec8b4521cf111b4f8c", - "sha256:b6db2a370e2700557a976eaadb16243ec9c91bd46f1b3bb15376d7aaa7632c81", - "sha256:caf528ff9e7308b74a1749c183d6808ffbedbb9fb6af78b033c28974d9b8831f", - "sha256:cba1d078cf2e1e0b8402e6bda528bf8fda7ccd158c3dba6c012b7897747c41a0", - "sha256:d050a1ec7e925f514f0f6594a1e522580317da31fbda1af71d1530d6ea1f2b40", - "sha256:da8df5b89a41f1fd31503b179d0a84a5fdb752dddd5b5388dbd1ae23cda31ce9", - "sha256:f2f4349a28e3228a42958f8ddaa6333d6f8282d5edaea456070e48609c5983b7" - ], - "markers": "python_version >= '3.8'", - "version": "==1.8.7" + "sha256:0e22f846f4211383e6a416d04b4c13ed174d24cc5d43f5fd52e7821d0ebc8920", + "sha256:116bf8342062246ca749013df4f6ea106f23bc159305843491f64672a55af2e5", + "sha256:189058d03a40103a57144752652b3ab08ff02b7595d0ce1f651b9acc3a3a35a0", + "sha256:23dc34c5e03b0212fa3c49a874df2b8b1b8fda95160bd79c01eb3ab51ea8d851", + "sha256:28e45b3f827d3bf2592f3cf7ae63282e859f3259db44ed2b129093ca0ac7940b", + "sha256:2b26fefc4e31ff85593d68b9022e35e8925714a10ab4858fb1b577a8a48cb8cd", + "sha256:32db46ba45849daed7ccf3f2e26f7a386867b077f39b2a974bb5c4c2c3b0a280", + "sha256:40499a9979c55f72f4eb2fc38695419546b62594f8af194b879d2a18439c97a9", + "sha256:44b1b8e6253bceada11f714acf4309ffb98bfa9ac55e4fce14f9e5d4484287a1", + "sha256:52c3cf9ecda273a19cc092961ee34eb9ba8687d67ba34cc7b79a521c1c64c4c0", + "sha256:52d8a3166c9f2815bfae05f386114b0b2d274456980d41f320299a8d9a5615a7", + "sha256:61bc8b3b265e6949855300e84dc93d02d7a3a637f2aec6d382afd4ceb9120c9f", + "sha256:654130ca6ad5de73d978057eaf9e582244ff72d4574b3e106fb8d3d2a0d32458", + "sha256:6ad2688b69235c43b020e04fecccdf6a96c8943ca9c2fb340b8adc103c655e57", + "sha256:6c1f6a173d1140e557347419767d2b14ac1c9cd847e0b4c5444c7f3144697e4e", + "sha256:84e511a7545d11683d32cdb8f809ef63fc17ea2a00455cc62d0a4dbb4ed1c308", + "sha256:85de8474ad53ad546ff1c7c7c89230db215b9b8a02754d41cb5a76f70d0be296", + "sha256:8988f7163e4381b0da7696f37eec7aca19deb02e500245df68a7159739bbd0d3", + "sha256:8da1db4ca4f22583e834dcabdc7832e56fe16275253ee53ba66627b86e304da1", + "sha256:8ffc382e4afa4aee367bf413f55ed17bd91b191dcaf979890af239dda435f2a1", + "sha256:987bce16e86efa86f747d5151c54e91b3c1e36acc03ce1ddb50f9d09d16ded0e", + "sha256:ad7efe588c8f5cf940f40c3de0cd683cc5b76819446abaa50dc0829a30c094db", + "sha256:bb3b15e25891f38da3ca0740271e63ab9db61f41d4d8541745cfc1824252cb28", + "sha256:c928bbf47f65288574b78518449edaa46c82572d340e2750889bbf8cd92f3737", + "sha256:ce291a5aca4985d82875d6779f61375e959208cdf09fcec40001e65fb0a54768", + "sha256:d8768edcbeb34da9e11bcb8b5c2e0958d25218df7a6e56adf415ef262cd7b6d1" + ], + "markers": "python_version >= '3.8'", + "version": "==1.8.11" }, "decorator": { "hashes": [ @@ -534,11 +539,11 @@ }, "deprecated": { "hashes": [ - "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c", - "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3" + "sha256:353bc4a8ac4bfc96800ddab349d89c25dec1079f65fd53acdcc1e0b975b21320", + "sha256:683e561a90de76239796e6b6feac66b99030d2dd3fcf61ef996330f14bbb9b0d" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.2.14" + "version": "==1.2.15" }, "distlib": { "hashes": [ @@ -573,10 +578,10 @@ }, "fastjsonschema": { "hashes": [ - "sha256:3d48fc5300ee96f5d116f10fe6f28d938e6008f59a6a025c2649475b87f76a23", - "sha256:5875f0b0fa7a0043a91e93a9b8f793bcbbba9691e7fd83dca95c28ba26d21f0a" + "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4", + "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667" ], - "version": "==2.20.0" + "version": "==2.21.1" }, "filelock": { "hashes": [ @@ -619,27 +624,27 @@ }, "httpcore": { "hashes": [ - "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f", - "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f" + "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", + "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd" ], "markers": "python_version >= '3.8'", - "version": "==1.0.6" + "version": "==1.0.7" }, "httpx": { "hashes": [ - "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0", - "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2" + "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", + "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad" ], "markers": "python_version >= '3.8'", - "version": "==0.27.2" + "version": "==0.28.1" }, "identify": { "hashes": [ - "sha256:53863bcac7caf8d2ed85bd20312ea5dcfc22226800f6d6881f232d861db5a8f0", - "sha256:91478c5fb7c3aac5ff7bf9b4344f803843dc586832d5f110d672b19aa1984c98" + "sha256:62f5dae9b5fef52c84cc188514e9ea4f3f636b1d8799ab5ebc475471f9e47a02", + "sha256:9edba65473324c2ea9684b1f944fe3191db3345e50b6d04571d10ed164f8d7bd" ], - "markers": "python_version >= '3.8'", - "version": "==2.6.1" + "markers": "python_version >= '3.9'", + "version": "==2.6.3" }, "idna": { "hashes": [ @@ -657,14 +662,6 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.4.1" }, - "importlib-metadata": { - "hashes": [ - "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b", - "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7" - ], - "markers": "python_version >= '3.8'", - "version": "==8.5.0" - }, "iniconfig": { "hashes": [ "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", @@ -684,11 +681,11 @@ }, "ipython": { "hashes": [ - "sha256:0188a1bd83267192123ccea7f4a8ed0a78910535dbaa3f37671dca76ebd429c8", - "sha256:40b60e15b22591450eef73e40a027cf77bd652e757523eebc5bd7c7c498290eb" + "sha256:46ec58f8d3d076a61d128fe517a51eb730e3aaf0c184ea8c17d16e366660c6a6", + "sha256:b6a2274606bec6166405ff05e54932ed6e5cfecaca1fc05f2cacde7bb074d70b" ], "markers": "python_version >= '3.10'", - "version": "==8.29.0" + "version": "==8.31.0" }, "isoduration": { "hashes": [ @@ -723,27 +720,27 @@ }, "jedi": { "hashes": [ - "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd", - "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0" + "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", + "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9" ], "markers": "python_version >= '3.6'", - "version": "==0.19.1" + "version": "==0.19.2" }, "jinja2": { "hashes": [ - "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", - "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d" + "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb", + "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb" ], "markers": "python_version >= '3.7'", - "version": "==3.1.4" + "version": "==3.1.5" }, "json5": { "hashes": [ - "sha256:34ed7d834b1341a86987ed52f3f76cd8ee184394906b6e22a1e0deb9ab294e8f", - "sha256:548e41b9be043f9426776f05df8635a00fe06104ea51ed24b67f908856e151ae" + "sha256:19b23410220a7271e8377f81ba8aacba2fdd56947fbb137ee5977cbe1f5e8dfa", + "sha256:e66941c8f0a02026943c52c2eb34ebeb2a6f819a0be05920a6f5243cd30fd559" ], - "markers": "python_version >= '3.8'", - "version": "==0.9.25" + "markers": "python_full_version >= '3.8.0'", + "version": "==0.10.0" }, "jsonpointer": { "hashes": [ @@ -789,11 +786,11 @@ }, "jupyter-events": { "hashes": [ - "sha256:4b72130875e59d57716d327ea70d3ebc3af1944d3717e5a498b8a06c6c159960", - "sha256:670b8229d3cc882ec782144ed22e0d29e1c2d639263f92ca8383e66682845e22" + "sha256:36399b41ce1ca45fe8b8271067d6a140ffa54cec4028e95491c93b78a855cacf", + "sha256:c0bc56a37aac29c1fbc3bcfbddb8c8c49533f9cf11f1c4e6adadba936574ab90" ], - "markers": "python_version >= '3.8'", - "version": "==0.10.0" + "markers": "python_version >= '3.9'", + "version": "==0.11.0" }, "jupyter-lsp": { "hashes": [ @@ -805,11 +802,11 @@ }, "jupyter-server": { "hashes": [ - "sha256:47ff506127c2f7851a17bf4713434208fc490955d0e8632e95014a9a9afbeefd", - "sha256:66095021aa9638ced276c248b1d81862e4c50f292d575920bbe960de1c56b12b" + "sha256:872d989becf83517012ee669f09604aa4a28097c0bd90b2f424310156c2cdae3", + "sha256:9d446b8697b4f7337a1b7cdcac40778babdd93ba614b6d68ab1c0c918f1c4084" ], - "markers": "python_version >= '3.8'", - "version": "==2.14.2" + "markers": "python_version >= '3.9'", + "version": "==2.15.0" }, "jupyter-server-terminals": { "hashes": [ @@ -821,11 +818,11 @@ }, "jupyterlab": { "hashes": [ - "sha256:73b6e0775d41a9fee7ee756c80f58a6bed4040869ccc21411dc559818874d321", - "sha256:ae7f3a1b8cb88b4f55009ce79fa7c06f99d70cd63601ee4aa91815d054f46f75" + "sha256:b754c2601c5be6adf87cb5a1d8495d653ffb945f021939f77776acaa94dae952", + "sha256:f0bb9b09a04766e3423cccc2fc23169aa2ffedcdf8713e9e0fb33cac0b6859d0" ], "markers": "python_version >= '3.8'", - "version": "==4.2.5" + "version": "==4.3.4" }, "jupyterlab-pygments": { "hashes": [ @@ -845,11 +842,11 @@ }, "keyring": { "hashes": [ - "sha256:4c753b3ec91717fe713c4edd522d625889d8973a349b0e582622f49766de58e6", - "sha256:e67f8ac32b04be4714b42fe84ce7dad9c40985b9ca827c592cc303e7c26d9741" + "sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66", + "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd" ], - "markers": "python_version >= '3.8'", - "version": "==25.5.0" + "markers": "platform_machine != 'ppc64le' and platform_machine != 's390x'", + "version": "==25.6.0" }, "markdown-it-py": { "hashes": [ @@ -960,42 +957,42 @@ }, "mypy": { "hashes": [ - "sha256:0246bcb1b5de7f08f2826451abd947bf656945209b140d16ed317f65a17dc7dc", - "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e", - "sha256:0730d1c6a2739d4511dc4253f8274cdd140c55c32dfb0a4cf8b7a43f40abfa6f", - "sha256:07de989f89786f62b937851295ed62e51774722e5444a27cecca993fc3f9cd74", - "sha256:100fac22ce82925f676a734af0db922ecfea991e1d7ec0ceb1e115ebe501301a", - "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2", - "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b", - "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73", - "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e", - "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d", - "sha256:3e38b980e5681f28f033f3be86b099a247b13c491f14bb8b1e1e134d23bb599d", - "sha256:4bde84334fbe19bad704b3f5b78c4abd35ff1026f8ba72b29de70dda0916beb6", - "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca", - "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d", - "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5", - "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62", - "sha256:6607e0f1dd1fb7f0aca14d936d13fd19eba5e17e1cd2a14f808fa5f8f6d8f60a", - "sha256:7029881ec6ffb8bc233a4fa364736789582c738217b133f1b55967115288a2bc", - "sha256:7b2353a44d2179846a096e25691d54d59904559f4232519d420d64da6828a3a7", - "sha256:7bcb0bb7f42a978bb323a7c88f1081d1b5dee77ca86f4100735a6f541299d8fb", - "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7", - "sha256:7f5b7deae912cf8b77e990b9280f170381fdfbddf61b4ef80927edd813163732", - "sha256:8a21be69bd26fa81b1f80a61ee7ab05b076c674d9b18fb56239d72e21d9f4c80", - "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a", - "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc", - "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2", - "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0", - "sha256:a6789be98a2017c912ae6ccb77ea553bbaf13d27605d2ca20a76dfbced631b24", - "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7", - "sha256:bde31fc887c213e223bbfc34328070996061b0833b0a4cfec53745ed61f3519b", - "sha256:c5fc54dbb712ff5e5a0fca797e6e0aa25726c7e72c6a5850cfd2adbc1eb0a372", - "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8" + "sha256:00df23b42e533e02a6f0055e54de9a6ed491cd8b7ea738647364fd3a39ea7efc", + "sha256:0b16738b1d80ec4334654e89e798eb705ac0c36c8a5c4798496cd3623aa02286", + "sha256:10065fcebb7c66df04b05fc799a854b1ae24d9963c8bb27e9064a9bdb43aa8ad", + "sha256:14117b9da3305b39860d0aa34b8f1ff74d209a368829a584eb77524389a9c13e", + "sha256:1628c5c3ce823d296e41e2984ff88c5861499041cb416a8809615d0c1f41740e", + "sha256:1daca283d732943731a6a9f20fdbcaa927f160bc51602b1d4ef880a6fb252015", + "sha256:2238d7f93fc4027ed1efc944507683df3ba406445a2b6c96e79666a045aadfab", + "sha256:273e70fcb2e38c5405a188425aa60b984ffdcef65d6c746ea5813024b68c73dc", + "sha256:342de51c48bab326bfc77ce056ba08c076d82ce4f5a86621f972ed39970f94d8", + "sha256:3498cb55448dc5533e438cd13d6ddd28654559c8c4d1fd4b5ca57a31b81bac01", + "sha256:390dfb898239c25289495500f12fa73aa7f24a4c6d90ccdc165762462b998d63", + "sha256:3fa76988dc760da377c1e5069200a50d9eaaccf34f4ea18428a3337034ab5a44", + "sha256:56b2280cedcb312c7a79f5001ae5325582d0d339bce684e4a529069d0e7ca1e7", + "sha256:585ed36031d0b3ee362e5107ef449a8b5dfd4e9c90ccbe36414ee405ee6b32ba", + "sha256:6e73c8a154eed31db3445fe28f63ad2d97b674b911c00191416cf7f6459fd49a", + "sha256:74e925649c1ee0a79aa7448baf2668d81cc287dc5782cff6a04ee93f40fb8d3f", + "sha256:7a52f26b9c9b1664a60d87675f3bae00b5c7f2806e0c2800545a32c325920bcc", + "sha256:7e026d55ddcd76e29e87865c08cbe2d0104e2b3153a523c529de584759379d3d", + "sha256:7e68047bedb04c1c25bba9901ea46ff60d5eaac2d71b1f2161f33107e2b368eb", + "sha256:7fadb29b77fc14a0dd81304ed73c828c3e5cde0016c7e668a86a3e0dfc9f3af3", + "sha256:822dbd184d4a9804df5a7d5335a68cf7662930e70b8c1bc976645d1509f9a9d6", + "sha256:af98c5a958f9c37404bd4eef2f920b94874507e146ed6ee559f185b8809c44cc", + "sha256:bf4ec4980bec1e0e24e5075f449d014011527ae0055884c7e3abc6a99cd2c7f1", + "sha256:c7b243408ea43755f3a21a0a08e5c5ae30eddb4c58a80f415ca6b118816e60aa", + "sha256:cdb5563c1726c85fb201be383168f8c866032db95e1095600806625b3a648cb7", + "sha256:d5326ab70a6db8e856d59ad4cb72741124950cbbf32e7b70e30166ba7bbf61dd", + "sha256:e86aaeaa3221a278c66d3d673b297232947d873773d61ca3ee0e28b2ff027179", + "sha256:e8c8387e5d9dff80e7daf961df357c80e694e942d9755f3ad77d69b0957b8e3f", + "sha256:e971c1c667007f9f2b397ffa80fa8e1e0adccff336e5e77e74cb5f22868bee87", + "sha256:e9f6f4c0b27401d14c483c622bc5105eff3911634d576bbdf6695b9a7c1ba741", + "sha256:f0b343a1d3989547024377c2ba0dca9c74a2428ad6ed24283c213af8dbb0710b", + "sha256:fbb7d683fa6bdecaa106e8368aa973ecc0ddb79a9eaeb4b821591ecd07e9e03c" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==1.13.0" + "version": "==1.14.0" }, "mypy-extensions": { "hashes": [ @@ -1007,11 +1004,11 @@ }, "nbclient": { "hashes": [ - "sha256:4b3f1b7dba531e498449c4db4f53da339c91d449dc11e9af3a43b4eb5c5abb09", - "sha256:f13e3529332a1f1f81d82a53210322476a168bb7090a0289c795fe9cc11c9d3f" + "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d", + "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193" ], - "markers": "python_full_version >= '3.8.0'", - "version": "==0.10.0" + "markers": "python_full_version >= '3.9.0'", + "version": "==0.10.2" }, "nbconvert": { "hashes": [ @@ -1039,24 +1036,33 @@ }, "nh3": { "hashes": [ - "sha256:0411beb0589eacb6734f28d5497ca2ed379eafab8ad8c84b31bb5c34072b7164", - "sha256:14c5a72e9fe82aea5fe3072116ad4661af5cf8e8ff8fc5ad3450f123e4925e86", - "sha256:19aaba96e0f795bd0a6c56291495ff59364f4300d4a39b29a0abc9cb3774a84b", - "sha256:34c03fa78e328c691f982b7c03d4423bdfd7da69cd707fe572f544cf74ac23ad", - "sha256:36c95d4b70530b320b365659bb5034341316e6a9b30f0b25fa9c9eff4c27a204", - "sha256:3a157ab149e591bb638a55c8c6bcb8cdb559c8b12c13a8affaba6cedfe51713a", - "sha256:42c64511469005058cd17cc1537578eac40ae9f7200bedcfd1fc1a05f4f8c200", - "sha256:5f36b271dae35c465ef5e9090e1fdaba4a60a56f0bb0ba03e0932a66f28b9189", - "sha256:6955369e4d9f48f41e3f238a9e60f9410645db7e07435e62c6a9ea6135a4907f", - "sha256:7b7c2a3c9eb1a827d42539aa64091640bd275b81e097cd1d8d82ef91ffa2e811", - "sha256:8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844", - "sha256:94a166927e53972a9698af9542ace4e38b9de50c34352b962f4d9a7d4c927af4", - "sha256:a7f1b5b2c15866f2db413a3649a8fe4fd7b428ae58be2c0f6bca5eefd53ca2be", - "sha256:c8b3a1cebcba9b3669ed1a84cc65bf005728d2f0bc1ed2a6594a992e817f3a50", - "sha256:de3ceed6e661954871d6cd78b410213bdcb136f79aafe22aa7182e028b8c7307", - "sha256:f0eca9ca8628dbb4e916ae2491d72957fdd35f7a5d326b7032a345f111ac07fe" - ], - "version": "==0.2.18" + "sha256:09f037c02fc2c43b211ff1523de32801dcfb0918648d8e651c36ef890f1731ec", + "sha256:0ae9cbd713524cdb81e64663d0d6aae26f678db9f2cd9db0bf162606f1f9f20c", + "sha256:10317cd96fe4bbd4eb6b95f3920b71c902157ad44fed103fdcde43e3b8ee8be6", + "sha256:181063c581defe683bd4bb78188ac9936d208aebbc74c7f7c16b6a32ae2ebb38", + "sha256:1b9a8340a0aab991c68a5ca938d35ef4a8a3f4bf1b455da8855a40bee1fa0ace", + "sha256:231addb7643c952cd6d71f1c8702d703f8fe34afcb20becb3efb319a501a12d7", + "sha256:3eb04b9c3deb13c3a375ea39fd4a3c00d1f92e8fb2349f25f1e3e4506751774b", + "sha256:47b2946c0e13057855209daeffb45dc910bd0c55daf10190bb0b4b60e2999784", + "sha256:4fd2e9248725ebcedac3997a8d3da0d90a12a28c9179c6ba51f1658938ac30d0", + "sha256:6ed834c68452a600f517dd3e1534dbfaff1f67f98899fecf139a055a25d99150", + "sha256:76e2f603b30c02ff6456b233a83fc377dedab6a50947b04e960a6b905637b776", + "sha256:813f1c8012dd64c990514b795508abb90789334f76a561fa0fd4ca32d2275330", + "sha256:8698db4c04b140800d1a1cd3067fda399e36e1e2b8fc1fe04292a907350a3e9b", + "sha256:92f3f1c4f47a2c6f3ca7317b1d5ced05bd29556a75d3a4e2715652ae9d15c05d", + "sha256:9705c42d7ff88a0bea546c82d7fe5e59135e3d3f057e485394f491248a1f8ed5", + "sha256:ac4d27dc836a476efffc6eb661994426b8b805c951b29c9cf2ff36bc9ad58bc5", + "sha256:ce3731c8f217685d33d9268362e5b4f770914e922bba94d368ab244a59a6c397", + "sha256:d2a176fd4306b6f0f178a3f67fac91bd97a3a8d8fafb771c9b9ef675ba5c8886", + "sha256:da87573f03084edae8eb87cfe811ec338606288f81d333c07d2a9a0b9b976c0b", + "sha256:ddefa9fd6794a87e37d05827d299d4b53a3ec6f23258101907b96029bfef138a", + "sha256:e1061a4ab6681f6bdf72b110eea0c4e1379d57c9de937db3be4202f7ad6043db", + "sha256:e1f7370b4e14cc03f5ae141ef30a1caf81fa5787711f80be9081418dd9eb79d2", + "sha256:eb4254b1dac4a1ee49919a5b3f1caf9803ea8dada1816d9e8289e63d3cd0dd9a", + "sha256:f7d564871833ddbe54df3aa59053b1110729d3a800cb7628ae8f42adb3d75208" + ], + "markers": "python_version >= '3.8'", + "version": "==0.2.20" }, "nodeenv": { "hashes": [ @@ -1068,12 +1074,12 @@ }, "notebook": { "hashes": [ - "sha256:2ef07d4220421623ad3fe88118d687bc0450055570cdd160814a59cf3a1c516e", - "sha256:c89264081f671bc02eec0ed470a627ed791b9156cad9285226b31611d3e9fe1c" + "sha256:705e83a1785f45b383bf3ee13cb76680b92d24f56fb0c7d2136fe1d850cd3ca8", + "sha256:e5f85fc59b69d3618d73cf27544418193ff8e8058d5bf61d315ce4f473556288" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==7.2.2" + "version": "==7.3.2" }, "notebook-shim": { "hashes": [ @@ -1097,11 +1103,11 @@ }, "packaging": { "hashes": [ - "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", - "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" + "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", + "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" ], "markers": "python_version >= '3.8'", - "version": "==24.1" + "version": "==24.2" }, "pandocfilters": { "hashes": [ @@ -1129,11 +1135,11 @@ }, "pkginfo": { "hashes": [ - "sha256:5df73835398d10db79f8eecd5cd86b1f6d29317589ea70796994d49399af6297", - "sha256:889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097" + "sha256:8ad91a0445a036782b9366ef8b8c2c50291f83a553478ba8580c73d3215700cf", + "sha256:dcd589c9be4da8973eceffa247733c144812759aa67eaf4bbf97016a02f39088" ], - "markers": "python_version >= '3.6'", - "version": "==1.10.0" + "markers": "python_version >= '3.8'", + "version": "==1.12.0" }, "platformdirs": { "hashes": [ @@ -1162,11 +1168,11 @@ }, "prometheus-client": { "hashes": [ - "sha256:4fa6b4dd0ac16d58bb587c04b1caae65b8c5043e85f778f42f5f632f6af2e166", - "sha256:96c83c606b71ff2b0a433c98889d275f51ffec6c5e267de37c7a2b5c9aa9233e" + "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb", + "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301" ], "markers": "python_version >= '3.8'", - "version": "==0.21.0" + "version": "==0.21.1" }, "prompt-toolkit": { "hashes": [ @@ -1178,26 +1184,26 @@ }, "psutil": { "hashes": [ - "sha256:000d1d1ebd634b4efb383f4034437384e44a6d455260aaee2eca1e9c1b55f047", - "sha256:045f00a43c737f960d273a83973b2511430d61f283a44c96bf13a6e829ba8fdc", - "sha256:0895b8414afafc526712c498bd9de2b063deaac4021a3b3c34566283464aff8e", - "sha256:1209036fbd0421afde505a4879dee3b2fd7b1e14fee81c0069807adcbbcca747", - "sha256:1ad45a1f5d0b608253b11508f80940985d1d0c8f6111b5cb637533a0e6ddc13e", - "sha256:353815f59a7f64cdaca1c0307ee13558a0512f6db064e92fe833784f08539c7a", - "sha256:498c6979f9c6637ebc3a73b3f87f9eb1ec24e1ce53a7c5173b8508981614a90b", - "sha256:5cd2bcdc75b452ba2e10f0e8ecc0b57b827dd5d7aaffbc6821b2a9a242823a76", - "sha256:6d3fbbc8d23fcdcb500d2c9f94e07b1342df8ed71b948a2649b5cb060a7c94ca", - "sha256:6e2dcd475ce8b80522e51d923d10c7871e45f20918e027ab682f94f1c6351688", - "sha256:9118f27452b70bb1d9ab3198c1f626c2499384935aaf55388211ad982611407e", - "sha256:9dcbfce5d89f1d1f2546a2090f4fcf87c7f669d1d90aacb7d7582addece9fb38", - "sha256:a8506f6119cff7015678e2bce904a4da21025cc70ad283a53b099e7620061d85", - "sha256:a8fb3752b491d246034fa4d279ff076501588ce8cbcdbb62c32fd7a377d996be", - "sha256:c0e0c00aa18ca2d3b2b991643b799a15fc8f0563d2ebb6040f64ce8dc027b942", - "sha256:d905186d647b16755a800e7263d43df08b790d709d575105d419f8b6ef65423a", - "sha256:ff34df86226c0227c52f38b919213157588a678d049688eded74c76c8ba4a5d0" + "sha256:018aeae2af92d943fdf1da6b58665124897cfc94faa2ca92098838f83e1b1bca", + "sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377", + "sha256:1924e659d6c19c647e763e78670a05dbb7feaf44a0e9c94bf9e14dfc6ba50468", + "sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3", + "sha256:384636b1a64b47814437d1173be1427a7c83681b17a450bfc309a1953e329603", + "sha256:6d4281f5bbca041e2292be3380ec56a9413b790579b8e593b1784499d0005dac", + "sha256:8be07491f6ebe1a693f17d4f11e69d0dc1811fa082736500f649f79df7735303", + "sha256:8df0178ba8a9e5bc84fed9cfa61d54601b371fbec5c8eebad27575f1e105c0d4", + "sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160", + "sha256:9ccc4316f24409159897799b83004cb1e24f9819b0dcf9c0b68bdcb6cefee6a8", + "sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003", + "sha256:c777eb75bb33c47377c9af68f30e9f11bc78e0f07fbf907be4a5d70b2fe5f030", + "sha256:ca9609c77ea3b8481ab005da74ed894035936223422dc591d6772b147421f777", + "sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5", + "sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53", + "sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649", + "sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==6.1.0" + "version": "==6.1.1" }, "ptyprocess": { "hashes": [ @@ -1223,20 +1229,20 @@ }, "pydot": { "hashes": [ - "sha256:9180da540b51b3aa09fbf81140b3edfbe2315d778e8589a7d0a4a69c41332bae", - "sha256:99cedaa55d04abb0b2bc56d9981a6da781053dd5ac75c428e8dd53db53f90b14" + "sha256:5e009d97b2fff92b7a88f09ec1fd5b163f07f3b10469c927d362471d6faa0d50", + "sha256:9b0b3081e0bd362d0c61148da10eb1281ec80089b02a28cf06f9093843986f3d" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==3.0.2" + "version": "==3.0.3" }, "pygithub": { "hashes": [ - "sha256:6601e22627e87bac192f1e2e39c6e6f69a43152cfb8f307cee575879320b3051", - "sha256:81935aa4bdc939fba98fee1cb47422c09157c56a27966476ff92775602b9ee24" + "sha256:b0b635999a658ab8e08720bdd3318893ff20e2275f6446fcf35bf3f44f2c0fd2", + "sha256:e1613ac508a9be710920d26eb18b1905ebd9926aa49398e88151c1b526aad3cf" ], "markers": "python_version >= '3.8'", - "version": "==2.4.0" + "version": "==2.5.0" }, "pygments": { "hashes": [ @@ -1251,11 +1257,11 @@ "crypto" ], "hashes": [ - "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850", - "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c" + "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", + "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb" ], - "markers": "python_version >= '3.8'", - "version": "==2.9.0" + "markers": "python_version >= '3.9'", + "version": "==2.10.1" }, "pynacl": { "hashes": [ @@ -1289,23 +1295,31 @@ "markers": "python_version >= '3.8'", "version": "==1.8.0" }, + "pyproject-hooks": { + "hashes": [ + "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", + "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913" + ], + "markers": "python_version >= '3.7'", + "version": "==1.2.0" + }, "pyright": { "hashes": [ - "sha256:577de60224f7fe36505d5b181231e3a395d427b7873be0bbcaa962a29ea93a60", - "sha256:6a1f495a261a72e12ad17e20d1ae3df4511223c773b19407cfa006229b1b08a5" + "sha256:54fa186f8b3e8a55a44ebfa842636635688670c6896dcf6cf4a7fc75062f4d15", + "sha256:66b2d42cdf5c3cbab05f2f4b76e8bec8aa78e679bfa0b6ad7b923d9e027cadb2" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==1.1.387" + "version": "==1.1.391" }, "pytest": { "hashes": [ - "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181", - "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2" + "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6", + "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==8.3.3" + "version": "==8.3.4" }, "pytest-cov": { "hashes": [ @@ -1326,11 +1340,11 @@ }, "python-json-logger": { "hashes": [ - "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c", - "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd" + "sha256:8eb0554ea17cb75b05d2848bc14fb02fbdbd9d6972120781b974380bfa162008", + "sha256:cdc17047eb5374bd311e748b42f99d71223f3b0e186f4206cc5d52aefe85b090" ], - "markers": "python_version >= '3.6'", - "version": "==2.0.7" + "markers": "python_version >= '3.8'", + "version": "==3.2.1" }, "pyyaml": { "hashes": [ @@ -1582,137 +1596,137 @@ }, "rpds-py": { "hashes": [ - "sha256:02a0629ec053fc013808a85178524e3cb63a61dbc35b22499870194a63578fb9", - "sha256:07924c1b938798797d60c6308fa8ad3b3f0201802f82e4a2c41bb3fafb44cc28", - "sha256:07f59760ef99f31422c49038964b31c4dfcfeb5d2384ebfc71058a7c9adae2d2", - "sha256:0a3a1e9ee9728b2c1734f65d6a1d376c6f2f6fdcc13bb007a08cc4b1ff576dc5", - "sha256:0a90c373ea2975519b58dece25853dbcb9779b05cc46b4819cb1917e3b3215b6", - "sha256:0ad56edabcdb428c2e33bbf24f255fe2b43253b7d13a2cdbf05de955217313e6", - "sha256:0b581f47257a9fce535c4567782a8976002d6b8afa2c39ff616edf87cbeff712", - "sha256:0f8f741b6292c86059ed175d80eefa80997125b7c478fb8769fd9ac8943a16c0", - "sha256:0fc212779bf8411667234b3cdd34d53de6c2b8b8b958e1e12cb473a5f367c338", - "sha256:13c56de6518e14b9bf6edde23c4c39dac5b48dcf04160ea7bce8fca8397cdf86", - "sha256:142c0a5124d9bd0e2976089484af5c74f47bd3298f2ed651ef54ea728d2ea42c", - "sha256:14511a539afee6f9ab492b543060c7491c99924314977a55c98bfa2ee29ce78c", - "sha256:15a842bb369e00295392e7ce192de9dcbf136954614124a667f9f9f17d6a216f", - "sha256:16d4477bcb9fbbd7b5b0e4a5d9b493e42026c0bf1f06f723a9353f5153e75d30", - "sha256:1791ff70bc975b098fe6ecf04356a10e9e2bd7dc21fa7351c1742fdeb9b4966f", - "sha256:19b73643c802f4eaf13d97f7855d0fb527fbc92ab7013c4ad0e13a6ae0ed23bd", - "sha256:200a23239781f46149e6a415f1e870c5ef1e712939fe8fa63035cd053ac2638e", - "sha256:2249280b870e6a42c0d972339e9cc22ee98730a99cd7f2f727549af80dd5a963", - "sha256:2b431c777c9653e569986ecf69ff4a5dba281cded16043d348bf9ba505486f36", - "sha256:2cc3712a4b0b76a1d45a9302dd2f53ff339614b1c29603a911318f2357b04dd2", - "sha256:2fbb0ffc754490aff6dabbf28064be47f0f9ca0b9755976f945214965b3ace7e", - "sha256:32b922e13d4c0080d03e7b62991ad7f5007d9cd74e239c4b16bc85ae8b70252d", - "sha256:36785be22066966a27348444b40389f8444671630063edfb1a2eb04318721e17", - "sha256:37fe0f12aebb6a0e3e17bb4cd356b1286d2d18d2e93b2d39fe647138458b4bcb", - "sha256:3aea7eed3e55119635a74bbeb80b35e776bafccb70d97e8ff838816c124539f1", - "sha256:3c6afcf2338e7f374e8edc765c79fbcb4061d02b15dd5f8f314a4af2bdc7feb5", - "sha256:3ccb8ac2d3c71cda472b75af42818981bdacf48d2e21c36331b50b4f16930163", - "sha256:3d089d0b88996df627693639d123c8158cff41c0651f646cd8fd292c7da90eaf", - "sha256:3dd645e2b0dcb0fd05bf58e2e54c13875847687d0b71941ad2e757e5d89d4356", - "sha256:3e310838a5801795207c66c73ea903deda321e6146d6f282e85fa7e3e4854804", - "sha256:42cbde7789f5c0bcd6816cb29808e36c01b960fb5d29f11e052215aa85497c93", - "sha256:483b29f6f7ffa6af845107d4efe2e3fa8fb2693de8657bc1849f674296ff6a5a", - "sha256:4888e117dd41b9d34194d9e31631af70d3d526efc363085e3089ab1a62c32ed1", - "sha256:49fe9b04b6fa685bd39237d45fad89ba19e9163a1ccaa16611a812e682913496", - "sha256:4a5a844f68776a7715ecb30843b453f07ac89bad393431efbf7accca3ef599c1", - "sha256:4a916087371afd9648e1962e67403c53f9c49ca47b9680adbeef79da3a7811b0", - "sha256:4f676e21db2f8c72ff0936f895271e7a700aa1f8d31b40e4e43442ba94973899", - "sha256:518d2ca43c358929bf08f9079b617f1c2ca6e8848f83c1225c88caeac46e6cbc", - "sha256:5265505b3d61a0f56618c9b941dc54dc334dc6e660f1592d112cd103d914a6db", - "sha256:55cd1fa4ecfa6d9f14fbd97ac24803e6f73e897c738f771a9fe038f2f11ff07c", - "sha256:58b1d5dd591973d426cbb2da5e27ba0339209832b2f3315928c9790e13f159e8", - "sha256:59240685e7da61fb78f65a9f07f8108e36a83317c53f7b276b4175dc44151684", - "sha256:5b48e790e0355865197ad0aca8cde3d8ede347831e1959e158369eb3493d2191", - "sha256:5d4eea0761e37485c9b81400437adb11c40e13ef513375bbd6973e34100aeb06", - "sha256:648386ddd1e19b4a6abab69139b002bc49ebf065b596119f8f37c38e9ecee8ff", - "sha256:653647b8838cf83b2e7e6a0364f49af96deec64d2a6578324db58380cff82aca", - "sha256:6740a3e8d43a32629bb9b009017ea5b9e713b7210ba48ac8d4cb6d99d86c8ee8", - "sha256:6889469bfdc1eddf489729b471303739bf04555bb151fe8875931f8564309afc", - "sha256:68cb0a499f2c4a088fd2f521453e22ed3527154136a855c62e148b7883b99f9a", - "sha256:6aa97af1558a9bef4025f8f5d8c60d712e0a3b13a2fe875511defc6ee77a1ab7", - "sha256:6b73c67850ca7cae0f6c56f71e356d7e9fa25958d3e18a64927c2d930859b8e4", - "sha256:6c8e9340ce5a52f95fa7d3b552b35c7e8f3874d74a03a8a69279fd5fca5dc751", - "sha256:6ca91093a4a8da4afae7fe6a222c3b53ee4eef433ebfee4d54978a103435159e", - "sha256:754bbed1a4ca48479e9d4182a561d001bbf81543876cdded6f695ec3d465846b", - "sha256:762703bdd2b30983c1d9e62b4c88664df4a8a4d5ec0e9253b0231171f18f6d75", - "sha256:78f0b6877bfce7a3d1ff150391354a410c55d3cdce386f862926a4958ad5ab7e", - "sha256:7a07ced2b22f0cf0b55a6a510078174c31b6d8544f3bc00c2bcee52b3d613f74", - "sha256:7dca7081e9a0c3b6490a145593f6fe3173a94197f2cb9891183ef75e9d64c425", - "sha256:7e21b7031e17c6b0e445f42ccc77f79a97e2687023c5746bfb7a9e45e0921b84", - "sha256:7f5179583d7a6cdb981151dd349786cbc318bab54963a192692d945dd3f6435d", - "sha256:83cba698cfb3c2c5a7c3c6bac12fe6c6a51aae69513726be6411076185a8b24a", - "sha256:842c19a6ce894493563c3bd00d81d5100e8e57d70209e84d5491940fdb8b9e3a", - "sha256:84b8382a90539910b53a6307f7c35697bc7e6ffb25d9c1d4e998a13e842a5e83", - "sha256:8ba6f89cac95c0900d932c9efb7f0fb6ca47f6687feec41abcb1bd5e2bd45535", - "sha256:8bbe951244a838a51289ee53a6bae3a07f26d4e179b96fc7ddd3301caf0518eb", - "sha256:925d176a549f4832c6f69fa6026071294ab5910e82a0fe6c6228fce17b0706bd", - "sha256:92b68b79c0da2a980b1c4197e56ac3dd0c8a149b4603747c4378914a68706979", - "sha256:93da1d3db08a827eda74356f9f58884adb254e59b6664f64cc04cdff2cc19b0d", - "sha256:95f3b65d2392e1c5cec27cff08fdc0080270d5a1a4b2ea1d51d5f4a2620ff08d", - "sha256:9c4cb04a16b0f199a8c9bf807269b2f63b7b5b11425e4a6bd44bd6961d28282c", - "sha256:a624cc00ef2158e04188df5e3016385b9353638139a06fb77057b3498f794782", - "sha256:a649dfd735fff086e8a9d0503a9f0c7d01b7912a333c7ae77e1515c08c146dad", - "sha256:a94e52537a0e0a85429eda9e49f272ada715506d3b2431f64b8a3e34eb5f3e75", - "sha256:aa7ac11e294304e615b43f8c441fee5d40094275ed7311f3420d805fde9b07b4", - "sha256:b41b6321805c472f66990c2849e152aff7bc359eb92f781e3f606609eac877ad", - "sha256:b71b8666eeea69d6363248822078c075bac6ed135faa9216aa85f295ff009b1e", - "sha256:b9c2fe36d1f758b28121bef29ed1dee9b7a2453e997528e7d1ac99b94892527c", - "sha256:bb63804105143c7e24cee7db89e37cb3f3941f8e80c4379a0b355c52a52b6780", - "sha256:be5ef2f1fc586a7372bfc355986226484e06d1dc4f9402539872c8bb99e34b01", - "sha256:c142b88039b92e7e0cb2552e8967077e3179b22359e945574f5e2764c3953dcf", - "sha256:c14937af98c4cc362a1d4374806204dd51b1e12dded1ae30645c298e5a5c4cb1", - "sha256:ca449520e7484534a2a44faf629362cae62b660601432d04c482283c47eaebab", - "sha256:cd945871335a639275eee904caef90041568ce3b42f402c6959b460d25ae8732", - "sha256:d0b937b2a1988f184a3e9e577adaa8aede21ec0b38320d6009e02bd026db04fa", - "sha256:d126b52e4a473d40232ec2052a8b232270ed1f8c9571aaf33f73a14cc298c24f", - "sha256:d8761c3c891cc51e90bc9926d6d2f59b27beaf86c74622c8979380a29cc23ac3", - "sha256:d9ecb51120de61e4604650666d1f2b68444d46ae18fd492245a08f53ad2b7711", - "sha256:da584ff96ec95e97925174eb8237e32f626e7a1a97888cdd27ee2f1f24dd0ad8", - "sha256:dbcf360c9e3399b056a238523146ea77eeb2a596ce263b8814c900263e46031a", - "sha256:dbddc10776ca7ebf2a299c41a4dde8ea0d8e3547bfd731cb87af2e8f5bf8962d", - "sha256:dc73505153798c6f74854aba69cc75953888cf9866465196889c7cdd351e720c", - "sha256:e13de156137b7095442b288e72f33503a469aa1980ed856b43c353ac86390519", - "sha256:e1791c4aabd117653530dccd24108fa03cc6baf21f58b950d0a73c3b3b29a350", - "sha256:e75ba609dba23f2c95b776efb9dd3f0b78a76a151e96f96cc5b6b1b0004de66f", - "sha256:e79059d67bea28b53d255c1437b25391653263f0e69cd7dec170d778fdbca95e", - "sha256:ecd27a66740ffd621d20b9a2f2b5ee4129a56e27bfb9458a3bcc2e45794c96cb", - "sha256:f009c69bc8c53db5dfab72ac760895dc1f2bc1b62ab7408b253c8d1ec52459fc", - "sha256:f16bc1334853e91ddaaa1217045dd7be166170beec337576818461268a3de67f", - "sha256:f19169781dddae7478a32301b499b2858bc52fc45a112955e798ee307e294977", - "sha256:fa3060d885657abc549b2a0f8e1b79699290e5d83845141717c6c90c2df38311", - "sha256:fa41a64ac5b08b292906e248549ab48b69c5428f3987b09689ab2441f267d04d", - "sha256:fbf15aff64a163db29a91ed0868af181d6f68ec1a3a7d5afcfe4501252840bad", - "sha256:fe00a9057d100e69b4ae4a094203a708d65b0f345ed546fdef86498bf5390982" - ], - "markers": "python_version >= '3.8'", - "version": "==0.20.1" + "sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518", + "sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059", + "sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61", + "sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5", + "sha256:0b8db6b5b2d4491ad5b6bdc2bc7c017eec108acbf4e6785f42a9eb0ba234f4c9", + "sha256:0c150c7a61ed4a4f4955a96626574e9baf1adf772c2fb61ef6a5027e52803543", + "sha256:0f3cec041684de9a4684b1572fe28c7267410e02450f4561700ca5a3bc6695a2", + "sha256:1352ae4f7c717ae8cba93421a63373e582d19d55d2ee2cbb184344c82d2ae55a", + "sha256:177c7c0fce2855833819c98e43c262007f42ce86651ffbb84f37883308cb0e7d", + "sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56", + "sha256:1a60bce91f81ddaac922a40bbb571a12c1070cb20ebd6d49c48e0b101d87300d", + "sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd", + "sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b", + "sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4", + "sha256:214b7a953d73b5e87f0ebece4a32a5bd83c60a3ecc9d4ec8f1dca968a2d91e99", + "sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d", + "sha256:24e8abb5878e250f2eb0d7859a8e561846f98910326d06c0d51381fed59357bd", + "sha256:26fd7cac7dd51011a245f29a2cc6489c4608b5a8ce8d75661bb4a1066c52dfbe", + "sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1", + "sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e", + "sha256:2b8f60e1b739a74bab7e01fcbe3dddd4657ec685caa04681df9d562ef15b625f", + "sha256:2de29005e11637e7a2361fa151f780ff8eb2543a0da1413bb951e9f14b699ef3", + "sha256:2e8b55d8517a2fda8d95cb45d62a5a8bbf9dd0ad39c5b25c8833efea07b880ca", + "sha256:2fa4331c200c2521512595253f5bb70858b90f750d39b8cbfd67465f8d1b596d", + "sha256:3445e07bf2e8ecfeef6ef67ac83de670358abf2996916039b16a218e3d95e97e", + "sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc", + "sha256:378753b4a4de2a7b34063d6f95ae81bfa7b15f2c1a04a9518e8644e81807ebea", + "sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38", + "sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b", + "sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c", + "sha256:4041711832360a9b75cfb11b25a6a97c8fb49c07b8bd43d0d02b45d0b499a4ff", + "sha256:44d61b4b7d0c2c9ac019c314e52d7cbda0ae31078aabd0f22e583af3e0d79723", + "sha256:4617e1915a539a0d9a9567795023de41a87106522ff83fbfaf1f6baf8e85437e", + "sha256:4b232061ca880db21fa14defe219840ad9b74b6158adb52ddf0e87bead9e8493", + "sha256:5246b14ca64a8675e0a7161f7af68fe3e910e6b90542b4bfb5439ba752191df6", + "sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83", + "sha256:583f6a1993ca3369e0f80ba99d796d8e6b1a3a2a442dd4e1a79e652116413091", + "sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1", + "sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627", + "sha256:59f4a79c19232a5774aee369a0c296712ad0e77f24e62cad53160312b1c1eaa1", + "sha256:5f0e260eaf54380380ac3808aa4ebe2d8ca28b9087cf411649f96bad6900c728", + "sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16", + "sha256:64607d4cbf1b7e3c3c8a14948b99345eda0e161b852e122c6bb71aab6d1d798c", + "sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45", + "sha256:666ecce376999bf619756a24ce15bb14c5bfaf04bf00abc7e663ce17c3f34fe7", + "sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a", + "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730", + "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967", + "sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25", + "sha256:70eb60b3ae9245ddea20f8a4190bd79c705a22f8028aaf8bbdebe4716c3fab24", + "sha256:70fb28128acbfd264eda9bf47015537ba3fe86e40d046eb2963d75024be4d055", + "sha256:7b2513ba235829860b13faa931f3b6846548021846ac808455301c23a101689d", + "sha256:7ef9d9da710be50ff6809fed8f1963fecdfecc8b86656cadfca3bc24289414b0", + "sha256:81e69b0a0e2537f26d73b4e43ad7bc8c8efb39621639b4434b76a3de50c6966e", + "sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7", + "sha256:8bd7c8cfc0b8247c8799080fbff54e0b9619e17cdfeb0478ba7295d43f635d7c", + "sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f", + "sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd", + "sha256:9bd7228827ec7bb817089e2eb301d907c0d9827a9e558f22f762bb690b131652", + "sha256:9beeb01d8c190d7581a4d59522cd3d4b6887040dcfc744af99aa59fef3e041a8", + "sha256:a63cbdd98acef6570c62b92a1e43266f9e8b21e699c363c0fef13bd530799c11", + "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333", + "sha256:ac0a03221cdb5058ce0167ecc92a8c89e8d0decdc9e99a2ec23380793c4dcb96", + "sha256:b0b4136a252cadfa1adb705bb81524eee47d9f6aab4f2ee4fa1e9d3cd4581f64", + "sha256:b25bc607423935079e05619d7de556c91fb6adeae9d5f80868dde3468657994b", + "sha256:b3d504047aba448d70cf6fa22e06cb09f7cbd761939fdd47604f5e007675c24e", + "sha256:bb47271f60660803ad11f4c61b42242b8c1312a31c98c578f79ef9387bbde21c", + "sha256:bbb232860e3d03d544bc03ac57855cd82ddf19c7a07651a7c0fdb95e9efea8b9", + "sha256:bc27863442d388870c1809a87507727b799c8460573cfbb6dc0eeaef5a11b5ec", + "sha256:bc51abd01f08117283c5ebf64844a35144a0843ff7b2983e0648e4d3d9f10dbb", + "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37", + "sha256:bf9db5488121b596dbfc6718c76092fda77b703c1f7533a226a5a9f65248f8ad", + "sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9", + "sha256:cfbc454a2880389dbb9b5b398e50d439e2e58669160f27b60e5eca11f68ae17c", + "sha256:cff63a0272fcd259dcc3be1657b07c929c466b067ceb1c20060e8d10af56f5bf", + "sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4", + "sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f", + "sha256:d48424e39c2611ee1b84ad0f44fb3b2b53d473e65de061e3f460fc0be5f1939d", + "sha256:e0fa2d4ec53dc51cf7d3bb22e0aa0143966119f42a0c3e4998293a3dd2856b09", + "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d", + "sha256:e35ba67d65d49080e8e5a1dd40101fccdd9798adb9b050ff670b7d74fa41c566", + "sha256:e3fb866d9932a3d7d0c82da76d816996d1667c44891bd861a0f97ba27e84fc74", + "sha256:e61b02c3f7a1e0b75e20c3978f7135fd13cb6cf551bf4a6d29b999a88830a338", + "sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15", + "sha256:e79dd39f1e8c3504be0607e5fc6e86bb60fe3584bec8b782578c3b0fde8d932c", + "sha256:e89391e6d60251560f0a8f4bd32137b077a80d9b7dbe6d5cab1cd80d2746f648", + "sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84", + "sha256:eaf16ae9ae519a0e237a0f528fd9f0197b9bb70f40263ee57ae53c2b8d48aeb3", + "sha256:eb0c341fa71df5a4595f9501df4ac5abfb5a09580081dffbd1ddd4654e6e9123", + "sha256:f276b245347e6e36526cbd4a266a417796fc531ddf391e43574cf6466c492520", + "sha256:f47ad3d5f3258bd7058d2d506852217865afefe6153a36eb4b6928758041d831", + "sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e", + "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf", + "sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b", + "sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2", + "sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3", + "sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130", + "sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b", + "sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de", + "sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5", + "sha256:fb6116dfb8d1925cbdb52595560584db42a7f664617a1f7d7f6e32f138cdf37d", + "sha256:fda7cb070f442bf80b642cd56483b5548e43d366fe3f39b98e67cce780cded00", + "sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e" + ], + "markers": "python_version >= '3.9'", + "version": "==0.22.3" }, "ruff": { "hashes": [ - "sha256:21aae53ab1490a52bf4e3bf520c10ce120987b047c494cacf4edad0ba0888da2", - "sha256:28bd8220f4d8f79d590db9e2f6a0674f75ddbc3847277dd44ac1f8d30684b828", - "sha256:2b14e77293380e475b4e3a7a368e14549288ed2931fce259a6f99978669e844f", - "sha256:576305393998b7bd6c46018f8104ea3a9cb3fa7908c21d8580e3274a3b04b691", - "sha256:5b813ef26db1015953daf476202585512afd6a6862a02cde63f3bafb53d0b2d4", - "sha256:7b792468e9804a204be221b14257566669d1db5c00d6bb335996e5cd7004ba80", - "sha256:853277dbd9675810c6826dad7a428d52a11760744508340e66bf46f8be9701d9", - "sha256:9fd67094e77efbea932e62b5d2483006154794040abb3a5072e659096415ae1e", - "sha256:b19fafe261bf741bca2764c14cbb4ee1819b67adb63ebc2db6401dcd652e3748", - "sha256:b73f873b5f52092e63ed540adefc3c36f1f803790ecf2590e1df8bf0a9f72cb8", - "sha256:bb8368cd45bba3f57bb29cbb8d64b4a33f8415d0149d2655c5c8539452ce7760", - "sha256:ccc7e0fc6e0cb3168443eeadb6445285abaae75142ee22b2b72c27d790ab60ba", - "sha256:dba53ed84ac19ae4bfb4ea4bf0172550a2285fa27fbb13e3746f04c80f7fa088", - "sha256:dd8800cbe0254e06b8fec585e97554047fb82c894973f7ff18558eee33d1cb88", - "sha256:e00163fb897d35523c70d71a46fbaa43bf7bf9af0f4534c53ea5b96b2e03397b", - "sha256:f3c54b538633482dc342e9b634d91168fe8cc56b30a4b4f99287f4e339103e88", - "sha256:fa993cfc9f0ff11187e82de874dfc3611df80852540331bc85c75809c93253a8", - "sha256:fd77877a4e43b3a98e5ef4715ba3862105e299af0c48942cc6d51ba3d97dc859" + "sha256:0d5f89f254836799af1615798caa5f80b7f935d7a670fad66c5007928e57ace8", + "sha256:13e9ec6d6b55f6da412d59953d65d66e760d583dd3c1c72bf1f26435b5bfdbae", + "sha256:552fb6d861320958ca5e15f28b20a3d071aa83b93caee33a87b471f99a6c0835", + "sha256:58072f0c06080276804c6a4e21a9045a706584a958e644353603d36ca1eb8a60", + "sha256:6ddf5d654ac0d44389f6bf05cee4caeefc3132a64b58ea46738111d687352296", + "sha256:736272574e97157f7edbbb43b1d046125fce9e7d8d583d5d65d0c9bf2c15addf", + "sha256:8ef06f66f4a05c3ddbc9121a8b0cecccd92c5bf3dd43b5472ffe40b8ca10f0f8", + "sha256:9183dd615d8df50defa8b1d9a074053891ba39025cf5ae88e8bcb52edcc4bf08", + "sha256:97d9aefef725348ad77d6db98b726cfdb075a40b936c7984088804dfd38268a7", + "sha256:9f8402b7c4f96463f135e936d9ab77b65711fcd5d72e5d67597b543bbb43cf3f", + "sha256:ab78e33325a6f5374e04c2ab924a3367d69a0da36f8c9cb6b894a62017506111", + "sha256:bf197b98ed86e417412ee3b6c893f44c8864f816451441483253d5ff22c0e81e", + "sha256:c41319b85faa3aadd4d30cb1cffdd9ac6b89704ff79f7664b853785b48eccdf3", + "sha256:e248b1f0fa2749edd3350a2a342b67b43a2627434c059a063418e3d375cfe643", + "sha256:e4e56b3baa9c23d324ead112a4fdf20db9a3f8f29eeabff1355114dd96014604", + "sha256:e5fe710ab6061592521f902fca7ebcb9fabd27bc7c57c764298b1c1f15fff720", + "sha256:f21a1143776f8656d7f364bd264a9d60f01b7f52243fbe90e7670c0dfe0cf65d", + "sha256:ffb60904651c00a1e0b8df594591770018a0f04587f7deeb3838344fe3adabac" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==0.7.2" + "version": "==0.8.4" }, "semantic-version": { "hashes": [ @@ -1732,20 +1746,20 @@ }, "setuptools": { "hashes": [ - "sha256:f2504966861356aa38616760c0f66568e535562374995367b4e69c7143cf6bcd", - "sha256:fba5dd4d766e97be1b1681d98712680ae8f2f26d7881245f2ce9e40714f1a686" + "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6", + "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==75.3.0" + "markers": "python_version >= '3.9'", + "version": "==75.6.0" }, "six": { "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", + "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.16.0" + "version": "==1.17.0" }, "smmap": { "hashes": [ @@ -1796,12 +1810,12 @@ }, "sphinx-rtd-theme": { "hashes": [ - "sha256:921c0ece75e90633ee876bd7b148cfaad136b481907ad154ac3669b6fc957916", - "sha256:a4c5745d1b06dfcb80b7704fe532eb765b44065a8fad9851e4258c8804140703" + "sha256:422ccc750c3a3a311de4ae327e82affdaf59eb695ba4936538552f3b00f4ee13", + "sha256:b7457bc25dda723b20b086a670b9953c859eab60a2a03ee8eb2bb23e176e5f85" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==3.0.1" + "version": "==3.0.2" }, "sphinxcontrib-applehelp": { "hashes": [ @@ -1866,6 +1880,24 @@ ], "version": "==0.6.3" }, + "tablib": { + "extras": [ + "cli" + ], + "hashes": [ + "sha256:9a6930037cfe0f782377963ca3f2b1dae3fd4cdbf0883848f22f1447e7bb718b", + "sha256:f9db84ed398df5109bd69c11d46613d16cc572fb9ad3213f10d95e2b5f12c18e" + ], + "markers": "python_version >= '3.9'", + "version": "==3.7.0" + }, + "tabulate": { + "hashes": [ + "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", + "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f" + ], + "version": "==0.9.0" + }, "terminado": { "hashes": [ "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0", @@ -1892,20 +1924,20 @@ }, "tornado": { "hashes": [ - "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8", - "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f", - "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4", - "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3", - "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14", - "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842", - "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9", - "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698", - "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7", - "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d", - "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4" + "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803", + "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec", + "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482", + "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634", + "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38", + "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b", + "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c", + "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf", + "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946", + "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73", + "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1" ], "markers": "python_version >= '3.8'", - "version": "==6.4.1" + "version": "==6.4.2" }, "tox": { "hashes": [ @@ -1926,20 +1958,20 @@ }, "twine": { "hashes": [ - "sha256:215dbe7b4b94c2c50a7315c0275d2258399280fbb7d04182c7e55e24b5f93997", - "sha256:9aa0825139c02b3434d913545c7b847a21c835e11597f5255842d457da2322db" + "sha256:36158b09df5406e1c9c1fb8edb24fc2be387709443e7376689b938531582ee27", + "sha256:9c6025b203b51521d53e200f4a08b116dee7500a38591668c6a6033117bdc218" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==5.1.1" + "version": "==6.0.1" }, "types-python-dateutil": { "hashes": [ - "sha256:250e1d8e80e7bbc3a6c99b907762711d1a1cdd00e978ad39cb5940f6f0a87f3d", - "sha256:58cb85449b2a56d6684e41aeefb4c4280631246a0da1a719bdbe6f3fb0317446" + "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb", + "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53" ], "markers": "python_version >= '3.8'", - "version": "==2.9.0.20241003" + "version": "==2.9.0.20241206" }, "typing-extensions": { "hashes": [ @@ -1959,19 +1991,19 @@ }, "urllib3": { "hashes": [ - "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", - "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9" + "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", + "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d" ], - "markers": "python_version >= '3.8'", - "version": "==2.2.3" + "markers": "python_version >= '3.9'", + "version": "==2.3.0" }, "virtualenv": { "hashes": [ - "sha256:142c6be10212543b32c6c45d3d3893dff89112cc588b7d0879ae5a1ec03a47ba", - "sha256:f11f1b8a29525562925f745563bfd48b189450f61fb34c4f9cc79dd5aa32a1f4" + "sha256:23eae1b4516ecd610481eda647f3a7c09aea295055337331bb4e6892ecce47b0", + "sha256:2c9c3262bb8e7b87ea801d715fae4495e6032450c71d2309be9550e7364049aa" ], "markers": "python_version >= '3.8'", - "version": "==20.27.1" + "version": "==20.28.0" }, "wcwidth": { "hashes": [ @@ -1982,10 +2014,10 @@ }, "webcolors": { "hashes": [ - "sha256:08b07af286a01bcd30d583a7acadf629583d1f79bfef27dd2c2c5c263817277d", - "sha256:fc4c3b59358ada164552084a8ebee637c221e4059267d0f8325b3b560f6c7f0a" + "sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9", + "sha256:ecb3d768f32202af770477b8b65f318fa4f566c22948673a977b00d589dd80f6" ], - "version": "==24.8.0" + "version": "==24.11.1" }, "webencodings": { "hashes": [ @@ -2004,88 +2036,83 @@ }, "wheel": { "hashes": [ - "sha256:2376a90c98cc337d18623527a97c31797bd02bad0033d41547043a1cbfbe448f", - "sha256:a29c3f2817e95ab89aa4660681ad547c0e9547f20e75b0562fe7723c9a2a9d49" + "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729", + "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==0.44.0" + "version": "==0.45.1" }, "wrapt": { "hashes": [ - "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc", - "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81", - "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09", - "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e", - "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca", - "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0", - "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb", - "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487", - "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40", - "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c", - "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060", - "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202", - "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41", - "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9", - "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b", - "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664", - "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d", - "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362", - "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00", - "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc", - "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1", - "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267", - "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956", - "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966", - "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1", - "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228", - "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72", - "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d", - "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292", - "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0", - "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0", - "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36", - "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c", - "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5", - "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f", - "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73", - "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b", - "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2", - "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593", - "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39", - "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389", - "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf", - "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf", - "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89", - "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c", - "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c", - "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f", - "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440", - "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465", - "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136", - "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b", - "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8", - "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3", - "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8", - "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6", - "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e", - "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f", - "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c", - "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e", - "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8", - "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2", - "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020", - "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35", - "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d", - "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3", - "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537", - "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809", - "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d", - "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a", - "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4" - ], - "markers": "python_version >= '3.6'", - "version": "==1.16.0" + "sha256:0229b247b0fc7dee0d36176cbb79dbaf2a9eb7ecc50ec3121f40ef443155fb1d", + "sha256:0698d3a86f68abc894d537887b9bbf84d29bcfbc759e23f4644be27acf6da301", + "sha256:0a0a1a1ec28b641f2a3a2c35cbe86c00051c04fffcfcc577ffcdd707df3f8635", + "sha256:0b48554952f0f387984da81ccfa73b62e52817a4386d070c75e4db7d43a28c4a", + "sha256:0f2a28eb35cf99d5f5bd12f5dd44a0f41d206db226535b37b0c60e9da162c3ed", + "sha256:140ea00c87fafc42739bd74a94a5a9003f8e72c27c47cd4f61d8e05e6dec8721", + "sha256:16187aa2317c731170a88ef35e8937ae0f533c402872c1ee5e6d079fcf320801", + "sha256:17fcf043d0b4724858f25b8826c36e08f9fb2e475410bece0ec44a22d533da9b", + "sha256:18b956061b8db634120b58f668592a772e87e2e78bc1f6a906cfcaa0cc7991c1", + "sha256:2399408ac33ffd5b200480ee858baa58d77dd30e0dd0cab6a8a9547135f30a88", + "sha256:2a0c23b8319848426f305f9cb0c98a6e32ee68a36264f45948ccf8e7d2b941f8", + "sha256:2dfb7cff84e72e7bf975b06b4989477873dcf160b2fd89959c629535df53d4e0", + "sha256:2f495b6754358979379f84534f8dd7a43ff8cff2558dcdea4a148a6e713a758f", + "sha256:33539c6f5b96cf0b1105a0ff4cf5db9332e773bb521cc804a90e58dc49b10578", + "sha256:3c34f6896a01b84bab196f7119770fd8466c8ae3dfa73c59c0bb281e7b588ce7", + "sha256:498fec8da10e3e62edd1e7368f4b24aa362ac0ad931e678332d1b209aec93045", + "sha256:4d63f4d446e10ad19ed01188d6c1e1bb134cde8c18b0aa2acfd973d41fcc5ada", + "sha256:4e4b4385363de9052dac1a67bfb535c376f3d19c238b5f36bddc95efae15e12d", + "sha256:4e547b447073fc0dbfcbff15154c1be8823d10dab4ad401bdb1575e3fdedff1b", + "sha256:4f643df3d4419ea3f856c5c3f40fec1d65ea2e89ec812c83f7767c8730f9827a", + "sha256:4f763a29ee6a20c529496a20a7bcb16a73de27f5da6a843249c7047daf135977", + "sha256:5ae271862b2142f4bc687bdbfcc942e2473a89999a54231aa1c2c676e28f29ea", + "sha256:5d8fd17635b262448ab8f99230fe4dac991af1dabdbb92f7a70a6afac8a7e346", + "sha256:69c40d4655e078ede067a7095544bcec5a963566e17503e75a3a3e0fe2803b13", + "sha256:69d093792dc34a9c4c8a70e4973a3361c7a7578e9cd86961b2bbf38ca71e4e22", + "sha256:6a9653131bda68a1f029c52157fd81e11f07d485df55410401f745007bd6d339", + "sha256:6ff02a91c4fc9b6a94e1c9c20f62ea06a7e375f42fe57587f004d1078ac86ca9", + "sha256:714c12485aa52efbc0fc0ade1e9ab3a70343db82627f90f2ecbc898fdf0bb181", + "sha256:7264cbb4a18dc4acfd73b63e4bcfec9c9802614572025bdd44d0721983fc1d9c", + "sha256:73a96fd11d2b2e77d623a7f26e004cc31f131a365add1ce1ce9a19e55a1eef90", + "sha256:74bf625b1b4caaa7bad51d9003f8b07a468a704e0644a700e936c357c17dd45a", + "sha256:81b1289e99cf4bad07c23393ab447e5e96db0ab50974a280f7954b071d41b489", + "sha256:8425cfce27b8b20c9b89d77fb50e368d8306a90bf2b6eef2cdf5cd5083adf83f", + "sha256:875d240fdbdbe9e11f9831901fb8719da0bd4e6131f83aa9f69b96d18fae7504", + "sha256:879591c2b5ab0a7184258274c42a126b74a2c3d5a329df16d69f9cee07bba6ea", + "sha256:89fc28495896097622c3fc238915c79365dd0ede02f9a82ce436b13bd0ab7569", + "sha256:8a5e7cc39a45fc430af1aefc4d77ee6bad72c5bcdb1322cfde852c15192b8bd4", + "sha256:8f8909cdb9f1b237786c09a810e24ee5e15ef17019f7cecb207ce205b9b5fcce", + "sha256:914f66f3b6fc7b915d46c1cc424bc2441841083de01b90f9e81109c9759e43ab", + "sha256:92a3d214d5e53cb1db8b015f30d544bc9d3f7179a05feb8f16df713cecc2620a", + "sha256:948a9bd0fb2c5120457b07e59c8d7210cbc8703243225dbd78f4dfc13c8d2d1f", + "sha256:9c900108df470060174108012de06d45f514aa4ec21a191e7ab42988ff42a86c", + "sha256:9f2939cd4a2a52ca32bc0b359015718472d7f6de870760342e7ba295be9ebaf9", + "sha256:a4192b45dff127c7d69b3bdfb4d3e47b64179a0b9900b6351859f3001397dabf", + "sha256:a8fc931382e56627ec4acb01e09ce66e5c03c384ca52606111cee50d931a342d", + "sha256:ad47b095f0bdc5585bced35bd088cbfe4177236c7df9984b3cc46b391cc60627", + "sha256:b1ca5f060e205f72bec57faae5bd817a1560fcfc4af03f414b08fa29106b7e2d", + "sha256:ba1739fb38441a27a676f4de4123d3e858e494fac05868b7a281c0a383c098f4", + "sha256:baa7ef4e0886a6f482e00d1d5bcd37c201b383f1d314643dfb0367169f94f04c", + "sha256:bb90765dd91aed05b53cd7a87bd7f5c188fcd95960914bae0d32c5e7f899719d", + "sha256:bc7f729a72b16ee21795a943f85c6244971724819819a41ddbaeb691b2dd85ad", + "sha256:bdf62d25234290db1837875d4dceb2151e4ea7f9fff2ed41c0fde23ed542eb5b", + "sha256:c30970bdee1cad6a8da2044febd824ef6dc4cc0b19e39af3085c763fdec7de33", + "sha256:d2c63b93548eda58abf5188e505ffed0229bf675f7c3090f8e36ad55b8cbc371", + "sha256:d751300b94e35b6016d4b1e7d0e7bbc3b5e1751e2405ef908316c2a9024008a1", + "sha256:da427d311782324a376cacb47c1a4adc43f99fd9d996ffc1b3e8529c4074d393", + "sha256:daba396199399ccabafbfc509037ac635a6bc18510ad1add8fd16d4739cdd106", + "sha256:e185ec6060e301a7e5f8461c86fb3640a7beb1a0f0208ffde7a65ec4074931df", + "sha256:e4a557d97f12813dc5e18dad9fa765ae44ddd56a672bb5de4825527c847d6379", + "sha256:e5ed16d95fd142e9c72b6c10b06514ad30e846a0d0917ab406186541fe68b451", + "sha256:e711fc1acc7468463bc084d1b68561e40d1eaa135d8c509a65dd534403d83d7b", + "sha256:f28b29dc158ca5d6ac396c8e0a2ef45c4e97bb7e65522bfc04c989e6fe814575", + "sha256:f335579a1b485c834849e9075191c9898e0731af45705c2ebf70e0cd5d58beed", + "sha256:fce6fee67c318fdfb7f285c29a82d84782ae2579c0e1b385b7f36c6e8074fffb", + "sha256:fd136bb85f4568fffca995bd3c8d52080b1e5b225dbf1c2b17b66b4c5fa02838" + ], + "markers": "python_version >= '3.8'", + "version": "==1.17.0" }, "yabs": { "hashes": [ @@ -2094,14 +2121,6 @@ ], "index": "pypi", "version": "==0.6.1" - }, - "zipp": { - "hashes": [ - "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350", - "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29" - ], - "markers": "python_version >= '3.8'", - "version": "==3.20.2" } } } diff --git a/docs/jupyter/tutorial.ipynb b/docs/jupyter/tutorial.ipynb new file mode 100644 index 0000000..390428c --- /dev/null +++ b/docs/jupyter/tutorial.ipynb @@ -0,0 +1,310 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Nutree Tutorial" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Nutree organizes arbitrary object instances in an unobtrusive way.
\n", + "That means, we can add existing objects without havin to derrive from a common \n", + "base class or having them implement a specific protocol." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Setup some sample classes and objects" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "import uuid\n", + "\n", + "\n", + "class Department:\n", + " def __init__(self, name: str):\n", + " self.guid = uuid.uuid4()\n", + " self.name = name\n", + "\n", + " def __str__(self):\n", + " return f\"Department<{self.name}>\"\n", + "\n", + "\n", + "class Person:\n", + " def __init__(self, name: str, age: int):\n", + " self.guid = uuid.uuid4()\n", + " self.name = name\n", + " self.age = age\n", + "\n", + " def __str__(self):\n", + " return f\"Person<{self.name} ({self.age})>\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now create some instances" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "development_dep = Department(\"Development\")\n", + "test__dep = Department(\"Test\")\n", + "marketing_dep = Department(\"Marketing\")\n", + "\n", + "alice = Person(\"Alice\", 25)\n", + "bob = Person(\"Bob\", 35)\n", + "claire = Person(\"Claire\", 45)\n", + "dave = Person(\"Dave\", 55)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's organize these objects in a hierarchical structure:" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tree<'Organization'>\n", + "├── <__main__.Department object at 0x111f04e00>\n", + "│ ├── <__main__.Department object at 0x111b89f70>\n", + "│ │ ╰── <__main__.Person object at 0x111f05520>\n", + "│ ╰── <__main__.Person object at 0x111f04da0>\n", + "├── <__main__.Department object at 0x111edac90>\n", + "│ ╰── <__main__.Person object at 0x111f06a50>\n", + "╰── <__main__.Person object at 0x111ed9880>\n" + ] + } + ], + "source": [ + "from nutree import Tree\n", + "\n", + "tree = Tree(\"Organization\")\n", + "\n", + "dev_node = tree.add(development_dep)\n", + "test_node = dev_node.add(test__dep)\n", + "mkt_node = tree.add(marketing_dep)\n", + "\n", + "tree.add(alice)\n", + "dev_node.add(bob)\n", + "test_node.add(claire)\n", + "mkt_node.add(dave)\n", + "\n", + "tree.print()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Tree nodes store a reference to the object in the `node.data` attribute.\n", + "\n", + "The nodes are formatted by the object's `__repr__` implementation by default.
\n", + "We can overide ths by passing an f-string as `repr` argument:" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tree<'Organization'>\n", + "├── Department\n", + "│ ├── Department\n", + "│ │ ╰── Person\n", + "│ ╰── Person\n", + "├── Department\n", + "│ ╰── Person\n", + "╰── Person\n" + ] + } + ], + "source": [ + "tree.print(repr=\"{node.data}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Iteration and Searching" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Mutation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Data IDs and Clones" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Node<'Department', data_id=287245536>\n", + "├── Node<'Department', data_id=287017463>\n", + "│ ╰── Node<'Person', data_id=287245650>\n", + "╰── Node<'Person', data_id=287245530>\n", + "Node<'Department', data_id=287234761>\n", + "╰── Node<'Person', data_id=287245989>\n", + "Node<'Person', data_id=287234440>\n" + ] + } + ], + "source": [ + "tree.print(repr=\"{node}\", title=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Serialization" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'data': 'Department',\n", + " 'children': [{'data': 'Department',\n", + " 'children': [{'data': 'Person'}]},\n", + " {'data': 'Person'}]},\n", + " {'data': 'Department',\n", + " 'children': [{'data': 'Person'}]},\n", + " {'data': 'Person'}]" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tree.to_dict_list()" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[(0, {}), (1, {}), (2, {}), (1, {}), (0, {}), (5, {}), (0, {})]" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list(tree.to_list_iter())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tree<'4595934048'>\n", + "╰── 'A'\n" + ] + } + ], + "source": [ + "t = Tree._from_list([(0, \"A\")])\n", + "print(t.format())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.6" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/docs/sphinx/ug_benchmarks.md b/docs/sphinx/ug_benchmarks.md new file mode 100644 index 0000000..a06ab23 --- /dev/null +++ b/docs/sphinx/ug_benchmarks.md @@ -0,0 +1,157 @@ +# Benchmarks +## Benchmark Data + +> Client: arm64_16_GB, Darwin_24.1.0 + +| Full Name | Python | Minimum time | maxOPS | OPSrel | Std Dev (σ) | +|:--------------------------------------------------------|:-----------|:---------------|:----------|:----------|:--------------| +| access node.data(node._data (attr)) | 3.10.15 | 29 ns | 34.012 M | 34.012 M | 1 ns | +| access node.data(node._data (attr)) | 3.12.6 | 9 ns | 116.281 M | 116.281 M | 0 ns | +| access node.data(node._data (attr)) | 3.13.0rc3+ | 7 ns | 134.332 M | 134.332 M | 0 ns | +| access node.data(node._data (attr)) | 3.9.20 | 29 ns | 34.911 M | 34.911 M | 1 ns | +| access node.data(node._data (attr)) | 3.11.10 | 22 ns | 44.912 M | 44.912 M | 0 ns | +| access node.data(node.data (property)) | 3.9.20 | 75 ns | 13.334 M | 13.334 M | 0 ns | +| access node.data(node.data (property)) | 3.13.0rc3+ | 49 ns | 20.374 M | 20.374 M | 0 ns | +| access node.data(node.data (property)) | 3.12.6 | 52 ns | 19.222 M | 19.222 M | 0 ns | +| access node.data(node.data (property)) | 3.11.10 | 56 ns | 17.833 M | 17.833 M | 0 ns | +| access node.data(node.data (property)) | 3.10.15 | 79 ns | 12.616 M | 12.616 M | 0 ns | +| iterate(for _ in tree.iterator(): ..., n=8) | 3.10.15 | 2,563 ns | 0.390 M | 3.122 M | 6 ns | +| iterate(for _ in tree.iterator(): ..., n=8) | 3.12.6 | 1,666 ns | 0.600 M | 4.802 M | 53 ns | +| iterate(for _ in tree.iterator(): ..., n=8) | 3.13.0rc3+ | 1,508 ns | 0.663 M | 5.305 M | 6 ns | +| iterate(for _ in tree.iterator(): ..., n=8) | 3.11.10 | 2,138 ns | 0.468 M | 3.741 M | 223 ns | +| iterate(for _ in tree.iterator(): ..., n=8) | 3.9.20 | 2,639 ns | 0.379 M | 3.031 M | 12 ns | +| iterate(for _ in tree.iterator(LEVEL_ORDER): ..., n=8) | 3.13.0rc3+ | 1,222 ns | 0.818 M | 6.545 M | 3 ns | +| iterate(for _ in tree.iterator(LEVEL_ORDER): ..., n=8) | 3.10.15 | 1,908 ns | 0.524 M | 4.192 M | 9 ns | +| iterate(for _ in tree.iterator(LEVEL_ORDER): ..., n=8) | 3.12.6 | 1,309 ns | 0.764 M | 6.110 M | 4 ns | +| iterate(for _ in tree.iterator(LEVEL_ORDER): ..., n=8) | 3.11.10 | 1,552 ns | 0.644 M | 5.154 M | 4 ns | +| iterate(for _ in tree.iterator(LEVEL_ORDER): ..., n=8) | 3.9.20 | 1,776 ns | 0.563 M | 4.504 M | 6 ns | +| iterate(for _ in tree.iterator(POST_ORDER): ..., n=8) | 3.10.15 | 3,134 ns | 0.319 M | 2.553 M | 6 ns | +| iterate(for _ in tree.iterator(POST_ORDER): ..., n=8) | 3.12.6 | 2,292 ns | 0.436 M | 3.491 M | 7 ns | +| iterate(for _ in tree.iterator(POST_ORDER): ..., n=8) | 3.9.20 | 3,201 ns | 0.312 M | 2.500 M | 7 ns | +| iterate(for _ in tree.iterator(POST_ORDER): ..., n=8) | 3.11.10 | 2,667 ns | 0.375 M | 3.000 M | 10 ns | +| iterate(for _ in tree.iterator(POST_ORDER): ..., n=8) | 3.13.0rc3+ | 2,088 ns | 0.479 M | 3.831 M | 87 ns | +| iterate(for _ in tree.iterator(PRE_ORDER): ..., n=8) | 3.10.15 | 2,566 ns | 0.390 M | 3.118 M | 5 ns | +| iterate(for _ in tree.iterator(PRE_ORDER): ..., n=8) | 3.12.6 | 1,690 ns | 0.592 M | 4.735 M | 47 ns | +| iterate(for _ in tree.iterator(PRE_ORDER): ..., n=8) | 3.9.20 | 2,696 ns | 0.371 M | 2.968 M | 93 ns | +| iterate(for _ in tree.iterator(PRE_ORDER): ..., n=8) | 3.11.10 | 2,109 ns | 0.474 M | 3.794 M | 92 ns | +| iterate(for _ in tree.iterator(PRE_ORDER): ..., n=8) | 3.13.0rc3+ | 1,498 ns | 0.668 M | 5.341 M | 7 ns | +| iterate(for _ in tree.iterator(RANDOM_ORDER): ..., n=8) | 3.12.6 | 1,825 ns | 0.548 M | 4.383 M | 43 ns | +| iterate(for _ in tree.iterator(RANDOM_ORDER): ..., n=8) | 3.11.10 | 1,766 ns | 0.566 M | 4.529 M | 46 ns | +| iterate(for _ in tree.iterator(RANDOM_ORDER): ..., n=8) | 3.9.20 | 2,561 ns | 0.390 M | 3.123 M | 96 ns | +| iterate(for _ in tree.iterator(RANDOM_ORDER): ..., n=8) | 3.10.15 | 2,556 ns | 0.391 M | 3.130 M | 12 ns | +| iterate(for _ in tree.iterator(RANDOM_ORDER): ..., n=8) | 3.13.0rc3+ | 1,728 ns | 0.579 M | 4.629 M | 7 ns | +| iterate(for _ in tree.iterator(UNORDERED): ..., n=8) | 3.12.6 | 398 ns | 2.510 M | 20.080 M | 3 ns | +| iterate(for _ in tree.iterator(UNORDERED): ..., n=8) | 3.10.15 | 492 ns | 2.032 M | 16.256 M | 4 ns | +| iterate(for _ in tree.iterator(UNORDERED): ..., n=8) | 3.13.0rc3+ | 336 ns | 2.977 M | 23.819 M | 1 ns | +| iterate(for _ in tree.iterator(UNORDERED): ..., n=8) | 3.11.10 | 394 ns | 2.538 M | 20.301 M | 0 ns | +| iterate(for _ in tree.iterator(UNORDERED): ..., n=8) | 3.9.20 | 491 ns | 2.035 M | 16.283 M | 4 ns | +| iterate(for _ in tree: ..., n=8) | 3.9.20 | 2,652 ns | 0.377 M | 3.017 M | 21 ns | +| iterate(for _ in tree: ..., n=8) | 3.12.6 | 1,687 ns | 0.593 M | 4.741 M | 18 ns | +| iterate(for _ in tree: ..., n=8) | 3.13.0rc3+ | 1,527 ns | 0.655 M | 5.238 M | 107 ns | +| iterate(for _ in tree: ..., n=8) | 3.10.15 | 2,554 ns | 0.392 M | 3.133 M | 233 ns | +| iterate(for _ in tree: ..., n=8) | 3.11.10 | 2,157 ns | 0.464 M | 3.709 M | 4 ns | +| iterate(tree.visit(lambda node, memo: None), n=8) | 3.12.6 | 1,513 ns | 0.661 M | 5.286 M | 38 ns | +| iterate(tree.visit(lambda node, memo: None), n=8) | 3.11.10 | 1,998 ns | 0.501 M | 4.004 M | 7 ns | +| iterate(tree.visit(lambda node, memo: None), n=8) | 3.13.0rc3+ | 1,383 ns | 0.723 M | 5.785 M | 42 ns | +| iterate(tree.visit(lambda node, memo: None), n=8) | 3.10.15 | 2,595 ns | 0.385 M | 3.083 M | 88 ns | +| iterate(tree.visit(lambda node, memo: None), n=8) | 3.9.20 | 2,532 ns | 0.395 M | 3.159 M | 85 ns | +| search(by index, n=8) | 3.13.0rc3+ | 348 ns | 2.875 M | 23.004 M | 30 ns | +| search(by index, n=8) | 3.12.6 | 342 ns | 2.922 M | 23.375 M | 30 ns | +| search(by index, n=8) | 3.9.20 | 516 ns | 1.937 M | 15.497 M | 48 ns | +| search(by index, n=8) | 3.11.10 | 287 ns | 3.480 M | 27.839 M | 27 ns | +| search(by index, n=8) | 3.10.15 | 487 ns | 2.052 M | 16.415 M | 31 ns | +| search(find(), n=8) | 3.9.20 | 274 ns | 3.647 M | 29.175 M | 1 ns | +| search(find(), n=8) | 3.13.0rc3+ | 148 ns | 6.766 M | 54.127 M | 7 ns | +| search(find(), n=8) | 3.10.15 | 247 ns | 4.053 M | 32.422 M | 15 ns | +| search(find(), n=8) | 3.11.10 | 145 ns | 6.912 M | 55.299 M | 8 ns | +| search(find(), n=8) | 3.12.6 | 151 ns | 6.632 M | 53.056 M | 8 ns | +| search(find_all(), n=8) | 3.9.20 | 267 ns | 3.748 M | 29.980 M | 10 ns | +| search(find_all(), n=8) | 3.11.10 | 141 ns | 7.104 M | 56.832 M | 5 ns | +| search(find_all(), n=8) | 3.12.6 | 156 ns | 6.392 M | 51.134 M | 5 ns | +| search(find_all(), n=8) | 3.10.15 | 240 ns | 4.160 M | 33.278 M | 12 ns | +| search(find_all(), n=8) | 3.13.0rc3+ | 148 ns | 6.768 M | 54.147 M | 6 ns | +| serialize_load(ZIP_BZIP2 ('.bz2')) | 3.11.10 | 163 ms | 6.129 | 6.129 | 0 ms | +| serialize_load(ZIP_BZIP2 ('.bz2')) | 3.12.6 | 165 ms | 6.055 | 6.055 | 0 ms | +| serialize_load(ZIP_BZIP2 ('.bz2')) | 3.10.15 | 208 ms | 4.808 | 4.808 | 0 ms | +| serialize_load(ZIP_BZIP2 ('.bz2')) | 3.9.20 | 240 ms | 4.168 | 4.168 | 0 ms | +| serialize_load(ZIP_BZIP2 ('.bz2')) | 3.13.0rc3+ | 175 ms | 5.722 | 5.722 | 0 ms | +| serialize_load(ZIP_DEFLATED ('.zip')) | 3.11.10 | 148 ms | 6.756 | 6.756 | 0 ms | +| serialize_load(ZIP_DEFLATED ('.zip')) | 3.13.0rc3+ | 159 ms | 6.294 | 6.294 | 0 ms | +| serialize_load(ZIP_DEFLATED ('.zip')) | 3.12.6 | 164 ms | 6.102 | 6.102 | 0 ms | +| serialize_load(ZIP_DEFLATED ('.zip')) | 3.10.15 | 210 ms | 4.770 | 4.770 | 0 ms | +| serialize_load(ZIP_DEFLATED ('.zip')) | 3.9.20 | 209 ms | 4.785 | 4.785 | 0 ms | +| serialize_load(ZIP_LZMA ('.lzma')) | 3.10.15 | 208 ms | 4.805 | 4.805 | 0 ms | +| serialize_load(ZIP_LZMA ('.lzma')) | 3.9.20 | 204 ms | 4.907 | 4.907 | 0 ms | +| serialize_load(ZIP_LZMA ('.lzma')) | 3.13.0rc3+ | 156 ms | 6.424 | 6.424 | 0 ms | +| serialize_load(ZIP_LZMA ('.lzma')) | 3.11.10 | 162 ms | 6.187 | 6.187 | 0 ms | +| serialize_load(ZIP_LZMA ('.lzma')) | 3.12.6 | 167 ms | 5.975 | 5.975 | 0 ms | +| serialize_load(uncompressed ('.json')) | 3.13.0rc3+ | 149 ms | 6.709 | 6.709 | 0 ms | +| serialize_load(uncompressed ('.json')) | 3.9.20 | 203 ms | 4.926 | 4.926 | 0 ms | +| serialize_load(uncompressed ('.json')) | 3.12.6 | 171 ms | 5.848 | 5.848 | 0 ms | +| serialize_load(uncompressed ('.json')) | 3.11.10 | 145 ms | 6.902 | 6.902 | 0 ms | +| serialize_load(uncompressed ('.json')) | 3.10.15 | 200 ms | 4.990 | 4.990 | 0 ms | +| serialize_save(ZIP_BZIP2 ('.bz2')) | 3.12.6 | 325 ms | 3.081 | 3.081 | 0 ms | +| serialize_save(ZIP_BZIP2 ('.bz2')) | 3.11.10 | 320 ms | 3.125 | 3.125 | 0 ms | +| serialize_save(ZIP_BZIP2 ('.bz2')) | 3.13.0rc3+ | 281 ms | 3.558 | 3.558 | 0 ms | +| serialize_save(ZIP_BZIP2 ('.bz2')) | 3.10.15 | 378 ms | 2.649 | 2.649 | 0 ms | +| serialize_save(ZIP_BZIP2 ('.bz2')) | 3.9.20 | 353 ms | 2.835 | 2.835 | 0 ms | +| serialize_save(ZIP_DEFLATED ('.zip')) | 3.11.10 | 286 ms | 3.498 | 3.498 | 0 ms | +| serialize_save(ZIP_DEFLATED ('.zip')) | 3.13.0rc3+ | 244 ms | 4.091 | 4.091 | 0 ms | +| serialize_save(ZIP_DEFLATED ('.zip')) | 3.12.6 | 268 ms | 3.738 | 3.738 | 0 ms | +| serialize_save(ZIP_DEFLATED ('.zip')) | 3.9.20 | 333 ms | 3.000 | 3.000 | 0 ms | +| serialize_save(ZIP_DEFLATED ('.zip')) | 3.10.15 | 344 ms | 2.907 | 2.907 | 0 ms | +| serialize_save(ZIP_LZMA ('.lzma')) | 3.13.0rc3+ | 568 ms | 1.762 | 1.762 | 0 ms | +| serialize_save(ZIP_LZMA ('.lzma')) | 3.10.15 | 660 ms | 1.515 | 1.515 | 0 ms | +| serialize_save(ZIP_LZMA ('.lzma')) | 3.9.20 | 626 ms | 1.597 | 1.597 | 0 ms | +| serialize_save(ZIP_LZMA ('.lzma')) | 3.12.6 | 566 ms | 1.766 | 1.766 | 0 ms | +| serialize_save(ZIP_LZMA ('.lzma')) | 3.11.10 | 593 ms | 1.685 | 1.685 | 0 ms | +| serialize_save(uncompressed ('.json')) | 3.10.15 | 305 ms | 3.274 | 3.274 | 0 ms | +| serialize_save(uncompressed ('.json')) | 3.11.10 | 272 ms | 3.671 | 3.671 | 0 ms | +| serialize_save(uncompressed ('.json')) | 3.12.6 | 230 ms | 4.352 | 4.352 | 0 ms | +| serialize_save(uncompressed ('.json')) | 3.13.0rc3+ | 215 ms | 4.660 | 4.660 | 0 ms | +| serialize_save(uncompressed ('.json')) | 3.9.20 | 293 ms | 3.410 | 3.410 | 0 ms | + +Benchmark date: 2024-12-27T21:32:29.559992+00:00 +Fixed dataset values: client='61bdee7c56e0e5f7', debug_mode=False, hardware='arm64_16_GB', project='nutree', system='Darwin_24.1.0', tag='latest', version='0.11.2a1'. +Variant dataset values: name, python, sample_size, variant. +Showing 105 rows. +Sort order: full_name. + + + +## Ops by python + +> Client: arm64_16_GB, Darwin_24.1.0 + +| Name | Variant | 3.9.20 | 3.10.15 | 3.11.10 | 3.12.6 | 3.13.0rc3+ | +|:-----------------|:------------------------------------------|:---------|:----------|:----------|:----------|:-------------| +| access node.data | node._data (attr) | 34.911 M | 34.012 M | 44.912 M | 116.281 M | 134.332 M | +| access node.data | node.data (property) | 13.334 M | 12.616 M | 17.833 M | 19.222 M | 20.374 M | +| iterate | for _ in tree: ... | 0.377 M | 0.392 M | 0.464 M | 0.593 M | 0.655 M | +| iterate | for _ in tree.iterator(UNORDERED): ... | 2.035 M | 2.032 M | 2.538 M | 2.510 M | 2.977 M | +| iterate | for _ in tree.iterator(POST_ORDER): ... | 0.312 M | 0.319 M | 0.375 M | 0.436 M | 0.479 M | +| iterate | for _ in tree.iterator(RANDOM_ORDER): ... | 0.390 M | 0.391 M | 0.566 M | 0.548 M | 0.579 M | +| iterate | tree.visit(lambda node, memo: None) | 0.395 M | 0.385 M | 0.501 M | 0.661 M | 0.723 M | +| iterate | for _ in tree.iterator(LEVEL_ORDER): ... | 0.563 M | 0.524 M | 0.644 M | 0.764 M | 0.818 M | +| iterate | for _ in tree.iterator(PRE_ORDER): ... | 0.371 M | 0.390 M | 0.474 M | 0.592 M | 0.668 M | +| iterate | for _ in tree.iterator(): ... | 0.379 M | 0.390 M | 0.468 M | 0.600 M | 0.663 M | +| search | find_all() | 3.748 M | 4.160 M | 7.104 M | 6.392 M | 6.768 M | +| search | find() | 3.647 M | 4.053 M | 6.912 M | 6.632 M | 6.766 M | +| search | by index | 1.937 M | 2.052 M | 3.480 M | 2.922 M | 2.875 M | +| serialize_load | ZIP_LZMA ('.lzma') | 4.907 | 4.805 | 6.187 | 5.975 | 6.424 | +| serialize_load | uncompressed ('.json') | 4.926 | 4.990 | 6.902 | 5.848 | 6.709 | +| serialize_load | ZIP_DEFLATED ('.zip') | 4.785 | 4.770 | 6.756 | 6.102 | 6.294 | +| serialize_load | ZIP_BZIP2 ('.bz2') | 4.168 | 4.808 | 6.129 | 6.055 | 5.722 | +| serialize_save | ZIP_BZIP2 ('.bz2') | 2.835 | 2.649 | 3.125 | 3.081 | 3.558 | +| serialize_save | ZIP_DEFLATED ('.zip') | 3.000 | 2.907 | 3.498 | 3.738 | 4.091 | +| serialize_save | uncompressed ('.json') | 3.410 | 3.274 | 3.671 | 4.352 | 4.660 | +| serialize_save | ZIP_LZMA ('.lzma') | 1.597 | 1.515 | 1.685 | 1.766 | 1.762 | + +Benchmark date: 2024-12-27T21:32:29.559992+00:00 +Fixed dataset values: client='61bdee7c56e0e5f7', debug_mode=False, hardware='arm64_16_GB', project='nutree', system='Darwin_24.1.0', tag='latest', version='0.11.2a1'. +Variant dataset values: name, python, sample_size, variant. +: Showing 21 of 105 rows. +Sort order: name. + + + diff --git a/docs/sphinx/user_guide.rst b/docs/sphinx/user_guide.rst index fbf1e3f..c285047 100644 --- a/docs/sphinx/user_guide.rst +++ b/docs/sphinx/user_guide.rst @@ -26,3 +26,4 @@ capabilities of the library, if you haven't already. ug_graphs ug_randomize ug_advanced + ug_benchmarks.md diff --git a/nutree/common.py b/nutree/common.py index cc65229..42ac785 100644 --- a/nutree/common.py +++ b/nutree/common.py @@ -13,6 +13,7 @@ import sys import warnings import zipfile +from collections.abc import Iterator from contextlib import contextmanager from enum import Enum from pathlib import Path @@ -21,11 +22,7 @@ TYPE_CHECKING, Any, Callable, - Dict, - Iterator, - List, Literal, - Type, Union, ) @@ -129,17 +126,17 @@ def __init__(self, value=None): ReprArgType = Union[str, Callable[["Node"], str]] #: A dict of scalar values -FlatJsonDictType = Dict[str, Union[str, int, float, bool, None]] +FlatJsonDictType = dict[str, Union[str, int, float, bool, None]] #: Type of ``tree.save(..., key_map)`` -KeyMapType = Dict[str, str] +KeyMapType = dict[str, str] #: Type of ``tree.save(..., value_map)`` #: E.g. `{'t': ['person', 'dept']}` -ValueMapType = Dict[str, List[str]] +ValueMapType = dict[str, list[str]] #: E.g. `{'t': {'person': 0, 'dept': 1}}` -ValueDictMapType = Dict[str, Dict[str, int]] +ValueDictMapType = dict[str, dict[str, int]] #: Generic callback for `tree.to_dot()`, ... MapperCallbackType = Callable[["Node", dict], Union[None, Any]] @@ -152,7 +149,7 @@ def __init__(self, value=None): #: Generic callback for `tree.filter()`, `tree.copy()`, ... PredicateCallbackType = Callable[ - ["Node"], Union[None, bool, IterationControl, Type[IterationControl]] + ["Node"], Union[None, bool, IterationControl, type[IterationControl]] ] #: @@ -166,9 +163,9 @@ def __init__(self, value=None): bool, SkipBranch, StopTraversal, - Type[SkipBranch], - Type[StopTraversal], - Type[StopIteration], + type[SkipBranch], + type[StopTraversal], + type[StopIteration], ], ] #: Callback for `tree.sort(key=...)` diff --git a/nutree/dot.py b/nutree/dot.py index 7c0dc9a..c2b678d 100644 --- a/nutree/dot.py +++ b/nutree/dot.py @@ -7,8 +7,9 @@ from __future__ import annotations +from collections.abc import Iterator from pathlib import Path -from typing import IO, TYPE_CHECKING, Any, Iterator +from typing import IO, TYPE_CHECKING, Any from nutree.common import MapperCallbackType, call_mapper diff --git a/nutree/mermaid.py b/nutree/mermaid.py index 5d8d78b..b53695a 100644 --- a/nutree/mermaid.py +++ b/nutree/mermaid.py @@ -9,9 +9,10 @@ from __future__ import annotations import io +from collections.abc import Iterable, Iterator from pathlib import Path from subprocess import CalledProcessError, check_output -from typing import IO, TYPE_CHECKING, Callable, Iterable, Iterator, Literal +from typing import IO, TYPE_CHECKING, Callable, Literal from nutree.common import DataIdType diff --git a/nutree/node.py b/nutree/node.py index c83681c..07fbfd5 100644 --- a/nutree/node.py +++ b/nutree/node.py @@ -13,6 +13,7 @@ from __future__ import annotations import re +from collections.abc import Iterable, Iterator from operator import attrgetter from pathlib import Path from typing import ( @@ -20,8 +21,6 @@ TYPE_CHECKING, Any, Generic, - Iterable, - Iterator, cast, ) diff --git a/nutree/tree.py b/nutree/tree.py index 0eef9d8..2945fae 100644 --- a/nutree/tree.py +++ b/nutree/tree.py @@ -15,15 +15,13 @@ import json import random import threading +from collections.abc import Iterable, Iterator from pathlib import Path from typing import ( IO, Any, Generic, - Iterable, - Iterator, Literal, - Type, Union, cast, ) @@ -111,7 +109,7 @@ class Tree(Generic[TData, TNode]): **Note:** Use with care, see also :ref:`forward-attributes`. """ - node_factory: Type[TNode] = cast(Type[TNode], Node) + node_factory: type[TNode] = cast(type[TNode], Node) root_node_factory = _SystemRootNode #: Default connector prefixes ``format(style=...)`` argument. diff --git a/nutree/tree_generator.py b/nutree/tree_generator.py index 9aece65..73748c0 100644 --- a/nutree/tree_generator.py +++ b/nutree/tree_generator.py @@ -9,8 +9,9 @@ import random import sys from abc import ABC, abstractmethod +from collections.abc import Sequence from datetime import date, datetime, timedelta, timezone -from typing import Any, Sequence, Union +from typing import Any, Union from nutree.common import DictWrapper from nutree.node import Node diff --git a/nutree/typed_tree.py b/nutree/typed_tree.py index 6581f56..8925bf9 100644 --- a/nutree/typed_tree.py +++ b/nutree/typed_tree.py @@ -15,8 +15,9 @@ from __future__ import annotations from collections import Counter +from collections.abc import Iterator from pathlib import Path -from typing import IO, Iterator, Type, cast, final +from typing import IO, cast, final # typing.Self requires Python 3.11 from typing_extensions import Any, Self @@ -100,7 +101,7 @@ def __repr__(self) -> str: def kind(self) -> str: return self._kind - def get_children(self, kind: str | Type[ANY_KIND]) -> list[Self]: + def get_children(self, kind: str | type[ANY_KIND]) -> list[Self]: """Return list of direct child nodes of a given type (list may be empty).""" all_children = self._children if not all_children: @@ -109,7 +110,7 @@ def get_children(self, kind: str | Type[ANY_KIND]) -> list[Self]: return all_children return list(filter(lambda n: n._kind == kind, all_children)) - def first_child(self, kind: str | Type[ANY_KIND]) -> Self | None: + def first_child(self, kind: str | type[ANY_KIND]) -> Self | None: """First direct child node or None if no children exist.""" all_children = self._children if not all_children: @@ -122,7 +123,7 @@ def first_child(self, kind: str | Type[ANY_KIND]) -> Self | None: return n return None - def last_child(self, kind: str | Type[ANY_KIND]) -> Self | None: + def last_child(self, kind: str | type[ANY_KIND]) -> Self | None: """Last direct child node or None if no children exist.""" all_children = self._children if not all_children: @@ -136,7 +137,7 @@ def last_child(self, kind: str | Type[ANY_KIND]) -> Self | None: return n return None - def has_children(self, kind: str | Type[ANY_KIND]) -> bool: + def has_children(self, kind: str | type[ANY_KIND]) -> bool: """Return true if this node has one or more children.""" if kind is ANY_KIND: return bool(self._children) @@ -283,7 +284,7 @@ def add_child( source_node: Self = None # type: ignore new_node: Self = None # type: ignore - factory: Type[Self] = self._tree.node_factory # type: ignore + factory: type[Self] = self._tree.node_factory # type: ignore if isinstance(child, TypedNode): if deep is None: @@ -620,15 +621,15 @@ def add( node_id=node_id, ) - def first_child(self, kind: str | Type[ANY_KIND]) -> TypedNode[TData] | None: + def first_child(self, kind: str | type[ANY_KIND]) -> TypedNode[TData] | None: """Return the first toplevel node.""" return self.system_root.first_child(kind=kind) - def last_child(self, kind: str | Type[ANY_KIND]) -> TypedNode[TData] | None: + def last_child(self, kind: str | type[ANY_KIND]) -> TypedNode[TData] | None: """Return the last toplevel node.""" return self.system_root.last_child(kind=kind) - def iter_by_type(self, kind: str | Type[ANY_KIND]) -> Iterator[TypedNode[TData]]: + def iter_by_type(self, kind: str | type[ANY_KIND]) -> Iterator[TypedNode[TData]]: if kind == ANY_KIND: yield from self.iterator() for n in self.iterator(): diff --git a/pyproject.toml b/pyproject.toml index 5f48ed3..f2d9d03 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ # --- Ruff Settings ------------------------------------------------------------ [tool.ruff] -target-version = "py38" +target-version = "py39" src = ["nutree", "tests"] [tool.ruff.lint] @@ -68,6 +68,12 @@ ignore_missing_imports = true addopts = "-ra -q --cov=nutree" # addopts = "--cov=nutree --cov-report=html --cov-report=term-missing" +markers = [ + "benchmarks: include slow benchmarks (enable with '-m benchmarks')", + # "slow: marks tests as slow (deselect with '-m \"not slow\"')", + # "serial", +] + [tool.coverage.run] # branch = true omit = [ @@ -97,6 +103,7 @@ exclude_also = [ # "\\A(?s:.*# pragma: exclude file.*)\\Z", "\\A(?s:.*# pragma: exclude-file-from-coverage.*)\\Z", ] + [tool.coverage.html] directory = "build/coverage" diff --git a/setup.cfg b/setup.cfg index 7589387..4aaf247 100644 --- a/setup.cfg +++ b/setup.cfg @@ -15,7 +15,8 @@ # "options": {}, [metadata] -# name = nutree # GitHub dependants needs it in setup.py? +# GitHub dependants needs name in setup.py? +name = nutree version = attr: nutree.__version__ author = Martin Wendt author_email = nutree@wwwendt.de diff --git a/setup.py b/setup.py index 6ac3a21..17654c9 100644 --- a/setup.py +++ b/setup.py @@ -2,6 +2,6 @@ from setuptools import setup setup( - name="nutree", # GitHub dependants needs it in setup.py? + # name="nutree", # GitHub dependants needs it in setup.py? # See setup.cfg ) diff --git a/tests/conftest.py b/tests/conftest.py index 626deb2..8e92e48 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,3 +1,12 @@ # see also pytest.ini +import pytest +from benchman import BenchmarkManager + + def pytest_addoption(parser): parser.addoption("--benchmarks", action="store_true") + + +@pytest.fixture(scope="session") +def benchman() -> BenchmarkManager: + return BenchmarkManager.singleton() diff --git a/tests/fixture.py b/tests/fixture.py index 3ef055c..d347df9 100644 --- a/tests/fixture.py +++ b/tests/fixture.py @@ -15,7 +15,7 @@ import uuid from random import randint from textwrap import dedent, indent -from typing import IO, Any, List +from typing import IO, Any from nutree.common import ReprArgType from nutree.tree import Node, Tree @@ -233,7 +233,7 @@ def create_typed_tree_simple( return tree -def generate_tree(level_defs: List[int]) -> Tree: +def generate_tree(level_defs: list[int]) -> Tree: """Generate a tree. Example: diff --git a/tests/pytest.ini b/tests/pytest.ini index aa0702b..d2ffdcb 100644 --- a/tests/pytest.ini +++ b/tests/pytest.ini @@ -10,9 +10,9 @@ junit_family = legacy # minversion = 6.0 # addopts = -ra -q -markers = - benchmarks: include slow benchmarks (enable with '-m benchmarks') - # slow: marks tests as slow (deselect with '-m "not slow"') - # serial +; markers = +; benchmarks: include slow benchmarks (enable with '-m benchmarks') +; # slow: marks tests as slow (deselect with '-m "not slow"') +; # serial \ No newline at end of file diff --git a/tests/test_bench.py b/tests/test_bench.py index ff19140..38911cc 100644 --- a/tests/test_bench.py +++ b/tests/test_bench.py @@ -5,7 +5,6 @@ # ruff: noqa: E501 Line too long import sys -from pathlib import Path import pytest from nutree import IterMethod @@ -20,147 +19,113 @@ @benchmark class TestBenchmarks: - def test_bench_index(self, capsys): + def test_bench_index(self, benchman, capsys): """ """ - results = ["Benchmark results"] - tree = fixture.create_tree_simple() - - results.append( - fixture.run_timings( - "access tree[key]", - """\ - _ = tree["a1"] - """, - globals=locals(), - time_unit="nsec", - ) + tree = fixture.create_tree_simple(print=False) + bmr = benchman.make_runner( + name="search", + sample_size=len(tree), + globals=locals(), ) - results.append( - fixture.run_timings( - "tree.find()", - """\ - _ = tree.find("a1") - """, - globals=locals(), - ) + bmr.run( + variant="by index", + stmt="""\ + _ = tree["a1"] + """, ) - - results.append( - fixture.run_timings( - "tree.find_all()", - """\ - _ = tree.find_all("a1") - """, - globals=locals(), - ) + bmr.run( + variant="find() ", + stmt="""\ + _ = tree.find("a1") + """, + ) + bmr.run( + variant="find_all() ", + stmt="""\ + _ = tree.find_all("a1") + """, ) with capsys.disabled(): - print("\n - ".join(results)) + bmr.print() - def test_bench_properties(self, capsys): + def test_bench_properties(self, benchman, capsys): """ """ - - results = ["Benchmark results"] tree = fixture.create_tree_simple() node = tree.first_child() + bmr = benchman.make_runner( + name="access node.data", + globals=locals(), + ) - results.append( - fixture.run_timings( - "access node.data (property)", - """\ - _ = node.data - """, - globals=locals(), - ) + bmr.run( + variant="node.data (property)", + stmt="""\ + _ = node.data + """, ) - results.append( - fixture.run_timings( - "access node._data (attribute)", - """\ - _ = node._data - """, - globals=locals(), - ) + bmr.run( + variant="node._data (attr)", + stmt="""\ + _ = node._data + """, ) with capsys.disabled(): - print("\n - ".join(results)) + bmr.print() - def test_bench_iter(self, capsys): + def test_bench_iter(self, benchman, capsys): """ """ - - results = ["Benchmark results"] tree = fixture.create_tree_simple() node = tree.first_child() - - results.append( - fixture.run_timings( - "for _ in tree: ...", - """\ - for _ in tree: pass - """, - globals=locals(), - ) + size = len(tree) + bmr = benchman.make_runner( + name="iterate", + sample_size=len(tree), + globals=locals(), ) - results.append( - fixture.run_timings( - "for _ in tree.iterator(): ...", - """\ - for _ in tree.iterator(): pass - """, - globals=locals(), - ) + bmr.run( + variant="for _ in tree: ...", + stmt="""\ + for _ in tree: pass + """, ) - ORDER = IterMethod.LEVEL_ORDER - results.append( - fixture.run_timings( - f"for _ in tree.iterator({ORDER}): ...", - """\ - for _ in tree.iterator(ORDER): pass - """, - globals=locals(), - ) + bmr.run( + variant="for _ in tree.iterator(): ...", + stmt="""\ + for _ in tree.iterator(): pass + """, ) - ORDER = IterMethod.RANDOM_ORDER - results.append( - fixture.run_timings( - f"for _ in tree.iterator({ORDER}): ...", - """\ - for _ in tree.iterator(ORDER): pass - """, - globals=locals(), - ) - ) - - ORDER = IterMethod.UNORDERED - results.append( - fixture.run_timings( - f"for _ in tree.iterator({ORDER}): ...", - """\ - for _ in tree.iterator(ORDER): pass - """, + ORDER_LIST = [ + IterMethod.LEVEL_ORDER, + IterMethod.PRE_ORDER, + IterMethod.POST_ORDER, + IterMethod.RANDOM_ORDER, + IterMethod.UNORDERED, + ] + for ORDER in ORDER_LIST: + bmr.run( + variant=f"for _ in tree.iterator({ORDER.name}): ...", + stmt="""\ + for _ in tree.iterator(ORDER): pass + """, globals=locals(), ) - ) - results.append( - fixture.run_timings( - "tree.visit(lambda node, memo: None)", - """\ - tree.visit(lambda node, memo: None) - """, - globals=locals(), - ) + bmr.run( + variant="tree.visit(lambda node, memo: None)", + stmt="""\ + tree.visit(lambda node, memo: None) + """, ) with capsys.disabled(): - print("\n - ".join(results)) + bmr.print() @benchmark @@ -176,118 +141,100 @@ class TestCompress: ZIP_LZMA ('.lzma') | 44.347 | 2.13 | 0.38 """ - def test_bench_serialize(self, capsys): + def test_bench_serialize(self, benchman, tmp_path, capsys): import zipfile # noqa: F401 - results = ["Benchmark results"] - directory = Path("~").expanduser() - # with WritableTempFile("w", suffix=".gz") as temp_file: + # directory = Path("~").expanduser() + directory = tmp_path tree = fixture.generate_tree([10, 100, 100]) + bmr_load = benchman.make_runner( + name="serialize_load", + # sample_size=len(tree), + repeat=1, + iterations=1, + globals=locals(), + ) + bmr_save = benchman.make_runner( + name="serialize_save", + # sample_size=len(tree), + repeat=1, + iterations=1, + globals=locals(), + ) + path = directory / "test.json" - results.append( - fixture.run_timings( - f"tree.save({path}, compression=False, nodes={len(tree):,})", - f"""\ + bmr_save.run( + variant="uncompressed ('.json')", + stmt=f"""\ tree.save("{path}", compression=False) - """, - repeat=1, - number=1, - globals=locals(), - ) + """, ) - results.append( - fixture.run_timings( - f"tree.load({path}, nodes={len(tree):,})", - f"""\ + + bmr_load.run( + variant="uncompressed ('.json')", + stmt=f"""\ tree.load("{path}") - """, - repeat=1, - number=1, - globals=locals(), - ) + """, ) + # --- ZIP path = directory / "test.zip" - results.append( - fixture.run_timings( - f"tree.save({path}, compression=ZIP, nodes={len(tree):,})", - f"""\ + bmr_save.run( + variant="ZIP_DEFLATED ('.zip') ", + stmt=f"""\ tree.save("{path}", compression=zipfile.ZIP_DEFLATED) - """, - repeat=1, - number=1, - globals=locals(), - ) + """, ) - results.append( - fixture.run_timings( - f"tree.load({path}, nodes={len(tree):,})", - f"""\ + + bmr_load.run( + variant="ZIP_DEFLATED ('.zip') ", + stmt=f"""\ tree.load("{path}") - """, - repeat=1, - number=1, - globals=locals(), - ) + """, ) + # --- ZIP path = directory / "test.bz2" - results.append( - fixture.run_timings( - f"tree.save({path}, compression=ZIP, nodes={len(tree):,})", - f"""\ + bmr_save.run( + variant="ZIP_BZIP2 ('.bz2') ", + stmt=f"""\ tree.save("{path}", compression=zipfile.ZIP_BZIP2) - """, - repeat=1, - number=1, - globals=locals(), - ) + """, ) - results.append( - fixture.run_timings( - f"tree.load({path}, nodes={len(tree):,})", - f"""\ + + bmr_load.run( + variant="ZIP_BZIP2 ('.bz2') ", + stmt=f"""\ tree.load("{path}") - """, - repeat=1, - number=1, - globals=locals(), - ) + """, ) + # --- ZIP path = directory / "test.lzma" - results.append( - fixture.run_timings( - f"tree.save({path}, compression=LZMA, nodes={len(tree):,})", - f"""\ + bmr_save.run( + variant="ZIP_LZMA ('.lzma') ", + stmt=f"""\ tree.save("{path}", compression=zipfile.ZIP_LZMA) - """, - repeat=1, - number=1, - globals=locals(), - ) + """, ) - results.append( - fixture.run_timings( - f"tree.load({path}, nodes={len(tree):,})", - f"""\ + + bmr_load.run( + variant="ZIP_LZMA ('.lzma') ", + stmt=f"""\ tree.load("{path}") - """, - repeat=1, - number=1, - globals=locals(), - ) + """, ) with capsys.disabled(): - print("\n - ".join(results)) + bmr_save.print() + bmr_load.print() @benchmark class TestMemory: - def test_bench_node_size(self, capsys): + def test_bench_node_size(self, benchman, capsys): """ """ try: @@ -323,7 +270,8 @@ def test_bench_node_size(self, capsys): f"node-size: {node_size:.1f} bytes" ) with capsys.disabled(): - print("\n - ".join(results)) + print(f"\n{benchman}") + benchman.print_results() # def test_bench_tree_mem(self, capsys): # """ """ diff --git a/tests/test_serialize.py b/tests/test_serialize.py index 53aec5c..e919281 100644 --- a/tests/test_serialize.py +++ b/tests/test_serialize.py @@ -11,7 +11,7 @@ import pprint import tempfile import zipfile -from typing import Any, Tuple +from typing import Any import pytest from nutree import Node, Tree @@ -21,7 +21,7 @@ from . import fixture -def _get_fp_result(fp, *, do_print=True, assert_len: int) -> Tuple[str, dict]: +def _get_fp_result(fp, *, do_print=True, assert_len: int) -> tuple[str, dict]: fp.seek(0) text = fp.read() data = json.loads(text) diff --git a/tests/test_typing_concept.py b/tests/test_typing_concept.py index b8c0812..908e9b8 100644 --- a/tests/test_typing_concept.py +++ b/tests/test_typing_concept.py @@ -6,7 +6,7 @@ from __future__ import annotations -from typing import Generic, List, Type, cast +from typing import Generic, cast from uuid import UUID, uuid4 from typing_extensions import Any, Self, TypeVar, reveal_type @@ -19,7 +19,7 @@ class Node(Generic[TData]): def __init__(self, data: TData, parent: Self): self.data: TData = data self.parent: Self = parent - self.children: List[Self] = [] + self.children: list[Self] = [] def add(self, data: TData) -> Self: node = self.__class__(data, self) @@ -28,7 +28,7 @@ def add(self, data: TData) -> Self: class Tree(Generic[TData, TNode]): - node_factory: Type[TNode] = cast(Type[TNode], Node) + node_factory: type[TNode] = cast(type[TNode], Node) def __init__(self): self._root: Node = self.node_factory("__root__", None) # type: ignore diff --git a/tox.ini b/tox.ini index d91fc8f..31e2902 100644 --- a/tox.ini +++ b/tox.ini @@ -17,13 +17,9 @@ skip_missing_interpreters = true # TOX Test Environment [testenv] -# usedevelop = True -extras = -# test -passenv = - # LC_ALL - # LANG -# Note: also honors .coveragerc: +; usedevelop = True +; extras = +; passenv = deps = fabulist pydot @@ -31,18 +27,12 @@ deps = pytest-cov pytest-html rdflib - py39: typing-extensions>=4.0 - py310: typing-extensions>=4.0 setenv = COVERAGE_FILE=.coverage.{envname} -; allowlist_externals = -; which commands = # See settings in pyproject.toml - # Run everything from /tests folder: python -V - ; which python - ; pip list + pip install -e ../benchman_pre pytest -ra -v -x --durations=10 --cov=nutree --html=build/pytest/report-{envname}.html --self-contained-html {posargs} [testenv:py38] @@ -130,16 +120,20 @@ commands = # http://www.sphinx-doc.org/en/master/man/sphinx-build.html sphinx-build -b html sphinx sphinx-build -[testenv:benchmarks] -description = Run 'pytest --benchmarks' on all Python versions -; envlist = py38, py39, py310, py311, py312 -skip_install = true -changedir = {toxinidir} -basepython = py312 -; basepython = py39 -; basepython = py{38, 39} +; [testenv:benchmarks] +; description = Run 'pytest --benchmarks' on all Python versions +; ; envlist = py38, py39, py310, py311, py312 +; skip_install = true +; changedir = {toxinidir} +; basepython = py312 +; ; basepython = py39 +; ; basepython = py{38, 39} ; deps = ; pytest -commands = - python -V - pytest -k test_bench -o addopts="" --benchmarks +; pytest-benchmark[histogram] +; commands = +; python -V +; ; pytest -k test_bench -o addopts="" --benchmarks +; ; pytest -o addopts="" -k test_pybench --benchmarks --benchmark-histogram +; pytest -o addopts="" -k test_pybench --benchmarks +; benchman purge diff --git a/tox_benchmarks.ini b/tox_benchmarks.ini new file mode 100644 index 0000000..d595ad1 --- /dev/null +++ b/tox_benchmarks.ini @@ -0,0 +1,44 @@ +[tox] +basepython = python3.12 +envlist = + py{39,310,311,312,313} + ; py{39} + benchman-combine +skip_missing_interpreters = true + + +# TOX Test Environment +[testenv] +; skip_install = true +deps = + ../benchman_pre + pytest + +changedir = {toxinidir} +commands = + python -V + pytest -v \ + -o addopts="" \ + --benchmarks tests/test_bench.py +; ignore_outcome = true +; parallel_show_output = true + + +[testenv:benchman-combine] +description = Combine benchmark results +# Make sure to run this last +depends = py{39,310,311,312,313} +; skip_install = true +changedir = {toxinidir} +commands: + benchman combine + benchman report + benchman report \ + --columns name,variant \ + --dyn-col-name python --dyn-col-value ops \ + --output .benchman/report-by-pyver.latest.md + ; benchman report --columns name,mean,median,stdev --dyn-col-name python --dyn-col-value best + benchman report --output .benchman/report.latest.md + +; ignore_outcome = true +; parallel_show_output = true \ No newline at end of file