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