From 83663d879dafeabc7f0d772e5a45d7a74c921989 Mon Sep 17 00:00:00 2001 From: Elijas <4084885+Elijas@users.noreply.github.com> Date: Thu, 12 Oct 2023 13:55:22 +0300 Subject: [PATCH] feat: add to_dict() methods and remove e2e tests --- Taskfile.yml | 13 - docs/rtd_requirements.txt | 410 +++++++++++++----- poetry.lock | 119 ++++- pyproject.toml | 1 + sec_parser/processing_engine/html_tag.py | 35 ++ .../abstract_semantic_element.py | 16 +- .../composite_semantic_element.py | 8 +- .../highlighted_text_element.py | 8 +- tests/e2e/__init__.py | 0 tests/e2e/_metrics.py | 86 ---- tests/e2e/sec_parser.py | 246 ----------- .../10q_apple_000032019323000077.html | 22 - .../10q_goog_000165204423000070.html | 22 - tests/unit/processing_engine/test_html_tag.py | 20 +- .../test_abstract_level_element.py | 14 + .../test_composite_semantic_element.py | 16 + .../test_highlighted_text_element.py | 21 +- 17 files changed, 553 insertions(+), 504 deletions(-) delete mode 100644 tests/e2e/__init__.py delete mode 100644 tests/e2e/_metrics.py delete mode 100644 tests/e2e/sec_parser.py delete mode 100644 tests/e2e/test_data/10q_apple_000032019323000077.html delete mode 100644 tests/e2e/test_data/10q_goog_000165204423000070.html diff --git a/Taskfile.yml b/Taskfile.yml index 00d259f..b035d36 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -11,7 +11,6 @@ tasks: cmds: - task unit - task lint-fix - - task e2e-smoke p: desc: Shortcut for `task pre-commit`. @@ -23,7 +22,6 @@ tasks: cmds: - task unit - task lint - - task e2e ###################### ### Run Unit Tests ### @@ -64,18 +62,7 @@ tasks: ### Run End-to-end Tests ### ############################ - e2e: - desc: Run repeated end-to-end tests. - cmds: - # The CLI_ARGS variable allows passing custom arguments to the end-to-end test after "--". - # For instance, to run the test with specific parameters, use the command: - # task e2e -- --tests-per-core=5 --cores=2 --limit_documents=2 - - poetry run python -m tests.e2e.sec_parser {{.CLI_ARGS}} - e2e-smoke: - desc: Run a single end-to-end test for a single document. This is a useful way to verify if the parser is functioning (a so-called "smoke" test). - cmds: - - poetry run python -m tests.e2e.sec_parser --tests-per-core=1 --cores=1 --limit_documents=1 ####################### ### Developer Tools ### diff --git a/docs/rtd_requirements.txt b/docs/rtd_requirements.txt index 1fafffa..ddc34c3 100644 --- a/docs/rtd_requirements.txt +++ b/docs/rtd_requirements.txt @@ -7,18 +7,50 @@ anyascii==0.3.2 ; python_version >= "3.9" and python_full_version != "3.9.7" and anyio==4.0.0 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ --hash=sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f \ --hash=sha256:f7ed51751b2c2add651e5747c891b47e26d2a21be5d32d9311dfe9692f3e5d7a +appnope==0.1.3 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" and sys_platform == "darwin" \ + --hash=sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24 \ + --hash=sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e astroid==3.0.0 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ --hash=sha256:1defdbca052635dd29657ea674edfc45e4b5be9cd53630c5b084fcfed94344a8 \ --hash=sha256:f2510e7fdcd6cfda4ec50014726d4857abf79acfc010084ce8c26091913f1b25 +asttokens==2.4.0 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ + --hash=sha256:2e0171b991b2c959acc6c49318049236844a5da1d65ba2672c4880c1c894834e \ + --hash=sha256:cf8fc9e61a86461aa9fb161a14a0841a03c405fa829ac6b202670b3495d2ce69 attrs==23.1.0 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 \ --hash=sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015 babel==2.13.0 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ --hash=sha256:04c3e2d28d2b7681644508f836be388ae49e0cfe91465095340395b60d00f210 \ --hash=sha256:fbfcae1575ff78e26c7449136f1abbefc3c13ce542eeb13d43d50d8b047216ec +backcall==0.2.0 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ + --hash=sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e \ + --hash=sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255 beautifulsoup4==4.12.2 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ --hash=sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da \ --hash=sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a +black==23.9.1 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ + --hash=sha256:031e8c69f3d3b09e1aa471a926a1eeb0b9071f80b17689a655f7885ac9325a6f \ + --hash=sha256:13a2e4a93bb8ca74a749b6974925c27219bb3df4d42fc45e948a5d9feb5122b7 \ + --hash=sha256:13ef033794029b85dfea8032c9d3b92b42b526f1ff4bf13b2182ce4e917f5100 \ + --hash=sha256:14f04c990259576acd093871e7e9b14918eb28f1866f91968ff5524293f9c573 \ + --hash=sha256:24b6b3ff5c6d9ea08a8888f6977eae858e1f340d7260cf56d70a49823236b62d \ + --hash=sha256:403397c033adbc45c2bd41747da1f7fc7eaa44efbee256b53842470d4ac5a70f \ + --hash=sha256:50254ebfa56aa46a9fdd5d651f9637485068a1adf42270148cd101cdf56e0ad9 \ + --hash=sha256:538efb451cd50f43aba394e9ec7ad55a37598faae3348d723b59ea8e91616300 \ + --hash=sha256:638619a559280de0c2aa4d76f504891c9860bb8fa214267358f0a20f27c12948 \ + --hash=sha256:6a3b50e4b93f43b34a9d3ef00d9b6728b4a722c997c99ab09102fd5efdb88325 \ + --hash=sha256:6ccd59584cc834b6d127628713e4b6b968e5f79572da66284532525a042549f9 \ + --hash=sha256:75a2dc41b183d4872d3a500d2b9c9016e67ed95738a3624f4751a0cb4818fe71 \ + --hash=sha256:7d30ec46de88091e4316b17ae58bbbfc12b2de05e069030f6b747dfc649ad186 \ + --hash=sha256:8431445bf62d2a914b541da7ab3e2b4f3bc052d2ccbf157ebad18ea126efb91f \ + --hash=sha256:8fc1ddcf83f996247505db6b715294eba56ea9372e107fd54963c7553f2b6dfe \ + --hash=sha256:a732b82747235e0542c03bf352c126052c0fbc458d8a239a94701175b17d4855 \ + --hash=sha256:adc3e4442eef57f99b5590b245a328aad19c99552e0bdc7f0b04db6656debd80 \ + --hash=sha256:c46767e8df1b7beefb0899c4a95fb43058fa8500b6db144f4ff3ca38eb2f6393 \ + --hash=sha256:c619f063c2d68f19b2d7270f4cf3192cb81c9ec5bc5ba02df91471d0b88c4c5c \ + --hash=sha256:cf3a4d00e4cdb6734b64bf23cd4341421e8953615cba6b3670453737a72ec204 \ + --hash=sha256:cf99f3de8b3273a8317681d8194ea222f10e0133a24a7548c73ce44ea1679377 \ + --hash=sha256:d6bc09188020c9ac2555a498949401ab35bb6bf76d4e0f8ee251694664df6301 bleach==6.1.0 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ --hash=sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe \ --hash=sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6 @@ -169,12 +201,18 @@ charset-normalizer==3.3.0 ; python_version >= "3.9" and python_full_version != " --hash=sha256:f5969baeaea61c97efa706b9b107dcba02784b1601c74ac84f2a532ea079403e \ --hash=sha256:f8888e31e3a85943743f8fc15e71536bda1c81d5aa36d014a3c0c44481d7db6e \ --hash=sha256:fc52b79d83a3fe3a360902d3f5d79073a993597d48114c29485e9431092905d8 +click==8.1.7 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ + --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \ + --hash=sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de colorama==0.4.6 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 cssutils==2.7.1 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ --hash=sha256:1e92e0d9dab2ec8af9f38d715393964ba533dc3beacab9b072511dfc241db775 \ --hash=sha256:340ecfd9835d21df8f98500f0dfcea0aee41cb4e19ecbc2cf94f0a6d36d7cb6c +decorator==5.1.1 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ + --hash=sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330 \ + --hash=sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186 defusedxml==0.7.1 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ --hash=sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69 \ --hash=sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61 @@ -184,6 +222,9 @@ docutils==0.18.1 ; python_version >= "3.9" and python_full_version != "3.9.7" an exceptiongroup==1.1.3 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "3.11" \ --hash=sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9 \ --hash=sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3 +executing==2.0.0 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ + --hash=sha256:06df6183df67389625f4e763921c6cf978944721abf3e714000200aab95b0657 \ + --hash=sha256:0ff053696fdeef426cda5bd18eacd94f82c91f49823a2e9090124212ceea9b08 fastjsonschema==2.18.1 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ --hash=sha256:06dc8680d937628e993fa0cd278f196d20449a1adc087640710846b324d422ea \ --hash=sha256:aec6a19e9f66e9810ab371cc913ad5f4e9e479b63a7072a2cd060a9369e329a8 @@ -243,6 +284,12 @@ imagesize==1.4.1 ; python_version >= "3.9" and python_full_version != "3.9.7" an importlib-metadata==6.8.0 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "3.10" \ --hash=sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb \ --hash=sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743 +ipython==8.16.1 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ + --hash=sha256:0852469d4d579d9cd613c220af7bf0c9cc251813e12be647cb9d463939db9b1e \ + --hash=sha256:ad52f58fca8f9f848e256c629eff888efc0528c12fe0f8ec14f33205f23ef938 +jedi==0.19.1 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ + --hash=sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd \ + --hash=sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0 jinja2==3.1.2 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \ --hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61 @@ -252,12 +299,15 @@ jsonschema-specifications==2023.7.1 ; python_version >= "3.9" and python_full_ve jsonschema==4.19.1 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ --hash=sha256:cd5f1f9ed9444e554b38ba003af06c0a8c2868131e56bfbef0550fb450c0330e \ --hash=sha256:ec84cc37cfa703ef7cd4928db24f9cb31428a5d0fa77747b8b51a847458e0bbf -jupyter-client==8.3.1 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ - --hash=sha256:5eb9f55eb0650e81de6b7e34308d8b92d04fe4ec41cd8193a913979e33d8e1a5 \ - --hash=sha256:60294b2d5b869356c893f57b1a877ea6510d60d45cf4b38057f1672d85699ac9 -jupyter-core==5.3.2 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ - --hash=sha256:0c28db6cbe2c37b5b398e1a1a5b22f84fd64cd10afc1f6c05b02fb09481ba45f \ - --hash=sha256:a4af53c3fa3f6330cebb0d9f658e148725d15652811d1c32dc0f63bb96f2e6d6 +jupyter-black==0.3.4 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ + --hash=sha256:2a38f33d4c321eb768f426103635ac9b80b40c9e42aa06072a729e3caddca4c3 \ + --hash=sha256:8690ec1d16d173a74eecc44419755ca7209c494b213e0d7b04c40a878239e247 +jupyter-client==8.4.0 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ + --hash=sha256:6a2a950ec23a8f62f9e4c66acec7f0ea6c7d1f80ba0992e747b10c56ce2e6dbe \ + --hash=sha256:dc1b857d5d7d76ac101766c6e9b646bf18742721126e72e5d484c75a993cada2 +jupyter-core==5.4.0 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ + --hash=sha256:66e252f675ac04dcf2feb6ed4afb3cd7f68cf92f483607522dc251f32d471571 \ + --hash=sha256:e4b98344bb94ee2e3e6c4519a97d001656009f9cb2b7f2baf15b3c205770011d jupyterlab-pygments==0.2.2 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ --hash=sha256:2405800db07c9f770863bcf8049a529c3dd4d3e28536638bd7c1c01d2748309f \ --hash=sha256:7405d7fde60819d905a9fa8ce89e4cd830e318cdad22a0030f7a901da705585d @@ -421,6 +471,9 @@ markupsafe==2.1.3 ; python_version >= "3.9" and python_full_version != "3.9.7" a --hash=sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc \ --hash=sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2 \ --hash=sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11 +matplotlib-inline==0.1.6 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ + --hash=sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311 \ + --hash=sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304 mdit-py-plugins==0.4.0 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ --hash=sha256:b51b3bb70691f57f974e257e367107857a93b36f322a9e6d44ca5bf28ec2def9 \ --hash=sha256:d8ab27e9aed6c38aa716819fedfde15ca275715955f8a185a8e1cf90fb1d2c1b @@ -430,6 +483,9 @@ mdurl==0.1.2 ; python_version >= "3.9" and python_full_version != "3.9.7" and py mistune==3.0.2 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ --hash=sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205 \ --hash=sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8 +mypy-extensions==1.0.0 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ + --hash=sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d \ + --hash=sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782 myst-parser==2.0.0 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ --hash=sha256:7c36344ae39c8e740dad7fdabf5aa6fc4897a813083c6cc9990044eb93656b14 \ --hash=sha256:ea929a67a6a0b1683cdbe19b8d2e724cd7643f8aa3e7bb18dd65beac3483bead @@ -451,9 +507,30 @@ packaging==23.2 ; python_version >= "3.9" and python_full_version != "3.9.7" and pandocfilters==1.5.0 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ --hash=sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38 \ --hash=sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f +parso==0.8.3 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ + --hash=sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0 \ + --hash=sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75 +pathspec==0.11.2 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ + --hash=sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20 \ + --hash=sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3 +pexpect==4.8.0 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" and sys_platform != "win32" \ + --hash=sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937 \ + --hash=sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c +pickleshare==0.7.5 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ + --hash=sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca \ + --hash=sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56 platformdirs==3.11.0 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ --hash=sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3 \ --hash=sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e +prompt-toolkit==3.0.39 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ + --hash=sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac \ + --hash=sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88 +ptyprocess==0.7.0 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" and sys_platform != "win32" \ + --hash=sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35 \ + --hash=sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220 +pure-eval==0.2.2 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ + --hash=sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350 \ + --hash=sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3 pycparser==2.21 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" and implementation_name == "pypy" \ --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 @@ -632,106 +709,106 @@ referencing==0.30.2 ; python_version >= "3.9" and python_full_version != "3.9.7" requests==2.31.0 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \ --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 -rpds-py==0.10.4 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ - --hash=sha256:00a88003db3cc953f8656b59fc9af9d0637a1fb93c235814007988f8c153b2f2 \ - --hash=sha256:049098dabfe705e9638c55a3321137a821399c50940041a6fcce267a22c70db2 \ - --hash=sha256:08f07150c8ebbdbce1d2d51b8e9f4d588749a2af6a98035485ebe45c7ad9394e \ - --hash=sha256:125776d5db15162fdd9135372bef7fe4fb7c5f5810cf25898eb74a06a0816aec \ - --hash=sha256:13cbd79ccedc6b39c279af31ebfb0aec0467ad5d14641ddb15738bf6e4146157 \ - --hash=sha256:18d5ff7fbd305a1d564273e9eb22de83ae3cd9cd6329fddc8f12f6428a711a6a \ - --hash=sha256:1c27942722cd5039bbf5098c7e21935a96243fed00ea11a9589f3c6c6424bd84 \ - --hash=sha256:255a23bded80605e9f3997753e3a4b89c9aec9efb07ec036b1ca81440efcc1a9 \ - --hash=sha256:2573ec23ad3a59dd2bc622befac845695972f3f2d08dc1a4405d017d20a6c225 \ - --hash=sha256:2603e084054351cc65097da326570102c4c5bd07426ba8471ceaefdb0b642cc9 \ - --hash=sha256:28b4942ec7d9d6114c1e08cace0157db92ef674636a38093cab779ace5742d3a \ - --hash=sha256:28e29dac59df890972f73c511948072897f512974714a803fe793635b80ff8c7 \ - --hash=sha256:2a97406d5e08b7095428f01dac0d3c091dc072351151945a167e7968d2755559 \ - --hash=sha256:2a9e864ec051a58fdb6bb2e6da03942adb20273897bc70067aee283e62bbac4d \ - --hash=sha256:2e0e2e01c5f61ddf47e3ed2d1fe1c9136e780ca6222d57a2517b9b02afd4710c \ - --hash=sha256:2e79eeeff8394284b09577f36316d410525e0cf0133abb3de10660e704d3d38e \ - --hash=sha256:2f2ac8bb01f705c5caaa7fe77ffd9b03f92f1b5061b94228f6ea5eaa0fca68ad \ - --hash=sha256:32819b662e3b4c26355a4403ea2f60c0a00db45b640fe722dd12db3d2ef807fb \ - --hash=sha256:3507c459767cf24c11e9520e2a37c89674266abe8e65453e5cb66398aa47ee7b \ - --hash=sha256:362faeae52dc6ccc50c0b6a01fa2ec0830bb61c292033f3749a46040b876f4ba \ - --hash=sha256:3650eae998dc718960e90120eb45d42bd57b18b21b10cb9ee05f91bff2345d48 \ - --hash=sha256:36ff30385fb9fb3ac23a28bffdd4a230a5229ed5b15704b708b7c84bfb7fce51 \ - --hash=sha256:3bc561c183684636c0099f9c3fbab8c1671841942edbce784bb01b4707d17924 \ - --hash=sha256:3bd38b80491ef9686f719c1ad3d24d14fbd0e069988fdd4e7d1a6ffcdd7f4a13 \ - --hash=sha256:3e37f1f134037601eb4b1f46854194f0cc082435dac2ee3de11e51529f7831f2 \ - --hash=sha256:40f6e53461b19ddbb3354fe5bcf3d50d4333604ae4bf25b478333d83ca68002c \ - --hash=sha256:49db6c0a0e6626c2b97f5e7f8f7074da21cbd8ec73340c25e839a2457c007efa \ - --hash=sha256:4bcb1abecd998a72ad4e36a0fca93577fd0c059a6aacc44f16247031b98f6ff4 \ - --hash=sha256:4cb55454a20d1b935f9eaab52e6ceab624a2efd8b52927c7ae7a43e02828dbe0 \ - --hash=sha256:4f92d2372ec992c82fd7c74aa21e2a1910b3dcdc6a7e6392919a138f21d528a3 \ - --hash=sha256:576d48e1e45c211e99fc02655ade65c32a75d3e383ccfd98ce59cece133ed02c \ - --hash=sha256:58bae860d1d116e6b4e1aad0cdc48a187d5893994f56d26db0c5534df7a47afd \ - --hash=sha256:5bb3f3cb6072c73e6ec1f865d8b80419b599f1597acf33f63fbf02252aab5a03 \ - --hash=sha256:5db93f9017b384a4f194e1d89e1ce82d0a41b1fafdbbd3e0c8912baf13f2950f \ - --hash=sha256:5e41d5b334e8de4bc3f38843f31b2afa9a0c472ebf73119d3fd55cde08974bdf \ - --hash=sha256:60018626e637528a1fa64bb3a2b3e46ab7bf672052316d61c3629814d5e65052 \ - --hash=sha256:6090ba604ea06b525a231450ae5d343917a393cbf50423900dea968daf61d16f \ - --hash=sha256:628fbb8be71a103499d10b189af7764996ab2634ed7b44b423f1e19901606e0e \ - --hash=sha256:6baea8a4f6f01e69e75cfdef3edd4a4d1c4b56238febbdf123ce96d09fbff010 \ - --hash=sha256:6c5ca3eb817fb54bfd066740b64a2b31536eb8fe0b183dc35b09a7bd628ed680 \ - --hash=sha256:70563a1596d2e0660ca2cebb738443437fc0e38597e7cbb276de0a7363924a52 \ - --hash=sha256:7089d8bfa8064b28b2e39f5af7bf12d42f61caed884e35b9b4ea9e6fb1175077 \ - --hash=sha256:72e9b1e92830c876cd49565d8404e4dcc9928302d348ea2517bc3f9e3a873a2a \ - --hash=sha256:7c7ca791bedda059e5195cf7c6b77384657a51429357cdd23e64ac1d4973d6dc \ - --hash=sha256:7f050ceffd8c730c1619a16bbf0b9cd037dcdb94b54710928ba38c7bde67e4a4 \ - --hash=sha256:83da147124499fe41ed86edf34b4e81e951b3fe28edcc46288aac24e8a5c8484 \ - --hash=sha256:86e8d6ff15fa7a9590c0addaf3ce52fb58bda4299cab2c2d0afa404db6848dab \ - --hash=sha256:8709eb4ab477c533b7d0a76cd3065d7d95c9e25e6b9f6e27caeeb8c63e8799c9 \ - --hash=sha256:8e69bbe0ede8f7fe2616e779421bbdb37f025c802335a90f6416e4d98b368a37 \ - --hash=sha256:8f90fc6dd505867514c8b8ef68a712dc0be90031a773c1ae2ad469f04062daef \ - --hash=sha256:9123ba0f3f98ff79780eebca9984a2b525f88563844b740f94cffb9099701230 \ - --hash=sha256:927e3461dae0c09b1f2e0066e50c1a9204f8a64a3060f596e9a6742d3b307785 \ - --hash=sha256:94876c21512535955a960f42a155213315e6ab06a4ce8ce372341a2a1b143eeb \ - --hash=sha256:98c0aecf661c175ce9cb17347fc51a5c98c3e9189ca57e8fcd9348dae18541db \ - --hash=sha256:9c7e7bd1fa1f535af71dfcd3700fc83a6dc261a1204f8f5327d8ffe82e52905d \ - --hash=sha256:9e7b3ad9f53ea9e085b3d27286dd13f8290969c0a153f8a52c8b5c46002c374b \ - --hash=sha256:9f9184744fb800c9f28e155a5896ecb54816296ee79d5d1978be6a2ae60f53c4 \ - --hash=sha256:a3628815fd170a64624001bfb4e28946fd515bd672e68a1902d9e0290186eaf3 \ - --hash=sha256:a5c330cb125983c5d380fef4a4155248a276297c86d64625fdaf500157e1981c \ - --hash=sha256:aa45cc71bf23a3181b8aa62466b5a2b7b7fb90fdc01df67ca433cd4fce7ec94d \ - --hash=sha256:aab24b9bbaa3d49e666e9309556591aa00748bd24ea74257a405f7fed9e8b10d \ - --hash=sha256:ac83f5228459b84fa6279e4126a53abfdd73cd9cc183947ee5084153880f65d7 \ - --hash=sha256:ad21c60fc880204798f320387164dcacc25818a7b4ec2a0bf6b6c1d57b007d23 \ - --hash=sha256:ae8a32ab77a84cc870bbfb60645851ca0f7d58fd251085ad67464b1445d632ca \ - --hash=sha256:b0f1d336786cb62613c72c00578c98e5bb8cd57b49c5bae5d4ab906ca7872f98 \ - --hash=sha256:b28b9668a22ca2cfca4433441ba9acb2899624a323787a509a3dc5fbfa79c49d \ - --hash=sha256:b953d11b544ca5f2705bb77b177d8e17ab1bfd69e0fd99790a11549d2302258c \ - --hash=sha256:b9d8884d58ea8801e5906a491ab34af975091af76d1a389173db491ee7e316bb \ - --hash=sha256:ba3246c60303eab3d0e562addf25a983d60bddc36f4d1edc2510f056d19df255 \ - --hash=sha256:bd0ad98c7d72b0e4cbfe89cdfa12cd07d2fd6ed22864341cdce12b318a383442 \ - --hash=sha256:bf032367f921201deaecf221d4cc895ea84b3decf50a9c73ee106f961885a0ad \ - --hash=sha256:c31ecfc53ac03dad4928a1712f3a2893008bfba1b3cde49e1c14ff67faae2290 \ - --hash=sha256:cbec8e43cace64e63398155dc585dc479a89fef1e57ead06c22d3441e1bd09c3 \ - --hash=sha256:cc688a59c100f038fa9fec9e4ab457c2e2d1fca350fe7ea395016666f0d0a2dc \ - --hash=sha256:cd7da2adc721ccf19ac7ec86cae3a4fcaba03d9c477d5bd64ded6e9bb817bf3f \ - --hash=sha256:cd7e62e7d5bcfa38a62d8397fba6d0428b970ab7954c2197501cd1624f7f0bbb \ - --hash=sha256:d0f7f77a77c37159c9f417b8dd847f67a29e98c6acb52ee98fc6b91efbd1b2b6 \ - --hash=sha256:d230fddc60caced271cc038e43e6fb8f4dd6b2dbaa44ac9763f2d76d05b0365a \ - --hash=sha256:d37f27ad80f742ef82796af3fe091888864958ad0bc8bab03da1830fa00c6004 \ - --hash=sha256:d5ad7b1a1f6964d19b1a8acfc14bf7864f39587b3e25c16ca04f6cd1815026b3 \ - --hash=sha256:d81359911c3bb31c899c6a5c23b403bdc0279215e5b3bc0d2a692489fed38632 \ - --hash=sha256:d98802b78093c7083cc51f83da41a5be5a57d406798c9f69424bd75f8ae0812a \ - --hash=sha256:db0589e0bf41ff6ce284ab045ca89f27be1adf19e7bce26c2e7de6739a70c18b \ - --hash=sha256:ddbd113a37307638f94be5ae232a325155fd24dbfae2c56455da8724b471e7be \ - --hash=sha256:e3ece9aa6d07e18c966f14b4352a4c6f40249f6174d3d2c694c1062e19c6adbb \ - --hash=sha256:e3f9c9e5dd8eba4768e15f19044e1b5e216929a43a54b4ab329e103aed9f3eda \ - --hash=sha256:e41824343c2c129599645373992b1ce17720bb8a514f04ff9567031e1c26951e \ - --hash=sha256:e5dba1c11e089b526379e74f6c636202e4c5bad9a48c7416502b8a5b0d026c91 \ - --hash=sha256:e791e3d13b14d0a7921804d0efe4d7bd15508bbcf8cb7a0c1ee1a27319a5f033 \ - --hash=sha256:ec001689402b9104700b50a005c2d3d0218eae90eaa8bdbbd776fe78fe8a74b7 \ - --hash=sha256:efffa359cc69840c8793f0c05a7b663de6afa7b9078fa6c80309ee38b9db677d \ - --hash=sha256:f1f191befea279cb9669b57be97ab1785781c8bab805900e95742ebfaa9cbf1d \ - --hash=sha256:f3331a3684192659fa1090bf2b448db928152fcba08222e58106f44758ef25f7 \ - --hash=sha256:f40413d2859737ce6d95c29ce2dde0ef7cdc3063b5830ae4342fef5922c3bba7 \ - --hash=sha256:f7ea49ddf51d5ec0c3cbd95190dd15e077a3153c8d4b22a33da43b5dd2b3c640 \ - --hash=sha256:f82abb5c5b83dc30e96be99ce76239a030b62a73a13c64410e429660a5602bfd \ - --hash=sha256:fc20dadb102140dff63529e08ce6f9745dbd36e673ebb2b1c4a63e134bca81c2 \ - --hash=sha256:fd37ab9a24021821b715478357af1cf369d5a42ac7405e83e5822be00732f463 \ - --hash=sha256:ffd539d213c1ea2989ab92a5b9371ae7159c8c03cf2bcb9f2f594752f755ecd3 +rpds-py==0.10.6 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ + --hash=sha256:023574366002bf1bd751ebaf3e580aef4a468b3d3c216d2f3f7e16fdabd885ed \ + --hash=sha256:031f76fc87644a234883b51145e43985aa2d0c19b063e91d44379cd2786144f8 \ + --hash=sha256:052a832078943d2b2627aea0d19381f607fe331cc0eb5df01991268253af8417 \ + --hash=sha256:0699ab6b8c98df998c3eacf51a3b25864ca93dab157abe358af46dc95ecd9801 \ + --hash=sha256:0713631d6e2d6c316c2f7b9320a34f44abb644fc487b77161d1724d883662e31 \ + --hash=sha256:0774a46b38e70fdde0c6ded8d6d73115a7c39d7839a164cc833f170bbf539116 \ + --hash=sha256:0898173249141ee99ffcd45e3829abe7bcee47d941af7434ccbf97717df020e5 \ + --hash=sha256:09586f51a215d17efdb3a5f090d7cbf1633b7f3708f60a044757a5d48a83b393 \ + --hash=sha256:102eac53bb0bf0f9a275b438e6cf6904904908562a1463a6fc3323cf47d7a532 \ + --hash=sha256:10f32b53f424fc75ff7b713b2edb286fdbfc94bf16317890260a81c2c00385dc \ + --hash=sha256:150eec465dbc9cbca943c8e557a21afdcf9bab8aaabf386c44b794c2f94143d2 \ + --hash=sha256:1d7360573f1e046cb3b0dceeb8864025aa78d98be4bb69f067ec1c40a9e2d9df \ + --hash=sha256:1f36a9d751f86455dc5278517e8b65580eeee37d61606183897f122c9e51cef3 \ + --hash=sha256:24656dc36f866c33856baa3ab309da0b6a60f37d25d14be916bd3e79d9f3afcf \ + --hash=sha256:25860ed5c4e7f5e10c496ea78af46ae8d8468e0be745bd233bab9ca99bfd2647 \ + --hash=sha256:26857f0f44f0e791f4a266595a7a09d21f6b589580ee0585f330aaccccb836e3 \ + --hash=sha256:2bb2e4826be25e72013916eecd3d30f66fd076110de09f0e750163b416500721 \ + --hash=sha256:2f6da6d842195fddc1cd34c3da8a40f6e99e4a113918faa5e60bf132f917c247 \ + --hash=sha256:30adb75ecd7c2a52f5e76af50644b3e0b5ba036321c390b8e7ec1bb2a16dd43c \ + --hash=sha256:3339eca941568ed52d9ad0f1b8eb9fe0958fa245381747cecf2e9a78a5539c42 \ + --hash=sha256:34ad87a831940521d462ac11f1774edf867c34172010f5390b2f06b85dcc6014 \ + --hash=sha256:3777cc9dea0e6c464e4b24760664bd8831738cc582c1d8aacf1c3f546bef3f65 \ + --hash=sha256:3953c6926a63f8ea5514644b7afb42659b505ece4183fdaaa8f61d978754349e \ + --hash=sha256:3c4eff26eddac49d52697a98ea01b0246e44ca82ab09354e94aae8823e8bda02 \ + --hash=sha256:40578a6469e5d1df71b006936ce95804edb5df47b520c69cf5af264d462f2cbb \ + --hash=sha256:40f93086eef235623aa14dbddef1b9fb4b22b99454cb39a8d2e04c994fb9868c \ + --hash=sha256:4134aa2342f9b2ab6c33d5c172e40f9ef802c61bb9ca30d21782f6e035ed0043 \ + --hash=sha256:442626328600bde1d09dc3bb00434f5374948838ce75c41a52152615689f9403 \ + --hash=sha256:4a5ee600477b918ab345209eddafde9f91c0acd931f3776369585a1c55b04c57 \ + --hash=sha256:4ce5a708d65a8dbf3748d2474b580d606b1b9f91b5c6ab2a316e0b0cf7a4ba50 \ + --hash=sha256:516a611a2de12fbea70c78271e558f725c660ce38e0006f75139ba337d56b1f6 \ + --hash=sha256:52c215eb46307c25f9fd2771cac8135d14b11a92ae48d17968eda5aa9aaf5071 \ + --hash=sha256:53c43e10d398e365da2d4cc0bcaf0854b79b4c50ee9689652cdc72948e86f487 \ + --hash=sha256:5752b761902cd15073a527b51de76bbae63d938dc7c5c4ad1e7d8df10e765138 \ + --hash=sha256:5e8a78bd4879bff82daef48c14d5d4057f6856149094848c3ed0ecaf49f5aec2 \ + --hash=sha256:5ed505ec6305abd2c2c9586a7b04fbd4baf42d4d684a9c12ec6110deefe2a063 \ + --hash=sha256:5ee97c683eaface61d38ec9a489e353d36444cdebb128a27fe486a291647aff6 \ + --hash=sha256:61fa268da6e2e1cd350739bb61011121fa550aa2545762e3dc02ea177ee4de35 \ + --hash=sha256:64ccc28683666672d7c166ed465c09cee36e306c156e787acef3c0c62f90da5a \ + --hash=sha256:66414dafe4326bca200e165c2e789976cab2587ec71beb80f59f4796b786a238 \ + --hash=sha256:68fe9199184c18d997d2e4293b34327c0009a78599ce703e15cd9a0f47349bba \ + --hash=sha256:6a555ae3d2e61118a9d3e549737bb4a56ff0cec88a22bd1dfcad5b4e04759175 \ + --hash=sha256:6bdc11f9623870d75692cc33c59804b5a18d7b8a4b79ef0b00b773a27397d1f6 \ + --hash=sha256:6cf4393c7b41abbf07c88eb83e8af5013606b1cdb7f6bc96b1b3536b53a574b8 \ + --hash=sha256:6eef672de005736a6efd565577101277db6057f65640a813de6c2707dc69f396 \ + --hash=sha256:734c41f9f57cc28658d98270d3436dba65bed0cfc730d115b290e970150c540d \ + --hash=sha256:73e0a78a9b843b8c2128028864901f55190401ba38aae685350cf69b98d9f7c9 \ + --hash=sha256:775049dfa63fb58293990fc59473e659fcafd953bba1d00fc5f0631a8fd61977 \ + --hash=sha256:7854a207ef77319ec457c1eb79c361b48807d252d94348305db4f4b62f40f7f3 \ + --hash=sha256:78ca33811e1d95cac8c2e49cb86c0fb71f4d8409d8cbea0cb495b6dbddb30a55 \ + --hash=sha256:79edd779cfc46b2e15b0830eecd8b4b93f1a96649bcb502453df471a54ce7977 \ + --hash=sha256:7bf347b495b197992efc81a7408e9a83b931b2f056728529956a4d0858608b80 \ + --hash=sha256:7fde6d0e00b2fd0dbbb40c0eeec463ef147819f23725eda58105ba9ca48744f4 \ + --hash=sha256:81de24a1c51cfb32e1fbf018ab0bdbc79c04c035986526f76c33e3f9e0f3356c \ + --hash=sha256:879fb24304ead6b62dbe5034e7b644b71def53c70e19363f3c3be2705c17a3b4 \ + --hash=sha256:8e7f2219cb72474571974d29a191714d822e58be1eb171f229732bc6fdedf0ac \ + --hash=sha256:9164ec8010327ab9af931d7ccd12ab8d8b5dc2f4c6a16cbdd9d087861eaaefa1 \ + --hash=sha256:945eb4b6bb8144909b203a88a35e0a03d22b57aefb06c9b26c6e16d72e5eb0f0 \ + --hash=sha256:99a57006b4ec39dbfb3ed67e5b27192792ffb0553206a107e4aadb39c5004cd5 \ + --hash=sha256:9e9184fa6c52a74a5521e3e87badbf9692549c0fcced47443585876fcc47e469 \ + --hash=sha256:9ff93d3aedef11f9c4540cf347f8bb135dd9323a2fc705633d83210d464c579d \ + --hash=sha256:a360cfd0881d36c6dc271992ce1eda65dba5e9368575663de993eeb4523d895f \ + --hash=sha256:a5d7ed104d158c0042a6a73799cf0eb576dfd5fc1ace9c47996e52320c37cb7c \ + --hash=sha256:ac17044876e64a8ea20ab132080ddc73b895b4abe9976e263b0e30ee5be7b9c2 \ + --hash=sha256:ad857f42831e5b8d41a32437f88d86ead6c191455a3499c4b6d15e007936d4cf \ + --hash=sha256:b2039f8d545f20c4e52713eea51a275e62153ee96c8035a32b2abb772b6fc9e5 \ + --hash=sha256:b455492cab07107bfe8711e20cd920cc96003e0da3c1f91297235b1603d2aca7 \ + --hash=sha256:b4a9fe992887ac68256c930a2011255bae0bf5ec837475bc6f7edd7c8dfa254e \ + --hash=sha256:b5a53f5998b4bbff1cb2e967e66ab2addc67326a274567697379dd1e326bded7 \ + --hash=sha256:b788276a3c114e9f51e257f2a6f544c32c02dab4aa7a5816b96444e3f9ffc336 \ + --hash=sha256:bddd4f91eede9ca5275e70479ed3656e76c8cdaaa1b354e544cbcf94c6fc8ac4 \ + --hash=sha256:c0503c5b681566e8b722fe8c4c47cce5c7a51f6935d5c7012c4aefe952a35eed \ + --hash=sha256:c1b3cd23d905589cb205710b3988fc8f46d4a198cf12862887b09d7aaa6bf9b9 \ + --hash=sha256:c48f3fbc3e92c7dd6681a258d22f23adc2eb183c8cb1557d2fcc5a024e80b094 \ + --hash=sha256:c63c3ef43f0b3fb00571cff6c3967cc261c0ebd14a0a134a12e83bdb8f49f21f \ + --hash=sha256:c6c45a2d2b68c51fe3d9352733fe048291e483376c94f7723458cfd7b473136b \ + --hash=sha256:caa1afc70a02645809c744eefb7d6ee8fef7e2fad170ffdeacca267fd2674f13 \ + --hash=sha256:cc435d059f926fdc5b05822b1be4ff2a3a040f3ae0a7bbbe672babb468944722 \ + --hash=sha256:cf693eb4a08eccc1a1b636e4392322582db2a47470d52e824b25eca7a3977b53 \ + --hash=sha256:cf71343646756a072b85f228d35b1d7407da1669a3de3cf47f8bbafe0c8183a4 \ + --hash=sha256:d08f63561c8a695afec4975fae445245386d645e3e446e6f260e81663bfd2e38 \ + --hash=sha256:d29ddefeab1791e3c751e0189d5f4b3dbc0bbe033b06e9c333dca1f99e1d523e \ + --hash=sha256:d7f5e15c953ace2e8dde9824bdab4bec50adb91a5663df08d7d994240ae6fa31 \ + --hash=sha256:d858532212f0650be12b6042ff4378dc2efbb7792a286bee4489eaa7ba010586 \ + --hash=sha256:d97dd44683802000277bbf142fd9f6b271746b4846d0acaf0cefa6b2eaf2a7ad \ + --hash=sha256:dcdc88b6b01015da066da3fb76545e8bb9a6880a5ebf89e0f0b2e3ca557b3ab7 \ + --hash=sha256:dd609fafdcdde6e67a139898196698af37438b035b25ad63704fd9097d9a3482 \ + --hash=sha256:defa2c0c68734f4a82028c26bcc85e6b92cced99866af118cd6a89b734ad8e0d \ + --hash=sha256:e22260a4741a0e7a206e175232867b48a16e0401ef5bce3c67ca5b9705879066 \ + --hash=sha256:e225a6a14ecf44499aadea165299092ab0cba918bb9ccd9304eab1138844490b \ + --hash=sha256:e3df0bc35e746cce42579826b89579d13fd27c3d5319a6afca9893a9b784ff1b \ + --hash=sha256:e6fcc026a3f27c1282c7ed24b7fcac82cdd70a0e84cc848c0841a3ab1e3dea2d \ + --hash=sha256:e782379c2028a3611285a795b89b99a52722946d19fc06f002f8b53e3ea26ea9 \ + --hash=sha256:e8cdd52744f680346ff8c1ecdad5f4d11117e1724d4f4e1874f3a67598821069 \ + --hash=sha256:e9616f5bd2595f7f4a04b67039d890348ab826e943a9bfdbe4938d0eba606971 \ + --hash=sha256:e98c4c07ee4c4b3acf787e91b27688409d918212dfd34c872201273fdd5a0e18 \ + --hash=sha256:ebdab79f42c5961682654b851f3f0fc68e6cc7cd8727c2ac4ffff955154123c1 \ + --hash=sha256:f0f17f2ce0f3529177a5fff5525204fad7b43dd437d017dd0317f2746773443d \ + --hash=sha256:f4e56860a5af16a0fcfa070a0a20c42fbb2012eed1eb5ceeddcc7f8079214281 six==1.16.0 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 @@ -777,9 +854,18 @@ sphinxcontrib-qthelp==1.0.6 ; python_version >= "3.9" and python_full_version != sphinxcontrib-serializinghtml==1.1.9 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ --hash=sha256:0c64ff898339e1fac29abd2bf5f11078f3ec413cfe9c046d3120d7ca65530b54 \ --hash=sha256:9b36e503703ff04f20e9675771df105e58aa029cfcbc23b8ed716019b7416ae1 +stack-data==0.6.3 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ + --hash=sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9 \ + --hash=sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695 tinycss2==1.2.1 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ --hash=sha256:2b80a96d41e7c3914b8cda8bc7f705a4d9c49275616e886103dd839dfc847847 \ --hash=sha256:8cff3a8f066c2ec677c06dbc7b45619804a6938478d9d73c284b29d14ecb0627 +tokenize-rt==5.2.0 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ + --hash=sha256:9fe80f8a5c1edad2d3ede0f37481cc0cc1538a2f442c9c2f9e4feacd2792d054 \ + --hash=sha256:b79d41a65cfec71285433511b50271b05da3584a1da144a0752e9c621a285289 +tomli==2.0.1 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "3.11" \ + --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ + --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f tornado==6.3.3 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ --hash=sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f \ --hash=sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5 \ @@ -801,9 +887,121 @@ typing-extensions==4.8.0 ; python_version >= "3.9" and python_full_version != "3 urllib3==2.0.6 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ --hash=sha256:7a7c7003b000adf9e7ca2a377c9688bbc54ed41b985789ed576570342a375cd2 \ --hash=sha256:b19e1a85d206b56d7df1d5e683df4a7725252a964e3993648dd0fb5a1c157564 +wcwidth==0.2.8 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ + --hash=sha256:77f719e01648ed600dfa5402c347481c0992263b81a027344f3e1ba25493a704 \ + --hash=sha256:8705c569999ffbb4f6a87c6d1b80f324bd6db952f5eb0b95bc07517f4c1813d4 webencodings==0.5.1 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \ --hash=sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923 +xxhash==3.4.1 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "4.0" \ + --hash=sha256:00f2fdef6b41c9db3d2fc0e7f94cb3db86693e5c45d6de09625caad9a469635b \ + --hash=sha256:0379d6cf1ff987cd421609a264ce025e74f346e3e145dd106c0cc2e3ec3f99a9 \ + --hash=sha256:0aac5010869240e95f740de43cd6a05eae180c59edd182ad93bf12ee289484fa \ + --hash=sha256:0c786a6cd74e8765c6809892a0d45886e7c3dc54de4985b4a5eb8b630f3b8e3b \ + --hash=sha256:0e041ce5714f95251a88670c114b748bca3bf80cc72400e9f23e6d0d59cf2681 \ + --hash=sha256:10e0a619cdd1c0980e25eb04e30fe96cf8f4324758fa497080af9c21a6de573f \ + --hash=sha256:11f11357c86d83e53719c592021fd524efa9cf024dc7cb1dfb57bbbd0d8713f2 \ + --hash=sha256:1d03f1c0d16d24ea032e99f61c552cb2b77d502e545187338bea461fde253583 \ + --hash=sha256:1d0ae4c2e7698adef58710d6e7a32ff518b66b98854b1c68e70eee504ad061d8 \ + --hash=sha256:200a5a3ad9c7c0c02ed1484a1d838b63edcf92ff538770ea07456a3732c577f4 \ + --hash=sha256:2070b6d5bbef5ee031666cf21d4953c16e92c2f8a24a94b5c240f8995ba3b1d0 \ + --hash=sha256:21287bcdd299fdc3328cc0fbbdeaa46838a1c05391264e51ddb38a3f5b09611f \ + --hash=sha256:23cfd9ca09acaf07a43e5a695143d9a21bf00f5b49b15c07d5388cadf1f9ce11 \ + --hash=sha256:248d3e83d119770f96003271fe41e049dd4ae52da2feb8f832b7a20e791d2920 \ + --hash=sha256:25dc66be3db54f8a2d136f695b00cfe88018e59ccff0f3b8f545869f376a8a46 \ + --hash=sha256:2a8ba6181514681c2591840d5632fcf7356ab287d4aff1c8dea20f3c78097088 \ + --hash=sha256:2be491723405e15cc099ade1280133ccfbf6322d2ef568494fb7d07d280e7eee \ + --hash=sha256:312eba88ffe0a05e332e3a6f9788b73883752be63f8588a6dc1261a3eaaaf2b2 \ + --hash=sha256:36ad4457644c91a966f6fe137d7467636bdc51a6ce10a1d04f365c70d6a16d7e \ + --hash=sha256:3b685fab18876b14a8f94813fa2ca80cfb5ab6a85d31d5539b7cd749ce9e3624 \ + --hash=sha256:4178f78d70e88f1c4a89ff1ffe9f43147185930bb962ee3979dba15f2b1cc799 \ + --hash=sha256:419ffe34c17ae2df019a4685e8d3934d46b2e0bbe46221ab40b7e04ed9f11137 \ + --hash=sha256:41ddeae47cf2828335d8d991f2d2b03b0bdc89289dc64349d712ff8ce59d0647 \ + --hash=sha256:431625fad7ab5649368c4849d2b49a83dc711b1f20e1f7f04955aab86cd307bc \ + --hash=sha256:43984c0a92f06cac434ad181f329a1445017c33807b7ae4f033878d860a4b0f2 \ + --hash=sha256:450401f42bbd274b519d3d8dcf3c57166913381a3d2664d6609004685039f9d3 \ + --hash=sha256:4603a0f642a1e8d7f3ba5c4c25509aca6a9c1cc16f85091004a7028607ead663 \ + --hash=sha256:4c76a77dbd169450b61c06fd2d5d436189fc8ab7c1571d39265d4822da16df22 \ + --hash=sha256:4cb11d8debab1626181633d184b2372aaa09825bde709bf927704ed72765bed1 \ + --hash=sha256:543c7fcbc02bbb4840ea9915134e14dc3dc15cbd5a30873a7a5bf66039db97ec \ + --hash=sha256:562d8b8f783c6af969806aaacf95b6c7b776929ae26c0cd941d54644ea7ef51e \ + --hash=sha256:58c49083801885273e262c0f5bbeac23e520564b8357fbb18fb94ff09d3d3ea5 \ + --hash=sha256:595b252943b3552de491ff51e5bb79660f84f033977f88f6ca1605846637b7c6 \ + --hash=sha256:5bef2a7dc7b4f4beb45a1edbba9b9194c60a43a89598a87f1a0226d183764189 \ + --hash=sha256:5dab508ac39e0ab988039bc7f962c6ad021acd81fd29145962b068df4148c476 \ + --hash=sha256:6066d88c9329ab230e18998daec53d819daeee99d003955c8db6fc4971b45ca3 \ + --hash=sha256:6127813abc1477f3a83529b6bbcfeddc23162cece76fa69aee8f6a8a97720562 \ + --hash=sha256:64da57d5ed586ebb2ecdde1e997fa37c27fe32fe61a656b77fabbc58e6fbff6e \ + --hash=sha256:665a65c2a48a72068fcc4d21721510df5f51f1142541c890491afc80451636d2 \ + --hash=sha256:672b273040d5d5a6864a36287f3514efcd1d4b1b6a7480f294c4b1d1ee1b8de0 \ + --hash=sha256:696b4e18b7023527d5c50ed0626ac0520edac45a50ec7cf3fc265cd08b1f4c03 \ + --hash=sha256:6a9ff50a3cf88355ca4731682c168049af1ca222d1d2925ef7119c1a78e95b3b \ + --hash=sha256:6d3472fd4afef2a567d5f14411d94060099901cd8ce9788b22b8c6f13c606a93 \ + --hash=sha256:6d42b24d1496deb05dee5a24ed510b16de1d6c866c626c2beb11aebf3be278b9 \ + --hash=sha256:6e66df260fed01ed8ea790c2913271641c58481e807790d9fca8bfd5a3c13844 \ + --hash=sha256:6fa45e8cbfbadb40a920fe9ca40c34b393e0b067082d94006f7f64e70c7490a6 \ + --hash=sha256:719a378930504ab159f7b8e20fa2aa1896cde050011af838af7e7e3518dd82de \ + --hash=sha256:71be94265b6c6590f0018bbf73759d21a41c6bda20409782d8117e76cd0dfa8b \ + --hash=sha256:743612da4071ff9aa4d055f3f111ae5247342931dedb955268954ef7201a71ff \ + --hash=sha256:74fb5cb9406ccd7c4dd917f16630d2e5e8cbbb02fc2fca4e559b2a47a64f4940 \ + --hash=sha256:7688d7c02149a90a3d46d55b341ab7ad1b4a3f767be2357e211b4e893efbaaf6 \ + --hash=sha256:7a97322e9a7440bf3c9805cbaac090358b43f650516486746f7fa482672593df \ + --hash=sha256:8106d88da330f6535a58a8195aa463ef5281a9aa23b04af1848ff715c4398fb4 \ + --hash=sha256:8c59f3e46e7daf4c589e8e853d700ef6607afa037bfad32c390175da28127e8c \ + --hash=sha256:8cc07256eff0795e0f642df74ad096f8c5d23fe66bc138b83970b50fc7f7f6c5 \ + --hash=sha256:911035345932a153c427107397c1518f8ce456f93c618dd1c5b54ebb22e73747 \ + --hash=sha256:91dbfa55346ad3e18e738742236554531a621042e419b70ad8f3c1d9c7a16e7f \ + --hash=sha256:92693c487e39523a80474b0394645b393f0ae781d8db3474ccdcead0559ccf45 \ + --hash=sha256:93805bc3233ad89abf51772f2ed3355097a5dc74e6080de19706fc447da99cd3 \ + --hash=sha256:961d948b7b1c1b6c08484bbce3d489cdf153e4122c3dfb07c2039621243d8795 \ + --hash=sha256:9804b9eb254d4b8cc83ab5a2002128f7d631dd427aa873c8727dba7f1f0d1c2b \ + --hash=sha256:9c0f7b2d547d72c7eda7aa817acf8791f0146b12b9eba1d4432c531fb0352228 \ + --hash=sha256:9ecb6c987b62437c2f99c01e97caf8d25660bf541fe79a481d05732e5236719c \ + --hash=sha256:9f3025a0d5d8cf406a9313cd0d5789c77433ba2004b1c75439b67678e5136537 \ + --hash=sha256:9fd28a9da300e64e434cfc96567a8387d9a96e824a9be1452a1e7248b7763b78 \ + --hash=sha256:a15cbf3a9c40672523bdb6ea97ff74b443406ba0ab9bca10ceccd9546414bd84 \ + --hash=sha256:a162840cf4de8a7cd8720ff3b4417fbc10001eefdd2d21541a8226bb5556e3bb \ + --hash=sha256:a55e0506fdb09640a82ec4f44171273eeabf6f371a4ec605633adb2837b5d9d5 \ + --hash=sha256:a8b4977963926f60b0d4f830941c864bed16aa151206c01ad5c531636da5708e \ + --hash=sha256:a90356ead70d715fe64c30cd0969072de1860e56b78adf7c69d954b43e29d9fa \ + --hash=sha256:aabf37fb8fa27430d50507deeab2ee7b1bcce89910dd10657c38e71fee835594 \ + --hash=sha256:ac56eebb364e44c85e1d9e9cc5f6031d78a34f0092fea7fc80478139369a8b4a \ + --hash=sha256:b2746035f518f0410915e247877f7df43ef3372bf36cfa52cc4bc33e85242641 \ + --hash=sha256:b29728cff2c12f3d9f1d940528ee83918d803c0567866e062683f300d1d2eff3 \ + --hash=sha256:b41edaf05734092f24f48c0958b3c6cbaaa5b7e024880692078c6b1f8247e2fc \ + --hash=sha256:b526015a973bfbe81e804a586b703f163861da36d186627e27524f5427b0d520 \ + --hash=sha256:b5beb1c6a72fdc7584102f42c4d9df232ee018ddf806e8c90906547dfb43b2da \ + --hash=sha256:b736a2a2728ba45017cb67785e03125a79d246462dfa892d023b827007412c52 \ + --hash=sha256:b9097af00ebf429cc7c0e7d2fdf28384e4e2e91008130ccda8d5ae653db71e54 \ + --hash=sha256:bb11628470a6004dc71a09fe90c2f459ff03d611376c1debeec2d648f44cb693 \ + --hash=sha256:bbe750d512982ee7d831838a5dee9e9848f3fb440e4734cca3f298228cc957a6 \ + --hash=sha256:c09c49473212d9c87261d22c74370457cfff5db2ddfc7fd1e35c80c31a8c14ce \ + --hash=sha256:c44d584afdf3c4dbb3277e32321d1a7b01d6071c1992524b6543025fb8f4206f \ + --hash=sha256:c4bbba9b182697a52bc0c9f8ec0ba1acb914b4937cd4a877ad78a3b3eeabefb3 \ + --hash=sha256:c9e1b646af61f1fc7083bb7b40536be944f1ac67ef5e360bca2d73430186971a \ + --hash=sha256:ca7783b20e3e4f3f52f093538895863f21d18598f9a48211ad757680c3bd006f \ + --hash=sha256:d6322c4291c3ff174dcd104fae41500e75dad12be6f3085d119c2c8a80956c51 \ + --hash=sha256:d699b921af0dcde50ab18be76c0d832f803034d80470703700cb7df0fbec2832 \ + --hash=sha256:d77d09a1113899fad5f354a1eb4f0a9afcf58cefff51082c8ad643ff890e30cf \ + --hash=sha256:dd59ed668801c3fae282f8f4edadf6dc7784db6d18139b584b6d9677ddde1b6b \ + --hash=sha256:dfd7a6cc483e20b4ad90224aeb589e64ec0f31e5610ab9957ff4314270b2bf31 \ + --hash=sha256:e01226b6b6a1ffe4e6bd6d08cfcb3ca708b16f02eb06dd44f3c6e53285f03e4f \ + --hash=sha256:e17032f5a4fea0a074717fe33477cb5ee723a5f428de7563e75af64bfc1b1e10 \ + --hash=sha256:e867f68a8f381ea12858e6d67378c05359d3a53a888913b5f7d35fbf68939d5f \ + --hash=sha256:e9f749999ed80f3955a4af0eb18bb43993f04939350b07b8dd2f44edc98ffee9 \ + --hash=sha256:ebbb1616435b4a194ce3466d7247df23499475c7ed4eb2681a1fa42ff766aff6 \ + --hash=sha256:ef2e194262f5db16075caea7b3f7f49392242c688412f386d3c7b07c7733a70a \ + --hash=sha256:ef73a53fe90558a4096e3256752268a8bdc0322f4692ed928b6cd7ce06ad4fe3 \ + --hash=sha256:f1d7c69a1e9ca5faa75546fdd267f214f63f52f12692f9b3a2f6467c9e67d5e7 \ + --hash=sha256:f31ce76489f8601cc7b8713201ce94b4bd7b7ce90ba3353dccce7e9e1fee71fa \ + --hash=sha256:f3ff8dbd0ec97aec842476cb8ccc3e17dd288cd6ce3c8ef38bff83d6eb927817 \ + --hash=sha256:fa122124d2e3bd36581dd78c0efa5f429f5220313479fb1072858188bc2d5ff1 \ + --hash=sha256:faec30437919555b039a8bdbaba49c013043e8f76c999670aef146d33e05b3a0 \ + --hash=sha256:fc6dbd5fc3c9886a9e041848508b7fb65fd82f94cc793253990f81617b61fe49 \ + --hash=sha256:fc860d887c5cb2f524899fb8338e1bb3d5789f75fac179101920d9afddef284b \ + --hash=sha256:fd79d4087727daf4d5b8afe594b37d611ab95dc8e29fe1a7517320794837eb7d \ + --hash=sha256:fd7bddb3a5b86213cc3f2c61500c16945a1b80ecd572f3078ddbbe68f9dabdfb \ + --hash=sha256:fe0a98d990e433013f41827b62be9ab43e3cf18e08b1483fcc343bda0d691182 zipp==3.17.0 ; python_version >= "3.9" and python_full_version != "3.9.7" and python_version < "3.10" \ --hash=sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 \ --hash=sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0 diff --git a/poetry.lock b/poetry.lock index ba2eede..56d5b63 100644 --- a/poetry.lock +++ b/poetry.lock @@ -4780,6 +4780,123 @@ files = [ {file = "widgetsnbextension-4.0.9.tar.gz", hash = "sha256:3c1f5e46dc1166dfd40a42d685e6a51396fd34ff878742a3e47c6f0cc4a2a385"}, ] +[[package]] +name = "xxhash" +version = "3.4.1" +description = "Python binding for xxHash" +optional = false +python-versions = ">=3.7" +files = [ + {file = "xxhash-3.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:91dbfa55346ad3e18e738742236554531a621042e419b70ad8f3c1d9c7a16e7f"}, + {file = "xxhash-3.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:665a65c2a48a72068fcc4d21721510df5f51f1142541c890491afc80451636d2"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb11628470a6004dc71a09fe90c2f459ff03d611376c1debeec2d648f44cb693"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5bef2a7dc7b4f4beb45a1edbba9b9194c60a43a89598a87f1a0226d183764189"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c0f7b2d547d72c7eda7aa817acf8791f0146b12b9eba1d4432c531fb0352228"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00f2fdef6b41c9db3d2fc0e7f94cb3db86693e5c45d6de09625caad9a469635b"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23cfd9ca09acaf07a43e5a695143d9a21bf00f5b49b15c07d5388cadf1f9ce11"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6a9ff50a3cf88355ca4731682c168049af1ca222d1d2925ef7119c1a78e95b3b"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f1d7c69a1e9ca5faa75546fdd267f214f63f52f12692f9b3a2f6467c9e67d5e7"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:672b273040d5d5a6864a36287f3514efcd1d4b1b6a7480f294c4b1d1ee1b8de0"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4178f78d70e88f1c4a89ff1ffe9f43147185930bb962ee3979dba15f2b1cc799"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9804b9eb254d4b8cc83ab5a2002128f7d631dd427aa873c8727dba7f1f0d1c2b"}, + {file = "xxhash-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c09c49473212d9c87261d22c74370457cfff5db2ddfc7fd1e35c80c31a8c14ce"}, + {file = "xxhash-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:ebbb1616435b4a194ce3466d7247df23499475c7ed4eb2681a1fa42ff766aff6"}, + {file = "xxhash-3.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:25dc66be3db54f8a2d136f695b00cfe88018e59ccff0f3b8f545869f376a8a46"}, + {file = "xxhash-3.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:58c49083801885273e262c0f5bbeac23e520564b8357fbb18fb94ff09d3d3ea5"}, + {file = "xxhash-3.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b526015a973bfbe81e804a586b703f163861da36d186627e27524f5427b0d520"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36ad4457644c91a966f6fe137d7467636bdc51a6ce10a1d04f365c70d6a16d7e"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:248d3e83d119770f96003271fe41e049dd4ae52da2feb8f832b7a20e791d2920"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2070b6d5bbef5ee031666cf21d4953c16e92c2f8a24a94b5c240f8995ba3b1d0"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2746035f518f0410915e247877f7df43ef3372bf36cfa52cc4bc33e85242641"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a8ba6181514681c2591840d5632fcf7356ab287d4aff1c8dea20f3c78097088"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aac5010869240e95f740de43cd6a05eae180c59edd182ad93bf12ee289484fa"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4cb11d8debab1626181633d184b2372aaa09825bde709bf927704ed72765bed1"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b29728cff2c12f3d9f1d940528ee83918d803c0567866e062683f300d1d2eff3"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:a15cbf3a9c40672523bdb6ea97ff74b443406ba0ab9bca10ceccd9546414bd84"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6e66df260fed01ed8ea790c2913271641c58481e807790d9fca8bfd5a3c13844"}, + {file = "xxhash-3.4.1-cp311-cp311-win32.whl", hash = "sha256:e867f68a8f381ea12858e6d67378c05359d3a53a888913b5f7d35fbf68939d5f"}, + {file = "xxhash-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:200a5a3ad9c7c0c02ed1484a1d838b63edcf92ff538770ea07456a3732c577f4"}, + {file = "xxhash-3.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:1d03f1c0d16d24ea032e99f61c552cb2b77d502e545187338bea461fde253583"}, + {file = "xxhash-3.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c4bbba9b182697a52bc0c9f8ec0ba1acb914b4937cd4a877ad78a3b3eeabefb3"}, + {file = "xxhash-3.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9fd28a9da300e64e434cfc96567a8387d9a96e824a9be1452a1e7248b7763b78"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6066d88c9329ab230e18998daec53d819daeee99d003955c8db6fc4971b45ca3"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93805bc3233ad89abf51772f2ed3355097a5dc74e6080de19706fc447da99cd3"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64da57d5ed586ebb2ecdde1e997fa37c27fe32fe61a656b77fabbc58e6fbff6e"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a97322e9a7440bf3c9805cbaac090358b43f650516486746f7fa482672593df"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbe750d512982ee7d831838a5dee9e9848f3fb440e4734cca3f298228cc957a6"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fd79d4087727daf4d5b8afe594b37d611ab95dc8e29fe1a7517320794837eb7d"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:743612da4071ff9aa4d055f3f111ae5247342931dedb955268954ef7201a71ff"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:b41edaf05734092f24f48c0958b3c6cbaaa5b7e024880692078c6b1f8247e2fc"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:a90356ead70d715fe64c30cd0969072de1860e56b78adf7c69d954b43e29d9fa"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ac56eebb364e44c85e1d9e9cc5f6031d78a34f0092fea7fc80478139369a8b4a"}, + {file = "xxhash-3.4.1-cp312-cp312-win32.whl", hash = "sha256:911035345932a153c427107397c1518f8ce456f93c618dd1c5b54ebb22e73747"}, + {file = "xxhash-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:f31ce76489f8601cc7b8713201ce94b4bd7b7ce90ba3353dccce7e9e1fee71fa"}, + {file = "xxhash-3.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:b5beb1c6a72fdc7584102f42c4d9df232ee018ddf806e8c90906547dfb43b2da"}, + {file = "xxhash-3.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6d42b24d1496deb05dee5a24ed510b16de1d6c866c626c2beb11aebf3be278b9"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b685fab18876b14a8f94813fa2ca80cfb5ab6a85d31d5539b7cd749ce9e3624"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:419ffe34c17ae2df019a4685e8d3934d46b2e0bbe46221ab40b7e04ed9f11137"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e041ce5714f95251a88670c114b748bca3bf80cc72400e9f23e6d0d59cf2681"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc860d887c5cb2f524899fb8338e1bb3d5789f75fac179101920d9afddef284b"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:312eba88ffe0a05e332e3a6f9788b73883752be63f8588a6dc1261a3eaaaf2b2"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e01226b6b6a1ffe4e6bd6d08cfcb3ca708b16f02eb06dd44f3c6e53285f03e4f"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9f3025a0d5d8cf406a9313cd0d5789c77433ba2004b1c75439b67678e5136537"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:6d3472fd4afef2a567d5f14411d94060099901cd8ce9788b22b8c6f13c606a93"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:43984c0a92f06cac434ad181f329a1445017c33807b7ae4f033878d860a4b0f2"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a55e0506fdb09640a82ec4f44171273eeabf6f371a4ec605633adb2837b5d9d5"}, + {file = "xxhash-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:faec30437919555b039a8bdbaba49c013043e8f76c999670aef146d33e05b3a0"}, + {file = "xxhash-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:c9e1b646af61f1fc7083bb7b40536be944f1ac67ef5e360bca2d73430186971a"}, + {file = "xxhash-3.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:961d948b7b1c1b6c08484bbce3d489cdf153e4122c3dfb07c2039621243d8795"}, + {file = "xxhash-3.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:719a378930504ab159f7b8e20fa2aa1896cde050011af838af7e7e3518dd82de"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74fb5cb9406ccd7c4dd917f16630d2e5e8cbbb02fc2fca4e559b2a47a64f4940"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5dab508ac39e0ab988039bc7f962c6ad021acd81fd29145962b068df4148c476"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c59f3e46e7daf4c589e8e853d700ef6607afa037bfad32c390175da28127e8c"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cc07256eff0795e0f642df74ad096f8c5d23fe66bc138b83970b50fc7f7f6c5"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9f749999ed80f3955a4af0eb18bb43993f04939350b07b8dd2f44edc98ffee9"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7688d7c02149a90a3d46d55b341ab7ad1b4a3f767be2357e211b4e893efbaaf6"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a8b4977963926f60b0d4f830941c864bed16aa151206c01ad5c531636da5708e"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:8106d88da330f6535a58a8195aa463ef5281a9aa23b04af1848ff715c4398fb4"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4c76a77dbd169450b61c06fd2d5d436189fc8ab7c1571d39265d4822da16df22"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:11f11357c86d83e53719c592021fd524efa9cf024dc7cb1dfb57bbbd0d8713f2"}, + {file = "xxhash-3.4.1-cp38-cp38-win32.whl", hash = "sha256:0c786a6cd74e8765c6809892a0d45886e7c3dc54de4985b4a5eb8b630f3b8e3b"}, + {file = "xxhash-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:aabf37fb8fa27430d50507deeab2ee7b1bcce89910dd10657c38e71fee835594"}, + {file = "xxhash-3.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6127813abc1477f3a83529b6bbcfeddc23162cece76fa69aee8f6a8a97720562"}, + {file = "xxhash-3.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef2e194262f5db16075caea7b3f7f49392242c688412f386d3c7b07c7733a70a"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71be94265b6c6590f0018bbf73759d21a41c6bda20409782d8117e76cd0dfa8b"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10e0a619cdd1c0980e25eb04e30fe96cf8f4324758fa497080af9c21a6de573f"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa122124d2e3bd36581dd78c0efa5f429f5220313479fb1072858188bc2d5ff1"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17032f5a4fea0a074717fe33477cb5ee723a5f428de7563e75af64bfc1b1e10"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca7783b20e3e4f3f52f093538895863f21d18598f9a48211ad757680c3bd006f"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d77d09a1113899fad5f354a1eb4f0a9afcf58cefff51082c8ad643ff890e30cf"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:21287bcdd299fdc3328cc0fbbdeaa46838a1c05391264e51ddb38a3f5b09611f"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:dfd7a6cc483e20b4ad90224aeb589e64ec0f31e5610ab9957ff4314270b2bf31"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:543c7fcbc02bbb4840ea9915134e14dc3dc15cbd5a30873a7a5bf66039db97ec"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fe0a98d990e433013f41827b62be9ab43e3cf18e08b1483fcc343bda0d691182"}, + {file = "xxhash-3.4.1-cp39-cp39-win32.whl", hash = "sha256:b9097af00ebf429cc7c0e7d2fdf28384e4e2e91008130ccda8d5ae653db71e54"}, + {file = "xxhash-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:d699b921af0dcde50ab18be76c0d832f803034d80470703700cb7df0fbec2832"}, + {file = "xxhash-3.4.1-cp39-cp39-win_arm64.whl", hash = "sha256:2be491723405e15cc099ade1280133ccfbf6322d2ef568494fb7d07d280e7eee"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:431625fad7ab5649368c4849d2b49a83dc711b1f20e1f7f04955aab86cd307bc"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc6dbd5fc3c9886a9e041848508b7fb65fd82f94cc793253990f81617b61fe49"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ff8dbd0ec97aec842476cb8ccc3e17dd288cd6ce3c8ef38bff83d6eb927817"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef73a53fe90558a4096e3256752268a8bdc0322f4692ed928b6cd7ce06ad4fe3"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:450401f42bbd274b519d3d8dcf3c57166913381a3d2664d6609004685039f9d3"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a162840cf4de8a7cd8720ff3b4417fbc10001eefdd2d21541a8226bb5556e3bb"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b736a2a2728ba45017cb67785e03125a79d246462dfa892d023b827007412c52"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d0ae4c2e7698adef58710d6e7a32ff518b66b98854b1c68e70eee504ad061d8"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6322c4291c3ff174dcd104fae41500e75dad12be6f3085d119c2c8a80956c51"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:dd59ed668801c3fae282f8f4edadf6dc7784db6d18139b584b6d9677ddde1b6b"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:92693c487e39523a80474b0394645b393f0ae781d8db3474ccdcead0559ccf45"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4603a0f642a1e8d7f3ba5c4c25509aca6a9c1cc16f85091004a7028607ead663"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fa45e8cbfbadb40a920fe9ca40c34b393e0b067082d94006f7f64e70c7490a6"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:595b252943b3552de491ff51e5bb79660f84f033977f88f6ca1605846637b7c6"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:562d8b8f783c6af969806aaacf95b6c7b776929ae26c0cd941d54644ea7ef51e"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:41ddeae47cf2828335d8d991f2d2b03b0bdc89289dc64349d712ff8ce59d0647"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c44d584afdf3c4dbb3277e32321d1a7b01d6071c1992524b6543025fb8f4206f"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd7bddb3a5b86213cc3f2c61500c16945a1b80ecd572f3078ddbbe68f9dabdfb"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ecb6c987b62437c2f99c01e97caf8d25660bf541fe79a481d05732e5236719c"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:696b4e18b7023527d5c50ed0626ac0520edac45a50ec7cf3fc265cd08b1f4c03"}, + {file = "xxhash-3.4.1.tar.gz", hash = "sha256:0379d6cf1ff987cd421609a264ce025e74f346e3e145dd106c0cc2e3ec3f99a9"}, +] + [[package]] name = "zipp" version = "3.17.0" @@ -4798,4 +4915,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.9.7 || >3.9.7,<4.0" -content-hash = "b957e415f65376eb85aeeaacb9389be6f0d3128b5e9f3c1bd29e4d6bc898c536" +content-hash = "ce63a8a96221ad1352afcd6ed48699a67b81ada5d5c6defc99c0452796948c66" diff --git a/pyproject.toml b/pyproject.toml index 66b6a6d..1f67f54 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,6 +30,7 @@ lxml = "^4.9.3" httpx = "^0.24.1" cssutils = "^2.7.1" python-dotenv = "^1.0.0" +xxhash = "^3.4.1" [tool.poetry.group.dev.dependencies] diff --git a/sec_parser/processing_engine/html_tag.py b/sec_parser/processing_engine/html_tag.py index a17444d..8636daa 100644 --- a/sec_parser/processing_engine/html_tag.py +++ b/sec_parser/processing_engine/html_tag.py @@ -3,12 +3,16 @@ import warnings import bs4 +import xxhash +from frozendict import frozendict from sec_parser.exceptions import SecParserValueError from sec_parser.utils.bs4_.contains_tag import contains_tag from sec_parser.utils.bs4_.is_unary_tree import is_unary_tree from sec_parser.utils.bs4_.text_styles_metrics import compute_text_styles_metrics +TEXT_PREVIEW_LENGTH = 40 + class HtmlTag: """ @@ -41,6 +45,37 @@ def __init__( self._is_unary_tree: bool | None = None self._first_deepest_tag: HtmlTag | None | NotSetType = NotSet self._text_styles_metrics: dict[tuple[str, str], float] | None = None + self._frozen_dict: frozendict | None = None + self._source_code: str | None = None + + def get_source_code(self) -> str: + if self._source_code is None: + self._source_code = str(self._bs4) + return self._source_code + + def _generate_preview(self, text: str) -> str: + """Generate a preview of the text with a specified length.""" + text = text.replace("\n", " ").strip() + return ( + text[: TEXT_PREVIEW_LENGTH // 2] + + f"...[{len(text) - TEXT_PREVIEW_LENGTH}]..." + + text[-TEXT_PREVIEW_LENGTH // 2 :] + if len(text) > TEXT_PREVIEW_LENGTH + else text + ) + + def to_dict(self) -> frozendict: + """Compute the hash of the HTML tag.""" + if self._frozen_dict is None: + self._frozen_dict = frozendict( + { + "tag_name": self._bs4.name, + "text_preview": self._generate_preview(self.get_text()), + "html_preview": self._generate_preview(self.get_source_code()), + "html_hash": xxhash.xxh32(self.get_source_code()).hexdigest(), + }, + ) + return self._frozen_dict def get_text(self) -> str: """ diff --git a/sec_parser/semantic_elements/abstract_semantic_element.py b/sec_parser/semantic_elements/abstract_semantic_element.py index 8045e71..4a2d0ea 100644 --- a/sec_parser/semantic_elements/abstract_semantic_element.py +++ b/sec_parser/semantic_elements/abstract_semantic_element.py @@ -1,7 +1,7 @@ from __future__ import annotations from abc import ABC -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Any from sec_parser.exceptions import SecParserValueError @@ -37,8 +37,14 @@ def convert_from( """Convert the semantic element into another semantic element type.""" return cls(source.html_tag) + def to_dict(self) -> dict[str, Any]: + return { + "cls_name": self.__class__.__name__, + **self.html_tag.to_dict(), + } -class AbstractLevelElement(AbstractSemanticElement, ABC): + +class AbstractLevelElement(AbstractSemanticElement): """ The AbstractLevelElement class provides a level attribute to semantic elements. It represents hierarchical levels in the document structure. For instance, @@ -69,6 +75,12 @@ def convert_from( ) -> AbstractLevelElement: return cls(source.html_tag, level=level) + def to_dict(self) -> dict[str, Any]: + return { + **super().to_dict(), + "level": self.level, + } + class InvalidLevelError(SecParserValueError): pass diff --git a/sec_parser/semantic_elements/composite_semantic_element.py b/sec_parser/semantic_elements/composite_semantic_element.py index cc9125f..4dff567 100644 --- a/sec_parser/semantic_elements/composite_semantic_element.py +++ b/sec_parser/semantic_elements/composite_semantic_element.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Any from sec_parser.semantic_elements.abstract_semantic_element import ( AbstractSemanticElement, @@ -65,3 +65,9 @@ def convert_from( html_tag=source.html_tag, inner_elements=inner_elements, ) + + def to_dict(self) -> dict[str, Any]: + return { + **super().to_dict(), + "inner_elements": len(self.inner_elements), + } diff --git a/sec_parser/semantic_elements/highlighted_text_element.py b/sec_parser/semantic_elements/highlighted_text_element.py index b6ddae2..d291ce8 100644 --- a/sec_parser/semantic_elements/highlighted_text_element.py +++ b/sec_parser/semantic_elements/highlighted_text_element.py @@ -1,7 +1,7 @@ from __future__ import annotations from dataclasses import asdict, dataclass -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Any from sec_parser.semantic_elements.abstract_semantic_element import ( AbstractSemanticElement, @@ -42,6 +42,12 @@ def convert_from( style=style, ) + def to_dict(self) -> dict[str, Any]: + return { + **super().to_dict(), + "text_style": asdict(self.style), + } + @dataclass(frozen=True) class TextStyle: diff --git a/tests/e2e/__init__.py b/tests/e2e/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/e2e/_metrics.py b/tests/e2e/_metrics.py deleted file mode 100644 index fb026b1..0000000 --- a/tests/e2e/_metrics.py +++ /dev/null @@ -1,86 +0,0 @@ -from __future__ import annotations - -from statistics import mean, median, stdev - -import numpy as np -from millify import millify - - -class Metric: - def __init__(self, name="Undefined", style="dim", justify="right") -> None: - self.name = name - self.style = style - self.justify = justify - - def calculate(self, times, char_count): - raise NotImplementedError # pragma: no cover - - def visualize(self, value): - return f"{value:.3f}" - - -class MinTime(Metric): - def calculate(self, times, char_count): - return min(times) - - -class MaxTime(Metric): - def calculate(self, times, char_count): - return max(times) - - -class Average(Metric): - def calculate(self, times, char_count): - return mean(times) - - def visualize(self, value): - return f"[bold]{value:.3f}[/bold]" - - -class Median(Metric): - def calculate(self, times, char_count): - return median(times) - - -class P99(Metric): - def calculate(self, times, char_count): - return np.percentile(times, 99) - - -class StdDev(Metric): - def calculate(self, times, char_count): - return stdev(times) - - -class Threshold(Metric): - def __init__( - self, microsecond_threshold, name="Undefined", style="dim", justify="right" - ) -> None: - super().__init__(name, style, justify) - self.microsecond_threshold = microsecond_threshold - - def calculate(self, times, char_count): - return char_count * self.microsecond_threshold / 1_000_000 - - -class RatioMetric(Metric): - def __init__(self, metric1, metric2, name, style="dim", justify="right") -> None: - super().__init__(name, style, justify) - self.metric1 = metric1 - self.metric2 = metric2 - - def calculate(self, times, char_count, metrics): - value1 = metrics[self.metric1.name] - value2 = metrics[self.metric2.name] - return (value1 / value2) * 100 - - def visualize(self, value): - return f"{value:.0f} %" - - -class Size(Metric): - def calculate(self, times, char_count): - return char_count - - def visualize(self, value): - return millify(value) diff --git a/tests/e2e/sec_parser.py b/tests/e2e/sec_parser.py deleted file mode 100644 index ed223c0..0000000 --- a/tests/e2e/sec_parser.py +++ /dev/null @@ -1,246 +0,0 @@ -from __future__ import annotations - -import hashlib -import multiprocessing -import sys -import time -from multiprocessing import Manager, Pool -from pathlib import Path - -from rich import print -from rich.console import Console -from rich.table import Table - -import sec_parser as sp -from tests.e2e._metrics import ( - P99, - Average, - MaxTime, - Median, - RatioMetric, - Size, - Threshold, -) - -# Specify the metric that determines the test outcome -# A test will pass or fail based on this metric -TEST_METRIC = "Average/Threshold" -TEST_METRIC_SINGLE_RUN = "Time/Threshold" - -ALLOWED_MICROSECONDS_PER_CHAR = 1 - -DEFAULT_TESTS_PER_CORE = 2 - -# Define metrics to be used -METRICS = [ - Average("Average", "blue"), - Threshold(ALLOWED_MICROSECONDS_PER_CHAR, "Threshold", "blue"), - RatioMetric( - Average("Average"), - Threshold(ALLOWED_MICROSECONDS_PER_CHAR, "Threshold"), - "Average/Threshold", - "blue", - ), - Median("Median", "dim"), - P99("P99", "dim"), - MaxTime("Max Time", "dim"), - Size("Size", "dim"), -] - -METRICS_SINGLE_RUN = [ - Average("Time", "blue"), - Threshold(ALLOWED_MICROSECONDS_PER_CHAR, "Threshold", "blue"), - RatioMetric( - Average("Time"), - Threshold(ALLOWED_MICROSECONDS_PER_CHAR, "Threshold"), - "Time/Threshold", - "blue", - ), - Size("Size", "dim"), -] - - -# Function to get document name from hash -def get_document_name(document_hash, hash_to_filename): - return hash_to_filename.get(document_hash, document_hash) - - -# Function to execute a single test -def execute_test(html_input, execution_times): - start_time = time.time() - elements = sp.SecParser().parse(html_input) - tree = sp.TreeBuilder().build(elements) - assert len(tree.root_nodes) - elapsed_time = time.time() - start_time - - html_hash = hashlib.sha256(html_input.encode()).hexdigest() - execution_times[html_hash].append(elapsed_time) - - -# Function to execute multiple tests -def execute_multiple_tests(html_inputs, execution_times): - for html_input in html_inputs: - execute_test(html_input, execution_times) - - -# Function to render the results table -def render_table(METRICS, metrics, hash_to_filename): - console = Console() - - # Initialize table with headers - table = Table(show_header=True, header_style="bold magenta") - table.add_column("Document", style="dim", justify="right") - for metric in METRICS: - table.add_column(metric.name, style=metric.style, justify=metric.justify) - - # Populate table with rows - for document_hash, metric_values in metrics.items(): - document_name = get_document_name(document_hash, hash_to_filename) - row_data = [document_name] - for metric in METRICS: - value = metric_values[metric.name] - row_data.append(metric.visualize(value)) - table.add_row(*row_data) - - # Display the table in the terminal - console.print(table) - - -# Main execution -if __name__ == "__main__": - tests_per_core = DEFAULT_TESTS_PER_CORE - core_count: int | None = None - - # Integer variable to limit the number of documents to test. - # For example, set to 1 for a quick smoke test. - limit_documents: int | None = None - - for arg in sys.argv[1:]: - if arg.startswith("--tests-per-core="): - tests_per_core = int(arg.partition("=")[2]) - elif arg.startswith("--cores="): - core_count = int(arg.partition("=")[2]) - elif arg.startswith("--limit-documents="): - limit_documents = int(arg.partition("=")[2]) - - if core_count is None: - core_count = multiprocessing.cpu_count() - - if core_count == 1 and tests_per_core == 1: - METRICS = METRICS_SINGLE_RUN - TEST_METRIC = TEST_METRIC_SINGLE_RUN - - # Load test data - test_data_htmls = {} - test_data_path = Path(__file__).parent / "test_data" - hash_to_filename = {} - file_counter = 0 - for html_file in test_data_path.glob("10q_*.html"): - with open(html_file) as file: - file_content = file.read() - test_data_htmls[html_file.name] = file_content - hash_key = hashlib.sha256(file_content.encode()).hexdigest() - hash_to_filename[hash_key] = html_file.name # Populate the mapping - file_counter += 1 - if limit_documents is not None and file_counter >= limit_documents: - break - if file_counter == 0: - msg = "No test data found" - raise ValueError(msg) - - # Calculate number of tests - tests_per_file = core_count * tests_per_core - total_tests_ran = tests_per_file * file_counter - - # Prepare test data - example_htmls: list[str] = list(test_data_htmls.values()) * tests_per_file - - # Initialize shared data structures - manager = Manager() - execution_times = manager.dict( - { - hashlib.sha256(doc.encode()).hexdigest(): manager.list() - for doc in example_htmls - }, - ) - - # Execute tests in parallel - with Pool(processes=core_count) as pool: - pool.starmap( - execute_multiple_tests, - [ - (example_htmls[i::core_count], execution_times) - for i in range(core_count) - ], - ) - - # Initialize metrics and failed documents list - metrics = {} - failed_documents = [] - - # Calculate metrics for each document - for document_hash, times in execution_times.items(): - times = list(times) - if not times: - continue # Skip if no timing data collected - - # Find the document corresponding to the hash - example_doc = next( - ( - doc - for doc in example_htmls - if hashlib.sha256(doc.encode()).hexdigest() == document_hash - ), - None, - ) - if example_doc is None: - msg = f"Could not find document with hash {document_hash}" - raise Exception(msg) - char_count = len(example_doc) - - # Calculate each metric for the document - metrics[document_hash] = {} - for metric in METRICS: - if isinstance(metric, RatioMetric): - metrics[document_hash][metric.name] = metric.calculate( - times, char_count, metrics[document_hash], - ) - else: - metrics[document_hash][metric.name] = metric.calculate( - times, char_count, - ) - - # Check if the document failed the threshold - if metrics[document_hash][TEST_METRIC] > 100: - failed_documents.append(document_hash) - - - # Print initial information - if METRICS != METRICS_SINGLE_RUN: - print( - f"- Each document underwent [bold]{tests_per_file}[/bold] tests, totaling [bold]{total_tests_ran}[/bold] tests across [bold]{core_count}[/bold] cores.", - "- The 'Threshold' in the table signifies the maximum allowable parsing time (in seconds) per document.", - f"- This threshold was determined based on a set rate of [bold]{ALLOWED_MICROSECONDS_PER_CHAR}[/bold] microseconds per HTML character.", - "- Duration metrics (e.g. 'Average', 'Median', 'P99') are measured in seconds, while 'Size' is measured in HTML characters.", - sep="\n", - ) - else: - print( - "- The 'Threshold' in the table signifies the maximum allowable parsing time (in seconds) per document.", - f"- This threshold was determined based on a set rate of [bold]{ALLOWED_MICROSECONDS_PER_CHAR}[/bold] microseconds per HTML character.", - "- Duration metrics (e.g. 'Time') are measured in seconds, while 'Size' is measured in HTML characters.", - sep="\n", - ) - - # Render the results table - render_table(METRICS, metrics, hash_to_filename) - - # Print the documents that failed the threshold - if failed_documents: - print("\nDocuments that failed the threshold:") - for doc in failed_documents: - print(get_document_name(doc, hash_to_filename)) - sys.exit(1) - else: - print("\nAll documents passed the threshold.") - sys.exit(0) diff --git a/tests/e2e/test_data/10q_apple_000032019323000077.html b/tests/e2e/test_data/10q_apple_000032019323000077.html deleted file mode 100644 index c558d57..0000000 --- a/tests/e2e/test_data/10q_apple_000032019323000077.html +++ /dev/null @@ -1,22 +0,0 @@ -PART I — FINANCIAL INFORMATION
-Three Months Ended | Nine Months Ended | ||||||||||||||||||||||
July 1, 2023 | June 25, 2022 | July 1, 2023 | June 25, 2022 | ||||||||||||||||||||
Net sales: | |||||||||||||||||||||||
Products | $ | $ | $ | $ | |||||||||||||||||||
Services | |||||||||||||||||||||||
Total net sales | |||||||||||||||||||||||
Cost of sales: | |||||||||||||||||||||||
Products | |||||||||||||||||||||||
Services | |||||||||||||||||||||||
Total cost of sales | |||||||||||||||||||||||
Gross margin | |||||||||||||||||||||||
Operating expenses: | |||||||||||||||||||||||
Research and development | |||||||||||||||||||||||
Selling, general and administrative | |||||||||||||||||||||||
Total operating expenses | |||||||||||||||||||||||
Operating income | |||||||||||||||||||||||
Other income/(expense), net | ( | ( | ( | ( | |||||||||||||||||||
Income before provision for income taxes | |||||||||||||||||||||||
Provision for income taxes | |||||||||||||||||||||||
Net income | $ | $ | $ | $ | |||||||||||||||||||
Earnings per share: | |||||||||||||||||||||||
Basic | $ | $ | $ | $ | |||||||||||||||||||
Diluted | $ | $ | $ | $ | |||||||||||||||||||
Shares used in computing earnings per share: | |||||||||||||||||||||||
Basic | |||||||||||||||||||||||
Diluted |
Three Months Ended | Nine Months Ended | ||||||||||||||||||||||
July 1, 2023 | June 25, 2022 | July 1, 2023 | June 25, 2022 | ||||||||||||||||||||
Net income | $ | $ | $ | $ | |||||||||||||||||||
Other comprehensive income/(loss): | |||||||||||||||||||||||
Change in foreign currency translation, net of tax | ( | ( | ( | ( | |||||||||||||||||||
Change in unrealized gains/losses on derivative instruments, net of tax: | |||||||||||||||||||||||
Change in fair value of derivative instruments | ( | ||||||||||||||||||||||
Adjustment for net (gains)/losses realized and included in net income | ( | ( | |||||||||||||||||||||
Total change in unrealized gains/losses on derivative instruments | ( | ||||||||||||||||||||||
Change in unrealized gains/losses on marketable debt securities, net of tax: | |||||||||||||||||||||||
Change in fair value of marketable debt securities | ( | ( | ( | ||||||||||||||||||||
Adjustment for net (gains)/losses realized and included in net income | |||||||||||||||||||||||
Total change in unrealized gains/losses on marketable debt securities | ( | ( | ( | ||||||||||||||||||||
Total other comprehensive income/(loss) | ( | ( | ( | ( | |||||||||||||||||||
Total comprehensive income | $ | $ | $ | $ |
July 1, 2023 | September 24, 2022 | ||||||||||
ASSETS: | |||||||||||
Current assets: | |||||||||||
Cash and cash equivalents | $ | $ | |||||||||
Marketable securities | |||||||||||
Accounts receivable, net | |||||||||||
Inventories | |||||||||||
Vendor non-trade receivables | |||||||||||
Other current assets | |||||||||||
Total current assets | |||||||||||
Non-current assets: | |||||||||||
Marketable securities | |||||||||||
Property, plant and equipment, net | |||||||||||
Other non-current assets | |||||||||||
Total non-current assets | |||||||||||
Total assets | $ | $ | |||||||||
LIABILITIES AND SHAREHOLDERS’ EQUITY: | |||||||||||
Current liabilities: | |||||||||||
Accounts payable | $ | $ | |||||||||
Other current liabilities | |||||||||||
Deferred revenue | |||||||||||
Commercial paper | |||||||||||
Term debt | |||||||||||
Total current liabilities | |||||||||||
Non-current liabilities: | |||||||||||
Term debt | |||||||||||
Other non-current liabilities | |||||||||||
Total non-current liabilities | |||||||||||
Total liabilities | |||||||||||
Commitments and contingencies | |||||||||||
Shareholders’ equity: | |||||||||||
Common stock and additional paid-in capital, $ | |||||||||||
Retained earnings/(Accumulated deficit) | ( | ||||||||||
Accumulated other comprehensive income/(loss) | ( | ( | |||||||||
Total shareholders’ equity | |||||||||||
Total liabilities and shareholders’ equity | $ | $ |
Three Months Ended | Nine Months Ended | ||||||||||||||||||||||
July 1, 2023 | June 25, 2022 | July 1, 2023 | June 25, 2022 | ||||||||||||||||||||
Total shareholders’ equity, beginning balances | $ | $ | $ | $ | |||||||||||||||||||
Common stock and additional paid-in capital: | |||||||||||||||||||||||
Beginning balances | |||||||||||||||||||||||
Common stock issued | |||||||||||||||||||||||
Common stock withheld related to net share settlement of equity awards | ( | ( | ( | ( | |||||||||||||||||||
Share-based compensation | |||||||||||||||||||||||
Ending balances | |||||||||||||||||||||||
Retained earnings/(Accumulated deficit): | |||||||||||||||||||||||
Beginning balances | ( | ||||||||||||||||||||||
Net income | |||||||||||||||||||||||
Dividends and dividend equivalents declared | ( | ( | ( | ( | |||||||||||||||||||
Common stock withheld related to net share settlement of equity awards | ( | ( | ( | ( | |||||||||||||||||||
Common stock repurchased | ( | ( | ( | ( | |||||||||||||||||||
Ending balances | |||||||||||||||||||||||
Accumulated other comprehensive income/(loss): | |||||||||||||||||||||||
Beginning balances | ( | ( | ( | ||||||||||||||||||||
Other comprehensive income/(loss) | ( | ( | ( | ( | |||||||||||||||||||
Ending balances | ( | ( | ( | ( | |||||||||||||||||||
Total shareholders’ equity, ending balances | $ | $ | $ | $ | |||||||||||||||||||
Dividends and dividend equivalents declared per share or RSU | $ | $ | $ | $ |
Nine Months Ended | |||||||||||
July 1, 2023 | June 25, 2022 | ||||||||||
Cash, cash equivalents and restricted cash, beginning balances | $ | $ | |||||||||
Operating activities: | |||||||||||
Net income | |||||||||||
Adjustments to reconcile net income to cash generated by operating activities: | |||||||||||
Depreciation and amortization | |||||||||||
Share-based compensation expense | |||||||||||
Other | ( | ||||||||||
Changes in operating assets and liabilities: | |||||||||||
Accounts receivable, net | |||||||||||
Inventories | ( | ||||||||||
Vendor non-trade receivables | |||||||||||
Other current and non-current assets | ( | ( | |||||||||
Accounts payable | ( | ( | |||||||||
Other current and non-current liabilities | |||||||||||
Cash generated by operating activities | |||||||||||
Investing activities: | |||||||||||
Purchases of marketable securities | ( | ( | |||||||||
Proceeds from maturities of marketable securities | |||||||||||
Proceeds from sales of marketable securities | |||||||||||
Payments for acquisition of property, plant and equipment | ( | ( | |||||||||
Other | ( | ( | |||||||||
Cash generated by/(used in) investing activities | ( | ||||||||||
Financing activities: | |||||||||||
Payments for taxes related to net share settlement of equity awards | ( | ( | |||||||||
Payments for dividends and dividend equivalents | ( | ( | |||||||||
Repurchases of common stock | ( | ( | |||||||||
Proceeds from issuance of term debt, net | |||||||||||
Repayments of term debt | ( | ( | |||||||||
Proceeds from/(Repayments of) commercial paper, net | ( | ||||||||||
Other | ( | ( | |||||||||
Cash used in financing activities | ( | ( | |||||||||
Increase/(Decrease) in cash, cash equivalents and restricted cash | ( | ||||||||||
Cash, cash equivalents and restricted cash, ending balances | $ | $ | |||||||||
Supplemental cash flow disclosure: | |||||||||||
Cash paid for income taxes, net | $ | $ | |||||||||
Cash paid for interest | $ | $ |
Three Months Ended | Nine Months Ended | ||||||||||||||||||||||
July 1, 2023 | June 25, 2022 | July 1, 2023 | June 25, 2022 | ||||||||||||||||||||
Numerator: | |||||||||||||||||||||||
Net income | $ | $ | $ | $ | |||||||||||||||||||
Denominator: | |||||||||||||||||||||||
Weighted-average basic shares outstanding | |||||||||||||||||||||||
Effect of dilutive securities | |||||||||||||||||||||||
Weighted-average diluted shares | |||||||||||||||||||||||
Basic earnings per share | $ | $ | $ | $ | |||||||||||||||||||
Diluted earnings per share | $ | $ | $ | $ |
Three Months Ended | Nine Months Ended | ||||||||||||||||||||||
July 1, 2023 | June 25, 2022 | July 1, 2023 | June 25, 2022 | ||||||||||||||||||||
iPhone® | $ | $ | $ | $ | |||||||||||||||||||
Mac® | |||||||||||||||||||||||
iPad® | |||||||||||||||||||||||
Wearables, Home and Accessories | |||||||||||||||||||||||
Services | |||||||||||||||||||||||
Total net sales | $ | $ | $ | $ |
July 1, 2023 | |||||||||||||||||||||||||||||||||||||||||
Adjusted Cost | Unrealized Gains | Unrealized Losses | Fair Value | Cash and Cash Equivalents | Current Marketable Securities | Non-Current Marketable Securities | |||||||||||||||||||||||||||||||||||
Cash | $ | $ | — | $ | — | $ | $ | $ | $ | ||||||||||||||||||||||||||||||||
Level 1 (1): | |||||||||||||||||||||||||||||||||||||||||
Money market funds | |||||||||||||||||||||||||||||||||||||||||
Mutual funds | ( | ||||||||||||||||||||||||||||||||||||||||
Subtotal | ( | ||||||||||||||||||||||||||||||||||||||||
Level 2 (2): | |||||||||||||||||||||||||||||||||||||||||
U.S. Treasury securities | ( | ||||||||||||||||||||||||||||||||||||||||
U.S. agency securities | ( | ||||||||||||||||||||||||||||||||||||||||
Non-U.S. government securities | ( | ||||||||||||||||||||||||||||||||||||||||
Certificates of deposit and time deposits | |||||||||||||||||||||||||||||||||||||||||
Commercial paper | |||||||||||||||||||||||||||||||||||||||||
Corporate debt securities | ( | ||||||||||||||||||||||||||||||||||||||||
Municipal securities | ( | ||||||||||||||||||||||||||||||||||||||||
Mortgage- and asset-backed securities | ( | ||||||||||||||||||||||||||||||||||||||||
Subtotal | ( | ||||||||||||||||||||||||||||||||||||||||
Total (3) | $ | $ | $ | ( | $ | $ | $ | $ | |||||||||||||||||||||||||||||||||
September 24, 2022 | |||||||||||||||||||||||||||||||||||||||||
Adjusted Cost | Unrealized Gains | Unrealized Losses | Fair Value | Cash and Cash Equivalents | Current Marketable Securities | Non-Current Marketable Securities | |||||||||||||||||||||||||||||||||||
Cash | $ | $ | — | $ | — | $ | $ | $ | $ | ||||||||||||||||||||||||||||||||
Level 1 (1): | |||||||||||||||||||||||||||||||||||||||||
Money market funds | |||||||||||||||||||||||||||||||||||||||||
Mutual funds | ( | ||||||||||||||||||||||||||||||||||||||||
Subtotal | ( | ||||||||||||||||||||||||||||||||||||||||
Level 2 (2): | |||||||||||||||||||||||||||||||||||||||||
U.S. Treasury securities | ( | ||||||||||||||||||||||||||||||||||||||||
U.S. agency securities | ( | ||||||||||||||||||||||||||||||||||||||||
Non-U.S. government securities | ( | ||||||||||||||||||||||||||||||||||||||||
Certificates of deposit and time deposits | |||||||||||||||||||||||||||||||||||||||||
Commercial paper | |||||||||||||||||||||||||||||||||||||||||
Corporate debt securities | ( | ||||||||||||||||||||||||||||||||||||||||
Municipal securities | ( | ||||||||||||||||||||||||||||||||||||||||
Mortgage- and asset-backed securities | ( | ||||||||||||||||||||||||||||||||||||||||
Subtotal | ( | ||||||||||||||||||||||||||||||||||||||||
Total (3) | $ | $ | $ | ( | $ | $ | $ | $ |
Due after 1 year through 5 years | $ | ||||
Due after 5 years through 10 years | |||||
Due after 10 years | |||||
Total fair value | $ |
July 1, 2023 | September 24, 2022 | ||||||||||
Derivative instruments designated as accounting hedges: | |||||||||||
Foreign exchange contracts | $ | $ | |||||||||
Interest rate contracts | $ | $ | |||||||||
Derivative instruments not designated as accounting hedges: | |||||||||||
Foreign exchange contracts | $ | $ |
September 24, 2022 | |||||||||||||||||
Fair Value of Derivatives Designated as Accounting Hedges | Fair Value of Derivatives Not Designated as Accounting Hedges | Total Fair Value | |||||||||||||||
Derivative assets (1): | |||||||||||||||||
Foreign exchange contracts | $ | $ | $ | ||||||||||||||
Derivative liabilities (2): | |||||||||||||||||
Foreign exchange contracts | $ | $ | $ | ||||||||||||||
Interest rate contracts | $ | $ | $ |
July 1, 2023 | September 24, 2022 | ||||||||||
Hedged assets/(liabilities): | |||||||||||
$ | $ | ||||||||||
$ | ( | $ | ( |
July 1, 2023 | September 24, 2022 | ||||||||||
Components | $ | $ | |||||||||
Finished goods | |||||||||||
Total inventories | $ | $ |
July 1, 2023 | September 24, 2022 | ||||||||||
Gross property, plant and equipment | $ | $ | |||||||||
Accumulated depreciation and amortization | ( | ( | |||||||||
Total property, plant and equipment, net | $ | $ |
Three Months Ended | Nine Months Ended | ||||||||||||||||||||||
July 1, 2023 | June 25, 2022 | July 1, 2023 | June 25, 2022 | ||||||||||||||||||||
Interest and dividend income | $ | $ | $ | $ | |||||||||||||||||||
Interest expense | ( | ( | ( | ( | |||||||||||||||||||
Other expense, net | ( | ( | ( | ( | |||||||||||||||||||
Total other income/(expense), net | $ | ( | $ | ( | $ | ( | $ | ( |
Nine Months Ended | |||||||||||
July 1, 2023 | June 25, 2022 | ||||||||||
Maturities 90 days or less: | |||||||||||
Proceeds from/(Repayments of) commercial paper, net | $ | ( | $ | ||||||||
Maturities greater than 90 days: | |||||||||||
Proceeds from commercial paper | |||||||||||
Repayments of commercial paper | ( | ( | |||||||||
Proceeds from/(Repayments of) commercial paper, net | ( | ||||||||||
Total proceeds from/(repayments of) commercial paper, net | $ | ( | $ |
Number of RSUs (in thousands) | Weighted-Average Grant Date Fair Value Per RSU | Aggregate Fair Value (in millions) | |||||||||||||||
Balance as of September 24, 2022 | $ | ||||||||||||||||
RSUs granted | $ | ||||||||||||||||
RSUs vested | ( | $ | |||||||||||||||
RSUs canceled | ( | $ | |||||||||||||||
Balance as of July 1, 2023 | $ | $ |
Three Months Ended | Nine Months Ended | ||||||||||||||||||||||
July 1, 2023 | June 25, 2022 | July 1, 2023 | June 25, 2022 | ||||||||||||||||||||
Share-based compensation expense | $ | $ | $ | $ | |||||||||||||||||||
Income tax benefit related to share-based compensation expense | $ | ( | $ | ( | $ | ( | $ | ( |
2023 (remaining three months) | $ | ||||
2024 | |||||
2025 | |||||
2026 | |||||
2027 | |||||
Thereafter | |||||
Total | $ |
Three Months Ended | Nine Months Ended | ||||||||||||||||||||||
July 1, 2023 | June 25, 2022 | July 1, 2023 | June 25, 2022 | ||||||||||||||||||||
Americas: | |||||||||||||||||||||||
Net sales | $ | $ | $ | $ | |||||||||||||||||||
Operating income | $ | $ | $ | $ | |||||||||||||||||||
Europe: | |||||||||||||||||||||||
Net sales | $ | $ | $ | $ | |||||||||||||||||||
Operating income | $ | $ | $ | $ | |||||||||||||||||||
Greater China: | |||||||||||||||||||||||
Net sales | $ | $ | $ | $ | |||||||||||||||||||
Operating income | $ | $ | $ | $ | |||||||||||||||||||
Japan: | |||||||||||||||||||||||
Net sales | $ | $ | $ | $ | |||||||||||||||||||
Operating income | $ | $ | $ | $ | |||||||||||||||||||
Rest of Asia Pacific: | |||||||||||||||||||||||
Net sales | $ | $ | $ | $ | |||||||||||||||||||
Operating income | $ | $ | $ | $ |
Three Months Ended | Nine Months Ended | ||||||||||||||||||||||
July 1, 2023 | June 25, 2022 | July 1, 2023 | June 25, 2022 | ||||||||||||||||||||
Segment operating income | $ | $ | $ | $ | |||||||||||||||||||
Research and development expense | ( | ( | ( | ( | |||||||||||||||||||
Other corporate expenses, net | ( | ( | ( | ( | |||||||||||||||||||
Total operating income | $ | $ | $ | $ |
Three Months Ended | Nine Months Ended | ||||||||||||||||||||||||||||||||||
July 1, 2023 | June 25, 2022 | Change | July 1, 2023 | June 25, 2022 | Change | ||||||||||||||||||||||||||||||
Net sales by reportable segment: | |||||||||||||||||||||||||||||||||||
Americas | $ | 35,383 | $ | 37,472 | (6) | % | $ | 122,445 | $ | 129,850 | (6) | % | |||||||||||||||||||||||
Europe | 20,205 | 19,287 | 5 | % | 71,831 | 72,323 | (1) | % | |||||||||||||||||||||||||||
Greater China | 15,758 | 14,604 | 8 | % | 57,475 | 58,730 | (2) | % | |||||||||||||||||||||||||||
Japan | 4,821 | 5,446 | (11) | % | 18,752 | 20,277 | (8) | % | |||||||||||||||||||||||||||
Rest of Asia Pacific | 5,630 | 6,150 | (8) | % | 23,284 | 23,002 | 1 | % | |||||||||||||||||||||||||||
Total net sales | $ | 81,797 | $ | 82,959 | (1) | % | $ | 293,787 | $ | 304,182 | (3) | % |
Three Months Ended | Nine Months Ended | ||||||||||||||||||||||||||||||||||
July 1, 2023 | June 25, 2022 | Change | July 1, 2023 | June 25, 2022 | Change | ||||||||||||||||||||||||||||||
Net sales by category: | |||||||||||||||||||||||||||||||||||
iPhone | $ | 39,669 | $ | 40,665 | (2) | % | $ | 156,778 | $ | 162,863 | (4) | % | |||||||||||||||||||||||
Mac | 6,840 | 7,382 | (7) | % | 21,743 | 28,669 | (24) | % | |||||||||||||||||||||||||||
iPad | 5,791 | 7,224 | (20) | % | 21,857 | 22,118 | (1) | % | |||||||||||||||||||||||||||
Wearables, Home and Accessories | 8,284 | 8,084 | 2 | % | 30,523 | 31,591 | (3) | % | |||||||||||||||||||||||||||
Services | 21,213 | 19,604 | 8 | % | 62,886 | 58,941 | 7 | % | |||||||||||||||||||||||||||
Total net sales | $ | 81,797 | $ | 82,959 | (1) | % | $ | 293,787 | $ | 304,182 | (3) | % |
Three Months Ended | Nine Months Ended | ||||||||||||||||||||||
July 1, 2023 | June 25, 2022 | July 1, 2023 | June 25, 2022 | ||||||||||||||||||||
Gross margin: | |||||||||||||||||||||||
Products | $ | 21,448 | $ | 21,870 | $ | 84,205 | $ | 90,157 | |||||||||||||||
Services | 14,965 | 14,015 | 44,516 | 42,530 | |||||||||||||||||||
Total gross margin | $ | 36,413 | $ | 35,885 | $ | 128,721 | $ | 132,687 |
Gross margin percentage: | |||||||||||||||||||||||
Products | 35.4 | % | 34.5 | % | 36.5 | % | 36.8 | % | |||||||||||||||
Services | 70.5 | % | 71.5 | % | 70.8 | % | 72.2 | % | |||||||||||||||
Total gross margin percentage | 44.5 | % | 43.3 | % | 43.8 | % | 43.6 | % |
Three Months Ended | Nine Months Ended | ||||||||||||||||||||||
July 1, 2023 | June 25, 2022 | July 1, 2023 | June 25, 2022 | ||||||||||||||||||||
Research and development | $ | 7,442 | $ | 6,797 | $ | 22,608 | $ | 19,490 | |||||||||||||||
Percentage of total net sales | 9 | % | 8 | % | 8 | % | 6 | % | |||||||||||||||
Selling, general and administrative | $ | 5,973 | $ | 6,012 | $ | 18,781 | $ | 18,654 | |||||||||||||||
Percentage of total net sales | 7 | % | 7 | % | 6 | % | 6 | % | |||||||||||||||
Total operating expenses | $ | 13,415 | $ | 12,809 | $ | 41,389 | $ | 38,144 | |||||||||||||||
Percentage of total net sales | 16 | % | 15 | % | 14 | % | 13 | % |
Three Months Ended | Nine Months Ended | ||||||||||||||||||||||
July 1, 2023 | June 25, 2022 | July 1, 2023 | June 25, 2022 | ||||||||||||||||||||
Provision for income taxes | $ | 2,852 | $ | 3,624 | $ | 12,699 | $ | 15,364 | |||||||||||||||
Effective tax rate | 12.5 | % | 15.7 | % | 14.6 | % | 16.3 | % | |||||||||||||||
Statutory federal income tax rate | 21 | % | 21 | % | 21 | % | 21 | % |
Periods | Total Number of Shares Purchased | Average Price Paid Per Share | Total Number of Shares Purchased as Part of Publicly Announced Plans or Programs | Approximate Dollar Value of Shares That May Yet Be Purchased Under the Plans or Programs (1) | ||||||||||||||||||||||
April 2, 2023 to May 6, 2023: | ||||||||||||||||||||||||||
Open market and privately negotiated purchases | 38,121 | $ | 165.46 | 38,121 | ||||||||||||||||||||||
May 7, 2023 to June 3, 2023: | ||||||||||||||||||||||||||
Open market and privately negotiated purchases | 21,876 | $ | 174.91 | 21,876 | ||||||||||||||||||||||
June 4, 2023 to July 1, 2023: | ||||||||||||||||||||||||||
Open market and privately negotiated purchases | 42,676 | $ | 184.34 | 42,676 | ||||||||||||||||||||||
Total | 102,673 | $ | 94,569 |
Incorporated by Reference | ||||||||||||||||||||||||||
Exhibit Number | Exhibit Description | Form | Exhibit | Filing Date/ Period End Date | ||||||||||||||||||||||
4.1 | 8-K | 4.1 | 5/10/23 | |||||||||||||||||||||||
31.1* | ||||||||||||||||||||||||||
31.2* | ||||||||||||||||||||||||||
32.1** | ||||||||||||||||||||||||||
101* | Inline XBRL Document Set for the condensed consolidated financial statements and accompanying notes in Part I, Item 1, “Financial Statements” of this Quarterly Report on Form 10-Q. | |||||||||||||||||||||||||
104* | Inline XBRL for the cover page of this Quarterly Report on Form 10-Q, included in the Exhibit 101 Inline XBRL Document Set. |
Date: August 3, 2023 | Apple Inc. | ||||||||||
By: | /s/ Luca Maestri | ||||||||||
Luca Maestri | |||||||||||
Senior Vice President, Chief Financial Officer |