diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 107cf6a43f..c913a8b1a3 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -26,6 +26,10 @@ Fixed * Fix ``TypeError`` when displaying help for actions whose parameters have no ``description`` key. #6375 * Fix utf-8 encode before checking paramter max size #6352 * Fix stuck running workflow tasks #6398 (by @guzzijones12@gmail.com) +* Fix workflow engine shutdown stranding running workflows in ``running`` state. On shutdown the + engine now excludes its own coordination member id when deciding whether another engine is still + available, so it pauses running workflows only when no other engine remains to take them over + (last-engine shutdown), and leaves them running when a peer engine is still up. (by @guzzijones12@gmail.com) Changed ~~~~~~~ @@ -34,10 +38,17 @@ Changed * Replaced deprecated `pkg_resources` module with `importlib-metadata` and `importlib-resources`. * Replaced abandoned `flex` module by `openapi-spec-validator` * Replaced Stackstorm/logshipper (stops working with Python 3.12) and eventlet in the `linux.file_watch_sensor` with threading. (by @skiedude) + * Bumped the pinned ``orquesta`` git revision in ``lockfiles/st2.lock`` to pick up the workflow engine race-condition fix. (by @guzzijones12@gmail.com) Added ~~~~~ * added raw_string type to allow template strings to pass through variable processing (by @guzzijones12@gmail.com) #6351 +* added ``[workflow_engine].bootstrap_enabled`` option (default ``False``) to make resuming + shutdown-paused workflows on engine startup opt-in. + environments where a shutdown can leave shutdown-paused workflows behind. (by @guzzijones12@gmail.com) +* added ``[workflow_engine].bootstrap_lookback_days`` option (default ``1``) to bound resume-on-startup + to workflows whose ``start_timestamp`` is within the given number of days, preventing accidental + resumption of ancient paused workflows. (by @guzzijones12@gmail.com) 3.9.0 - October 10, 2025 ------------------------ diff --git a/conf/st2.conf.sample b/conf/st2.conf.sample index 150fd1133c..725356f1a8 100644 --- a/conf/st2.conf.sample +++ b/conf/st2.conf.sample @@ -391,6 +391,10 @@ logging = /etc/st2/logging.timersengine.conf webui_base_url = https://localhost [workflow_engine] +# On leader engine startup, resume workflows that were paused by prior all engines complete shutdown. Off by default. +bootstrap_enabled = False +# When bootstrap_enabled is set, only resume workflows whose LiveAction.start_timestamp is within this many days. Prevents accidentally resuming ancient paused workflows on engine startup. +bootstrap_lookback_days = 1 # How long to wait for process (in seconds) to exit after receiving shutdown signal. exit_still_active_check = 300 # Max seconds to allow workflow execution be idled before it is identified as orphaned and cancelled by the garbage collector. A value of zero means the feature is disabled. This is disabled by default. diff --git a/lockfiles/st2.lock b/lockfiles/st2.lock index 6e58a87720..335970058e 100644 --- a/lockfiles/st2.lock +++ b/lockfiles/st2.lock @@ -114,21 +114,21 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "43b3319e1b4e7d1251833a93d672b4af1e40f3d632d479b98661a95f117880a2", - "url": "https://files.pythonhosted.org/packages/26/99/fc813cd978842c26c82534010ea849eee9ab3a13ea2b74e95cb9c99e747b/amqp-5.3.1-py3-none-any.whl" + "hash": "5d931d8442a403b6d4a5725a868a55edaa40734eae37d282b16be9fa710bd8ee", + "url": "https://files.pythonhosted.org/packages/07/99/6b965aa99a32630c1c61ce57c9dcf81cec6fec354274a87f14525302b7f7/amqp-5.4.0-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "cddc00c725449522023bad949f70fff7b48f0b1ade74d170a6f10ab044739432", - "url": "https://files.pythonhosted.org/packages/79/fc/ec94a357dfc6683d8c86f8b4cfa5416a4c36b28052ec8260c77aca96a443/amqp-5.3.1.tar.gz" + "hash": "aaa33987dcb6a7893955d3b4f537c5d4755addce1009929e63e5d18c1b51a0a7", + "url": "https://files.pythonhosted.org/packages/b2/a7/787f067b237d4b3bfefa8d67ead64a7d807feafe85ad516afb284fb1587f/amqp-5.4.0.tar.gz" } ], "project_name": "amqp", "requires_dists": [ "vine<6.0.0,>=5.0.0" ], - "requires_python": ">=3.6", - "version": "5.3.1" + "requires_python": ">=3.10", + "version": "5.4.0" }, { "artifacts": [ @@ -761,279 +761,279 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "6df0ec430f9a831772c23ca5a224cba36517a58a84bb32c32bb59a9fa67c47f6", - "url": "https://files.pythonhosted.org/packages/cc/61/d01fc49b8dea277640b55a9e15960dbca9fdc8c9fde18e572d39c59f4019/charset_normalizer-3.5.1-py3-none-any.whl" + "hash": "b6b751274acb69d77b3323d6b7dbaa3c7fdfc1eb829b7eb61d262f32e1af9685", + "url": "https://files.pythonhosted.org/packages/fc/ad/d07d7862a62ffa6d79d68074d14823243dd235a77c45262acbf6adeb28bf/charset_normalizer-3.5.2-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "e9fbdce1e47394b09bc9f26ab117dfc8d6491977a11d86f592bb42c779db2fda", - "url": "https://files.pythonhosted.org/packages/03/6d/439231dfc3ccfa6f8c06477b7da2219cbd41a2de3d49084df8ec7b5100f2/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" + "hash": "838dcc90063569a0448120554591a1d6c4a4ffe11babf048908793154ab86ade", + "url": "https://files.pythonhosted.org/packages/09/54/ab9e89367076f6331bb6c65c4bf14a5361fa5191cb6561bf534f18504e1b/charset_normalizer-3.5.2-cp37-abi3-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "c7b742bf31c88566b4bb6335a7f393bb322e580b6bb98df7bd0c25e6e3519ce8", - "url": "https://files.pythonhosted.org/packages/0d/35/731ac04aa0a097fc1c97f0994c375bdb230c6c96619db794208fe664e9ce/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" + "hash": "4495c5002a7b28557e7e222e77e0b661183e432b7d6d2e788101e3f240e05b8c", + "url": "https://files.pythonhosted.org/packages/0b/0d/363f78cacb70f58f15f4b083961bbd9d292f335d3f5c66fc4f1cfe69cb90/charset_normalizer-3.5.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl" }, { "algorithm": "sha256", - "hash": "4c4fb141a727957c93edfe5c32a26ceb6b5f6461d67146e2d39f51e16170bea8", - "url": "https://files.pythonhosted.org/packages/18/96/2b3a21492d9f65171ac75d872f5018260013d00bfa0ff70ec9f179148cbd/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_ppc64le.whl" + "hash": "ef4fcbf3327382cd4c9f540babd61248208af7b93eec4de397b4d5f58a09e288", + "url": "https://files.pythonhosted.org/packages/15/d8/f0a93a431d170e7ca681d4f6650fee3de934d18560e474e7267eb4b0f987/charset_normalizer-3.5.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl" }, { "algorithm": "sha256", - "hash": "07ffd07412fc5d5e84cd8952acf9ff7e4ed7a708e69d1bada19d8ba91711353f", - "url": "https://files.pythonhosted.org/packages/20/c8/c36f6e0b2dfec351bd38cbc05362697e58bcd073d7dbd95154290c9714ce/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_ppc64le.whl" + "hash": "3d21b8b13c7592db2ac5e544a6d83187b995257472b0c9e8351b6d507ae37ed6", + "url": "https://files.pythonhosted.org/packages/22/67/6a0b94a7960d5e1b5eacd2fb529f3fccc47db4644f7f0a7cfdcfc3be578a/charset_normalizer-3.5.2-cp311-cp311-macosx_10_9_universal2.whl" }, { "algorithm": "sha256", - "hash": "0722590aabf9dc6a6c0343d523c05458fa2b5047dbe6302fd526bb570600753f", - "url": "https://files.pythonhosted.org/packages/28/f0/0c0ceec6d98b7daa62e361e418135d59685811d79ba11529aad5cdf15e84/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_aarch64.whl" + "hash": "1db38f4c5496827c1a501846d64d14c3b80c7e6714e406cd7dc36a9899fa1011", + "url": "https://files.pythonhosted.org/packages/2b/9e/46f2fa4c431fc98c4ae76a8cb5bdca54e0341e3cfc3fcfd8e82740250818/charset_normalizer-3.5.2-cp37-abi3-musllinux_1_2_aarch64.whl" }, { "algorithm": "sha256", - "hash": "36047af20e17097c3bb9476c2b7655f2f7aa51322c0ba58c07695bedf755a950", - "url": "https://files.pythonhosted.org/packages/2b/b8/11d4840bfc99330cc7fbcc2681ee5a044553a6e77655508d8f9b2bff7b34/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_armv7l.whl" + "hash": "d6734d2ef8a50fbf8445c139477da401f50d62a0606bf00e20ec6d87773fefb1", + "url": "https://files.pythonhosted.org/packages/2d/8b/803b4d2a3f6e1740f63f1e87b04d14b42f3d4fdfe6ed7d4db2d34102b14f/charset_normalizer-3.5.2-cp312-cp312-musllinux_1_2_riscv64.whl" }, { "algorithm": "sha256", - "hash": "5b6d1386bf0096d26d3a863dc0a487a5b4eb9aa93cf5ba69683d29dde6b9d60f", - "url": "https://files.pythonhosted.org/packages/30/27/78873dc8b6a56357517b74b6bb9568b80450e7bb4f6ef7e3fa9d22aa0bd7/charset_normalizer-3.5.1-cp312-cp312-macosx_10_13_universal2.whl" + "hash": "39de2a259fc954455c57274dc94c79d5842774e1247a016aff30bc0efed0f4ef", + "url": "https://files.pythonhosted.org/packages/33/1c/f41d4e74c28ab327ff3acd36053f7ea506c55872d7a90b0fa71aa3ab0c89/charset_normalizer-3.5.2.tar.gz" }, { "algorithm": "sha256", - "hash": "96eefc178f8636b9c760c5829345307fd81cfae9ab1e80997dbddeb0f54ee9a3", - "url": "https://files.pythonhosted.org/packages/32/cd/4f564b8f132de25db594efc706897069f016790cea63a5669c9df2675f64/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" + "hash": "44bd4fbb29dfbeba60e7d2bd000c59e4b21ddb3cc53912b14048d37092706d7c", + "url": "https://files.pythonhosted.org/packages/33/4f/aeadccd6d20882909eb2597ec40eccc05d505e2262f14dc76d7620700657/charset_normalizer-3.5.2-cp310-cp310-musllinux_1_2_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "7235dc28fc6dd9d832ac7c7bce95367dedb85929f17368a0c2bee1e080b9acbf", - "url": "https://files.pythonhosted.org/packages/35/5a/337e4663a5eae6de99db940ee8066d4145caafb61327db62deda15313cce/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_riscv64.whl" + "hash": "d19fbd981a488e22cd04883659ca6b08f50b5974f9fd7c95655ef6a043e5893f", + "url": "https://files.pythonhosted.org/packages/43/6f/c4fbae58febff71709c51bc7e18fdfa55341dc382704740f9f0cbf03817b/charset_normalizer-3.5.2-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" }, { "algorithm": "sha256", - "hash": "3588e376b3ea2eea84976f67273d679f229e24c66dce7b82ae45aef04ff6e072", - "url": "https://files.pythonhosted.org/packages/35/8a/3d130aeabcaf3d2466af76b7b141c08d9e89c9016ab4b7cdd0f7dc2d1c62/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_s390x.whl" + "hash": "619799369eeef6366ed3e8755a5670f4f2f0fb6b30a0fd7264dc0fdc2357058e", + "url": "https://files.pythonhosted.org/packages/4a/41/e05e19578b7b87e7db2c3ecb884bd09d065274ab41e1f535542e8bae9b06/charset_normalizer-3.5.2-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl" }, { "algorithm": "sha256", - "hash": "7c0c10730342b0c9b35dd1d619beb8214e520bd96a1f870f452680b238aab3e0", - "url": "https://files.pythonhosted.org/packages/38/fe/341861ac118dae06f3ec0eb487488af52128f2ef2faf0b11003944d22259/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl" + "hash": "114e4d0c92d618409ed82a99e22b5c5e768fe995f2973f78265f4524f49d4640", + "url": "https://files.pythonhosted.org/packages/4e/88/7561d8a88d555e7df6623abe7c0070b4baf47549b9408783a2ae0a1a6cf7/charset_normalizer-3.5.2-cp311-cp311-musllinux_1_2_x86_64.whl" }, { "algorithm": "sha256", - "hash": "bd6c173f04743d483881bffa1478d5a4624475b8cd1d2194956a75548e191c18", - "url": "https://files.pythonhosted.org/packages/42/85/f9e22af69af67c54cce42be9455d9c81294f918b4ccc454db01f66efcac2/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_ppc64le.whl" + "hash": "9373ad13ef0d2c0fb761e04e55bfdee5a08b52cef2c882c8fbe9935b1517152e", + "url": "https://files.pythonhosted.org/packages/52/fc/e518013affcc43c9f919c3ba41bffe9b4ee4aceb0a6462a6243efcca5f2d/charset_normalizer-3.5.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" }, { "algorithm": "sha256", - "hash": "5d8531a6569d025f68e2321e7638fb7978f23db58e5f69f56913837aae03816e", - "url": "https://files.pythonhosted.org/packages/46/22/111e5be3b740d5c2a5bfcedb3d237b6591e5c2e82ae9d6ffcb121fe0909c/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_armv7l.whl" + "hash": "ee21e28f0430bd6dc9086c6e525d5e818a44a5ad19720c8a0ef766792f3eb5e5", + "url": "https://files.pythonhosted.org/packages/54/e2/77a8b09d5adc013ed07b95b01b8b8fa5441c4e810e83ee7e4aae2fa4d91a/charset_normalizer-3.5.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl" }, { "algorithm": "sha256", - "hash": "343fb4f2821043bd87095f7b08a1a181febc8e36ac64212143bbfd0a0e1bc235", - "url": "https://files.pythonhosted.org/packages/49/e0/716601f3cc69be7b198951150c75ead1ece33c3c8036ff6ffa46029659a0/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl" + "hash": "28a15fdad492a99b6eccfaaed66ef3f74050680545ea61ec8b2f4c538f1f1320", + "url": "https://files.pythonhosted.org/packages/55/e2/06bad57dfdb49cad92c0ba85b6b4fa5827a67df37897287cfef0553843c2/charset_normalizer-3.5.2-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl" }, { "algorithm": "sha256", - "hash": "00668ebb0609751758682eb0b5857e7c35b9f00e84dfdef062e103244ec94d45", - "url": "https://files.pythonhosted.org/packages/55/53/7d819bd23a00ef45039146fa2cce1daa2f0771e758c5653ee1f6edac91ed/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl" + "hash": "b736353c0a625bbd5fcec108576e2385db3496f4f771f785ff32e108d3c3bc45", + "url": "https://files.pythonhosted.org/packages/59/72/263491ec1494a194b16fcbff88a0220f2af633738c79e92b4d7189226322/charset_normalizer-3.5.2-cp310-cp310-musllinux_1_2_x86_64.whl" }, { "algorithm": "sha256", - "hash": "494b70049a4d69aec6e8137c13af4cf8db8c9f9820a1392ac293b0dd2987a818", - "url": "https://files.pythonhosted.org/packages/58/ad/b9aecf38d805cbcf84fa94f14c5d972a16561e20296a11dc799a5dcf3763/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_x86_64.whl" + "hash": "0fed1d06615f022ee3b13caf5e8b180cfea32bb2c5aded8a9d44277afc040f93", + "url": "https://files.pythonhosted.org/packages/61/71/458c3f42164a07d0c5210798e9e704b39e540a6793b05aba67f3a35243a9/charset_normalizer-3.5.2-cp37-abi3-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl" }, { "algorithm": "sha256", - "hash": "41876ee62a3dddf48ff1121ad8f0798032aa03f2fd35f21f34a4cab14f18d8d2", - "url": "https://files.pythonhosted.org/packages/5b/97/fb4e82231aba271ffd775a1b4993b0defc4e3059f286ae41d9433409fe85/charset_normalizer-3.5.1-cp37-abi3-macosx_10_9_universal2.whl" + "hash": "c9790464842f85f437dbbb54417eda1e0e6bfc52dd8d22d6fd1c994b73b2dc74", + "url": "https://files.pythonhosted.org/packages/66/85/3b5358f60a13210f0b67d3755c168ef758701b021e655d88d4da28554467/charset_normalizer-3.5.2-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl" }, { "algorithm": "sha256", - "hash": "ce854f5f478050ade5a238731c4ca985a7d3b3cb53ff600a9b5c3b689b5f0a7a", - "url": "https://files.pythonhosted.org/packages/69/2b/d8be3523ddf9f0b0f3e56d1359034aa10653a4d11564c697f802b4775766/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl" + "hash": "62588a277bfb59def052abd940703fa35107152bf479781a878617d60faf8fb5", + "url": "https://files.pythonhosted.org/packages/71/71/fb379e399b1013962716a059d551e03bd80b3e02f05d81246886af6c0958/charset_normalizer-3.5.2-cp310-cp310-musllinux_1_2_armv7l.whl" }, { "algorithm": "sha256", - "hash": "eda059b6bc8bc0812d626fd91a7ce01bf583df0a61296eff390fd94141a34e30", - "url": "https://files.pythonhosted.org/packages/6a/b6/034f6802e9c3f6418966cfabb7db8c9252cc2429c5098f41cc43af804149/charset_normalizer-3.5.1-cp311-cp311-macosx_10_9_universal2.whl" + "hash": "59f63901b0031c3136cf64704dcb21de0bbae62ce2c9529bc39d27665463de37", + "url": "https://files.pythonhosted.org/packages/71/7a/ff467301deef2089fad87f72df9e000a26a78fec7acbb18e1999371b8369/charset_normalizer-3.5.2-cp311-cp311-musllinux_1_2_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "b9af956078716df40d985fb0dfeb2c2120c5ca92ba4ff4b388acfd01cdc14d08", - "url": "https://files.pythonhosted.org/packages/6f/89/bb5108dc6c3651dca963f2b0a3ba19bbcb370c94e1b6d3e0e844a58e6dca/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" + "hash": "4685902cf26edf013ed7a3da0f426ebba7a00ebb9541386d835afbf002c11cab", + "url": "https://files.pythonhosted.org/packages/74/75/77c1c479b09ecd751d1e767b251ea5c14d4d50ff757bf404afab2692f600/charset_normalizer-3.5.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "d1ee1e296209fdce05b81b663250eefa02213a2da7b41bf26f7829b8ba3545aa", - "url": "https://files.pythonhosted.org/packages/71/aa/554e2614f38fc34c58ff1d0911ae8535ad2516440d5482d76fe59f1088b0/charset_normalizer-3.5.1-cp310-cp310-macosx_10_9_universal2.whl" + "hash": "fb9e68df06293761f9fe66ade60a9bc6d0f5e42b8acf2939a9158af86ab0e5bd", + "url": "https://files.pythonhosted.org/packages/76/a5/cac540ab0fd61f3fec88ad3dbb64509e71424593d73cfdfff5ab3e4db279/charset_normalizer-3.5.2-cp311-cp311-musllinux_1_2_armv7l.whl" }, { "algorithm": "sha256", - "hash": "a2028475ba855475b8b4d3cfeb4994269c967aea8b9892dfba907f4263a863a3", - "url": "https://files.pythonhosted.org/packages/75/9c/019fbb9f4834491a160951349b1a3714439376f66e5f7cf18b4f18f0c7aa/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_aarch64.whl" + "hash": "2ce45c6627b22c47e390bc91a41c3d13032192e699fa0bea96e9671b373d69b0", + "url": "https://files.pythonhosted.org/packages/7c/c1/061431ecc688d9d76602502cb57cc01e691e682c18f1beb45f9673b5bbd2/charset_normalizer-3.5.2-cp37-abi3-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl" }, { "algorithm": "sha256", - "hash": "1d1c7a53a6c2103925cdd6d7229f8c567379f211c869793df679f2e9f738c369", - "url": "https://files.pythonhosted.org/packages/76/84/6f1290fa07ae6978d3960caa3eb1b8019bf9284ab7c2297b00c099ef4250/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl" + "hash": "f7d486c83842422badd511868fd8a9a20e9407ace71564b6af47ce7e60a336c1", + "url": "https://files.pythonhosted.org/packages/7d/dc/65a801b66ab4c197e22c433ab25e7ac24324ac6f45a2269aca42cce309bf/charset_normalizer-3.5.2-cp312-cp312-musllinux_1_2_armv7l.whl" }, { "algorithm": "sha256", - "hash": "e199fb99720074809a7720f1c0b4d919eea8b87e88713e0f8f602f7bef543d9d", - "url": "https://files.pythonhosted.org/packages/80/c2/a7379b840292d0c1ab9fbd17d1f3967aa81794dc95bc74be8999d7fedcf7/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_x86_64.whl" + "hash": "ae4f5fea5b8b8ccff88238cc8569303e5ee95efae67fa62922a311397a71f346", + "url": "https://files.pythonhosted.org/packages/7e/24/76d2cefc25472531e4c5c7dfff68865eb1c39b78482f0fdc15b46f047830/charset_normalizer-3.5.2-cp312-cp312-musllinux_1_2_aarch64.whl" }, { "algorithm": "sha256", - "hash": "b54e7e13267d49ffbfe68e25b3cbd774dab38fa37238f71265e91b36146eb21c", - "url": "https://files.pythonhosted.org/packages/82/38/083a24028304bc85bb9e376fed801178423dcbb67495f73b6ea0624e1894/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl" + "hash": "1c50fe28bbc2ced33386f298650d91218076c05420e6cbd790b913adc41659e7", + "url": "https://files.pythonhosted.org/packages/7e/84/371eac6b30bdbcbf2d632a1a01809103459216fcaae61b8b8d922c1bfb8a/charset_normalizer-3.5.2-cp37-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl" }, { "algorithm": "sha256", - "hash": "950f23cb393f85543777b0433f082cddd25b51ab398eac7971146495679efe5f", - "url": "https://files.pythonhosted.org/packages/87/bd/fbc24d825c66f1c74f6ccdea3742c3d8354a4888e86d1315a197fee69061/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_aarch64.whl" + "hash": "3d31298449090ab8d47b7b1b2a555ff73cac7ed438a08b7ac160980c7ebed649", + "url": "https://files.pythonhosted.org/packages/7f/c5/38806a25ab5e65fc178f39affeda20858efafede2fce1ffc2556cfc9fe73/charset_normalizer-3.5.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" }, { "algorithm": "sha256", - "hash": "4582c27e8c889d64811987b5967fbd3ae0c823fe1fd933b543d55ac20bb475fa", - "url": "https://files.pythonhosted.org/packages/9a/4c/be49ada26b1f0232d57aa89bbebf997a5cc2332a5616b6eca26ff680044d/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" + "hash": "bd16aabe4a02a297c23417aa17ac6299dbd8c49f673bcd645b4929b11f5a4400", + "url": "https://files.pythonhosted.org/packages/86/bd/9b2bd1c5b7af02462c9752d33994834ff972a96b4c483eefde9e594488e2/charset_normalizer-3.5.2-cp311-cp311-musllinux_1_2_aarch64.whl" }, { "algorithm": "sha256", - "hash": "a6dac12ff6b846103483683f60c5f8fee205121adc58ffd87e90a90a3af69e99", - "url": "https://files.pythonhosted.org/packages/9f/2f/fe3f187327aac18e2d54e9d2b08e15d27bf9b642d9e51c219f130fc34d1a/charset_normalizer-3.5.1-cp37-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl" + "hash": "4275811936e2f06feff5e598fb42a1b7ae852da8e39605211892b56b81a34efd", + "url": "https://files.pythonhosted.org/packages/8c/ab/176fbfd5b64939c55d652366aa5b9ef1d767af207a3aa6ebeb0d226c484d/charset_normalizer-3.5.2-cp37-abi3-macosx_10_9_universal2.whl" }, { "algorithm": "sha256", - "hash": "0b2b1b3fa5670c127b246df1d0c059defd41f689a868a3b9d79df9b1cac42d22", - "url": "https://files.pythonhosted.org/packages/a4/c8/ab42b07cfd82e919f427fcfaa7c41abae8242833ad1aad66d42bae40b669/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl" + "hash": "0774bf9bf620249fee3e0b8b9fd3065de213be30f3aa94ce2494b3b638949e26", + "url": "https://files.pythonhosted.org/packages/8d/1f/20c8949f0676f7ab811abdeb7f4d7f1cbc6e61ff20bef08b44edeb092bc8/charset_normalizer-3.5.2-cp37-abi3-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl" }, { "algorithm": "sha256", - "hash": "f9f8405c2c758532c74fed975dbee57be1f31a6e865c031870c79a6ed3212ada", - "url": "https://files.pythonhosted.org/packages/b1/ba/ef83ae3aca816393decfa3530976f38a79812d707b80b580ac33b83f9877/charset_normalizer-3.5.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl" + "hash": "23851fb4e1b85ed3f6c2a27b777cdfe2e19fb5b38429a8faf38c7542b7665869", + "url": "https://files.pythonhosted.org/packages/95/69/0dbd0e0b9b16cfa816cdfcb3e2e3854a1f680dc07fb1245ea125e7448060/charset_normalizer-3.5.2-cp312-cp312-musllinux_1_2_x86_64.whl" }, { "algorithm": "sha256", - "hash": "ba2f37ee79e6338845261a3c5b1784e5d1acdff2c0785b284f1b633033d136ab", - "url": "https://files.pythonhosted.org/packages/b2/2c/45847198c16f4b38090cc7423b2b6a9008e438704d8ab413211832498d31/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl" + "hash": "01077390b03f7988f11d700a2194e69b119741a86b1a638b1db88891e3eced8e", + "url": "https://files.pythonhosted.org/packages/96/92/1fdf015f09ef449f50d3ac4b67c90887c9c318b727daa95cc4f866e6521d/charset_normalizer-3.5.2-cp37-abi3-musllinux_1_2_riscv64.whl" }, { "algorithm": "sha256", - "hash": "ba501e667c17d8411f98e67a022d9604ef179aff0e459b7e292c796837c13573", - "url": "https://files.pythonhosted.org/packages/b7/52/643d11ffd60e9ac2fd1fb87e167a19285b9eefeff4a40e63c87cbfbeab36/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_x86_64.whl" + "hash": "195c26fb65950f8fce54e26349852b7bdd7c5f120aeefbcc440b8a20faaed4a3", + "url": "https://files.pythonhosted.org/packages/98/77/46e87bcfc45d25ab4db7cfc9bb544bfa3ffd302289ed31ae93f5433eb899/charset_normalizer-3.5.2-cp310-cp310-macosx_10_9_universal2.whl" }, { "algorithm": "sha256", - "hash": "c1dcc36dcb96abc02236e182d17e0f71430152a6c2c7447421da2d2dc144edea", - "url": "https://files.pythonhosted.org/packages/b9/2d/918d0e98a0e679469ed05bb2d90c2088b4d315bb612969d8499f76fb5210/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_armv7l.whl" + "hash": "355ad8011081dec5412240c087a9a0c9d4d5039f3ed11a3f13e18c2b29b56c51", + "url": "https://files.pythonhosted.org/packages/9e/18/70d76670b13686237863a379928d60bd10e021f17d243ab3d7014c4a5f4e/charset_normalizer-3.5.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "a545775cfe815855ea32d7c27731d79da358ef2055b4a25830231b1622dd18aa", - "url": "https://files.pythonhosted.org/packages/b9/90/082cc45599c392f28c036a497f49e0634041a785fc3849c80ccf396d096f/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_s390x.whl" + "hash": "11a4d68a6ecda3292cb1e50239e111543ba5d709bb62a6b4ea1afcfa729d8875", + "url": "https://files.pythonhosted.org/packages/a7/95/ca9b5eabde673002c6f1e7ada1b223916fe18f6d661da7aabd4d643718f1/charset_normalizer-3.5.2-cp312-cp312-musllinux_1_2_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "6e2912d4babbc65196ac13c2f53468dc57fb8b9c25ef913e8c59ddf7c6dc0e1b", - "url": "https://files.pythonhosted.org/packages/ba/ed/1dd7cfebb4e75812934c49ca3b79757d11948053f7937ab7070c151f3c55/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_s390x.whl" + "hash": "38a873987f3be698494da8b2e3085e29da02da7b633dce73e79c699a113d7bf0", + "url": "https://files.pythonhosted.org/packages/a8/9e/09efac30b937722f46d3110ba30b875b24b2e3a266ed746cc4e376a94d80/charset_normalizer-3.5.2-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl" }, { "algorithm": "sha256", - "hash": "3d27167433c0d5f18dc850f07d0b3816221984fecdc405d6c157a6f0b8f8e9e6", - "url": "https://files.pythonhosted.org/packages/bf/eb/239c84503cc9e3ba6eb34686a24bc66e84f3924efdd7e38e751a19f6bc10/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_x86_64.whl" + "hash": "a815775b6c38d4e0ff7bcffbeba67feded90202bb6a226b8dd35f1c855217413", + "url": "https://files.pythonhosted.org/packages/a9/55/93c0e5dbd085ae0471346026abbe7e0db9ea2d6fea74e51f0b5a46f233a7/charset_normalizer-3.5.2-cp312-cp312-musllinux_1_2_s390x.whl" }, { "algorithm": "sha256", - "hash": "4b599739b93b2cbeded49645ae3c8d1405c29ddfbceac1545c87a3f9580a9e96", - "url": "https://files.pythonhosted.org/packages/c3/92/de7e32ed05341e7a9c4c877c318418197b7f2d66a3b68d561bf2ac57ca3e/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl" + "hash": "304d5463e65a35d7bb0850550e0780395395f6fcf452f04db7d5ca7cecc425ac", + "url": "https://files.pythonhosted.org/packages/ad/77/22d7e785d1e210afc2e2f58600dd1799d17a35665faf84383f002826c5f8/charset_normalizer-3.5.2-cp311-cp311-musllinux_1_2_riscv64.whl" }, { "algorithm": "sha256", - "hash": "f5542f9b941279d82d41eb0aa9f98eba36fe4df5c7086c651df7944935b37182", - "url": "https://files.pythonhosted.org/packages/ca/7b/311b3e02e8c4092400c449c850a760d8c45d900983c83a70cc07208c551d/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_riscv64.whl" + "hash": "5cde776b7cc66e4f6c99612cea4aa7269aa65863f7a15841b2c264f103822f4e", + "url": "https://files.pythonhosted.org/packages/ae/8d/213565184708fdb263ae55e2c04ee1ff748129dd65d48ed0e3502da9c85a/charset_normalizer-3.5.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl" }, { "algorithm": "sha256", - "hash": "4abdc5f9ad448c1ecbfae2974b820535d6bc6e7eef63babbab3d81cf46968c71", - "url": "https://files.pythonhosted.org/packages/ca/85/f82f8a92e31c7519410e2e1afdc630f28ec47490ce2c09a11c1a43cbb459/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_s390x.whl" + "hash": "9cf9b1a857e25c4baceeb3624e92a56df3668f398c4acba74e174d81fb4d1d3a", + "url": "https://files.pythonhosted.org/packages/ae/91/e8e946267f1c2d9e2bd651726e2fbd2addf02c4d36cea5069e32ca9d7bb5/charset_normalizer-3.5.2-cp311-cp311-musllinux_1_2_s390x.whl" }, { "algorithm": "sha256", - "hash": "ae4a097991662cd4fff0ddc74e0fe7874f82e00042fa0ea00855645ed0c79598", - "url": "https://files.pythonhosted.org/packages/d3/05/71bfc5caa0abcc45aea1f6a4d50ac68e59605ddc7666fe8494f4cd229665/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl" + "hash": "9cae88599c7219005d879f98e5ed53341e9a122af585e1091200358a3003d2a0", + "url": "https://files.pythonhosted.org/packages/b4/f0/45b579df5cabc1d5d53ea1cc35e8437d3ca768c0acccc7041517cb6fbb32/charset_normalizer-3.5.2-cp37-abi3-musllinux_1_2_x86_64.whl" }, { "algorithm": "sha256", - "hash": "aa2bb0b37202dca27175591f761108b5d34096ade1191ffe4808bdf6b1571488", - "url": "https://files.pythonhosted.org/packages/d5/fa/6a7e2a7c4b5451912b8c417732df79574354443592a88d616de03da66ae5/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" + "hash": "30fcd120b732aa79317f08dee04d7de0847822e4cf7ee0e9f445bb958832252c", + "url": "https://files.pythonhosted.org/packages/b9/7b/e8a92613236b257d3b75d532496eb21f68ad8231d7d56df94497e460112e/charset_normalizer-3.5.2-cp310-cp310-musllinux_1_2_riscv64.whl" }, { "algorithm": "sha256", - "hash": "2f293479cce755c75f1697e87c409b7ae4c555c7dfecb6e988ad13abba943031", - "url": "https://files.pythonhosted.org/packages/d6/aa/a69a2028e8bd052476c245460ab19d7de595de084dd968f2d75cd50c3e25/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_riscv64.whl" + "hash": "304d8e4d493af723536393eee0c689eb7813f4a474c8b479dee63f1fdd98f621", + "url": "https://files.pythonhosted.org/packages/bd/39/559be29a0c0f086e0bba6922babd38916cc5e0b58ced4de13ee01ea05508/charset_normalizer-3.5.2-cp37-abi3-musllinux_1_2_armv7l.whl" }, { "algorithm": "sha256", - "hash": "cee5dd7c6fb5dd52a0fe2a740f9bc6e3593f5f8b1788bde49de02086f30182b2", - "url": "https://files.pythonhosted.org/packages/d7/c7/9e48cee5c161fe24da823b61bf381921d77cb994a0a4de148e95018c1984/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" + "hash": "447441e76ec720b15e64418d32e092297340387053047c7c694f579efb0ee1d9", + "url": "https://files.pythonhosted.org/packages/c2/cd/fc7152414561ff78f9c61a4a627025f65fd244abaefc99ac4e75c6169b33/charset_normalizer-3.5.2-cp310-cp310-musllinux_1_2_aarch64.whl" }, { "algorithm": "sha256", - "hash": "6117b84ea48435e5356dc737f5121485c30920ba43375fa7b434fd753df0eac3", - "url": "https://files.pythonhosted.org/packages/e5/3f/143b048436775b0f76ac3eec145c019e8173ccc2885c8f20319b996d5e83/charset_normalizer-3.5.1.tar.gz" + "hash": "8a893cc101149f80a653f82062ebc95b34525a2614382e1da5458fe7c6997249", + "url": "https://files.pythonhosted.org/packages/c4/9f/9f52d2886d52645987d603425482c63c5045a3005db1354a7097e5ed1ae9/charset_normalizer-3.5.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" }, { "algorithm": "sha256", - "hash": "6e5e4d73d588ca5ed09df1b7dcd1b203d1df3c542e3f50d126c947d432b10731", - "url": "https://files.pythonhosted.org/packages/e7/80/b9348b5d3041209f98b4cdad7655766369233f1d533f4f4f7558e9717bec/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl" + "hash": "3d14b50de6bf4d0edf857a9386836846f982b8f524e188e2e68b96d702bcf4aa", + "url": "https://files.pythonhosted.org/packages/c9/05/5d958bc8ea503e26be25ada5430fd409cfb45dc22ff33f9f96e649613c99/charset_normalizer-3.5.2-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "e6621fb2a4988d6e53eedc455e5903e2679f3967b8acb3d639f1b63c14a2e893", - "url": "https://files.pythonhosted.org/packages/e7/a0/47b18adeed31c8f16ba9700f32c1b18594cfa09f47eb672a488c273c22bf/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl" + "hash": "b91363207bd9dc966a691e959bb47f64b30f7ac4b072be9968b366982f7db77c", + "url": "https://files.pythonhosted.org/packages/c9/87/2fea8c13dc24b3ca9c6f803a5b2dfdeae73eb4f9e12c7885ed908ff0433c/charset_normalizer-3.5.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" }, { "algorithm": "sha256", - "hash": "aa1099b956fb795e686d073568f6dc002a0bb89765ea6d5b055dd7d9bf1b116c", - "url": "https://files.pythonhosted.org/packages/f0/3e/48f4cd187b1c33189d86039e9cbe4f92c05454175504b44ff81806d4d1bf/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_armv7l.whl" + "hash": "ddf19c062bea7a0cc80f519243d2c01dd091be0cf952a0750d4ad576709559f5", + "url": "https://files.pythonhosted.org/packages/d5/ad/2a895c945ee61988dfd9ccee64f0b78dc09f29c9b34d1dd545246d78e0ad/charset_normalizer-3.5.2-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl" }, { "algorithm": "sha256", - "hash": "6ba32c4d2abf1d2fe7cf27d280f4cca5664233b0f885549c7761719eb977f486", - "url": "https://files.pythonhosted.org/packages/f5/28/c2028e7021fb89c6e56868ed0e387b8e9aa811abdd2ab3208d6578d2c930/charset_normalizer-3.5.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl" + "hash": "7e841fb9010836c992c9f12fcbd43a831de93a5f726fc1ccd8ca1d0268c5014c", + "url": "https://files.pythonhosted.org/packages/dc/3c/8e7b8a5671ad5d433669fb2a76f1a0164df2d9b1718b0206bc2a16d840cc/charset_normalizer-3.5.2-cp37-abi3-musllinux_1_2_s390x.whl" }, { "algorithm": "sha256", - "hash": "b39b69b347e5e47a3b5b8cfc005c68c1ba347474e3960236c4944a8ecd174962", - "url": "https://files.pythonhosted.org/packages/f5/7b/ade0a122600319dfa0b1000ab0f9731c94a817904cf3c5de408c73a4ede7/charset_normalizer-3.5.1-cp37-abi3-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl" + "hash": "211d5a3eb6af8f513b8d4ca19a8c1b7accab1b5f0d3175f9826b03c1a920dc1f", + "url": "https://files.pythonhosted.org/packages/e4/ed/cf505d3011ffceb12c2067a7a5d3cfe92b875d4d44bb0ff0d69375e2c184/charset_normalizer-3.5.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" }, { "algorithm": "sha256", - "hash": "366ec70f5547c640d3ce1985722490f23faf4eb5216a7eeba78277490e78dacb", - "url": "https://files.pythonhosted.org/packages/f5/e3/38b975422534a608f98c360e79c2f07c763d66dd4272300d45fb1fee54b0/charset_normalizer-3.5.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl" + "hash": "ed2a239c0ea213acc1908150a3037257083c7c083128f1a4cec2ec4b97dca491", + "url": "https://files.pythonhosted.org/packages/e7/c8/693809898870237d82785a03f3b2b58fe4c9f14669f84a7d4e623c92a59e/charset_normalizer-3.5.2-cp312-cp312-macosx_10_13_universal2.whl" }, { "algorithm": "sha256", - "hash": "96fef3e886d6a9874b14f27fc193fbdc69d5d8035783d86aa4e1cea594e695f9", - "url": "https://files.pythonhosted.org/packages/f6/0b/c5292a2462d69b7378ea89793bbb5b2b6fcf6f7dd6d1667f9619094ad553/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_aarch64.whl" + "hash": "d760fe2a4d7c3b226cb9026d6a842868d52a7901bd98420e1baf14e80da85cf5", + "url": "https://files.pythonhosted.org/packages/fb/94/01009e13b94041599004edf32e56e382c24e570f60f79bab8efe45cfe1eb/charset_normalizer-3.5.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" }, { "algorithm": "sha256", - "hash": "aae2ee51122d3ae968a3837d97dc24a0aeebb0dea23694422cd172bd30017cd6", - "url": "https://files.pythonhosted.org/packages/f9/d2/d2aad6fe0dbb44b194bf3becb60f5a0ac48446ade999a47fe7bb41eb09a7/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_ppc64le.whl" + "hash": "9b7f416ff0978e2f2249330527f0ad6fa02f4932e6199692d3b52da2048c19e4", + "url": "https://files.pythonhosted.org/packages/ff/6c/387b0e4f756a282831c1d9fc6aeb6c51ca4507ca202767c8de15ce9b12e2/charset_normalizer-3.5.2-cp37-abi3-musllinux_1_2_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "f298e218441525d3794428b4c8b8fb8662c6d3ea79925d4807ee6b9a96a3bca5", - "url": "https://files.pythonhosted.org/packages/fd/4c/9044135f42127630b6fa742feb51256353f6ab87a78f2fdd1de3de955a7f/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_riscv64.whl" + "hash": "50e3adfb96fc189eb27b1cf62d3b598b89b4bb0420d93a3d3e42e137409011be", + "url": "https://files.pythonhosted.org/packages/ff/ac/21d5c6b972285c5f095ff78afdc99f3539e3985dfcf7ff1cfbe9e772f529/charset_normalizer-3.5.2-cp310-cp310-musllinux_1_2_s390x.whl" } ], "project_name": "charset-normalizer", "requires_dists": [], "requires_python": ">=3.7", - "version": "3.5.1" + "version": "3.5.2" }, { "artifacts": [ @@ -1355,153 +1355,153 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "804728ce710890870f3aaa344b2e161172d258d768ac139d02cfd9092d0d94e6", - "url": "https://files.pythonhosted.org/packages/51/cf/5b3f53a0b74d122f023476ede40ba5d3e70d5cf475f73b899740d26a4fb2/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl" + "hash": "3dc4fd8058cea1644971207d530e1a03a184a805ffc8ebdddf0599d78a331b81", + "url": "https://files.pythonhosted.org/packages/36/8b/e6d153808bf353e152abd2fd4d8f09670d956ac78379ac46e60d7efbf04c/cryptography-50.0.2-pp311-pypy311_pp80-macosx_11_0_arm64.whl" }, { "algorithm": "sha256", - "hash": "2b34d76a652ea2b6faf777c35df230c5637842cd904e04f16230c3f9f03e4361", - "url": "https://files.pythonhosted.org/packages/0d/5c/13ea642e08e2544d0f5396122055f4820cfacb3203562197b5967125ea97/cryptography-50.0.1-cp39-abi3-manylinux_2_31_armv7l.whl" + "hash": "7a8701d6b584d76e909e3d305b7d126b41439876a5aaf76cddc67fc230eafa2e", + "url": "https://files.pythonhosted.org/packages/10/bf/8d6ebc7dded797bd0f0160d52188021211f011a2b164ef0ae1dac4587465/cryptography-50.0.2-cp39-abi3-musllinux_1_2_aarch64.whl" }, { "algorithm": "sha256", - "hash": "be224a65493ec5b74a158ff22a5522ce4a5ca1e543c647a3a4730d4a09e5f959", - "url": "https://files.pythonhosted.org/packages/13/0e/b1f92e013228111413f2e6743948b80bc24dfd3c1b87ba98ceea16f5df89/cryptography-50.0.1-cp311-abi3-musllinux_1_2_aarch64.whl" + "hash": "4061c0079120205fb760c58acab6443e217307dcf05e3702cf970e0689972856", + "url": "https://files.pythonhosted.org/packages/1a/f1/b474e930c4d910328780e3940da76f5aa5cbc48ce1fc14e44d239d9ea9db/cryptography-50.0.2-cp311-abi3-manylinux_2_28_x86_64.whl" }, { "algorithm": "sha256", - "hash": "5fe939deeb161024a6be98229c953b6591fef1f41214497a78fe793a244c017f", - "url": "https://files.pythonhosted.org/packages/14/9a/6d3a4d7852e22d657438b7bf51f66102c7d71c0e1fafeec652281d0403e5/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl" + "hash": "92e665960f25fcdc73725b9cec7a3824f279ba97a98653afe9ffac2e43668f67", + "url": "https://files.pythonhosted.org/packages/1d/7a/f08d34ce09d60f89ebd391e2ebc6ba2b995e6dd7552f41820f8085f94e53/cryptography-50.0.2-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl" }, { "algorithm": "sha256", - "hash": "d63ae8f6481fec907ac0f588eee8a90aefde112c633131fe540e5711ddbb5a4e", - "url": "https://files.pythonhosted.org/packages/1d/e0/e786934472e3ac4ecdecc7b129a0ca1a2a40dffdafcf2c3ea9d4397f8def/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl" + "hash": "630ebfea3bf689d075f82316324ff7433dc447fe6bc1bfc76524b74b4a9567d2", + "url": "https://files.pythonhosted.org/packages/21/69/64cef1f702bf6657e0cc186ed1a2891d50d29fb41586b254e1c07adea261/cryptography-50.0.2-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl" }, { "algorithm": "sha256", - "hash": "2a93d05e34d5f67fba6f891fe85d929999baa7195e853923ea6d7576c9e68c5e", - "url": "https://files.pythonhosted.org/packages/1f/ab/89e2b798d2c3925f82e2bb72d5979f3d2f6da2dd22ef4a8cd8b70d920039/cryptography-50.0.1-cp39-abi3-musllinux_1_2_x86_64.whl" + "hash": "0ec5f09541743261e66e291b4a0cbf0fb2997aeaab6d9e9c740b9dba1b58d1c2", + "url": "https://files.pythonhosted.org/packages/23/ad/ac987755d00e1e64273760228d2635ae38dae2be83e3c6e0d3289d91dec3/cryptography-50.0.2-cp39-abi3-macosx_11_0_arm64.whl" }, { "algorithm": "sha256", - "hash": "4c4188f7c0cf655be5c06342b817ed0f9595b69ffa2b12026e5353eed29dea88", - "url": "https://files.pythonhosted.org/packages/27/3a/3c5f80daa4dcd47323c7af8a2fcb90de27a33564d4fcac69846c0972691a/cryptography-50.0.1-cp39-abi3-manylinux_2_28_aarch64.whl" + "hash": "f9f6143a8c75945eb960d9eb98905a441394abfa24afaae239d514ffb2586480", + "url": "https://files.pythonhosted.org/packages/38/6b/61a3f8d8c5e1e49a6cddccafc4015cc1c0021360ab0acb4080e7a423644a/cryptography-50.0.2-cp311-abi3-manylinux_2_28_aarch64.whl" }, { "algorithm": "sha256", - "hash": "359e62deae718bce96170e223fdcb6357e4fbd3bb7a3a75f4430763532560e49", - "url": "https://files.pythonhosted.org/packages/29/ba/042ca458b8c64348c768284b5d23e69b92ed53d057ab779fee628564676d/cryptography-50.0.1-cp311-abi3-manylinux_2_31_armv7l.whl" + "hash": "a6557e5f38e065ca9fbdaf7cfc7435ecb1d113aa81a022d1b51921ee7432e227", + "url": "https://files.pythonhosted.org/packages/3c/3f/86ff33ce34cc0de6847fb96e035a1a760d81652e38643f617c02ad32ef7a/cryptography-50.0.2-cp39-abi3-manylinux_2_34_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "e2ca8fd1b6b4b82a1c4cb02841d0837e3c12336c2e24b520ab8ab3b969733d8f", - "url": "https://files.pythonhosted.org/packages/39/3b/e96c1ef71edef71057c7e3c3d982ce8fda554e0c52d0cc19c18845cde3eb/cryptography-50.0.1-cp311-abi3-manylinux_2_34_aarch64.whl" + "hash": "1981f1db4630889b9ef7803fadef12b056f428cb6b85c27ba57b774793b6093c", + "url": "https://files.pythonhosted.org/packages/40/cf/6b5c8e2fd9202d98988ab7cb5cc5c991704c4ad55f492ff408e4969f83f1/cryptography-50.0.2-cp39-abi3-manylinux_2_34_x86_64.whl" }, { "algorithm": "sha256", - "hash": "5fe002589592ed749ce77fe0695fcbd3500dd61d7d6db5858a7544c612fa8e45", - "url": "https://files.pythonhosted.org/packages/55/32/38c0d344b98c06d34b5df8946565a9c0d6dbf32c8e0730a7f05f0a3c6cab/cryptography-50.0.1-cp311-abi3-manylinux_2_28_ppc64le.whl" + "hash": "eef4c2f3423810b3070ab391f85436d2f8bbfcb286ac15cbc73190b3563b1f1a", + "url": "https://files.pythonhosted.org/packages/45/67/e18fb65592451a2acb76e9f2fbe14e0f47a8318b4c5430f1633851d03daa/cryptography-50.0.2-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl" }, { "algorithm": "sha256", - "hash": "ff838d62ec1bfce4f9ba7fa16f4a7b554cd8d0c299e6be37502161a660c84eef", - "url": "https://files.pythonhosted.org/packages/57/26/e6d4fc8512a51a5f9ee7bfdbfb853bce1197087df40c9ad993ad370b846f/cryptography-50.0.1-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl" + "hash": "f21e8a22c8605750c7af886bab299a363721264061b4ac0a30efb73cfd58efc5", + "url": "https://files.pythonhosted.org/packages/4f/87/ef344a9e616871f2519c22d6afcda79ddd5d35e9592d95eb6e677608d055/cryptography-50.0.2-cp39-abi3-manylinux_2_28_x86_64.whl" }, { "algorithm": "sha256", - "hash": "05ba322c4da95b262a212c345af888ef2c37c88c0509756ea00a0e6d68850f23", - "url": "https://files.pythonhosted.org/packages/5e/a5/9ec7e81e8526c0d7a387d73386b2daed3f39e10d81a85930bd1b6bfba65c/cryptography-50.0.1-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl" + "hash": "85d0d9a31b9098e98534226d5686b47264b95e62ce459dc2e62fdfc809f9fe93", + "url": "https://files.pythonhosted.org/packages/68/e3/f2298d3bb55e0c4a91841ec4d01b3f020ba8c5fbf15ccdcc6dcf03f97025/cryptography-50.0.2-cp311-abi3-musllinux_1_2_x86_64.whl" }, { "algorithm": "sha256", - "hash": "fd3718b960d0b5dd213cdf03f3bcb7000e69dda0de8b956061947ff6bcff5558", - "url": "https://files.pythonhosted.org/packages/63/8e/f1f955e0921dd2b6d22eae7e8d24a4c4b638d10735ffbf6a71f99eb0fcb8/cryptography-50.0.1-cp39-abi3-musllinux_1_2_aarch64.whl" + "hash": "25784ce8b9621c90c643efb9e1e2162ab3b0224cae446ad5e70e7fcb1ce18b51", + "url": "https://files.pythonhosted.org/packages/6c/5d/906970b83bbfc1f5bbfb677a143c181f2801f23b6a7204a3b47c42c97e65/cryptography-50.0.2-cp311-abi3-musllinux_1_2_aarch64.whl" }, { "algorithm": "sha256", - "hash": "2ebbfb0f1fed745e91796e3e1080a1440423fdae8ece1b995a1d80883a409054", - "url": "https://files.pythonhosted.org/packages/6e/2b/214cf0cf93db9628c3c20c896b229f327f6fb1b20e4b3743d8ad3f00af8b/cryptography-50.0.1-cp39-abi3-manylinux_2_28_ppc64le.whl" + "hash": "87e9ce85beb6b328ba370cc6e6aea483c92617b4c95b1d33a49297eb662bfb04", + "url": "https://files.pythonhosted.org/packages/71/37/6202e488cc1eb625ea110c292c6bda92823176e023f427d8d5660ce8d632/cryptography-50.0.2-cp311-abi3-manylinux_2_34_aarch64.whl" }, { "algorithm": "sha256", - "hash": "fb4b9672d389c738b175c4166e78310f8a70358886aacd9173ee03a85ffdc671", - "url": "https://files.pythonhosted.org/packages/73/35/5c3717edf9e68a0550ce04e28eab493fe545eccd81742af03f6a75fe260b/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl" + "hash": "a582ab2ae1d34f67112cadc86702774c9ea4374df6bca6afe672817203c99134", + "url": "https://files.pythonhosted.org/packages/7b/2e/7212ca32fd43dc91f2f41db20160b268098874b4c9a0e7be94d6835f5b2e/cryptography-50.0.2-cp311-abi3-manylinux_2_28_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "9ebcdd5519be9b652a46f507817a74591774fc3d6923ac364e4dfa64e36b291b", - "url": "https://files.pythonhosted.org/packages/7e/22/c3654cccc856e9d682817b04ac3ee79731cb09ca6f95996a95c904de2883/cryptography-50.0.1-cp311-abi3-musllinux_1_2_x86_64.whl" + "hash": "ac9ed99d81760c62fe89d5f0815cdfa1ba9a35141cf30f1c2d044f04b4803d2e", + "url": "https://files.pythonhosted.org/packages/7c/52/9af10e80ac16b0fcc2123f9cbd5e7afbd0fd5075bb7a607c592258a39cda/cryptography-50.0.2-cp311-abi3-manylinux_2_31_armv7l.whl" }, { "algorithm": "sha256", - "hash": "e22dfed744bd4002e909464cb23d2f0b05c6f3113a79ef2e9864a53db737c733", - "url": "https://files.pythonhosted.org/packages/7e/3c/0e77bd5ffcf078e9dd27d3074aad6c030d9b10d0bf69329d573c927a188c/cryptography-50.0.1-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl" + "hash": "7c6d0330c472d96f6a6afe24d80dfdf15176c33096f0a4397ae4c60f3dd3be48", + "url": "https://files.pythonhosted.org/packages/83/28/38fdce17e60f6b825e69fc3b7f75e70a6612759980704697e1de4cbfaf6e/cryptography-50.0.2-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl" }, { "algorithm": "sha256", - "hash": "ca83d00d9e69cd5eb63f2e69c3a5a59e0cecae5ae14c6ae0b35830fe3b37bad0", - "url": "https://files.pythonhosted.org/packages/84/a9/ee16a903f13755e914d1eecc482fe64d1f10761c3960e5d8fa6837377aff/cryptography-50.0.1-cp39-abi3-macosx_11_0_arm64.whl" + "hash": "f265528741e048bce55c3463ed721fb0aa45a5888d8add8cfeccb3035451bbdc", + "url": "https://files.pythonhosted.org/packages/8f/30/e86d7d518489b0ae2497091a35287abcb1a2ce4037837a34afbe9b1d6964/cryptography-50.0.2-cp311-abi3-manylinux_2_34_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "01f41478cf33fc605a6a089cd56d28b45c6c0b45a1928b61797f2621a04bac71", - "url": "https://files.pythonhosted.org/packages/84/d5/7d1fe1cb93f91c428093ff234e128c89ba8ea61a6f26aab406081f9b996e/cryptography-50.0.1-cp39-abi3-manylinux_2_34_aarch64.whl" + "hash": "9c8402a82ea0dc4ceeab793db05f0fafa8ca139ca34fcde5df0f596103c74107", + "url": "https://files.pythonhosted.org/packages/90/5b/f2fdb13cd0b96f6f932c8627bb292a45f11c64d21620a8e120aee9a3b848/cryptography-50.0.2-cp39-abi3-manylinux_2_31_armv7l.whl" }, { "algorithm": "sha256", - "hash": "51afcfceb15597cf2635068e4ac9a56b2abde622edde17f37d85fd7b5306497a", - "url": "https://files.pythonhosted.org/packages/85/66/6ccca4722987ddedaa7fc9c3f4708af7431f5535666c174350830888c6b7/cryptography-50.0.1-cp311-abi3-manylinux_2_34_x86_64.whl" + "hash": "7b46165bb56eb4704e2eaaf86f3c940d19154535d9b0ca7d6d590b04060e00d5", + "url": "https://files.pythonhosted.org/packages/9d/af/182eb91b0df3fe75c4d9f26fe70684569566745f6ba7e5c9c73a862c5252/cryptography-50.0.2.tar.gz" }, { "algorithm": "sha256", - "hash": "9dde0a357190eb3b1da1bb9ab750e9c85cba82ca5977aa0836cbb94e92611239", - "url": "https://files.pythonhosted.org/packages/8c/eb/5d7124083e8d8cda8f5b348f544b71ad6f707ad63193758ef4d8e569da02/cryptography-50.0.1-cp39-abi3-manylinux_2_34_x86_64.whl" + "hash": "1ba34f04897fcdaa73f74145c25f3ec146fbd56593853e88adc2e811303c5f42", + "url": "https://files.pythonhosted.org/packages/b6/b1/d9121a717e0f893c64bd6ca7702614778d7df2a5c309128a002421788516/cryptography-50.0.2-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl" }, { "algorithm": "sha256", - "hash": "53e279950892dc102c6b4e52af03ae5ea92fac572a1ddab78ca73a997f62b69f", - "url": "https://files.pythonhosted.org/packages/90/34/9ce9a62ed9dc82ca9fd6a34445b6904af56e5f38b3eae2ed32e49c36053d/cryptography-50.0.1-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl" + "hash": "0ddc924c04591c2811ca024d62ecad4f7f6f08af8939c211438f48a16bd23602", + "url": "https://files.pythonhosted.org/packages/bc/ce/7e4f662b1e3c393513569e402cfc85ac7da0bd3d5435e122a3140219eb2d/cryptography-50.0.2-cp39-abi3-manylinux_2_34_aarch64.whl" }, { "algorithm": "sha256", - "hash": "b8f852c65863251b9e3a1b8c150ce21e59b522dbb6a7d4bc80e680d38388e986", - "url": "https://files.pythonhosted.org/packages/ba/19/797e2aaac9df6a66f1550f49979dc1b1e39ecd2077501c30efa81e8d5d67/cryptography-50.0.1-cp311-abi3-macosx_11_0_arm64.whl" + "hash": "ee247f5c245c9a2fe7c8e2214e295918838e44e00a45a6718451e4004219e767", + "url": "https://files.pythonhosted.org/packages/bf/f1/1c1f6874e8550cfddd4b688ceb38cefb6ed15ceed224d56f133f3d88c214/cryptography-50.0.2-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl" }, { "algorithm": "sha256", - "hash": "5dd9bda1c12b4162f6ff568eeb5e0ff956c28d14406e875cfe8a63a2d414ff20", - "url": "https://files.pythonhosted.org/packages/bb/ad/5d6702db60b1e40b41ef513b6967ff5848f307d50f8449baf1634f5908f1/cryptography-50.0.1.tar.gz" + "hash": "dfe9763530994147d9af1def057a5b9658b00e8f8fe8743d144d1e0911c2e454", + "url": "https://files.pythonhosted.org/packages/c1/63/61b15dc1a8de03fe0adbe3fd7608b3ad5c73bf50993bbcb1faaa930afe33/cryptography-50.0.2-cp39-abi3-manylinux_2_28_aarch64.whl" }, { "algorithm": "sha256", - "hash": "9cb3cb952cf5a8abd50c782a98a89d71699715e802fe349704b47f2425b42a94", - "url": "https://files.pythonhosted.org/packages/c7/27/8d207af749c453ee17ea087340b3f2b4adef75aadd1d277b1b129bdda84e/cryptography-50.0.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl" + "hash": "9dab55f57c74c3cad24c323bacbbd04be4705ba6eb0d92e920b1fc4837ed5079", + "url": "https://files.pythonhosted.org/packages/d3/69/2c833a049475e0a3444e94c7d0aca0aa51d166374a449b09e92ac98138de/cryptography-50.0.2-cp311-abi3-manylinux_2_34_x86_64.whl" }, { "algorithm": "sha256", - "hash": "407fe2b6db00939c05c0e945e9914238f2f0a430974839429dafc82b1ee6bee5", - "url": "https://files.pythonhosted.org/packages/d6/51/3f9701867a46b6c1740c9b52fc4d3bed6cbdcfedcc9b6e64305c07f39cff/cryptography-50.0.1-cp39-abi3-manylinux_2_28_x86_64.whl" + "hash": "ce47f66801c20ec6c6632453bb5960fe38939e9306970b48b3a5a26de7745d94", + "url": "https://files.pythonhosted.org/packages/d4/aa/f3f6e0de7e6253b8baa8b2d8fb9d50924fa75cee3d4624bd4bc1208ee923/cryptography-50.0.2-cp39-abi3-musllinux_1_2_x86_64.whl" }, { "algorithm": "sha256", - "hash": "fc3ed7ebd2a8c96f5b166de0ab9b624996bef3b07bbeb19364dfb78222c22c80", - "url": "https://files.pythonhosted.org/packages/dd/04/557fc5ead96a829e0bc812a3b9dc4a52a2f27e4f7f5950da7ff27653a805/cryptography-50.0.1-cp39-abi3-manylinux_2_34_ppc64le.whl" + "hash": "c5e67125c7dca78d199ec4e116aa93dbb83494808ecbb8211a2cb09b1bf41dbd", + "url": "https://files.pythonhosted.org/packages/d5/8d/6d585339bedf85d45044c85d8412dac53f2bb6f918e8b7777efba1787844/cryptography-50.0.2-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl" }, { "algorithm": "sha256", - "hash": "51593d180cf6d179bde5c5d065bed81386b1f381656ae7d042b7ffc87a9895ad", - "url": "https://files.pythonhosted.org/packages/e1/1b/82f0f0d8858d4432be1af790477edf62aef90324041aa07c57e57bef1af7/cryptography-50.0.1-cp311-abi3-manylinux_2_28_x86_64.whl" + "hash": "79def8d059362e7831389ed3be0ecdf58a89386e1271e35dd9f5af84e81bffd0", + "url": "https://files.pythonhosted.org/packages/d9/69/c9bd862c3bf43d6399c433caf002df16e2dffd4be49bdf515cda38038711/cryptography-50.0.2-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl" }, { "algorithm": "sha256", - "hash": "76de83fbd91ac49c0feaaa983d0748fd7a53176afac5fb3bf7478d244f0eb527", - "url": "https://files.pythonhosted.org/packages/e3/38/45abd72ef63f2e7d0754a6cacf97bd8b69512ace7f6130d24c39ece65da2/cryptography-50.0.1-cp311-abi3-manylinux_2_34_ppc64le.whl" + "hash": "fa8f5efb344d6908a1ce62f4a24e2e5780f825d6f53f5f50ec5ffacac72936cb", + "url": "https://files.pythonhosted.org/packages/e5/56/d194340cc4a57535e82e1bee9e89667ac4b7c13b5d3f59686deae3094dd5/cryptography-50.0.2-cp311-abi3-macosx_11_0_arm64.whl" }, { "algorithm": "sha256", - "hash": "e74591e283fe6eb956416c929eb58262a719fe0311fd9054c62c3350ed8760d8", - "url": "https://files.pythonhosted.org/packages/e6/de/d3cdc2815697aae84126cbd6a030ca7b6b452e28a88b501b836bd3aa7a86/cryptography-50.0.1-cp311-abi3-manylinux_2_28_aarch64.whl" + "hash": "58ddb5a8e3179d12f19e4ea34d2d32e9d63a4baa142c875c1eb59f41b7243acd", + "url": "https://files.pythonhosted.org/packages/fc/35/b345bdfa40c9126df1a9d33236aa98418367931b8725f84fc3ae2b98dc59/cryptography-50.0.2-cp39-abi3-manylinux_2_28_ppc64le.whl" } ], "project_name": "cryptography", @@ -1511,7 +1511,7 @@ "typing-extensions>=4.13.2; python_full_version < \"3.11\"" ], "requires_python": "!=3.9.0,!=3.9.1,>=3.9", - "version": "50.0.1" + "version": "50.0.2" }, { "artifacts": [ @@ -1613,13 +1613,13 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "7d47ff88ae6c5f6c43d28c30b6f7fd59a24741175a1771ab06c969d946d7dfd0", - "url": "https://files.pythonhosted.org/packages/55/b8/6648cadf38b61045262bf2a534e526f04eb833275ad1fc77a2026e9f7e3a/editor-1.8.0-py3-none-any.whl" + "hash": "96277ffb0c529d9b54f0c10bff4bd39d23ab1298504424232319b1a26b41240a", + "url": "https://files.pythonhosted.org/packages/40/fd/f139b1ffdd06a06c6a2e3e542fa88963b59cb6165fd572d1220e901e288f/editor-2.0.1-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "b07e1bbcb8b33f05c2e6ed3ce77ee9756354ada840a18aad7c0536d967fe4c0b", - "url": "https://files.pythonhosted.org/packages/ae/5f/fe06c2a13a5282dcef4c7133bb348d4125a9aa69c5fb49037a004599d73a/editor-1.8.0.tar.gz" + "hash": "6ecdff42bf4a32ba250f42676dbcdd75ce5fa498ca8dd1e1918c63a2518538cf", + "url": "https://files.pythonhosted.org/packages/c3/10/d3ace6204a16ad24d9c5e330b6b09e020967d3dda3b5a6c34caa182be7b7/editor-2.0.1.tar.gz" } ], "project_name": "editor", @@ -1628,7 +1628,7 @@ "xmod" ], "requires_python": ">=3.10", - "version": "1.8.0" + "version": "2.0.1" }, { "artifacts": [ @@ -1703,19 +1703,19 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "22e58ca3b1ae3b98993b762d7338367ae64fe50252bf78d59da3bfebcdf1cedd", - "url": "https://files.pythonhosted.org/packages/01/a4/9b63d595d748e3aff8812b65eacc1a2c4bd90b7c2012e08e72373b4835eb/filelock-3.32.4-py3-none-any.whl" + "hash": "65ff0d0190ea42038b32bda4b77834fb05be2cad4c5b9b01aa4dfb3614536e52", + "url": "https://files.pythonhosted.org/packages/15/df/31098c5aeb4d966b553641472bd55fcf5fdfac953549894b8a765ba44e91/filelock-3.32.7-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "2bde2e4cf732e0153406d8a7bc80620ecf5e621fe0d25e41143c4e3b4733ff30", - "url": "https://files.pythonhosted.org/packages/6d/30/03b03951873a1a0ffc7e8ca0e10c15597b59e8d0e39260704cd2ea087bc4/filelock-3.32.4.tar.gz" + "hash": "37b8a3d9811b0f9aef7e5ec5c71bb320de52df51e6ca9bcd6f5ad81187660da7", + "url": "https://files.pythonhosted.org/packages/0f/59/e19834834cb01a32febfbb0f8a23a9088088f5d45991824ff2bc3b5e8acb/filelock-3.32.7.tar.gz" } ], "project_name": "filelock", "requires_dists": [], "requires_python": ">=3.10", - "version": "3.32.4" + "version": "3.32.7" }, { "artifacts": [ @@ -1769,83 +1769,83 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "2d2c9c23cf68e2d4565505f8b5cd31b269259e1fbfb57bcc3d4d1cd34ee274d1", - "url": "https://files.pythonhosted.org/packages/6d/16/f06ee39db14422d5f749cdcfeb7b8a7b426e087dace9d2c8675633fe6eb4/gevent-26.8.0-cp312-cp312-musllinux_1_2_x86_64.whl" + "hash": "810cd040eda484e8ce73d649fa994a4fc247b427023db52d4daaa10e8fd2f4aa", + "url": "https://files.pythonhosted.org/packages/a2/73/a4414d7e95be1287b3dbe6310331c2658395bd4ada69a19f98c3aecba4c9/gevent-26.9.0-cp312-cp312-musllinux_1_2_x86_64.whl" }, { "algorithm": "sha256", - "hash": "946848924dd80d29184367c0c9a4fc809411d17afbe157128687df8d7d838560", - "url": "https://files.pythonhosted.org/packages/05/59/967712d5cbabb82fb0619914b82266d0150322966376430df4c73dfbfda4/gevent-26.8.0-cp312-cp312-musllinux_1_2_aarch64.whl" + "hash": "c59d95daacf71dfb763824b85a89b06ca4faa74b2e7df926714d439d5a47ee26", + "url": "https://files.pythonhosted.org/packages/05/89/c07717de442a898229a5e8ec6fbaf878e4d328868362c905fe14c5a72521/gevent-26.9.0-cp312-cp312-manylinux_2_28_x86_64.whl" }, { "algorithm": "sha256", - "hash": "be8810be489005bee66d2c6ad1025bfa4f5cfc46f50c775876b35ffe2acf7e3b", - "url": "https://files.pythonhosted.org/packages/0f/5d/a5e9b1dee7395c68a2d137eb31154cbf5357a54eab19595273145dc69ebf/gevent-26.8.0-cp311-cp311-musllinux_1_2_x86_64.whl" + "hash": "83c51ffa0ef9c960fe3b6bc0a9de8997cd04a9476ff5d4e682c0c62481ef3924", + "url": "https://files.pythonhosted.org/packages/0a/7a/c237d66fe48e0391d88f03448576ad127befc9d30ff0f9e3269272e15d1c/gevent-26.9.0-cp312-cp312-manylinux_2_28_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "108614bd47ec714ed93d141965bac8c17e44bbae08e238696da6261f013caa83", - "url": "https://files.pythonhosted.org/packages/14/99/b82608b486cd9f79a4ebb480779900e7bb7dc095dc9217991fdb173b0084/gevent-26.8.0-cp312-cp312-manylinux_2_28_aarch64.whl" + "hash": "4dd4703d71737a456c1c9df5cd43a82934e5b10c87549caa02495f487d1ef0b1", + "url": "https://files.pythonhosted.org/packages/2b/ac/dd3137ae695aef399373088c84c66398f3eac597fba542f0a22280bc21d6/gevent-26.9.0.tar.gz" }, { "algorithm": "sha256", - "hash": "848c2d1441e9fc5ff5b32aa347a2de561ac3d19abda3d9d61cd0e98aaeb9d8d4", - "url": "https://files.pythonhosted.org/packages/19/ec/739e90f26a7d98fd8f70cf737e7720cb872bc9cd61b2b3954d179f24801d/gevent-26.8.0-cp311-cp311-manylinux_2_28_aarch64.whl" + "hash": "7dce7f1a5be4be303e7a3c1db2e453abc5495c8b91b8708a0e64e116b3c6c4db", + "url": "https://files.pythonhosted.org/packages/3b/c8/842bc8257cd5ef128ebf4354ea1d6b9ccdfe9cc556ee44bb4f8dd78dee94/gevent-26.9.0-cp311-cp311-manylinux_2_28_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "b564b959a5391bcfa607bf991a6c368fc0cc7f12730ab0d21777839f643f8285", - "url": "https://files.pythonhosted.org/packages/1f/1d/35af72b6cdc2e48017d92cb44a25623ca32515aef805727eddffb8c60025/gevent-26.8.0-cp311-cp311-manylinux_2_28_x86_64.whl" + "hash": "8e47e8c24135936bc01198f93aa97061e543a8b0d7a339d34182c35901b41da0", + "url": "https://files.pythonhosted.org/packages/43/50/ffb16a1ce6e446f56bfcdd724de0e3fa9a74d7f473baf4b1622e53072f94/gevent-26.9.0-cp311-cp311-manylinux_2_28_x86_64.whl" }, { "algorithm": "sha256", - "hash": "5fa5728333b744f5d10bd6fa5474616c7a1a76da81044cfa3d2d0fae2d245ba2", - "url": "https://files.pythonhosted.org/packages/29/20/865715d8b4d723253ef09292358027aa5eae02ca0710aee4664d5b477c4e/gevent-26.8.0-cp310-cp310-musllinux_1_2_x86_64.whl" + "hash": "5415eb380995015664d24672a884b2d93cddc0838beec13a6a96c6ac3be23f84", + "url": "https://files.pythonhosted.org/packages/6c/f5/d98b0701ddc4b72389d2be64116568f01872d27fe5400b303c9d457d7a47/gevent-26.9.0-cp311-cp311-musllinux_1_2_aarch64.whl" }, { "algorithm": "sha256", - "hash": "8e2be34e41557387a422e78c0124e2b90a4df9f1cc87c891503bf34a95ae1ce5", - "url": "https://files.pythonhosted.org/packages/4f/f4/a49ac5d1b508dfcc9af2d08435d9c2c71fdc12d44fe75156c6441f6127de/gevent-26.8.0-cp312-cp312-manylinux_2_28_x86_64.whl" + "hash": "cf1544a8fa0d94563e1f31bc23363f437ae56b952f220dd588ca43c48c844ff3", + "url": "https://files.pythonhosted.org/packages/89/9c/4e3cc8f1a901ce0606d59a52d024049be43931a5c1143a5e060d3b697ce5/gevent-26.9.0-cp311-cp311-musllinux_1_2_x86_64.whl" }, { "algorithm": "sha256", - "hash": "94544a0f5a1d14b711cd630eab0581a53f3ea89370f8963df9ced62ec6552ca9", - "url": "https://files.pythonhosted.org/packages/56/94/a5d38541f3a9fd77aa8defe8bb66698176be959cebda9c2be00fc5ad9e63/gevent-26.8.0-cp312-cp312-macosx_11_0_universal2.whl" + "hash": "ab1db9defde9ea9bd1825057fd90474148f74dcc57d104ddc62343092eaa256f", + "url": "https://files.pythonhosted.org/packages/8a/95/7bcd42a2aaceb7ad464f66fdd2be8df640c288713fd3b932f86f22e0fa86/gevent-26.9.0-cp312-cp312-manylinux_2_28_s390x.whl" }, { "algorithm": "sha256", - "hash": "102087dab60f43f52be74e4be7e42345de27d1968707ded31c785e91d41978b1", - "url": "https://files.pythonhosted.org/packages/ae/9b/cfbc57b758d0435889be2726a5ae1570e6563a24976f4b62e5ecf81b3c3d/gevent-26.8.0-cp312-cp312-manylinux_2_28_ppc64le.whl" + "hash": "e9915c9870160c2d8b4d97ceb55b5598c33cee2dcef0635db363d5519147556c", + "url": "https://files.pythonhosted.org/packages/9b/7c/83543ad585186f4322e96307676ade12bd38e6e104bb158fa1bd8dd7653c/gevent-26.9.0-cp311-cp311-manylinux_2_28_s390x.whl" }, { "algorithm": "sha256", - "hash": "0b7684220f4cab1dda07143f4494c6883934bf4378014ce860ccba45d252d82e", - "url": "https://files.pythonhosted.org/packages/b0/fb/c258724be7d5c63812961a7448a2f02be84ba71f272021b9a608aceed685/gevent-26.8.0-cp311-cp311-manylinux_2_28_ppc64le.whl" + "hash": "0b3f0ad9dc8e2ba585e0f6498c96b78ba61b1214f5b2e17081839c93b69a58c3", + "url": "https://files.pythonhosted.org/packages/c3/7f/1068c8eef85f04bb9d8490140f6adba47c0676d95e66a2d9549bdad0c22c/gevent-26.9.0-cp312-cp312-manylinux_2_28_aarch64.whl" }, { "algorithm": "sha256", - "hash": "8e22ce9c9b2fbe498c00665cfa4a598ce8d04dec8ea60047c0c4e2e6ce4ee686", - "url": "https://files.pythonhosted.org/packages/b7/ce/605c5a38e50b3043f2e8c6c0885faf8b37fdaeea3cb714e840db19bf5bda/gevent-26.8.0-cp310-cp310-manylinux_2_28_x86_64.whl" + "hash": "f88d4eabc75ff3d48322fb8014ba82c062808c3f35ce6e30d474b74b57582208", + "url": "https://files.pythonhosted.org/packages/d7/6f/2d256bbcf675299aa14bc5962a0c8804c96567d635a3bc62ed907a95f1b7/gevent-26.9.0-cp310-cp310-manylinux_2_28_x86_64.whl" }, { "algorithm": "sha256", - "hash": "96039f41bbde6dcd72559e5ffbd408a04f46774b47d991d4cf032da8fa79e5a0", - "url": "https://files.pythonhosted.org/packages/b8/eb/5f2db8013f1a4a6df2c23201f384a066f13ff5764a9f62a608c8a50ac8cc/gevent-26.8.0.tar.gz" + "hash": "f91b87ca2ac3af502f7ee806c266ba6f64e4d1591e2e29456ed7cc538e5473ec", + "url": "https://files.pythonhosted.org/packages/df/23/fad2ba73045e4ee0dccf2e35a6fe19908309bd6176d1e5e3a18bb780e96b/gevent-26.9.0-cp312-cp312-musllinux_1_2_aarch64.whl" }, { "algorithm": "sha256", - "hash": "c2730709f8e894c167415e1d3752d63e6ed40f28b60bdb2ba7bdf973fa29296a", - "url": "https://files.pythonhosted.org/packages/c7/2a/82ab6a41a064792e3df4a9c03e1e90ccf622f8f3352d9a22c1e03e2f159e/gevent-26.8.0-cp312-cp312-manylinux_2_28_s390x.whl" + "hash": "46fc47fa2d8a685efd05ff4c4aaab3a390915edc58936409bb63570e4bf51c7d", + "url": "https://files.pythonhosted.org/packages/e9/13/34a35b8df7dd5a79b8a83bb0cabd6fca5468457856610c35be80383929c7/gevent-26.9.0-cp310-cp310-musllinux_1_2_x86_64.whl" }, { "algorithm": "sha256", - "hash": "304a486b1833a83a028c8c02bbdff62867dc2ee1c6ba654d32d7340ab7b19afb", - "url": "https://files.pythonhosted.org/packages/c9/35/df8f0e37975a4a8d832542316f7abc5107fa3cf516201fd40a7588446b0a/gevent-26.8.0-cp311-cp311-manylinux_2_28_s390x.whl" + "hash": "979caf5b96f5806cb5b66fd2c7972f1043cc4069d1ee8b2998c42cb0b39dc445", + "url": "https://files.pythonhosted.org/packages/f1/90/2f09ad04b52ad8888fe6a0a4a543c5445b27c78ccbde8f3104ee3ac618f8/gevent-26.9.0-cp312-cp312-macosx_11_0_universal2.whl" }, { "algorithm": "sha256", - "hash": "5a2fae0fe891f7975cc0a5e4ac3b29bb0fc569a271de4b2b8fdb73dccbf7bc8e", - "url": "https://files.pythonhosted.org/packages/de/cc/d4eb977aed853f2fab530b46de99d7ce6ff3a0993ad56251c0feee5db837/gevent-26.8.0-cp311-cp311-musllinux_1_2_aarch64.whl" + "hash": "c47c70f1bc131178a7b7ec1f5afb8ac6b1573ed1caf5c31889261e8b5caae0e6", + "url": "https://files.pythonhosted.org/packages/fb/86/af739c30971f9f083868cfdeaa4f1f0a0a91bb760011a307d6407f94c731/gevent-26.9.0-cp311-cp311-manylinux_2_28_aarch64.whl" } ], "project_name": "gevent", @@ -1875,7 +1875,7 @@ "zope.schema; extra == \"docs\"" ], "requires_python": ">=3.10", - "version": "26.8.0" + "version": "26.9.0" }, { "artifacts": [ @@ -1901,13 +1901,13 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "8ab28c9da863cdd9e7d7694ec46cf3e6c9a12d8a30a1acd3447aec11975d530c", - "url": "https://files.pythonhosted.org/packages/6f/5e/49cc172da4d0578644ba37cec5cb365b1fefc603b26edea9bcac1c7f830a/gitpython-3.1.61-py3-none-any.whl" + "hash": "bd70c5ec05cd2b797423e7eb312147d2458d3cca92085888fba2213f85905537", + "url": "https://files.pythonhosted.org/packages/fa/48/f36d233ce749d1bb880cb5e6f8bb171dc2effabc7435c31da604d831b3ec/gitpython-3.2.0-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "f51c24d8c0f733a195447385f5774a5dfe8767f5acfd7994a33755644c6ecc95", - "url": "https://files.pythonhosted.org/packages/6f/61/3285044215fb596bf093e39ccb96ece0a1076a8ca57a61e069a6a33cdb1b/gitpython-3.1.61.tar.gz" + "hash": "fb92310af6844d96adc95ca066ed2e617c00e1dbd146a326626c81e72e18cc2e", + "url": "https://files.pythonhosted.org/packages/6e/2d/6f6e649818da44d4499604802c89329b8d9799687a124e3a5e467a643336/gitpython-3.2.0.tar.gz" } ], "project_name": "gitpython", @@ -1916,7 +1916,7 @@ "coverage[toml]; extra == \"test\"", "ddt!=1.4.3,>=1.1.1; extra == \"test\"", "gitdb<5,>=4.0.1", - "mock; python_version < \"3.8\" and extra == \"test\"", + "mock; extra == \"test\"", "mypy==1.18.2; python_version >= \"3.9\" and extra == \"test\"", "pre-commit; extra == \"test\"", "pytest-cov; extra == \"test\"", @@ -1924,14 +1924,11 @@ "pytest-mock; extra == \"test\"", "pytest-sugar; extra == \"test\"", "pytest>=7.3.1; extra == \"test\"", - "sphinx-autodoc-typehints; extra == \"doc\"", - "sphinx<8,>=7.4.7; extra == \"doc\"", - "sphinx_rtd_theme; extra == \"doc\"", "typing-extensions; python_version < \"3.11\" and extra == \"test\"", "typing-extensions>=3.10.0.2; python_version < \"3.10\"" ], - "requires_python": ">=3.7", - "version": "3.1.61" + "requires_python": ">=3.8", + "version": "3.2.0" }, { "artifacts": [ @@ -1970,128 +1967,128 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "12e2ee66c2aba86133f10fd99d6a8856c6d351ffb7be0e4d52ef2cc5fbb705b2", - "url": "https://files.pythonhosted.org/packages/b8/d7/734e5f198888876b42d7616ff6644c075baf6b8a2412deadd6b0e1b8b20c/greenlet-3.5.5-cp312-cp312-musllinux_1_2_x86_64.whl" + "hash": "3dbb4596a6a4e5d47121a33ff20533a81e60f302d9e67b69909a8bc21a43f0a7", + "url": "https://files.pythonhosted.org/packages/ef/31/9b4e140bc24d0ad7927ebd651f5608b0acc2334d061748c3b6ad19085cfa/greenlet-3.5.6-cp312-cp312-musllinux_1_2_x86_64.whl" }, { "algorithm": "sha256", - "hash": "816230f469381ad0a43abc9fa8dda5a699e32fb78958dde32ded93213b70a667", - "url": "https://files.pythonhosted.org/packages/07/67/07ecd6d85c0f253363cbc4ac9e7dd048ca571a267fbccfea084d6009ac3b/greenlet-3.5.5-cp310-cp310-macosx_11_0_universal2.whl" + "hash": "874cea8bb1ec1ddccbacbd027856f6bf496f6bc18aba97a918c20e067edab236", + "url": "https://files.pythonhosted.org/packages/07/59/9c6b723a559b53bee0980a5dc57577d434891dd454f0fe54ed6e22d4e4ce/greenlet-3.5.6-cp310-cp310-musllinux_1_2_aarch64.whl" }, { "algorithm": "sha256", - "hash": "adb4bae02e91a8e863e48b177e4014bdcac8a6b5e047ea1df687a61534b85e6c", - "url": "https://files.pythonhosted.org/packages/0b/d8/7cc97c142388aef03f622e001c572c4f84e9252a439549d483f555771970/greenlet-3.5.5.tar.gz" + "hash": "4fb8e59f68845d56c23c031dcd79c329f345e4a9d2ffac91c3d1ab366bdc457b", + "url": "https://files.pythonhosted.org/packages/1b/24/9b071d11c8bb9f5f38cccacc38fcc234d91997a4c395cc2bf43ecae89642/greenlet-3.5.6-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl" }, { "algorithm": "sha256", - "hash": "c69bed34470abfcd456984fdadaa18e62169af4480335c45f3c32d1d9c12e638", - "url": "https://files.pythonhosted.org/packages/18/5e/58c561efde575c4ca070030e2e0513e8d1b07b76d8a2d84a9bcef1becd42/greenlet-3.5.5-cp310-cp310-manylinux_2_39_riscv64.whl" + "hash": "b7d501d5eb5d4f67207df364752ad697465b834268744be7581c18d81d35d41d", + "url": "https://files.pythonhosted.org/packages/1d/05/dc0d54e90af2f192724936799cee990687792ff54a4638d3ae0e0a0145c0/greenlet-3.5.6-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl" }, { "algorithm": "sha256", - "hash": "a5433cf291e0ef9114bd14d0d824db6e5e4a43033234bca48181a9597acca07b", - "url": "https://files.pythonhosted.org/packages/24/35/426733bc24247ee17bb76df90f550c299ff5f8572b2bdd7cacb5c53fd994/greenlet-3.5.5-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl" + "hash": "e85880b538e59a59f55117b81f208a6660ad5ac328aad9305f812d9b8bc67a0f", + "url": "https://files.pythonhosted.org/packages/27/89/366d2af5061eeefa5012f510d95a99c8620dcc457609838db4d538820318/greenlet-3.5.6-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl" }, { "algorithm": "sha256", - "hash": "49520f0c95a48b42cf55414b8e8479beb274ea70431afc33e3f79903c71f4380", - "url": "https://files.pythonhosted.org/packages/2e/7e/9ecd0285e3153532ae07aeb88063c43c72b4221cf0d4d123b02f3682e3ff/greenlet-3.5.5-cp312-cp312-macosx_11_0_universal2.whl" + "hash": "3c6dede9133e1da41d561bc3fb14e92b47e2ce39ae60edefaad145658ea7c5e2", + "url": "https://files.pythonhosted.org/packages/2b/5c/d2eb503067f9ba20875ef8c87681f29a64f53bbbbe4059a5d7c53179d442/greenlet-3.5.6-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "55272212cbc5f43d1d723725ab931f1939969b7e9523882ca58b55061769d053", - "url": "https://files.pythonhosted.org/packages/35/73/60e4bbcc89252037b18087f2ec16405d5b2d5be42dde191bbf3667e96102/greenlet-3.5.5-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl" + "hash": "8e67c43bdfc88d5fee6db0d3e40175b362fc95fb85f0412d233b9b203c53a575", + "url": "https://files.pythonhosted.org/packages/3e/6e/0091f175ccd02b02bc8811bbcbcc6ac2e980be116e3b2f7a736ca322bf84/greenlet-3.5.6.tar.gz" }, { "algorithm": "sha256", - "hash": "abc8bc8d9f935cd685457545b6a53863a877fdc12c2c0f5ee9beee18d9db139c", - "url": "https://files.pythonhosted.org/packages/39/82/5c873dbb4fb001d22fbbd50e80d4c1b0181ddae106856132160f84b94e88/greenlet-3.5.5-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl" + "hash": "f0ba7c2a329d650628f4c8572fd1db29f0a59dd70a3e3e0710dcf18a35cce9d8", + "url": "https://files.pythonhosted.org/packages/54/1c/07f133f865fd58ae593dd2bbec3144acaee9b04ffe2eb48c6e121747ceef/greenlet-3.5.6-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "523bb8e27614d77101ea7a8cf59f8d91219b72d5c29f6a038c92b50828bfa8d0", - "url": "https://files.pythonhosted.org/packages/3c/78/52de4f7ac9152ad1dbc8f437895c1e573d30ee1e1427e0f91a280e2417b6/greenlet-3.5.5-cp310-cp310-musllinux_1_2_aarch64.whl" + "hash": "5599b380c1f28efeb724e81569eac80cd92f99a85bd9775456caaf3225d40b11", + "url": "https://files.pythonhosted.org/packages/55/3b/f2d36fc38934588dff6d6ec9288934c9611abac7a79c866c2002fc707698/greenlet-3.5.6-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl" }, { "algorithm": "sha256", - "hash": "6d9b454c5fc48aeaa7c4337813dbf513a6870468e426438a04d922c6d0fe63db", - "url": "https://files.pythonhosted.org/packages/3e/4a/92fc51d5d35912f4f06eec037ba347985defd0be47463a010a325634d9d2/greenlet-3.5.5-cp311-cp311-musllinux_1_2_aarch64.whl" + "hash": "188bf333769b7145e2b0b4a7f09615ec550ed44d3a2a8395fb7b36f0e9901e13", + "url": "https://files.pythonhosted.org/packages/5c/01/24632b5ec186b64e21e07a8f53ce5e15a7e9cb33eddee99a5fe16379afa5/greenlet-3.5.6-cp311-cp311-musllinux_1_2_x86_64.whl" }, { "algorithm": "sha256", - "hash": "be63afcbbccfad3dd95a1ba12ada84dab2ef32031973d80b5b92df67fa763a61", - "url": "https://files.pythonhosted.org/packages/4e/a3/07297917485ee2ca85bc3c8dc6ed85ad3fffcf424047fba62671dba68e97/greenlet-3.5.5-cp311-cp311-macosx_11_0_universal2.whl" + "hash": "975736b002ed080d124cf81a79cb7e05cb26d6b3f5c7a7b651c0fcce70353aa1", + "url": "https://files.pythonhosted.org/packages/66/6a/1594f3869c57c149abdb380492529e04d4c0229b5e4d79572c5bd0aaa673/greenlet-3.5.6-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl" }, { "algorithm": "sha256", - "hash": "74cc6df89ec5302337adc9cf096221cbed2510fd444b0e0f1586cf0470740864", - "url": "https://files.pythonhosted.org/packages/51/2d/f2c928218ac52f26d7a2c188c171d1b7e728b23782cb3347e7b4fce1493a/greenlet-3.5.5-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl" + "hash": "a5876d0a60355af98d535c47f6cd6eb0f8a432396dab26845d380b92f8412422", + "url": "https://files.pythonhosted.org/packages/72/18/3fc6d951466ae9a2a688edcddde3b2e388da0a8244e0caf7117bbeb0eb95/greenlet-3.5.6-cp312-cp312-macosx_11_0_universal2.whl" }, { "algorithm": "sha256", - "hash": "9ff00e12102358292087274dfb1669132387ff6e7920ebf9d85f4826ce0d3a56", - "url": "https://files.pythonhosted.org/packages/51/91/00b3c0566316c6f383ea16ee05388ec4f57f6e0afa49e72ae471eda8c47f/greenlet-3.5.5-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl" + "hash": "d701eab36200c36224833d07dbdb709adb7fd4253429548ddb5e547b8ed40586", + "url": "https://files.pythonhosted.org/packages/88/17/ac11883ecc9da19c681c8b763ee39e6f7dca2aa81874eb11a075d3cbeb00/greenlet-3.5.6-cp311-cp311-manylinux_2_39_riscv64.whl" }, { "algorithm": "sha256", - "hash": "1b5ed9162c0c098e0bbc2cf88a94f433c1b8926f831745252e099e5d83e17759", - "url": "https://files.pythonhosted.org/packages/63/2c/eb487fafc9f50ffff2b1e0b697f70fb34bf150821c08ab225aacf5583a7e/greenlet-3.5.5-cp312-cp312-manylinux_2_39_riscv64.whl" + "hash": "eed88b64a5e5da72d6a71cdc5aaeefaa5ced9b748f8d19f89800b339961dad39", + "url": "https://files.pythonhosted.org/packages/94/5c/092682ae7ca1aadd44aa36b0bc35c48c9ed55f9ffebb5794980b1e2ae74b/greenlet-3.5.6-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl" }, { "algorithm": "sha256", - "hash": "3134291427bb0f3526e9d90311988caf336eb43730e95244997a4fb15f45144f", - "url": "https://files.pythonhosted.org/packages/70/12/f7df98e72a8eb4a7edfec5a08d6d1a4ab53a52c95ba0b2ea6c10b8dd9bd0/greenlet-3.5.5-cp311-cp311-manylinux_2_39_riscv64.whl" + "hash": "0616b8f878098c5681fd8f0dc92d887551717402342a70f0abcbfea5f5ad8a44", + "url": "https://files.pythonhosted.org/packages/a2/f5/33e5c9e48178b9259fd000f8f45caa4a65036f65d3d0c06a602f570f025d/greenlet-3.5.6-cp312-cp312-musllinux_1_2_aarch64.whl" }, { "algorithm": "sha256", - "hash": "86c5113d698cb8d927b2750bb1f1d59eefe3a37e0e0217491aee29a7f84ef52c", - "url": "https://files.pythonhosted.org/packages/74/3f/b31e6bd6adb8f80492efb6a47e8f9cd0e7335db5aac2795b1876d5afcfee/greenlet-3.5.5-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl" + "hash": "95e7c44d072db623a1aab04ce488cf9533294a77ed9d072cd503a3596f4106ac", + "url": "https://files.pythonhosted.org/packages/a7/4f/4af258e1ce388eb64be82d6466b7d0b3bc3eede154e14c3360a76a759b71/greenlet-3.5.6-cp310-cp310-macosx_11_0_universal2.whl" }, { "algorithm": "sha256", - "hash": "147b25a42e5ca5be3d42356e8f608b37af715a1c196e9bf9d1627f3341adfe1d", - "url": "https://files.pythonhosted.org/packages/78/ac/5c5b959999b6f09c3026b5dfe171575bc3121c5236ce74f495096f25b203/greenlet-3.5.5-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl" + "hash": "ee7d9da3bf493909cf811a3f038840cb34fab5ae2956b8a263919f6e289ab188", + "url": "https://files.pythonhosted.org/packages/a7/f2/844dc823ff2752ad049caa6b59d57e4572f9c445934b02d3518f4c67197c/greenlet-3.5.6-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl" }, { "algorithm": "sha256", - "hash": "6ca5d6ae0739e5764f2cfcfaa562ac5a990cbdaedca93251c5e3cf07c362371f", - "url": "https://files.pythonhosted.org/packages/9b/30/87c212b5c684d0e72974f1063b7a9687631e8985902c06e1016542c874e7/greenlet-3.5.5-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl" + "hash": "5a0b2791239c99992a86c1b635b787fe2a877d9eaaa26f8891ce943832b585ae", + "url": "https://files.pythonhosted.org/packages/ad/aa/9cde4e00688eaa2a03b91d12e4681439a87e6aad860399e0847af6a014ca/greenlet-3.5.6-cp311-cp311-musllinux_1_2_aarch64.whl" }, { "algorithm": "sha256", - "hash": "19d59f068887d8c5907fc177f27683413ace3011b6ed646c0b309266e74a6502", - "url": "https://files.pythonhosted.org/packages/9c/dc/17d3a5acceb2fd0bbc9682a228117b719cdfb68085e6dbb33fa325755f27/greenlet-3.5.5-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl" + "hash": "71890d5247020c25c21a6b65202782bfc281d4e6e244842419d30e3492bb6dcc", + "url": "https://files.pythonhosted.org/packages/c0/42/b1f8dbc89a53b9e77859fc1ad1627d106fc361daa3ea4bdf43a91ebb4338/greenlet-3.5.6-cp312-cp312-manylinux_2_39_riscv64.whl" }, { "algorithm": "sha256", - "hash": "655bca754a2ef4efcb0eb48a94d3f4593536d0f3d48f8ed44343c01d16a92f95", - "url": "https://files.pythonhosted.org/packages/a4/17/cd5134be659cd4a443e7a61ae670dabec165a814c51162916d637b6dd38e/greenlet-3.5.5-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl" + "hash": "a364c1ea75dc51b83a17f52fe0c79cf8bc4ddf740403bebd4581c7666eea017d", + "url": "https://files.pythonhosted.org/packages/c1/51/826b4fe7bc39c3f910c95e889a981c827f72a611fc035f31816a256cf043/greenlet-3.5.6-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "03551ed792cb1b4fc0277a0c60dfd8c343894a0ba06fe60dcd22f568b433da39", - "url": "https://files.pythonhosted.org/packages/ac/58/ed98b80ac5738c149a5258544843c45601ade1fd70f61740cdaead6351b3/greenlet-3.5.5-cp311-cp311-musllinux_1_2_x86_64.whl" + "hash": "5bbda3c70dd35d60671bc33b01916802707a052130d9e50cdb871d34594d35cb", + "url": "https://files.pythonhosted.org/packages/d6/f6/4167f0e44e795840cbc219b2e5d8f576492192cd9e3e17e827db20287daa/greenlet-3.5.6-cp310-cp310-manylinux_2_39_riscv64.whl" }, { "algorithm": "sha256", - "hash": "27493374cff1d1b7919dc8126547f2aea582737e3046147b434b1e12de56389b", - "url": "https://files.pythonhosted.org/packages/c8/8b/6acf112ed8aee499f25b4d6949820fb02ac950ff9c1f3d793bd5be0599f2/greenlet-3.5.5-cp312-cp312-musllinux_1_2_aarch64.whl" + "hash": "128813fc29f2336a21b4d06eedd5e16bcc7ea46f59e9ff1cb30ea70e48195d88", + "url": "https://files.pythonhosted.org/packages/de/d4/2bceaa305ff0ecf99511480da8f0a866eb2469a68da8715008a0d3e8f65f/greenlet-3.5.6-cp310-cp310-musllinux_1_2_x86_64.whl" }, { "algorithm": "sha256", - "hash": "35cbb8bf55ace57fbccb4fb8622c4521713acd8691e77f4696d416ea7ca527da", - "url": "https://files.pythonhosted.org/packages/d8/c0/b27589e25d220289edcd4d582b2b17b83058d1a56d53d971b6ea1a34f10d/greenlet-3.5.5-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl" + "hash": "1c20ea32a73d17b9b60e3371240e17b0068120c98a5ec01a224a7dd8c89733ba", + "url": "https://files.pythonhosted.org/packages/ec/d3/63d4477ce31dff2fd802a9a20240f6606aac85977e0fb18443aae33de3f6/greenlet-3.5.6-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl" }, { "algorithm": "sha256", - "hash": "8a268024ce2d7d2b04694bf1594058981a9fa663d1df4b762dee499211ed7c1c", - "url": "https://files.pythonhosted.org/packages/db/51/6f732f9314cda54c5fd48a7620c7160f4f286967e8045ad94b9d66ce80b7/greenlet-3.5.5-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl" + "hash": "a6a4b98a9132e0f45c9fc245a63894cfd8c45fb7a0d6bffc5eab3ec327cf7324", + "url": "https://files.pythonhosted.org/packages/f1/d7/41511ee2696f14be4200b524d9553dc4295e2bdeb20aa8962c3cb25e71c6/greenlet-3.5.6-cp311-cp311-macosx_11_0_universal2.whl" }, { "algorithm": "sha256", - "hash": "f1e2db190db51c17433eee424803818cf0670bf049d9cfe0dd07be111d1aa7c4", - "url": "https://files.pythonhosted.org/packages/f6/ff/c3855a00c2417e8f61c7b9f0bc4f8f599c6928f5c15681ad251e78a91e05/greenlet-3.5.5-cp310-cp310-musllinux_1_2_x86_64.whl" + "hash": "45bfd2b51e38aaa5f9849f114d9c7c1d75f69187c849b3549cd64c465283abfa", + "url": "https://files.pythonhosted.org/packages/f8/7b/b509624970909294cd064ff7346148ca9941c21bec9026d7873dd254e9fa/greenlet-3.5.6-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl" } ], "project_name": "greenlet", @@ -2103,7 +2100,7 @@ "setuptools; extra == \"test\"" ], "requires_python": ">=3.10", - "version": "3.5.5" + "version": "3.5.6" }, { "artifacts": [ @@ -2182,13 +2179,13 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "815e7be7a7806d54abb586dc943addc79e8b2ee16915059658cbeff4b1b43bf4", - "url": "https://files.pythonhosted.org/packages/57/b0/0e52c878c53f245edd3a11020f20979b3f490f245af532c7cae3027754b5/idna-3.19-py3-none-any.whl" + "hash": "ab7ae7122974553370f0bdb919e1a960b2cd1bc1ef0276416d896db81c14582c", + "url": "https://files.pythonhosted.org/packages/58/a2/bb081bab032533a855d44de1d56f8e8426114ff1ba5d1f07a438a0a654f8/idna-3.20-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "5e0811a4383b21dc5838069f801c4fb62113b7447663d2530d2bd6e77b49bf15", - "url": "https://files.pythonhosted.org/packages/5f/f7/abb373e5757eaec4b922b92f97ec8d6d7e057cf06778247604fbc4e7c3f3/idna-3.19.tar.gz" + "hash": "a7db850025b95ded1eae8a46181a1a6c56c92c96f0e2b005d9ff8dc0210cab44", + "url": "https://files.pythonhosted.org/packages/f5/08/8eea9d4b8302028f3abb2c0813953f7aec26d33b7a8960ed760e65ff29fa/idna-3.20.tar.gz" } ], "project_name": "idna", @@ -2201,7 +2198,7 @@ "ty>=0.0.37; extra == \"all\"" ], "requires_python": ">=3.9", - "version": "3.19" + "version": "3.20" }, { "artifacts": [ @@ -2876,134 +2873,134 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "4b554d8164ebb526892194f71dcd96ef1fefe0c250087498785d3ffc04a80be3", - "url": "https://files.pythonhosted.org/packages/be/af/91b0d8d3fb3063e259daee3ea8515cea6282f68f4b0e5f0b6fea25762c6e/msgpack-1.2.2-cp312-cp312-musllinux_1_2_x86_64.whl" + "hash": "eaf7e82249837e3aa97297b34a0bb9ff562027381631e057cea6e1367f10b438", + "url": "https://files.pythonhosted.org/packages/d2/3f/ce191fb87e2650d0166b34c437e499ee4a7f9db9c1eb164f41725eb6160e/msgpack-1.2.3-cp312-cp312-musllinux_1_2_x86_64.whl" }, { "algorithm": "sha256", - "hash": "a9b4cf3685a135666d27d0d7a73fece74e2fad01d9b508fded89e843512f0e90", - "url": "https://files.pythonhosted.org/packages/03/f7/a6bf145f7d3eb734b3d97fa295f8007a586799ef56b456c8b27bff62caac/msgpack-1.2.2-cp310-cp310-macosx_11_0_arm64.whl" + "hash": "c942c21a93f36b3a69e828c8945bb72c94dc2ffe488a2086950c812f3edf046c", + "url": "https://files.pythonhosted.org/packages/09/93/4dc007bdef930eed247346773bc0189b710078961d3218d5ee7ba59f322c/msgpack-1.2.3-cp311-cp311-musllinux_1_2_riscv64.whl" }, { "algorithm": "sha256", - "hash": "46ec851571d8f1b6e29794ebb9dd36f785008da6d14f57c702e60781d6caf648", - "url": "https://files.pythonhosted.org/packages/0e/03/c1e0035e1f923f548b7016a2fef5afea431cdae95d397c5aa52ed75dde05/msgpack-1.2.2-cp310-cp310-musllinux_1_2_x86_64.whl" + "hash": "f3d7b3d0018746b5997dd6b14a1870b07cc4c327d9101145d94a1fc264a51a06", + "url": "https://files.pythonhosted.org/packages/0a/3a/aa9c580aea1314529a0f3562461479780b0d254b064f0880956bfbcc74a8/msgpack-1.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" }, { "algorithm": "sha256", - "hash": "7fe374ba76eb0ecca13a1703daa8fa85825a6ddddbb52d4c1a732fa524194683", - "url": "https://files.pythonhosted.org/packages/0f/df/e20bcf5c149890545334743b212eb4b82e1a25fe0a34f99753a1755bfab5/msgpack-1.2.2-cp311-cp311-macosx_11_0_arm64.whl" + "hash": "32edb81a2b5eb7cd7c9d941b2bfbbb082fd2cd09e0e725930316af6b708db186", + "url": "https://files.pythonhosted.org/packages/0a/e7/bb605a7bab2d8425a64b3fa762b39dc1bf1c7e3f11ba6fb5413d6db0ff8c/msgpack-1.2.3.tar.gz" }, { "algorithm": "sha256", - "hash": "86f173a584f72f6164801f31866d22a581f60c991572cf922aed9ab8eb422b77", - "url": "https://files.pythonhosted.org/packages/17/92/d91a08a913a3bbafbede5b9dbf48e4e517f7d92510877b6b02730060ea85/msgpack-1.2.2-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl" + "hash": "b774ff994d844e541439ac5d2d49a14def4104830c3465e9394c153f86200ffb", + "url": "https://files.pythonhosted.org/packages/16/5b/ce995c1ed4a0522b7f2d034bc2034fd63005f240b945961b70fb56fbaf3d/msgpack-1.2.3-cp312-cp312-musllinux_1_2_riscv64.whl" }, { "algorithm": "sha256", - "hash": "42fd9260416885b4815caca5bdd14dfd5dda6cdade732d6c09104ef8f6228761", - "url": "https://files.pythonhosted.org/packages/2a/fd/d8533fed473cc3e309a701e851d0e5fe36ada5552a3899025f5c69fbe877/msgpack-1.2.2-cp311-cp311-musllinux_1_2_aarch64.whl" + "hash": "fcc6800daac4922960f6eeb7a0dda3dd4105e0bf7bce0e83ebc465a78cb7bdba", + "url": "https://files.pythonhosted.org/packages/19/7b/cd54f27b59dfbdc438a12361fbb6798b66d377a978f946bc9512598290e9/msgpack-1.2.3-cp310-cp310-musllinux_1_2_aarch64.whl" }, { "algorithm": "sha256", - "hash": "4a4348705be86e029d04e741cf9ed0dfe03e942d7d3b92e838fa80d3aa2c3ebc", - "url": "https://files.pythonhosted.org/packages/31/78/90c15bebb1a72667349ca62d4507e9d9369e7f8f76b95f490b823d3622e5/msgpack-1.2.2-cp312-cp312-macosx_10_13_x86_64.whl" + "hash": "6707d2fa2aa1bb5424ea0b05f44ffc989b15ab41a73ff5855bff4944fec7c8ac", + "url": "https://files.pythonhosted.org/packages/19/9e/1028485c6886c1c117f777cc9b053e541eff0fedb3292dfb1da95040edb5/msgpack-1.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" }, { "algorithm": "sha256", - "hash": "58ce37a4a54577115922385d37201d9a44d66d0167dfbbf4770a2e9bf8ea7ba3", - "url": "https://files.pythonhosted.org/packages/3f/f5/ae93f85b063d744731cb285528210cd950333b167cacc7b2f96e1420a475/msgpack-1.2.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" + "hash": "ec90a9ae3e1169fa1171147340f0e97d941aa19fcd3b34e8339a55933ed042af", + "url": "https://files.pythonhosted.org/packages/2a/95/b9c651ccb9d720b2e2c8d537954dff528ab869a03bf89598145716db823c/msgpack-1.2.3-cp311-cp311-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "77c2e018417dc1d66f235e383877ee885b60ade9d29e494dd581e08af2cb1923", - "url": "https://files.pythonhosted.org/packages/41/f0/29f591bea185616cf417645ac03bd3ad9b317483ad8572160e325f7fe777/msgpack-1.2.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" + "hash": "5bf390259cb25a6a1cd197c65810999b811f64cd38683251538bcc5a1e41f7d3", + "url": "https://files.pythonhosted.org/packages/2b/21/ea60a8fd0d9e0897fce823e9fd9bf6742567784b35c7eee8f4a18a56eb19/msgpack-1.2.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" }, { "algorithm": "sha256", - "hash": "9bd3d1557c3fe1a095068210708a03e3e4795973392af6f4047060e70abd9a6c", - "url": "https://files.pythonhosted.org/packages/44/92/541e9fa4623587767623788b38d11fc78d402acb1421962a13d3ace48bef/msgpack-1.2.2-cp310-cp310-musllinux_1_2_riscv64.whl" + "hash": "ede33b2892ceb976283e009ad12fa1834cfdf1f9c43ee9c97849fc588d00a618", + "url": "https://files.pythonhosted.org/packages/3a/cf/9c2e4d6c179529d5bf4a64cff76fa581486569e9fbdd35bd98f51cb624bf/msgpack-1.2.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" }, { "algorithm": "sha256", - "hash": "0e91332144f69bc3018c91232fac26da580ef748fb8eaddd7914d4458001cc4f", - "url": "https://files.pythonhosted.org/packages/4e/8e/c70c8c9180c5ddf4440eb8658ebead98e22e7686fbf84f6b165031430750/msgpack-1.2.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl" + "hash": "9276ba88891338f2617044429dfd080ae008c9868a25f6f1a7d004a35dc9ac0a", + "url": "https://files.pythonhosted.org/packages/3d/42/040cc55dde6a7d92057baac8d1fc9cfb9f4fd4162900e2ec16dc33917a7d/msgpack-1.2.3-cp311-cp311-musllinux_1_2_aarch64.whl" }, { "algorithm": "sha256", - "hash": "3e915d390d7068b257ca8b62f3fc59fad135c8631d1017ab03b0b924b07c5367", - "url": "https://files.pythonhosted.org/packages/50/9a/f10ce11fa62700c9ab87a22e65b9ca272f7f673ddd31aeb2de6ae272ad35/msgpack-1.2.2-cp312-cp312-musllinux_1_2_aarch64.whl" + "hash": "9d7e9cbb0998bbfd363fd9a09c330520d5e9cb323c05b5a1a05865d23ccf2226", + "url": "https://files.pythonhosted.org/packages/50/cd/fc9e2e367e80f1493e2ec5f610dda558b344eeede296f88976db133e8f2c/msgpack-1.2.3-cp311-cp311-macosx_11_0_arm64.whl" }, { "algorithm": "sha256", - "hash": "9d7fb25b4442fae0cb2590272d06ab4f6caa526ee36a994edb81e946b874813e", - "url": "https://files.pythonhosted.org/packages/53/fd/a05ba8f84c5951c9aec2a19c1c81f6c4a67b8bec80af604ac5b23ccfa019/msgpack-1.2.2-cp311-cp311-macosx_10_9_x86_64.whl" + "hash": "968583e956d0427878050b371308c5f8647088732ef3e66a117dbe1192ec91e0", + "url": "https://files.pythonhosted.org/packages/57/38/52bc0dc44cc9f7c2339b632f93d02f8badc78cfb0bb070f2a50a51945e53/msgpack-1.2.3-cp310-cp310-musllinux_1_2_riscv64.whl" }, { "algorithm": "sha256", - "hash": "9eb0b0e602064527a045ea28c4f174ed69383587e29cebe28947e3b84106eb2a", - "url": "https://files.pythonhosted.org/packages/6d/44/ea2100ec54d30c46ee9dba10a3bfb79b655e96c6df237238a3234c75869b/msgpack-1.2.2.tar.gz" + "hash": "ec0030361cc861ac699b2ef1c695b741fa145c88f8667fa3d7e3f73deeb648a3", + "url": "https://files.pythonhosted.org/packages/6d/aa/5b6b09f835791045282dc5d08431db599a5f4743a69fe2f6670045a2cd85/msgpack-1.2.3-cp310-cp310-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "c522420d78db2431887d45b518e304d86e27b9ad0b30f24e3806a6ad5d8bdbfc", - "url": "https://files.pythonhosted.org/packages/82/fe/d7be978456ff8552e69a8e270d882e7530e01513c096b293d83df03753ea/msgpack-1.2.2-cp312-cp312-musllinux_1_2_riscv64.whl" + "hash": "c309a7abae1d14ba29a8bd0ddbd704a5e469d8e9bd9c3dee0e4ff53d7ae01d56", + "url": "https://files.pythonhosted.org/packages/71/9b/5c3dbc450d14645dcec987970692d6ab24008cc33d2155474b1d818486f9/msgpack-1.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" }, { "algorithm": "sha256", - "hash": "0a652ceeededf71d3fa40c303a02a149d42338d310162367b91c539d4bd6e0a3", - "url": "https://files.pythonhosted.org/packages/88/88/c2b6d8e81571da87aa232c0e34a3f3a0e618e6235892065ec82d1d81fc7a/msgpack-1.2.2-cp312-cp312-macosx_11_0_arm64.whl" + "hash": "666ef5601ab0e6e345e47febc96aa81143cc932201543480cbb9499164f05ffb", + "url": "https://files.pythonhosted.org/packages/7b/41/915c81fe6df2d3cbdb0dece4f1a5cd313e1cd2abd9f501d0f50c0582517e/msgpack-1.2.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl" }, { "algorithm": "sha256", - "hash": "f11e09f10210a91c169e39c7a5a1f9090eaa73ad75555fafad5023c3053c47ba", - "url": "https://files.pythonhosted.org/packages/93/15/17374efe9793f5332c7d4727ab40539f95a1dc9df653531795daca8c4281/msgpack-1.2.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" + "hash": "1d6bcec3dbbdb89ca385d3a73e63ceae7b841fa0d7ca7c676f1a7bfe7fb2cdb8", + "url": "https://files.pythonhosted.org/packages/89/e6/451c9a42274fb2be82d8ba8b76a5219c613e20f8de1da521d10cb758a9ef/msgpack-1.2.3-cp310-cp310-musllinux_1_2_x86_64.whl" }, { "algorithm": "sha256", - "hash": "4710d881d8fb047deed2485707409116722af2b992d3fefd73c7667c4e350839", - "url": "https://files.pythonhosted.org/packages/93/1a/77d32a60a80ee67016e77b13bec07e85f1929a92f046da044591c7eb01c9/msgpack-1.2.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" + "hash": "87cf2ef05ff2f2493ba29fcdaef27e960ca64dacfd13460ae29e6f92e0ed05bb", + "url": "https://files.pythonhosted.org/packages/a2/e7/7dda8b1039abfd9bba4c5068172c67135c9e33089f503512db9226f23c24/msgpack-1.2.3-cp312-cp312-musllinux_1_2_aarch64.whl" }, { "algorithm": "sha256", - "hash": "b9b0c1f2aa7b0026b4bd50718100e8b04175e4f36e160aa852502377b5e572e7", - "url": "https://files.pythonhosted.org/packages/ac/c3/00dcd902d66a641b9ba350783feb482ea5c1ca4a7ff6629db0c10c0ea982/msgpack-1.2.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" + "hash": "382b219de3d436de3baba0f4b0c6d4336e8f5858d0eb047918b13b69a71c6c55", + "url": "https://files.pythonhosted.org/packages/aa/83/800570e6a22376eb8d599920f70aead4779a63611696f567477c4e85a70f/msgpack-1.2.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" }, { "algorithm": "sha256", - "hash": "e05a94a0442de86818a30281c6cc2cb9cc7aa148386fd3541c4d4774b73cb3a9", - "url": "https://files.pythonhosted.org/packages/b5/a4/27400c101a96115fe8484cad57b6c5eb4f9ffba080a1d9be62ec9174bf67/msgpack-1.2.2-cp310-cp310-musllinux_1_2_aarch64.whl" + "hash": "186e6c602b8a9968b8e864c67d622a69279f7d1e55ae25f40e3bff7e815b2b62", + "url": "https://files.pythonhosted.org/packages/ab/ff/817e4a2052f848d3fb67726908d6e4e7c19f68ee7c19553a82ce7b0ed415/msgpack-1.2.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl" }, { "algorithm": "sha256", - "hash": "7afa5431f6f3487c584187ca6c8e2a34e9b106529893b3e720eabb068f6ac970", - "url": "https://files.pythonhosted.org/packages/c9/40/181c8944b28f779ed0b2587d24cc0ccf1bc87248204105327140aa20d63d/msgpack-1.2.2-cp310-cp310-macosx_10_9_x86_64.whl" + "hash": "89c930aece4e972b208ba589c8410b4167b05e411a5ea2cb25fd96f8bc47ee43", + "url": "https://files.pythonhosted.org/packages/af/12/4d7c6d6203416d9fbf0f59ebaa805e70fb929b93a41b611bc821ec5964a0/msgpack-1.2.3-cp312-cp312-macosx_10_13_x86_64.whl" }, { "algorithm": "sha256", - "hash": "8b1415d02e9bf722672af8a90f90813265a0cd0b14163187261e54a5592bc949", - "url": "https://files.pythonhosted.org/packages/d3/af/2b567d684f912fedcefe3f7c37de604716ffa99336bd432688f9f040df92/msgpack-1.2.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl" + "hash": "18a6ed513023001b28dcd3ba54966f6bb90a38274ba8d2640464bcab3a1b81d4", + "url": "https://files.pythonhosted.org/packages/c0/97/a1b944046f283ec89445cb2a982c42233b5b07cc630f9be739f4f1d469a3/msgpack-1.2.3-cp311-cp311-musllinux_1_2_x86_64.whl" }, { "algorithm": "sha256", - "hash": "336525cc2688e43ea77dfb1a4ce012c8cde561835913801dbfcfdcf4111d8abb", - "url": "https://files.pythonhosted.org/packages/d6/1b/57906337bfee0ead554571dc203ea17c3fad26d51e5eca6271ecd983f73b/msgpack-1.2.2-cp311-cp311-musllinux_1_2_riscv64.whl" + "hash": "5c1efdd9181cb1b719ee46865f368a927f1c0c65d577798340b1194545b7515a", + "url": "https://files.pythonhosted.org/packages/c9/91/7b288e9133bd1ba92ca0ca4e7f2a4cfc53cf467d99d8d2f57b9939908fac/msgpack-1.2.3-cp310-cp310-macosx_11_0_arm64.whl" }, { "algorithm": "sha256", - "hash": "90986cc9aab9d7d1d8f38bcbf65d3f7ac83bdd90c35765db7d691b4829698cba", - "url": "https://files.pythonhosted.org/packages/da/c0/d3ede9f5d16acb4c05a9281859f1e99ef9f877a928eb78454c37f70db001/msgpack-1.2.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" + "hash": "905a189853d6bdb204c7ae5f4ab77fb857448abfff574d3d93c62e2815b24b4f", + "url": "https://files.pythonhosted.org/packages/eb/c7/8576ad39f4ca42ddad26f68eb8621d2d0a60501193d480f504bd9d7f36c4/msgpack-1.2.3-cp312-cp312-macosx_11_0_arm64.whl" }, { "algorithm": "sha256", - "hash": "cdb6cc6e1127d15879c47a8b3270716243da82d3e7feab1f5946872c75b3d60f", - "url": "https://files.pythonhosted.org/packages/de/0f/5d1e6d68e516621697a9262b24917d678793e838cf3f331ed4656b3e959d/msgpack-1.2.2-cp311-cp311-musllinux_1_2_x86_64.whl" + "hash": "39b6986c19e1f2dfa549d185dba6ccf1de2e4c0ba10d8cfc0048935b1c5f9109", + "url": "https://files.pythonhosted.org/packages/ee/f7/42140e6afdac8e94bfedae4cfb67ee004b6ad5c4cadd024df42f759bf3b5/msgpack-1.2.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl" } ], "project_name": "msgpack", "requires_dists": [], "requires_python": ">=3.10", - "version": "1.2.2" + "version": "1.2.3" }, { "artifacts": [ @@ -3248,7 +3245,7 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "b9feb1769b48102061fe4fc59b2f5ad600bc2ac0b55cf12ef5fe49464ac0d230", + "hash": "1762d2783dd190bccc3ebbc5023463f2234c8b04cce7047025f8d8c3665316aa", "url": "git+https://github.com/StackStorm/orquesta.git" } ], @@ -3495,19 +3492,19 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "89f8d42695853b89c7170bd49bc3dc593f98a71e695ede88e06a3b247bc4563b", - "url": "https://files.pythonhosted.org/packages/c7/12/6f3fcd5067a9cbf4f8664b32957973498da8b083455203c8d9cab83a725c/platformdirs-4.11.5-py3-none-any.whl" + "hash": "29dbf06d96c500bc6bdbce75fb0a14d63279c93b1842f97e72a135b33e856983", + "url": "https://files.pythonhosted.org/packages/d0/89/446044f33aba0348d35e433f56d12206d010a5281a1df54054d4cfb82388/platformdirs-4.12.2-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "e8b31f4f8bcbbedef91a6b57a706255e4f148d2a4e01648382a0a47342539173", - "url": "https://files.pythonhosted.org/packages/ea/06/cf1564dcc2e2261c8c8c6c05628dc8b418943bdae2a4e58640ceb2f770fa/platformdirs-4.11.5.tar.gz" + "hash": "eab5f70271a490ef74618bb314fbb86e3c7e82fa3b9c922c2ea0e0a1a155d329", + "url": "https://files.pythonhosted.org/packages/17/c8/721b3855fe457da514fe249247d404b9b39c5d16532278f70ebaa6acf18b/platformdirs-4.12.2.tar.gz" } ], "project_name": "platformdirs", "requires_dists": [], "requires_python": ">=3.10", - "version": "4.11.5" + "version": "4.12.2" }, { "artifacts": [ @@ -4392,13 +4389,13 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", - "url": "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl" + "hash": "ece8c00a69cf01b45d0b1dedabb469c90d8caf996d4fda40f147627a122849a4", + "url": "https://files.pythonhosted.org/packages/38/bb/d215ee7c73b61497b28a5503f9f53523f294fcc936762b7caf90e0c1c2b5/pyparsing-3.3.3-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", - "url": "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz" + "hash": "928ae7e20211f3b6f3915a72f06a0cfd29ab9d24279dd6346b6b1a7146397d36", + "url": "https://files.pythonhosted.org/packages/e4/11/b213bebff182584360cb8d17c72c1677fec5c5c228de439e63bcf8ab1c8f/pyparsing-3.3.3.tar.gz" } ], "project_name": "pyparsing", @@ -4407,7 +4404,7 @@ "railroad-diagrams; extra == \"diagrams\"" ], "requires_python": ">=3.9", - "version": "3.3.2" + "version": "3.3.3" }, { "artifacts": [ @@ -4446,13 +4443,13 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "04e7c9260ced15197b3f42b891ffa30fa98c37bb09372c5c2bf927bcdfe30b53", - "url": "https://files.pythonhosted.org/packages/0e/8c/3d0154b8781a371ef1b791063da5a223187dd17738c5b188edc5e9657f9a/pyspnego-0.12.2-py3-none-any.whl" + "hash": "39b87aa00491e554cef05441bf2f7e52e85b09b5229ff62a89c35b59548794be", + "url": "https://files.pythonhosted.org/packages/93/fd/0e09467d5b8e229388c897126b4aed1e5fef2295a8661e2cad21fa9a8214/pyspnego-0.12.3-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "448a491a9bf0e5fb957567fe46e6809fa836aa40dfcccebcc740bb64acb1be1c", - "url": "https://files.pythonhosted.org/packages/03/c4/790211e7a2180509dc29137c488c7b038ef89bdf83db0ce4da802f64f9d4/pyspnego-0.12.2.tar.gz" + "hash": "c4982c9f92e6aa5979c9d9a142a21339ff82ebcfbdb4e0649320cb050961a3cd", + "url": "https://files.pythonhosted.org/packages/fd/8f/30bb9568554899a6147bed657762a3c707e2d3dcaabf3492161cc9550bb4/pyspnego-0.12.3.tar.gz" } ], "project_name": "pyspnego", @@ -4464,7 +4461,7 @@ "sspilib>=0.5.0; sys_platform == \"win32\"" ], "requires_python": ">=3.9", - "version": "0.12.2" + "version": "0.12.3" }, { "artifacts": [ @@ -4646,13 +4643,13 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "d4e244cf17b8b29819ed78003d55fbacf86eda23425b075454fff9271b79377a", - "url": "https://files.pythonhosted.org/packages/43/5e/21abf578182fb15006a57faf3711a1e659e29d600d19b6e557eae908c81d/python_discovery-1.6.0-py3-none-any.whl" + "hash": "d43fcdef879fe795352bd13ccf8d185ba5a9f86f36cfcd00529f596e737442b3", + "url": "https://files.pythonhosted.org/packages/16/7d/e9ffbadfbf89c93848412d04594135c4ae8c1d37d9e053b9c3ed718fabc4/python_discovery-1.6.1-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "6393b4eae1be8b2182670635e7baff89ac21cb9f8e86fd1ff40c7b1144febb4c", - "url": "https://files.pythonhosted.org/packages/91/96/0f93e27c9f60a650838f2118159aa115fd5732c0716247917b7ba7ede665/python_discovery-1.6.0.tar.gz" + "hash": "cf87d3627dfb4412437fdd5b13eae402607722998d21567993aedbc59b23c15e", + "url": "https://files.pythonhosted.org/packages/0c/57/250bd238b966cece44328235eb85290045d059265fdaf7527a3a958123db/python_discovery-1.6.1.tar.gz" } ], "project_name": "python-discovery", @@ -4660,19 +4657,19 @@ "filelock>=3.15.4" ], "requires_python": ">=3.8", - "version": "1.6.0" + "version": "1.6.1" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "904552145e8bfed22162c09dab1c2b9b54fefa7b23ba780f4f26ca0316b0f0d9", - "url": "https://files.pythonhosted.org/packages/0d/17/c5c6b53ddc18f297992099b3d9ec16c855c0ccc83263a21fe4d1c625ec6c/python_dotenv-1.2.3-py3-none-any.whl" + "hash": "42269a8a5b3fd54ffa6f3d84b18abed50064717576b4ecf03dc4a55d8aa04fdc", + "url": "https://files.pythonhosted.org/packages/60/d1/38f3a3405989a89ac18390803e70c6ad7c7760da4f9b83cbeca0c44a0c72/python_dotenv-1.2.4-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "a20a594dabeaa385725aa239d5244871c143ecb356add8a20fcf23773a6c3a35", - "url": "https://files.pythonhosted.org/packages/6a/53/ed9d74092561d4b01a2ef1349d52cdbc135e526c245f366b089cfca6de49/python_dotenv-1.2.3.tar.gz" + "hash": "f0d53e69935a851c0dcc78f3ab7aaccd8cabef0b92382b576b824212902873c0", + "url": "https://files.pythonhosted.org/packages/74/26/2fbeedb218a787a5eea551c7532cac4e009f83d689dd2faa0d0353473f86/python_dotenv-1.2.4.tar.gz" } ], "project_name": "python-dotenv", @@ -4680,7 +4677,7 @@ "click>=5.0; extra == \"cli\"" ], "requires_python": ">=3.10", - "version": "1.2.3" + "version": "1.2.4" }, { "artifacts": [ @@ -4704,8 +4701,8 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "bacd9fb680d20263d8570ade1cf234d90d281149a8beb4f079dd8f33f7613dc8", - "url": "https://files.pythonhosted.org/packages/b2/f4/60edeb794bbc9ed0ff2149bbaeec605f3ed331766459d195832ecbd0ba2d/python_ldap-3.4.7.tar.gz" + "hash": "18dc7460470c6ff64ed5c04ee21c56dbfee7ab433a53213ba91e407eea44c34c", + "url": "https://files.pythonhosted.org/packages/1c/45/489fcf46984f916ef165cdc6a2a1f1ca01ab6f486d47169256ebe44bdd62/python_ldap-3.4.8.tar.gz" } ], "project_name": "python-ldap", @@ -4714,49 +4711,59 @@ "pyasn1_modules>=0.1.5" ], "requires_python": ">=3.6", - "version": "3.4.7" + "version": "3.4.8" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "f0b8b3333a7d474a3b0ece069e4849febdc66d2712d5290aea6ff1189a05fb80", - "url": "https://files.pythonhosted.org/packages/6f/af/224e67da2deda72317aa9afe3445cf849ebd86f4001e20b5d164ef9d05f8/python_statsd-2.1.0-py2.py3-none-any.whl" + "hash": "2ab8f8722f6725ecc39895b6ffe9f2a6752b6aa00786b77cc66058d06e06d320", + "url": "https://files.pythonhosted.org/packages/d7/27/b9dabdcaf24c8a6e366deae5c22a5d9015dca9900451fdb8d3f834249f5e/python_statsd-3.0.0-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "d2c573d325d0f015b4d79f0d0f8c88dd8413d7b9ef890c09076a9b6089ab301c", - "url": "https://files.pythonhosted.org/packages/bc/ea/0beeadf66faed4ccdcb48009bb4eebf580ac6c05e55b6fae4032c6c45b9a/python-statsd-2.1.0.tar.gz" + "hash": "f7f7957ddf6757a231e316ef2ca6bd47ce33a701c57b4049406308f811e9f76e", + "url": "https://files.pythonhosted.org/packages/01/a5/f881bb12332f80aa016998b6779aa5966bd8dc57f92c327a6f1fb8d3a1e7/python_statsd-3.0.0.tar.gz" } ], "project_name": "python-statsd", "requires_dists": [ - "changelog; extra == \"docs\"", - "coverage; extra == \"tests\"", - "mock; extra == \"tests\"", - "nose; extra == \"tests\"", - "sphinx>=1.5.0; extra == \"docs\"" + "basedpyright>=1.0; extra == \"dev\"", + "coverage>=7.0; extra == \"tests\"", + "furo>=2025.1; extra == \"docs\"", + "mypy>=1.14; extra == \"dev\"", + "myst-parser>=4.0; extra == \"docs\"", + "pyrefly>=0.1; extra == \"dev\"", + "pytest-cov>=7.0; extra == \"tests\"", + "pytest>=9.0; extra == \"tests\"", + "python-statsd[tests]; extra == \"dev\"", + "ruff>=0.15.0; extra == \"dev\"", + "sphinx>=8.0; extra == \"docs\"", + "tox-gh-actions>=3.0; extra == \"tox\"", + "tox-uv>=1.0; extra == \"tox\"", + "tox>=4.0; extra == \"tox\"", + "ty; extra == \"dev\"" ], - "requires_python": null, - "version": "2.1.0" + "requires_python": ">=3.10", + "version": "3.0.0" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "dd95840dd199baea12d9cc096a1d452caa6596a1c1e4b5f3dbd1541855d5e815", - "url": "https://files.pythonhosted.org/packages/0f/7b/39c34ca613b0b198cb866466651b26b045e2009864c5183c979a3b83f383/pytz-2026.3.post1-py2.py3-none-any.whl" + "hash": "9d514388fbc89ca0833203464272ac485b8828568ab73532f5020f17e892a0ff", + "url": "https://files.pythonhosted.org/packages/d5/11/e3df59614bebe0ca50c905442603eda64ae7ac19811d4e4f74aa2d51ca85/pytz-2026.4-py2.py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "2211d3fcf9a797d3405cac96ac7f61d80e6a644f72a3309607282fe8a2010c5d", - "url": "https://files.pythonhosted.org/packages/fb/48/fb042503b6ca6cd271261dc559fd6432f7d8c713153e9ec5c591af4dfc1c/pytz-2026.3.post1.tar.gz" + "hash": "464303645bafafd72418898368b2429458f709cf1eb6a15372fbcc396b64da63", + "url": "https://files.pythonhosted.org/packages/b0/ed/fa23d28713004418bbf2407127f80f385bfb0bf4e677bef02c25c27b00ee/pytz-2026.4.tar.gz" } ], "project_name": "pytz", "requires_dists": [], "requires_python": null, - "version": "2026.3.post1" + "version": "2026.4" }, { "artifacts": [ @@ -5416,19 +5423,21 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "9c824d87ba7f7ab4a1890799cec8596f15c1241cb473404ea1cb0c55e4b04746", - "url": "https://files.pythonhosted.org/packages/a6/24/4d91e05817e92e3a61c8a21e08fd0f390f5301f1c448b137c57c4bc6e543/semver-3.0.4-py3-none-any.whl" + "hash": "6e4998f8b4762acdfea85f9bfd5b4032e0bb50038dc04bf82011b42d5d1145c5", + "url": "https://files.pythonhosted.org/packages/be/02/bce7a1d70e9d0f6ea8623c16386138c251b5855af6cd3a11433d3fba4e66/semver-3.1.0-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "afc7d8c584a5ed0a11033af086e8af226a9c0b206f313e0301f8dd7b6b589602", - "url": "https://files.pythonhosted.org/packages/72/d1/d3159231aec234a59dd7d601e9dd9fe96f3afff15efd33c1070019b26132/semver-3.0.4.tar.gz" + "hash": "14bc073439513d7773662a338f4db9829cf16c12b74b9568e2d2689975fbd7fc", + "url": "https://files.pythonhosted.org/packages/92/f5/e1dfe8e1d91c54ce212fd93916eb01fd1c590f413be0a0978c39a97aa1bb/semver-3.1.0.tar.gz" } ], "project_name": "semver", - "requires_dists": [], - "requires_python": ">=3.7", - "version": "3.0.4" + "requires_dists": [ + "fast-semver-rs-backend>=0.1.1; platform_python_implementation == \"CPython\" and extra == \"native\"" + ], + "requires_python": ">=3.10", + "version": "3.1.0" }, { "artifacts": [ @@ -5692,19 +5701,19 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "8089a26fd974ca7a1f30276d3d8492ab266ab15af581642dfe8aa162e0c1c823", - "url": "https://files.pythonhosted.org/packages/eb/dc/ad025c1ee131eba60c69f4dd5779b18fcf1e6b21a343e2162a84d5d133c7/soupsieve-2.9.2-py3-none-any.whl" + "hash": "8596eb8967d744174820280fa62b4542a2e955bfaccca73ed8a13c6eb8e9b502", + "url": "https://files.pythonhosted.org/packages/66/87/5ed59e1d0290564e2027ed066c52b059892c4637741337fc0967183c8d4d/soupsieve-2.10-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "4a55d8cf158a9c2e587fa4922f1bbb91d68ac829e2d6f25403a85747c71daf74", - "url": "https://files.pythonhosted.org/packages/69/99/a6ca3beb3ccacb41fb3321d8a60e5566f9e6467601ef8eba6a17e1b89778/soupsieve-2.9.2.tar.gz" + "hash": "49e9380d7d2905463583bafe285e818c7366a9ed7b3aee221c1ac79c905d8bc0", + "url": "https://files.pythonhosted.org/packages/71/c3/1b817965ac12dc002d7c9cd7dfffdd7d4fbf9b45763ef2ffe7b86ee94670/soupsieve-2.10.tar.gz" } ], "project_name": "soupsieve", "requires_dists": [], "requires_python": ">=3.10", - "version": "2.9.2" + "version": "2.10" }, { "artifacts": [ @@ -6002,19 +6011,19 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931", - "url": "https://files.pythonhosted.org/packages/e5/6d/b53b99a9f2766d095985947a5782f1702cabb129a34f7a802d7197af832f/tzdata-2026.3-py2.py3-none-any.whl" + "hash": "c2169a8b0a7a5e9674da5a135ccdfb2b3e671b333ed9fed17b41f73c34476e81", + "url": "https://files.pythonhosted.org/packages/f9/bc/8737e8d54cf51106118039b83f485a4783112fab49ea9d044b234978a46e/tzdata-2026.4-py2.py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "4a1518b8993086a7982523e071643f3c0e5f213e75b21318e78bcabfff9d1415", - "url": "https://files.pythonhosted.org/packages/92/ff/5a28bdfd8c3ebec42564ac7d0e54ca3db65044a9314a97f9564fa7a1e926/tzdata-2026.3.tar.gz" + "hash": "f1b8bd365d8d210c55353f4d7f8d6d8561c0ba50d704b700d195a9424bba0d79", + "url": "https://files.pythonhosted.org/packages/e4/31/3d74fa778a63b98b7374323befcc0be5ab3bd94afd4096a0124e7379152c/tzdata-2026.4.tar.gz" } ], "project_name": "tzdata", "requires_dists": [], "requires_python": ">=2", - "version": "2026.3" + "version": "2026.4" }, { "artifacts": [ @@ -6060,211 +6069,211 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "bfaa8302eb9bb7f5e231f256caf83040760585e32751d19155c0f0c0225f8de1", - "url": "https://files.pythonhosted.org/packages/e8/2d/39da479a8461d1d78d533940a8426a84e23708a6a7a426f2178e04443252/ujson-5.13.0-pp311-pypy311_pp73-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl" + "hash": "c5d13a4ccf3fc9a00fb4e8cae818ad7ecf33f210d8098fecbfc087ff43573544", + "url": "https://files.pythonhosted.org/packages/ba/da/cae247036886535a5e43945f3ffd414b9fab92f54706ad40d7304c7630c1/ujson-6.0.0-pp311-pypy311_pp73-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl" }, { "algorithm": "sha256", - "hash": "b877fe7926107d25d54b655c5b8dd94b294b22c157233163ad29fdb54ac10cf4", - "url": "https://files.pythonhosted.org/packages/0d/60/10f6c92b549cff72e555a900ee7128b992ebf510bad0eebd946e72b68ecb/ujson-5.13.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl" + "hash": "e9359bfd0efd12593f0db40ccb2d1497284401da207f1d6a1783718313201b21", + "url": "https://files.pythonhosted.org/packages/09/be/4ddd61b3d4beb21eced10d0d100a4dca26f13303d4952e48fb5e89167869/ujson-6.0.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl" }, { "algorithm": "sha256", - "hash": "2c75eb7fac0fe92925b959cf2fa18f88d9fb76b10781fd2a6ccb895d5fb89171", - "url": "https://files.pythonhosted.org/packages/25/e2/7891c4a1c954307ab6a575686897a4963aad36c284742216f52dc40cba4a/ujson-5.13.0-cp311-cp311-musllinux_1_2_aarch64.whl" + "hash": "bde35c0d6b5a204990f43e4ab43b6e3e4d5a1de773246e11d518945e3ba789ed", + "url": "https://files.pythonhosted.org/packages/0f/bb/4e37fb0c4593870684f848ba0e3f06f17695596df3311fd4ccf0185db2de/ujson-6.0.0-cp310-cp310-musllinux_1_2_aarch64.whl" }, { "algorithm": "sha256", - "hash": "7c5a2478a3a1fa4421f7e035b87194eea0cf44c7971a3f32ad1b42a0dfd63c03", - "url": "https://files.pythonhosted.org/packages/36/06/407633f0709e168107f56368bd5a0fa8fe07acd7f1d3000710bc0bb07470/ujson-5.13.0-cp312-cp312-musllinux_1_2_aarch64.whl" + "hash": "108a9f3a635913d38a856e05007afc9b243929938939cd11576a3f5484925145", + "url": "https://files.pythonhosted.org/packages/15/bd/d1652f9e1ff16b1324c0715d97c8c295d845aba2766d69dab8a2cd90de9c/ujson-6.0.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl" }, { "algorithm": "sha256", - "hash": "82c17b904c03c2b9629486ec91a8fa46a15f10d03504284f54ed7257a917d9f1", - "url": "https://files.pythonhosted.org/packages/4b/73/103c2c6df7bfe57e01fb6006551188b4dc9f873cb5f72146bd5b177b75f9/ujson-5.13.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl" + "hash": "2f3c0a77235d7ffcce5c54b872fa25de4f14e6ffc159c62ad93b0a9ca98a1d20", + "url": "https://files.pythonhosted.org/packages/1f/09/23ed92a4f03d44598775709fcbf7930021353ed17d98a992c62ad6a29b29/ujson-6.0.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl" }, { "algorithm": "sha256", - "hash": "4b7badefa73f96bad9e295ea22bd06967b851c8aad68c74196437e3584f25de5", - "url": "https://files.pythonhosted.org/packages/58/dc/2fcf821896803248122835c800e74f4582de9d6092efb37152acd7f79bdc/ujson-5.13.0-cp311-cp311-macosx_10_9_x86_64.whl" + "hash": "921408c159b01d39d70e90252b8ab17f16594fc91f229e6f881642fb0ed24ae7", + "url": "https://files.pythonhosted.org/packages/21/18/8835fce508f89f20409b1ba336ffe5cde18e4ef66889aeafaf3e9a73ce4d/ujson-6.0.0-cp312-cp312-musllinux_1_2_aarch64.whl" }, { "algorithm": "sha256", - "hash": "c8bbb1f5ab810954fb307b6c5e68af58210c31da8569f9e6498a3958c1859e72", - "url": "https://files.pythonhosted.org/packages/61/a6/825d92bce42cd442b57d89b4c20afc1737246321d3433c6194e5c35c6a11/ujson-5.13.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl" + "hash": "89b1962c30dc29ba99e522c4f2e39173961b6098328cfbcdad3f9f1c308dae89", + "url": "https://files.pythonhosted.org/packages/21/a7/8c2e2121ef48616dfa2357d1f982d54e2d44586a557f9720ee84bb4f0021/ujson-6.0.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl" }, { "algorithm": "sha256", - "hash": "3f6d55c68985654a84a9b47ac51f2655adac4fd264e4189f832960c2270dcf70", - "url": "https://files.pythonhosted.org/packages/6c/d6/7ea7a32f35457560806375193dbc4f0d8ffd8c8adae42f86686392a76c41/ujson-5.13.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl" + "hash": "7e747c535d4ca9afdde31e034484a1020717fb18fa8a8faa789171abeb2ad1ff", + "url": "https://files.pythonhosted.org/packages/35/de/fba3d2c547622e66dfa0aca869a61a457df64d6a29867b9a5c7279336902/ujson-6.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl" }, { "algorithm": "sha256", - "hash": "f3cae1c811e787b9500e2830af8632dcb32a78dea5baf15aac51d681c59a59dd", - "url": "https://files.pythonhosted.org/packages/71/5e/b8b2806996c75d4c34cf92ec04c5fff58a645a32632f27836886a718cb87/ujson-5.13.0-cp310-cp310-musllinux_1_2_aarch64.whl" + "hash": "970f9ff27d12e089fa342379f52ea3f4aff6fbe8690aca9a1645c14aee5d08fb", + "url": "https://files.pythonhosted.org/packages/38/e4/95346e93cea1e0af9d987ee1e8dc9a22867baa59f2cd60bbe1f3d77d78ef/ujson-6.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl" }, { "algorithm": "sha256", - "hash": "24539618fb3243cfdf27dab9a850acab80798a01501e9586b61fb9ecd016a891", - "url": "https://files.pythonhosted.org/packages/77/79/f98c6c1a4ed9d92d39d5d2d133f2b6fce5da11ea50c341117aedde8011c4/ujson-5.13.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl" + "hash": "dd55ca435d6c3c7e4cb6d8a0a98a133d4fd1b67d9abf90449442d9f5a728a9ff", + "url": "https://files.pythonhosted.org/packages/3d/8d/39cd22f388524daa0155e78ab64232711e7331fe31ae3074f9e6593b7685/ujson-6.0.0-cp312-cp312-musllinux_1_2_x86_64.whl" }, { "algorithm": "sha256", - "hash": "e1842e10adc8f0db0d3e8aa3a1f8b05ce0456b39e180c8553d7f36dd0bf24b6b", - "url": "https://files.pythonhosted.org/packages/78/15/399766e8ba002bd8e5e2e45828e0e12a5dbeb4145d6a604ba3787db5eec2/ujson-5.13.0-pp311-pypy311_pp73-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl" + "hash": "d2e29a0dd1d33e49623d4c69bfa7e6d3d5c7530cf42bebe612cff965acffd1a9", + "url": "https://files.pythonhosted.org/packages/40/11/6335f73db7f59e54f574adf226e94b7c148c1b492cf4fbfd95d853504d4f/ujson-6.0.0-cp311-cp311-musllinux_1_2_i686.whl" }, { "algorithm": "sha256", - "hash": "229faf041ef249ee3fd57bac1cedb123d2718ab63f6ccd50eca95ea902eb0dca", - "url": "https://files.pythonhosted.org/packages/7d/1a/5718237cf4141e5be46ff371387e90b01f27774cb6f0f79ff4803a2430ca/ujson-5.13.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl" + "hash": "0aa247eb50a52bb2190871ca8c2e0a96f8190bfdb1ebd68c70d1bf422f640b73", + "url": "https://files.pythonhosted.org/packages/46/3d/066537298a91738f2f598ebea58baf0a612a65fad92a522ddac31d8191fd/ujson-6.0.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl" }, { "algorithm": "sha256", - "hash": "7edf16359c52ed53406e216565d83e6b98c23c3cb9a0a01673f2493f8fb15edf", - "url": "https://files.pythonhosted.org/packages/88/4f/b03bcc9eaf4621ac9008dec90918d8fb4839d611666cb99eb255696c67fe/ujson-5.13.0-cp312-cp312-macosx_11_0_arm64.whl" + "hash": "83194e213d9df2f2aed1edb821689f99c0f7789bdee173125fda510282f61070", + "url": "https://files.pythonhosted.org/packages/49/9a/cce4d9f023bc3213a17ceab844c597399f1e65c6654ba3ba178aff28683e/ujson-6.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl" }, { "algorithm": "sha256", - "hash": "12078e81def2790140583abefc1b979f3c77be15d53c524bf0e232f669822052", - "url": "https://files.pythonhosted.org/packages/89/4e/8a4ce87d3eaaee398f4238f74f128c6eb34269f041659995b2c09710ae7c/ujson-5.13.0-cp311-cp311-musllinux_1_2_i686.whl" + "hash": "ff3b33d8c8dbbe32936d2056296324371a07ed0b29177e2eb8ec46569436817f", + "url": "https://files.pythonhosted.org/packages/4a/f8/4b927dc315819479058551d9b18307460a5e1a07ff0e7470a82aedf63c1a/ujson-6.0.0-cp311-cp311-macosx_11_0_arm64.whl" }, { "algorithm": "sha256", - "hash": "d62e3d7625384c08082abad81a077af587fdef2761bb14c3822f4234b8d07d75", - "url": "https://files.pythonhosted.org/packages/89/7a/c8bb37c8f6f3623d60c33d15d18cd6d6655d0f9c3eb31a9969f76361b199/ujson-5.13.0.tar.gz" + "hash": "03a385e523f67dec6d4dad0970f20a080cad045b56d9a3564d07807090a9c106", + "url": "https://files.pythonhosted.org/packages/51/2b/a445456fdca0a4bd6c691861d66a7c226f015a543d9f6b2f5537e1b734cc/ujson-6.0.0-cp310-cp310-musllinux_1_2_x86_64.whl" }, { "algorithm": "sha256", - "hash": "b1209c985d1f4c2ae085ced7325509650cdb3533bb7294558dd1f26d48377942", - "url": "https://files.pythonhosted.org/packages/8e/aa/a945aeba9d463e335169b3c0ee60adc147e22e80bb636fe0f185bed1247f/ujson-5.13.0-cp310-cp310-musllinux_1_2_x86_64.whl" + "hash": "fbae9b1a4d70e2283d71a0b66db2a91eb1a2cefaf370e47eff3a79f8ece7148d", + "url": "https://files.pythonhosted.org/packages/59/84/cdb0286e5fb188b0fec4448fbc48be6be6c029fdfda7bff949f789997386/ujson-6.0.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl" }, { "algorithm": "sha256", - "hash": "a8e8c1203cb1a27720debc334f840a9170da741503522f86999710cb4738fbe3", - "url": "https://files.pythonhosted.org/packages/8e/d2/92e83af35cd65d3b7c47fb0e24927aa2b478897af8b0dd0ee19abcd50c03/ujson-5.13.0-cp310-cp310-macosx_11_0_arm64.whl" + "hash": "80e23393feb707582e0ad495c397a4477b646d08094d2df64f7316f9fafd8aae", + "url": "https://files.pythonhosted.org/packages/64/7c/e1fa3fb70b53192436d751b5cb671f0ee960baa188b8351a7fec735223d3/ujson-6.0.0.tar.gz" }, { "algorithm": "sha256", - "hash": "65c1813fdd742fe3c249d9c417fa490e5b54e8a91bf343a88486ec50d175c444", - "url": "https://files.pythonhosted.org/packages/96/9c/3eb2d21778dbd0a9f1adae7ce73e4f6c981efa7fab534eb28afde31fd25e/ujson-5.13.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl" + "hash": "b8d019e935e4f8d6493690036161e62fae033891b71f20d238342ae266fec852", + "url": "https://files.pythonhosted.org/packages/76/67/0e6a2ee29000cdde7a8fb931bf2fdd941a8c0deef18451e3e9c936dbfece/ujson-6.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl" }, { "algorithm": "sha256", - "hash": "5aa9bf16f0131812720dd4ae70bc1a0cf68f79e93c07c66100d328e75944b567", - "url": "https://files.pythonhosted.org/packages/9a/52/f5b72747349c66552396166a13424a717df70e76a18ac5bbedc84c244407/ujson-5.13.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl" + "hash": "8141cade37dabc5f090eb5e6a267eabb6b193078becdc82aaf10433196715c33", + "url": "https://files.pythonhosted.org/packages/7f/b1/58a77bf3939317a679474d9e0cca62ce87f0c299689aadf2940ba6a5acc5/ujson-6.0.0-cp312-cp312-musllinux_1_2_i686.whl" }, { "algorithm": "sha256", - "hash": "0806683e8171ec06817e6af22f14ba0cd2f16def8a2ffb22a28a10615249355d", - "url": "https://files.pythonhosted.org/packages/a9/99/d6bb0e18188954326b38499ae61b04ce8ead6425b8844384e537a491267b/ujson-5.13.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl" + "hash": "d4a731cc7cd513bf4c4016a24a060fb1aa8475e8682e1f8b1bfb836f8d3f50f0", + "url": "https://files.pythonhosted.org/packages/84/52/bf7a055ae58f13933500906a937b58b7e9052ea881c1159c1ad5bfdb17d3/ujson-6.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl" }, { "algorithm": "sha256", - "hash": "e12192a37c6c0e476554b62647acdf6139a47b6f13d8bad8dd2316763c4cee12", - "url": "https://files.pythonhosted.org/packages/ac/fb/a1d0a6a83a13adee3a13cad308dcd3251ac53c4bd781f737242ad2f10d19/ujson-5.13.0-cp311-cp311-musllinux_1_2_x86_64.whl" + "hash": "b305657e2ddc29a50b333053e7c7f431a8c24c92b7dcbbf7a420f2330152b486", + "url": "https://files.pythonhosted.org/packages/84/b0/454f4a6aea48fd580eaaceb9d692cfa219b41e197c6bbfd534ee8945dad9/ujson-6.0.0-cp312-cp312-macosx_11_0_arm64.whl" }, { "algorithm": "sha256", - "hash": "e2282039eb26f08ed1a1381360395f8a310f39a45ef7314cb0f258a7d2917ea3", - "url": "https://files.pythonhosted.org/packages/ad/8e/9d11af9d1d19ea239b0d289cf62a611cb4f2da9ec0d46b826767f4ab1768/ujson-5.13.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl" + "hash": "fd26d4b182b7138fc948cda55fe2e91b70d987731e169e628f42ba22cc6e3cce", + "url": "https://files.pythonhosted.org/packages/86/b5/68e1eeee2c35f79a0d720ac066236f0ddfb9a29864cec5dbe9ec006a0f74/ujson-6.0.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl" }, { "algorithm": "sha256", - "hash": "4b266f182d4bce74a6a9e1f86988485e8cd422efdcc7c3f537e00cc956f52678", - "url": "https://files.pythonhosted.org/packages/af/b4/0bd6449ae35b6026d94f4d1a32dbc9f40c969ed1d6e36a7e26ccf56371be/ujson-5.13.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl" + "hash": "4a69419253e9367281db03355eb55b5231eef5ff338bb816eb5926ee788faf48", + "url": "https://files.pythonhosted.org/packages/8d/c3/170109078742892cf5ca19b0c8df517e5945f5b7141782235c2cb6124518/ujson-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "09effd42924a80df20a63b31a1ede905e66b0ce24aafe7a4cbedb05c783f8bb3", - "url": "https://files.pythonhosted.org/packages/b5/c6/83db69f96dc12509c9510084c0389c4aff4dcf427f9b613d1a23abd446ce/ujson-5.13.0-cp311-cp311-macosx_11_0_arm64.whl" + "hash": "1080587042cb19f9cfb08f289498d866ac5f93393b21006321dea331dbf62375", + "url": "https://files.pythonhosted.org/packages/b4/78/ac325bada531de2fa2623e7dca1f690ae2314f9fb790ebad64dd41571298/ujson-6.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl" }, { "algorithm": "sha256", - "hash": "fdde6341d213b29f413b5fa9fad1392d5408074c75f0900ed949e97e546fa5df", - "url": "https://files.pythonhosted.org/packages/bc/1d/f68e14cf476d149945211142f4c20782c1f232c489e8edcc4f4b58ce4997/ujson-5.13.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl" + "hash": "6759d1a9f8aa45dbe2fb3e49ef181e8e6dacca89c595c5ec007ab2b839235117", + "url": "https://files.pythonhosted.org/packages/cf/8f/a4c91917c51f64ecc846bd2bc7f0a4397d4339cd1e91d2965cb85a484cee/ujson-6.0.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl" }, { "algorithm": "sha256", - "hash": "ea7204e9fa7538bfbb1396e1ee8c2bbcd3818b3633ef5bb14d4fdea52994d14d", - "url": "https://files.pythonhosted.org/packages/bc/c4/9a34ade542426f56a0bc042f774073d1c247ae7575363c27587788cb2b2f/ujson-5.13.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl" + "hash": "cca83e86a300db6c72847bc7acc259bf86481063aea408b07c8a96d649797b7f", + "url": "https://files.pythonhosted.org/packages/d2/0e/37251c324a2b8799a22b5354b8edd4b867b91f0e68fb74423772c377bd7f/ujson-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "b535e0970c96957e999cfe5ec89361f0e8d0bb987fb5d5144f6f495cb3ed9e19", - "url": "https://files.pythonhosted.org/packages/c3/df/eb5bd92dc1b23254fea5b2022007baff5491a7478bfcf7e9260d3a10f1ac/ujson-5.13.0-cp312-cp312-musllinux_1_2_i686.whl" + "hash": "aa03ac78c7806c6a391c037e0a63552e11532210b719bc062cddc00671a7577f", + "url": "https://files.pythonhosted.org/packages/d6/7d/cd5139cbdab193562713851e751249e2981c90c275c57584403351d7d70c/ujson-6.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl" }, { "algorithm": "sha256", - "hash": "f1cf46c79498c81f088cad4165b1669a78bba7bfbeb778c7cc1aff316e062b0d", - "url": "https://files.pythonhosted.org/packages/c6/5f/8f1ce659a59ef9510fa47b95773442049a383c533a645b2da8beeeec90f1/ujson-5.13.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl" + "hash": "0a4edbeb091b195031a0e96fab005150340e383c095cac6b5c2b7dc8f55040b5", + "url": "https://files.pythonhosted.org/packages/db/66/e5edd446495ede37491da219779b762d1877c9a3d69f87aadbddafe0cdb2/ujson-6.0.0-cp311-cp311-musllinux_1_2_aarch64.whl" }, { "algorithm": "sha256", - "hash": "96e7e019b097b4b25fccddadb369d13f412c13695fcf0680b6bf906376156151", - "url": "https://files.pythonhosted.org/packages/c7/7f/276f830bef4d530d50ff4d8f8c568002e7ebed9f64c06747b1d1c4325f02/ujson-5.13.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl" + "hash": "a054959ec07f2fd63b6e8a63019a6879262c4f1983a100545c5a0206eefe993e", + "url": "https://files.pythonhosted.org/packages/e0/39/4536f25a8c47fb78a12b5253929ce4b41a121fcd4e1b34d02634b6939e4d/ujson-6.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl" }, { "algorithm": "sha256", - "hash": "b0b5f6983b2469db00e540b68fa8297b7a0ccd0d5173c60cc3e84f336b09395f", - "url": "https://files.pythonhosted.org/packages/c8/ba/44fcf17cc93be7c6647fef2e556d703791659280e6409623dea854e6db7d/ujson-5.13.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl" + "hash": "7de7692f330c1ceaf6335ad8039d2fe9344d30ecb415e86ee719e9d5585b2077", + "url": "https://files.pythonhosted.org/packages/e6/0d/a93e8d790a36262b662187dad04ab84b0204a9ad58c4ab5d87004b18b2f3/ujson-6.0.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl" }, { "algorithm": "sha256", - "hash": "3d0ad1207694988498fca7e0bb28eba7564fa33261d2f9fdf66a3aaab376b803", - "url": "https://files.pythonhosted.org/packages/cb/1c/65f2ce1a0411ec9a87339db01f0d5d554a49c4248ec68ab52a1b7e14e9c4/ujson-5.13.0-cp312-cp312-musllinux_1_2_x86_64.whl" + "hash": "c51915961a51e37403fd94114e293d580dd916ddd1961b229217a87193d2454e", + "url": "https://files.pythonhosted.org/packages/e7/e7/870f261071662573c6e0d74f28ed3e6d4ed8c604ced85df3a1e404c679d8/ujson-6.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl" }, { "algorithm": "sha256", - "hash": "770643b4752266c5a466149848b78c3874940926a4ecef304f518b2b6cdb432f", - "url": "https://files.pythonhosted.org/packages/d3/a4/ff15f528d386f47b1972859f25587da017d5be84c75076b380fedde318fe/ujson-5.13.0-cp310-cp310-macosx_10_9_x86_64.whl" + "hash": "666a91606eeb47c997927ff294f3a9f8f930a02d0d2293ec7b19da5ed688f7ec", + "url": "https://files.pythonhosted.org/packages/eb/40/7db01714718c4324d3641061b12cce285ef906f750c09157f65dfc5c16fa/ujson-6.0.0-cp310-cp310-musllinux_1_2_i686.whl" }, { "algorithm": "sha256", - "hash": "820b78a6a183ab6591b2ea888020032ef0fe328d852af9a5c8d8084ababb2218", - "url": "https://files.pythonhosted.org/packages/d4/02/baaf3ad0bb4b2c3bec3d9ff8a59768d39d20201146742e8581f8a0f87e77/ujson-5.13.0-cp310-cp310-musllinux_1_2_i686.whl" + "hash": "65bbea52c251b568268b61f9377bee867addc81c9b4c24da277b051ce16f6151", + "url": "https://files.pythonhosted.org/packages/ef/ab/a0f4f171b4244a9d61be0c7be767791cd51d01cf805db534a2a2bde59eba/ujson-6.0.0-pp311-pypy311_pp73-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl" }, { "algorithm": "sha256", - "hash": "cdd9618e07b3b142a02f0ab8227fd52453688b8e8e60ac0511f13a25fa8009db", - "url": "https://files.pythonhosted.org/packages/ee/43/d28ca5e6c3d8c467a4c6296404067f4eee9d67dfeeebeb3c5fb0bd6cb958/ujson-5.13.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl" + "hash": "02148bd4706f42b063bb95f6cc309e16554fb4c250db4683688c0a3eb83048ad", + "url": "https://files.pythonhosted.org/packages/ef/d1/6a5526d896ead68746997a95f0ae9077e5a438c1574ecb6ea031e72cb75b/ujson-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl" }, { "algorithm": "sha256", - "hash": "bf81570ac056cb058f9117b52ca5dd800bfe9381d0076d0bb30a08a54591d654", - "url": "https://files.pythonhosted.org/packages/ee/ae/b66deca15da1f7faf6952d8eddf55978482bcbfd294ed2afe2c526ea325f/ujson-5.13.0-cp312-cp312-macosx_10_13_x86_64.whl" + "hash": "0e94f0b95459caa6cb5e333baf6763bf1e7a96ea5e4f1ea7fbb0ad88e81a88ab", + "url": "https://files.pythonhosted.org/packages/f3/ec/ed610aff77e0f060d0abb6e1d5ad8f07b2b6e4a0c5e765225ccc5f229ef4/ujson-6.0.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl" }, { "algorithm": "sha256", - "hash": "89d0bfc986d02b4ce76b00e0f560bc8d30dfe8c05a1bfd8529e085eb6c1a77d9", - "url": "https://files.pythonhosted.org/packages/f0/6c/6d87206988172015781b9ff842c0a7eca897c026b2e7a95e11d86d46ddf5/ujson-5.13.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl" + "hash": "dc8510c8b5b8373e0789ca05ebffc0aaab6e8a8f86d67956c91bc37f43d4f989", + "url": "https://files.pythonhosted.org/packages/f6/e6/988d06bf5e46c992397d93123012bdd1e84bd829afe8181d8334a98ba7e0/ujson-6.0.0-cp310-cp310-macosx_11_0_arm64.whl" }, { "algorithm": "sha256", - "hash": "1d02f31c2f59cc6a1c2c3633b377701fc2d8e876cc01950735d7a01132ccc233", - "url": "https://files.pythonhosted.org/packages/f6/6f/7f55c1e9e0be87beebaed553fa186ad5f6d5d639cbaa9d49f78f2f91c3a9/ujson-5.13.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl" + "hash": "20eff4f1ea3b970b998bf111036404eb18e976d4919783f793e539370b8627cb", + "url": "https://files.pythonhosted.org/packages/fb/42/878078293fcb394f3da724e6cfee089d57202365846a3b2e3ace2f112405/ujson-6.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl" }, { "algorithm": "sha256", - "hash": "7892ea6dd85ede6d30fbbd22af1239b9d81dabdf9b7a8f10ca6d4464d4d9b8ab", - "url": "https://files.pythonhosted.org/packages/fc/50/99b05555ef42a2ab2e26aa369c46bde6a64f8aeeb687628102e98cc78bed/ujson-5.13.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl" + "hash": "5919fe3109a08f8bd682a2ad1cec5cdeff7c1f563b812aba26e86b8b0ab05558", + "url": "https://files.pythonhosted.org/packages/fc/03/76c7213a59dd0f21a984f3422e14f7955e97a67e159890b29f3a2c5c0e30/ujson-6.0.0-cp311-cp311-musllinux_1_2_x86_64.whl" } ], "project_name": "ujson", "requires_dists": [], "requires_python": ">=3.10", - "version": "5.13.0" + "version": "6.0.0" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", - "url": "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl" + "hash": "0cf3cae568d36aa9576b28dfb35f11328f1cb974ca7647d9475ebb86c75ac6e3", + "url": "https://files.pythonhosted.org/packages/92/9d/c4e665119135114480843e7ab388fa94d8480650450e6f8e26b70d323a4c/urllib3-2.8.0-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", - "url": "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz" + "hash": "63bf2ead4c879426ebf22ef2a781eeb4aa3b4ae798a0435506f8687fd5bb9b63", + "url": "https://files.pythonhosted.org/packages/e3/05/b17359e1cefb4f909b5e40b1b90a496d987258916dbbf88e842c729f510e/urllib3-2.8.0.tar.gz" } ], "project_name": "urllib3", @@ -6276,7 +6285,7 @@ "pysocks!=1.5.7,<2.0,>=1.5.6; extra == \"socks\"" ], "requires_python": ">=3.10", - "version": "2.7.0" + "version": "2.8.0" }, { "artifacts": [ @@ -6368,19 +6377,59 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "d5b73dba6158a595ec9370350e7f2637bcac8d6c5e4fde34f30fcffb6103a5e4", - "url": "https://files.pythonhosted.org/packages/c4/0e/57f6bb3024a597b2e8ec4aee710ffe62ddc95af2e2bb1ee7a7abdc22c68c/wcwidth-0.8.3-py3-none-any.whl" + "hash": "e0c3a1c45c5b9550c6919a4449e95f5b177f6e165786376981db8f1addae9b21", + "url": "https://files.pythonhosted.org/packages/96/a2/f06f2e0be4895e5943d358755b51968ace85774cf0a4cc42b4dafb793832/wcwidth-0.9.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "69bb970cf5652b88cfdb9d3fdd1764fc15e5f8ad531643e7bb3e894cd969740e", + "url": "https://files.pythonhosted.org/packages/0b/71/f57effdf895c2d6d49333f1d6833a9f5438725c55a04ed3124a1c95bb3aa/wcwidth-0.9.1-cp310-abi3-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl" }, { "algorithm": "sha256", - "hash": "d128512515fbf4612e0ff21fd6380399210318b7b54a9af59dff8454cf9730eb", - "url": "https://files.pythonhosted.org/packages/36/57/ed58088fafdf4c55a0ad6bde846502567645424d7ebf325230b9237f4085/wcwidth-0.8.3.tar.gz" + "hash": "40d936d72c9bdc10df43f93a8be502bc5024b487259139f66a328722c07f34a9", + "url": "https://files.pythonhosted.org/packages/33/7c/c7bb03da54de7ac5a08753e186b963f91847b04ed8ae5be136a4d5f52b75/wcwidth-0.9.1-cp310-abi3-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "10b00ba23482e352f874d2e8135e7ace9da838646c7dd800566246bbd46125ff", + "url": "https://files.pythonhosted.org/packages/48/7c/130de33c0a7f6efecee28fef5711fc1f8d55ac33885a6b85f4f6689004ba/wcwidth-0.9.1-cp310-abi3-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "b5da43d6967668982e44a52fb551967d293f86d26cd86036ac95bbdd34394ed9", + "url": "https://files.pythonhosted.org/packages/4f/16/15b03d8fb7a747d0d2cf4a33da7b1b3e092493c58780f6589d5b1e9e3b49/wcwidth-0.9.1-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "6e1272b7986cefe79783737e38bdb9eaae0682b333c7bd132024441193dd5ce7", + "url": "https://files.pythonhosted.org/packages/a2/ae/1b7597e0132ebc2c920632f39d8c1c61881345c9b480c0a95eb91e7460fa/wcwidth-0.9.1-cp310-abi3-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "708158c082364af442f9983de7b6ec9ac0d2e1b825ada25f0911b1f138d55405", + "url": "https://files.pythonhosted.org/packages/d6/72/1ee3dff67697bda93bc56ec9f7b3b89609cd64b9abb328512a2f22eb9e47/wcwidth-0.9.1-cp310-abi3-musllinux_1_2_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "5823209b0d43af322ce698c689380d7c15ca31fa8e6e3be8459f27031bef0af5", + "url": "https://files.pythonhosted.org/packages/dc/ac/3a943d2792c9bb368aaa8b50121c0f778460ba2d7fbdc0a0366201d9e761/wcwidth-0.9.1.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "747fb724223f417a17541a95a17c1dac3a8ef9a0cf41684950f0eab191a35f65", + "url": "https://files.pythonhosted.org/packages/e2/a0/834886b30e3b885a5a96e8358f1b3917bc0bac43ae4178d77f0c210d079b/wcwidth-0.9.1-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "fe021c4d8de9d36c31a0cb41d0d2546dadd3b0708a301f1a0c66ce200851831f", + "url": "https://files.pythonhosted.org/packages/fb/bb/32149e3b481953f4ef35f38f166e2532886d33ae54ccdd71393f821dfad9/wcwidth-0.9.1-cp310-abi3-musllinux_1_2_i686.whl" } ], "project_name": "wcwidth", "requires_dists": [], - "requires_python": ">=3.8", - "version": "0.8.3" + "requires_python": ">=3.9", + "version": "0.9.1" }, { "artifacts": [ @@ -6444,13 +6493,13 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "63a77fb8892bf28ebc3178683445222aa500e48ebad5ec77b0ad80f8726b1f50", - "url": "https://files.pythonhosted.org/packages/93/8c/2e650f2afeb7ee576912636c23ddb621c91ac6a98e66dc8d29c3c69446e1/werkzeug-3.1.8-py3-none-any.whl" + "hash": "6392e50c78460ba618e5b21f08a71f59c99ce99cdc6cf6e3dd7e6ccca8754fab", + "url": "https://files.pythonhosted.org/packages/a1/38/df03f564f43cec2684823f3cccae1a652ee7face1cbaa76fb223096e64d7/werkzeug-3.1.9-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "9bad61a4268dac112f1c5cd4630a56ede601b6ed420300677a869083d70a4c44", - "url": "https://files.pythonhosted.org/packages/dd/b2/381be8cfdee792dd117872481b6e378f85c957dd7c5bca38897b08f765fd/werkzeug-3.1.8.tar.gz" + "hash": "55ca7c70a75689be937aa27f8ff4b018f06ff4838fc73045560bf0f5a1291060", + "url": "https://files.pythonhosted.org/packages/a4/34/4dd12fc8bb7d61c91467ec3efe415ffa7d5456f799954b40c5bbaeae470e/werkzeug-3.1.9.tar.gz" } ], "project_name": "werkzeug", @@ -6459,7 +6508,7 @@ "watchdog>=2.3; extra == \"watchdog\"" ], "requires_python": ">=3.9", - "version": "3.1.8" + "version": "3.1.9" }, { "artifacts": [ @@ -6485,133 +6534,133 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "d8c7ed08477429752b8c44991f40ad7838b18332a160698740a6bfbc10d998a2", - "url": "https://files.pythonhosted.org/packages/00/39/3daf9f47be208606586de4568ba6713db53ebc8fd7a575aea1fe57983b69/wrapt-2.3.0-py3-none-any.whl" + "hash": "107eea1a511e98a3a5033b0c2cb403fbb37f05dee6ac1fb85c0460d311ec278c", + "url": "https://files.pythonhosted.org/packages/87/7d/5ed859fad4b5eddd598a846150aaab2703730ed4886c5c5e03b0df0cfdd5/wrapt-2.5.0-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "5ab559e1b2551d23d54db2a0001c6d73bad022a254639561c5f6c382a9d6c2fe", - "url": "https://files.pythonhosted.org/packages/00/b8/9182e4c618a847be0baccb68e4602b070d0fa22c782cf058f4bc66b32709/wrapt-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl" + "hash": "0cabb9c17ab79b2549d1f23b36f436473ad9253ef53995a817feba26fae69d5b", + "url": "https://files.pythonhosted.org/packages/11/0e/3ce67af67525c0068680637c0eba823ce2f0fc6eff2d1779cab656fb8c3d/wrapt-2.5.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl" }, { "algorithm": "sha256", - "hash": "3d1c2c1b808600d2ea808e6360910a60ed5f409a4011655e10f9164ba0a414a6", - "url": "https://files.pythonhosted.org/packages/0e/60/9bda34c3d7d182aa703fe35339ae0ed4c4dad5e5c587f93890143e1f87fb/wrapt-2.3.0-cp311-cp311-musllinux_1_2_riscv64.whl" + "hash": "b898caea081303006decc562c7fca5126f7c96507e78dd8f1ae3285dfa50ddc7", + "url": "https://files.pythonhosted.org/packages/2a/a6/44589f9b34160280a1fbccbcf206b18df034a1b3e9584336d3a7f039a33c/wrapt-2.5.0-cp312-cp312-macosx_10_13_x86_64.whl" }, { "algorithm": "sha256", - "hash": "e5301c35cf75655eb33498f2bd6ae8703ca19940e3167dc9cdf740c712a39c60", - "url": "https://files.pythonhosted.org/packages/12/1e/8eded8615d39e3ce81f626937a3a87b280a2a86239a2bf14a4b4bb345034/wrapt-2.3.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl" + "hash": "a145a7826eddea3eb5814903f98f93756042b919bb5305544cb1331daa2705b1", + "url": "https://files.pythonhosted.org/packages/2e/ec/d54d273a2223d1964ecd5b5954aca18e8fbf2c5d8471e60ef3cbaaed9325/wrapt-2.5.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl" }, { "algorithm": "sha256", - "hash": "e2e692bc0d63f881cf7006730a56bd4e0c2fab5dc318466942805d692b166276", - "url": "https://files.pythonhosted.org/packages/1f/d6/c66b4ba4eda49257c84d5c2df26118280f09ca7905aee20d0064db778d13/wrapt-2.3.0-cp310-cp310-musllinux_1_2_riscv64.whl" + "hash": "63e58f96849f622ce769dcd705f83c7445cd9829bce1dae00e78bb031aec8096", + "url": "https://files.pythonhosted.org/packages/3d/fa/6f7f880207b2d74162a44b35e41217d999fd4af48338afb356c650f89a07/wrapt-2.5.0-cp311-cp311-macosx_11_0_arm64.whl" }, { "algorithm": "sha256", - "hash": "816877aa749253149f9ecfd2635d4d948ecfa338e1a0311d187b1acb1bb8a3eb", - "url": "https://files.pythonhosted.org/packages/23/41/c35940ea1c423f129ebe4361db853bc80d4def6326242e1206fa15bf94f4/wrapt-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl" + "hash": "c48cdb6c904dca76d9915a579e4a5fab6b0c25f650c1019ce78a78effaf7a345", + "url": "https://files.pythonhosted.org/packages/3e/d2/a254a26d8ceaea87e0eee2e89fcfe53ddc1858418647493bb2937549ab6f/wrapt-2.5.0.tar.gz" }, { "algorithm": "sha256", - "hash": "5d221a6e6ddd302b8397433184e96b59f259f50024b854db1c411a881586b6b8", - "url": "https://files.pythonhosted.org/packages/28/7f/cfd9bc4b1f5e424eeea83d0493e43f3b1b02707ce8e50c47945873982bd5/wrapt-2.3.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl" + "hash": "734ea79e4707751fb7cc4f716123b2115cd16ed0c4926e803540aece22e3ba67", + "url": "https://files.pythonhosted.org/packages/55/a7/e0c0ca927a03d164927001677530bba68e6fe6b267584dda26cbeba5a2dc/wrapt-2.5.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl" }, { "algorithm": "sha256", - "hash": "681a2d0eefd721998f90642762b8e75c2159ec531b20ad5e437245ea7b06a107", - "url": "https://files.pythonhosted.org/packages/2b/b0/c1f5a970721f06b85c0cd5142e0ff8fe067708abd779b0c4f4be7d61d09f/wrapt-2.3.0.tar.gz" + "hash": "672dd1bab4256311db1520b1b50e7a10cbaeaae2b0ac6bc5d858cc387ee605a2", + "url": "https://files.pythonhosted.org/packages/5c/68/b7883fe1c6b445df44e32a2a3a19a544a3a73749c5064a539c10f9f730a4/wrapt-2.5.0-cp311-cp311-musllinux_1_2_riscv64.whl" }, { "algorithm": "sha256", - "hash": "418f54bb09d1762db02c7009b4051149893af3153a87f92d70356703c11eea02", - "url": "https://files.pythonhosted.org/packages/35/ea/a0af2d9da62897af2a055484920de05dade30d2ba2c0d65cbdea875d3d8b/wrapt-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl" + "hash": "fd91203e156d610ecb28b9ccd7b764af7a7b38662d7c163090babab0d10def0c", + "url": "https://files.pythonhosted.org/packages/6f/19/b0b7e7cf1a5499a25bd5260b38deb3b17aa9ca7b268ef29e546dcb683aa7/wrapt-2.5.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl" }, { "algorithm": "sha256", - "hash": "0bb2797048db0956348cb3058c33bc4184614f13231389cfbccc16a5d32780a7", - "url": "https://files.pythonhosted.org/packages/40/31/5822ce37ca8820c2ed35a498c67c8b37960b9cee2ba437fd32849d0a234c/wrapt-2.3.0-cp310-cp310-macosx_10_9_x86_64.whl" + "hash": "148052fc55013930217f531c6978e918ab210a12bd73cc9bd6de661a7adaf620", + "url": "https://files.pythonhosted.org/packages/70/6b/11b3b25915bfed1b47b7486a306602f3c3698b5a6b73b05bbd59bd891650/wrapt-2.5.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl" }, { "algorithm": "sha256", - "hash": "d0077f3d65541925fa83002f967b22ad6550d24813ac64cb905f717194128d9c", - "url": "https://files.pythonhosted.org/packages/49/2c/bc508fee75eb2919ed69769800b09968e4aab16897f909a23f39c81e323f/wrapt-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" + "hash": "1ccd22ef8690ca302425f26d4c3e8b24f1284d4351d20e49ce21f9c0dd58d64d", + "url": "https://files.pythonhosted.org/packages/78/b0/0fe1d3cf811b0135593c8f91d0bb57ff2576807e37eff2a7aa4e3a24d1cc/wrapt-2.5.0-cp310-cp310-musllinux_1_2_aarch64.whl" }, { "algorithm": "sha256", - "hash": "9790ea25190a4e0fe4cdf4eeb868e9d75f8a024a70a5b6bf9c348a3a2b72e731", - "url": "https://files.pythonhosted.org/packages/4d/e5/04f34d38e66d857dfc2fc4088d60e70c0e422467822defa49b2b4a26e17b/wrapt-2.3.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl" + "hash": "e716f47c7f61e11709d3c0904213c94fc22999abf0c41461276cef886c1e8b4d", + "url": "https://files.pythonhosted.org/packages/7c/2c/4c48ba51698a87e2e8299fc04856bbef391cb725f195bc93f0bc6196e1f2/wrapt-2.5.0-cp312-cp312-musllinux_1_2_x86_64.whl" }, { "algorithm": "sha256", - "hash": "0a45ffae742ce91a16e11cb6c7cd71e7f9994f3cbd283b962ab093f5c6dcf525", - "url": "https://files.pythonhosted.org/packages/5b/4a/d17a0fad1bf1c5f2c887ff71fef75654141b0880bff71d157d955b5bec3a/wrapt-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl" + "hash": "ff909b934b1958e31784d412abab5cbb0709fdbc01c86f22965e1d15331371ba", + "url": "https://files.pythonhosted.org/packages/7d/cd/b6cce206889497626f9b8b9d2ecb74324287d853bcca13c8bfab9b99a981/wrapt-2.5.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" }, { "algorithm": "sha256", - "hash": "fc82c2ccc8e234c844f5303d9f2984b346dcdd53e94823ce8420d2c75b4b9023", - "url": "https://files.pythonhosted.org/packages/6c/21/1f780bba935dcf697c0c59de9be3a559bbb8e31a53ca3f25422023738432/wrapt-2.3.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" + "hash": "57fa1a3fd1279b3ca7655b943ad61d298f2a2464a4cdca7ff298058e408322f9", + "url": "https://files.pythonhosted.org/packages/7f/d0/7c23187af053bfa54c99964f87b94b96cea76b78f019b06e42fa86752e5d/wrapt-2.5.0-cp311-cp311-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "69e477046f2237ef0bc6547544ee73008dc764ca26eff44f09e976d221b34d5d", - "url": "https://files.pythonhosted.org/packages/6e/55/51b92daaf6defb57f4dc56bdcce985400f75c6984a03ca5e78ccac717028/wrapt-2.3.0-cp312-cp312-macosx_11_0_arm64.whl" + "hash": "7e2af7ff9553c492f684a41d903ec41e37bf6267ee3206c17518a349201cae46", + "url": "https://files.pythonhosted.org/packages/81/49/ee77b33964f83ee5624dbccfa939356ca84092ad30a211681095985a5b7e/wrapt-2.5.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" }, { "algorithm": "sha256", - "hash": "fc648a335d7e01adb3640b25f02fd0ea05886cf04d0af7f4ee902bc7b5e466e8", - "url": "https://files.pythonhosted.org/packages/71/71/4cd2151a236f44a6e2dd4ed8011838d7ba0be3d656c8bafdfc65a2ed1917/wrapt-2.3.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl" + "hash": "6a9ee62a970075738909909bdbef3a7da9f7ae03dfca584db283547a29503b56", + "url": "https://files.pythonhosted.org/packages/8e/88/33c75ac47b13b0bf77b44d96d02b1d0a2e6db66180909bacce86ef8fcd8e/wrapt-2.5.0-cp312-cp312-musllinux_1_2_aarch64.whl" }, { "algorithm": "sha256", - "hash": "a6e19531ae33c508cea7d84a7edfda01fa86e51b8d1a93a77712c55e6e469152", - "url": "https://files.pythonhosted.org/packages/73/31/6c7799d7b6431fcd7e1b83245fb45258a2d2c3a2187fbaecb83572a72d7a/wrapt-2.3.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl" + "hash": "aae2f5f4c77335a39ebe5a1c77d5519f6cefefc7dbff50bd551e3771d927e3fc", + "url": "https://files.pythonhosted.org/packages/c3/d3/a75a67fb1c9e3164eec4d31c2da3c606895d1ae71f74045eb70ab591fe53/wrapt-2.5.0-cp310-cp310-macosx_11_0_arm64.whl" }, { "algorithm": "sha256", - "hash": "ce9f398f868d2b3b27aa2ea4de79645ef9077aeeac8dfc2814b0d542c6a2b87f", - "url": "https://files.pythonhosted.org/packages/7a/5a/3c6117938be98754578ab83f5a40d7d0ea2cd2c487dc5cd6027ee7228229/wrapt-2.3.0-cp310-cp310-macosx_11_0_arm64.whl" + "hash": "1b35ef7379323a149a6398f6261248bf48b61666210bd69e2ab24a9a9afdedc0", + "url": "https://files.pythonhosted.org/packages/c3/e1/6f46c822f6657a69c8fef5d0824e0b5287d27b76d3769b501770b917fbb8/wrapt-2.5.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl" }, { "algorithm": "sha256", - "hash": "1598becd30f8f2777d18564064eb4f4dbe1ab0e05a8f09786d0ef505ac782bf3", - "url": "https://files.pythonhosted.org/packages/7e/dd/63cd4c864c65ef4906df64bd2d378f4a62b54f28063f282dfb3bf93caead/wrapt-2.3.0-cp312-cp312-musllinux_1_2_riscv64.whl" + "hash": "8837fbe708cb9d8a2d32a37dee836d24a531f02560db26418e2b181986fa21cb", + "url": "https://files.pythonhosted.org/packages/ce/2b/94db3ba2e9528400e4173cbb67a56822a4644d4c2b319feb0cc638094b36/wrapt-2.5.0-cp312-cp312-macosx_11_0_arm64.whl" }, { "algorithm": "sha256", - "hash": "bff9a671bc00709cab5a7f745c592b5671873449db0ee2a569af994f16b29a4d", - "url": "https://files.pythonhosted.org/packages/84/ca/613cefd9c5977366b1587e61c0b428176d382e6d75b454084c5e58503042/wrapt-2.3.0-cp311-cp311-macosx_11_0_arm64.whl" + "hash": "691671ea05684f921ffc2e935fd3f9311c1795a10fbbfa006b46269733668f66", + "url": "https://files.pythonhosted.org/packages/d2/0e/c3a3a158801e5bee7a0d9aa3561a127bd80f166b02b7b520a39e45d8f9b9/wrapt-2.5.0-cp312-cp312-musllinux_1_2_riscv64.whl" }, { "algorithm": "sha256", - "hash": "ad71df7a04dd3497e9302e81f4a7c91bd401ea0e15a9df9029527900f94bee43", - "url": "https://files.pythonhosted.org/packages/a5/0f/94ae724c5087eb6054c0d63febd7094947dcf302fe058e2e0488102a872b/wrapt-2.3.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl" + "hash": "6761765cc520ff9616fb035c02a85d1d744f7f70edd4649718fd0d09c589eacf", + "url": "https://files.pythonhosted.org/packages/d3/3b/262b2c3c38aca6fa32cfea6407dbb346ce26ff788179b98137b3b3f3d8ca/wrapt-2.5.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" }, { "algorithm": "sha256", - "hash": "c8388ba7faf5dbf9ee106bb70d66f257629b1bd98091123e19e8a4553a319199", - "url": "https://files.pythonhosted.org/packages/c0/f2/1a3b949c0322fb27396eafd1044328c1cb0400e0b32105d75a3cd03096e7/wrapt-2.3.0-cp310-cp310-musllinux_1_2_x86_64.whl" + "hash": "e0345d4c1f7aa5a27075d28a7f0e9ed386729198045f1f08b47f8320d6bbda23", + "url": "https://files.pythonhosted.org/packages/f0/23/37e2276e520ae569af851ebffaf03476e6984cd3ff298234ecd6920f7c4e/wrapt-2.5.0-cp310-cp310-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "3da470536bf9645143323dd41b32db55c6f4304ad382094c1a1da8a92061e10d", - "url": "https://files.pythonhosted.org/packages/ca/ee/82f1fc9e431b5c2c5a6d201aa865dbeae3984c311c6d11a185f0c8367cf6/wrapt-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl" + "hash": "e5d4885c5625c9d2dcb49458700851574e9d0ea046c7a265526e990282f8ae8e", + "url": "https://files.pythonhosted.org/packages/f6/97/9901b407cacfd7b3efca60f808713294e5758dda023586fe201fe203d134/wrapt-2.5.0-cp311-cp311-musllinux_1_2_aarch64.whl" }, { "algorithm": "sha256", - "hash": "392158c9a7f2ab1b8699418bfc0fe6f83548788c418b27d7bf2019ad3405cebb", - "url": "https://files.pythonhosted.org/packages/cb/89/ff7814f6eb6856b479946117d1138a2fbb46cdb6b1f379db359056c69743/wrapt-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" + "hash": "c3a78a3161b3a9bf07725822fd24d379c1f3f161b6db49166c4131096ea73b4c", + "url": "https://files.pythonhosted.org/packages/f7/05/f9d527f0da33b901684ad326b6b9fc07593013f9594b9db4ebb0ddc1e127/wrapt-2.5.0-cp311-cp311-musllinux_1_2_x86_64.whl" }, { "algorithm": "sha256", - "hash": "df4ce31150bcd5d9f36f816aac3010ab4f4bf8672ac1d3b0ac7d539ec61c7c02", - "url": "https://files.pythonhosted.org/packages/ce/17/42d670dbfafd49076c6eb2b7d67633d7e1c968e39bfb11a135acb6fac67b/wrapt-2.3.0-cp310-cp310-musllinux_1_2_aarch64.whl" + "hash": "94ebe745d1b0ebd3af91e22c38961616d32a228bdf9c326e7d4a6007a623d48e", + "url": "https://files.pythonhosted.org/packages/f8/90/a647f92c48c981ce198fe59bfd62c2113ca58e8557bcb8f05149cac93f5d/wrapt-2.5.0-cp310-cp310-musllinux_1_2_x86_64.whl" }, { "algorithm": "sha256", - "hash": "5ba1e5e08ddc46130e9682b2c249f2d1dd39bda9106ed4bd401b7519f18f41bd", - "url": "https://files.pythonhosted.org/packages/e8/ba/60bfd9b1a751f4fcb2d603668fc272d651ccdd339a56acf8c40ad21a0293/wrapt-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl" + "hash": "439523506fd0d9af4f76d75f2e46aa4979e164fecba6890859326ff06edbaf9c", + "url": "https://files.pythonhosted.org/packages/fd/fc/312410d55792dccebe489771fa36a35a71df17580568d6c9685e74102ca6/wrapt-2.5.0-cp310-cp310-musllinux_1_2_riscv64.whl" } ], "project_name": "wrapt", @@ -6620,7 +6669,7 @@ "setuptools; extra == \"dev\"" ], "requires_python": ">=3.9", - "version": "2.3.0" + "version": "2.5.0" }, { "artifacts": [ diff --git a/st2actions/st2actions/workflows/workflows.py b/st2actions/st2actions/workflows/workflows.py index ebf24cf3ef..755c7e6673 100644 --- a/st2actions/st2actions/workflows/workflows.py +++ b/st2actions/st2actions/workflows/workflows.py @@ -14,6 +14,9 @@ # limitations under the License. from __future__ import absolute_import + +import datetime + from oslo_config import cfg from orquesta import statuses @@ -35,6 +38,7 @@ from st2common.transport import utils as txpt_utils from st2common.util import concurrency from st2common.util import action_db as action_utils +from st2common.util import date as date_utils LOG = logging.getLogger(__name__) @@ -105,9 +109,14 @@ def process(self, message): self._active_messages -= 1 def start(self, wait): - concurrency.spawn_after( - self._delay, self._resume_workflows_paused_during_shutdown - ) + # Resuming workflows paused by a prior engine shutdown is opt-in + # (off by default). Enable it via workflow_engine.bootstrap_enabled in + # environments where rolling restarts can leave shutdown-paused + # workflows behind. + if cfg.CONF.workflow_engine.bootstrap_enabled: + concurrency.spawn_after( + self._delay, self._resume_workflows_paused_during_shutdown + ) super(WorkflowExecutionHandler, self).start(wait=wait) def shutdown(self): @@ -129,8 +138,26 @@ def shutdown(self): except GroupNotCreated: pass + # Determine whether any *other* workflow engine is still a member of + # the coordination group. We must exclude our own member id: during a + # graceful shutdown this engine may not have deregistered itself yet, + # so the raw member list can still contain our own id. Keying off the + # raw list is wrong in both directions: + # * If we are the last engine, our own id is still present, so + # "not member_ids" is False and nothing is paused -- leaving the + # running workflows stuck with no engine to drive them. + # * If a peer engine ("engine B") is still up while this engine + # ("engine A") goes down, that peer will keep processing the + # workflows, so we must not pause them. + # Excluding our own id makes the decision correct in both cases: + # pause only when no other engine remains to take over. + our_member_id = coordination.get_member_id() + other_member_ids = [ + member_id for member_id in member_ids if member_id != our_member_id + ] + # Check if there are other WFEs in service registry - if cfg.CONF.coordination.service_registry and not member_ids: + if cfg.CONF.coordination.service_registry and not other_member_ids: ac_ex_dbs = self._get_running_workflows() for ac_ex_db in ac_ex_dbs: lv_ac = action_utils.get_liveaction_by_id(ac_ex_db.liveaction_id) @@ -144,9 +171,14 @@ def _get_running_workflows(self): return ex_db_access.ActionExecution.query(**query_filters) def _get_workflows_paused_during_shutdown(self): + lookback_days = cfg.CONF.workflow_engine.bootstrap_lookback_days + start_timestamp_gte = date_utils.get_datetime_utc_now() - datetime.timedelta( + days=lookback_days + ) query_filters = { "status": ac_const.LIVEACTION_STATUS_PAUSED, "context__paused_by": WORKFLOW_ENGINE_START_STOP_SEQ, + "start_timestamp__gte": start_timestamp_gte, } return lv_db_access.LiveAction.query(**query_filters) diff --git a/st2actions/tests/unit/test_workflow_engine.py b/st2actions/tests/unit/test_workflow_engine.py index 2f4344a4c4..c117a68957 100644 --- a/st2actions/tests/unit/test_workflow_engine.py +++ b/st2actions/tests/unit/test_workflow_engine.py @@ -100,6 +100,7 @@ def reset_config( exit_still_active_check=None, # default is 300 (st2common.config) still_active_check_interval=None, # default is 2 (st2common.config) service_registry=None, # default is False (st2common.config) + bootstrap_enabled=None, # default is False (st2common.config) ): tests_config.reset() tests_config.parse_args() @@ -125,6 +126,12 @@ def reset_config( cfg.CONF.set_override( name="service_registry", override=service_registry, group="coordination" ) + if bootstrap_enabled is not None: + cfg.CONF.set_override( + name="bootstrap_enabled", + override=bootstrap_enabled, + group="workflow_engine", + ) def test_process(self): self.reset_config() @@ -307,6 +314,7 @@ def test_workflow_engine_shutdown(self): exit_still_active_check=4, still_active_check_interval=1, service_registry=True, + bootstrap_enabled=True, ) wf_meta = self.get_wf_fixture_meta_data(TEST_PACK_PATH, "sequential.yaml") @@ -410,6 +418,47 @@ def test_workflow_engine_shutdown_with_multiple_members(self): lv_ac_db = lv_db_access.LiveAction.get_by_id(str(lv_ac_db.id)) self.assertEqual(lv_ac_db.status, action_constants.LIVEACTION_STATUS_RUNNING) + @mock.patch.object( + RedisDriver, + "get_members", + mock.MagicMock( + return_value=coordination_service.NoOpAsyncResult( + (coordination_service.get_member_id(),) + ) + ), + ) + def test_workflow_engine_shutdown_last_engine_still_registered_pauses(self): + # Regression test for the last-engine shutdown case: this is the only + # workflow engine, but it has not yet deregistered itself from the + # coordination group, so the group still contains our own member id. + # The shutdown path must exclude our own id, recognize that no *other* + # engine remains to take over, and pause the running workflow. Keying + # off the raw member list (which is non-empty because it holds our own + # id) would wrongly skip the pause and strand the workflow in RUNNING. + self.reset_config(service_registry=True) + + wf_meta = self.get_wf_fixture_meta_data(TEST_PACK_PATH, "sequential.yaml") + lv_ac_db = lv_db_models.LiveActionDB(action=wf_meta["name"]) + lv_ac_db, ac_ex_db = action_service.request(lv_ac_db) + + # Assert action execution is running. + lv_ac_db = lv_db_access.LiveAction.get_by_id(str(lv_ac_db.id)) + self.assertEqual(lv_ac_db.status, action_constants.LIVEACTION_STATUS_RUNNING) + wf_ex_db = wf_db_access.WorkflowExecution.query( + action_execution=str(ac_ex_db.id) + )[0] + self.assertEqual(wf_ex_db.status, action_constants.LIVEACTION_STATUS_RUNNING) + workflow_engine = workflows.get_engine() + + eventlet.spawn(workflow_engine.shutdown) + + # Sleep for few seconds to ensure shutdown sequence completes. + eventlet.sleep(5) + + # No other engine is left, so this engine must pause the workflow. + lv_ac_db = lv_db_access.LiveAction.get_by_id(str(lv_ac_db.id)) + self.assertEqual(lv_ac_db.status, action_constants.LIVEACTION_STATUS_PAUSING) + def test_workflow_engine_shutdown_with_service_registry_disabled(self): self.reset_config(service_registry=False) @@ -441,7 +490,9 @@ def test_workflow_engine_shutdown_with_service_registry_disabled(self): mock.MagicMock(return_value=coordination_service.NoOpLock(name="noop")), ) def test_workflow_engine_shutdown_first_then_start(self): - self.reset_config(service_registry=True, exit_still_active_check=0) + self.reset_config( + service_registry=True, exit_still_active_check=0, bootstrap_enabled=True + ) wf_meta = self.get_wf_fixture_meta_data(TEST_PACK_PATH, "sequential.yaml") lv_ac_db = lv_db_models.LiveActionDB(action=wf_meta["name"]) diff --git a/st2common/bin/st2-bootstrap-workflow b/st2common/bin/st2-bootstrap-workflow new file mode 100755 index 0000000000..8d345ef48d --- /dev/null +++ b/st2common/bin/st2-bootstrap-workflow @@ -0,0 +1,22 @@ +#!/usr/bin/env python3 +# Licensed to the StackStorm, Inc ('StackStorm') under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import sys +from st2common.cmd.bootstrap_workflow import main + +if __name__ == "__main__": + sys.exit(main()) diff --git a/st2common/setup.py b/st2common/setup.py index 5e2764286d..ea5fb3f0d3 100644 --- a/st2common/setup.py +++ b/st2common/setup.py @@ -49,6 +49,7 @@ packages=find_packages(exclude=["setuptools", "tests"]), scripts=[ "bin/st2-bootstrap-rmq", + "bin/st2-bootstrap-workflow", "bin/st2-cleanup-db", "bin/st2-register-content", "bin/st2-purge-executions", diff --git a/st2common/st2common/cmd/bootstrap_workflow.py b/st2common/st2common/cmd/bootstrap_workflow.py new file mode 100644 index 0000000000..679182edab --- /dev/null +++ b/st2common/st2common/cmd/bootstrap_workflow.py @@ -0,0 +1,137 @@ +# Copyright 2020 The StackStorm Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +""" +Manually bootstrap-resume a single workflow execution that was paused by a +prior workflow engine shutdown. Bypasses coordination first-member election +and the automatic-bootstrap lookback window; the operator is asserting they +want this specific execution resumed now. + +With --reconcile-running, instead re-drives a workflow that is stuck in RUNNING +(rather than PAUSED). This is the safety valve for the case where an engine was +hard-killed (e.g. OOM) after acking but before processing a message, leaving the +workflow RUNNING with no message left to advance it. The operator is asserting +this specific execution is stuck; see wf_svc.reconcile_running_execution. +""" + +from __future__ import absolute_import + +from oslo_config import cfg + +from st2common import config +from st2common import log as logging +from st2common.config import do_register_cli_opts +from st2common.constants import action as ac_const +from st2common.constants.exit_codes import FAILURE_EXIT_CODE +from st2common.constants.exit_codes import SUCCESS_EXIT_CODE +from st2common.persistence import execution as ex_db_access +from st2common.persistence import liveaction as lv_db_access +from st2common.script_setup import setup as common_setup +from st2common.script_setup import teardown as common_teardown +from st2common.services import workflows as wf_svc + + +__all__ = ["main"] + +LOG = logging.getLogger(__name__) + + +def _register_cli_opts(): + cli_opts = [ + cfg.StrOpt( + "execution-id", + default=None, + help="ActionExecution id of the shutdown-paused workflow to resume.", + ), + cfg.BoolOpt( + "reconcile-running", + default=False, + help=( + "Re-drive a workflow stuck in RUNNING (not PAUSED) whose driving " + "message was lost with a hard-killed engine. Only use this on an " + "execution you have determined is stuck; it is unsafe against a " + "workflow still being actively processed." + ), + ), + ] + do_register_cli_opts(cli_opts) + + +def _reconcile_running_one(execution_id): + ac_ex_db = ex_db_access.ActionExecution.get_by_id(execution_id) + lv_ac_db = lv_db_access.LiveAction.get_by_id(str(ac_ex_db.liveaction_id)) + + if lv_ac_db.status != ac_const.LIVEACTION_STATUS_RUNNING: + LOG.error( + "Execution %s is in status %r, not %r. Refusing to reconcile. " + "Use bootstrap-resume (without --reconcile-running) for paused workflows.", + execution_id, + lv_ac_db.status, + ac_const.LIVEACTION_STATUS_RUNNING, + ) + return FAILURE_EXIT_CODE + + wf_svc.reconcile_running_execution(lv_ac_db) + LOG.info("Reconciled stuck-running execution %s.", execution_id) + return SUCCESS_EXIT_CODE + + +def _bootstrap_one(execution_id): + ac_ex_db = ex_db_access.ActionExecution.get_by_id(execution_id) + lv_ac_db = lv_db_access.LiveAction.get_by_id(str(ac_ex_db.liveaction_id)) + + if lv_ac_db.status != ac_const.LIVEACTION_STATUS_PAUSED: + LOG.error( + "Execution %s is in status %r, not %r. Refusing to bootstrap-resume.", + execution_id, + lv_ac_db.status, + ac_const.LIVEACTION_STATUS_PAUSED, + ) + return FAILURE_EXIT_CODE + + paused_by = lv_ac_db.context.get("paused_by") + if paused_by != wf_svc.WORKFLOW_ENGINE_START_STOP_SEQ: + LOG.error( + "Execution %s was not paused by an engine shutdown " + "(paused_by=%r). Use `st2 execution resume` for user-paused workflows.", + execution_id, + paused_by, + ) + return FAILURE_EXIT_CODE + + wf_svc.bootstrap_resume_execution(lv_ac_db) + LOG.info("Bootstrap-resumed execution %s.", execution_id) + return SUCCESS_EXIT_CODE + + +def main(): + _register_cli_opts() + common_setup(config=config, setup_db=True, register_mq_exchanges=True) + + execution_id = cfg.CONF.execution_id + if not execution_id: + LOG.error("--execution-id is required. Aborting.") + common_teardown() + return FAILURE_EXIT_CODE + + try: + if cfg.CONF.reconcile_running: + return _reconcile_running_one(execution_id) + return _bootstrap_one(execution_id) + except Exception as e: + LOG.exception("Failed to bootstrap-resume execution %s: %s", execution_id, e) + return FAILURE_EXIT_CODE + finally: + common_teardown() diff --git a/st2common/st2common/config.py b/st2common/st2common/config.py index c218122c7e..2c08ed98e2 100644 --- a/st2common/st2common/config.py +++ b/st2common/st2common/config.py @@ -940,6 +940,19 @@ def register_opts(ignore_errors=False): default=2, help="Time interval between subsequent queries to check executions handled by WFE.", ), + cfg.BoolOpt( + "bootstrap_enabled", + default=False, + help="On leader engine startup, resume workflows that were paused by " + "prior all engines complete shutdown. Off by default.", + ), + cfg.IntOpt( + "bootstrap_lookback_days", + default=1, + help="When bootstrap_enabled is set, only resume workflows whose " + "LiveAction.start_timestamp is within this many days. Prevents " + "accidentally resuming ancient paused workflows on engine startup.", + ), ] do_register_opts( diff --git a/st2common/st2common/services/workflows.py b/st2common/st2common/services/workflows.py index c99fb896b5..85cb438057 100644 --- a/st2common/st2common/services/workflows.py +++ b/st2common/st2common/services/workflows.py @@ -55,6 +55,11 @@ LOG = logging.getLogger(__name__) +# Marker written into LiveAction.context.paused_by when the workflow engine +# pauses running workflows during its own shutdown. The manual +# st2-bootstrap-workflow CLI uses this marker to identify eligible workflows. +WORKFLOW_ENGINE_START_STOP_SEQ = "workflow_engine_start_stop_seq" + LOG_FUNCTIONS = { "audit": LOG.audit, "debug": LOG.debug, @@ -1575,3 +1580,233 @@ def identify_orphaned_workflows(): continue return orphaned + + +def sync_completed_tasks_to_conductor(wf_ex_id): + """ + Synchronize task executions from database to conductor state. + + Two scenarios are handled: + 1. Completed tasks: sync their completion into the conductor state so it + stops thinking they are still running. + 2. Running tasks: re-stage them so get_next_tasks() finds them. + + This is required after a workflow was paused during engine shutdown but + tasks continued to complete or transitioned to running before the pause was + fully processed. + """ + LOG.debug("Starting task synchronization for workflow execution %s", wf_ex_id) + + wf_ex_db = wf_db_access.WorkflowExecution.get_by_id(wf_ex_id) + conductor = deserialize_conductor(wf_ex_db) + + task_ex_dbs = wf_db_access.TaskExecution.query(workflow_execution=wf_ex_id) + LOG.debug("Found %d task execution(s) for workflow %s", len(task_ex_dbs), wf_ex_id) + + updated = False + restaged_count = 0 + + for task_ex_db in task_ex_dbs: + if task_ex_db.status in statuses.COMPLETED_STATUSES: + task_state = conductor.get_task_state_entry( + task_ex_db.task_id, task_ex_db.task_route + ) + if ( + task_state + and task_state.get("status") not in statuses.COMPLETED_STATUSES + ): + ac_ex_event = events.ActionExecutionEvent( + task_ex_db.status, result=task_ex_db.result + ) + conductor.update_task_state( + task_ex_db.task_id, task_ex_db.task_route, ac_ex_event + ) + updated = True + LOG.debug( + 'Synchronized completed task "%s" (status: %s) to conductor state', + task_ex_db.task_id, + task_ex_db.status, + ) + + elif task_ex_db.status == statuses.RUNNING: + staged_task = conductor.workflow_state.get_staged_task( + task_ex_db.task_id, task_ex_db.task_route + ) + + if not staged_task: + task_state = conductor.get_task_state_entry( + task_ex_db.task_id, task_ex_db.task_route + ) + + if task_state: + ctxs_in = task_state.get("ctxs", {}).get("in", [0]) + conductor.workflow_state.add_staged_task( + task_ex_db.task_id, + task_ex_db.task_route, + ctxs=ctxs_in, + prev=task_state.get("prev", {}), + ready=True, + ) + updated = True + restaged_count += 1 + LOG.debug( + 'Re-staged running task "%s" (route: %s) to conductor', + task_ex_db.task_id, + task_ex_db.task_route, + ) + else: + LOG.warning( + 'Cannot re-stage task "%s" - no task state entry found', + task_ex_db.task_id, + ) + + if updated: + wf_ex_db.state = conductor.workflow_state.serialize() + wf_db_access.WorkflowExecution.update(wf_ex_db, publish=False) + + completed_count = len( + [t for t in task_ex_dbs if t.status in statuses.COMPLETED_STATUSES] + ) + if completed_count > 0: + LOG.info( + 'Synchronized %d completed task(s) to conductor for workflow "%s"', + completed_count, + wf_ex_id, + ) + if restaged_count > 0: + LOG.info( + 'Re-staged %d running task(s) to conductor for workflow "%s"', + restaged_count, + wf_ex_id, + ) + else: + LOG.debug( + "No tasks needed synchronization for workflow %s (all tasks already in sync)", + wf_ex_id, + ) + + +def bootstrap_resume_execution(lv_ac_db): + """ + Resume a single LiveAction that was paused during a prior engine shutdown. + + Clears the paused_by marker, syncs any tasks that changed state while the + workflow was paused, then calls request_resume. Raises on failure so the + caller (manual CLI) can log/report per-execution. + """ + LOG.debug( + "[%s] Bootstrap-resume starting; LiveAction status: %s", + str(lv_ac_db.id), + lv_ac_db.status, + ) + + if "paused_by" in lv_ac_db.context: + del lv_ac_db.context["paused_by"] + lv_ac_db = lv_db_access.LiveAction.add_or_update(lv_ac_db, publish=False) + + ac_ex_db = ex_db_access.ActionExecution.get(liveaction_id=str(lv_ac_db.id)) + wf_ex_id = ac_ex_db.context.get("workflow_execution") + + if wf_ex_id: + sync_completed_tasks_to_conductor(wf_ex_id) + else: + LOG.warning( + "[%s] No workflow_execution ID in context; skipping task sync.", + str(ac_ex_db.id), + ) + + request_resume(ac_ex_db) + LOG.info('Bootstrap-resumed workflow execution "%s".', str(ac_ex_db.id)) + + +def reconcile_running_execution(lv_ac_db): + """ + Re-drive a workflow stuck in RUNNING because a message that would have + advanced it was lost (e.g. an engine was OOM-killed after acking a message + but before processing it -- see the ack-on-dispatch behavior in + st2common.transport.consumers). + + At the moment the message is lost, the child *action execution* has already + completed and been persisted, but its TaskExecution and the conductor were + never advanced. So the durable ground truth is the child action execution + status, not the TaskExecution status -- which is why this does NOT rely on + sync_completed_tasks_to_conductor (that keys off TaskExecution status). + + Recovery has two phases: + + 1. Replay lost task-completion messages. For any task that is not yet + completed but whose child action execution has finished, re-run + handle_action_execution_completion -- exactly what the lost message + would have done (advance the conductor, request the next tasks). Each + child action execution is handled at most once, and tasks whose action + is still running are left untouched, so a workflow a live engine is + still driving is not disturbed. + 2. Re-request next tasks, in case the lost message was the *request* to + start the next task (conductor advanced but no TaskExecution created). + conductor.get_next_tasks() will not return tasks it already tracks, so + this is a no-op when nothing is missing. + + This is intended for operator-initiated recovery of a workflow the operator + has already determined is stuck; it is deliberately not run automatically. + + Note: for itemized ("with items") tasks a task has multiple child action + executions; each completed child is replayed once, which matches normal + per-item completion handling. + """ + ac_ex_db = ex_db_access.ActionExecution.get(liveaction_id=str(lv_ac_db.id)) + wf_ex_id = ac_ex_db.context.get("workflow_execution") + + if not wf_ex_id: + LOG.warning( + "[%s] No workflow_execution ID in context; cannot reconcile.", + str(ac_ex_db.id), + ) + return + + # Phase 1: replay completed-but-unprocessed child action executions. + handled_child_ids = set() + replayed = 0 + + while True: + progressed = False + task_ex_dbs = wf_db_access.TaskExecution.query(workflow_execution=wf_ex_id) + + for task_ex_db in task_ex_dbs: + if task_ex_db.status in statuses.COMPLETED_STATUSES: + continue + + child_ac_ex_dbs = ex_db_access.ActionExecution.query( + task_execution=str(task_ex_db.id) + ) + for child_ac_ex_db in child_ac_ex_dbs: + if str(child_ac_ex_db.id) in handled_child_ids: + continue + if child_ac_ex_db.status not in ac_const.LIVEACTION_COMPLETED_STATES: + continue + + LOG.info( + '[%s] Replaying lost completion of action execution "%s" ' + 'for task "%s".', + str(ac_ex_db.id), + str(child_ac_ex_db.id), + task_ex_db.task_id, + ) + handle_action_execution_completion(child_ac_ex_db) + handled_child_ids.add(str(child_ac_ex_db.id)) + replayed += 1 + progressed = True + + if not progressed: + break + + # Phase 2: re-request next tasks if the workflow is still running, to cover + # the case where the lost message was the next-task request itself. + wf_ex_db = wf_db_access.WorkflowExecution.get_by_id(wf_ex_id) + if wf_ex_db.status in statuses.RUNNING_STATUSES: + request_next_tasks(wf_ex_db) + + LOG.info( + 'Reconciled stuck-running workflow execution "%s" (replayed %d completion(s)).', + str(ac_ex_db.id), + replayed, + ) diff --git a/st2common/tests/unit/test_bootstrap_workflow_cmd.py b/st2common/tests/unit/test_bootstrap_workflow_cmd.py new file mode 100644 index 0000000000..a26bb69cd1 --- /dev/null +++ b/st2common/tests/unit/test_bootstrap_workflow_cmd.py @@ -0,0 +1,142 @@ +# Copyright 2020 The StackStorm Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import + +from st2common.util.monkey_patch import monkey_patch + +monkey_patch() + +import bson +import mock + +from st2common.cmd import bootstrap_workflow +from st2common.constants import action as action_constants +from st2common.constants.exit_codes import FAILURE_EXIT_CODE +from st2common.constants.exit_codes import SUCCESS_EXIT_CODE +from st2common.models.db.execution import ActionExecutionDB +from st2common.models.db.liveaction import LiveActionDB +from st2common.persistence.execution import ActionExecution +from st2common.persistence.liveaction import LiveAction +from st2common.services import workflows as wf_svc +from st2tests.base import CleanDbTestCase + + +class TestBootstrapWorkflowCLI(CleanDbTestCase): + def _make_paused_execution(self, paused_by): + lv_ac_db = LiveActionDB( + action="core.local", + status=action_constants.LIVEACTION_STATUS_PAUSED, + context={"paused_by": paused_by} if paused_by is not None else {}, + ) + lv_ac_db = LiveAction.add_or_update(lv_ac_db, publish=False) + ac_ex_db = ActionExecutionDB( + liveaction_id=str(lv_ac_db.id), + action={"ref": "core.local"}, + runner={"name": "local-shell-cmd"}, + status=action_constants.LIVEACTION_STATUS_PAUSED, + context={}, + ) + ac_ex_db = ActionExecution.add_or_update(ac_ex_db, publish=False) + return lv_ac_db, ac_ex_db + + def test_missing_execution_id_returns_not_found(self): + # No such execution exists. + bogus = str(bson.ObjectId()) + with mock.patch.object(wf_svc, "bootstrap_resume_execution") as mock_resume: + # Expect a database miss to raise, main catches → FAILURE. + # _bootstrap_one raises via get_by_id; main wraps it. + with self.assertRaises(Exception): + bootstrap_workflow._bootstrap_one(bogus) + mock_resume.assert_not_called() + + def test_rejects_execution_not_paused(self): + lv_ac_db = LiveActionDB( + action="core.local", + status=action_constants.LIVEACTION_STATUS_SUCCEEDED, + context={"paused_by": wf_svc.WORKFLOW_ENGINE_START_STOP_SEQ}, + ) + lv_ac_db = LiveAction.add_or_update(lv_ac_db, publish=False) + ac_ex_db = ActionExecutionDB( + liveaction_id=str(lv_ac_db.id), + action={"ref": "core.local"}, + runner={"name": "local-shell-cmd"}, + status=action_constants.LIVEACTION_STATUS_SUCCEEDED, + context={}, + ) + ac_ex_db = ActionExecution.add_or_update(ac_ex_db, publish=False) + + with mock.patch.object(wf_svc, "bootstrap_resume_execution") as mock_resume: + rc = bootstrap_workflow._bootstrap_one(str(ac_ex_db.id)) + self.assertEqual(rc, FAILURE_EXIT_CODE) + mock_resume.assert_not_called() + + def test_rejects_paused_by_other_actor(self): + _lv_ac, ac_ex_db = self._make_paused_execution(paused_by="some_user@stackstorm") + + with mock.patch.object(wf_svc, "bootstrap_resume_execution") as mock_resume: + rc = bootstrap_workflow._bootstrap_one(str(ac_ex_db.id)) + self.assertEqual(rc, FAILURE_EXIT_CODE) + mock_resume.assert_not_called() + + def test_happy_path_calls_service(self): + lv_ac_db, ac_ex_db = self._make_paused_execution( + paused_by=wf_svc.WORKFLOW_ENGINE_START_STOP_SEQ + ) + + with mock.patch.object(wf_svc, "bootstrap_resume_execution") as mock_resume: + rc = bootstrap_workflow._bootstrap_one(str(ac_ex_db.id)) + self.assertEqual(rc, SUCCESS_EXIT_CODE) + mock_resume.assert_called_once() + # Called with the LiveActionDB matching our record. + args, _ = mock_resume.call_args + self.assertEqual(str(args[0].id), str(lv_ac_db.id)) + + def _make_running_execution(self): + lv_ac_db = LiveActionDB( + action="core.local", + status=action_constants.LIVEACTION_STATUS_RUNNING, + context={}, + ) + lv_ac_db = LiveAction.add_or_update(lv_ac_db, publish=False) + ac_ex_db = ActionExecutionDB( + liveaction_id=str(lv_ac_db.id), + action={"ref": "core.local"}, + runner={"name": "orquesta"}, + status=action_constants.LIVEACTION_STATUS_RUNNING, + context={}, + ) + ac_ex_db = ActionExecution.add_or_update(ac_ex_db, publish=False) + return lv_ac_db, ac_ex_db + + def test_reconcile_rejects_execution_not_running(self): + # A paused (not running) execution must be rejected by the reconcile path. + _lv_ac, ac_ex_db = self._make_paused_execution( + paused_by=wf_svc.WORKFLOW_ENGINE_START_STOP_SEQ + ) + + with mock.patch.object(wf_svc, "reconcile_running_execution") as mock_reconcile: + rc = bootstrap_workflow._reconcile_running_one(str(ac_ex_db.id)) + self.assertEqual(rc, FAILURE_EXIT_CODE) + mock_reconcile.assert_not_called() + + def test_reconcile_happy_path_calls_service(self): + lv_ac_db, ac_ex_db = self._make_running_execution() + + with mock.patch.object(wf_svc, "reconcile_running_execution") as mock_reconcile: + rc = bootstrap_workflow._reconcile_running_one(str(ac_ex_db.id)) + self.assertEqual(rc, SUCCESS_EXIT_CODE) + mock_reconcile.assert_called_once() + args, _ = mock_reconcile.call_args + self.assertEqual(str(args[0].id), str(lv_ac_db.id))