From 358b71affff49d86dbf253e70643c9ce8a272664 Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Mon, 22 Apr 2024 14:32:59 -0400 Subject: [PATCH 01/29] hold working --- BUILD | 2 + README.md | 3 +- build-support/requirements/requirements.txt | 3 +- src/BUILD | 1 + src/mitol/posthog/BUILD | 27 +++ src/mitol/posthog/README.md | 9 + src/mitol/posthog/__init__.py | 5 + src/mitol/posthog/apps.py | 13 ++ .../20240416_151714_collin_preston.rst | 34 ++++ src/mitol/posthog/features.py | 174 ++++++++++++++++++ src/mitol/posthog/pyproject.toml | 15 ++ src/mitol/posthog/settings/__init__.py | 0 src/mitol/posthog/settings/posthog.py | 41 +++++ src/mitol/posthog/tests.py | 3 + tests/testapp/settings/shared.py | 1 + 15 files changed, 329 insertions(+), 2 deletions(-) create mode 100644 src/mitol/posthog/BUILD create mode 100644 src/mitol/posthog/README.md create mode 100644 src/mitol/posthog/__init__.py create mode 100644 src/mitol/posthog/apps.py create mode 100644 src/mitol/posthog/changelog.d/20240416_151714_collin_preston.rst create mode 100644 src/mitol/posthog/features.py create mode 100644 src/mitol/posthog/pyproject.toml create mode 100644 src/mitol/posthog/settings/__init__.py create mode 100644 src/mitol/posthog/settings/posthog.py create mode 100644 src/mitol/posthog/tests.py diff --git a/BUILD b/BUILD index e073efac..9aeccd05 100644 --- a/BUILD +++ b/BUILD @@ -17,7 +17,9 @@ python_requirements( "pytest-lazy-fixture": ["pytest_lazyfixture"], "python3-saml": ["onelogin"], "social-auth-app-django": ["social_django"], + "named-enum": ["enum"], "setuptools": ["pkg_resources"], + "posthog": ["posthog"] } ) diff --git a/README.md b/README.md index e7e738cf..07250d7e 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ This repository is the home of MIT Open Learning's reusable django apps We maintain changelogs in `changelog.d/` directories with each app. To create a new changelog for your changes, run: +- `mkdir ./src/mitol/{APPNAME}/changelog.d` - `pants ol-project changelog create --app APPNAME` - `APPNAME`: the name of an application directory @@ -15,7 +16,7 @@ Then fill out the new file that was generated with information about your change Changelogs are maintained according to [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). Versioning uses a date-based versioning scheme with incremental builds on the same day. -Version tags follow `{package-name}/v{version` +Version tags follow `{package-name}/v{version}` To perform a release, run: - `pants ol-project release create --app APPNAME --push`: - `APPNAME`: the name of an application directory diff --git a/build-support/requirements/requirements.txt b/build-support/requirements/requirements.txt index 58b4e2a2..93629258 100644 --- a/build-support/requirements/requirements.txt +++ b/build-support/requirements/requirements.txt @@ -27,4 +27,5 @@ setuptools social-auth-app-django>=5.4.0 social-auth-core>=4.5.1 toolz>=0.10.0 -urllib3>=1.26.5 \ No newline at end of file +urllib3>=1.26.5 +posthog>=3.5.0 diff --git a/src/BUILD b/src/BUILD index c7013b6e..61affae0 100644 --- a/src/BUILD +++ b/src/BUILD @@ -15,6 +15,7 @@ target( "openedx", "payment_gateway", "geoip", + "posthog", ] ], ) diff --git a/src/mitol/posthog/BUILD b/src/mitol/posthog/BUILD new file mode 100644 index 00000000..43a24421 --- /dev/null +++ b/src/mitol/posthog/BUILD @@ -0,0 +1,27 @@ +resources( + name="files", + sources=[ + "CHANGELOG.md", + "README.md", + "py.typed", + ], +) + +python_sources( + name="posthog", + sources=[ + "**/*.py", + ], + dependencies=[ + ":files", + ], +) + +python_distribution( + name="mitol-django-posthog", + dependencies=[":posthog"], + provides=setup_py( + name="mitol-django-posthog", + description="MIT Open Learning django app extensions for Posthog", + ), +) diff --git a/src/mitol/posthog/README.md b/src/mitol/posthog/README.md new file mode 100644 index 00000000..96c4eccb --- /dev/null +++ b/src/mitol/posthog/README.md @@ -0,0 +1,9 @@ +mitol-posthog +--- + +COLLIN TO UPDATE. + + +### Setup + +You may need to install xmlsec: `apt-get install libxmlsec1-dev` diff --git a/src/mitol/posthog/__init__.py b/src/mitol/posthog/__init__.py new file mode 100644 index 00000000..16075bb4 --- /dev/null +++ b/src/mitol/posthog/__init__.py @@ -0,0 +1,5 @@ +""" mitol.posthog """ +default_app_config = "mitol.posthog.apps.PostHog" + +__version__ = "2024.04.12.1" +__distributionname__ = "mitol-django-PostHog" diff --git a/src/mitol/posthog/apps.py b/src/mitol/posthog/apps.py new file mode 100644 index 00000000..66d3999f --- /dev/null +++ b/src/mitol/posthog/apps.py @@ -0,0 +1,13 @@ +import os +from mitol.common.apps import BaseApp +from mitol.posthog.features import configure + +class Posthog(BaseApp): + default_auto_field = "django.db.models.BigAutoField" + name = "mitol.posthog" + label = "posthog" + verbose_name = "PostHog" + configure() + + # necessary because this is a namespaced app + path = os.path.dirname(os.path.abspath(__file__)) diff --git a/src/mitol/posthog/changelog.d/20240416_151714_collin_preston.rst b/src/mitol/posthog/changelog.d/20240416_151714_collin_preston.rst new file mode 100644 index 00000000..5a41ace6 --- /dev/null +++ b/src/mitol/posthog/changelog.d/20240416_151714_collin_preston.rst @@ -0,0 +1,34 @@ +.. A new scriv changelog fragment. +.. +.. Uncomment the header that is right (remove the leading dots). +.. +.. Removed +.. ------- +.. +.. - A bullet item for the Removed category. +.. +.. Added +.. ----- +.. +.. - A bullet item for the Added category. +.. +.. Changed +.. ------- +.. +.. - A bullet item for the Changed category. +.. +.. Deprecated +.. ---------- +.. +.. - A bullet item for the Deprecated category. +.. +.. Fixed +.. ----- +.. +.. - A bullet item for the Fixed category. +.. +.. Security +.. -------- +.. +.. - A bullet item for the Security category. +.. diff --git a/src/mitol/posthog/features.py b/src/mitol/posthog/features.py new file mode 100644 index 00000000..439d4bc1 --- /dev/null +++ b/src/mitol/posthog/features.py @@ -0,0 +1,174 @@ +"""MIT Open feature flags""" + +import hashlib +import json +import logging +from functools import wraps +from typing import Optional + +import posthog +from django.conf import settings +from django.contrib.auth import get_user_model +from django.core.cache import caches + +log = logging.getLogger() +User = get_user_model() +durable_cache = caches["durable"] + + +class Features(): + """Enum for feature flags""" + + +def configure(): + """ + Configure the posthog default_client. + + The posthog library normally takes care of this but it doesn't + expose all the client config options. + """ + posthog.default_client = posthog.Client( + api_key=getattr(settings, "POSTHOG_PROJECT_API_KEY", None), + host=getattr(settings, "POSTHOG_API_HOST", None), + debug=settings.DEBUG, + on_error=None, + send=None, + sync_mode=False, + poll_interval=30, + disable_geoip=True, + feature_flags_request_timeout_seconds=getattr(settings, "POSTHOG_FEATURE_FLAG_REQUEST_TIMEOUT_MS", None) + / 1000, + max_retries=getattr(settings, "POSTHOG_MAX_RETRIES", None), + ) + + +def default_unique_id() -> str: + """Get the default unique_id if it's not provided""" + return settings.HOSTNAME + + +def _get_person_properties(unique_id: str) -> dict: + """ + Get posthog person_properties based on unique_id + """ + return { + "environment": settings.ENVIRONMENT, + "user_id": unique_id, + } + + +def generate_cache_key(key: str, unique_id: str, person_properties: dict) -> str: + """ + Generate a cache key for the feature flag. + + To prevent collisions, we take the unique_id and person_properties that get + passed to the feature flag functions below, combine them, and hash them. + Append the flag key to this to store the value in the cache. + """ + + return "{}_{}".format( + str( + hashlib.sha256( + json.dumps((unique_id, person_properties)).encode("utf-8") + ).hexdigest() + ), + key, + ) + + +def get_all_feature_flags(opt_unique_id: Optional[str] = None): + """ + Get the set of all feature flags + """ + unique_id = opt_unique_id or default_unique_id() + person_properties = _get_person_properties(unique_id) + + flag_data = posthog.get_all_flags( + unique_id, + person_properties=person_properties, + ) + + [ + durable_cache.set(generate_cache_key(k, unique_id, person_properties), v) + for k, v in flag_data.items() + ] + + return flag_data + + +def is_enabled( + name: str, + default: Optional[bool] = None, + opt_unique_id: Optional[str] = None, +) -> bool: + """ + Return True if the feature flag is enabled + + Args: + name (str): feature flag name + default (bool): default value if not set in settings + opt_unique_id (str): + person identifier passed back to posthog which is the display value for + person. I recommend this be user.id for logged-in users to allow for + more readable user flags as well as more clear troubleshooting. For + anonymous users, a persistent ID will help with troubleshooting and tracking + efforts. + + Returns: + bool: True if the feature flag is enabled + """ + unique_id = opt_unique_id or default_unique_id() + person_properties = _get_person_properties(unique_id) + + cache_key = generate_cache_key(name, unique_id, person_properties) + cached_value = durable_cache.get(cache_key) + + if cached_value is not None: + log.debug("Retrieved %s from the cache", name) + return cached_value + else: + log.debug("Retrieving %s from Posthog", name) + + # value will be None if either there is no value or we can't get a response back + value = ( + posthog.get_feature_flag( + name, + unique_id, + person_properties=person_properties, + ) + if getattr(settings, "POSTHOG_ENABLED", False) + else None + ) + + durable_cache.set(cache_key, value) if value is not None else None + + return ( + value + if value is not None + else settings.FEATURES.get(name, default or False) + ) + + +def if_feature_enabled(name: str, default: Optional[bool] = None): + """ + Wrapper that results in a no-op if the given feature isn't enabled, and otherwise + runs the wrapped function as normal. + + Args: + name (str): Feature flag name + default (bool): default value if not set in settings + """ # noqa: D401 + + def if_feature_enabled_inner(func): + @wraps(func) + def wrapped_func(*args, **kwargs): + if not is_enabled(name, default): + # If the given feature name is not enabled, do nothing (no-op). + return None + else: + # If the given feature name is enabled, call the function and return as normal. # noqa: E501 + return func(*args, **kwargs) + + return wrapped_func + + return if_feature_enabled_inner diff --git a/src/mitol/posthog/pyproject.toml b/src/mitol/posthog/pyproject.toml new file mode 100644 index 00000000..f2c5ed12 --- /dev/null +++ b/src/mitol/posthog/pyproject.toml @@ -0,0 +1,15 @@ +[project] +name = "mitol-posthog" +version = "2024.04.16" + +[tool.bumpver] +current_version = "2024.04.16" +version_pattern = "YYYY.MM.DD[.INC0]" + +[tool.bumpver.file_patterns] +"pyproject.toml" = [ + 'version = "{version}"', +] +"__init__.py" = [ + '__version__ = "{version}"', +] \ No newline at end of file diff --git a/src/mitol/posthog/settings/__init__.py b/src/mitol/posthog/settings/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/mitol/posthog/settings/posthog.py b/src/mitol/posthog/settings/posthog.py new file mode 100644 index 00000000..1a54ef69 --- /dev/null +++ b/src/mitol/posthog/settings/posthog.py @@ -0,0 +1,41 @@ +from mitol.common.envs import get_string, get_bool, get_int +POSTHOG_ENABLED = get_bool( + name="POSTHOG_ENABLED", + default=False, + description="Whether to enable Posthog feature flags", +) +POSTHOG_PROJECT_API_KEY = get_string( + name="POSTHOG_PROJECT_API_KEY", + default="", + description="Private API key to communicate with PostHog", +) +POSTHOG_API_HOST = get_string( + name="POSTHOG_API_HOST", + default="https://us.posthog.com", + description="API host for PostHog", +) +POSTHOG_FEATURE_FLAG_REQUEST_TIMEOUT_MS = get_int( + name="POSTHOG_FEATURE_FLAG_REQUEST_TIMEOUT_MS", + default=3000, + description="Timeout(MS) for PostHog feature flag requests.", +) + +POSTHOG_MAX_RETRIES = get_int( + name="POSTHOG_MAX_RETRIES", + default=3, + description="Numbers of time requests to PostHog should be retried after failing.", +) +# CACHES = { +# # general durable cache (redis should be considered ephemeral) +# "durable": { +# "BACKEND": "django.core.cache.backends.db.DatabaseCache", +# "LOCATION": "durable_cache", +# }, +# } +if os.getenv("POSTHOG_ENABLED", "False").lower() in ("true", "1", "t"): + posthog.api_key = POSTHOG_API_TOKEN + posthog.host = POSTHOG_API_HOST + posthog.feature_flags_request_timeout_seconds = ( + POSTHOG_FEATURE_FLAG_REQUEST_TIMEOUT_MS / 1000 + ) + posthog.max_retries = POSTHOG_MAX_RETRIES diff --git a/src/mitol/posthog/tests.py b/src/mitol/posthog/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/src/mitol/posthog/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/tests/testapp/settings/shared.py b/tests/testapp/settings/shared.py index d5367409..c9503f63 100644 --- a/tests/testapp/settings/shared.py +++ b/tests/testapp/settings/shared.py @@ -70,6 +70,7 @@ "mitol.openedx.apps.OpenedxApp", "mitol.payment_gateway.apps.PaymentGatewayApp", "mitol.geoip.apps.GeoIPApp", + "mitol.posthog.apps.PostHog", # test app, integrates the reusable apps "testapp", ] From 294cec2b02e17e6a0a637df5de6d28b954878a38 Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Tue, 23 Apr 2024 09:23:41 -0400 Subject: [PATCH 02/29] documentation and cleanup --- src/mitol/posthog/README.md | 52 ++++++++++++++++++++++++--- src/mitol/posthog/features.py | 31 ++-------------- src/mitol/posthog/settings/posthog.py | 2 +- 3 files changed, 52 insertions(+), 33 deletions(-) diff --git a/src/mitol/posthog/README.md b/src/mitol/posthog/README.md index 96c4eccb..7f3ace6a 100644 --- a/src/mitol/posthog/README.md +++ b/src/mitol/posthog/README.md @@ -1,9 +1,53 @@ -mitol-posthog +mitol-django-posthog --- -COLLIN TO UPDATE. +This is the Open Learning Posthog app. It provides an API to interact with Posthog in order to check feature flags. -### Setup +### Getting started -You may need to install xmlsec: `apt-get install libxmlsec1-dev` +Add the Posthog app: + +`docker-compose run -u root --rm web poetry add mitol-django-posthog` + +Add the following to the `ready()` method for your App. + +``` +from mitol.posthog.features import configure +configure() + +``` + +#### Common Django settings + +- `HOSTNAME` - The website's hostname. + +#### Posthog app settings + +All settings for the `mitol-django-posthog` app are prefaced with 'POSTHOG'. + +- `POSTHOG_ENABLED` - `True` in order to enable Posthog feature flags in the application. `False` to disable Posthog feature flags. +- `POSTHOG_PROJECT_API_KEY` - Required if POSTHOG_ENABLED is True. Private API key to communicate with PostHog. +- `POSTHOG_API_HOST` - Required if POSTHOG_ENABLED is True. Host URL for the PostHog API. +- `POSTHOG_FEATURE_FLAG_REQUEST_TIMEOUT_MS` - Timeout(MS) for PostHog feature flag requests. +- `POSTHOG_MAX_RETRIES` - Numbers of time requests to PostHog should be retried after failing. + +#### Cache table creation +You must create the cache included in this library. This can be done by running the following command from within the Django application that this library is being added to: `./manage.py createcachetable`. + +### Usage + +#### Check single feature flag value +You can check the value of a feature flag on Posthog with the following code: +``` +from mitol.posthog.features import is_enabled +is_enabled() +``` +This will return a boolean value based on whether the Posthog feature flag is True or False. + +#### Retrieve all feature flags from Posthog +You can retrieve all the feature flags from Posthog using: +``` +from mitol.posthog.features import is_enabled +get_all_feature_flags() +``` diff --git a/src/mitol/posthog/features.py b/src/mitol/posthog/features.py index 439d4bc1..9ef2cee8 100644 --- a/src/mitol/posthog/features.py +++ b/src/mitol/posthog/features.py @@ -57,7 +57,7 @@ def _get_person_properties(unique_id: str) -> dict: } -def generate_cache_key(key: str, unique_id: str, person_properties: dict) -> str: +def _generate_cache_key(key: str, unique_id: str, person_properties: dict) -> str: """ Generate a cache key for the feature flag. @@ -89,7 +89,7 @@ def get_all_feature_flags(opt_unique_id: Optional[str] = None): ) [ - durable_cache.set(generate_cache_key(k, unique_id, person_properties), v) + durable_cache.set(_generate_cache_key(k, unique_id, person_properties), v) for k, v in flag_data.items() ] @@ -120,7 +120,7 @@ def is_enabled( unique_id = opt_unique_id or default_unique_id() person_properties = _get_person_properties(unique_id) - cache_key = generate_cache_key(name, unique_id, person_properties) + cache_key = _generate_cache_key(name, unique_id, person_properties) cached_value = durable_cache.get(cache_key) if cached_value is not None: @@ -147,28 +147,3 @@ def is_enabled( if value is not None else settings.FEATURES.get(name, default or False) ) - - -def if_feature_enabled(name: str, default: Optional[bool] = None): - """ - Wrapper that results in a no-op if the given feature isn't enabled, and otherwise - runs the wrapped function as normal. - - Args: - name (str): Feature flag name - default (bool): default value if not set in settings - """ # noqa: D401 - - def if_feature_enabled_inner(func): - @wraps(func) - def wrapped_func(*args, **kwargs): - if not is_enabled(name, default): - # If the given feature name is not enabled, do nothing (no-op). - return None - else: - # If the given feature name is enabled, call the function and return as normal. # noqa: E501 - return func(*args, **kwargs) - - return wrapped_func - - return if_feature_enabled_inner diff --git a/src/mitol/posthog/settings/posthog.py b/src/mitol/posthog/settings/posthog.py index 1a54ef69..11180442 100644 --- a/src/mitol/posthog/settings/posthog.py +++ b/src/mitol/posthog/settings/posthog.py @@ -12,7 +12,7 @@ POSTHOG_API_HOST = get_string( name="POSTHOG_API_HOST", default="https://us.posthog.com", - description="API host for PostHog", + description="Host URL for the PostHog API", ) POSTHOG_FEATURE_FLAG_REQUEST_TIMEOUT_MS = get_int( name="POSTHOG_FEATURE_FLAG_REQUEST_TIMEOUT_MS", From 62f1d671ff72a91802c16e98bd2ddf0bbd6fc91c Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Tue, 23 Apr 2024 10:07:21 -0400 Subject: [PATCH 03/29] tests --- src/mitol/posthog/README.md | 2 +- src/mitol/posthog/__init__.py | 2 +- src/mitol/posthog/apps.py | 3 +- src/mitol/posthog/features.py | 12 ++- src/mitol/posthog/settings/posthog.py | 1 + tests/mitol/posthog/__init__.py | 0 tests/mitol/posthog/test_features.py | 121 ++++++++++++++++++++++++++ tests/testapp/settings/shared.py | 2 +- 8 files changed, 131 insertions(+), 12 deletions(-) create mode 100644 tests/mitol/posthog/__init__.py create mode 100644 tests/mitol/posthog/test_features.py diff --git a/src/mitol/posthog/README.md b/src/mitol/posthog/README.md index 7f3ace6a..db54c30e 100644 --- a/src/mitol/posthog/README.md +++ b/src/mitol/posthog/README.md @@ -4,7 +4,7 @@ mitol-django-posthog This is the Open Learning Posthog app. It provides an API to interact with Posthog in order to check feature flags. -### Getting started +### Installation and setup Add the Posthog app: diff --git a/src/mitol/posthog/__init__.py b/src/mitol/posthog/__init__.py index 16075bb4..17bf2a96 100644 --- a/src/mitol/posthog/__init__.py +++ b/src/mitol/posthog/__init__.py @@ -1,5 +1,5 @@ """ mitol.posthog """ -default_app_config = "mitol.posthog.apps.PostHog" +default_app_config = "mitol.posthog.apps.Posthog" __version__ = "2024.04.12.1" __distributionname__ = "mitol-django-PostHog" diff --git a/src/mitol/posthog/apps.py b/src/mitol/posthog/apps.py index 66d3999f..5932cdb5 100644 --- a/src/mitol/posthog/apps.py +++ b/src/mitol/posthog/apps.py @@ -1,13 +1,12 @@ import os from mitol.common.apps import BaseApp -from mitol.posthog.features import configure + class Posthog(BaseApp): default_auto_field = "django.db.models.BigAutoField" name = "mitol.posthog" label = "posthog" verbose_name = "PostHog" - configure() # necessary because this is a namespaced app path = os.path.dirname(os.path.abspath(__file__)) diff --git a/src/mitol/posthog/features.py b/src/mitol/posthog/features.py index 9ef2cee8..104dd713 100644 --- a/src/mitol/posthog/features.py +++ b/src/mitol/posthog/features.py @@ -16,7 +16,7 @@ durable_cache = caches["durable"] -class Features(): +class Features: """Enum for feature flags""" @@ -36,7 +36,9 @@ def configure(): sync_mode=False, poll_interval=30, disable_geoip=True, - feature_flags_request_timeout_seconds=getattr(settings, "POSTHOG_FEATURE_FLAG_REQUEST_TIMEOUT_MS", None) + feature_flags_request_timeout_seconds=getattr( + settings, "POSTHOG_FEATURE_FLAG_REQUEST_TIMEOUT_MS", None + ) / 1000, max_retries=getattr(settings, "POSTHOG_MAX_RETRIES", None), ) @@ -142,8 +144,4 @@ def is_enabled( durable_cache.set(cache_key, value) if value is not None else None - return ( - value - if value is not None - else settings.FEATURES.get(name, default or False) - ) + return value if value is not None else settings.FEATURES.get(name, default or False) diff --git a/src/mitol/posthog/settings/posthog.py b/src/mitol/posthog/settings/posthog.py index 11180442..8e68fcc9 100644 --- a/src/mitol/posthog/settings/posthog.py +++ b/src/mitol/posthog/settings/posthog.py @@ -1,4 +1,5 @@ from mitol.common.envs import get_string, get_bool, get_int + POSTHOG_ENABLED = get_bool( name="POSTHOG_ENABLED", default=False, diff --git a/tests/mitol/posthog/__init__.py b/tests/mitol/posthog/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/mitol/posthog/test_features.py b/tests/mitol/posthog/test_features.py new file mode 100644 index 00000000..39c68cef --- /dev/null +++ b/tests/mitol/posthog/test_features.py @@ -0,0 +1,121 @@ +"""Tests for feature flags""" + +import logging +from datetime import timedelta + +import pytest +from django.core.cache import caches +from freezegun import freeze_time + +import features +from mitol.common.utils.datetime import now_in_utc + +pytestmark = [pytest.mark.django_db] + + +""" +Tests for Posthog and caching functionality + +- Test grabbing flags from Posthog with a cleared cache; they should hit + Posthog and then the flag should be cached +- Test population of the cache with calls to get_all +- Test flag grabbing after timeout +""" + + +def test_flags_from_cache(mocker, caplog, settings): + """Test that flags are pulled from cache successfully.""" + get_feature_flag_mock = mocker.patch( + "posthog.get_feature_flag", autospec=True, return_value=True + ) + durable_cache = caches["durable"] + settings.FEATURES["testing_function"] = True + settings.POSTHOG_ENABLED = True + cache_key = features.generate_cache_key( + "testing_function", + features.default_unique_id(), + features._get_person_properties(features.default_unique_id()), # noqa: SLF001 + ) + durable_cache.clear() + + # Cache cleared, so we should hit Posthog. + + with caplog.at_level(logging.DEBUG): + was_enabled = features.is_enabled("testing_function") + + assert was_enabled + assert durable_cache.get(cache_key, None) is not None + get_feature_flag_mock.assert_called() + + assert "from Posthog" in caplog.text + + # Cache has stuff, so we should get it from that now. + + get_feature_flag_mock.reset_mock() + + with caplog.at_level(logging.DEBUG): + was_enabled = features.is_enabled("testing_function") + + assert was_enabled + assert durable_cache.get(cache_key, None) is not None + get_feature_flag_mock.assert_not_called() + + assert "from the cache" in caplog.text + + +def test_cache_population(mocker, settings): + """Test that the cache is populated correctly when get_all_feature_flags is called.""" + + get_feature_flag_mock = mocker.patch( + "posthog.get_feature_flag", autospec=True, return_value=True + ) + get_all_flags_mock = mocker.patch( + "posthog.get_all_flags", + autospec=True, + return_value={ + "testing_function_1": True, + "testing_function_2": True, + "testing_function_3": True, + }, + ) + + durable_cache = caches["durable"] + + settings.FEATURES["testing_function_1"] = True + settings.FEATURES["testing_function_2"] = True + settings.FEATURES["testing_function_3"] = True + settings.POSTHOG_ENABLED = True + + durable_cache.clear() + + all_flags = features.get_all_feature_flags() + + get_all_flags_mock.assert_called() + + for k in all_flags: + assert features.is_enabled(k) + get_feature_flag_mock.assert_not_called() + + +def test_posthog_flag_cache_timeout(mocker, settings): + """Test that the cache gets invalidated as we expect""" + + get_feature_flag_mock = mocker.patch( + "posthog.get_feature_flag", autospec=True, return_value=True + ) + durable_cache = caches["durable"] + settings.POSTHOG_ENABLED = True + + durable_cache.clear() + + timeout = settings.CACHES["durable"].get("TIMEOUT", 300) + + time_freezer = freeze_time(now_in_utc() + timedelta(seconds=timeout * 2)) + + assert features.is_enabled("test_function") + get_feature_flag_mock.assert_called() + + time_freezer.start() + assert features.is_enabled("test_function") + get_feature_flag_mock.assert_called() + time_freezer.stop() diff --git a/tests/testapp/settings/shared.py b/tests/testapp/settings/shared.py index c9503f63..8c246515 100644 --- a/tests/testapp/settings/shared.py +++ b/tests/testapp/settings/shared.py @@ -70,7 +70,7 @@ "mitol.openedx.apps.OpenedxApp", "mitol.payment_gateway.apps.PaymentGatewayApp", "mitol.geoip.apps.GeoIPApp", - "mitol.posthog.apps.PostHog", + "mitol.posthog.apps.Posthog", # test app, integrates the reusable apps "testapp", ] From 1e9a4858cdeed73dc1531291a13db8bc817aefb4 Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Tue, 23 Apr 2024 10:12:32 -0400 Subject: [PATCH 04/29] format --- src/mitol/posthog/apps.py | 1 + src/mitol/posthog/settings/posthog.py | 2 +- tests/mitol/posthog/test_features.py | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/mitol/posthog/apps.py b/src/mitol/posthog/apps.py index 5932cdb5..ea80865d 100644 --- a/src/mitol/posthog/apps.py +++ b/src/mitol/posthog/apps.py @@ -1,4 +1,5 @@ import os + from mitol.common.apps import BaseApp diff --git a/src/mitol/posthog/settings/posthog.py b/src/mitol/posthog/settings/posthog.py index 8e68fcc9..c6e2acef 100644 --- a/src/mitol/posthog/settings/posthog.py +++ b/src/mitol/posthog/settings/posthog.py @@ -1,4 +1,4 @@ -from mitol.common.envs import get_string, get_bool, get_int +from mitol.common.envs import get_bool, get_int, get_string POSTHOG_ENABLED = get_bool( name="POSTHOG_ENABLED", diff --git a/tests/mitol/posthog/test_features.py b/tests/mitol/posthog/test_features.py index 39c68cef..9277c714 100644 --- a/tests/mitol/posthog/test_features.py +++ b/tests/mitol/posthog/test_features.py @@ -3,11 +3,11 @@ import logging from datetime import timedelta +import features import pytest from django.core.cache import caches from freezegun import freeze_time -import features from mitol.common.utils.datetime import now_in_utc pytestmark = [pytest.mark.django_db] From 43c804c9a76e80a4dd2024f9f8f625df70f4a686 Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Tue, 23 Apr 2024 11:15:46 -0400 Subject: [PATCH 05/29] More cleanup --- src/mitol/posthog/README.md | 10 ++++++++++ src/mitol/posthog/features.py | 5 ++--- src/mitol/posthog/settings/posthog.py | 16 ++-------------- src/mitol/posthog/tests.py | 3 --- 4 files changed, 14 insertions(+), 20 deletions(-) delete mode 100644 src/mitol/posthog/tests.py diff --git a/src/mitol/posthog/README.md b/src/mitol/posthog/README.md index db54c30e..4537fa2c 100644 --- a/src/mitol/posthog/README.md +++ b/src/mitol/posthog/README.md @@ -33,6 +33,16 @@ All settings for the `mitol-django-posthog` app are prefaced with 'POSTHOG'. - `POSTHOG_MAX_RETRIES` - Numbers of time requests to PostHog should be retried after failing. #### Cache table creation +Add the following cache defintion to your `CACHES` in the settings.py file of your Django application. +``` +CACHES = { + "durable": { + "BACKEND": "django.core.cache.backends.db.DatabaseCache", + "LOCATION": "durable_cache", + }, +} +``` + You must create the cache included in this library. This can be done by running the following command from within the Django application that this library is being added to: `./manage.py createcachetable`. ### Usage diff --git a/src/mitol/posthog/features.py b/src/mitol/posthog/features.py index 104dd713..afb6eccc 100644 --- a/src/mitol/posthog/features.py +++ b/src/mitol/posthog/features.py @@ -3,7 +3,6 @@ import hashlib import json import logging -from functools import wraps from typing import Optional import posthog @@ -37,10 +36,10 @@ def configure(): poll_interval=30, disable_geoip=True, feature_flags_request_timeout_seconds=getattr( - settings, "POSTHOG_FEATURE_FLAG_REQUEST_TIMEOUT_MS", None + settings, "POSTHOG_FEATURE_FLAG_REQUEST_TIMEOUT_MS" ) / 1000, - max_retries=getattr(settings, "POSTHOG_MAX_RETRIES", None), + max_retries=getattr(settings, "POSTHOG_MAX_RETRIES"), ) diff --git a/src/mitol/posthog/settings/posthog.py b/src/mitol/posthog/settings/posthog.py index c6e2acef..1bbf8a2b 100644 --- a/src/mitol/posthog/settings/posthog.py +++ b/src/mitol/posthog/settings/posthog.py @@ -1,4 +1,6 @@ from mitol.common.envs import get_bool, get_int, get_string +import os +import posthog POSTHOG_ENABLED = get_bool( name="POSTHOG_ENABLED", @@ -26,17 +28,3 @@ default=3, description="Numbers of time requests to PostHog should be retried after failing.", ) -# CACHES = { -# # general durable cache (redis should be considered ephemeral) -# "durable": { -# "BACKEND": "django.core.cache.backends.db.DatabaseCache", -# "LOCATION": "durable_cache", -# }, -# } -if os.getenv("POSTHOG_ENABLED", "False").lower() in ("true", "1", "t"): - posthog.api_key = POSTHOG_API_TOKEN - posthog.host = POSTHOG_API_HOST - posthog.feature_flags_request_timeout_seconds = ( - POSTHOG_FEATURE_FLAG_REQUEST_TIMEOUT_MS / 1000 - ) - posthog.max_retries = POSTHOG_MAX_RETRIES diff --git a/src/mitol/posthog/tests.py b/src/mitol/posthog/tests.py deleted file mode 100644 index 7ce503c2..00000000 --- a/src/mitol/posthog/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. From 6280ca002fcb1f9bfe0a1345a0450d6f882cec4a Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Tue, 23 Apr 2024 11:23:39 -0400 Subject: [PATCH 06/29] remove unused imports --- src/mitol/posthog/settings/posthog.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/mitol/posthog/settings/posthog.py b/src/mitol/posthog/settings/posthog.py index 1bbf8a2b..59f04430 100644 --- a/src/mitol/posthog/settings/posthog.py +++ b/src/mitol/posthog/settings/posthog.py @@ -1,6 +1,4 @@ from mitol.common.envs import get_bool, get_int, get_string -import os -import posthog POSTHOG_ENABLED = get_bool( name="POSTHOG_ENABLED", From 5bfa18aa90112fb9d1ec00921c72174311f6bf96 Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Tue, 23 Apr 2024 11:25:55 -0400 Subject: [PATCH 07/29] Update lock file --- .../lockfiles/python-default.lockfile | 1983 ++++++++++------- 1 file changed, 1163 insertions(+), 820 deletions(-) diff --git a/build-support/lockfiles/python-default.lockfile b/build-support/lockfiles/python-default.lockfile index e25cd52f..674ecbd7 100644 --- a/build-support/lockfiles/python-default.lockfile +++ b/build-support/lockfiles/python-default.lockfile @@ -1,6 +1,6 @@ // This lockfile was autogenerated by Pants. To regenerate, run: // -// bin/pants generate-lockfiles --resolve=python-default +// pants generate-lockfiles --resolve=python-default // // --- BEGIN PANTS LOCKFILE METADATA: DO NOT EDIT OR REMOVE --- // { @@ -39,6 +39,7 @@ // "mypy-extensions==0.4.3", // "mypy==0.782", // "pluggy==0.13.1", +// "posthog>=3.5.0", // "premailer>=3.7.0", // "psycopg2-binary>=2.8.3", // "pygsheets==2.0.2", @@ -85,31 +86,31 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e", - "url": "https://files.pythonhosted.org/packages/41/4a/381783f26df413dde4c70c734163d88ca0550a1361cb74a1c68f47550619/appnope-0.1.3-py2.py3-none-any.whl" + "hash": "502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", + "url": "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24", - "url": "https://files.pythonhosted.org/packages/6a/cd/355842c0db33192ac0fc822e2dcae835669ef317fe56c795fb55fcddb26f/appnope-0.1.3.tar.gz" + "hash": "1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", + "url": "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz" } ], "project_name": "appnope", "requires_dists": [], - "requires_python": null, - "version": "0.1.3" + "requires_python": ">=3.6", + "version": "0.1.4" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "89b2ef2247e3b562a16eef663bc0e2e703ec6468e2fa8a5cd61cd449786d4f6e", - "url": "https://files.pythonhosted.org/packages/9b/80/b9051a4a07ad231558fcd8ffc89232711b4e618c15cb7a392a17384bbeef/asgiref-3.7.2-py3-none-any.whl" + "hash": "3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47", + "url": "https://files.pythonhosted.org/packages/39/e3/893e8757be2612e6c266d9bb58ad2e3651524b5b40cf56761e985a28b13e/asgiref-3.8.1-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "9e0ce3aa93a819ba5b45120216b23878cf6e8525eb3848653452b4192b92afed", - "url": "https://files.pythonhosted.org/packages/12/19/64e38c1c2cbf0da9635b7082bbdf0e89052e93329279f59759c24a10cc96/asgiref-3.7.2.tar.gz" + "hash": "c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590", + "url": "https://files.pythonhosted.org/packages/29/38/b3395cc9ad1b56d2ddac9970bc8f4141312dbaec28bc7c218b0dfafd0f42/asgiref-3.8.1.tar.gz" } ], "project_name": "asgiref", @@ -119,20 +120,20 @@ "pytest; extra == \"tests\"", "typing-extensions>=4; python_version < \"3.11\"" ], - "requires_python": ">=3.7", - "version": "3.7.2" + "requires_python": ">=3.8", + "version": "3.8.1" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "7d5895c9825e18079c5aeac0572bc2e4c83205c95d416e0b4fee8bc361d2d9ca", - "url": "https://files.pythonhosted.org/packages/59/36/04dd43796ff6eebc263db9521fad836e2d792b6df9bed6fccb3e43c03cf7/astroid-3.0.1-py3-none-any.whl" + "hash": "951798f922990137ac090c53af473db7ab4e70c770e6d7fae0cec59f74411819", + "url": "https://files.pythonhosted.org/packages/ed/1c/ee18acf9070f77253954b7d71b4c0cf8f5969fb23067d8f1a8793573ba00/astroid-3.1.0-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "86b0bb7d7da0be1a7c4aedb7974e391b32d4ed89e33de6ed6902b4b15c97577e", - "url": "https://files.pythonhosted.org/packages/69/53/07229db171855e410bf40a996f1d49cc35222e18a1c95cd566e69bb9e0e5/astroid-3.0.1.tar.gz" + "hash": "ac248253bfa4bd924a0de213707e7ebeeb3138abeb48d798784ead1e56d419d4", + "url": "https://files.pythonhosted.org/packages/a9/b9/f11533eed9b65606fb02f1b0994d8ed0903358bc55a6b9759e42f1134725/astroid-3.1.0.tar.gz" } ], "project_name": "astroid", @@ -140,7 +141,7 @@ "typing-extensions>=4.0.0; python_version < \"3.11\"" ], "requires_python": ">=3.8.0", - "version": "3.0.1" + "version": "3.1.0" }, { "artifacts": [ @@ -192,30 +193,31 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04", - "url": "https://files.pythonhosted.org/packages/f0/eb/fcb708c7bf5056045e9e98f62b93bd7467eb718b0202e7698eb11d66416c/attrs-23.1.0-py3-none-any.whl" + "hash": "99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1", + "url": "https://files.pythonhosted.org/packages/e0/44/827b2a91a5816512fcaf3cc4ebc465ccd5d598c45cefa6703fcf4a79018f/attrs-23.2.0-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015", - "url": "https://files.pythonhosted.org/packages/97/90/81f95d5f705be17872843536b1868f351805acf6971251ff07c1b8334dbb/attrs-23.1.0.tar.gz" + "hash": "935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", + "url": "https://files.pythonhosted.org/packages/e3/fc/f800d51204003fa8ae392c4e8278f256206e7a919b708eef054f5f4b650d/attrs-23.2.0.tar.gz" } ], "project_name": "attrs", "requires_dists": [ - "attrs[docs,tests]; extra == \"dev\"", + "attrs[tests-mypy]; extra == \"tests-no-zope\"", "attrs[tests-no-zope]; extra == \"tests\"", "attrs[tests]; extra == \"cov\"", + "attrs[tests]; extra == \"dev\"", "cloudpickle; platform_python_implementation == \"CPython\" and extra == \"tests-no-zope\"", "coverage[toml]>=5.3; extra == \"cov\"", "furo; extra == \"docs\"", "hypothesis; extra == \"tests-no-zope\"", "importlib-metadata; python_version < \"3.8\"", - "mypy>=1.1.1; platform_python_implementation == \"CPython\" and extra == \"tests-no-zope\"", + "mypy>=1.6; (platform_python_implementation == \"CPython\" and python_version >= \"3.8\") and extra == \"tests-mypy\"", "myst-parser; extra == \"docs\"", "pre-commit; extra == \"dev\"", "pympler; extra == \"tests-no-zope\"", - "pytest-mypy-plugins; platform_python_implementation == \"CPython\" and python_version < \"3.11\" and extra == \"tests-no-zope\"", + "pytest-mypy-plugins; (platform_python_implementation == \"CPython\" and python_version >= \"3.8\") and extra == \"tests-mypy\"", "pytest-xdist[psutil]; extra == \"tests-no-zope\"", "pytest>=4.3.0; extra == \"tests-no-zope\"", "sphinx-notfound-page; extra == \"docs\"", @@ -226,7 +228,7 @@ "zope-interface; extra == \"tests\"" ], "requires_python": ">=3.7", - "version": "23.1.0" + "version": "23.2.0" }, { "artifacts": [ @@ -246,6 +248,24 @@ "requires_python": null, "version": "0.2.0" }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8", + "url": "https://files.pythonhosted.org/packages/df/73/b6e24bd22e6720ca8ee9a85a0c4a2971af8497d8f3193fa05390cbd46e09/backoff-2.2.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba", + "url": "https://files.pythonhosted.org/packages/47/d7/5bbeb12c44d7c4f2fb5b56abce497eb5ed9f34d85701de869acedd602619/backoff-2.2.1.tar.gz" + } + ], + "project_name": "backoff", + "requires_dists": [], + "requires_python": "<4.0,>=3.7", + "version": "2.2.1" + }, { "artifacts": [ { @@ -281,23 +301,26 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a", - "url": "https://files.pythonhosted.org/packages/57/f4/a69c20ee4f660081a7dedb1ac57f29be9378e04edfcb90c526b923d4bebc/beautifulsoup4-4.12.2-py3-none-any.whl" + "hash": "b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed", + "url": "https://files.pythonhosted.org/packages/b1/fe/e8c672695b37eecc5cbf43e1d0638d88d66ba3a44c4d321c796f4e59167f/beautifulsoup4-4.12.3-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da", - "url": "https://files.pythonhosted.org/packages/af/0b/44c39cf3b18a9280950ad63a579ce395dda4c32193ee9da7ff0aed547094/beautifulsoup4-4.12.2.tar.gz" + "hash": "74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051", + "url": "https://files.pythonhosted.org/packages/b3/ca/824b1195773ce6166d388573fc106ce56d4a805bd7427b624e063596ec58/beautifulsoup4-4.12.3.tar.gz" } ], "project_name": "beautifulsoup4", "requires_dists": [ + "cchardet; extra == \"cchardet\"", + "chardet; extra == \"chardet\"", + "charset-normalizer; extra == \"charset-normalizer\"", "html5lib; extra == \"html5lib\"", "lxml; extra == \"lxml\"", "soupsieve>1.2" ], "requires_python": ">=3.6.0", - "version": "4.12.2" + "version": "4.12.3" }, { "artifacts": [ @@ -332,37 +355,37 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1", - "url": "https://files.pythonhosted.org/packages/a2/91/2d843adb9fbd911e0da45fbf6f18ca89d07a087c3daa23e955584f90ebf4/cachetools-5.3.2-py3-none-any.whl" + "hash": "0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945", + "url": "https://files.pythonhosted.org/packages/fb/2b/a64c2d25a37aeb921fddb929111413049fc5f8b9a4c1aefaffaafe768d54/cachetools-5.3.3-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "086ee420196f7b2ab9ca2db2520aca326318b68fe5ba8bc4d49cca91add450f2", - "url": "https://files.pythonhosted.org/packages/10/21/1b6880557742c49d5b0c4dcf0cf544b441509246cdd71182e0847ac859d5/cachetools-5.3.2.tar.gz" + "hash": "ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105", + "url": "https://files.pythonhosted.org/packages/b3/4d/27a3e6dd09011649ad5210bdf963765bc8fa81a0827a4fc01bafd2705c5b/cachetools-5.3.3.tar.gz" } ], "project_name": "cachetools", "requires_dists": [], "requires_python": ">=3.7", - "version": "5.3.2" + "version": "5.3.3" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474", - "url": "https://files.pythonhosted.org/packages/64/62/428ef076be88fa93716b576e4a01f919d25968913e817077a386fcbe4f42/certifi-2023.11.17-py3-none-any.whl" + "hash": "dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1", + "url": "https://files.pythonhosted.org/packages/ba/06/a07f096c664aeb9f01624f858c3add0a4e913d6c96257acb4fce61e7de14/certifi-2024.2.2-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1", - "url": "https://files.pythonhosted.org/packages/d4/91/c89518dd4fe1f3a4e3f6ab7ff23cb00ef2e8c9adf99dacc618ad5e068e28/certifi-2023.11.17.tar.gz" + "hash": "0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f", + "url": "https://files.pythonhosted.org/packages/71/da/e94e26401b62acd6d91df2b52954aceb7f561743aa5ccc32152886c76c96/certifi-2024.2.2.tar.gz" } ], "project_name": "certifi", "requires_dists": [], "requires_python": ">=3.6", - "version": "2023.11.17" + "version": "2024.2.2" }, { "artifacts": [ @@ -972,13 +995,13 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "4076e2d1b4e6e54e8e0b990b79aacca3d672910b9c8b409fbd553e238b489455", - "url": "https://files.pythonhosted.org/packages/32/de/30ee61834a82004f579b107a37e64824a882683366bef5794b2a985f917f/cloup-3.0.3-py2.py3-none-any.whl" + "hash": "bf122036066584eb0db113561167c29969cc015972b7b7ee03158d9bc7de87f8", + "url": "https://files.pythonhosted.org/packages/96/1a/5a2a4fbf6c95f11b079f02d7b191377ea4509f5e442887e4c7c026bc56d3/cloup-3.0.5-py2.py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "e5bd7789d17c0de97139ac5eb8af8c2f8d96a2d8363e8411224df625a6858d21", - "url": "https://files.pythonhosted.org/packages/44/3f/550e804cc097ae2d4c772455ef04f835140df8c5fa13882aeca8304c7be3/cloup-3.0.3.tar.gz" + "hash": "c92b261c7bb7e13004930f3fb4b3edad8de2d1f12994dcddbe05bc21990443c5", + "url": "https://files.pythonhosted.org/packages/cf/71/608e4546208e5a421ef00b484f582e58ce0f17da05459b915c8ba22dfb78/cloup-3.0.5.tar.gz" } ], "project_name": "cloup", @@ -987,7 +1010,7 @@ "typing-extensions; python_version <= \"3.8\"" ], "requires_python": ">=3.7", - "version": "3.0.3" + "version": "3.0.5" }, { "artifacts": [ @@ -1192,46 +1215,43 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "f8b013169e281c0c6083207366c5005f5dd4549055f7aba840384fb06a78745c", - "url": "https://files.pythonhosted.org/packages/c6/6e/a8ba19fe8e7a7dfaadd4597bf47f3d75a9239dd0d85870e07edeb5e803bf/cssutils-2.9.0-py3-none-any.whl" + "hash": "4ad7d2f29270b22cf199f65a6b5e795f2c3130f3b9fb50c3d45e5054ef86e41a", + "url": "https://files.pythonhosted.org/packages/97/08/70f6d03c4e14a85e1efd425689971826b4024c0547b0c063168920e49a37/cssutils-2.10.2-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "89477b3d17d790e97b9fb4def708767061055795aae6f7c82ae32e967c9be4cd", - "url": "https://files.pythonhosted.org/packages/b4/65/a054545c81eb87af898d664043578b8444ea3ded656db3da8f9d9fa21334/cssutils-2.9.0.tar.gz" + "hash": "93cf92a350b1c123b17feff042e212f94d960975a3ed145743d84ebe8ccec7ab", + "url": "https://files.pythonhosted.org/packages/d1/25/91223a246181204edddbae96c0ab661d7ca6dc1e7805c8ac5302a5e16d81/cssutils-2.10.2.tar.gz" } ], "project_name": "cssutils", "requires_dists": [ "cssselect; extra == \"testing\"", "furo; extra == \"docs\"", - "importlib-metadata; python_version < \"3.8\"", "importlib-resources; python_version < \"3.9\" and extra == \"testing\"", "jaraco.packaging>=9.3; extra == \"docs\"", "jaraco.test>=5.1; extra == \"testing\"", "jaraco.tidelift>=1.4; extra == \"docs\"", "lxml; python_version < \"3.11\" and extra == \"testing\"", - "pytest-black>=0.3.7; platform_python_implementation != \"PyPy\" and extra == \"testing\"", "pytest-checkdocs>=2.4; extra == \"testing\"", "pytest-cov; extra == \"testing\"", "pytest-enabler>=2.2; extra == \"testing\"", - "pytest-mypy>=0.9.1; platform_python_implementation != \"PyPy\" and extra == \"testing\"", - "pytest-ruff; extra == \"testing\"", + "pytest-mypy; extra == \"testing\"", + "pytest-ruff>=0.2.1; extra == \"testing\"", "pytest>=6; extra == \"testing\"", "rst.linker>=1.9; extra == \"docs\"", "sphinx-lint; extra == \"docs\"", - "sphinx<7.2.5; extra == \"docs\"", "sphinx>=3.5; extra == \"docs\"" ], "requires_python": ">=3.8", - "version": "2.9.0" + "version": "2.10.2" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "2f1e3769fd6ba00d5229df0d115cc8150d14502ca1c26b28f3ebbbb091079060", - "url": "https://files.pythonhosted.org/packages/17/25/a6f498349667385feade409c3dac8bc155e12d789b899faaf8a9824c57b2/cybersource-rest-client-python-0.0.49.tar.gz" + "hash": "f1843572ddf5da67a0b70a29f0b6bc936e6bcdb8f1939912f0ea3b98b82d74f1", + "url": "https://files.pythonhosted.org/packages/4f/8d/151536e9443f555a7a6a4a79846bf399a86d25ffd1f28373665847c89ede/cybersource-rest-client-python-0.0.53.tar.gz" } ], "project_name": "cybersource-rest-client-python", @@ -1248,19 +1268,19 @@ "urllib3" ], "requires_python": null, - "version": "0.0.49" + "version": "0.0.53" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "05669f035ec7ccb24443bda8572078c381edf79c813186f627e9e8e5c6e8e6e6", - "url": "https://files.pythonhosted.org/packages/d3/63/dced85cf2970b5d363e501a10aa051e71caea3ad10a60b7a57794f43a4b8/DateTime-5.3-py3-none-any.whl" + "hash": "0abf6c51cb4ba7cee775ca46ccc727f3afdde463be28dbbe8803631fefd4a120", + "url": "https://files.pythonhosted.org/packages/f3/78/8e382b8cb4346119e2e04270b6eb4a01c5ee70b47a8a0244ecdb157204f7/DateTime-5.5-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "4762a9b371ce696b7ffb82b869d2906fad94fdecdb1685bfbec1e2d8f37e5a98", - "url": "https://files.pythonhosted.org/packages/be/ec/802a22e6aeace2d3b4ee254c2b9613ed20b3ec4e9827915e87b21dbd0c33/DateTime-5.3.tar.gz" + "hash": "21ec6331f87a7fcb57bd7c59e8a68bfffe6fcbf5acdbbc7b356d6a9a020191d3", + "url": "https://files.pythonhosted.org/packages/2f/66/e284b9978fede35185e5d18fb3ae855b8f573d8c90a56de5f6d03e8ef99e/DateTime-5.5.tar.gz" } ], "project_name": "datetime", @@ -1269,7 +1289,7 @@ "zope.interface" ], "requires_python": ">=3.7", - "version": "5.3" + "version": "5.5" }, { "artifacts": [ @@ -1311,46 +1331,22 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c", - "url": "https://files.pythonhosted.org/packages/20/8d/778b7d51b981a96554f29136cd59ca7880bf58094338085bcf2a979a0e6a/Deprecated-1.2.14-py2.py3-none-any.whl" + "hash": "c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7", + "url": "https://files.pythonhosted.org/packages/c9/7a/cef76fd8438a42f96db64ddaa85280485a9c395e7df3db8158cfec1eee34/dill-0.3.8-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3", - "url": "https://files.pythonhosted.org/packages/92/14/1e41f504a246fc224d2ac264c227975427a85caf37c3979979edb9b1b232/Deprecated-1.2.14.tar.gz" - } - ], - "project_name": "deprecated", - "requires_dists": [ - "PyTest-Cov; extra == \"dev\"", - "PyTest; extra == \"dev\"", - "bump2version<1; extra == \"dev\"", - "sphinx<2; extra == \"dev\"", - "tox; extra == \"dev\"", - "wrapt<2,>=1.10" - ], - "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7", - "version": "1.2.14" - }, - { - "artifacts": [ - { - "algorithm": "sha256", - "hash": "76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e", - "url": "https://files.pythonhosted.org/packages/f5/3a/74a29b11cf2cdfcd6ba89c0cecd70b37cd1ba7b77978ce611eb7a146a832/dill-0.3.7-py3-none-any.whl" - }, - { - "algorithm": "sha256", - "hash": "cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03", - "url": "https://files.pythonhosted.org/packages/c4/31/54dd222e02311c2dbc9e680d37cbd50f4494ce1ee9b04c69980e4ec26f38/dill-0.3.7.tar.gz" + "hash": "3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca", + "url": "https://files.pythonhosted.org/packages/17/4d/ac7ffa80c69ea1df30a8aa11b3578692a5118e7cd1aa157e3ef73b092d15/dill-0.3.8.tar.gz" } ], "project_name": "dill", "requires_dists": [ + "gprof2dot>=2022.7.29; extra == \"profile\"", "objgraph>=1.7.2; extra == \"graph\"" ], - "requires_python": ">=3.7", - "version": "0.3.7" + "requires_python": ">=3.8", + "version": "0.3.8" }, { "artifacts": [ @@ -1377,13 +1373,13 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "6cb5dcea9e3d12c47834d32156b8841f533a4493c688e2718cafd51aa430ba6d", - "url": "https://files.pythonhosted.org/packages/8a/79/7f45e9c129c3cd8e4d54806649efeb1db9c223c54a1c54b30511d246bc60/Django-4.2.8-py3-none-any.whl" + "hash": "ddc24a0a8280a0430baa37aff11f28574720af05888c62b7cfe71d219f4599d3", + "url": "https://files.pythonhosted.org/packages/a1/b9/5adf3f78e4c7b762eb6f1140057bd128c978c3f85c08e412f951aef65f9e/Django-4.2.11-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "d69d5e36cc5d9f4eb4872be36c622878afcdce94062716cf3e25bcedcb168b62", - "url": "https://files.pythonhosted.org/packages/a0/bf/ff46fc1bd0f7d86390134e3869dd093be1d2bbaa9dafcb5389e87ef5bcb5/Django-4.2.8.tar.gz" + "hash": "6e6ff3db2d8dd0c986b4eec8554c8e4f919b5c1ff62a5b4390c17aff2ed6e5c4", + "url": "https://files.pythonhosted.org/packages/d2/e2/c0e7586dd4db1140be179b1386346d1b2e2570dfc7c0d1c0343bdf0d43b0/Django-4.2.11.tar.gz" } ], "project_name": "django", @@ -1396,32 +1392,32 @@ "tzdata; sys_platform == \"win32\"" ], "requires_python": ">=3.8", - "version": "4.2.8" + "version": "4.2.11" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "ca273abbc04b5ce06d1f3b3e5f28e2d79331519198fa6d6b5ba1b5aa5eea02f7", - "url": "https://files.pythonhosted.org/packages/b6/3b/0eb71a18501a7e846d3d3bc0b368634ce07d228ff7f5d0ecff598efa2b2e/django_anymail-10.2-py3-none-any.whl" + "hash": "1e72f059e96930d3675d35fe4c61f82b138ae4a7fcb0337be39dcb4823f94a4f", + "url": "https://files.pythonhosted.org/packages/99/c4/f7c1a76fac497459b8b323d5545a1838f38ee3ff37b3344dea244071d1d5/django_anymail-10.3-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "1f3006d3b16874aaa32976078da6cdc9baa7f5274cf80e3fc51a288887617aaf", - "url": "https://files.pythonhosted.org/packages/49/fc/bf7c44a93c7ad730a0c29af6b3a734acb1daf765a174d12b4c51c05f1487/django_anymail-10.2.tar.gz" + "hash": "35d8ec20b06000af3c1638492e32f416fd1a584f0a572cded03f1bc570169ed0", + "url": "https://files.pythonhosted.org/packages/65/c2/245b8cc872effc9871453ab0d0bd494213b0c85a1cc37606c578dc8fca6f/django_anymail-10.3.tar.gz" } ], "project_name": "django-anymail", "requires_dists": [ "boto3; extra == \"amazon-ses\"", - "cryptography; sys_platform != \"darwin\" or platform_machine != \"arm64\" or python_version >= \"3.9\" and extra == \"postal\"", + "cryptography; (sys_platform != \"darwin\" or platform_machine != \"arm64\" or python_version >= \"3.9\") and extra == \"postal\"", "django>=2.0", "requests>=2.4.3", "svix; extra == \"resend\"", "urllib3>=1.25.0" ], "requires_python": ">=3.7", - "version": "10.2" + "version": "10.3" }, { "artifacts": [ @@ -1489,40 +1485,40 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "2704c5b0e699a9a3a70aa21b75825d8637cd0df8134c3308b5c2976ecc20b5f7", - "url": "https://files.pythonhosted.org/packages/fd/71/c0c5f1f40aa0f613262532eb81929fd44e69fe2996559d66e3daad221a7b/django_webpack_loader-2.0.1-py2.py3-none-any.whl" + "hash": "5c35f8ad9ce0d0360b120abd9a6da6f043a6ff97a4ae7d0fa246d64af012983f", + "url": "https://files.pythonhosted.org/packages/29/2f/42c986a48ba31c123f5f456edb2aebe31cef468e220e86fdfe92d9880d03/django_webpack_loader-3.1.0-py2.py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "0e8dfb2fcdb39dbfd01be7603c060132a4664f483811ce3c75f2d3c0d39ab762", - "url": "https://files.pythonhosted.org/packages/45/1e/e4b753ab33075edd765aaf0c4fa2cd6fa527b17b15613964dd9b77d58353/django-webpack-loader-2.0.1.tar.gz" + "hash": "b06b83ca819ed4bbb858ab57b8d8cb67a25c4a57ed822dedd4e9fee4c097afd5", + "url": "https://files.pythonhosted.org/packages/bd/1e/af06b611841d3a3b850eb8cef62471905d1f1a541f10a19660e901434065/django-webpack-loader-3.1.0.tar.gz" } ], "project_name": "django-webpack-loader", "requires_dists": [], "requires_python": null, - "version": "2.0.1" + "version": "3.1.0" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "eb63f58c9f218e1a7d064d17a70751f528ed4e1d35547fdade9aaf4cd103fd08", - "url": "https://files.pythonhosted.org/packages/ff/4b/3b46c0914ba4b7546a758c35fdfa8e7f017fcbe7f23c878239e93623337a/djangorestframework-3.14.0-py3-none-any.whl" + "hash": "3ccc0475bce968608cf30d07fb17d8e52d1d7fc8bfe779c905463200750cbca6", + "url": "https://files.pythonhosted.org/packages/c0/7e/8c45ea7f85dd5d52ceddbacc6f56ecaca21ecbfc0e8c34c95618a14d5082/djangorestframework-3.15.1-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "579a333e6256b09489cbe0a067e66abe55c6595d8926be6b99423786334350c8", - "url": "https://files.pythonhosted.org/packages/8e/53/5b2a002c5ebafd60dff1e1945a7d63dee40155830997439a9ba324f0fd50/djangorestframework-3.14.0.tar.gz" + "hash": "f88fad74183dfc7144b2756d0d2ac716ea5b4c7c9840995ac3bfd8ec034333c1", + "url": "https://files.pythonhosted.org/packages/ec/60/cc2dd985400293fe7bf3fa1b9a5d61f5b44200c33f7d31952f2c9fd79e8a/djangorestframework-3.15.1.tar.gz" } ], "project_name": "djangorestframework", "requires_dists": [ - "django>=3.0", - "pytz" + "backports.zoneinfo; python_version < \"3.9\"", + "django>=3.0" ], "requires_python": ">=3.6", - "version": "3.14.0" + "version": "3.15.1" }, { "artifacts": [ @@ -1606,28 +1602,38 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "57c6fbaaeaaf39c891292012060beb141791735dbb4004798328fc2c467402d8", - "url": "https://files.pythonhosted.org/packages/f6/b4/0a9bee52c50f226a3cbfb54263d02bb421c7f2adc136520729c2c689c1e5/dnspython-2.4.2-py3-none-any.whl" + "hash": "5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50", + "url": "https://files.pythonhosted.org/packages/87/a1/8c5287991ddb8d3e4662f71356d9656d91ab3a36618c3dd11b280df0d255/dnspython-2.6.1-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "8dcfae8c7460a2f84b4072e26f1c9f4101ca20c071649cb7c34e8b6a93d58984", - "url": "https://files.pythonhosted.org/packages/65/2d/372a20e52a87b2ba0160997575809806111a72e18aa92738daccceb8d2b9/dnspython-2.4.2.tar.gz" + "hash": "e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc", + "url": "https://files.pythonhosted.org/packages/37/7d/c871f55054e403fdfd6b8f65fd6d1c4e147ed100d3e9f9ba1fe695403939/dnspython-2.6.1.tar.gz" } ], "project_name": "dnspython", "requires_dists": [ - "aioquic>=0.9.20; extra == \"doq\"", - "cryptography<42.0,>=2.6; extra == \"dnssec\"", + "aioquic>=0.9.25; extra == \"doq\"", + "black>=23.1.0; extra == \"dev\"", + "coverage>=7.0; extra == \"dev\"", + "cryptography>=41; extra == \"dnssec\"", + "flake8>=7; extra == \"dev\"", "h2>=4.1.0; extra == \"doh\"", - "httpcore>=0.17.3; extra == \"doh\"", - "httpx>=0.24.1; extra == \"doh\"", - "idna<4.0,>=2.1; extra == \"idna\"", - "trio<0.23,>=0.14; extra == \"trio\"", - "wmi<2.0.0,>=1.5.1; extra == \"wmi\"" + "httpcore>=1.0.0; extra == \"doh\"", + "httpx>=0.26.0; extra == \"doh\"", + "idna>=3.6; extra == \"idna\"", + "mypy>=1.8; extra == \"dev\"", + "pylint>=3; extra == \"dev\"", + "pytest-cov>=4.1.0; extra == \"dev\"", + "pytest>=7.4; extra == \"dev\"", + "sphinx>=7.2.0; extra == \"dev\"", + "trio>=0.23; extra == \"trio\"", + "twine>=4.0.0; extra == \"dev\"", + "wheel>=0.42.0; extra == \"dev\"", + "wmi>=1.5.1; extra == \"wmi\"" ], - "requires_python": "<4.0,>=3.8", - "version": "2.4.2" + "requires_python": ">=3.8", + "version": "2.6.1" }, { "artifacts": [ @@ -1649,13 +1655,13 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14", - "url": "https://files.pythonhosted.org/packages/b8/9a/5028fd52db10e600f1c4674441b968cf2ea4959085bfb5b99fb1250e5f68/exceptiongroup-1.2.0-py3-none-any.whl" + "hash": "5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad", + "url": "https://files.pythonhosted.org/packages/01/90/79fe92dd413a9cab314ef5c591b5aa9b9ba787ae4cadab75055b0ae00b33/exceptiongroup-1.2.1-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68", - "url": "https://files.pythonhosted.org/packages/8e/1c/beef724eaf5b01bb44b6338c8c3494eff7cab376fab4904cfbbc3585dc79/exceptiongroup-1.2.0.tar.gz" + "hash": "a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16", + "url": "https://files.pythonhosted.org/packages/a0/65/d66b7fbaef021b3c954b3bbb196d21d8a4b97918ea524f82cfae474215af/exceptiongroup-1.2.1.tar.gz" } ], "project_name": "exceptiongroup", @@ -1663,7 +1669,7 @@ "pytest>=6; extra == \"test\"" ], "requires_python": ">=3.7", - "version": "1.2.0" + "version": "1.2.1" }, { "artifacts": [ @@ -1791,18 +1797,17 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "cf14627d5a8049ffbf49915732e5eddbe8134c3bdb9d476e6182b676fc573f8a", - "url": "https://files.pythonhosted.org/packages/8d/c4/82b858fb6483dfb5e338123c154d19c043305b01726a67d89532b8f8f01b/GitPython-3.1.40-py3-none-any.whl" + "hash": "eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff", + "url": "https://files.pythonhosted.org/packages/e9/bd/cc3a402a6439c15c3d4294333e13042b915bbeab54edc457c723931fed3f/GitPython-3.1.43-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "22b126e9ffb671fdd0c129796343a02bf67bf2994b35449ffc9321aa755e18a4", - "url": "https://files.pythonhosted.org/packages/0d/b2/37265877ae607a2cbf9a471f4581dbf5ed13a501b90cb4c773f9ccfff3ea/GitPython-3.1.40.tar.gz" + "hash": "35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c", + "url": "https://files.pythonhosted.org/packages/b6/a1/106fd9fa2dd989b6fb36e5893961f82992cf676381707253e0bf93eb1662/GitPython-3.1.43.tar.gz" } ], "project_name": "gitpython", "requires_dists": [ - "black; extra == \"test\"", "coverage[toml]; extra == \"test\"", "ddt!=1.4.3,>=1.1.1; extra == \"test\"", "gitdb<5,>=4.0.1", @@ -1811,13 +1816,22 @@ "pre-commit; extra == \"test\"", "pytest-cov; extra == \"test\"", "pytest-instafail; extra == \"test\"", - "pytest-subtests; extra == \"test\"", + "pytest-mock; extra == \"test\"", "pytest-sugar; extra == \"test\"", - "pytest; extra == \"test\"", + "pytest>=7.3.1; extra == \"test\"", + "sphinx-autodoc-typehints; extra == \"doc\"", + "sphinx-rtd-theme; extra == \"doc\"", + "sphinx==4.3.2; extra == \"doc\"", + "sphinxcontrib-applehelp<=1.0.4,>=1.0.2; extra == \"doc\"", + "sphinxcontrib-devhelp==1.0.2; extra == \"doc\"", + "sphinxcontrib-htmlhelp<=2.0.1,>=2.0.0; extra == \"doc\"", + "sphinxcontrib-qthelp==1.0.3; extra == \"doc\"", + "sphinxcontrib-serializinghtml==1.1.5; extra == \"doc\"", + "typing-extensions; python_version < \"3.11\" and extra == \"test\"", "typing-extensions>=3.7.4.3; python_version < \"3.8\"" ], "requires_python": ">=3.7", - "version": "3.1.40" + "version": "3.1.43" }, { "artifacts": [ @@ -1865,13 +1879,13 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "42c50900b8e4dcdf8222364d1f0efe32b8421fb6ed72f2613f12f75cc933478c", - "url": "https://files.pythonhosted.org/packages/d3/3d/e4991229886c0d522d9552151a43ff7adcc61e026e60ce8bd508387f84cf/google_auth_httplib2-0.1.1-py2.py3-none-any.whl" + "hash": "b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d", + "url": "https://files.pythonhosted.org/packages/be/8a/fe34d2f3f9470a27b01c9e76226965863f153d5fbe276f83608562e49c04/google_auth_httplib2-0.2.0-py2.py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "c64bc555fdc6dd788ea62ecf7bccffcf497bf77244887a3f3d7a5a02f8e3fc29", - "url": "https://files.pythonhosted.org/packages/0f/7a/83c3a1f8419d66f91672ad7f2cea57d044f7f0b3c1740389a468ff3937ed/google-auth-httplib2-0.1.1.tar.gz" + "hash": "38aa7badf48f974f1eb9861794e9c0cb2a0511a4ec0679b1f886d108f5640e05", + "url": "https://files.pythonhosted.org/packages/56/be/217a598a818567b28e859ff087f347475c807a5649296fb5a817c58dacef/google-auth-httplib2-0.2.0.tar.gz" } ], "project_name": "google-auth-httplib2", @@ -1880,7 +1894,7 @@ "httplib2>=0.19.0" ], "requires_python": null, - "version": "0.1.1" + "version": "0.2.0" }, { "artifacts": [ @@ -1981,19 +1995,19 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f", - "url": "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl" + "hash": "82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0", + "url": "https://files.pythonhosted.org/packages/e5/3e/741d8c82801c347547f8a2a06aa57dbb1992be9e948df2ea0eda2c8b79e8/idna-3.7-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", - "url": "https://files.pythonhosted.org/packages/bf/3f/ea4b9117521a1e9c50344b909be7886dd00a519552724809bb1f486986c2/idna-3.6.tar.gz" + "hash": "028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", + "url": "https://files.pythonhosted.org/packages/21/ed/f86a79a07470cb07819390452f178b3bef1d375f2ec021ecfc709fc7cf07/idna-3.7.tar.gz" } ], "project_name": "idna", "requires_dists": [], "requires_python": ">=3.5", - "version": "3.6" + "version": "3.7" }, { "artifacts": [ @@ -2162,19 +2176,21 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "56a51732c25f94ca96f6721be206dd96a95f42950502eb26c1015d333bc6edb7", - "url": "https://files.pythonhosted.org/packages/22/15/3bd09f1fb8bfa9385ecbccbb9aa1c2cce992f4427b1aa852def9e7d81318/isort-5.13.1-py3-none-any.whl" + "hash": "8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6", + "url": "https://files.pythonhosted.org/packages/d1/b3/8def84f539e7d2289a02f0524b944b15d7c75dab7628bedf1c4f0992029c/isort-5.13.2-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "aaed790b463e8703fb1eddb831dfa8e8616bacde2c083bd557ef73c8189b7263", - "url": "https://files.pythonhosted.org/packages/1e/59/98677f9085b607551b009833449c39bfc4ce8172b0d9545eece9b5e2f8e5/isort-5.13.1.tar.gz" + "hash": "48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109", + "url": "https://files.pythonhosted.org/packages/87/f9/c1eb8635a24e87ade2efce21e3ce8cd6b8630bb685ddc9cdaca1349b2eb5/isort-5.13.2.tar.gz" } ], "project_name": "isort", - "requires_dists": [], + "requires_dists": [ + "colorama>=0.4.6; extra == \"colors\"" + ], "requires_python": ">=3.8.0", - "version": "5.13.1" + "version": "5.13.2" }, { "artifacts": [ @@ -2233,13 +2249,13 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61", - "url": "https://files.pythonhosted.org/packages/bc/c3/f068337a370801f372f2f8f6bad74a5c140f6fda3d9de154052708dd3c65/Jinja2-3.1.2-py3-none-any.whl" + "hash": "7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa", + "url": "https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852", - "url": "https://files.pythonhosted.org/packages/7a/ff/75c28576a1d900e87eb6335b063fab47a8ef3c8b4d88524c4bf78f670cce/Jinja2-3.1.2.tar.gz" + "hash": "ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90", + "url": "https://files.pythonhosted.org/packages/b2/5e/3a21abf3cd467d7876045335e681d276ac32492febe6d98ad89562d1a7e1/Jinja2-3.1.3.tar.gz" } ], "project_name": "jinja2", @@ -2248,23 +2264,28 @@ "MarkupSafe>=2.0" ], "requires_python": ">=3.7", - "version": "3.1.2" + "version": "3.1.3" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "2c1dc51cf8e38ddf324795dfe9426dee9dd46caf47f535ccbc18781fba810b8d", - "url": "https://files.pythonhosted.org/packages/ed/72/b9289ee27d228fc7cae5c83d1c640de2a7cc0621805aa839ba239d6ef8fc/jwcrypto-1.5.0.tar.gz" + "hash": "150d2b0ebbdb8f40b77f543fb44ffd2baeff48788be71f67f03566692fd55789", + "url": "https://files.pythonhosted.org/packages/cd/58/4a1880ea64032185e9ae9f63940c9327c6952d5584ea544a8f66972f2fda/jwcrypto-1.5.6-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "771a87762a0c081ae6166958a954f80848820b2ab066937dc8b8379d65b1b039", + "url": "https://files.pythonhosted.org/packages/e1/db/870e5d5fb311b0bcf049630b5ba3abca2d339fd5e13ba175b4c13b456d08/jwcrypto-1.5.6.tar.gz" } ], "project_name": "jwcrypto", "requires_dists": [ "cryptography>=3.4", - "deprecated" + "typing-extensions>=4.5.0" ], - "requires_python": ">=3.6", - "version": "1.5.0" + "requires_python": ">=3.8", + "version": "1.5.6" }, { "artifacts": [ @@ -2308,244 +2329,550 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "fe4bda6bd4340caa6e5cf95e73f8fea5c4bfc55763dd42f1b50a94c1b4a2fbd4", - "url": "https://files.pythonhosted.org/packages/1b/ea/50d8357ed72f6c8352fe08657a9b05d672a4ab2470b9447fd73d87f0d47a/lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl" + "hash": "e998e304036198b4f6914e6a1e2b6f925208a20e2042563d9734881150c6c246", + "url": "https://files.pythonhosted.org/packages/e9/07/01eaac54100cd7ccd77f8bd1e1e15b7c1d0351d59f1f4ca716e91230580f/lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "7a7efd5b6d3e30d81ec68ab8a88252d7c7c6f13aaa875009fe3097eb4e30b84c", + "url": "https://files.pythonhosted.org/packages/05/7c/899457a8ec19a6d3d4b0160bba1f3c42a68793a1e72b3649bc0aa9a4837a/lxml-5.2.1-cp39-cp39-musllinux_1_2_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "057cdc6b86ab732cf361f8b4d8af87cf195a1f6dc5b0ff3de2dced242c2015e0", + "url": "https://files.pythonhosted.org/packages/07/99/681ee4f6aa7b79ce9c3401611ca8390596065723b7ba90c7db189959fb5e/lxml-5.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "ff46d772d5f6f73564979cd77a4fffe55c916a05f3cb70e7c9c0590059fb29ef", + "url": "https://files.pythonhosted.org/packages/0a/30/5be58b119d4e82f903b7d15e04f0148361df582e5611b13e4d0702327407/lxml-5.2.1-cp39-cp39-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "f8aca2e3a72f37bfc7b14ba96d4056244001ddcc18382bd0daa087fd2e68a354", + "url": "https://files.pythonhosted.org/packages/0b/88/92ba489b430bd39a16acc706f4f2d62293bd1b5d267b00bf66540ea87c7a/lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "2213afee476546a7f37c7a9b4ad4d74b1e112a6fafffc9185d6d21f043128c81", + "url": "https://files.pythonhosted.org/packages/0d/40/9faa4d02fa2aafac46f714ed7a980d8b8733c2ae8a539028808da1c62c5e/lxml-5.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "d7520db34088c96cc0e0a3ad51a4fd5b401f279ee112aa2b7f8f976d8582606d", + "url": "https://files.pythonhosted.org/packages/0f/56/c5055b95bd4f76be8c1524a39d66f0b59f6428e0b06cd81a6e22442c548c/lxml-5.2.1-cp310-cp310-manylinux_2_28_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "31e9a882013c2f6bd2f2c974241bf4ba68c85eba943648ce88936d23209a2e01", + "url": "https://files.pythonhosted.org/packages/12/9b/a91b1b79847ec8d00f971fcf0d44f9f6f748be5296bdbc7951013d4be49a/lxml-5.2.1-cp310-cp310-musllinux_1_2_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "96323338e6c14e958d775700ec8a88346014a85e5de73ac7967db0367582049b", + "url": "https://files.pythonhosted.org/packages/13/bd/6f00037d5a76d440080e1789e2b1ce5af3e95c8837dbd093d410d27329f3/lxml-5.2.1-cp39-cp39-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "ab31a88a651039a07a3ae327d68ebdd8bc589b16938c09ef3f32a4b809dc96ef", + "url": "https://files.pythonhosted.org/packages/15/e2/84850d643534c55cbb053721948f1ce6622c14d98bdd824d04a49e20faee/lxml-5.2.1-cp311-cp311-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "feaa45c0eae424d3e90d78823f3828e7dc42a42f21ed420db98da2c4ecf0a2cb", + "url": "https://files.pythonhosted.org/packages/18/27/22aa10cecf56cb0d6d90b0791096e7c71dbd16e88a5ba37eba6ccbd7d114/lxml-5.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "3dc773b2861b37b41a6136e0b72a1a44689a9c4c101e0cddb6b854016acc0aa8", + "url": "https://files.pythonhosted.org/packages/18/99/0a7ab38bca13028381a9534f9228c6b04ab64f0be0a76cf94f680d0ec4ef/lxml-5.2.1-cp310-cp310-manylinux_2_28_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "6935bbf153f9a965f1e07c2649c0849d29832487c52bb4a5c5066031d8b44fd5", + "url": "https://files.pythonhosted.org/packages/1f/a6/880a56f4a33700c24658a54609e6bf659d84b43dc007053cf6e417e0e667/lxml-5.2.1-cp312-cp312-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "df2e6f546c4df14bc81f9498bbc007fbb87669f1bb707c6138878c46b06f6510", + "url": "https://files.pythonhosted.org/packages/25/13/6be6821e9aa13eacdc8ddc2c8906003151b8bf2bb98b59dad75344d63aa6/lxml-5.2.1-cp311-cp311-musllinux_1_1_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "e196a4ff48310ba62e53a8e0f97ca2bca83cdd2fe2934d8b5cb0df0a841b193a", + "url": "https://files.pythonhosted.org/packages/27/a7/75fb1eb9e4437333a23b5bd406773a4303f12b6f01bd3d0daf333def79e8/lxml-5.2.1-cp311-cp311-manylinux_2_28_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "64641a6068a16201366476731301441ce93457eb8452056f570133a6ceb15fca", + "url": "https://files.pythonhosted.org/packages/28/16/ee0af9b5b7a52c540dbf1f446f2c50d2ffe453c6bb841a2bc1f46fdb179c/lxml-5.2.1-cp38-cp38-musllinux_1_2_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "764b521b75701f60683500d8621841bec41a65eb739b8466000c6fdbc256c240", + "url": "https://files.pythonhosted.org/packages/29/10/4d64f96167e4492f1087a9269b371c420fd6ee2308454cff2199af14de27/lxml-5.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "e02c5175f63effbd7c5e590399c118d5db6183bbfe8e0d118bdb5c2d1b48d937", + "url": "https://files.pythonhosted.org/packages/2a/84/8d447150a2eeb600e34dc443521d8426a76d685f0c3b18da5ea7e0aaa5cb/lxml-5.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "3249cc2989d9090eeac5467e50e9ec2d40704fea9ab72f36b034ea34ee65ca98", + "url": "https://files.pythonhosted.org/packages/2c/31/7b87ea1701bb6c400bd124ddc73ba3019c1e3ed2c97fc14d711c55c3830d/lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "865bad62df277c04beed9478fe665b9ef63eb28fe026d5dedcb89b537d2e2ea6", + "url": "https://files.pythonhosted.org/packages/2d/3b/16a14eef29671f44b432eb97867e1c37e3953256fbc40c6d8a8e7e76b675/lxml-5.2.1-cp312-cp312-musllinux_1_1_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "853e074d4931dbcba7480d4dcab23d5c56bd9607f92825ab80ee2bd916edea53", + "url": "https://files.pythonhosted.org/packages/31/44/b8f8572081490846e41905bd0485ddaf1499dbd6569292f523252a0f557a/lxml-5.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "b6787b643356111dfd4032b5bffe26d2f8331556ecb79e15dacb9275da02866e", + "url": "https://files.pythonhosted.org/packages/34/ab/e6eb4db91910f053e6840693cd97c10ffa9f96cc9b340914e462c973d256/lxml-5.2.1-cp39-cp39-manylinux_2_28_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "0a15438253b34e6362b2dc41475e7f80de76320f335e70c5528b7148cac253a1", + "url": "https://files.pythonhosted.org/packages/35/54/3f709456183cd10aedd047525a307d136c7f210b13dbfedb905c83355115/lxml-5.2.1-cp310-cp310-musllinux_1_2_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "cf22b41fdae514ee2f1691b6c3cdeae666d8b7fa9434de445f12bbeee0cf48dd", + "url": "https://files.pythonhosted.org/packages/36/9b/b0f5598cc1273a59a753df742cb22b5b45cdc7ff187771e16bf13fff8ac8/lxml-5.2.1-cp39-cp39-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "9b9ec9c9978b708d488bec36b9e4c94d88fd12ccac3e62134a9d17ddba910ea9", + "url": "https://files.pythonhosted.org/packages/38/f6/32f13ac4813d386e85e3c7303705a8541b532d89b17ce2d7db78c1e9f41b/lxml-5.2.1-cp311-cp311-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "530e7c04f72002d2f334d5257c8a51bf409db0316feee7c87e4385043be136af", + "url": "https://files.pythonhosted.org/packages/3b/fe/36b0f97404b720b5bb5167ef77710ef129c7f94b7e7551f5cc9f3e3b01fb/lxml-5.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "3d0c3dd24bb4605439bf91068598d00c6370684f8de4a67c2992683f6c309d6b", + "url": "https://files.pythonhosted.org/packages/40/63/569ac75892f52a342f5dcc501e888b62b54fab615a014b929556b9ac7547/lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "6cc6ee342fb7fa2471bd9b6d6fdfc78925a697bf5c2bcd0a302e98b0d35bfad3", + "url": "https://files.pythonhosted.org/packages/42/42/a90c93ba366b74359218446655bc59656af0272f5d872d958977ee15641d/lxml-5.2.1-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "c817d420c60a5183953c783b0547d9eb43b7b344a2c46f69513d5952a78cddf3", + "url": "https://files.pythonhosted.org/packages/42/9f/6f11bc63b81c3c7a0fd3bcc585ebdceb49ac019f2d556a909f2cef90d58d/lxml-5.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "70ac664a48aa64e5e635ae5566f5227f2ab7f66a3990d67566d9907edcbbf867", + "url": "https://files.pythonhosted.org/packages/43/43/66a84c2a034f5df2782240cb2f68696a72ad6734d7a91f824e0360cde08b/lxml-5.2.1-cp311-cp311-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "1c5bb205e9212d0ebddf946bc07e73fa245c864a5f90f341d11ce7b0b854475d", + "url": "https://files.pythonhosted.org/packages/48/a7/f29f44b3bf76b05ca3b6a5e748844abe08922e6ae3cb4c90d2d3265f62ff/lxml-5.2.1-cp310-cp310-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "afd5562927cdef7c4f5550374acbc117fd4ecc05b5007bdfa57cc5355864e0a4", + "url": "https://files.pythonhosted.org/packages/4a/6c/a0d195a7630339eb0127e20aacb1184330064cb809fdf771c1bab5caf170/lxml-5.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "78bfa756eab503673991bdcf464917ef7845a964903d3302c5f68417ecdc948c", + "url": "https://files.pythonhosted.org/packages/4d/00/05e536765b04e4bceeeb5f6fe7b742956a02db70049e33e40af24a9fc5bc/lxml-5.2.1-cp38-cp38-musllinux_1_2_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "b070bbe8d3f0f6147689bed981d19bbb33070225373338df755a46893528104a", + "url": "https://files.pythonhosted.org/packages/4f/18/f0a8e3048bb2c05cc355c72a88ec12437d8b1beac7cb4a00eb93ab55f469/lxml-5.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "c94e75445b00319c1fad60f3c98b09cd63fe1134a8a953dcd48989ef42318534", + "url": "https://files.pythonhosted.org/packages/4f/64/fa14006c8f955ae4ec47f556ffc18091c5ed4343d475a80c83c063b38438/lxml-5.2.1-cp311-cp311-musllinux_1_2_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "beb72935a941965c52990f3a32d7f07ce869fe21c6af8b34bf6a277b33a345d3", + "url": "https://files.pythonhosted.org/packages/4f/f2/fed3e99ec54abbda69ffd5dab9c0e50e3e2ee6096e17c5891522dc2ebf4a/lxml-5.2.1-cp39-cp39-manylinux_2_28_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "ec42088248c596dbd61d4ae8a5b004f97a4d91a9fd286f632e42e60b706718d7", + "url": "https://files.pythonhosted.org/packages/50/e2/a0c188cd68d9859355655d6f6f2d4501c39fddec2adfa7d5af4af0ef6068/lxml-5.2.1-cp39-cp39-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "c6f2c8372b98208ce609c9e1d707f6918cc118fea4e2c754c9f0812c04ca116d", + "url": "https://files.pythonhosted.org/packages/52/82/04cc05851d414417f0404625bf217de4b9d82651a501e59f85ad9e52d8de/lxml-5.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "0f5d65c39f16717a47c36c756af0fb36144069c4718824b7533f803ecdf91138", + "url": "https://files.pythonhosted.org/packages/52/bf/9e09f2fe40d099b0cb52261989a2b782c0ecad48d4d2200d95e64a00f3e4/lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "417d14450f06d51f363e41cace6488519038f940676ce9664b34ebf5653433a5", + "url": "https://files.pythonhosted.org/packages/59/8f/518bd0c5b25adb8c0b0d0b2c2eb350f7bc6641d6f40b0feaa34619402109/lxml-5.2.1-cp38-cp38-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "058a1308914f20784c9f4674036527e7c04f7be6fb60f5d61353545aa7fcb739", + "url": "https://files.pythonhosted.org/packages/59/b9/469df493509f66138dd8b2137dfec378db19bdb089c6e35cb3d148b99488/lxml-5.2.1-cp38-cp38-manylinux_2_28_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "fd6037392f2d57793ab98d9e26798f44b8b4da2f2464388588f48ac52c489ea1", + "url": "https://files.pythonhosted.org/packages/5a/b8/63f5fb6f8902a9973804693419b0cbf3ae1b9fb548488e125931855cb9ea/lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "6588c459c5627fefa30139be4d2e28a2c2a1d0d1c265aad2ba1935a7863a4913", + "url": "https://files.pythonhosted.org/packages/5b/75/c94747eb3043abf75410481c3df8b038bbe8fa764e4df3d780f09ef84e41/lxml-5.2.1-cp39-cp39-manylinux_2_28_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "3a74c4f27167cb95c1d4af1c0b59e88b7f3e0182138db2501c353555f7ec57f4", + "url": "https://files.pythonhosted.org/packages/5c/41/e0391ffffd68e4bcd6ca60fa4694941bf9583bd18bc0827ede5d60021e50/lxml-5.2.1-cp312-cp312-manylinux_2_28_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "5dd1537e7cc06efd81371f5d1a992bd5ab156b2b4f88834ca852de4a8ea523fa", + "url": "https://files.pythonhosted.org/packages/5c/a3/fda21d82a80912eba14a4a1495e25712aec2ad652eeaaf8cfa8f87eceddb/lxml-5.2.1-cp311-cp311-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "f3bbbc998d42f8e561f347e798b85513ba4da324c2b3f9b7969e9c45b10f6169", + "url": "https://files.pythonhosted.org/packages/60/cc/5da8e739ee63b7e6232d69f769259fd74cde01cbb7e3d9311f0ef7414eb9/lxml-5.2.1-cp312-cp312-musllinux_1_2_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "a2b44bec7adf3e9305ce6cbfa47a4395667e744097faed97abb4728748ba7d47", + "url": "https://files.pythonhosted.org/packages/61/8a/a0a71720da1c61fd6a55a1962ec1280cebc4552c319efe744c8aa99d28c5/lxml-5.2.1-cp310-cp310-manylinux_2_28_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "5aea8212fb823e006b995c4dda533edcf98a893d941f173f6c9506126188860d", + "url": "https://files.pythonhosted.org/packages/62/d2/9137e350126538b89acfdf48ec4bf752e4e9ec627baefc74fa7c6d385281/lxml-5.2.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "5ea7b6766ac2dfe4bcac8b8595107665a18ef01f8c8343f00710b85096d1b53a", + "url": "https://files.pythonhosted.org/packages/64/8f/3218eb5ab4965b2a8bef85fbee99b1c03e3b851890bf14e04a72ebe7beab/lxml-5.2.1-cp311-cp311-manylinux_2_28_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "1f7785f4f789fdb522729ae465adcaa099e2a3441519df750ebdccc481d961a1", + "url": "https://files.pythonhosted.org/packages/65/04/b895658bd5c26203802ac197ce674fa9d1ce494559cf06db4fd19230526a/lxml-5.2.1-cp310-cp310-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "3a6b45da02336895da82b9d472cd274b22dc27a5cea1d4b793874eead23dd14f", + "url": "https://files.pythonhosted.org/packages/6e/27/5775154626e0898a82dba7a7ee8bb503c78f64d33e56c3a031bd1bf4e336/lxml-5.2.1-cp311-cp311-manylinux_2_28_aarch64.whl" }, { "algorithm": "sha256", - "hash": "ae8b9c6deb1e634ba4f1930eb67ef6e6bf6a44b6eb5ad605642b2d6d5ed9ce3c", - "url": "https://files.pythonhosted.org/packages/01/ae/ce23856fb6065f254101c1df381050b13adf26088dd554a15776615d470f/lxml-4.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl" + "hash": "2c9d147f754b1b0e723e6afb7ba1566ecb162fe4ea657f53d2139bbf894d050a", + "url": "https://files.pythonhosted.org/packages/6e/cc/4302b62bccb7f645e851c80ab6216faa1a7aa023bc2eb818408a08b42f2f/lxml-5.2.1-cp310-cp310-musllinux_1_1_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "411007c0d88188d9f621b11d252cce90c4a2d1a49db6c068e3c16422f306eab8", - "url": "https://files.pythonhosted.org/packages/04/8a/db479820a6ca92e729f75de16905311d8fffcb433116551d1529c9e19c85/lxml-4.9.3-cp310-cp310-manylinux_2_28_aarch64.whl" + "hash": "d793bebb202a6000390a5390078e945bbb49855c29c7e4d56a85901326c3b5d9", + "url": "https://files.pythonhosted.org/packages/71/a6/733dc617906a3921cbaf59ccb889a48cc8038ef228d774033c5c84ae5baf/lxml-5.2.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "eadfbbbfb41b44034a4c757fd5d70baccd43296fb894dba0295606a7cf3124aa", - "url": "https://files.pythonhosted.org/packages/0a/d1/769777acdd8a02a2d9d3eea25202b007948fadde53c725aacdd85f59813f/lxml-4.9.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl" + "hash": "cd53553ddad4a9c2f1f022756ae64abe16da1feb497edf4d9f87f99ec7cf86bd", + "url": "https://files.pythonhosted.org/packages/72/ec/1b53fe8f13c2c98b8a3b099612e9285c46cfe7965db67ee8641ae3b13b65/lxml-5.2.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "4fb960a632a49f2f089d522f70496640fdf1218f1243889da3822e0a9f5f3ba7", - "url": "https://files.pythonhosted.org/packages/0e/18/b9d8ce46bd1edbe8870efaa983749e190290000b444edb7ec183a70cb272/lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl" + "hash": "5ca1e8188b26a819387b29c3895c47a5e618708fe6f787f3b1a471de2c4a94d9", + "url": "https://files.pythonhosted.org/packages/75/39/c6ba744031c974168860b8f4a158a3a8fc7d0dce20c043f240a2feb17a1d/lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "fcdd00edfd0a3001e0181eab3e63bd5c74ad3e67152c84f93f13769a40e073a7", - "url": "https://files.pythonhosted.org/packages/11/56/403d94094015e9c0bae8b55a5611507390f0c1d9941410d4a7bbecf0ba9e/lxml-4.9.3-cp38-cp38-musllinux_1_1_x86_64.whl" + "hash": "44f6c7caff88d988db017b9b0e4ab04934f11e3e72d478031efc7edcac6c622f", + "url": "https://files.pythonhosted.org/packages/77/b0/13cdbcdbd59c83b9050c11dde4609e85c3cbe2fd331f473f530949a1373b/lxml-5.2.1-cp312-cp312-musllinux_1_1_x86_64.whl" }, { "algorithm": "sha256", - "hash": "0e2cb47860da1f7e9a5256254b74ae331687b9672dfa780eed355c4c9c3dbd23", - "url": "https://files.pythonhosted.org/packages/1d/f0/fe37367434330e30a97f79e124c9bb82dca3d0688330d8781ca52d9d459e/lxml-4.9.3-cp310-cp310-musllinux_1_1_aarch64.whl" + "hash": "0f8c09ed18ecb4ebf23e02b8e7a22a05d6411911e6fabef3a36e4f371f4f2585", + "url": "https://files.pythonhosted.org/packages/78/cf/8459dfc93c5f39645cb3a6e4c74dcaf7450b112655c76a29b04db5eb791d/lxml-5.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "5c245b783db29c4e4fbbbfc9c5a78be496c9fea25517f90606aa1f6b2b3d5f7b", - "url": "https://files.pythonhosted.org/packages/1f/89/afb20bc0750383dadc28ed82783a346e6dc474891cbac6dc179a97aed5a4/lxml-4.9.3-pp38-pypy38_pp73-macosx_11_0_x86_64.whl" + "hash": "68a2610dbe138fa8c5826b3f6d98a7cfc29707b850ddcc3e21910a6fe51f6ca0", + "url": "https://files.pythonhosted.org/packages/84/4c/195f220dd20814df9adfa6128fa824573efad59fbca0c33fc3890eb0e5a5/lxml-5.2.1-cp312-cp312-manylinux_2_28_s390x.whl" }, { "algorithm": "sha256", - "hash": "8d7e43bd40f65f7d97ad8ef5c9b1778943d02f04febef12def25f7583d19baac", - "url": "https://files.pythonhosted.org/packages/20/56/36fa38255306236b3cebb109c83002d29eddbf5e0f969a311e5e25aa38d6/lxml-4.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl" + "hash": "a0af35bd8ebf84888373630f73f24e86bf016642fb8576fba49d3d6b560b7cbc", + "url": "https://files.pythonhosted.org/packages/84/b2/5bfd28ad4029cd588703887486a24ca86f978940348de53b3e8ce0611c5a/lxml-5.2.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "1247694b26342a7bf47c02e513d32225ededd18045264d40758abeb3c838a51f", - "url": "https://files.pythonhosted.org/packages/2d/55/05a3b72a5c02121be3224fe0155322c1f8c781b696ef80ecd86cbe5fb11e/lxml-4.9.3-cp310-cp310-musllinux_1_1_x86_64.whl" + "hash": "9b0ff53900566bc6325ecde9181d89afadc59c5ffa39bddf084aaedfe3b06a11", + "url": "https://files.pythonhosted.org/packages/85/c5/4366584fb4f252f08b0ddd5a0dee672ca090931183dfaf6771e3b81a5bb2/lxml-5.2.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "48628bd53a426c9eb9bc066a923acaa0878d1e86129fd5359aee99285f4eed9c", - "url": "https://files.pythonhosted.org/packages/30/39/7305428d1c4f28282a4f5bdbef24e0f905d351f34cf351ceb131f5cddf78/lxml-4.9.3.tar.gz" + "hash": "27aa20d45c2e0b8cd05da6d4759649170e8dfc4f4e5ef33a34d06f2d79075d57", + "url": "https://files.pythonhosted.org/packages/8c/93/365779368884fb225ad6ecb9e1489aa0c8ed6287e09824df2f46bd4c305d/lxml-5.2.1-cp39-cp39-musllinux_1_1_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "690dafd0b187ed38583a648076865d8c229661ed20e48f2335d68e2cf7dc829d", - "url": "https://files.pythonhosted.org/packages/35/0b/7c3b67cf80d3b826273f860c20810c791c39ce55df612c8bf4bbdfa1ec11/lxml-4.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl" + "hash": "bf2e2458345d9bffb0d9ec16557d8858c9c88d2d11fed53998512504cd9df49b", + "url": "https://files.pythonhosted.org/packages/90/d6/09b3079ee9e6c1b666c641b6ecba43a2155837114e7f568d459bc4633d59/lxml-5.2.1-cp38-cp38-musllinux_1_1_x86_64.whl" }, { "algorithm": "sha256", - "hash": "71d66ee82e7417828af6ecd7db817913cb0cf9d4e61aa0ac1fde0583d84358db", - "url": "https://files.pythonhosted.org/packages/35/0b/b317a62e8597ca9f3a54f8094f9911a17fe68a98f1d7df67e2a70be4f2ac/lxml-4.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl" + "hash": "a7baf9ffc238e4bf401299f50e971a45bfcc10a785522541a6e3179c83eabf0a", + "url": "https://files.pythonhosted.org/packages/93/21/308bb596e63dcc51f66b501c525aa0eaf96954a586c8d391624cd8323893/lxml-5.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "d27be7405547d1f958b60837dc4c1007da90b8b23f54ba1f8b728c78fdb19d50", - "url": "https://files.pythonhosted.org/packages/39/6f/ed4327ac1370da702b7ac4047f4664fbdfb92a98b87ac779863202efc1ff/lxml-4.9.3-cp39-cp39-musllinux_1_1_x86_64.whl" + "hash": "5d077bc40a1fe984e1a9931e801e42959a1e6598edc8a3223b061d30fbd26bbc", + "url": "https://files.pythonhosted.org/packages/94/63/3fb6513259a541650a9a0cd6cbeec93202f078892b513709cad11aab6803/lxml-5.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" }, { "algorithm": "sha256", - "hash": "cd47b4a0d41d2afa3e58e5bf1f62069255aa2fd6ff5ee41604418ca925911d76", - "url": "https://files.pythonhosted.org/packages/3c/d2/11533f0bc47ff4d828a20cfb702f3453fe714bd5b475fcdc8cec6e6b7dcf/lxml-4.9.3-cp310-cp310-manylinux_2_28_x86_64.whl" + "hash": "1ae67b4e737cddc96c99461d2f75d218bdf7a0c3d3ad5604d1f5e7464a2f9ffe", + "url": "https://files.pythonhosted.org/packages/95/4c/fc5e63fb41e867f530a70519e1bcab0c14e84a95aa659f697bc97531be96/lxml-5.2.1-cp311-cp311-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "42871176e7896d5d45138f6d28751053c711ed4d48d8e30b498da155af39aebd", - "url": "https://files.pythonhosted.org/packages/43/6a/721980ef3bacaba2ffc811130e8b42244ce5e6e0218dbf65f1c36e314efd/lxml-4.9.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl" + "hash": "58278b29cb89f3e43ff3e0c756abbd1518f3ee6adad9e35b51fb101c1c1daaec", + "url": "https://files.pythonhosted.org/packages/9b/6e/623a6717565ad1a86f687b1d904e049f0df9ef20f46f603622ae47349adf/lxml-5.2.1-cp38-cp38-musllinux_1_2_aarch64.whl" }, { "algorithm": "sha256", - "hash": "6fc3c450eaa0b56f815c7b62f2b7fba7266c4779adcf1cece9e6deb1de7305ce", - "url": "https://files.pythonhosted.org/packages/44/1b/0771c38e65ad23e25368b5e07c920054774b8d12477a4fad116bf500de73/lxml-4.9.3-cp38-cp38-manylinux_2_28_x86_64.whl" + "hash": "804f74efe22b6a227306dd890eecc4f8c59ff25ca35f1f14e7482bbce96ef10b", + "url": "https://files.pythonhosted.org/packages/9b/83/08d9589fd8067ff4a50af5debc4da58d15fea483aefddf52242dc00e4d26/lxml-5.2.1-cp38-cp38-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "9bb6ad405121241e99a86efff22d3ef469024ce22875a7ae045896ad23ba2340", - "url": "https://files.pythonhosted.org/packages/50/e1/1c23a817d68418a59b39e6d2b353e211728c21353900279a04e65f6507a0/lxml-4.9.3-cp39-cp39-macosx_11_0_x86_64.whl" + "hash": "a8d5c70e04aac1eda5c829a26d1f75c6e5286c74743133d9f742cda8e53b9c2f", + "url": "https://files.pythonhosted.org/packages/9c/81/cca70c416063636dd8862f04cf96548175b05cf8c1e29d0c6787d0c250d5/lxml-5.2.1-cp311-cp311-musllinux_1_2_s390x.whl" }, { "algorithm": "sha256", - "hash": "4d2d1edbca80b510443f51afd8496be95529db04a509bc8faee49c7b0fb6d2cc", - "url": "https://files.pythonhosted.org/packages/5f/77/da7432d154f782bfc37e5eae41d0b109ce5ab0f93e466bcc4d9426539672/lxml-4.9.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl" + "hash": "11a04306fcba10cd9637e669fd73aa274c1c09ca64af79c041aa820ea992b637", + "url": "https://files.pythonhosted.org/packages/a0/04/506a4b8ebdba7e2c19624fbb555ea329e5ddf5c6132d5ae772c5ba258333/lxml-5.2.1-cp38-cp38-musllinux_1_2_x86_64.whl" }, { "algorithm": "sha256", - "hash": "b6420a005548ad52154c8ceab4a1290ff78d757f9e5cbc68f8c77089acd3c432", - "url": "https://files.pythonhosted.org/packages/6a/bf/a2f75c3c1e4e310e14cfe81117c8c1fca092bbb595babebd7df66b8eb5e6/lxml-4.9.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl" + "hash": "0e7259016bc4345a31af861fdce942b77c99049d6c2107ca07dc2bba2435c1d9", + "url": "https://files.pythonhosted.org/packages/a5/e6/fbe182c09f81673e8242e0a0ed8c345cc14fbba1bfdf6ea0a09fcb89f431/lxml-5.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "8ed74706b26ad100433da4b9d807eae371efaa266ffc3e9191ea436087a9d6a7", - "url": "https://files.pythonhosted.org/packages/6d/8f/eb30dead5cd2dd8f0a91f8bcb371688e158c8cbb4a3496e41196ea1171c0/lxml-4.9.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl" + "hash": "491755202eb21a5e350dae00c6d9a17247769c64dcf62d8c788b5c135e179dc4", + "url": "https://files.pythonhosted.org/packages/a6/76/0569b713b6eade2c73792d2325705fe34585af7a98d26ac2b59a80045c99/lxml-5.2.1-cp312-cp312-musllinux_1_2_x86_64.whl" }, { "algorithm": "sha256", - "hash": "71c52db65e4b56b8ddc5bb89fb2e66c558ed9d1a74a45ceb7dcb20c191c3df2f", - "url": "https://files.pythonhosted.org/packages/72/68/e57ff4acfb64448784c3090b3fe731d7dc86a6d02d9b04ff6b93237caab2/lxml-4.9.3-cp311-cp311-manylinux_2_28_aarch64.whl" + "hash": "d4f2cc7060dc3646632d7f15fe68e2fa98f58e35dd5666cd525f3b35d3fed7f8", + "url": "https://files.pythonhosted.org/packages/a8/05/adc662e205ae4465c37f2237e4385ea6031f883d997e908adab87faa9407/lxml-5.2.1-cp39-cp39-musllinux_1_1_s390x.whl" }, { "algorithm": "sha256", - "hash": "fc9b106a1bf918db68619fdcd6d5ad4f972fdd19c01d19bdb6bf63f3589a9ec5", - "url": "https://files.pythonhosted.org/packages/72/7e/72a2f5cc51f5338890fdefbf525349a35f74d804739b75fee9fe25cef008/lxml-4.9.3-cp312-cp312-musllinux_1_1_x86_64.whl" + "hash": "52421b41ac99e9d91934e4d0d0fe7da9f02bfa7536bb4431b4c05c906c8c6919", + "url": "https://files.pythonhosted.org/packages/a9/ac/dc3a108816d8f9b204e99f581db48aa0072bdca05e111d80ae5df70920e0/lxml-5.2.1-cp39-cp39-musllinux_1_2_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "50670615eaf97227d5dc60de2dc99fb134a7130d310d783314e7724bf163f75d", - "url": "https://files.pythonhosted.org/packages/73/e9/9d657d55914d90f0720c9f5c6d0c06d0a6eb70f0e7dbb015caa37052b98b/lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl" + "hash": "ff097ae562e637409b429a7ac958a20aab237a0378c42dabaa1e3abf2f896e5f", + "url": "https://files.pythonhosted.org/packages/a9/c4/dc5ab594f0b8f51b819c98e8a15994dfe36160d031061894e2294edd2e64/lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "b86164d2cff4d3aaa1f04a14685cbc072efd0b4f99ca5708b2ad1b9b5988a991", - "url": "https://files.pythonhosted.org/packages/78/8d/96b95d704fab4a95651ceeb6022855ae5a3c631f86c6647749a2e868af92/lxml-4.9.3-cp310-cp310-macosx_11_0_x86_64.whl" + "hash": "59689a75ba8d7ffca577aefd017d08d659d86ad4585ccc73e43edbfc7476781a", + "url": "https://files.pythonhosted.org/packages/ab/42/6b1c3cc3310c291c2f4a576c6ce67ba712b0c777809355c8fcc5c28f5239/lxml-5.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "9767e79108424fb6c3edf8f81e6730666a50feb01a328f4a016464a5893f835a", - "url": "https://files.pythonhosted.org/packages/7b/73/832a113f9362cadb0766950b79c4951d2044524fba242bb6e6990c5f9b48/lxml-4.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl" + "hash": "f0a1bc63a465b6d72569a9bba9f2ef0334c4e03958e043da1920299100bc7c08", + "url": "https://files.pythonhosted.org/packages/ac/9b/f97fac2e2bacbc91d1a15f24e3bdbb52e418591109393144a943bd502d2c/lxml-5.2.1-cp312-cp312-manylinux_2_28_x86_64.whl" }, { "algorithm": "sha256", - "hash": "9719fe17307a9e814580af1f5c6e05ca593b12fb7e44fe62450a5384dbf61b4b", - "url": "https://files.pythonhosted.org/packages/83/28/7d74840ef5480828f87c014e8a37405881e68a73a02067128a6cdffcbb72/lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl" + "hash": "dae0ed02f6b075426accbf6b2863c3d0a7eacc1b41fb40f2251d931e50188dad", + "url": "https://files.pythonhosted.org/packages/af/ac/fa3d31d9a5889814b49c8bfaecdc922431a5756d28b9209bc9e4ce239766/lxml-5.2.1-cp311-cp311-musllinux_1_1_aarch64.whl" }, { "algorithm": "sha256", - "hash": "3e9bdd30efde2b9ccfa9cb5768ba04fe71b018a25ea093379c857c9dad262c40", - "url": "https://files.pythonhosted.org/packages/8e/a1/c2108723d6cd0a53e64ea66e9954279d967dc3e40591e6f0f77236d2b18a/lxml-4.9.3-cp38-cp38-musllinux_1_1_aarch64.whl" + "hash": "588008b8497667f1ddca7c99f2f85ce8511f8f7871b4a06ceede68ab62dff64b", + "url": "https://files.pythonhosted.org/packages/b0/ad/6ed93d24ec2a8ca0886e6ea24f096f72f417d785debbd6204daf1528399e/lxml-5.2.1-cp39-cp39-manylinux_2_28_s390x.whl" }, { "algorithm": "sha256", - "hash": "57d6ba0ca2b0c462f339640d22882acc711de224d769edf29962b09f77129cbf", - "url": "https://files.pythonhosted.org/packages/97/1d/52ffb30c7f9e22b79924bce8c7d8f69c71f6180511233e0ccf49c9d45504/lxml-4.9.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl" + "hash": "a91481dbcddf1736c98a80b122afa0f7296eeb80b72344d7f45dc9f781551f56", + "url": "https://files.pythonhosted.org/packages/b1/ee/91b260391e4580140c732c7a2de4e6845b985f410401fce5bddd568cc065/lxml-5.2.1-cp310-cp310-musllinux_1_1_x86_64.whl" }, { "algorithm": "sha256", - "hash": "bb3bb49c7a6ad9d981d734ef7c7193bc349ac338776a0360cc671eaee89bcf69", - "url": "https://files.pythonhosted.org/packages/a2/e5/78402bb7bc3e9b43c7857f9e2c60ab5b5d5d9aa35ae76b4043b12535eb18/lxml-4.9.3-cp39-cp39-musllinux_1_1_aarch64.whl" + "hash": "79bd05260359170f78b181b59ce871673ed01ba048deef4bf49a36ab3e72e80b", + "url": "https://files.pythonhosted.org/packages/b6/f1/07d724e3a9e03d345255a442daa8449ee6c2db250b3d19cb56a1cafecbd8/lxml-5.2.1-cp312-cp312-musllinux_1_1_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "9e28c51fa0ce5674be9f560c6761c1b441631901993f76700b1b30ca6c8378d6", - "url": "https://files.pythonhosted.org/packages/ac/6d/7124edcc105e9ed42010c679678d41fa9a3ecfea36771a0bea9c9f04bdc6/lxml-4.9.3-cp311-cp311-musllinux_1_1_x86_64.whl" + "hash": "adfb84ca6b87e06bc6b146dc7da7623395db1e31621c4785ad0658c5028b37d7", + "url": "https://files.pythonhosted.org/packages/bc/71/c47ae309bbdd59b9552b3cbc0438c281575d150616d609f4405d0572d541/lxml-5.2.1-cp38-cp38-musllinux_1_1_aarch64.whl" }, { "algorithm": "sha256", - "hash": "b4e4bc18382088514ebde9328da057775055940a1f2e18f6ad2d78aa0f3ec5b9", - "url": "https://files.pythonhosted.org/packages/b2/9a/3222015b0d835aa6d98497fe4a1ed02cb29f1849db0a228e87b0aacb1851/lxml-4.9.3-cp312-cp312-musllinux_1_1_aarch64.whl" + "hash": "a2dfe7e2473f9b59496247aad6e23b405ddf2e12ef0765677b0081c02d6c2c0b", + "url": "https://files.pythonhosted.org/packages/bc/78/3252dbd90610bcd84f40cd5cd12ee134fe2de535c59b598ae2b4819b33d9/lxml-5.2.1-cp38-cp38-musllinux_1_1_s390x.whl" }, { "algorithm": "sha256", - "hash": "ed667f49b11360951e201453fc3967344d0d0263aa415e1619e85ae7fd17b4e0", - "url": "https://files.pythonhosted.org/packages/b6/4b/8964ca1238c6952d33afdcd89771a95a7e4ac7949e543c6685a6bd7b47c2/lxml-4.9.3-pp39-pypy39_pp73-macosx_11_0_x86_64.whl" + "hash": "e32be23d538753a8adb6c85bd539f5fd3b15cb987404327c569dfc5fd8366e85", + "url": "https://files.pythonhosted.org/packages/bd/87/347015307267c80af96ed344d8684d6b38e40e975b4f6a4f0d310c5a67e6/lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl" }, { "algorithm": "sha256", - "hash": "d3ff32724f98fbbbfa9f49d82852b159e9784d6094983d9a8b7f2ddaebb063d4", - "url": "https://files.pythonhosted.org/packages/c2/74/3a00052f9249b9a037a8c0cd0afac6e26cc21655ceb3d6b12221a171aeb7/lxml-4.9.3-cp312-cp312-macosx_11_0_universal2.whl" + "hash": "200e63525948e325d6a13a76ba2911f927ad399ef64f57898cf7c74e69b71095", + "url": "https://files.pythonhosted.org/packages/be/c3/1765e019344d3f042dfe750eb9a424c0ea2fd43deb6b2ac176b5603a436e/lxml-5.2.1-cp311-cp311-manylinux_2_28_x86_64.whl" }, { "algorithm": "sha256", - "hash": "5515edd2a6d1a5a70bfcdee23b42ec33425e405c5b351478ab7dc9347228f96e", - "url": "https://files.pythonhosted.org/packages/c5/a2/7876f76606725340c989b1c73b5501fc41fb21e50a8597c9ecdb63a05b27/lxml-4.9.3-cp39-cp39-manylinux_2_28_x86_64.whl" + "hash": "cc4691d60512798304acb9207987e7b2b7c44627ea88b9d77489bbe3e6cc3bd4", + "url": "https://files.pythonhosted.org/packages/c7/d7/19420ca74ecaa1f579542f9218150a9d8e09fbe3bc42cff48b5fd79e5642/lxml-5.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "fbf521479bcac1e25a663df882c46a641a9bff6b56dc8b0fafaebd2f66fb231b", - "url": "https://files.pythonhosted.org/packages/cc/b9/d822b2fc9b9406cff3ec6be03d69adb0e44fcad09608489ea4acaf2443bb/lxml-4.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl" + "hash": "7c17b64b0a6ef4e5affae6a3724010a7a66bda48a62cfe0674dabd46642e8b54", + "url": "https://files.pythonhosted.org/packages/c9/a5/1da8aa6afdffbd7de38af0ba3cd92e7f3f9653266407b4c66b9606c0137d/lxml-5.2.1-cp39-cp39-musllinux_1_1_aarch64.whl" }, { "algorithm": "sha256", - "hash": "0a3d3487f07c1d7f150894c238299934a2a074ef590b583103a45002035be120", - "url": "https://files.pythonhosted.org/packages/d0/5d/e9e3d4af7f4cf0c39f9136d1aca781abd6b95ec21caf299ad162062b963f/lxml-4.9.3-cp311-cp311-musllinux_1_1_aarch64.whl" + "hash": "0ed777c1e8c99b63037b91f9d73a6aad20fd035d77ac84afcc205225f8f41188", + "url": "https://files.pythonhosted.org/packages/ce/45/6671c6b930eaccab9442b7d89832ae986a52fbe7956d1ed7726aa503fc9c/lxml-5.2.1-cp39-cp39-musllinux_1_2_x86_64.whl" }, { "algorithm": "sha256", - "hash": "1f447ea5429b54f9582d4b955f5f1985f278ce5cf169f72eea8afd9502973dd5", - "url": "https://files.pythonhosted.org/packages/d6/56/9d5cb3438143a5aebad59088ca392950d74a531e1b96d0959144370b3b59/lxml-4.9.3-cp311-cp311-macosx_11_0_universal2.whl" + "hash": "3545039fa4779be2df51d6395e91a810f57122290864918b172d5dc7ca5bb433", + "url": "https://files.pythonhosted.org/packages/ce/e0/26b5ea71fce2c2a8b0ca590000a4923be4bade5733a19d9a1e8e25e899d8/lxml-5.2.1-cp310-cp310-musllinux_1_1_s390x.whl" }, { "algorithm": "sha256", - "hash": "65299ea57d82fb91c7f019300d24050c4ddeb7c5a190e076b5f48a2b43d19c42", - "url": "https://files.pythonhosted.org/packages/d8/0a/7f434f475ef235a555f43fe0d7794752092d1e82cd67da85ecf7792909f0/lxml-4.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl" + "hash": "f9737bf36262046213a28e789cc82d82c6ef19c85a0cf05e75c670a33342ac2c", + "url": "https://files.pythonhosted.org/packages/d0/f1/3a0bd5064c764966e5d1dd0e75048960a7f38c833422ff5e10c8f4ad8363/lxml-5.2.1-cp312-cp312-manylinux_2_28_aarch64.whl" }, { "algorithm": "sha256", - "hash": "9a92d3faef50658dd2c5470af249985782bf754c4e18e15afb67d3ab06233f13", - "url": "https://files.pythonhosted.org/packages/d8/e4/80ed0b5ac164fe452ceffb6733f008770e34878bc6f1104bb0f2266c1cb8/lxml-4.9.3-cp312-cp312-manylinux_2_28_x86_64.whl" + "hash": "2ddfe41ddc81f29a4c44c8ce239eda5ade4e7fc305fb7311759dd6229a080052", + "url": "https://files.pythonhosted.org/packages/d2/35/2b6b1dabbecd6772e22f69b6f03fd079ca491e6a22ba7e52c41719d0f8f6/lxml-5.2.1-cp310-cp310-musllinux_1_2_aarch64.whl" }, { "algorithm": "sha256", - "hash": "303bf1edce6ced16bf67a18a1cf8339d0db79577eec5d9a6d4a80f0fb10aa2da", - "url": "https://files.pythonhosted.org/packages/de/07/fcfc5adfb793e6181049a361b2909723c5821b2bc18a21064da4429631a8/lxml-4.9.3-cp39-cp39-manylinux_2_28_aarch64.whl" + "hash": "c8ba129e6d3b0136a0f50345b2cb3db53f6bda5dd8c7f5d83fbccba97fb5dcb5", + "url": "https://files.pythonhosted.org/packages/d9/f7/5adb745debebb65735b1475c77e9f6d08dfc616123ca2635ac3913a336ea/lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl" }, { "algorithm": "sha256", - "hash": "6689a3d7fd13dc687e9102a27e98ef33730ac4fe37795d5036d18b4d527abd35", - "url": "https://files.pythonhosted.org/packages/e0/04/e52a904f4cf06075e2a864069e0259397a4d1aab1f56ac98760400f007a6/lxml-4.9.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl" + "hash": "bcbf4af004f98793a95355980764b3d80d47117678118a44a80b721c9913436a", + "url": "https://files.pythonhosted.org/packages/db/54/ba315f949d92d8936436351739fe1309b4400386bc77f4ef0254abc8398d/lxml-5.2.1-cp310-cp310-manylinux_2_28_s390x.whl" }, { "algorithm": "sha256", - "hash": "8b77946fd508cbf0fccd8e400a7f71d4ac0e1595812e66025bac475a8e811694", - "url": "https://files.pythonhosted.org/packages/e4/f0/715c36f1fa3a12c0df47aef20b2ddcb09dbb346c7861628bbccf4a7cb8f4/lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl" + "hash": "394ed3924d7a01b5bd9a0d9d946136e1c2f7b3dc337196d99e61740ed4bc6fe1", + "url": "https://files.pythonhosted.org/packages/db/9b/0d26a0f9dcb8f80b84d23f127b4d2644339e55377ee8ab8e9be7a9d575d8/lxml-5.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "e4da8ca0c0c0aea88fd46be8e44bd49716772358d648cce45fe387f7b92374a7", - "url": "https://files.pythonhosted.org/packages/e5/47/fab85a1b473be9fc2a3b3329e0970b287123bd02367fe83ae06ca6ef5f58/lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl" + "hash": "b560e3aa4b1d49e0e6c847d72665384db35b2f5d45f8e6a5c0072e0283430533", + "url": "https://files.pythonhosted.org/packages/e0/7f/5b6096dbbe22e0062e6464350961bd979911036d5080569d99ac2a0d600f/lxml-5.2.1-cp38-cp38-manylinux_2_28_aarch64.whl" }, { "algorithm": "sha256", - "hash": "48d6ed886b343d11493129e019da91d4039826794a3e3027321c56d9e71505be", - "url": "https://files.pythonhosted.org/packages/e9/d0/30c3e26fb5115ba2f113692e08468f9a873805e513687981c51930022974/lxml-4.9.3-cp312-cp312-manylinux_2_28_aarch64.whl" + "hash": "8b9c07e7a45bb64e21df4b6aa623cb8ba214dfb47d2027d90eac197329bb5e94", + "url": "https://files.pythonhosted.org/packages/e2/d1/2fabdeec760771fd0d71610c4d54a23b22fa980608c0e20a0b224aee297d/lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "d73d8ecf8ecf10a3bd007f2192725a34bd62898e8da27eb9d32a58084f93962b", - "url": "https://files.pythonhosted.org/packages/ed/62/ffc30348ae141f69f9f23b65ba769db7ca209856c9a9b3406279e0ea24de/lxml-4.9.3-cp311-cp311-manylinux_2_28_x86_64.whl" + "hash": "c2d35a1d047efd68027817b32ab1586c1169e60ca02c65d428ae815b593e65d4", + "url": "https://files.pythonhosted.org/packages/e4/b5/379aaae618fe2f74584d0227a6a41fbe365ae8b096de5f6fad0de5be94d3/lxml-5.2.1-cp312-cp312-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "71e97313406ccf55d32cc98a533ee05c61e15d11b99215b237346171c179c0b0", + "url": "https://files.pythonhosted.org/packages/e8/af/fb093dc0f2b10e66d829764117d4188de15fea7ac33a6956be5d03048df9/lxml-5.2.1-cp312-cp312-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "3f7765e69bbce0906a7c74d5fe46d2c7a7596147318dbc08e4a2431f3060e306", + "url": "https://files.pythonhosted.org/packages/ea/e2/3834472e7f18801e67a3cd6f3c203a5456d6f7f903cfb9a990e62098a2f3/lxml-5.2.1.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "3e183c6e3298a2ed5af9d7a356ea823bccaab4ec2349dc9ed83999fd289d14d5", + "url": "https://files.pythonhosted.org/packages/ed/2e/c2efd8da53ea4c17d20bc12db17509ec5f46a7093599c067bac22d414e0b/lxml-5.2.1-cp38-cp38-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "794f04eec78f1d0e35d9e0c36cbbb22e42d370dda1609fb03bcd7aeb458c6377", + "url": "https://files.pythonhosted.org/packages/f1/cb/c34a95ce457998079fce78da490f3dfa96adf30fc34e7adf56f2c99942d5/lxml-5.2.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "e3d30321949861404323c50aebeb1943461a67cd51d4200ab02babc58bd06a86", + "url": "https://files.pythonhosted.org/packages/f2/17/f18e0f42098b24fb06009108dd7421073568b923827d4ecfcbff25cf54de/lxml-5.2.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "f42038016852ae51b4088b2862126535cc4fc85802bfe30dea3500fdfaf1864e", + "url": "https://files.pythonhosted.org/packages/f4/f8/70adbed8026a18a9bc0f5800e89715a3e55130503e2f36829638da28f380/lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "08802f0c56ed150cc6885ae0788a321b73505d2263ee56dad84d200cab11c07a", + "url": "https://files.pythonhosted.org/packages/f5/81/9b636fc6d9b7e5fd42c8e493d381d12a7d29a2d0dd6f580cacfcacde96aa/lxml-5.2.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "8e77c69d5892cb5ba71703c4057091e31ccf534bd7f129307a4d084d90d014b8", + "url": "https://files.pythonhosted.org/packages/f5/b2/eae0826c0250ddf6f3397d9f72a8922997aa22c306e05488709a8a6cf205/lxml-5.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "ddc678fb4c7e30cf830a2b5a8d869538bc55b28d6c68544d09c7d0d8f17694dc", + "url": "https://files.pythonhosted.org/packages/f5/bf/9a428b484740f40f2589a0ecf19f4fa37d7ded0fa284dcb3fd8bbc2b0a90/lxml-5.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "abc25c3cab9ec7fcd299b9bcb3b8d4a1231877e425c650fa1c7576c5107ab851", + "url": "https://files.pythonhosted.org/packages/f8/05/0b308e7a470f96d3d98e71043f2d6e62458eb3bcc1cb402a193bae2eb786/lxml-5.2.1-cp312-cp312-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "f18a5a84e16886898e51ab4b1d43acb3083c39b14c8caeb3589aabff0ee0b270", + "url": "https://files.pythonhosted.org/packages/fa/d9/f770b2220a6d6d33f4385a36a266c6967a112a960b8402cbb6850f74a0e4/lxml-5.2.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl" } ], "project_name": "lxml", "requires_dists": [ "BeautifulSoup4; extra == \"htmlsoup\"", - "Cython>=0.29.35; extra == \"source\"", + "Cython>=3.0.10; extra == \"source\"", "cssselect>=0.7; extra == \"cssselect\"", - "html5lib; extra == \"html5\"" + "html5lib; extra == \"html5\"", + "lxml-html-clean; extra == \"html_clean\"" ], - "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7", - "version": "4.9.3" + "requires_python": ">=3.6", + "version": "5.2.1" }, { "artifacts": [ @@ -2595,234 +2922,234 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e", - "url": "https://files.pythonhosted.org/packages/ab/20/f59423543a8422cb8c69a579ebd0ef2c9dafa70cc8142b7372b5b4073caa/MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl" + "hash": "5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", + "url": "https://files.pythonhosted.org/packages/02/8c/ab9a463301a50dab04d5472e998acbd4080597abc048166ded5c7aa768c8/MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl" }, { "algorithm": "sha256", - "hash": "2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4", - "url": "https://files.pythonhosted.org/packages/03/06/e72e88f81f8c91d4f488d21712d2d403fd644e3172eaadc302094377bc22/MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl" + "hash": "f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", + "url": "https://files.pythonhosted.org/packages/0a/0d/2454f072fae3b5a137c119abf15465d1771319dfe9e4acbb31722a0fff91/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636", - "url": "https://files.pythonhosted.org/packages/03/65/3473d2cb84bb2cda08be95b97fc4f53e6bcd701a2d50ba7b7c905e1e9273/MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl" + "hash": "e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", + "url": "https://files.pythonhosted.org/packages/0a/7b/85681ae3c33c385b10ac0f8dd025c30af83c78cec1c37a6aa3b55e67f5ec/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c", - "url": "https://files.pythonhosted.org/packages/11/40/ea7f85e2681d29bc9301c757257de561923924f24de1802d9c3baa396bb4/MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl" + "hash": "bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", + "url": "https://files.pythonhosted.org/packages/0b/cc/48206bd61c5b9d0129f4d75243b156929b04c94c09041321456fd06a876d/MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl" }, { "algorithm": "sha256", - "hash": "65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52", - "url": "https://files.pythonhosted.org/packages/12/b3/d9ed2c0971e1435b8a62354b18d3060b66c8cb1d368399ec0b9baa7c0ee5/MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", + "url": "https://files.pythonhosted.org/packages/0c/40/2e73e7d532d030b1e41180807a80d564eda53babaf04d65e15c1cf897e40/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa", - "url": "https://files.pythonhosted.org/packages/20/1d/713d443799d935f4d26a4f1510c9e61b1d288592fb869845e5cc92a1e055/MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl" + "hash": "8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", + "url": "https://files.pythonhosted.org/packages/0e/7d/968284145ffd9d726183ed6237c77938c021abacde4e073020f920e060b2/MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl" }, { "algorithm": "sha256", - "hash": "7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea", - "url": "https://files.pythonhosted.org/packages/22/81/b5659e2b6ae1516495a22f87370419c1d79c8d853315e6cbe5172fc01a06/MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl" + "hash": "7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", + "url": "https://files.pythonhosted.org/packages/0f/31/780bb297db036ba7b7bbede5e1d7f1e14d704ad4beb3ce53fb495d22bc62/MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl" }, { "algorithm": "sha256", - "hash": "df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9", - "url": "https://files.pythonhosted.org/packages/32/d4/ce98c4ca713d91c4a17c1a184785cc00b9e9c25699d618956c2b9999500a/MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl" + "hash": "629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", + "url": "https://files.pythonhosted.org/packages/11/e7/291e55127bb2ae67c64d66cef01432b5933859dfb7d6949daa721b89d0b3/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl" }, { "algorithm": "sha256", - "hash": "aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823", - "url": "https://files.pythonhosted.org/packages/3a/72/9f683a059bde096776e8acf9aa34cbbba21ddc399861fe3953790d4f2cde/MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl" + "hash": "0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", + "url": "https://files.pythonhosted.org/packages/18/46/5dca760547e8c59c5311b332f70605d24c99d1303dd9a6e1fc3ed0d73561/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl" }, { "algorithm": "sha256", - "hash": "c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7", - "url": "https://files.pythonhosted.org/packages/3c/c8/74d13c999cbb49e3460bf769025659a37ef4a8e884de629720ab4e42dcdb/MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl" + "hash": "6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", + "url": "https://files.pythonhosted.org/packages/1c/cf/35fe557e53709e93feb65575c93927942087e9b97213eabc3fe9d5b25a55/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1", - "url": "https://files.pythonhosted.org/packages/41/f1/bc770c37ecd58638c18f8ec85df205dacb818ccf933692082fd93010a4bc/MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl" + "hash": "ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", + "url": "https://files.pythonhosted.org/packages/29/fe/a36ba8c7ca55621620b2d7c585313efd10729e63ef81e4e61f52330da781/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc", - "url": "https://files.pythonhosted.org/packages/43/70/f24470f33b2035b035ef0c0ffebf57006beb2272cf3df068fc5154e04ead/MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl" + "hash": "ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", + "url": "https://files.pythonhosted.org/packages/2d/75/fd6cb2e68780f72d47e6671840ca517bda5ef663d30ada7616b0462ad1e3/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c", - "url": "https://files.pythonhosted.org/packages/43/ad/7246ae594aac948b17408c0ff0f9ff0bc470bdbe9c672a754310db64b237/MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", + "url": "https://files.pythonhosted.org/packages/30/39/8d845dd7d0b0613d86e0ef89549bfb5f61ed781f59af45fc96496e897f3a/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl" }, { "algorithm": "sha256", - "hash": "aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779", - "url": "https://files.pythonhosted.org/packages/47/26/932140621773bfd4df3223fbdd9e78de3477f424f0d2987c313b1cb655ff/MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl" + "hash": "3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", + "url": "https://files.pythonhosted.org/packages/48/d6/e7cd795fc710292c3af3a06d80868ce4b02bfbbf370b7cee11d282815a2a/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd", - "url": "https://files.pythonhosted.org/packages/51/94/9a04085114ff2c24f7424dbc890a281d73c5a74ea935dc2e69c66a3bd558/MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68", + "url": "https://files.pythonhosted.org/packages/4c/6f/f2b0f675635b05f6afd5ea03c094557bdb8622fa8e673387444fe8d8e787/MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b", - "url": "https://files.pythonhosted.org/packages/62/9b/4908a57acf39d8811836bc6776b309c2e07d63791485589acf0b6d7bc0c6/MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl" + "hash": "97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", + "url": "https://files.pythonhosted.org/packages/4f/14/6f294b9c4f969d0c801a4615e221c1e084722ea6114ab2114189c5b8cbe0/MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58", - "url": "https://files.pythonhosted.org/packages/68/8d/c33c43c499c19f4b51181e196c9a497010908fc22c5de33551e298aa6a21/MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "hash": "ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", + "url": "https://files.pythonhosted.org/packages/51/b5/5d8ec796e2a08fc814a2c7d2584b55f889a55cf17dd1a90f2beb70744e5c/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198", - "url": "https://files.pythonhosted.org/packages/6a/86/654dc431513cd4417dfcead8102f22bece2d6abf2f584f0e1cc1524f7b94/MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl" + "hash": "5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", + "url": "https://files.pythonhosted.org/packages/51/e0/393467cf899b34a9d3678e78961c2c8cdf49fb902a959ba54ece01273fb1/MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl" }, { "algorithm": "sha256", - "hash": "af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad", - "url": "https://files.pythonhosted.org/packages/6d/7c/59a3248f411813f8ccba92a55feaac4bf360d29e2ff05ee7d8e1ef2d7dbf/MarkupSafe-2.1.3.tar.gz" + "hash": "8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", + "url": "https://files.pythonhosted.org/packages/53/bd/583bf3e4c8d6a321938c13f49d44024dbe5ed63e0a7ba127e454a66da974/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl" }, { "algorithm": "sha256", - "hash": "962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6", - "url": "https://files.pythonhosted.org/packages/71/61/f5673d7aac2cf7f203859008bb3fc2b25187aa330067c5e9955e5c5ebbab/MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl" + "hash": "17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", + "url": "https://files.pythonhosted.org/packages/5f/5a/360da85076688755ea0cceb92472923086993e86b5613bbae9fbc14136b0/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc", - "url": "https://files.pythonhosted.org/packages/89/5a/ee546f2aa73a1d6fcfa24272f356fe06d29acca81e76b8d32ca53e429a2e/MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl" + "hash": "075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", + "url": "https://files.pythonhosted.org/packages/60/ae/9c60231cdfda003434e8bd27282b1f4e197ad5a710c14bee8bea8a9ca4f0/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl" }, { "algorithm": "sha256", - "hash": "69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8", - "url": "https://files.pythonhosted.org/packages/8b/bb/72ca339b012054a84753accabe3258e0baf6e34bd0ab6e3670b9a65f679d/MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl" + "hash": "598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", + "url": "https://files.pythonhosted.org/packages/65/dc/1510be4d179869f5dafe071aecb3f1f41b45d37c02329dfba01ff59e5ac5/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl" }, { "algorithm": "sha256", - "hash": "8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee", - "url": "https://files.pythonhosted.org/packages/8d/66/4a46c7f1402e0377a8b220fd4b53cc4f1b2337ab0d97f06e23acd1f579d1/MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "hash": "4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", + "url": "https://files.pythonhosted.org/packages/6a/18/ae5a258e3401f9b8312f92b028c54d7026a97ec3ab20bfaddbdfa7d8cce8/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11", - "url": "https://files.pythonhosted.org/packages/9d/78/92f15eb9b1e8f1668a9787ba103cf6f8d19a9efed8150245404836145c24/MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "hash": "72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", + "url": "https://files.pythonhosted.org/packages/6a/4a/a4d49415e600bacae038c67f9fecc1d5433b9d3c71a4de6f33537b89654c/MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee", - "url": "https://files.pythonhosted.org/packages/a2/f7/9175ad1b8152092f7c3b78c513c1bdfe9287e0564447d1c2d3d1a2471540/MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "hash": "5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", + "url": "https://files.pythonhosted.org/packages/6b/cb/aed7a284c00dfa7c0682d14df85ad4955a350a21d2e3b06d8240497359bf/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f", - "url": "https://files.pythonhosted.org/packages/a6/56/f1d4ee39e898a9e63470cbb7fae1c58cce6874f25f54220b89213a47f273/MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "hash": "db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", + "url": "https://files.pythonhosted.org/packages/6c/77/d77701bbef72892affe060cdacb7a2ed7fd68dae3b477a8642f15ad3b132/MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3", - "url": "https://files.pythonhosted.org/packages/b2/27/07e5aa9f93314dc65ad2ad9b899656dee79b70a9425ee199dd5a4c4cf2cd/MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl" + "hash": "c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", + "url": "https://files.pythonhosted.org/packages/6d/c5/27febe918ac36397919cd4a67d5579cbbfa8da027fa1238af6285bb368ea/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl" }, { "algorithm": "sha256", - "hash": "5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac", - "url": "https://files.pythonhosted.org/packages/bb/82/f88ccb3ca6204a4536cf7af5abdad7c3657adac06ab33699aa67279e0744/MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl" + "hash": "2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", + "url": "https://files.pythonhosted.org/packages/7c/52/2b1b570f6b8b803cef5ac28fdf78c0da318916c7d2fe9402a84d591b394c/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00", - "url": "https://files.pythonhosted.org/packages/bf/b7/c5ba9b7ad9ad21fc4a60df226615cf43ead185d328b77b0327d603d00cc5/MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", + "url": "https://files.pythonhosted.org/packages/81/d4/fd74714ed30a1dedd0b82427c02fa4deec64f173831ec716da11c51a50aa/MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575", - "url": "https://files.pythonhosted.org/packages/c0/c7/171f5ac6b065e1425e8fabf4a4dfbeca76fd8070072c6a41bd5c07d90d8b/MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl" + "hash": "d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", + "url": "https://files.pythonhosted.org/packages/87/5b/aae44c6655f3801e81aa3eef09dbbf012431987ba564d7231722f68df02d/MarkupSafe-2.1.5.tar.gz" }, { "algorithm": "sha256", - "hash": "42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d", - "url": "https://files.pythonhosted.org/packages/c9/80/f08e782943ee7ae6e9438851396d00a869f5b50ea8c6e1f40385f3e95771/MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl" + "hash": "58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", + "url": "https://files.pythonhosted.org/packages/88/07/2dc76aa51b481eb96a4c3198894f38b480490e834479611a4053fbf08623/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl" }, { "algorithm": "sha256", - "hash": "05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e", - "url": "https://files.pythonhosted.org/packages/de/63/cb7e71984e9159ec5f45b5e81e896c8bdd0e45fe3fc6ce02ab497f0d790e/MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", + "url": "https://files.pythonhosted.org/packages/8b/ff/9a52b71839d7a256b563e85d11050e307121000dcebc97df120176b3ad93/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl" }, { "algorithm": "sha256", - "hash": "8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be", - "url": "https://files.pythonhosted.org/packages/de/e2/32c14301bb023986dff527a49325b6259cab4ebb4633f69de54af312fc45/MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", + "url": "https://files.pythonhosted.org/packages/97/18/c30da5e7a0e7f4603abfc6780574131221d9148f323752c2755d48abad30/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e", - "url": "https://files.pythonhosted.org/packages/e6/5c/8ab8f67bbbbf90fe88f887f4fa68123435c5415531442e8aefef1e118d5c/MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", + "url": "https://files.pythonhosted.org/packages/b0/81/147c477391c2750e8fc7705829f7351cf1cd3be64406edcf900dc633feb2/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl" }, { "algorithm": "sha256", - "hash": "9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c", - "url": "https://files.pythonhosted.org/packages/e7/33/54d29854716725d7826079b8984dd235fac76dab1c32321e555d493e61f5/MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl" + "hash": "fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", + "url": "https://files.pythonhosted.org/packages/c7/bd/50319665ce81bb10e90d1cf76f9e1aa269ea6f7fa30ab4521f14d122a3df/MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939", - "url": "https://files.pythonhosted.org/packages/ec/53/fcb3214bd370185e223b209ce6bb010fb887ea57173ca4f75bd211b24e10/MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", + "url": "https://files.pythonhosted.org/packages/d1/06/a41c112ab9ffdeeb5f77bc3e331fdadf97fa65e52e44ba31880f4e7f983c/MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl" }, { "algorithm": "sha256", - "hash": "338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9", - "url": "https://files.pythonhosted.org/packages/f4/a0/103f94793c3bf829a18d2415117334ece115aeca56f2df1c47fa02c6dbd6/MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", + "url": "https://files.pythonhosted.org/packages/d9/a7/1e558b4f78454c8a3a0199292d96159eb4d091f983bc35ef258314fe7269/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57", - "url": "https://files.pythonhosted.org/packages/f7/9c/86cbd8e0e1d81f0ba420f20539dd459c50537c7751e28102dbfee2b6f28c/MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl" + "hash": "a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", + "url": "https://files.pythonhosted.org/packages/e4/54/ad5eb37bf9d51800010a74e4665425831a9db4e7c4e0fde4352e391e808e/MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl" }, { "algorithm": "sha256", - "hash": "2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0", - "url": "https://files.pythonhosted.org/packages/f8/33/e9e83b214b5f8d9a60b26e60051734e7657a416e5bce7d7f1c34e26badad/MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl" + "hash": "30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", + "url": "https://files.pythonhosted.org/packages/f6/02/5437e2ad33047290dafced9df741d9efc3e716b75583bbd73a9984f1b6f7/MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl" }, { "algorithm": "sha256", - "hash": "ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c", - "url": "https://files.pythonhosted.org/packages/fe/09/c31503cb8150cf688c1534a7135cc39bb9092f8e0e6369ec73494d16ee0e/MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl" + "hash": "3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", + "url": "https://files.pythonhosted.org/packages/f8/81/56e567126a2c2bc2684d6391332e357589a96a76cb9f8e5052d85cb0ead8/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl" }, { "algorithm": "sha256", - "hash": "bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2", - "url": "https://files.pythonhosted.org/packages/fe/21/2eff1de472ca6c99ec3993eab11308787b9879af9ca8bbceb4868cf4f2ca/MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", + "url": "https://files.pythonhosted.org/packages/f8/ff/2c942a82c35a49df5de3a630ce0a8456ac2969691b230e530ac12314364c/MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl" } ], "project_name": "markupsafe", "requires_dists": [], "requires_python": ">=3.7", - "version": "2.1.3" + "version": "2.1.5" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311", - "url": "https://files.pythonhosted.org/packages/f2/51/c34d7a1d528efaae3d8ddb18ef45a41f284eacf9e514523b191b7d0872cc/matplotlib_inline-0.1.6-py3-none-any.whl" + "hash": "df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", + "url": "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304", - "url": "https://files.pythonhosted.org/packages/d9/50/3af8c0362f26108e54d58c7f38784a3bdae6b9a450bab48ee8482d737f44/matplotlib-inline-0.1.6.tar.gz" + "hash": "8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", + "url": "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz" } ], "project_name": "matplotlib-inline", "requires_dists": [ "traitlets" ], - "requires_python": ">=3.5", - "version": "0.1.6" + "requires_python": ">=3.8", + "version": "0.1.7" }, { "artifacts": [ @@ -2860,6 +3187,24 @@ "requires_python": ">=3.7", "version": "0.1.2" }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "68687e19a14f11f26d140dd5c86f3dba4bf5df58003000ed467e0e2a69bca96c", + "url": "https://files.pythonhosted.org/packages/9a/67/7e8406a29b6c45be7af7740456f7f37025f0506ae2e05fb9009a53946860/monotonic-1.6-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "3a55207bcfed53ddd5c5bae174524062935efed17792e9de2ad0205ce9ad63f7", + "url": "https://files.pythonhosted.org/packages/ea/ca/8e91948b782ddfbd194f323e7e7d9ba12e5877addf04fb2bf8fca38e86ac/monotonic-1.6.tar.gz" + } + ], + "project_name": "monotonic", + "requires_dists": [], + "requires_python": null, + "version": "1.6" + }, { "artifacts": [ { @@ -2940,42 +3285,43 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7", - "url": "https://files.pythonhosted.org/packages/ec/1a/610693ac4ee14fcdf2d9bf3c493370e4f2ef7ae2e19217d7a237ff42367d/packaging-23.2-py3-none-any.whl" + "hash": "2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", + "url": "https://files.pythonhosted.org/packages/49/df/1fceb2f8900f8639e278b056416d49134fb8d84c5942ffaa01ad34782422/packaging-24.0-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", - "url": "https://files.pythonhosted.org/packages/fb/2b/9b9c33ffed44ee921d0967086d653047286054117d584f1b1a7c22ceaf7b/packaging-23.2.tar.gz" + "hash": "eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9", + "url": "https://files.pythonhosted.org/packages/ee/b5/b43a27ac7472e1818c4bafd44430e69605baefe1f34440593e0332ec8b4d/packaging-24.0.tar.gz" } ], "project_name": "packaging", "requires_dists": [], "requires_python": ">=3.7", - "version": "23.2" + "version": "24.0" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75", - "url": "https://files.pythonhosted.org/packages/05/63/8011bd08a4111858f79d2b09aad86638490d62fbf881c44e434a6dfca87b/parso-0.8.3-py2.py3-none-any.whl" + "hash": "a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", + "url": "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0", - "url": "https://files.pythonhosted.org/packages/a2/0e/41f0cca4b85a6ea74d66d2226a7cda8e41206a624f5b330b958ef48e2e52/parso-0.8.3.tar.gz" + "hash": "eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", + "url": "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz" } ], "project_name": "parso", "requires_dists": [ "docopt; extra == \"testing\"", - "flake8==3.8.3; extra == \"qa\"", - "mypy==0.782; extra == \"qa\"", - "pytest<6.0.0; extra == \"testing\"" + "flake8==5.0.4; extra == \"qa\"", + "mypy==0.971; extra == \"qa\"", + "pytest; extra == \"testing\"", + "types-setuptools==67.2.0.1; extra == \"qa\"" ], "requires_python": ">=3.6", - "version": "0.8.3" + "version": "0.8.4" }, { "artifacts": [ @@ -3039,29 +3385,29 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380", - "url": "https://files.pythonhosted.org/packages/be/53/42fe5eab4a09d251a76d0043e018172db324a23fcdac70f77a551c11f618/platformdirs-4.1.0-py3-none-any.whl" + "hash": "0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068", + "url": "https://files.pythonhosted.org/packages/55/72/4898c44ee9ea6f43396fbc23d9bfaf3d06e01b83698bdf2e4c919deceb7c/platformdirs-4.2.0-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420", - "url": "https://files.pythonhosted.org/packages/62/d1/7feaaacb1a3faeba96c06e6c5091f90695cc0f94b7e8e1a3a3fe2b33ff9a/platformdirs-4.1.0.tar.gz" + "hash": "ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768", + "url": "https://files.pythonhosted.org/packages/96/dc/c1d911bf5bb0fdc58cc05010e9f3efe3b67970cef779ba7fbc3183b987a8/platformdirs-4.2.0.tar.gz" } ], "project_name": "platformdirs", "requires_dists": [ "appdirs==1.4.4; extra == \"test\"", "covdefaults>=2.3; extra == \"test\"", - "furo>=2023.7.26; extra == \"docs\"", + "furo>=2023.9.10; extra == \"docs\"", "proselint>=0.13; extra == \"docs\"", "pytest-cov>=4.1; extra == \"test\"", - "pytest-mock>=3.11.1; extra == \"test\"", - "pytest>=7.4; extra == \"test\"", - "sphinx-autodoc-typehints>=1.24; extra == \"docs\"", - "sphinx>=7.1.1; extra == \"docs\"" + "pytest-mock>=3.12; extra == \"test\"", + "pytest>=7.4.3; extra == \"test\"", + "sphinx-autodoc-typehints>=1.25.2; extra == \"docs\"", + "sphinx>=7.2.6; extra == \"docs\"" ], "requires_python": ">=3.8", - "version": "4.1.0" + "version": "4.2.0" }, { "artifacts": [ @@ -3085,6 +3431,44 @@ "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7", "version": "0.13.1" }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "3c672be7ba6f95d555ea207d4486c171d06657eb34b3ce25eb043bfe7b6b5b76", + "url": "https://files.pythonhosted.org/packages/6c/5f/24cb22118db0e11703b6b80ef9f982eadde21eb585c3a769719e48dce893/posthog-3.5.0-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "8f7e3b2c6e8714d0c0c542a2109b83a7549f63b7113a133ab2763a89245ef2ef", + "url": "https://files.pythonhosted.org/packages/d8/c8/8a7308d5355fedfc400098a75fd191cf615b55aa22ef2a937995326e6f5e/posthog-3.5.0.tar.gz" + } + ], + "project_name": "posthog", + "requires_dists": [ + "backoff>=1.10.0", + "black; extra == \"dev\"", + "coverage; extra == \"test\"", + "django; extra == \"sentry\"", + "flake8-print; extra == \"dev\"", + "flake8; extra == \"dev\"", + "flake8; extra == \"test\"", + "freezegun==0.3.15; extra == \"test\"", + "isort; extra == \"dev\"", + "mock>=2.0.0; extra == \"test\"", + "monotonic>=1.5", + "pre-commit; extra == \"dev\"", + "pylint; extra == \"test\"", + "pytest-timeout; extra == \"test\"", + "pytest; extra == \"test\"", + "python-dateutil>2.1", + "requests<3.0,>=2.7", + "sentry-sdk; extra == \"sentry\"", + "six>=1.5" + ], + "requires_python": null, + "version": "3.5.0" + }, { "artifacts": [ { @@ -3121,13 +3505,13 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "f36fe301fafb7470e86aaf90f036eef600a3210be4decf461a5b1ca8403d3cb2", - "url": "https://files.pythonhosted.org/packages/1f/9d/be9b01085bbd67a71c4b6aa02518fade8104e7a2224e5de5e947811d7176/prompt_toolkit-3.0.41-py3-none-any.whl" + "hash": "a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6", + "url": "https://files.pythonhosted.org/packages/ee/fd/ca7bf3869e7caa7a037e23078539467b433a4e01eebd93f77180ab927766/prompt_toolkit-3.0.43-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "941367d97fc815548822aa26c2a269fdc4eb21e9ec05fc5d447cf09bad5d75f0", - "url": "https://files.pythonhosted.org/packages/d9/7b/7d88d94427e1e179e0a62818e68335cf969af5ca38033c0ca02237ab6ee7/prompt_toolkit-3.0.41.tar.gz" + "hash": "3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", + "url": "https://files.pythonhosted.org/packages/cc/c6/25b6a3d5cd295304de1e32c9edbcf319a52e965b339629d37d42bb7126ca/prompt_toolkit-3.0.43.tar.gz" } ], "project_name": "prompt-toolkit", @@ -3135,7 +3519,7 @@ "wcwidth" ], "requires_python": ">=3.7.0", - "version": "3.0.41" + "version": "3.0.43" }, { "artifacts": [ @@ -3442,140 +3826,140 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "4439847c58d40b1d0a573d07e3856e95333f1976294494c325775aeca506eb58", - "url": "https://files.pythonhosted.org/packages/d1/75/4686d2872bf2fc0b37917cbc8bbf0dd3a5cdb0990799be1b9cbf1e1eb733/pyasn1-0.5.1-py2.py3-none-any.whl" + "hash": "cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473", + "url": "https://files.pythonhosted.org/packages/23/7e/5f50d07d5e70a2addbccd90ac2950f81d1edd0783630651d9268d7f1db49/pyasn1-0.6.0-py2.py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "6d391a96e59b23130a5cfa74d6fd7f388dbbe26cc8f1edf39fdddf08d9d6676c", - "url": "https://files.pythonhosted.org/packages/ce/dc/996e5446a94627fe8192735c20300ca51535397e31e7097a3cc80ccf78b7/pyasn1-0.5.1.tar.gz" + "hash": "3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c", + "url": "https://files.pythonhosted.org/packages/4a/a3/d2157f333900747f20984553aca98008b6dc843eb62f3a36030140ccec0d/pyasn1-0.6.0.tar.gz" } ], "project_name": "pyasn1", "requires_dists": [], - "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7", - "version": "0.5.1" + "requires_python": ">=3.8", + "version": "0.6.0" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d", - "url": "https://files.pythonhosted.org/packages/cd/8e/bea464350e1b8c6ed0da3a312659cb648804a08af6cacc6435867f74f8bd/pyasn1_modules-0.3.0-py2.py3-none-any.whl" + "hash": "be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b", + "url": "https://files.pythonhosted.org/packages/13/68/8906226b15ef38e71dc926c321d2fe99de8048e9098b5dfd38343011c886/pyasn1_modules-0.4.0-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c", - "url": "https://files.pythonhosted.org/packages/3b/e4/7dec823b1b5603c5b3c51e942d5d9e65efd6ff946e713a325ed4146d070f/pyasn1_modules-0.3.0.tar.gz" + "hash": "831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6", + "url": "https://files.pythonhosted.org/packages/f7/00/e7bd1dec10667e3f2be602686537969a7ac92b0a7c5165be2e5875dc3971/pyasn1_modules-0.4.0.tar.gz" } ], "project_name": "pyasn1-modules", "requires_dists": [ - "pyasn1<0.6.0,>=0.4.6" + "pyasn1<0.7.0,>=0.4.6" ], - "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7", - "version": "0.3.0" + "requires_python": ">=3.8", + "version": "0.4.0" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", - "url": "https://files.pythonhosted.org/packages/62/d5/5f610ebe421e85889f2e55e33b7f9a6795bd982198517d912eb1c76e1a53/pycparser-2.21-py2.py3-none-any.whl" + "hash": "c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", + "url": "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206", - "url": "https://files.pythonhosted.org/packages/5e/0b/95d387f5f4433cb0f53ff7ad859bd2c6051051cebbb564f139a999ab46de/pycparser-2.21.tar.gz" + "hash": "491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", + "url": "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz" } ], "project_name": "pycparser", "requires_dists": [], - "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7", - "version": "2.21" + "requires_python": ">=3.8", + "version": "2.22" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "17940dcf274fcae4a54ec6117a9ecfe52907ed5e2e438fe712fe7ca502672ed5", - "url": "https://files.pythonhosted.org/packages/e0/19/25a95c687bf0d79c977170fd085e395990ea2b6f3ed888cd66e8543f9127/pycryptodome-3.19.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "2ab6ab0cb755154ad14e507d1df72de9897e99fd2d4922851a276ccc14f4f1a5", + "url": "https://files.pythonhosted.org/packages/5d/c3/5530f270c4ec87953fbed203e4f1f4a2fa002bc43efdc1b3cf9ab442e741/pycryptodome-3.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "e249a784cc98a29c77cea9df54284a44b40cafbfae57636dd2f8775b48af2434", - "url": "https://files.pythonhosted.org/packages/00/e6/73931df4046e34a6354d323b4a5b5c18e5184f4a08687806ee3353c81a6b/pycryptodome-3.19.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "acc2614e2e5346a4a4eab6e199203034924313626f9620b7b4b38e9ad74b7e0c", + "url": "https://files.pythonhosted.org/packages/0d/08/01987ab75ca789247a88c8b2f0ce374ef7d319e79589e0842e316a272662/pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_i686.whl" }, { "algorithm": "sha256", - "hash": "bc35d463222cdb4dbebd35e0784155c81e161b9284e567e7e933d722e533331e", - "url": "https://files.pythonhosted.org/packages/1a/72/acc37a491b95849b51a2cced64df62aaff6a5c82d26aca10bc99dbda025b/pycryptodome-3.19.0.tar.gz" + "hash": "76658f0d942051d12a9bd08ca1b6b34fd762a8ee4240984f7c06ddfb55eaf15a", + "url": "https://files.pythonhosted.org/packages/24/80/56a04e2ae622d7f38c1c01aef46a26c6b73a2ad15c9705a8e008b5befb03/pycryptodome-3.20.0-cp35-abi3-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "560591c0777f74a5da86718f70dfc8d781734cf559773b64072bbdda44b3fc3e", - "url": "https://files.pythonhosted.org/packages/1b/ad/2699516926592369917dbd1894ac5d25e371680f53b628b530e94db314b5/pycryptodome-3.19.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl" + "hash": "fb3b87461fa35afa19c971b0a2b7456a7b1db7b4eba9a8424666104925b78128", + "url": "https://files.pythonhosted.org/packages/30/4b/cbc67cda0efd55d7ddcc98374c4b9c853022a595ed1d78dd15c961bc7f6e/pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_aarch64.whl" }, { "algorithm": "sha256", - "hash": "61bb3ccbf4bf32ad9af32da8badc24e888ae5231c617947e0f5401077f8b091f", - "url": "https://files.pythonhosted.org/packages/20/03/bd639213eba37d29a16d359b42def13def905a456358f8af52107fc4e8a4/pycryptodome-3.19.0-cp35-abi3-macosx_10_9_x86_64.whl" + "hash": "a60fedd2b37b4cb11ccb5d0399efe26db9e0dd149016c1cc6c8161974ceac2d6", + "url": "https://files.pythonhosted.org/packages/53/a3/1345f914963d7d668a5423dc563deafae02479bd1c69b39180724475584f/pycryptodome-3.20.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "8c1601e04d32087591d78e0b81e1e520e57a92796089864b20e5f18c9564b3fa", - "url": "https://files.pythonhosted.org/packages/23/e0/b3ecb14fd9869b68706ff234583471e05104c7ca2db196ed234f5a030d05/pycryptodome-3.19.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "405002eafad114a2f9a930f5db65feef7b53c4784495dd8758069b89baf68eab", + "url": "https://files.pythonhosted.org/packages/6a/3d/ba3905a0ae6dd4e8686dbde85c71ce38e27f5ad3587424891238ad520aaf/pycryptodome-3.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "d49a6c715d8cceffedabb6adb7e0cbf41ae1a2ff4adaeec9432074a80627dea1", - "url": "https://files.pythonhosted.org/packages/2d/8a/a05cb7434cda97da2491bee1418be9651ce99fec74bfe95320e153845853/pycryptodome-3.19.0-cp35-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "hash": "6e0e4a987d38cfc2e71b4a1b591bae4891eeabe5fa0f56154f576e26287bfdea", + "url": "https://files.pythonhosted.org/packages/8b/61/522235ca81d9dcfcf8b4cbc253b3a8a1f2231603d486369a8a02eb998f31/pycryptodome-3.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "0101f647d11a1aae5a8ce4f5fad6644ae1b22bb65d05accc7d322943c69a74a6", - "url": "https://files.pythonhosted.org/packages/30/7f/728391d15a1d71d78232539a2141b472a6e7f6cd12af316c150beb3093f0/pycryptodome-3.19.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl" + "hash": "f47888542a0633baff535a04726948e876bf1ed880fddb7c10a736fa99146ab3", + "url": "https://files.pythonhosted.org/packages/a2/40/63dff38fa4f7888f812263494d4a745eeed180ff09dd7b8350a81eb09d21/pycryptodome-3.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "5b1986c761258a5b4332a7f94a83f631c1ffca8747d75ab8395bf2e1b93283d9", - "url": "https://files.pythonhosted.org/packages/38/84/d429fafe45c0a32dc7d759fbb9b917282944d6852cdaf9e5dc743ea7b0aa/pycryptodome-3.19.0-cp35-abi3-musllinux_1_1_x86_64.whl" + "hash": "76cb39afede7055127e35a444c1c041d2e8d2f1f9c121ecef573757ba4cd2c3c", + "url": "https://files.pythonhosted.org/packages/af/20/5f29ec45462360e7f61e8688af9fe4a0afae057edfabdada662e11bf97e7/pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "506c686a1eee6c00df70010be3b8e9e78f406af4f21b23162bbb6e9bdf5427bc", - "url": "https://files.pythonhosted.org/packages/44/15/d6e3bbc6be85058d7a9997c4b119fe6b7f1804fb65513ddd1537ecaa225d/pycryptodome-3.19.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "210ba1b647837bfc42dd5a813cdecb5b86193ae11a3f5d972b9a0ae2c7e9e4b4", + "url": "https://files.pythonhosted.org/packages/b5/bf/798630923b67f4201059c2d690105998f20a6a8fb9b5ab68d221985155b3/pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_x86_64.whl" }, { "algorithm": "sha256", - "hash": "139ae2c6161b9dd5d829c9645d781509a810ef50ea8b657e2257c25ca20efe33", - "url": "https://files.pythonhosted.org/packages/82/b7/876ced7a574843bf6358da5a2faa910925a8b9eb79bb7f164d070dbf72ae/pycryptodome-3.19.0-cp35-abi3-musllinux_1_1_i686.whl" + "hash": "09609209ed7de61c2b560cc5c8c4fbf892f8b15b1faf7e4cbffac97db1fffda7", + "url": "https://files.pythonhosted.org/packages/b9/ed/19223a0a0186b8a91ebbdd2852865839237a21c74f1fbc4b8d5b62965239/pycryptodome-3.20.0.tar.gz" }, { "algorithm": "sha256", - "hash": "84c3e4fffad0c4988aef0d5591be3cad4e10aa7db264c65fadbc633318d20bde", - "url": "https://files.pythonhosted.org/packages/b8/97/243bc2019517abb13051e197f33deaf69493bbe020846e6571c7a485a428/pycryptodome-3.19.0-cp35-abi3-musllinux_1_1_aarch64.whl" + "hash": "acae12b9ede49f38eb0ef76fdec2df2e94aad85ae46ec85be3648a57f0a7db04", + "url": "https://files.pythonhosted.org/packages/c7/10/88fb67d2fa545ce2ac61cfda70947bcbb1769f1956315c4b919d79774897/pycryptodome-3.20.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "c1cc2f2ae451a676def1a73c1ae9120cd31af25db3f381893d45f75e77be2400", - "url": "https://files.pythonhosted.org/packages/c8/c1/9978ddb32d54569e4c160a5a9db20b7c7cdb1043d63da3b4135ce417643c/pycryptodome-3.19.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "49a4c4dc60b78ec41d2afa392491d788c2e06edf48580fbfb0dd0f828af49d25", + "url": "https://files.pythonhosted.org/packages/e5/1f/6bc4beb4adc07b847e5d3fddbec4522c2c3aa05df9e61b91dc4eff6a4946/pycryptodome-3.20.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "542f99d5026ac5f0ef391ba0602f3d11beef8e65aae135fa5b762f5ebd9d3bfb", - "url": "https://files.pythonhosted.org/packages/d6/df/295e56dca0b4834665626326359c5a1f3092287be56db4b316926df7ad0c/pycryptodome-3.19.0-cp35-abi3-macosx_10_9_universal2.whl" + "hash": "f35d6cee81fa145333137009d9c8ba90951d7d77b67c79cbe5f03c7eb74d8fe2", + "url": "https://files.pythonhosted.org/packages/ea/94/82ebfa5c83d980907ceebf79b00909a569d258bdfd9b0264d621fa752cfd/pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "d033947e7fd3e2ba9a031cb2d267251620964705a013c5a461fa5233cc025270", - "url": "https://files.pythonhosted.org/packages/da/63/43feb85e3183e4bcd0d3780579c8006f37e8bd2438812a210a4738728244/pycryptodome-3.19.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "ac1c7c0624a862f2e53438a15c9259d1655325fc2ec4392e66dc46cdae24d044", + "url": "https://files.pythonhosted.org/packages/ff/96/b0d494defb3346378086848a8ece5ddfd138a66c4a05e038fca873b2518c/pycryptodome-3.20.0-cp35-abi3-macosx_10_9_universal2.whl" } ], "project_name": "pycryptodome", "requires_dists": [], "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7", - "version": "3.19.0" + "version": "3.20.0" }, { "artifacts": [ @@ -3657,18 +4041,18 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "7a1585285aefc5165db81083c3e06363a27448f6b467b3b0f30dbd0ac1f73810", - "url": "https://files.pythonhosted.org/packages/0b/59/289c76e3ebdaa2ce9910b366aea437dbc1e0e602a0a513abca757fc4997a/pylint-3.0.3-py3-none-any.whl" + "hash": "507a5b60953874766d8a366e8e8c7af63e058b26345cfcb5f91f89d987fd6b74", + "url": "https://files.pythonhosted.org/packages/4d/2b/dfcf298607c73c3af47d5a699c3bd84ba580f1b8642a53ba2a53eead7c49/pylint-3.1.0-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "58c2398b0301e049609a8429789ec6edf3aabe9b6c5fec916acd18639c16de8b", - "url": "https://files.pythonhosted.org/packages/24/4f/5ca8d654d69006b3a5d52332e56359448b5c5ce242574a8ff26cb260ac3d/pylint-3.0.3.tar.gz" + "hash": "6a69beb4a6f63debebaab0a3477ecd0f559aa726af4954fc948c51f7a2549e23", + "url": "https://files.pythonhosted.org/packages/35/1c/4a8135f77a4ec8c0a6dc1d4543dd6fee55b36bb8bf629e2bcce8a94763a9/pylint-3.1.0.tar.gz" } ], "project_name": "pylint", "requires_dists": [ - "astroid<=3.1.0-dev0,>=3.0.1", + "astroid<=3.2.0-dev0,>=3.1.0", "colorama>=0.4.5; sys_platform == \"win32\"", "dill>=0.2; python_version < \"3.11\"", "dill>=0.3.6; python_version >= \"3.11\"", @@ -3683,7 +4067,7 @@ "typing-extensions>=3.10.0; python_version < \"3.10\"" ], "requires_python": ">=3.8.0", - "version": "3.0.3" + "version": "3.1.0" }, { "artifacts": [ @@ -3735,278 +4119,278 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "3094c7d2f820eecabadae76bfec02669567bbdd1730eabce10a5764778564f7b", - "url": "https://files.pythonhosted.org/packages/be/a7/b95541846762b858164f5c0a15be7fcc2d00f4225d08bc39f7fcc80cbd22/pymongo-4.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl" + "hash": "bec8e4e88984be157408f1923d25869e1b575c07711cdbdde596f66931800934", + "url": "https://files.pythonhosted.org/packages/07/03/26b2fb17c77ce1d288fc3178f497e6fa00209fe34d5777b67dfd899ffcdd/pymongo-4.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl" }, { "algorithm": "sha256", - "hash": "76013fef1c9cd1cd00d55efde516c154aa169f2bf059b197c263a255ba8a9ddf", - "url": "https://files.pythonhosted.org/packages/00/19/c756203185ec6a8c8ae3d2fb0cc9560dec8ef74c1d935934d448e9f58e11/pymongo-4.6.1-cp38-cp38-manylinux2014_x86_64.whl" + "hash": "c2ad3e5bfcd345c0bfe9af69a82d720860b5b043c1657ffb513c18a0dee19c19", + "url": "https://files.pythonhosted.org/packages/00/07/9b7612de2ac167d1dee7d18fa4e37fa830e7242c3f249f5d824931dcd26d/pymongo-4.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "88beb444fb438385e53dc9110852910ec2a22f0eab7dd489e827038fdc19ed8d", - "url": "https://files.pythonhosted.org/packages/00/5b/52158a2666945f517e000e6cebb70bc7b36971376c6b63683faa2955ae8e/pymongo-4.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "8d0ea740a2faa56f930dc82c5976d96c017ece26b29a1cddafb58721c7aab960", + "url": "https://files.pythonhosted.org/packages/03/34/b5dd2079cc40840ba9730e5471d68a7a64db5c324c6a8b0344fc57a3d352/pymongo-4.6.3-cp39-cp39-manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "3d18a9b9b858ee140c15c5bfcb3e66e47e2a70a03272c2e72adda2482f76a6ad", - "url": "https://files.pythonhosted.org/packages/06/cf/3a324db19429956def624fe4a60119dcac1e1cfa8048250f5ecefcc6171e/pymongo-4.6.1-cp38-cp38-manylinux2014_i686.whl" + "hash": "cd6c15242d9306ff1748681c3235284cbe9f807aeaa86cd17d85e72af626e9a7", + "url": "https://files.pythonhosted.org/packages/0e/ab/2dbf438193bfa14096df53c5792809465c79545b8ede2ea620d528b96608/pymongo-4.6.3-cp39-cp39-manylinux1_i686.whl" }, { "algorithm": "sha256", - "hash": "d0355cff58a4ed6d5e5f6b9c3693f52de0784aa0c17119394e2a8e376ce489d4", - "url": "https://files.pythonhosted.org/packages/06/de/b79272fbe5cef29f86ae2862bdd817cae5dc80034fbd4662b70889d3b9ec/pymongo-4.6.1-cp39-cp39-manylinux2014_i686.whl" + "hash": "8e97c138d811e9367723fcd07c4402a9211caae20479fdd6301d57762778a69f", + "url": "https://files.pythonhosted.org/packages/16/64/6c1cfaa35fc0e3b1617f155b763d0ff3f46e8828e1c475cbe08da40bcdfa/pymongo-4.6.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "9c79d597fb3a7c93d7c26924db7497eba06d58f88f58e586aa69b2ad89fee0f8", - "url": "https://files.pythonhosted.org/packages/09/3e/e47ebf391b282bc575e534c1e2b9e7801a2eb20dd64c7b7ff0b16478d3cf/pymongo-4.6.1-cp39-cp39-manylinux2014_s390x.whl" + "hash": "b3d10bdd46cbc35a2109737d36ffbef32e7420569a87904738ad444ccb7ac2c5", + "url": "https://files.pythonhosted.org/packages/17/65/cffdf807c2d677f51902c69592d3ee730fad1ce345db3fd166bbcf7ff53e/pymongo-4.6.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "a5e641f931c5cd95b376fd3c59db52770e17bec2bf86ef16cc83b3906c054845", - "url": "https://files.pythonhosted.org/packages/0b/53/5217f2d95986040354be3546631316ce940cb276fc68db9103bef9fc1daf/pymongo-4.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "hash": "aa310096450e9c461b7dfd66cbc1c41771fe36c06200440bb3e062b1d4a06b6e", + "url": "https://files.pythonhosted.org/packages/18/a2/029a3c80ff5d371d5d158af2066fd374fa74c7cfdfb1a86e491a4d6e0294/pymongo-4.6.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "f9756f1d25454ba6a3c2f1ef8b7ddec23e5cdeae3dc3c3377243ae37a383db00", - "url": "https://files.pythonhosted.org/packages/0c/0f/c7d9b39a5c19215782efd54ed43195117a86025d6c3af22304d7e2d034fe/pymongo-4.6.1-cp38-cp38-manylinux1_x86_64.whl" + "hash": "c67c19f653053ef2ebd7f1837c2978400058d6d7f66ec5760373a21eaf660158", + "url": "https://files.pythonhosted.org/packages/20/cd/915bb76485635e7e4892466c6518be08c90a4e45140ee29a0d8022ba104e/pymongo-4.6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl" }, { "algorithm": "sha256", - "hash": "3c74f4725485f0a7a3862cfd374cc1b740cebe4c133e0c1425984bcdcce0f4bb", - "url": "https://files.pythonhosted.org/packages/0e/a6/d6fb15531ce8be59b76ea51b33a4fdbd2189dca1d6d418e6f323ef617b65/pymongo-4.6.1-cp39-cp39-manylinux2014_ppc64le.whl" + "hash": "138b9fa18d40401c217bc038a48bcde4160b02d36d8632015b1804971a2eaa2f", + "url": "https://files.pythonhosted.org/packages/2b/f0/bc30f0d9f7f1b3de1eb51ef8ed85378ff237f551c28bf4a23e71cf92aa20/pymongo-4.6.3-cp311-cp311-macosx_10_9_universal2.whl" }, { "algorithm": "sha256", - "hash": "dd1fa413f8b9ba30140de198e4f408ffbba6396864c7554e0867aa7363eb58b2", - "url": "https://files.pythonhosted.org/packages/13/b6/9273418774f5a9cda7f25a93d14d083c0af8f03f814780257264b5220a9d/pymongo-4.6.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + "hash": "ff7d1f449fcad23d9bc8e8dc2b9972be38bcd76d99ea5f7d29b2efa929c2a7ff", + "url": "https://files.pythonhosted.org/packages/34/32/90e6c65123d5439719906c0976de1bf11098f9b69151a2f0baf54cd4e4c9/pymongo-4.6.3-cp39-cp39-manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "27b81ecf18031998ad7db53b960d1347f8f29e8b7cb5ea7b4394726468e4295e", - "url": "https://files.pythonhosted.org/packages/1d/5c/93d489be8db5380a145ddf04744f28ca14546a0f7fd8224465e5fb3ce2de/pymongo-4.6.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "e097f877de4d6af13a33ef938bf2a2350f424be5deabf8b857da95f5b080487a", + "url": "https://files.pythonhosted.org/packages/37/be/879d8bec367c2690d15b31a29461b54419481505c34f51bdfa6cae7c983a/pymongo-4.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "31dab1f3e1d0cdd57e8df01b645f52d43cc1b653ed3afd535d2891f4fc4f9712", - "url": "https://files.pythonhosted.org/packages/1d/f0/b5fcf9aee64ac3650a3df3bd1d7e8870838a82944fa4868768ab9db5416a/pymongo-4.6.1.tar.gz" + "hash": "0e208f2ab7b495eff8fd175022abfb0abce6307ac5aee3f4de51fc1a459b71c9", + "url": "https://files.pythonhosted.org/packages/38/92/adea29f9f09cce0ab733b01a936ba7dbe5a617f6cf07f9a92b95c5b5e92f/pymongo-4.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "6a0ae7a48a6ef82ceb98a366948874834b86c84e288dbd55600c1abfc3ac1d88", - "url": "https://files.pythonhosted.org/packages/1f/3f/b2e3e18b75d5d42e79939da187efff5ed5aac6a1cc9c0ba21bbe610a33b2/pymongo-4.6.1-cp311-cp311-macosx_10_9_universal2.whl" + "hash": "6de33f1b2eed91b802ec7abeb92ffb981d052f3604b45588309aae9e0f6e3c02", + "url": "https://files.pythonhosted.org/packages/3a/fe/3da29df3b50deaf3faa00591882d29dcdf2bd89c54a20072a2c6c715a638/pymongo-4.6.3-cp39-cp39-manylinux1_x86_64.whl" }, { "algorithm": "sha256", - "hash": "6a1810c2cbde714decf40f811d1edc0dae45506eb37298fd9d4247b8801509fe", - "url": "https://files.pythonhosted.org/packages/20/6f/a92effb4b69f1287f2910a0f854dcb12d690f61b5e53f4889f5a7202762c/pymongo-4.6.1-cp39-cp39-manylinux1_x86_64.whl" + "hash": "c701de8e483fb5e53874aab642235361aac6de698146b02c644389eaa8c137b6", + "url": "https://files.pythonhosted.org/packages/43/b2/cfae3b3a19af88b8141677dc95a6c2b3e4a7da729a6816580c93a81f0c03/pymongo-4.6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl" }, { "algorithm": "sha256", - "hash": "2dd2f6960ee3c9360bed7fb3c678be0ca2d00f877068556785ec2eb6b73d2414", - "url": "https://files.pythonhosted.org/packages/21/9e/0386d0ee8dc7475901184d539742ded2c0382ef06a25c78b05a643af3d0e/pymongo-4.6.1-cp310-cp310-manylinux2014_ppc64le.whl" + "hash": "7df8b166d3db6cfead4cf55b481408d8f0935d8bd8d6dbf64507c49ef82c7200", + "url": "https://files.pythonhosted.org/packages/45/bc/376db78dfc82bb850c418a389f58a09e8f0a072549090bc76ff1735bff1b/pymongo-4.6.3-cp38-cp38-manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "061598cbc6abe2f382ab64c9caa83faa2f4c51256f732cdd890bcc6e63bfb67e", - "url": "https://files.pythonhosted.org/packages/2c/e1/dad12b6b78b553ec7d44dd61b86c83a64f0d8bdc13c4eb728dd8cd5ff94c/pymongo-4.6.1-cp38-cp38-macosx_11_0_universal2.whl" + "hash": "4d167d546352869125dc86f6fda6dffc627d8a9c8963eaee665825f2520d542b", + "url": "https://files.pythonhosted.org/packages/54/1a/fbd9feec63ccc6622e86926cfbb806743c850a9f303d6d0b85e01094ed38/pymongo-4.6.3-cp38-cp38-macosx_11_0_universal2.whl" }, { "algorithm": "sha256", - "hash": "e470fa4bace5f50076c32f4b3cc182b31303b4fefb9b87f990144515d572820b", - "url": "https://files.pythonhosted.org/packages/36/b3/16bca48079427c9677ff5695c0a3d7233469b29eeae8611fb716b25abafc/pymongo-4.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "7ee79e02a7c5ed34706ecb5dad19e6c7d267cf86d28c075ef3127c58f3081279", + "url": "https://files.pythonhosted.org/packages/5a/09/2abfa1d865627e2b900623bb9b1f9a8c52a57dee692a50b927f3549dac47/pymongo-4.6.3-cp38-cp38-manylinux1_x86_64.whl" }, { "algorithm": "sha256", - "hash": "c30a9e06041fbd7a7590693ec5e407aa8737ad91912a1e70176aff92e5c99d20", - "url": "https://files.pythonhosted.org/packages/3a/9e/d94d2fb0676e0aa73ce31231095d3c5ce06bbb635b9f16b3db4b216e5b36/pymongo-4.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "e4056bc421d4df2c61db4e584415f2b0f1eebb92cbf9222f7f38303467c37117", + "url": "https://files.pythonhosted.org/packages/5b/0b/ee67d43eb5e5c6caef87fbd9bbb1201d655cb6f7eb8aa505e0b326fd37ca/pymongo-4.6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "56816e43c92c2fa8c11dc2a686f0ca248bea7902f4a067fa6cbc77853b0f041e", - "url": "https://files.pythonhosted.org/packages/3c/b0/082730a898389b56acdcff3c615907863ed58d1cba391aaa430087cfc953/pymongo-4.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "872bad5c83f7eec9da11e1fef5f858c6a4c79fe4a83c7780e7b0fe95d560ae3f", + "url": "https://files.pythonhosted.org/packages/62/ca/26b035ee50570a792269653ae91514fd25a843f540cf2b1c2ed385bae8e7/pymongo-4.6.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" }, { "algorithm": "sha256", - "hash": "349093675a2d3759e4fb42b596afffa2b2518c890492563d7905fac503b20daa", - "url": "https://files.pythonhosted.org/packages/46/d0/cdade09b3fec6dc665b299a01b17aaea58122ccdb1d8b4796d91e12bc099/pymongo-4.6.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" + "hash": "664c64b6bdb31aceb80f0556951e5e2bf50d359270732268b4e7af00a1cf5d6c", + "url": "https://files.pythonhosted.org/packages/68/b4/68558867e6108d90db35bbbd55610e4c8e6f0c9d1fec9a2b4e5246ec5c4d/pymongo-4.6.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "262356ea5fcb13d35fb2ab6009d3927bafb9504ef02339338634fffd8a9f1ae4", - "url": "https://files.pythonhosted.org/packages/48/32/1e4dad05269fa6d1b3dc287008ef20b21dd6a9807a6f2f0aa94f6dc49b8c/pymongo-4.6.1-cp310-cp310-manylinux2014_i686.whl" + "hash": "731a92dfc4022db763bfa835c6bd160f2d2cba6ada75749c2ed500e13983414b", + "url": "https://files.pythonhosted.org/packages/6d/0c/6b71fc608ee1bd8191757efb61834053ccfcb260b65d5d66964ca5292cc0/pymongo-4.6.3-cp310-cp310-manylinux1_i686.whl" }, { "algorithm": "sha256", - "hash": "1c5654bb8bb2bdb10e7a0bc3c193dd8b49a960b9eebc4381ff5a2043f4c3c441", - "url": "https://files.pythonhosted.org/packages/4a/47/3de335c43f08b2cbc30c0215008b41fe436c95ad3410ce05d2bc786aa74e/pymongo-4.6.1-cp310-cp310-manylinux1_i686.whl" + "hash": "400074090b9a631f120b42c61b222fd743490c133a5d2f99c0208cefcccc964e", + "url": "https://files.pythonhosted.org/packages/6f/5d/b05b09299f0b03219db9e31ea404e89c056f55a0aafbb403f6710391c44d/pymongo-4.6.3.tar.gz" }, { "algorithm": "sha256", - "hash": "e2aced6fb2f5261b47d267cb40060b73b6527e64afe54f6497844c9affed5fd0", - "url": "https://files.pythonhosted.org/packages/4e/21/b551e55e392f2dc8e85a8b8d727966747deb5ca1240e0eb946736b3a49cd/pymongo-4.6.1-cp39-cp39-manylinux2014_aarch64.whl" + "hash": "e344d0afdd7c06c1f1e66a4736593293f432defc2191e6b411fc9c82fa8c5adc", + "url": "https://files.pythonhosted.org/packages/70/0b/94b7ac6ecab09ef1afe904292a4fda92341d5c6ab4bc74d349c5142f186a/pymongo-4.6.3-cp310-cp310-macosx_10_9_universal2.whl" }, { "algorithm": "sha256", - "hash": "1ed23b0e2dac6f84f44c8494fbceefe6eb5c35db5c1099f56ab78fc0d94ab3af", - "url": "https://files.pythonhosted.org/packages/4f/17/eae7b0a289ca0e9bfde9394f3f709c6892c13d1f743ca981c0a3c49d50c7/pymongo-4.6.1-cp38-cp38-manylinux2014_aarch64.whl" + "hash": "9757602fb45c8ecc1883fe6db7c59c19d87eb3c645ec9342d28a6026837da931", + "url": "https://files.pythonhosted.org/packages/78/b9/952ebbf48bd37846ab5a256932bbd6509d86515e3f77975abc5439f40590/pymongo-4.6.3-cp38-cp38-manylinux2014_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "eaf2f65190c506def2581219572b9c70b8250615dc918b3b7c218361a51ec42e", - "url": "https://files.pythonhosted.org/packages/52/1f/098291f236e8319113855787056ac870585dcf747a214b4180e67818a5db/pymongo-4.6.1-cp310-cp310-manylinux2014_aarch64.whl" + "hash": "c4726e36a2f7e92f09f5b8e92ba4db7525daffe31a0dcbcf0533edc0ade8c7d8", + "url": "https://files.pythonhosted.org/packages/7a/06/b94ab5df85cce366f9535d0d36a716d44e1ec2647bd0774698285d426492/pymongo-4.6.3-cp310-cp310-manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "d4c2be9760b112b1caf649b4977b81b69893d75aa86caf4f0f398447be871f3c", - "url": "https://files.pythonhosted.org/packages/5a/d5/c5b3a4ca6c6da693551a85af38daba311dfc7e792a5c0320670066c089f1/pymongo-4.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl" + "hash": "ccc15a7c7a99aed7d0831eaf78a607f1db0c7a255f96e3d18984231acd72f70c", + "url": "https://files.pythonhosted.org/packages/7c/68/bb521d2f027d528e38bf03365b610b6b28a13fa875b4f0e51a485f7a1e55/pymongo-4.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "3cadf7f4c8e94d8a77874b54a63c80af01f4d48c4b669c8b6867f86a07ba994f", - "url": "https://files.pythonhosted.org/packages/5e/7f/3b98c0a7c2c3fac7182c7b6de07cde3975f381e63dc5512c0136bc1888a6/pymongo-4.6.1-cp310-cp310-manylinux2014_x86_64.whl" + "hash": "d30d5d7963453b478016bf7b0d87d7089ca24d93dbdecfbc9aa32f1b4772160a", + "url": "https://files.pythonhosted.org/packages/86/3a/39bdf2351fc3a0296157d7416b4c1f783f4b602066d54d66299862d106a0/pymongo-4.6.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "8ec75f35f62571a43e31e7bd11749d974c1b5cd5ea4a8388725d579263c0fdf6", - "url": "https://files.pythonhosted.org/packages/5f/47/2d6e1ef9535a44ed7c0a9e297791f56d77fcfdc4a0128fa91392e8d5d422/pymongo-4.6.1-cp39-cp39-manylinux2014_x86_64.whl" + "hash": "75107a386d4ccf5291e75cce8ca3898430e7907f4cc1208a17c9efad33a1ea84", + "url": "https://files.pythonhosted.org/packages/86/e4/8ac4c48c80cc999c4e91f8452c4f79f92ecc6cc50f7097177f9d4df1f608/pymongo-4.6.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "154b361dcb358ad377d5d40df41ee35f1cc14c8691b50511547c12404f89b5cb", - "url": "https://files.pythonhosted.org/packages/5f/73/f5fd9926ad01b3a1a0c433a7abbbe40d519fd961ae5a163838ce34ffbac7/pymongo-4.6.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + "hash": "9e51e30d67b468a2a634ade928b30cb3e420127f148a9aec60de33f39087bdc4", + "url": "https://files.pythonhosted.org/packages/87/cb/5f8ef497d5f87c9d2208319b137746cb0eb01c677650f7838ff96e78a2f2/pymongo-4.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl" }, { "algorithm": "sha256", - "hash": "2940aa20e9cc328e8ddeacea8b9a6f5ddafe0b087fedad928912e787c65b4909", - "url": "https://files.pythonhosted.org/packages/61/26/48c3541bfee3dbd70e5b5e4e4579851ee1572ccf2cfe290617020f3f9c4f/pymongo-4.6.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" + "hash": "4955be64d943b30f2a7ff98d818ca530f7cb37450bc6b32c37e0e74821907ef8", + "url": "https://files.pythonhosted.org/packages/8d/97/545293b52ff506c10c172ea6615dcc8e3e3de46329ae247c0fadf396c29e/pymongo-4.6.3-cp310-cp310-manylinux2014_s390x.whl" }, { "algorithm": "sha256", - "hash": "2d4ccac3053b84a09251da8f5350bb684cbbf8c8c01eda6b5418417d0a8ab198", - "url": "https://files.pythonhosted.org/packages/65/13/396caadc36802023eaa84c966bd49abeea2e26d304d713b996342054d2e5/pymongo-4.6.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + "hash": "becfa816545a48c8e740ac2fd624c1c121e1362072d68ffcf37a6b1be8ea187e", + "url": "https://files.pythonhosted.org/packages/8f/72/b57f4e117c625662b34ddb00a6c31b6d01f87afcba7c12760cdff88fd699/pymongo-4.6.3-cp39-cp39-manylinux2014_s390x.whl" }, { "algorithm": "sha256", - "hash": "5ec31adc2e988fd7db3ab509954791bbc5a452a03c85e45b804b4bfc31fa221d", - "url": "https://files.pythonhosted.org/packages/68/f3/f0909bd0498c1e34d9fbdc432feb55cb25d58aeb1a2022be9827afabdc61/pymongo-4.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "705a9bfd619301ee7e985d6f91f68b15dfcb2f6f36b8cc225cc82d4260d2bce5", + "url": "https://files.pythonhosted.org/packages/92/b6/46bc46551be42ce533ea2d051dc01a0397cf11b2c2df29c719f2f28c6074/pymongo-4.6.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "010bc9aa90fd06e5cc52c8fac2c2fd4ef1b5f990d9638548dde178005770a5e8", - "url": "https://files.pythonhosted.org/packages/6b/74/0299630943029991b8425072ce6fd81d9fd1142c1c8c560a227efee82d75/pymongo-4.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "dde9fb6e105ce054339256a8b7a9775212ebb29596ef4e402d7bbc63b354d202", + "url": "https://files.pythonhosted.org/packages/96/96/b9295752c36a339c84069001c672182b9adf3721171aa71367e4dace55d2/pymongo-4.6.3-cp38-cp38-manylinux2014_s390x.whl" }, { "algorithm": "sha256", - "hash": "9167e735379ec43d8eafa3fd675bfbb12e2c0464f98960586e9447d2cf2c7a83", - "url": "https://files.pythonhosted.org/packages/6d/27/71bf4a56683944e1bf3321cb70bda7ad0727452d79edf9c86668796d8993/pymongo-4.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "4a0660ce32d8459b7f12dc3ca0141528fead62d3cce31b548f96f30902074cc0", + "url": "https://files.pythonhosted.org/packages/9a/61/f415d2a0f04bed261122f75309ed6384c241834335f7ea7c0e7d2309739c/pymongo-4.6.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl" }, { "algorithm": "sha256", - "hash": "8d219b4508f71d762368caec1fc180960569766049bbc4d38174f05e8ef2fe5b", - "url": "https://files.pythonhosted.org/packages/6d/7c/dadb62a8e7b92eacc19a36c3809c9349951c438d91ce11acff13da4c2d92/pymongo-4.6.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl" + "hash": "17c1c143ba77d6e21fc8b48e93f0a5ed982a23447434e9ee4fbb6d633402506b", + "url": "https://files.pythonhosted.org/packages/9b/8d/d3da42d421463550a9e2927ed210c8d8795a2893839c3dd0deed3fdcbb0d/pymongo-4.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "1f2b856518bfcfa316c8dae3d7b412aecacf2e8ba30b149f5eb3b63128d703b9", - "url": "https://files.pythonhosted.org/packages/73/d6/a8e1199db917103d708df45dbe297c10235dc3d5c33ed61aefe7a3599bab/pymongo-4.6.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl" + "hash": "5c8a4982f5eb767c6fbfb8fb378683d09bcab7c3251ba64357eef600d43f6c23", + "url": "https://files.pythonhosted.org/packages/9c/94/55367f20394d32e8497458b71215c80cb0af92a50ffb71db34525b37cacd/pymongo-4.6.3-cp39-cp39-manylinux2014_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "d483793a384c550c2d12cb794ede294d303b42beff75f3b3081f57196660edaf", - "url": "https://files.pythonhosted.org/packages/7d/63/e33d2af602efe9e7b66a14710817db7744527c92a07fe5d68436b25f5e63/pymongo-4.6.1-cp38-cp38-manylinux1_i686.whl" + "hash": "60931b0e07448afe8866ffff764cd5bf4b1a855dc84c7dcb3974c6aa6a377a59", + "url": "https://files.pythonhosted.org/packages/a3/18/1023fbf4882f04495faca58795d3d50bda565c1dc173b7201380af3c20e8/pymongo-4.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "d8e62d06e90f60ea2a3d463ae51401475568b995bafaffd81767d208d84d7bb1", - "url": "https://files.pythonhosted.org/packages/7d/fc/f33053d64272f75339fd92497026f102475b0fe99b8bbf6c69da6e944f7a/pymongo-4.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "2ef1b4992ee1cb8bb16745e70afa0c02c5360220a7a8bb4775888721f052d0a6", + "url": "https://files.pythonhosted.org/packages/af/5e/79a477afd4fec46fdb54bc4b97b8009418c872c70038ea2ac83a5cda37e4/pymongo-4.6.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl" }, { "algorithm": "sha256", - "hash": "c258dbacfff1224f13576147df16ce3c02024a0d792fd0323ac01bed5d3c545d", - "url": "https://files.pythonhosted.org/packages/84/23/0643b3efa87f3715cd179fd8fbb626bebeb282785e2dd728bbe4eae376ab/pymongo-4.6.1-cp38-cp38-manylinux2014_ppc64le.whl" + "hash": "6b5aec78aa4840e8d6c3881900259892ab5733a366696ca10d99d68c3d73eaaf", + "url": "https://files.pythonhosted.org/packages/b1/a2/b49ae5dd844cb73162f5febe8d07a1588aeac02298f3edcbaffeaae689a5/pymongo-4.6.3-cp38-cp38-manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "9aafd036f6f2e5ad109aec92f8dbfcbe76cff16bad683eb6dd18013739c0b3ae", - "url": "https://files.pythonhosted.org/packages/89/ea/4fcb0f7156aaab44f8c91690bd63050a9b6826b23bf265ce8354ee310378/pymongo-4.6.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + "hash": "eaf3d594ebfd5e1f3503d81e06a5d78e33cda27418b36c2491c3d4ad4fca5972", + "url": "https://files.pythonhosted.org/packages/c3/b1/331a922ed1b4c0b153fef943feb63f4a0568949be443682ba1ea9348f8a2/pymongo-4.6.3-cp38-cp38-manylinux1_i686.whl" }, { "algorithm": "sha256", - "hash": "69247f7a2835fc0984bbf0892e6022e9a36aec70e187fcfe6cae6a373eb8c4de", - "url": "https://files.pythonhosted.org/packages/90/dc/50134dee1df0e3904d8a0bff40b6b455bb47e582b6e087f1df43ddf1e399/pymongo-4.6.1-cp39-cp39-macosx_10_9_universal2.whl" + "hash": "00e6cfce111883ca63a3c12878286e0b89871f4b840290e61fb6f88ee0e687be", + "url": "https://files.pythonhosted.org/packages/c8/f8/584232059efaaadeb9cb4a66a552653c64c650a8aac9f9c6871163e26f81/pymongo-4.6.3-cp310-cp310-manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "1461199b07903fc1424709efafe379205bf5f738144b1a50a08b0396357b5abf", - "url": "https://files.pythonhosted.org/packages/93/f2/c938cf8897e090bc0257ebff44bb554a043e0d598621de48c981cc644b19/pymongo-4.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl" + "hash": "14a82593528cddc93cfea5ee78fac95ae763a3a4e124ca79ee0b24fbbc6da1c9", + "url": "https://files.pythonhosted.org/packages/d0/d9/b89db700186dc65bae5b1c4e7ee0f7ab6ce3f2a9c9f62c65447944d8ad6f/pymongo-4.6.3-cp39-cp39-macosx_10_9_universal2.whl" }, { "algorithm": "sha256", - "hash": "3f0e6a6c807fa887a0c51cc24fe7ea51bb9e496fe88f00d7930063372c3664c3", - "url": "https://files.pythonhosted.org/packages/9f/3e/50e2e44f2292cdb5eeb8e599a8a79aacc30a7bd84343c85e6983eaa1f68e/pymongo-4.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "hash": "ebcc145c74d06296ce0cad35992185064e5cb2aadef719586778c144f0cd4d37", + "url": "https://files.pythonhosted.org/packages/d1/8a/26c1bb515c3ce84973d940bbba51f3879987db1916632db65d44d6cf4930/pymongo-4.6.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" }, { "algorithm": "sha256", - "hash": "bbed8cccebe1169d45cedf00461b2842652d476d2897fd1c42cf41b635d88746", - "url": "https://files.pythonhosted.org/packages/a8/e4/4aed690240649ad7f76476bb8e4af0307266b6ffdd7ccf2db01dcd0de493/pymongo-4.6.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl" + "hash": "cc7a26edf79015c58eea46feb5b262cece55bc1d4929a8a9e0cbe7e6d6a9b0eb", + "url": "https://files.pythonhosted.org/packages/d3/bb/673ce2c150ab75f3b2b78ca7837f38fb34b6f65cf82ead4b9c83020916e7/pymongo-4.6.3-cp310-cp310-manylinux2014_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "4344c30025210b9fa80ec257b0e0aab5aa1d5cca91daa70d82ab97b482cc038e", - "url": "https://files.pythonhosted.org/packages/aa/7f/299ed794c9ee9200c38fe195bcc1976752b1b2f5954faa6d3ed8fedb5688/pymongo-4.6.1-cp310-cp310-macosx_10_9_universal2.whl" + "hash": "af5c5112db04cf62a5d9d224a24f289aaecb47d152c08a457cca81cee061d5bd", + "url": "https://files.pythonhosted.org/packages/d3/c6/aefd5e7249d3034c2e3ccf876343219f2aa47e3595ab6efef8e4a79204e5/pymongo-4.6.3-cp38-cp38-manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "e438417ce1dc5b758742e12661d800482200b042d03512a8f31f6aaa9137ad40", - "url": "https://files.pythonhosted.org/packages/b6/73/f23e84f56dd7c22d0bd53a1d6b653d04d77b7a6e3958b48c74d014c9bd47/pymongo-4.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "hash": "f4330c022024e7994b630199cdae909123e4b0e9cf15335de71b146c0f6a2435", + "url": "https://files.pythonhosted.org/packages/d4/fe/70f5a2bf64ab3353bed4487b7f6ac8f6ca90b65dcb9f10e193f4135d9f9e/pymongo-4.6.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl" }, { "algorithm": "sha256", - "hash": "55dac73316e7e8c2616ba2e6f62b750918e9e0ae0b2053699d66ca27a7790105", - "url": "https://files.pythonhosted.org/packages/c2/0e/98986c3f88615c4c6ee04f05d0b1fe4ad8c83b5ee40100e2f8a98f7315ba/pymongo-4.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "hash": "53451190b8628e1ce7d1fe105dc376c3f10705127bd3b51fe3e107b9ff1851e6", + "url": "https://files.pythonhosted.org/packages/dc/9e/cda4b45a2d3db76be61a63b0246fcb4202fba3be1ed4906c4c068acee739/pymongo-4.6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "5bd94c503271e79917b27c6e77f7c5474da6930b3fb9e70a12e68c2dff386b9a", - "url": "https://files.pythonhosted.org/packages/c7/12/a1bbb6c035139f9eb2560e16f521017b6a444a5205d5a06e252b60e959a4/pymongo-4.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "hash": "9b35f8bded43ff91475305445fedf0613f880ff7e25c75ae1028e1260a9b7a86", + "url": "https://files.pythonhosted.org/packages/e0/e6/85a4776b85e58c6cb223bed574ff8c5f887feb31f98c1cf4aa91001d2c81/pymongo-4.6.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "8b47ebd89e69fbf33d1c2df79759d7162fc80c7652dacfec136dae1c9b3afac7", - "url": "https://files.pythonhosted.org/packages/d9/63/afdec16bf24ceaa92bb81626ebad5e629c1078b8577e3e585c7e094829fb/pymongo-4.6.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + "hash": "0182899aafe830f25cf96c5976d724efeaaf7b6646c15424ad8dd25422b2efe1", + "url": "https://files.pythonhosted.org/packages/e1/03/5efaff98699c33ced7924bfe62a75ab2570c2f27f295c67a29c1eadb69b5/pymongo-4.6.3-cp39-cp39-manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "ff925f1cca42e933376d09ddc254598f8c5fcd36efc5cac0118bb36c36217c41", - "url": "https://files.pythonhosted.org/packages/e1/1a/c878436cc8098b2ec947293c8c9c8c5988a033d6996c364076ced6fddb50/pymongo-4.6.1-cp310-cp310-manylinux2014_s390x.whl" + "hash": "01277a7e183c59081368e4efbde2b8f577014431b257959ca98d3a4e8682dd51", + "url": "https://files.pythonhosted.org/packages/e2/35/4b18e02232a86e7cb4ac478af78d33e3528182965e39c6d4dcac55284802/pymongo-4.6.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "7bb0e9049e81def6829d09558ad12d16d0454c26cabe6efc3658e544460688d9", - "url": "https://files.pythonhosted.org/packages/e4/8c/30096d46d706a1b2fcb32a8835bd38e14ae069ecbead67b6dee50918f643/pymongo-4.6.1-cp39-cp39-manylinux1_i686.whl" + "hash": "722f2b709b63311c0efda4fa4c603661faa4bec6bad24a6cc41a3bc6d841bf09", + "url": "https://files.pythonhosted.org/packages/e3/2a/2618a4b06f171898567afcbea35e38b3331888bdc75ed0326722974186b4/pymongo-4.6.3-cp312-cp312-macosx_10_9_universal2.whl" }, { "algorithm": "sha256", - "hash": "f7acc03a4f1154ba2643edeb13658d08598fe6e490c3dd96a241b94f09801626", - "url": "https://files.pythonhosted.org/packages/e9/2f/f378ad5d6842d6f9eaca384e450d319f6208636eea855f68f298a7cd4c77/pymongo-4.6.1-cp38-cp38-manylinux2014_s390x.whl" + "hash": "391aea047bba928006114282f175bc8d09c53fe1b7d8920bf888325e229302fe", + "url": "https://files.pythonhosted.org/packages/e3/33/1e9c21c045dd1a5e13ba3f7fbf2675c5c8d03abd97bac987dfa31798e897/pymongo-4.6.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" }, { "algorithm": "sha256", - "hash": "b435b13bb8e36be11b75f7384a34eefe487fe87a6267172964628e2b14ecf0a7", - "url": "https://files.pythonhosted.org/packages/f0/7e/076144a8deaf9ad41411852be2d65fbb033e899bfd297975496acc5bc7be/pymongo-4.6.1-cp312-cp312-macosx_10_9_universal2.whl" + "hash": "994386a4d6ad39e18bcede6dc8d1d693ec3ed897b88f86b1841fbc37227406da", + "url": "https://files.pythonhosted.org/packages/e9/e0/282c46bb31f5a0b548153bd0f42a932765b217ac88e4b5e2f1fbad5eef07/pymongo-4.6.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "ef801027629c5b511cf2ba13b9be29bfee36ae834b2d95d9877818479cdc99ea", - "url": "https://files.pythonhosted.org/packages/f5/06/33ce5c8483ad04059ccf80335a25cf21d85241086761a7ac75f9d4824a0e/pymongo-4.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl" + "hash": "5f465cca9b178e7bb782f952dd58e9e92f8ba056e585959465f2bb50feddef5f", + "url": "https://files.pythonhosted.org/packages/eb/8f/a86037dd355426c83435c950e41ad490298f439640c40e05c7e9a8d391e1/pymongo-4.6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "b8729dbf25eb32ad0dc0b9bd5e6a0d0b7e5c2dc8ec06ad171088e1896b522a74", - "url": "https://files.pythonhosted.org/packages/fd/65/f0836d12525b73a2b3f0bd5201b2fe15c22bcca1ea0a9615014b2f6e51d6/pymongo-4.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "af039afc6d787502c02089759778b550cb2f25dbe2780f5b050a2e37031c3fbf", + "url": "https://files.pythonhosted.org/packages/f4/87/8d12b7d2179368ae786c0e898a9751aac4d378b8e3a4d2d26826b53ef12e/pymongo-4.6.3-cp310-cp310-manylinux2014_x86_64.whl" } ], "project_name": "pymongo", @@ -4028,7 +4412,7 @@ "zstandard; extra == \"zstd\"" ], "requires_python": ">=3.7", - "version": "4.6.1" + "version": "4.6.3" }, { "artifacts": [ @@ -4059,13 +4443,13 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb", - "url": "https://files.pythonhosted.org/packages/39/92/8486ede85fcc088f1b3dba4ce92dd29d126fd96b0008ea213167940a2475/pyparsing-3.1.1-py3-none-any.whl" + "hash": "f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742", + "url": "https://files.pythonhosted.org/packages/9d/ea/6d76df31432a0e6fdf81681a895f009a4bb47b3c39036db3e1b528191d52/pyparsing-3.1.2-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db", - "url": "https://files.pythonhosted.org/packages/37/fe/65c989f70bd630b589adfbbcd6ed238af22319e90f059946c26b4835e44b/pyparsing-3.1.1.tar.gz" + "hash": "a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad", + "url": "https://files.pythonhosted.org/packages/46/3a/31fd28064d016a2182584d579e033ec95b809d8e220e74c4af6f0f2e8842/pyparsing-3.1.2.tar.gz" } ], "project_name": "pyparsing", @@ -4074,19 +4458,19 @@ "railroad-diagrams; extra == \"diagrams\"" ], "requires_python": ">=3.6.8", - "version": "3.1.1" + "version": "3.1.2" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac", - "url": "https://files.pythonhosted.org/packages/f3/8c/f16efd81ca8e293b2cc78f111190a79ee539d0d5d36ccd49975cb3beac60/pytest-7.4.3-py3-none-any.whl" + "hash": "b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8", + "url": "https://files.pythonhosted.org/packages/51/ff/f6e8b8f39e08547faece4bd80f89d5a8de68a38b2d179cc1c4490ffa3286/pytest-7.4.4-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5", - "url": "https://files.pythonhosted.org/packages/38/d4/174f020da50c5afe9f5963ad0fc5b56a4287e3586e3de5b3c8bce9c547b4/pytest-7.4.3.tar.gz" + "hash": "2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280", + "url": "https://files.pythonhosted.org/packages/80/1f/9d8e98e4133ffb16c90f3b405c43e38d3abb715bb5d7a63a5a684f7e46a3/pytest-7.4.4.tar.gz" } ], "project_name": "pytest", @@ -4109,7 +4493,7 @@ "xmlschema; extra == \"testing\"" ], "requires_python": ">=3.7", - "version": "7.4.3" + "version": "7.4.4" }, { "artifacts": [ @@ -4211,13 +4595,13 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9", - "url": "https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl" + "hash": "a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", + "url": "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", - "url": "https://files.pythonhosted.org/packages/4c/c4/13b4776ea2d76c115c1d1b84579f3764ee6d57204f6be27119f13a61d0a9/python-dateutil-2.8.2.tar.gz" + "hash": "37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", + "url": "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz" } ], "project_name": "python-dateutil", @@ -4225,7 +4609,7 @@ "six>=1.5" ], "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7", - "version": "2.8.2" + "version": "2.9.0.post0" }, { "artifacts": [ @@ -4279,36 +4663,36 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7", - "url": "https://files.pythonhosted.org/packages/32/4d/aaf7eff5deb402fd9a24a1449a8119f00d74ae9c2efa79f8ef9994261fc2/pytz-2023.3.post1-py2.py3-none-any.whl" + "hash": "328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319", + "url": "https://files.pythonhosted.org/packages/9c/3d/a121f284241f08268b21359bd425f7d4825cffc5ac5cd0e1b3d82ffd2b10/pytz-2024.1-py2.py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b", - "url": "https://files.pythonhosted.org/packages/69/4f/7bf883f12ad496ecc9514cd9e267b29a68b3e9629661a2bbc24f80eff168/pytz-2023.3.post1.tar.gz" + "hash": "2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812", + "url": "https://files.pythonhosted.org/packages/90/26/9f1f00a5d021fff16dee3de13d43e5e978f3d58928e129c3a62cf7eb9738/pytz-2024.1.tar.gz" } ], "project_name": "pytz", "requires_dists": [], "requires_python": null, - "version": "2023.3.post1" + "version": "2024.1" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "ed4802971884ae19d640775ba3b03aa2e7bd5e8fb8dfaed2decce4d0fc48391f", - "url": "https://files.pythonhosted.org/packages/0b/34/a01250ac1fc9bf9161e07956d2d580413106ce02d5591470130a25c599e3/redis-5.0.1-py3-none-any.whl" + "hash": "5da9b8fe9e1254293756c16c008e8620b3d15fcc6dde6babde9541850e72a32d", + "url": "https://files.pythonhosted.org/packages/bb/f1/a384c5582d9a28e4a02eb1a2c279668053dd09aafeb08d2bd4dd323fc466/redis-5.0.3-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "0dab495cd5753069d3bc650a0dde8a8f9edde16fc5691b689a566eda58100d0f", - "url": "https://files.pythonhosted.org/packages/4a/4c/3c3b766f4ecbb3f0bec91ef342ee98d179e040c25b6ecc99e510c2570f2a/redis-5.0.1.tar.gz" + "hash": "4973bae7444c0fbed64a06b87446f79361cb7e4ec1538c022d696ed7a5015580", + "url": "https://files.pythonhosted.org/packages/eb/fc/8e822fd1e0a023c5ff80ca8c469b1d854c905ebb526ba38a90e7487c9897/redis-5.0.3.tar.gz" } ], "project_name": "redis", "requires_dists": [ - "async-timeout>=4.0.2; python_full_version <= \"3.11.2\"", + "async-timeout>=4.0.3; python_full_version < \"3.11.3\"", "cryptography>=36.0.1; extra == \"ocsp\"", "hiredis>=1.0.0; extra == \"hiredis\"", "importlib-metadata>=1.0; python_version < \"3.8\"", @@ -4317,7 +4701,7 @@ "typing-extensions; python_version < \"3.8\"" ], "requires_python": ">=3.7", - "version": "5.0.1" + "version": "5.0.3" }, { "artifacts": [ @@ -4348,13 +4732,13 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5", - "url": "https://files.pythonhosted.org/packages/6f/bb/5deac77a9af870143c684ab46a7934038a53eb4aa975bc0687ed6ca2c610/requests_oauthlib-1.3.1-py2.py3-none-any.whl" + "hash": "7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", + "url": "https://files.pythonhosted.org/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a", - "url": "https://files.pythonhosted.org/packages/95/52/531ef197b426646f26b53815a7d2a67cb7a331ef098bb276db26a68ac49f/requests-oauthlib-1.3.1.tar.gz" + "hash": "b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9", + "url": "https://files.pythonhosted.org/packages/42/f2/05f29bc3913aea15eb670be136045bf5c5bbf4b99ecb839da9b422bb2c85/requests-oauthlib-2.0.0.tar.gz" } ], "project_name": "requests-oauthlib", @@ -4363,8 +4747,8 @@ "oauthlib[signedtoken]>=3.0.0; extra == \"rsa\"", "requests>=2.0.0" ], - "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7", - "version": "1.3.1" + "requires_python": ">=3.4", + "version": "2.0.0" }, { "artifacts": [ @@ -4420,13 +4804,13 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "2d28eb930dc16ad9499efa0e5f10ddfb98440ab553783426930ff98b0b391917", - "url": "https://files.pythonhosted.org/packages/e2/5e/605ba7631fdcbad18134a0f11e4420550d6b66ae526c82d1ce38950fdf9e/scriv-1.5.0-py2.py3-none-any.whl" + "hash": "a3adc657733b4124fcb54527a5f3daab0d3c300de82d0fd2b9b297b243151b78", + "url": "https://files.pythonhosted.org/packages/3e/e6/cf5c273f57ded9dd0b22430eb62c2af3c883578bab0d824700355f4c16b2/scriv-1.5.1-py2.py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "f8e4d61439c7085d9bc5053c7fb0df50b606d5c03db4e642b0d44f74aa1b9ecf", - "url": "https://files.pythonhosted.org/packages/f2/b3/ef1f91964a092d7f9970c589d824b10d85da874400909f18e62165760af5/scriv-1.5.0.tar.gz" + "hash": "30ae9ff8d144f8e0cf394c4e1d379542f1b3823767642955b54ec40dc00b32b6", + "url": "https://files.pythonhosted.org/packages/56/35/6e05af688bc3f983a207a6f89acf139aa16693473360d0cbc2a9bda19efc/scriv-1.5.1.tar.gz" } ], "project_name": "scriv", @@ -4441,7 +4825,7 @@ "tomli; python_version < \"3.11\" and extra == \"toml\"" ], "requires_python": null, - "version": "1.5.0" + "version": "1.5.1" }, { "artifacts": [ @@ -4465,13 +4849,13 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2", - "url": "https://files.pythonhosted.org/packages/bb/e1/ed2dd0850446b8697ad28d118df885ad04140c64ace06c4bd559f7c8a94f/setuptools-69.0.2-py3-none-any.whl" + "hash": "c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32", + "url": "https://files.pythonhosted.org/packages/f7/29/13965af254e3373bceae8fb9a0e6ea0d0e571171b80d6646932131d6439b/setuptools-69.5.1-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6", - "url": "https://files.pythonhosted.org/packages/4b/d9/d0cf66484b7e28a9c42db7e3929caed46f8b80478cd8c9bd38b7be059150/setuptools-69.0.2.tar.gz" + "hash": "6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987", + "url": "https://files.pythonhosted.org/packages/d6/4f/b10f707e14ef7de524fe1f8988a294fb262a29c9b5b12275c7e188864aed/setuptools-69.5.1.tar.gz" } ], "project_name": "setuptools", @@ -4480,8 +4864,8 @@ "build[virtualenv]>=1.0.3; extra == \"testing-integration\"", "filelock>=3.4.0; extra == \"testing\"", "filelock>=3.4.0; extra == \"testing-integration\"", - "flake8-2020; extra == \"testing\"", "furo; extra == \"docs\"", + "importlib-metadata; extra == \"testing\"", "ini2toml[lite]>=0.9; extra == \"testing\"", "jaraco.develop>=7.21; (python_version >= \"3.9\" and sys_platform != \"cygwin\") and extra == \"testing\"", "jaraco.envs>=2.2; extra == \"testing\"", @@ -4490,32 +4874,34 @@ "jaraco.path>=3.2.0; extra == \"testing\"", "jaraco.path>=3.2.0; extra == \"testing-integration\"", "jaraco.tidelift>=1.4; extra == \"docs\"", - "packaging>=23.1; extra == \"testing-integration\"", + "mypy==1.9; extra == \"testing\"", + "packaging>=23.2; extra == \"testing\"", + "packaging>=23.2; extra == \"testing-integration\"", "pip>=19.1; extra == \"testing\"", "pygments-github-lexers==0.0.5; extra == \"docs\"", - "pytest-black>=0.3.7; platform_python_implementation != \"PyPy\" and extra == \"testing\"", + "pytest!=8.1.1,>=6; extra == \"testing\"", "pytest-checkdocs>=2.4; extra == \"testing\"", "pytest-cov; platform_python_implementation != \"PyPy\" and extra == \"testing\"", "pytest-enabler; extra == \"testing-integration\"", "pytest-enabler>=2.2; extra == \"testing\"", - "pytest-mypy>=0.9.1; platform_python_implementation != \"PyPy\" and extra == \"testing\"", + "pytest-home>=0.5; extra == \"testing\"", + "pytest-mypy; extra == \"testing\"", "pytest-perf; sys_platform != \"cygwin\" and extra == \"testing\"", - "pytest-ruff; sys_platform != \"cygwin\" and extra == \"testing\"", + "pytest-ruff>=0.2.1; sys_platform != \"cygwin\" and extra == \"testing\"", "pytest-timeout; extra == \"testing\"", - "pytest-xdist; extra == \"testing\"", "pytest-xdist; extra == \"testing-integration\"", + "pytest-xdist>=3; extra == \"testing\"", "pytest; extra == \"testing-integration\"", - "pytest>=6; extra == \"testing\"", "rst.linker>=1.9; extra == \"docs\"", "sphinx-favicon; extra == \"docs\"", "sphinx-inline-tabs; extra == \"docs\"", "sphinx-lint; extra == \"docs\"", "sphinx-notfound-page<2,>=1; extra == \"docs\"", "sphinx-reredirects; extra == \"docs\"", - "sphinx<7.2.5; extra == \"docs\"", "sphinx>=3.5; extra == \"docs\"", "sphinxcontrib-towncrier; extra == \"docs\"", "tomli-w>=1.0.0; extra == \"testing\"", + "tomli; extra == \"testing\"", "tomli; extra == \"testing-integration\"", "virtualenv>=13.0.0; extra == \"testing\"", "virtualenv>=13.0.0; extra == \"testing-integration\"", @@ -4523,7 +4909,7 @@ "wheel; extra == \"testing-integration\"" ], "requires_python": ">=3.8", - "version": "69.0.2" + "version": "69.5.1" }, { "artifacts": [ @@ -4586,13 +4972,13 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "54d0c598bf6ea0ec12bbcf78bee035c7cd604b5d781d80b7997e9e033c3ac05d", - "url": "https://files.pythonhosted.org/packages/61/5a/3428569e4724789150b689a91c7b20c6b86f2a1340f6cd1ef6d869ac83d0/social_auth_core-4.5.1-py3-none-any.whl" + "hash": "8d16e66eb97bb7be43a023d6efa16628cdc94cefd8d8053930c98a0f676867e7", + "url": "https://files.pythonhosted.org/packages/4b/a0/54a381ef534e0c430191053d64060a47c1fd9928c453819c3b1063a13233/social_auth_core-4.5.3-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "307a4ba64d4f3ec86e4389163eac1d8b8656ffe5ab2e964aeff043ab00b3a662", - "url": "https://files.pythonhosted.org/packages/9b/64/602a6afaf6a8ac1764b1eae7861c86fa14de1c5749ef6f3c6f71eda3a0b9/social-auth-core-4.5.1.tar.gz" + "hash": "9d9b51b7ce2ccd0b7139e6b7f52a32cb922726de819fb13babe35f12ae89852a", + "url": "https://files.pythonhosted.org/packages/16/d8/b931bb8ee72a749f1d07b0050dcb7339e73981dba52b230cf9bb7a94f5e4/social-auth-core-4.5.3.tar.gz" } ], "project_name": "social-auth-core", @@ -4612,7 +4998,7 @@ "requests>=2.9.1" ], "requires_python": ">=3.8", - "version": "4.5.1" + "version": "4.5.3" }, { "artifacts": [ @@ -4636,25 +5022,23 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3", - "url": "https://files.pythonhosted.org/packages/98/5a/66d7c9305baa9f11857f247d4ba761402cea75db6058ff850ed7128957b7/sqlparse-0.4.4-py3-none-any.whl" + "hash": "c204494cd97479d0e39f28c93d46c0b2d5959c7b9ab904762ea6c7af211c8663", + "url": "https://files.pythonhosted.org/packages/43/5d/a0fdd88fd486b39ae1fd1a75ff75b4e29a0df96c0304d462fd407b82efe0/sqlparse-0.5.0-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c", - "url": "https://files.pythonhosted.org/packages/65/16/10f170ec641ed852611b6c9441b23d10b5702ab5288371feab3d36de2574/sqlparse-0.4.4.tar.gz" + "hash": "714d0a4932c059d16189f58ef5411ec2287a4360f17cdd0edd2d09d4c5087c93", + "url": "https://files.pythonhosted.org/packages/50/26/5da251cd090ccd580f5cfaa7d36cdd8b2471e49fffce60ed520afc27f4bc/sqlparse-0.5.0.tar.gz" } ], "project_name": "sqlparse", "requires_dists": [ "build; extra == \"dev\"", - "flake8; extra == \"dev\"", - "pytest-cov; extra == \"test\"", - "pytest; extra == \"test\"", + "hatch; extra == \"dev\"", "sphinx; extra == \"doc\"" ], - "requires_python": ">=3.5", - "version": "0.4.4" + "requires_python": ">=3.8", + "version": "0.5.0" }, { "artifacts": [ @@ -4687,13 +5071,13 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "8cc040628f3cea5d7128f2e76cf486b2251a4e543c7b938f58d9a377f6694a2d", - "url": "https://files.pythonhosted.org/packages/4b/68/e739fd061b0aba464bef8e8be48428b2aabbfb3f2f8f2f8ca257363ee6b2/stevedore-5.1.0-py3-none-any.whl" + "hash": "1c15d95766ca0569cad14cb6272d4d31dae66b011a929d7c18219c176ea1b5c9", + "url": "https://files.pythonhosted.org/packages/eb/f1/c7c6205c367c764ee173537f7eaf070bba4dd0fa11bf081813c2f75285a3/stevedore-5.2.0-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "a54534acf9b89bc7ed264807013b505bf07f74dbe4bcfa37d32bd063870b087c", - "url": "https://files.pythonhosted.org/packages/ac/d6/77387d3fc81f07bc8877e6f29507bd7943569093583b0a07b28cfa286780/stevedore-5.1.0.tar.gz" + "hash": "46b93ca40e1114cea93d738a6c1e365396981bb6bb78c27045b7587c9473544d", + "url": "https://files.pythonhosted.org/packages/e7/c1/b210bf1071c96ecfcd24c2eeb4c828a2a24bf74b38af13896d02203b1eec/stevedore-5.2.0.tar.gz" } ], "project_name": "stevedore", @@ -4701,7 +5085,7 @@ "pbr!=2.1.0,>=2.0.0" ], "requires_python": ">=3.8", - "version": "5.1.0" + "version": "5.2.0" }, { "artifacts": [ @@ -4761,49 +5145,49 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "b0a645a9156dc7cb5d3a1f0d4bab66db287fcb8e0430bdd4664a095ea16414ba", - "url": "https://files.pythonhosted.org/packages/6e/43/159750d32481f16e34cc60090b53bc0a14314ad0c1f67a9bb64f3f3a0551/tomlkit-0.12.3-py3-none-any.whl" + "hash": "5cd82d48a3dd89dee1f9d64420aa20ae65cfbd00668d6f094d7578a78efbb77b", + "url": "https://files.pythonhosted.org/packages/07/fa/c96545d741f2fd47f565e4e06bfef0962add790cb9c2289d900102b55eca/tomlkit-0.12.4-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "75baf5012d06501f07bee5bf8e801b9f343e7aac5a92581f20f80ce632e6b5a4", - "url": "https://files.pythonhosted.org/packages/df/fc/1201a374b9484f034da4ec84215b7b9f80ed1d1ea989d4c02167afaa4400/tomlkit-0.12.3.tar.gz" + "hash": "7ca1cfc12232806517a8515047ba66a19369e71edf2439d0f5824f91032b6cc3", + "url": "https://files.pythonhosted.org/packages/7d/49/4c0764898ee67618996148bdba4534a422c5e698b4dbf4001f7c6f930797/tomlkit-0.12.4.tar.gz" } ], "project_name": "tomlkit", "requires_dists": [], "requires_python": ">=3.7", - "version": "0.12.3" + "version": "0.12.4" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "2059bd4148deb1884bb0eb770a3cde70e7f954cfbbdc2285f1f2de01fd21eb6f", - "url": "https://files.pythonhosted.org/packages/7f/5c/922a3508f5bda2892be3df86c74f9cf1e01217c2b1f8a0ac4841d903e3e9/toolz-0.12.0-py3-none-any.whl" + "hash": "d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85", + "url": "https://files.pythonhosted.org/packages/b7/8a/d82202c9f89eab30f9fc05380daae87d617e2ad11571ab23d7c13a29bb54/toolz-0.12.1-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "88c570861c440ee3f2f6037c4654613228ff40c93a6c25e0eba70d17282c6194", - "url": "https://files.pythonhosted.org/packages/cf/05/2008534bbaa716b46a2d795d7b54b999d0f7638fbb9ed0b6e87bfa934f84/toolz-0.12.0.tar.gz" + "hash": "ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d", + "url": "https://files.pythonhosted.org/packages/3e/bf/5e12db234df984f6df3c7f12f1428aa680ba4e101f63f4b8b3f9e8d2e617/toolz-0.12.1.tar.gz" } ], "project_name": "toolz", "requires_dists": [], - "requires_python": ">=3.5", - "version": "0.12.0" + "requires_python": ">=3.7", + "version": "0.12.1" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "f14949d23829023013c47df20b4a76ccd1a85effb786dc060f34de7948361b33", - "url": "https://files.pythonhosted.org/packages/a7/1d/7d07e1b152b419a8a9c7f812eeefd408a0610d869489ee2e86973486713f/traitlets-5.14.0-py3-none-any.whl" + "hash": "b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", + "url": "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "fcdaa8ac49c04dfa0ed3ee3384ef6dfdb5d6f3741502be247279407679296772", - "url": "https://files.pythonhosted.org/packages/25/a0/2feefaa884a7eaa83934476091ecfb2a3bc3b61c1ed98db3da0fbbf46e73/traitlets-5.14.0.tar.gz" + "hash": "9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", + "url": "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz" } ], "project_name": "traitlets", @@ -4815,11 +5199,11 @@ "pydata-sphinx-theme; extra == \"docs\"", "pytest-mock; extra == \"test\"", "pytest-mypy-testing; extra == \"test\"", - "pytest<7.5,>=7.0; extra == \"test\"", + "pytest<8.2,>=7.0; extra == \"test\"", "sphinx; extra == \"docs\"" ], "requires_python": ">=3.8", - "version": "5.14.0" + "version": "5.14.3" }, { "artifacts": [ @@ -4878,19 +5262,19 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd", - "url": "https://files.pythonhosted.org/packages/b7/f4/6a90020cd2d93349b442bfcb657d0dc91eee65491600b2cb1d388bc98e6b/typing_extensions-4.9.0-py3-none-any.whl" + "hash": "c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a", + "url": "https://files.pythonhosted.org/packages/01/f3/936e209267d6ef7510322191003885de524fc48d1b43269810cd589ceaf5/typing_extensions-4.11.0-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", - "url": "https://files.pythonhosted.org/packages/0c/1d/eb26f5e75100d531d7399ae800814b069bc2ed2a7410834d57374d010d96/typing_extensions-4.9.0.tar.gz" + "hash": "83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0", + "url": "https://files.pythonhosted.org/packages/f6/f3/b827b3ab53b4e3d8513914586dcca61c355fa2ce8252dea4da56e67bf8f2/typing_extensions-4.11.0.tar.gz" } ], "project_name": "typing-extensions", "requires_dists": [], "requires_python": ">=3.8", - "version": "4.9.0" + "version": "4.11.0" }, { "artifacts": [ @@ -4914,36 +5298,37 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3", - "url": "https://files.pythonhosted.org/packages/96/94/c31f58c7a7f470d5665935262ebd7455c7e4c7782eb525658d3dbf4b9403/urllib3-2.1.0-py3-none-any.whl" + "hash": "450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d", + "url": "https://files.pythonhosted.org/packages/a2/73/a68704750a7679d0b6d3ad7aa8d4da8e14e151ae82e6fee774e6e0d05ec8/urllib3-2.2.1-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54", - "url": "https://files.pythonhosted.org/packages/36/dd/a6b232f449e1bc71802a5b7950dc3675d32c6dbc2a1bd6d71f065551adb6/urllib3-2.1.0.tar.gz" + "hash": "d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19", + "url": "https://files.pythonhosted.org/packages/7a/50/7fd50a27caa0652cd4caf224aa87741ea41d3265ad13f010886167cfcc79/urllib3-2.2.1.tar.gz" } ], "project_name": "urllib3", "requires_dists": [ "brotli>=1.0.9; platform_python_implementation == \"CPython\" and extra == \"brotli\"", "brotlicffi>=0.8.0; platform_python_implementation != \"CPython\" and extra == \"brotli\"", + "h2<5,>=4; extra == \"h2\"", "pysocks!=1.5.7,<2.0,>=1.5.6; extra == \"socks\"", "zstandard>=0.18.0; extra == \"zstd\"" ], "requires_python": ">=3.8", - "version": "2.1.0" + "version": "2.2.1" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "f26ec43d96c8cbfed76a5075dac87680124fa84e0855195a6184da9c187f133c", - "url": "https://files.pythonhosted.org/packages/31/b1/a59de0ad3aabb17523a39804f4c6df3ae87ead053a4e25362ae03d73d03a/wcwidth-0.2.12-py2.py3-none-any.whl" + "hash": "3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", + "url": "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "f01c104efdf57971bcb756f054dd58ddec5204dd15fa31d6503ea57947d97c02", - "url": "https://files.pythonhosted.org/packages/d7/12/63deef355537f290d5282a67bb7bdd165266e4eca93cd556707a325e5a24/wcwidth-0.2.12.tar.gz" + "hash": "72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", + "url": "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz" } ], "project_name": "wcwidth", @@ -4951,7 +5336,7 @@ "backports.functools-lru-cache>=1.2.1; python_version < \"3.2\"" ], "requires_python": null, - "version": "0.2.12" + "version": "0.2.13" }, { "artifacts": [ @@ -4975,226 +5360,183 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1", - "url": "https://files.pythonhosted.org/packages/ff/21/abdedb4cdf6ff41ebf01a74087740a709e2edb146490e4d9beea054b0b7a/wrapt-1.16.0-py3-none-any.whl" - }, - { - "algorithm": "sha256", - "hash": "bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136", - "url": "https://files.pythonhosted.org/packages/07/44/359e4724a92369b88dbf09878a7cde7393cf3da885567ea898e5904049a3/wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl" - }, - { - "algorithm": "sha256", - "hash": "75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d", - "url": "https://files.pythonhosted.org/packages/0f/16/ea627d7817394db04518f62934a5de59874b587b792300991b3c347ff5e0/wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl" - }, - { - "algorithm": "sha256", - "hash": "6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956", - "url": "https://files.pythonhosted.org/packages/0f/ef/0ecb1fa23145560431b970418dce575cfaec555ab08617d82eb92afc7ccf/wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl" - }, - { - "algorithm": "sha256", - "hash": "d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3", - "url": "https://files.pythonhosted.org/packages/11/fb/18ec40265ab81c0e82a934de04596b6ce972c27ba2592c8b53d5585e6bcd/wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl" - }, - { - "algorithm": "sha256", - "hash": "418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c", - "url": "https://files.pythonhosted.org/packages/14/26/93a9fa02c6f257df54d7570dfe8011995138118d11939a4ecd82cb849613/wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl" - }, - { - "algorithm": "sha256", - "hash": "d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6", - "url": "https://files.pythonhosted.org/packages/15/4e/081f59237b620a124b035f1229f55db40841a9339fdb8ef60b4decc44df9/wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl" + "hash": "2f84a1c509c52773365645a87949081ee9ea9c535cd452048cc8ca4ad3b45666", + "url": "https://files.pythonhosted.org/packages/35/43/8950648bf4ae9dcc1ccfc0767df369ae950988293c23b498f7526fe1b592/xmlsec-1.3.14-cp39-cp39-musllinux_1_1_x86_64.whl" }, { "algorithm": "sha256", - "hash": "73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72", - "url": "https://files.pythonhosted.org/packages/19/d4/cd33d3a82df73a064c9b6401d14f346e1d2fb372885f0295516ec08ed2ee/wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl" + "hash": "c42735cc68fdb4c6065cf0a0701dfff3a12a1734c63a36376349af9a5481f27b", + "url": "https://files.pythonhosted.org/packages/0a/12/3f30db45fb09c0ce494a00e17977232327656fdafc51b7814834431266b5/xmlsec-1.3.14-cp38-cp38-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d", - "url": "https://files.pythonhosted.org/packages/25/62/cd284b2b747f175b5a96cbd8092b32e7369edab0644c45784871528eb852/wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl" + "hash": "4dea6df3ffcb65d0b215678c3a0fe7bbc66785d6eae81291296e372498bad43a", + "url": "https://files.pythonhosted.org/packages/0f/07/0cbcd82fd51d94e9dcdd5737549444fb4530e951bf352af3d21cc254b44d/xmlsec-1.3.14-cp310-cp310-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8", - "url": "https://files.pythonhosted.org/packages/28/d3/4f079f649c515727c127c987b2ec2e0816b80d95784f2d28d1a57d2a1029/wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "hash": "ed4034939d8566ccdcd3b4e4f23c63fd807fb8763ae5668d59a19e11640a8242", + "url": "https://files.pythonhosted.org/packages/15/1a/4703acc7dea24146db06cd4f93c4e9d6a148ff10f5b21a7eddca36fc4da4/xmlsec-1.3.14-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020", - "url": "https://files.pythonhosted.org/packages/32/12/e11adfde33444986135d8881b401e4de6cbb4cced046edc6b464e6ad7547/wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl" + "hash": "7799a9ff3593f9dd43464e18b1a621640bffc40456c47c23383727f937dca7fc", + "url": "https://files.pythonhosted.org/packages/18/50/1399337e8399d2ba3da41ab51b562d34be26c5492672fd7b4cd0e4a3f2a1/xmlsec-1.3.14-cp311-cp311-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267", - "url": "https://files.pythonhosted.org/packages/34/49/589db6fa2d5d428b71716815bca8b39196fdaeea7c247a719ed2f93b0ab4/wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl" + "hash": "1fa1311f7489d050dde9028f5a2b5849c2927bb09c9a93491cb2f28fdc563912", + "url": "https://files.pythonhosted.org/packages/20/60/f57510b4a19d0a33c37ff18bcbf5ab4f250d2485e7cb92dda55fa302fa36/xmlsec-1.3.14-cp310-cp310-macosx_11_0_arm64.whl" }, { "algorithm": "sha256", - "hash": "14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81", - "url": "https://files.pythonhosted.org/packages/49/4e/5d2f6d7b57fc9956bf06e944eb00463551f7d52fc73ca35cfc4c2cdb7aed/wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl" + "hash": "57fed3bc7943681c9ed4d2221600ab440f060d8d1a8f92f346f2b41effe175b8", + "url": "https://files.pythonhosted.org/packages/20/c6/ee9203ba7841c07ab8aecc41e8b28ffae69f4d92c7a728823a022d8d4f14/xmlsec-1.3.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf", - "url": "https://files.pythonhosted.org/packages/49/83/b40bc1ad04a868b5b5bcec86349f06c1ee1ea7afe51dc3e46131e4f39308/wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "28cd9f513cf01dc0c5b9d9f0728714ecde2e7f46b3b6f63de91f4ae32f3008b3", + "url": "https://files.pythonhosted.org/packages/22/4f/623bb7cb197094447ad73209e1f5b9ecd9568a3446be8a1aa80b61a06233/xmlsec-1.3.14-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb", - "url": "https://files.pythonhosted.org/packages/4a/cc/3402bcc897978be00fef608cd9e3e39ec8869c973feeb5e1e277670e5ad2/wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl" + "hash": "004e8a82e26728bf8a60f8ece1ef3ffafdac30ef538139dfe28870e8503ca64a", + "url": "https://files.pythonhosted.org/packages/23/c9/a5776df390acfd97036c6f22c44de7ceefc1b2a5b4465586fad21949fc4d/xmlsec-1.3.14-cp310-cp310-musllinux_1_1_x86_64.whl" }, { "algorithm": "sha256", - "hash": "dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e", - "url": "https://files.pythonhosted.org/packages/58/43/d72e625edb5926483c9868214d25b5e7d5858ace6a80c9dfddfbadf4d8f9/wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "934f804f2f895bcdb86f1eaee236b661013560ee69ec108d29cdd6e5f292a2d9", + "url": "https://files.pythonhosted.org/packages/25/5b/244459b51dfe91211c1d9ec68fb5307dfc51e014698f52de575d25f753e0/xmlsec-1.3.14.tar.gz" }, { "algorithm": "sha256", - "hash": "98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b", - "url": "https://files.pythonhosted.org/packages/62/62/30ca2405de6a20448ee557ab2cd61ab9c5900be7cbd18a2639db595f0b98/wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "147934bd39dfd840663fb6b920ea9201455fa886427975713f1b42d9f20b9b29", + "url": "https://files.pythonhosted.org/packages/2b/29/55574cfba0c96a46429e021887d29f347385a43be3bd38fc0270b599a5dc/xmlsec-1.3.14-cp38-cp38-musllinux_1_1_aarch64.whl" }, { "algorithm": "sha256", - "hash": "8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0", - "url": "https://files.pythonhosted.org/packages/69/21/b2ba809bafc9b6265e359f9c259c6d9a52a16cf6be20c72d95e76da609dd/wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "hash": "1eb3dcf244a52f796377112d8f238dbb522eb87facffb498425dc8582a84a6bf", + "url": "https://files.pythonhosted.org/packages/35/66/cb02e33c72fe7279016d60802e1e1b6b007a8b056ca34b990fca30356921/xmlsec-1.3.14-cp312-cp312-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36", - "url": "https://files.pythonhosted.org/packages/6a/d7/cfcd73e8f4858079ac59d9db1ec5a1349bc486ae8e9ba55698cc1f4a1dff/wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl" + "hash": "4af81ce8044862ec865782efd353d22abdcd95b92364eef3c934de57ae6d5852", + "url": "https://files.pythonhosted.org/packages/3a/84/96d4cf3d5783adc954465755ca006184296d06948951216a765d28fcd75f/xmlsec-1.3.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1", - "url": "https://files.pythonhosted.org/packages/6e/52/2da48b35193e39ac53cfb141467d9f259851522d0e8c87153f0ba4205fb1/wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "995e87acecc263a2f6f2aa3cc204268f651cac8f4d7a2047f11b2cd49979cc38", + "url": "https://files.pythonhosted.org/packages/42/4a/2c8f8b6e96c2f9c72803d2526ba1029ccd869040b92f528d5b6a8b1c0922/xmlsec-1.3.14-cp39-cp39-musllinux_1_1_aarch64.whl" }, { "algorithm": "sha256", - "hash": "bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440", - "url": "https://files.pythonhosted.org/packages/70/7d/3dcc4a7e96f8d3e398450ec7703db384413f79bd6c0196e0e139055ce00f/wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "hash": "6679cec780386d848e7351d4b0de92c4483289ea4f0a2187e216159f939a4c6b", + "url": "https://files.pythonhosted.org/packages/4b/32/051b377b1aca16ab8c32ae052edecf9e6d05bad4d731a5752c6bd20f78ab/xmlsec-1.3.14-cp311-cp311-musllinux_1_1_aarch64.whl" }, { "algorithm": "sha256", - "hash": "9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2", - "url": "https://files.pythonhosted.org/packages/70/cc/b92e1da2cad6a9f8ee481000ece07a35e3b24e041e60ff8b850c079f0ebf/wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl" + "hash": "bddd2a2328b4e08c8a112e06cf2cd2b4d281f4ad94df15b4cef18f06cdc49d78", + "url": "https://files.pythonhosted.org/packages/4e/72/3d5489d285ac4cac8ac31c695822be472f236c64e9a687b0fe610e4e223b/xmlsec-1.3.14-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202", - "url": "https://files.pythonhosted.org/packages/72/b5/0c9be75f826c8e8d583a4ab312552d63d9f7c0768710146a22ac59bda4a9/wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl" + "hash": "330147ce59fbe56a9be5b2085d739c55a569f112576b3f1b33681f87416eaf33", + "url": "https://files.pythonhosted.org/packages/60/f2/a7489f3bd3bb7c2bbebe100a72e9e10cb645aac5ef160a7ed01e9b7817aa/xmlsec-1.3.14-cp312-cp312-macosx_11_0_arm64.whl" }, { "algorithm": "sha256", - "hash": "94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73", - "url": "https://files.pythonhosted.org/packages/7e/79/5ff0a5c54bda5aec75b36453d06be4f83d5cd4932cc84b7cb2b52cee23e2/wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "hash": "34c61ec0c0e70fda710290ae74b9efe1928d9242ed82c4eecf97aa696cff68e6", + "url": "https://files.pythonhosted.org/packages/65/af/7d38d42a2b91a99c0dc338fd6fec775d6e4dac266c4ad71fffbb25081208/xmlsec-1.3.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389", - "url": "https://files.pythonhosted.org/packages/7f/a7/f1212ba098f3de0fd244e2de0f8791ad2539c03bef6c05a9fcb03e45b089/wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "hash": "38e035bf48300b7dbde2dd01d3b8569f8584fc9c73809be13886e6b6c77b74fb", + "url": "https://files.pythonhosted.org/packages/6e/1b/0940d3804654d3f7901e6fc1aac3b4a2396784d8298e426a52cd455ecd90/xmlsec-1.3.14-cp38-cp38-macosx_11_0_arm64.whl" }, { "algorithm": "sha256", - "hash": "5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b", - "url": "https://files.pythonhosted.org/packages/92/17/224132494c1e23521868cdd57cd1e903f3b6a7ba6996b7b8f077ff8ac7fe/wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl" + "hash": "86ff7b2711557c1087b72b0a1a88d82eafbf2a6d38b97309a6f7101d4a7041c3", + "url": "https://files.pythonhosted.org/packages/6e/43/e83346261f25ee1f9eb0b6719bb77d19dff194333a02c0747dd1d360d520/xmlsec-1.3.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d", - "url": "https://files.pythonhosted.org/packages/95/4c/063a912e20bcef7124e0df97282a8af3ff3e4b603ce84c481d6d7346be0a/wrapt-1.16.0.tar.gz" + "hash": "48e894ad3e7de373f56efc09d6a56f7eae73a8dd4cec8943313134849e9c6607", + "url": "https://files.pythonhosted.org/packages/71/5d/cbceb6e9c7a65e8633f6c74b8eb7001b237f6429f404089b00d9dc80673e/xmlsec-1.3.14-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f", - "url": "https://files.pythonhosted.org/packages/96/e8/27ef35cf61e5147c1c3abcb89cfbb8d691b2bb8364803fcc950140bc14d8/wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl" + "hash": "82ac81deb7d7bf5cc8a748148948e5df5386597ff43fb92ec651cc5c7addb0e7", + "url": "https://files.pythonhosted.org/packages/84/33/4be9ce77c9b7adea4c67d48e64dc96b48330f69fb4b2f629f1cc1f3f0a5e/xmlsec-1.3.14-cp39-cp39-macosx_11_0_arm64.whl" }, { "algorithm": "sha256", - "hash": "b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c", - "url": "https://files.pythonhosted.org/packages/a3/1c/226c2a4932e578a2241dcb383f425995f80224b446f439c2e112eb51c3a6/wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "c4d41c83c8a2b8d8030204391ebeb6174fbdb044f0331653c4b5a4ce4150bcc0", + "url": "https://files.pythonhosted.org/packages/84/b1/37d10b7365defd6c7e63bff622f6eeadb7b9b0d5c7fb5f42d11870547003/xmlsec-1.3.14-cp311-cp311-musllinux_1_1_x86_64.whl" }, { "algorithm": "sha256", - "hash": "49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9", - "url": "https://files.pythonhosted.org/packages/a6/9b/c2c21b44ff5b9bf14a83252a8b973fb84923764ff63db3e6dfc3895cf2e0/wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl" + "hash": "e732a75fcb6b84872b168f972fbbf3749baf76308635f14015d1d35ed0c5719c", + "url": "https://files.pythonhosted.org/packages/8a/8e/4843fd336f57d0f39b9edd9f6b3415cae4e4a6d92b4dde5ea24054b013ea/xmlsec-1.3.14-cp38-cp38-musllinux_1_1_x86_64.whl" }, { "algorithm": "sha256", - "hash": "ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4", - "url": "https://files.pythonhosted.org/packages/a8/c6/5375258add3777494671d8cec27cdf5402abd91016dee24aa2972c61fedf/wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl" + "hash": "0bae37b2920115cf00759ee9fb7841cbdebcef3a8a92734ab93ae8fa41ac581d", + "url": "https://files.pythonhosted.org/packages/93/f9/ec47b5988387eba7272fd6746bdcac83d6299886f99e13a512baa51d8b89/xmlsec-1.3.14-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a", - "url": "https://files.pythonhosted.org/packages/b1/e7/459a8a4f40f2fa65eb73cb3f339e6d152957932516d18d0e996c7ae2d7ae/wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "cf35a25be3eb6263b2e0544ba26294651113fab79064f994d347a2ca5973e8e2", + "url": "https://files.pythonhosted.org/packages/9d/80/eb5384b7382a8a8b58d99b5aca00641690fcb436bf58134cc181c014a8a3/xmlsec-1.3.14-cp310-cp310-musllinux_1_1_aarch64.whl" }, { "algorithm": "sha256", - "hash": "edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537", - "url": "https://files.pythonhosted.org/packages/b6/ad/7a0766341081bfd9f18a7049e4d6d45586ae5c5bb0a640f05e2f558e849c/wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl" + "hash": "1b9b5de6bc69fdec23147e5f712cb05dc86df105462f254f140d743cc680cc7b", + "url": "https://files.pythonhosted.org/packages/bb/b0/29265df7a8571a0bb776e3aeb617447efe21f0813071d2ad38bcd0e1866c/xmlsec-1.3.14-cp39-cp39-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060", - "url": "https://files.pythonhosted.org/packages/b7/96/bb5e08b3d6db003c9ab219c487714c13a237ee7dcc572a555eaf1ce7dc82/wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "1fe23c2dd5f5dbcb24f40e2c1061e2672a32aabee7cf8ac5337036a485607d72", + "url": "https://files.pythonhosted.org/packages/c0/d7/22be4901f34c6aba17fe9245d49183a805fd30830883f8fb5c521ac8fdcd/xmlsec-1.3.14-cp311-cp311-macosx_11_0_arm64.whl" }, { "algorithm": "sha256", - "hash": "f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809", - "url": "https://files.pythonhosted.org/packages/c4/81/e799bf5d419f422d8712108837c1d9bf6ebe3cb2a81ad94413449543a923/wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "77749b338503fb6e151052c664064b34264f4168e2cb0cca1de78b7e5312a783", + "url": "https://files.pythonhosted.org/packages/c3/0a/1e06fa0644be37e44e24c85fb5aa6bfd506b8f015d4a227ec3a2c1c6fdc4/xmlsec-1.3.14-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca", - "url": "https://files.pythonhosted.org/packages/c5/40/3eabe06c8dc54fada7364f34e8caa562efe3bf3f769bf3258de9c785a27f/wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl" + "hash": "a98eadfcb0c3b23ccceb7a2f245811f8d784bd287640dcfe696a26b9db1e2fc0", + "url": "https://files.pythonhosted.org/packages/c4/b6/1e5ee93e0150721d4c832860c321f0edc3ed753f4a0f376f48cce41bf697/xmlsec-1.3.14-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487", - "url": "https://files.pythonhosted.org/packages/d1/c4/8dfdc3c2f0b38be85c8d9fdf0011ebad2f54e40897f9549a356bebb63a97/wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "774d5d1e45f07f953c1cc14fd055c1063f0725f7248b6b0e681f59fd8638934d", + "url": "https://files.pythonhosted.org/packages/d9/d2/228f5e7edf8cf2affb76c22cd77a1adf423a8ce1b73c727a32d6939dcb18/xmlsec-1.3.14-cp312-cp312-musllinux_1_1_aarch64.whl" }, { "algorithm": "sha256", - "hash": "5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664", - "url": "https://files.pythonhosted.org/packages/da/6f/6d0b3c4983f1fc764a422989dabc268ee87d937763246cd48aa92f1eed1e/wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl" + "hash": "bd10ca3201f164482775a7ce61bf7ee9aade2e7d032046044dd0f6f52c91d79d", + "url": "https://files.pythonhosted.org/packages/dc/d5/393ab85efbf633ea0d10e21a8dbb0a83d5b6ba66a16ce1fb987b90262335/xmlsec-1.3.14-cp312-cp312-musllinux_1_1_x86_64.whl" }, { "algorithm": "sha256", - "hash": "807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0", - "url": "https://files.pythonhosted.org/packages/ef/58/2fde309415b5fa98fd8f5f4a11886cbf276824c4c64d45a39da342fff6fe/wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl" + "hash": "204d3c586b8bd6f02a5d4c59850a8157205569d40c32567f49576fa5795d897d", + "url": "https://files.pythonhosted.org/packages/e8/11/5f70ff7db45978771f29b00b4a2b5cee47249dccf4689483c0119dc27ad8/xmlsec-1.3.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f", - "url": "https://files.pythonhosted.org/packages/ef/c6/56e718e2c58a4078518c14d97e531ef1e9e8a5c1ddafdc0d264a92be1a1a/wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "0be3b7a28e54a03b87faf07fb3c6dc3e50a2c79b686718c3ad08300b8bf6bb67", + "url": "https://files.pythonhosted.org/packages/ea/62/c9cd9d7e3779e2f99b014db7ed55f563a0b81752bf038abfe6993bb86afa/xmlsec-1.3.14-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09", - "url": "https://files.pythonhosted.org/packages/fd/03/c188ac517f402775b90d6f312955a5e53b866c964b32119f2ed76315697e/wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl" + "hash": "4fac2a787ae3b9fb761f9aec6b9f10f2d1c1b87abb574ebd8ff68435bdc97e3d", + "url": "https://files.pythonhosted.org/packages/f2/12/ce47c2f7c19a61e7c654a49dea79c9e12eb4a2fa21b62331c1d0023ff351/xmlsec-1.3.14-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0", - "url": "https://files.pythonhosted.org/packages/fe/9e/d3bc95e75670ba15c5b25ecf07fc49941843e2678d777ca59339348d1c96/wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl" - } - ], - "project_name": "wrapt", - "requires_dists": [], - "requires_python": ">=3.6", - "version": "1.16.0" - }, - { - "artifacts": [ - { - "algorithm": "sha256", - "hash": "916f5d78e8041f6cd9391abba659da8c94a4fef7196d126d40af1ff417f2cf86", - "url": "https://files.pythonhosted.org/packages/37/9f/342d4562eac99178d0d515c780285e107c6828cefad37d02f05b7b7d8751/xmlsec-1.3.13.tar.gz" + "hash": "73eabf5ef58189d81655058cf328c1dfa9893d89f1bff5fc941481f08533f338", + "url": "https://files.pythonhosted.org/packages/f9/a0/b942d6d9a2aa54e56b2504d9d019d8fef7d170448c44b16385e47680002d/xmlsec-1.3.14-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" } ], "project_name": "xmlsec", @@ -5202,139 +5544,139 @@ "lxml>=3.8" ], "requires_python": ">=3.5", - "version": "1.3.13" + "version": "1.3.14" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "1f294a15f7723fc0d3b40701ca9b446133ec713eafc1cc6afa7b3d98666ee1ac", - "url": "https://files.pythonhosted.org/packages/e2/16/bb47952247e16b661cd4fe63c8706748b485b0627265c14778b53980235e/zope.interface-6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "bf34840e102d1d0b2d39b1465918d90b312b1119552cebb61a242c42079817b9", + "url": "https://files.pythonhosted.org/packages/2f/63/2349e520e23631a199a6edb732531c2245c94ab276dd68301c207c675b12/zope.interface-6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "5a804abc126b33824a44a7aa94f06cd211a18bbf31898ba04bd0924fbe9d282d", - "url": "https://files.pythonhosted.org/packages/18/eb/8f32292e01d45fc64f0bd9d74d67e4583746bfa27c8957062816a96dd58d/zope.interface-6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "01a0b3dd012f584afcf03ed814bce0fc40ed10e47396578621509ac031be98bf", + "url": "https://files.pythonhosted.org/packages/1b/6a/0414b8b195cc3d0004d5e06d9e358030042b0fba107d537fa02a53d4f85e/zope.interface-6.3-cp39-cp39-macosx_11_0_arm64.whl" }, { "algorithm": "sha256", - "hash": "387545206c56b0315fbadb0431d5129c797f92dc59e276b3ce82db07ac1c6179", - "url": "https://files.pythonhosted.org/packages/24/ee/b9056bc4afc263017125acfaa5ca0f3aeb81588ab9be2c471f01f927a932/zope.interface-6.1-cp39-cp39-macosx_10_9_x86_64.whl" + "hash": "2c3cfb272bcb83650e6695d49ae0d14dd06dc694789a3d929f23758557a23d92", + "url": "https://files.pythonhosted.org/packages/1e/1a/4fc6159808bdcfdde113972034c606c29c0a035e84ee060e3ca1f7061be2/zope.interface-6.3-cp39-cp39-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "b012d023b4fb59183909b45d7f97fb493ef7a46d2838a5e716e3155081894605", - "url": "https://files.pythonhosted.org/packages/37/a1/5d2b265f4b7371630cad5873d0873965e35ca3de993d11b9336c720f7259/zope.interface-6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "hash": "f83d6b4b22262d9a826c3bd4b2fbfafe1d0000f085ef8e44cd1328eea274ae6a", + "url": "https://files.pythonhosted.org/packages/2a/bd/a30bf6df24480017171da4f52ee527a72c7a6450c86355011e0156e71723/zope.interface-6.3.tar.gz" }, { "algorithm": "sha256", - "hash": "e8bb9c990ca9027b4214fa543fd4025818dc95f8b7abce79d61dc8a2112b561a", - "url": "https://files.pythonhosted.org/packages/3c/91/68a0bbc97c2554f87d39572091954e94d043bcd83897cd6a779ca85cb5cc/zope.interface-6.1-cp312-cp312-macosx_10_9_x86_64.whl" + "hash": "10cde8dc6b2fd6a1d0b5ca4be820063e46ddba417ab82bcf55afe2227337b130", + "url": "https://files.pythonhosted.org/packages/35/0c/2442f1d7fd3fc2f4179892c161f79e7d3dd5dd483c79a57c3f6355675374/zope.interface-6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "43b576c34ef0c1f5a4981163b551a8781896f2a37f71b8655fd20b5af0386abb", - "url": "https://files.pythonhosted.org/packages/3c/ec/c1e7ce928dc10bfe02c6da7e964342d941aaf168f96f8084636167ea50d2/zope.interface-6.1-cp310-cp310-macosx_10_9_x86_64.whl" + "hash": "26c9a37fb395a703e39b11b00b9e921c48f82b6e32cc5851ad5d0618cd8876b5", + "url": "https://files.pythonhosted.org/packages/35/fa/0d2a44ba239120967a75a58fff643d8d9518d0c99bdd506b45d23ce955c8/zope.interface-6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "34c15ca9248f2e095ef2e93af2d633358c5f048c49fbfddf5fdfc47d5e263736", - "url": "https://files.pythonhosted.org/packages/3e/1f/43557bb2b6e8537002a5a26af9b899171e26ddfcdf17a00ff729b00c036b/zope.interface-6.1-cp311-cp311-macosx_11_0_arm64.whl" + "hash": "c40df4aea777be321b7e68facb901bc67317e94b65d9ab20fb96e0eb3c0b60a1", + "url": "https://files.pythonhosted.org/packages/44/8f/1b23b127dc0f0e40de3d7663670bcf4224819f5fdf103bf1ad24ada51540/zope.interface-6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "c9559138690e1bd4ea6cd0954d22d1e9251e8025ce9ede5d0af0ceae4a401e43", - "url": "https://files.pythonhosted.org/packages/46/2e/777a4c4a95e44c5d6200c089369bfb59bf14b0bc22afd6e327b4c7878515/zope.interface-6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "40aa8c8e964d47d713b226c5baf5f13cdf3a3169c7a2653163b17ff2e2334d10", + "url": "https://files.pythonhosted.org/packages/55/41/79c9014351824b13db0c37808333816401e87d473d268f137de172bacf5a/zope.interface-6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "9ffdaa5290422ac0f1688cb8adb1b94ca56cee3ad11f29f2ae301df8aecba7d1", - "url": "https://files.pythonhosted.org/packages/4a/0b/1d8817b8a3631384a26ff7faa4c1f3e6726f7e4950c3442721cfef2c95eb/zope.interface-6.1-cp311-cp311-macosx_10_9_x86_64.whl" + "hash": "2bb78c12c1ad3a20c0d981a043d133299117b6854f2e14893b156979ed4e1d2c", + "url": "https://files.pythonhosted.org/packages/59/cb/9357ad6df104b24bb2a5c84d5574b4729b9348498e50badb13fe65cfba5d/zope.interface-6.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "6dc998f6de015723196a904045e5a2217f3590b62ea31990672e31fbc5370b41", - "url": "https://files.pythonhosted.org/packages/4f/20/94d4f221989b4bbdd09004b2afb329958e776b7015b7ea8bc915327e195a/zope.interface-6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "4137025731e824eee8d263b20682b28a0bdc0508de9c11d6c6be54163e5b7c83", + "url": "https://files.pythonhosted.org/packages/6c/09/0f529814a730b3d3cc87d3564e92601faaafa8522b29842827d71a74b92c/zope.interface-6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "bbe81def9cf3e46f16ce01d9bfd8bea595e06505e51b7baf45115c77352675fd", - "url": "https://files.pythonhosted.org/packages/50/d6/6176aaa1f6588378f5a5a4a9c6ad50a36824e902b2f844ca8de7f1b0c4a7/zope.interface-6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "afa0491a9f154cf8519a02026dc85a416192f4cb1efbbf32db4a173ba28b289a", + "url": "https://files.pythonhosted.org/packages/75/91/61e87958a4d17af766888ae7d2bc0425d4bd68223ad1216ba18f033b46fa/zope.interface-6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "aa6fd016e9644406d0a61313e50348c706e911dca29736a3266fc9e28ec4ca6d", - "url": "https://files.pythonhosted.org/packages/57/23/508f7f79619ae4e025f5b264a9283efc3c805ed4c0ad75cb28c091179ced/zope.interface-6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "hash": "72d5efecad16c619a97744a4f0b67ce1bcc88115aa82fcf1dc5be9bb403bcc0b", + "url": "https://files.pythonhosted.org/packages/75/cc/aa9b89bc39714188b351978bf68a78bd25730629efd12b14cf0f90b48317/zope.interface-6.3-cp312-cp312-macosx_11_0_arm64.whl" }, { "algorithm": "sha256", - "hash": "70d2cef1bf529bff41559be2de9d44d47b002f65e17f43c73ddefc92f32bf00f", - "url": "https://files.pythonhosted.org/packages/76/19/5e52990bfc6f09c64063cd60d0fec1d1b967cd0f84eb6578edca4c895ad8/zope.interface-6.1-cp38-cp38-macosx_10_9_x86_64.whl" + "hash": "3c8731596198198746f7ce2a4487a0edcbc9ea5e5918f0ab23c4859bce56055c", + "url": "https://files.pythonhosted.org/packages/75/f9/8d37b1e1063e755e25587b050678deb2a4799fa59266350ded46a56788eb/zope.interface-6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "0c8cf55261e15590065039696607f6c9c1aeda700ceee40c70478552d323b3ff", - "url": "https://files.pythonhosted.org/packages/7c/0d/db0ccf0d12767015f23b302aebe98d5eca218aaadc70c2e3908b85fecd2a/zope.interface-6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "e8fa0fb05083a1a4216b4b881fdefa71c5d9a106e9b094cd4399af6b52873e91", + "url": "https://files.pythonhosted.org/packages/76/51/6735aea1b3269bd234494a5794caf9b40a8903922070efc6844456905284/zope.interface-6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "6af47f10cfc54c2ba2d825220f180cc1e2d4914d783d6fc0cd93d43d7bc1c78b", - "url": "https://files.pythonhosted.org/packages/7d/14/30346a41eb1e4c24282d3933a9837a17230551ae8a5dbaf2639d7556277e/zope.interface-6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "187f7900b63845dcdef1be320a523dbbdba94d89cae570edc2781eb55f8c2f86", + "url": "https://files.pythonhosted.org/packages/88/1c/f5af3111ff9afda87a9f35d90234c8bd997f6f11761cdf3a45d0883617a8/zope.interface-6.3-cp38-cp38-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "9b9bc671626281f6045ad61d93a60f52fd5e8209b1610972cf0ef1bbe6d808e3", - "url": "https://files.pythonhosted.org/packages/7f/85/3a35144509eb4a5a2208b48ae8d116a969d67de62cc6513d85602144d9cd/zope.interface-6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "hash": "d165d7774d558ea971cb867739fb334faf68fc4756a784e689e11efa3becd59e", + "url": "https://files.pythonhosted.org/packages/95/00/1c97f0b1622b4eb587e8aea84f109b426c6d3506fba043052dafeb4cab95/zope.interface-6.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "2fdc7ccbd6eb6b7df5353012fbed6c3c5d04ceaca0038f75e601060e95345309", - "url": "https://files.pythonhosted.org/packages/87/03/6b85c1df2dca1b9acca38b423d1e226d8ffdf30ebd78bcb398c511de8b54/zope.interface-6.1.tar.gz" + "hash": "e78a183a3c2f555c2ad6aaa1ab572d1c435ba42f1dc3a7e8c82982306a19b785", + "url": "https://files.pythonhosted.org/packages/98/94/110444b334e2b8d998e165f782f4fa4063a2892e307f650862572f25c020/zope.interface-6.3-cp310-cp310-macosx_11_0_arm64.whl" }, { "algorithm": "sha256", - "hash": "97806e9ca3651588c1baaebb8d0c5ee3db95430b612db354c199b57378312ee8", - "url": "https://files.pythonhosted.org/packages/8b/6d/547bfa7465e5b296adba0aff5c7ace1150f2a9e429fbf6c33d6618275162/zope.interface-6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "a058e6cf8d68a5a19cb5449f42a404f0d6c2778b897e6ce8fadda9cea308b1b0", + "url": "https://files.pythonhosted.org/packages/9d/ef/b8f324df0faf5199a1c5097954f96d6d4074d75f5b56d6f1354cb3bf2525/zope.interface-6.3-cp38-cp38-macosx_11_0_arm64.whl" }, { "algorithm": "sha256", - "hash": "7ebc4d34e7620c4f0da7bf162c81978fce0ea820e4fa1e8fc40ee763839805f3", - "url": "https://files.pythonhosted.org/packages/9b/ee/dadd8e68096567e13f70e5379d9b87d562f46680eb11e355f3730bafd21a/zope.interface-6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "hash": "483e118b1e075f1819b3c6ace082b9d7d3a6a5eb14b2b375f1b80a0868117920", + "url": "https://files.pythonhosted.org/packages/a6/50/d4943ee15f3df5b2e951fce34eb09b670acf1eed67ac3d15e1d15aa02d09/zope.interface-6.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "ad54ed57bdfa3254d23ae04a4b1ce405954969c1b0550cc2d1d2990e8b439de1", - "url": "https://files.pythonhosted.org/packages/a5/09/dc40db82056153db3ef7bdd7d3c16b183d7ffa67cfac052d6bdb7623616d/zope.interface-6.1-cp38-cp38-macosx_11_0_arm64.whl" + "hash": "1b0c4c90e5eefca2c3e045d9f9ed9f1e2cdbe70eb906bff6b247e17119ad89a1", + "url": "https://files.pythonhosted.org/packages/c0/30/c660d1c18c39e49809dfcc3605c67272cb31bba6fc5c63c33927a6c4516e/zope.interface-6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "ef467d86d3cfde8b39ea1b35090208b0447caaabd38405420830f7fd85fbdd56", - "url": "https://files.pythonhosted.org/packages/bb/d8/b8ea4c4a63daf1fc3e76480b601c3da186cb896d5f1c52b8abc93c1cce63/zope.interface-6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "hash": "600101f43a7582d5b9504a7c629a1185a849ce65e60fca0f6968dfc4b76b6d39", + "url": "https://files.pythonhosted.org/packages/c1/ff/37b37e408908f6d949cea8b01969204fc76dd0b85eabc41ff8ca3306a940/zope.interface-6.3-cp311-cp311-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "fddbab55a2473f1d3b8833ec6b7ac31e8211b0aa608df5ab09ce07f3727326de", - "url": "https://files.pythonhosted.org/packages/db/5f/46946b588c43eb28efe0e46f4cf455b1ed8b2d1ea62a21b0001c6610662f/zope.interface-6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "567d54c06306f9c5b6826190628d66753b9f2b0422f4c02d7c6d2b97ebf0a24e", + "url": "https://files.pythonhosted.org/packages/d1/4a/f3d9cd19bf1e4ae4fbed52bbc6b33202ff980471756e7b3ac69f9c42caed/zope.interface-6.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "b51b64432eed4c0744241e9ce5c70dcfecac866dff720e746d0a9c82f371dfa7", - "url": "https://files.pythonhosted.org/packages/e1/84/850092a8ab7e87a3ea615daf3f822f7196c52592e3e92f264621b4cfe5a2/zope.interface-6.1-cp312-cp312-macosx_11_0_arm64.whl" + "hash": "62e32f02b3f26204d9c02c3539c802afc3eefb19d601a0987836ed126efb1f21", + "url": "https://files.pythonhosted.org/packages/d5/89/0ffd7af774f968c2e19cfef6bd155b326039dc4471c837d56649d2308c9d/zope.interface-6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "67be3ca75012c6e9b109860820a8b6c9a84bfb036fbd1076246b98e56951ca92", - "url": "https://files.pythonhosted.org/packages/f7/0b/12f269ad049fc40a7a3ab85445d7855b6bc6f1e774c5ca9dd6f5c32becb3/zope.interface-6.1-cp310-cp310-macosx_11_0_arm64.whl" + "hash": "8d407e0fd8015f6d5dfad481309638e1968d70e6644e0753f229154667dd6cd5", + "url": "https://files.pythonhosted.org/packages/d8/22/6affe06d2b17c4c903a73de7071b6344be56ae3ab969a2b60784499dd839/zope.interface-6.3-cp312-cp312-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "57d0a8ce40ce440f96a2c77824ee94bf0d0925e6089df7366c2272ccefcb7941", - "url": "https://files.pythonhosted.org/packages/f7/1c/65b5c254fea6e329d791086376acda93b97208f8bf5c445990af3860b479/zope.interface-6.1-cp39-cp39-macosx_11_0_arm64.whl" + "hash": "2f32010ffb87759c6a3ad1c65ed4d2e38e51f6b430a1ca11cee901ec2b42e021", + "url": "https://files.pythonhosted.org/packages/f2/75/ace101216b1b9cffe2808cce5b5e8e7f40865319c27adab4076562914223/zope.interface-6.3-cp310-cp310-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "e30506bcb03de8983f78884807e4fd95d8db6e65b69257eea05d13d519b83ac0", - "url": "https://files.pythonhosted.org/packages/fd/4f/8e80173ebcdefe0ff4164444c22b171cf8bd72533026befc2adf079f3ac8/zope.interface-6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "4d6b229f5e1a6375f206455cc0a63a8e502ed190fe7eb15e94a312dc69d40299", + "url": "https://files.pythonhosted.org/packages/f5/3d/b5562aa226faec1705705bd57fc98e87eb857ab20efa0772734b88bd2fce/zope.interface-6.3-cp311-cp311-macosx_11_0_arm64.whl" } ], "project_name": "zope-interface", @@ -5351,7 +5693,7 @@ "zope.testing; extra == \"testing\"" ], "requires_python": ">=3.7", - "version": "6.1" + "version": "6.3" } ], "platform_tag": null @@ -5392,6 +5734,7 @@ "mypy-extensions==0.4.3", "mypy==0.782", "pluggy==0.13.1", + "posthog>=3.5.0", "premailer>=3.7.0", "psycopg2-binary>=2.8.3", "pygsheets==2.0.2", From bbdf73324be2df780166a68dba2d8a51b6df7a2a Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Tue, 23 Apr 2024 11:32:14 -0400 Subject: [PATCH 08/29] fix --- tests/mitol/posthog/test_features.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/mitol/posthog/test_features.py b/tests/mitol/posthog/test_features.py index 9277c714..2e673e30 100644 --- a/tests/mitol/posthog/test_features.py +++ b/tests/mitol/posthog/test_features.py @@ -3,7 +3,7 @@ import logging from datetime import timedelta -import features +from mitol.posthog import features import pytest from django.core.cache import caches from freezegun import freeze_time @@ -31,7 +31,7 @@ def test_flags_from_cache(mocker, caplog, settings): durable_cache = caches["durable"] settings.FEATURES["testing_function"] = True settings.POSTHOG_ENABLED = True - cache_key = features.generate_cache_key( + cache_key = features._generate_cache_key( "testing_function", features.default_unique_id(), features._get_person_properties(features.default_unique_id()), # noqa: SLF001 From 04d9e2b076b58b80d6808f0b8a20453ac7a37e37 Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Tue, 23 Apr 2024 11:34:26 -0400 Subject: [PATCH 09/29] format --- tests/mitol/posthog/test_features.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/mitol/posthog/test_features.py b/tests/mitol/posthog/test_features.py index 2e673e30..5dee0c6e 100644 --- a/tests/mitol/posthog/test_features.py +++ b/tests/mitol/posthog/test_features.py @@ -3,12 +3,12 @@ import logging from datetime import timedelta -from mitol.posthog import features import pytest from django.core.cache import caches from freezegun import freeze_time from mitol.common.utils.datetime import now_in_utc +from mitol.posthog import features pytestmark = [pytest.mark.django_db] From aaed1f231e3e0881cd3d96391b93f8b8a2a46a29 Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Tue, 23 Apr 2024 11:39:07 -0400 Subject: [PATCH 10/29] Add cache back --- src/mitol/posthog/settings/posthog.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/mitol/posthog/settings/posthog.py b/src/mitol/posthog/settings/posthog.py index 59f04430..e853fc89 100644 --- a/src/mitol/posthog/settings/posthog.py +++ b/src/mitol/posthog/settings/posthog.py @@ -26,3 +26,10 @@ default=3, description="Numbers of time requests to PostHog should be retried after failing.", ) +CACHES = { + # general durable cache (redis should be considered ephemeral) + "durable": { + "BACKEND": "django.core.cache.backends.db.DatabaseCache", + "LOCATION": "durable_cache", + }, +} From 53178e8ee2338cb138213505833256e55bc6eb69 Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Tue, 23 Apr 2024 11:55:31 -0400 Subject: [PATCH 11/29] Does this work? --- src/mitol/posthog/settings/posthog.py | 7 ------- tests/testapp/settings/test.py | 9 +++++++++ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/mitol/posthog/settings/posthog.py b/src/mitol/posthog/settings/posthog.py index e853fc89..59f04430 100644 --- a/src/mitol/posthog/settings/posthog.py +++ b/src/mitol/posthog/settings/posthog.py @@ -26,10 +26,3 @@ default=3, description="Numbers of time requests to PostHog should be retried after failing.", ) -CACHES = { - # general durable cache (redis should be considered ephemeral) - "durable": { - "BACKEND": "django.core.cache.backends.db.DatabaseCache", - "LOCATION": "durable_cache", - }, -} diff --git a/tests/testapp/settings/test.py b/tests/testapp/settings/test.py index f67630a5..e8865c48 100644 --- a/tests/testapp/settings/test.py +++ b/tests/testapp/settings/test.py @@ -1,4 +1,5 @@ """Test-only settings""" + from mitol.common.envs import import_settings_modules import_settings_modules("testapp.settings.shared") @@ -16,3 +17,11 @@ # hubspot settings MITOL_HUBSPOT_API_PRIVATE_TOKEN = "testtoken" + +CACHES = { + # general durable cache (redis should be considered ephemeral) + "durable": { + "BACKEND": "django.core.cache.backends.db.DatabaseCache", + "LOCATION": "durable_cache", + }, +} From 8703a1c47fb84a87b5eedb8175956ce046a5ff74 Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Tue, 23 Apr 2024 12:15:57 -0400 Subject: [PATCH 12/29] test --- tests/mitol/posthog/test_features.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/mitol/posthog/test_features.py b/tests/mitol/posthog/test_features.py index 5dee0c6e..136b19cc 100644 --- a/tests/mitol/posthog/test_features.py +++ b/tests/mitol/posthog/test_features.py @@ -10,6 +10,8 @@ from mitol.common.utils.datetime import now_in_utc from mitol.posthog import features + + pytestmark = [pytest.mark.django_db] @@ -26,7 +28,7 @@ def test_flags_from_cache(mocker, caplog, settings): """Test that flags are pulled from cache successfully.""" get_feature_flag_mock = mocker.patch( - "posthog.get_feature_flag", autospec=True, return_value=True + "get_feature_flag", autospec=True, return_value=True ) durable_cache = caches["durable"] settings.FEATURES["testing_function"] = True @@ -67,10 +69,10 @@ def test_cache_population(mocker, settings): """Test that the cache is populated correctly when get_all_feature_flags is called.""" get_feature_flag_mock = mocker.patch( - "posthog.get_feature_flag", autospec=True, return_value=True + "get_feature_flag", autospec=True, return_value=True ) get_all_flags_mock = mocker.patch( - "posthog.get_all_flags", + "get_all_flags", autospec=True, return_value={ "testing_function_1": True, @@ -101,7 +103,7 @@ def test_posthog_flag_cache_timeout(mocker, settings): """Test that the cache gets invalidated as we expect""" get_feature_flag_mock = mocker.patch( - "posthog.get_feature_flag", autospec=True, return_value=True + "get_feature_flag", autospec=True, return_value=True ) durable_cache = caches["durable"] settings.POSTHOG_ENABLED = True From f6128031f3012b942afe4d80b49977f8821cc297 Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Tue, 23 Apr 2024 12:18:25 -0400 Subject: [PATCH 13/29] format --- tests/mitol/posthog/test_features.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/mitol/posthog/test_features.py b/tests/mitol/posthog/test_features.py index 136b19cc..c8137a7f 100644 --- a/tests/mitol/posthog/test_features.py +++ b/tests/mitol/posthog/test_features.py @@ -10,8 +10,6 @@ from mitol.common.utils.datetime import now_in_utc from mitol.posthog import features - - pytestmark = [pytest.mark.django_db] From 7ec2ad13d26c20bf7b1a1cfd39617d6d2747ace6 Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Tue, 23 Apr 2024 13:14:11 -0400 Subject: [PATCH 14/29] Maybe try changing the name? --- BUILD | 2 +- .../lockfiles/python-default.lockfile | 2 +- src/BUILD | 2 +- src/mitol/posthog/BUILD | 10 +++++----- src/mitol/posthog/README.md | 18 +++++++++--------- src/mitol/posthog/__init__.py | 6 +++--- src/mitol/posthog/apps.py | 8 ++++---- src/mitol/posthog/pyproject.toml | 2 +- src/mitol/posthog/settings/posthog.py | 2 +- tests/mitol/posthog/test_features.py | 12 ++++++------ tests/testapp/settings/shared.py | 2 +- 11 files changed, 33 insertions(+), 33 deletions(-) diff --git a/BUILD b/BUILD index 9aeccd05..2a555c45 100644 --- a/BUILD +++ b/BUILD @@ -19,7 +19,7 @@ python_requirements( "social-auth-app-django": ["social_django"], "named-enum": ["enum"], "setuptools": ["pkg_resources"], - "posthog": ["posthog"] + "olposthog": ["olposthog"] } ) diff --git a/build-support/lockfiles/python-default.lockfile b/build-support/lockfiles/python-default.lockfile index 674ecbd7..f5042075 100644 --- a/build-support/lockfiles/python-default.lockfile +++ b/build-support/lockfiles/python-default.lockfile @@ -3444,7 +3444,7 @@ "url": "https://files.pythonhosted.org/packages/d8/c8/8a7308d5355fedfc400098a75fd191cf615b55aa22ef2a937995326e6f5e/posthog-3.5.0.tar.gz" } ], - "project_name": "posthog", + "project_name": "olposthog", "requires_dists": [ "backoff>=1.10.0", "black; extra == \"dev\"", diff --git a/src/BUILD b/src/BUILD index 61affae0..427060c6 100644 --- a/src/BUILD +++ b/src/BUILD @@ -15,7 +15,7 @@ target( "openedx", "payment_gateway", "geoip", - "posthog", + "olposthog", ] ], ) diff --git a/src/mitol/posthog/BUILD b/src/mitol/posthog/BUILD index 43a24421..32f10238 100644 --- a/src/mitol/posthog/BUILD +++ b/src/mitol/posthog/BUILD @@ -8,7 +8,7 @@ resources( ) python_sources( - name="posthog", + name="olposthog", sources=[ "**/*.py", ], @@ -18,10 +18,10 @@ python_sources( ) python_distribution( - name="mitol-django-posthog", - dependencies=[":posthog"], + name="mitol-django-olposthog", + dependencies=[":olposthog"], provides=setup_py( - name="mitol-django-posthog", - description="MIT Open Learning django app extensions for Posthog", + name="mitol-django-olposthog", + description="MIT Open Learning django app extensions for OlPosthog", ), ) diff --git a/src/mitol/posthog/README.md b/src/mitol/posthog/README.md index 4537fa2c..33d9f8f2 100644 --- a/src/mitol/posthog/README.md +++ b/src/mitol/posthog/README.md @@ -1,19 +1,19 @@ -mitol-django-posthog +mitol-django-olposthog --- -This is the Open Learning Posthog app. It provides an API to interact with Posthog in order to check feature flags. +This is the Open Learning OlPosthog app. It provides an API to interact with Posthog in order to check feature flags. ### Installation and setup -Add the Posthog app: +Add the OlPosthog app: -`docker-compose run -u root --rm web poetry add mitol-django-posthog` +`docker-compose run -u root --rm web poetry add mitol-django-olposthog` Add the following to the `ready()` method for your App. ``` -from mitol.posthog.features import configure +from mitol.olposthog.features import configure configure() ``` @@ -22,9 +22,9 @@ configure() - `HOSTNAME` - The website's hostname. -#### Posthog app settings +#### OlPosthog app settings -All settings for the `mitol-django-posthog` app are prefaced with 'POSTHOG'. +All settings for the `mitol-django-olposthog` app are prefaced with 'POSTHOG'. - `POSTHOG_ENABLED` - `True` in order to enable Posthog feature flags in the application. `False` to disable Posthog feature flags. - `POSTHOG_PROJECT_API_KEY` - Required if POSTHOG_ENABLED is True. Private API key to communicate with PostHog. @@ -50,7 +50,7 @@ You must create the cache included in this library. This can be done by running #### Check single feature flag value You can check the value of a feature flag on Posthog with the following code: ``` -from mitol.posthog.features import is_enabled +from mitol.olposthog.features import is_enabled is_enabled() ``` This will return a boolean value based on whether the Posthog feature flag is True or False. @@ -58,6 +58,6 @@ This will return a boolean value based on whether the Posthog feature flag is Tr #### Retrieve all feature flags from Posthog You can retrieve all the feature flags from Posthog using: ``` -from mitol.posthog.features import is_enabled +from mitol.olposthog.features import is_enabled get_all_feature_flags() ``` diff --git a/src/mitol/posthog/__init__.py b/src/mitol/posthog/__init__.py index 17bf2a96..467594e9 100644 --- a/src/mitol/posthog/__init__.py +++ b/src/mitol/posthog/__init__.py @@ -1,5 +1,5 @@ -""" mitol.posthog """ -default_app_config = "mitol.posthog.apps.Posthog" +""" mitol.olposthog """ +default_app_config = "mitol.olposthog.apps.OlPosthog" __version__ = "2024.04.12.1" -__distributionname__ = "mitol-django-PostHog" +__distributionname__ = "mitol-django-OlPosthog" diff --git a/src/mitol/posthog/apps.py b/src/mitol/posthog/apps.py index ea80865d..8903f299 100644 --- a/src/mitol/posthog/apps.py +++ b/src/mitol/posthog/apps.py @@ -3,11 +3,11 @@ from mitol.common.apps import BaseApp -class Posthog(BaseApp): +class OlPosthog(BaseApp): default_auto_field = "django.db.models.BigAutoField" - name = "mitol.posthog" - label = "posthog" - verbose_name = "PostHog" + name = "mitol.olposthog" + label = "olposthog" + verbose_name = "OlPosthog" # necessary because this is a namespaced app path = os.path.dirname(os.path.abspath(__file__)) diff --git a/src/mitol/posthog/pyproject.toml b/src/mitol/posthog/pyproject.toml index f2c5ed12..2a7eca21 100644 --- a/src/mitol/posthog/pyproject.toml +++ b/src/mitol/posthog/pyproject.toml @@ -1,5 +1,5 @@ [project] -name = "mitol-posthog" +name = "mitol-olposthog" version = "2024.04.16" [tool.bumpver] diff --git a/src/mitol/posthog/settings/posthog.py b/src/mitol/posthog/settings/posthog.py index 59f04430..b9ce1ef1 100644 --- a/src/mitol/posthog/settings/posthog.py +++ b/src/mitol/posthog/settings/posthog.py @@ -12,7 +12,7 @@ ) POSTHOG_API_HOST = get_string( name="POSTHOG_API_HOST", - default="https://us.posthog.com", + default="https://us.olposthog.com", description="Host URL for the PostHog API", ) POSTHOG_FEATURE_FLAG_REQUEST_TIMEOUT_MS = get_int( diff --git a/tests/mitol/posthog/test_features.py b/tests/mitol/posthog/test_features.py index c8137a7f..15ba2cf9 100644 --- a/tests/mitol/posthog/test_features.py +++ b/tests/mitol/posthog/test_features.py @@ -8,13 +8,13 @@ from freezegun import freeze_time from mitol.common.utils.datetime import now_in_utc -from mitol.posthog import features +from mitol.olposthog import features pytestmark = [pytest.mark.django_db] """ -Tests for Posthog and caching functionality +Tests for OlPosthog and caching functionality - Test grabbing flags from Posthog with a cleared cache; they should hit Posthog and then the flag should be cached @@ -26,7 +26,7 @@ def test_flags_from_cache(mocker, caplog, settings): """Test that flags are pulled from cache successfully.""" get_feature_flag_mock = mocker.patch( - "get_feature_flag", autospec=True, return_value=True + "posthog.get_feature_flag", autospec=True, return_value=True ) durable_cache = caches["durable"] settings.FEATURES["testing_function"] = True @@ -67,10 +67,10 @@ def test_cache_population(mocker, settings): """Test that the cache is populated correctly when get_all_feature_flags is called.""" get_feature_flag_mock = mocker.patch( - "get_feature_flag", autospec=True, return_value=True + "posthog.get_feature_flag", autospec=True, return_value=True ) get_all_flags_mock = mocker.patch( - "get_all_flags", + "posthog.get_all_flags", autospec=True, return_value={ "testing_function_1": True, @@ -101,7 +101,7 @@ def test_posthog_flag_cache_timeout(mocker, settings): """Test that the cache gets invalidated as we expect""" get_feature_flag_mock = mocker.patch( - "get_feature_flag", autospec=True, return_value=True + "posthog.get_feature_flag", autospec=True, return_value=True ) durable_cache = caches["durable"] settings.POSTHOG_ENABLED = True diff --git a/tests/testapp/settings/shared.py b/tests/testapp/settings/shared.py index 8c246515..f316be9a 100644 --- a/tests/testapp/settings/shared.py +++ b/tests/testapp/settings/shared.py @@ -70,7 +70,7 @@ "mitol.openedx.apps.OpenedxApp", "mitol.payment_gateway.apps.PaymentGatewayApp", "mitol.geoip.apps.GeoIPApp", - "mitol.posthog.apps.Posthog", + "mitol.olposthog.apps.OlPosthog", # test app, integrates the reusable apps "testapp", ] From 66441aae4e0da084ccee33872d2e9faaa65efe8e Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Tue, 23 Apr 2024 13:20:16 -0400 Subject: [PATCH 15/29] Rename folders and files --- src/mitol/{posthog => olposthog}/BUILD | 0 src/mitol/{posthog => olposthog}/README.md | 0 src/mitol/{posthog => olposthog}/__init__.py | 0 src/mitol/{posthog => olposthog}/apps.py | 0 .../changelog.d/20240416_151714_collin_preston.rst | 0 src/mitol/{posthog => olposthog}/features.py | 0 src/mitol/{posthog => olposthog}/pyproject.toml | 0 src/mitol/{posthog => olposthog}/settings/__init__.py | 0 .../settings/posthog.py => olposthog/settings/olposthog.py} | 0 tests/mitol/{posthog => olposthog}/__init__.py | 0 tests/mitol/{posthog => olposthog}/test_features.py | 0 11 files changed, 0 insertions(+), 0 deletions(-) rename src/mitol/{posthog => olposthog}/BUILD (100%) rename src/mitol/{posthog => olposthog}/README.md (100%) rename src/mitol/{posthog => olposthog}/__init__.py (100%) rename src/mitol/{posthog => olposthog}/apps.py (100%) rename src/mitol/{posthog => olposthog}/changelog.d/20240416_151714_collin_preston.rst (100%) rename src/mitol/{posthog => olposthog}/features.py (100%) rename src/mitol/{posthog => olposthog}/pyproject.toml (100%) rename src/mitol/{posthog => olposthog}/settings/__init__.py (100%) rename src/mitol/{posthog/settings/posthog.py => olposthog/settings/olposthog.py} (100%) rename tests/mitol/{posthog => olposthog}/__init__.py (100%) rename tests/mitol/{posthog => olposthog}/test_features.py (100%) diff --git a/src/mitol/posthog/BUILD b/src/mitol/olposthog/BUILD similarity index 100% rename from src/mitol/posthog/BUILD rename to src/mitol/olposthog/BUILD diff --git a/src/mitol/posthog/README.md b/src/mitol/olposthog/README.md similarity index 100% rename from src/mitol/posthog/README.md rename to src/mitol/olposthog/README.md diff --git a/src/mitol/posthog/__init__.py b/src/mitol/olposthog/__init__.py similarity index 100% rename from src/mitol/posthog/__init__.py rename to src/mitol/olposthog/__init__.py diff --git a/src/mitol/posthog/apps.py b/src/mitol/olposthog/apps.py similarity index 100% rename from src/mitol/posthog/apps.py rename to src/mitol/olposthog/apps.py diff --git a/src/mitol/posthog/changelog.d/20240416_151714_collin_preston.rst b/src/mitol/olposthog/changelog.d/20240416_151714_collin_preston.rst similarity index 100% rename from src/mitol/posthog/changelog.d/20240416_151714_collin_preston.rst rename to src/mitol/olposthog/changelog.d/20240416_151714_collin_preston.rst diff --git a/src/mitol/posthog/features.py b/src/mitol/olposthog/features.py similarity index 100% rename from src/mitol/posthog/features.py rename to src/mitol/olposthog/features.py diff --git a/src/mitol/posthog/pyproject.toml b/src/mitol/olposthog/pyproject.toml similarity index 100% rename from src/mitol/posthog/pyproject.toml rename to src/mitol/olposthog/pyproject.toml diff --git a/src/mitol/posthog/settings/__init__.py b/src/mitol/olposthog/settings/__init__.py similarity index 100% rename from src/mitol/posthog/settings/__init__.py rename to src/mitol/olposthog/settings/__init__.py diff --git a/src/mitol/posthog/settings/posthog.py b/src/mitol/olposthog/settings/olposthog.py similarity index 100% rename from src/mitol/posthog/settings/posthog.py rename to src/mitol/olposthog/settings/olposthog.py diff --git a/tests/mitol/posthog/__init__.py b/tests/mitol/olposthog/__init__.py similarity index 100% rename from tests/mitol/posthog/__init__.py rename to tests/mitol/olposthog/__init__.py diff --git a/tests/mitol/posthog/test_features.py b/tests/mitol/olposthog/test_features.py similarity index 100% rename from tests/mitol/posthog/test_features.py rename to tests/mitol/olposthog/test_features.py From ba1b4f8fadae64cf857ca3d4a0562dd3c7b64686 Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Tue, 23 Apr 2024 13:59:15 -0400 Subject: [PATCH 16/29] try --- .../lockfiles/python-default.lockfile | 23 ++++++++++--------- src/mitol/olposthog/features.py | 8 +++---- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/build-support/lockfiles/python-default.lockfile b/build-support/lockfiles/python-default.lockfile index f5042075..4f335dd1 100644 --- a/build-support/lockfiles/python-default.lockfile +++ b/build-support/lockfiles/python-default.lockfile @@ -3385,13 +3385,13 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068", - "url": "https://files.pythonhosted.org/packages/55/72/4898c44ee9ea6f43396fbc23d9bfaf3d06e01b83698bdf2e4c919deceb7c/platformdirs-4.2.0-py3-none-any.whl" + "hash": "17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1", + "url": "https://files.pythonhosted.org/packages/b0/15/1691fa5aaddc0c4ea4901c26f6137c29d5f6673596fe960a0340e8c308e1/platformdirs-4.2.1-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768", - "url": "https://files.pythonhosted.org/packages/96/dc/c1d911bf5bb0fdc58cc05010e9f3efe3b67970cef779ba7fbc3183b987a8/platformdirs-4.2.0.tar.gz" + "hash": "031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf", + "url": "https://files.pythonhosted.org/packages/b2/e4/2856bf61e54d7e3a03dd00d0c1b5fa86e6081e8f262eb91befbe64d20937/platformdirs-4.2.1.tar.gz" } ], "project_name": "platformdirs", @@ -3399,6 +3399,7 @@ "appdirs==1.4.4; extra == \"test\"", "covdefaults>=2.3; extra == \"test\"", "furo>=2023.9.10; extra == \"docs\"", + "mypy>=1.8; extra == \"type\"", "proselint>=0.13; extra == \"docs\"", "pytest-cov>=4.1; extra == \"test\"", "pytest-mock>=3.12; extra == \"test\"", @@ -3407,7 +3408,7 @@ "sphinx>=7.2.6; extra == \"docs\"" ], "requires_python": ">=3.8", - "version": "4.2.0" + "version": "4.2.1" }, { "artifacts": [ @@ -3444,7 +3445,7 @@ "url": "https://files.pythonhosted.org/packages/d8/c8/8a7308d5355fedfc400098a75fd191cf615b55aa22ef2a937995326e6f5e/posthog-3.5.0.tar.gz" } ], - "project_name": "olposthog", + "project_name": "posthog", "requires_dists": [ "backoff>=1.10.0", "black; extra == \"dev\"", @@ -4681,13 +4682,13 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "5da9b8fe9e1254293756c16c008e8620b3d15fcc6dde6babde9541850e72a32d", - "url": "https://files.pythonhosted.org/packages/bb/f1/a384c5582d9a28e4a02eb1a2c279668053dd09aafeb08d2bd4dd323fc466/redis-5.0.3-py3-none-any.whl" + "hash": "7adc2835c7a9b5033b7ad8f8918d09b7344188228809c98df07af226d39dec91", + "url": "https://files.pythonhosted.org/packages/65/f2/540ad07910732733138beb192991c67c69e7f6ebf549ce1a3a77846cbae7/redis-5.0.4-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "4973bae7444c0fbed64a06b87446f79361cb7e4ec1538c022d696ed7a5015580", - "url": "https://files.pythonhosted.org/packages/eb/fc/8e822fd1e0a023c5ff80ca8c469b1d854c905ebb526ba38a90e7487c9897/redis-5.0.3.tar.gz" + "hash": "ec31f2ed9675cc54c21ba854cfe0462e6faf1d83c8ce5944709db8a4700b9c61", + "url": "https://files.pythonhosted.org/packages/cd/9c/1d57b0f61402aabdd9c3b2882e3fddd86a269c1df2cfd2e77daa607ef047/redis-5.0.4.tar.gz" } ], "project_name": "redis", @@ -4701,7 +4702,7 @@ "typing-extensions; python_version < \"3.8\"" ], "requires_python": ">=3.7", - "version": "5.0.3" + "version": "5.0.4" }, { "artifacts": [ diff --git a/src/mitol/olposthog/features.py b/src/mitol/olposthog/features.py index afb6eccc..09465675 100644 --- a/src/mitol/olposthog/features.py +++ b/src/mitol/olposthog/features.py @@ -5,7 +5,7 @@ import logging from typing import Optional -import posthog +import olposthog from django.conf import settings from django.contrib.auth import get_user_model from django.core.cache import caches @@ -26,7 +26,7 @@ def configure(): The posthog library normally takes care of this but it doesn't expose all the client config options. """ - posthog.default_client = posthog.Client( + olposthog.default_client = olposthog.Client( api_key=getattr(settings, "POSTHOG_PROJECT_API_KEY", None), host=getattr(settings, "POSTHOG_API_HOST", None), debug=settings.DEBUG, @@ -84,7 +84,7 @@ def get_all_feature_flags(opt_unique_id: Optional[str] = None): unique_id = opt_unique_id or default_unique_id() person_properties = _get_person_properties(unique_id) - flag_data = posthog.get_all_flags( + flag_data = olposthog.get_all_flags( unique_id, person_properties=person_properties, ) @@ -132,7 +132,7 @@ def is_enabled( # value will be None if either there is no value or we can't get a response back value = ( - posthog.get_feature_flag( + olposthog.get_feature_flag( name, unique_id, person_properties=person_properties, From 9d4ffbd3fc968836bfcd04eeec94dec385bfc63a Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Tue, 23 Apr 2024 14:14:46 -0400 Subject: [PATCH 17/29] fix import naming --- src/mitol/olposthog/BUILD | 2 +- src/mitol/olposthog/features.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/mitol/olposthog/BUILD b/src/mitol/olposthog/BUILD index 32f10238..a745b263 100644 --- a/src/mitol/olposthog/BUILD +++ b/src/mitol/olposthog/BUILD @@ -22,6 +22,6 @@ python_distribution( dependencies=[":olposthog"], provides=setup_py( name="mitol-django-olposthog", - description="MIT Open Learning django app extensions for OlPosthog", + description="MIT Open Learning django app extensions for Posthog.", ), ) diff --git a/src/mitol/olposthog/features.py b/src/mitol/olposthog/features.py index 09465675..afb6eccc 100644 --- a/src/mitol/olposthog/features.py +++ b/src/mitol/olposthog/features.py @@ -5,7 +5,7 @@ import logging from typing import Optional -import olposthog +import posthog from django.conf import settings from django.contrib.auth import get_user_model from django.core.cache import caches @@ -26,7 +26,7 @@ def configure(): The posthog library normally takes care of this but it doesn't expose all the client config options. """ - olposthog.default_client = olposthog.Client( + posthog.default_client = posthog.Client( api_key=getattr(settings, "POSTHOG_PROJECT_API_KEY", None), host=getattr(settings, "POSTHOG_API_HOST", None), debug=settings.DEBUG, @@ -84,7 +84,7 @@ def get_all_feature_flags(opt_unique_id: Optional[str] = None): unique_id = opt_unique_id or default_unique_id() person_properties = _get_person_properties(unique_id) - flag_data = olposthog.get_all_flags( + flag_data = posthog.get_all_flags( unique_id, person_properties=person_properties, ) @@ -132,7 +132,7 @@ def is_enabled( # value will be None if either there is no value or we can't get a response back value = ( - olposthog.get_feature_flag( + posthog.get_feature_flag( name, unique_id, person_properties=person_properties, From 4c9d08be0826faadbb50f4ea15060cebac7d25ba Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Tue, 23 Apr 2024 14:21:55 -0400 Subject: [PATCH 18/29] maybe fix --- tests/mitol/olposthog/test_features.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/mitol/olposthog/test_features.py b/tests/mitol/olposthog/test_features.py index 15ba2cf9..275e51cd 100644 --- a/tests/mitol/olposthog/test_features.py +++ b/tests/mitol/olposthog/test_features.py @@ -105,6 +105,7 @@ def test_posthog_flag_cache_timeout(mocker, settings): ) durable_cache = caches["durable"] settings.POSTHOG_ENABLED = True + settings.HOSTNAME = "fake_host_name" durable_cache.clear() From f1661e493da6c40a893a7c1b5204c613d2d09773 Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Tue, 23 Apr 2024 14:27:14 -0400 Subject: [PATCH 19/29] Fix again --- tests/mitol/olposthog/test_features.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/mitol/olposthog/test_features.py b/tests/mitol/olposthog/test_features.py index 275e51cd..d86c13ad 100644 --- a/tests/mitol/olposthog/test_features.py +++ b/tests/mitol/olposthog/test_features.py @@ -106,6 +106,7 @@ def test_posthog_flag_cache_timeout(mocker, settings): durable_cache = caches["durable"] settings.POSTHOG_ENABLED = True settings.HOSTNAME = "fake_host_name" + settings.ENVIRONMENT = "prod" durable_cache.clear() From 198ca2e8c869a6ce9427134a1da59741045a701b Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Tue, 23 Apr 2024 14:35:52 -0400 Subject: [PATCH 20/29] Udpate --- tests/mitol/olposthog/test_features.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/mitol/olposthog/test_features.py b/tests/mitol/olposthog/test_features.py index d86c13ad..0a91ead9 100644 --- a/tests/mitol/olposthog/test_features.py +++ b/tests/mitol/olposthog/test_features.py @@ -107,6 +107,7 @@ def test_posthog_flag_cache_timeout(mocker, settings): settings.POSTHOG_ENABLED = True settings.HOSTNAME = "fake_host_name" settings.ENVIRONMENT = "prod" + settings.FEATURES["testing_function"] = True durable_cache.clear() From 4aa3d79301b694eb12a6d22194363a8827cd5132 Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Tue, 23 Apr 2024 14:43:26 -0400 Subject: [PATCH 21/29] another try --- tests/mitol/olposthog/test_features.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/mitol/olposthog/test_features.py b/tests/mitol/olposthog/test_features.py index 0a91ead9..e01c2104 100644 --- a/tests/mitol/olposthog/test_features.py +++ b/tests/mitol/olposthog/test_features.py @@ -9,6 +9,7 @@ from mitol.common.utils.datetime import now_in_utc from mitol.olposthog import features +from django.conf import settings pytestmark = [pytest.mark.django_db] @@ -23,7 +24,7 @@ """ -def test_flags_from_cache(mocker, caplog, settings): +def test_flags_from_cache(mocker, caplog): """Test that flags are pulled from cache successfully.""" get_feature_flag_mock = mocker.patch( "posthog.get_feature_flag", autospec=True, return_value=True @@ -63,7 +64,7 @@ def test_flags_from_cache(mocker, caplog, settings): assert "from the cache" in caplog.text -def test_cache_population(mocker, settings): +def test_cache_population(mocker): """Test that the cache is populated correctly when get_all_feature_flags is called.""" get_feature_flag_mock = mocker.patch( @@ -97,7 +98,7 @@ def test_cache_population(mocker, settings): get_feature_flag_mock.assert_not_called() -def test_posthog_flag_cache_timeout(mocker, settings): +def test_posthog_flag_cache_timeout(mocker): """Test that the cache gets invalidated as we expect""" get_feature_flag_mock = mocker.patch( From cec997283fd2d6e5e89a7cab2b8616ee77772bf2 Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Tue, 23 Apr 2024 14:47:32 -0400 Subject: [PATCH 22/29] format --- tests/mitol/olposthog/test_features.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/mitol/olposthog/test_features.py b/tests/mitol/olposthog/test_features.py index e01c2104..b404d763 100644 --- a/tests/mitol/olposthog/test_features.py +++ b/tests/mitol/olposthog/test_features.py @@ -4,12 +4,12 @@ from datetime import timedelta import pytest +from django.conf import settings from django.core.cache import caches from freezegun import freeze_time from mitol.common.utils.datetime import now_in_utc from mitol.olposthog import features -from django.conf import settings pytestmark = [pytest.mark.django_db] From aef54ee296f03c03cb394d8f49df4935a66a1c79 Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Tue, 23 Apr 2024 15:26:16 -0400 Subject: [PATCH 23/29] small fixes --- src/mitol/olposthog/settings/olposthog.py | 2 +- tests/mitol/olposthog/test_features.py | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/mitol/olposthog/settings/olposthog.py b/src/mitol/olposthog/settings/olposthog.py index b9ce1ef1..59f04430 100644 --- a/src/mitol/olposthog/settings/olposthog.py +++ b/src/mitol/olposthog/settings/olposthog.py @@ -12,7 +12,7 @@ ) POSTHOG_API_HOST = get_string( name="POSTHOG_API_HOST", - default="https://us.olposthog.com", + default="https://us.posthog.com", description="Host URL for the PostHog API", ) POSTHOG_FEATURE_FLAG_REQUEST_TIMEOUT_MS = get_int( diff --git a/tests/mitol/olposthog/test_features.py b/tests/mitol/olposthog/test_features.py index b404d763..0a91ead9 100644 --- a/tests/mitol/olposthog/test_features.py +++ b/tests/mitol/olposthog/test_features.py @@ -4,7 +4,6 @@ from datetime import timedelta import pytest -from django.conf import settings from django.core.cache import caches from freezegun import freeze_time @@ -24,7 +23,7 @@ """ -def test_flags_from_cache(mocker, caplog): +def test_flags_from_cache(mocker, caplog, settings): """Test that flags are pulled from cache successfully.""" get_feature_flag_mock = mocker.patch( "posthog.get_feature_flag", autospec=True, return_value=True @@ -64,7 +63,7 @@ def test_flags_from_cache(mocker, caplog): assert "from the cache" in caplog.text -def test_cache_population(mocker): +def test_cache_population(mocker, settings): """Test that the cache is populated correctly when get_all_feature_flags is called.""" get_feature_flag_mock = mocker.patch( @@ -98,7 +97,7 @@ def test_cache_population(mocker): get_feature_flag_mock.assert_not_called() -def test_posthog_flag_cache_timeout(mocker): +def test_posthog_flag_cache_timeout(mocker, settings): """Test that the cache gets invalidated as we expect""" get_feature_flag_mock = mocker.patch( From 26303c6a0fef7390901475af6cf9e0b2d3c1ea6c Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Tue, 23 Apr 2024 15:46:22 -0400 Subject: [PATCH 24/29] ytuytf --- tests/mitol/olposthog/test_features.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/mitol/olposthog/test_features.py b/tests/mitol/olposthog/test_features.py index 0a91ead9..cb56b910 100644 --- a/tests/mitol/olposthog/test_features.py +++ b/tests/mitol/olposthog/test_features.py @@ -107,7 +107,7 @@ def test_posthog_flag_cache_timeout(mocker, settings): settings.POSTHOG_ENABLED = True settings.HOSTNAME = "fake_host_name" settings.ENVIRONMENT = "prod" - settings.FEATURES["testing_function"] = True + settings.FEATURES = [{"testing_function_1": True}] durable_cache.clear() From 911dab27a32a78bcba1af61565be1bc09250cf96 Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Tue, 23 Apr 2024 15:51:53 -0400 Subject: [PATCH 25/29] Add features --- tests/testapp/settings/test.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/testapp/settings/test.py b/tests/testapp/settings/test.py index e8865c48..134916f3 100644 --- a/tests/testapp/settings/test.py +++ b/tests/testapp/settings/test.py @@ -25,3 +25,5 @@ "LOCATION": "durable_cache", }, } + +FEATURES = [] From f914a2a046b910d7b9449b2ee9caaa1e412ba3ef Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Tue, 23 Apr 2024 16:16:50 -0400 Subject: [PATCH 26/29] Tests pass locally --- tests/mitol/olposthog/test_features.py | 6 +++++- tests/testapp/settings/test.py | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/mitol/olposthog/test_features.py b/tests/mitol/olposthog/test_features.py index cb56b910..5111d93d 100644 --- a/tests/mitol/olposthog/test_features.py +++ b/tests/mitol/olposthog/test_features.py @@ -31,6 +31,8 @@ def test_flags_from_cache(mocker, caplog, settings): durable_cache = caches["durable"] settings.FEATURES["testing_function"] = True settings.POSTHOG_ENABLED = True + settings.ENVIRONMENT = "prod" + settings.HOSTNAME = "fake_host_name" cache_key = features._generate_cache_key( "testing_function", features.default_unique_id(), @@ -85,6 +87,8 @@ def test_cache_population(mocker, settings): settings.FEATURES["testing_function_2"] = True settings.FEATURES["testing_function_3"] = True settings.POSTHOG_ENABLED = True + settings.ENVIRONMENT = "prod" + settings.HOSTNAME = "fake_host_name" durable_cache.clear() @@ -107,7 +111,7 @@ def test_posthog_flag_cache_timeout(mocker, settings): settings.POSTHOG_ENABLED = True settings.HOSTNAME = "fake_host_name" settings.ENVIRONMENT = "prod" - settings.FEATURES = [{"testing_function_1": True}] + settings.FEATURES["testing_function"] = True durable_cache.clear() diff --git a/tests/testapp/settings/test.py b/tests/testapp/settings/test.py index 134916f3..34d82ada 100644 --- a/tests/testapp/settings/test.py +++ b/tests/testapp/settings/test.py @@ -26,4 +26,4 @@ }, } -FEATURES = [] +FEATURES = {} From 4327f3c084298696f6dbcf9d0111a38ea17e3dbf Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Tue, 23 Apr 2024 17:02:54 -0400 Subject: [PATCH 27/29] Add change logs --- ...ove_resilience_of_posthog_integration_1.md | 41 +++++++++++++++++++ ...ove_resilience_of_posthog_integration_1.md | 39 ++++++++++++++++++ ...ve_resilience_of_posthog_integration_1.rst | 33 +++++++++++++++ ...ove_resilience_of_posthog_integration_1.md | 39 ++++++++++++++++++ ...ove_resilience_of_posthog_integration_1.md | 39 ++++++++++++++++++ ...ove_resilience_of_posthog_integration_1.md | 39 ++++++++++++++++++ ...ove_resilience_of_posthog_integration_1.md | 39 ++++++++++++++++++ ...ove_resilience_of_posthog_integration_1.md | 39 ++++++++++++++++++ ...ove_resilience_of_posthog_integration_1.md | 39 ++++++++++++++++++ ...ove_resilience_of_posthog_integration_1.md | 39 ++++++++++++++++++ ...ove_resilience_of_posthog_integration_1.md | 39 ++++++++++++++++++ 11 files changed, 425 insertions(+) create mode 100644 src/mitol/common/changelog.d/20240423_165722_collin_preston_2116_improve_resilience_of_posthog_integration_1.md create mode 100644 src/mitol/digitalcredentials/changelog.d/20240423_165752_collin_preston_2116_improve_resilience_of_posthog_integration_1.md create mode 100644 src/mitol/geoip/changelog.d/20240423_165759_collin_preston_2116_improve_resilience_of_posthog_integration_1.rst create mode 100644 src/mitol/google_sheets/changelog.d/20240423_165804_collin_preston_2116_improve_resilience_of_posthog_integration_1.md create mode 100644 src/mitol/google_sheets_deferrals/changelog.d/20240423_165810_collin_preston_2116_improve_resilience_of_posthog_integration_1.md create mode 100644 src/mitol/google_sheets_refunds/changelog.d/20240423_165817_collin_preston_2116_improve_resilience_of_posthog_integration_1.md create mode 100644 src/mitol/hubspot_api/changelog.d/20240423_165824_collin_preston_2116_improve_resilience_of_posthog_integration_1.md create mode 100644 src/mitol/mail/changelog.d/20240423_165830_collin_preston_2116_improve_resilience_of_posthog_integration_1.md create mode 100644 src/mitol/oauth_toolkit_extensions/changelog.d/20240423_165835_collin_preston_2116_improve_resilience_of_posthog_integration_1.md create mode 100644 src/mitol/openedx/changelog.d/20240423_165841_collin_preston_2116_improve_resilience_of_posthog_integration_1.md create mode 100644 src/mitol/payment_gateway/changelog.d/20240423_165846_collin_preston_2116_improve_resilience_of_posthog_integration_1.md diff --git a/src/mitol/common/changelog.d/20240423_165722_collin_preston_2116_improve_resilience_of_posthog_integration_1.md b/src/mitol/common/changelog.d/20240423_165722_collin_preston_2116_improve_resilience_of_posthog_integration_1.md new file mode 100644 index 00000000..18b37102 --- /dev/null +++ b/src/mitol/common/changelog.d/20240423_165722_collin_preston_2116_improve_resilience_of_posthog_integration_1.md @@ -0,0 +1,41 @@ + + + + + +### Changed + +- Added posthog application. + + + + diff --git a/src/mitol/digitalcredentials/changelog.d/20240423_165752_collin_preston_2116_improve_resilience_of_posthog_integration_1.md b/src/mitol/digitalcredentials/changelog.d/20240423_165752_collin_preston_2116_improve_resilience_of_posthog_integration_1.md new file mode 100644 index 00000000..addf6363 --- /dev/null +++ b/src/mitol/digitalcredentials/changelog.d/20240423_165752_collin_preston_2116_improve_resilience_of_posthog_integration_1.md @@ -0,0 +1,39 @@ + + + + +### Changed + +- Added posthog application. + + + diff --git a/src/mitol/geoip/changelog.d/20240423_165759_collin_preston_2116_improve_resilience_of_posthog_integration_1.rst b/src/mitol/geoip/changelog.d/20240423_165759_collin_preston_2116_improve_resilience_of_posthog_integration_1.rst new file mode 100644 index 00000000..e692e7b6 --- /dev/null +++ b/src/mitol/geoip/changelog.d/20240423_165759_collin_preston_2116_improve_resilience_of_posthog_integration_1.rst @@ -0,0 +1,33 @@ +.. A new scriv changelog fragment. +.. +.. Uncomment the header that is right (remove the leading dots). +.. +.. Removed +.. ------- +.. +.. - A bullet item for the Removed category. +.. +.. Added +.. ----- +.. +.. - A bullet item for the Added category. +.. +### Changed + +- Added posthog application. +.. +.. Deprecated +.. ---------- +.. +.. - A bullet item for the Deprecated category. +.. +.. Fixed +.. ----- +.. +.. - A bullet item for the Fixed category. +.. +.. Security +.. -------- +.. +.. - A bullet item for the Security category. +.. diff --git a/src/mitol/google_sheets/changelog.d/20240423_165804_collin_preston_2116_improve_resilience_of_posthog_integration_1.md b/src/mitol/google_sheets/changelog.d/20240423_165804_collin_preston_2116_improve_resilience_of_posthog_integration_1.md new file mode 100644 index 00000000..addf6363 --- /dev/null +++ b/src/mitol/google_sheets/changelog.d/20240423_165804_collin_preston_2116_improve_resilience_of_posthog_integration_1.md @@ -0,0 +1,39 @@ + + + + +### Changed + +- Added posthog application. + + + diff --git a/src/mitol/google_sheets_deferrals/changelog.d/20240423_165810_collin_preston_2116_improve_resilience_of_posthog_integration_1.md b/src/mitol/google_sheets_deferrals/changelog.d/20240423_165810_collin_preston_2116_improve_resilience_of_posthog_integration_1.md new file mode 100644 index 00000000..addf6363 --- /dev/null +++ b/src/mitol/google_sheets_deferrals/changelog.d/20240423_165810_collin_preston_2116_improve_resilience_of_posthog_integration_1.md @@ -0,0 +1,39 @@ + + + + +### Changed + +- Added posthog application. + + + diff --git a/src/mitol/google_sheets_refunds/changelog.d/20240423_165817_collin_preston_2116_improve_resilience_of_posthog_integration_1.md b/src/mitol/google_sheets_refunds/changelog.d/20240423_165817_collin_preston_2116_improve_resilience_of_posthog_integration_1.md new file mode 100644 index 00000000..addf6363 --- /dev/null +++ b/src/mitol/google_sheets_refunds/changelog.d/20240423_165817_collin_preston_2116_improve_resilience_of_posthog_integration_1.md @@ -0,0 +1,39 @@ + + + + +### Changed + +- Added posthog application. + + + diff --git a/src/mitol/hubspot_api/changelog.d/20240423_165824_collin_preston_2116_improve_resilience_of_posthog_integration_1.md b/src/mitol/hubspot_api/changelog.d/20240423_165824_collin_preston_2116_improve_resilience_of_posthog_integration_1.md new file mode 100644 index 00000000..addf6363 --- /dev/null +++ b/src/mitol/hubspot_api/changelog.d/20240423_165824_collin_preston_2116_improve_resilience_of_posthog_integration_1.md @@ -0,0 +1,39 @@ + + + + +### Changed + +- Added posthog application. + + + diff --git a/src/mitol/mail/changelog.d/20240423_165830_collin_preston_2116_improve_resilience_of_posthog_integration_1.md b/src/mitol/mail/changelog.d/20240423_165830_collin_preston_2116_improve_resilience_of_posthog_integration_1.md new file mode 100644 index 00000000..addf6363 --- /dev/null +++ b/src/mitol/mail/changelog.d/20240423_165830_collin_preston_2116_improve_resilience_of_posthog_integration_1.md @@ -0,0 +1,39 @@ + + + + +### Changed + +- Added posthog application. + + + diff --git a/src/mitol/oauth_toolkit_extensions/changelog.d/20240423_165835_collin_preston_2116_improve_resilience_of_posthog_integration_1.md b/src/mitol/oauth_toolkit_extensions/changelog.d/20240423_165835_collin_preston_2116_improve_resilience_of_posthog_integration_1.md new file mode 100644 index 00000000..addf6363 --- /dev/null +++ b/src/mitol/oauth_toolkit_extensions/changelog.d/20240423_165835_collin_preston_2116_improve_resilience_of_posthog_integration_1.md @@ -0,0 +1,39 @@ + + + + +### Changed + +- Added posthog application. + + + diff --git a/src/mitol/openedx/changelog.d/20240423_165841_collin_preston_2116_improve_resilience_of_posthog_integration_1.md b/src/mitol/openedx/changelog.d/20240423_165841_collin_preston_2116_improve_resilience_of_posthog_integration_1.md new file mode 100644 index 00000000..addf6363 --- /dev/null +++ b/src/mitol/openedx/changelog.d/20240423_165841_collin_preston_2116_improve_resilience_of_posthog_integration_1.md @@ -0,0 +1,39 @@ + + + + +### Changed + +- Added posthog application. + + + diff --git a/src/mitol/payment_gateway/changelog.d/20240423_165846_collin_preston_2116_improve_resilience_of_posthog_integration_1.md b/src/mitol/payment_gateway/changelog.d/20240423_165846_collin_preston_2116_improve_resilience_of_posthog_integration_1.md new file mode 100644 index 00000000..addf6363 --- /dev/null +++ b/src/mitol/payment_gateway/changelog.d/20240423_165846_collin_preston_2116_improve_resilience_of_posthog_integration_1.md @@ -0,0 +1,39 @@ + + + + +### Changed + +- Added posthog application. + + + From 3949b6af7691a7b9cfb8ec3f583cf711fe6c7f12 Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Tue, 23 Apr 2024 17:07:49 -0400 Subject: [PATCH 28/29] Auth changelog --- ...ove_resilience_of_posthog_integration_1.md | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/mitol/authentication/changelog.d/20240423_170730_collin_preston_2116_improve_resilience_of_posthog_integration_1.md diff --git a/src/mitol/authentication/changelog.d/20240423_170730_collin_preston_2116_improve_resilience_of_posthog_integration_1.md b/src/mitol/authentication/changelog.d/20240423_170730_collin_preston_2116_improve_resilience_of_posthog_integration_1.md new file mode 100644 index 00000000..addf6363 --- /dev/null +++ b/src/mitol/authentication/changelog.d/20240423_170730_collin_preston_2116_improve_resilience_of_posthog_integration_1.md @@ -0,0 +1,39 @@ + + + + +### Changed + +- Added posthog application. + + + From 214b4f3f92bcc56683ce22fc859962eba7a07067 Mon Sep 17 00:00:00 2001 From: Collin Preston Date: Wed, 24 Apr 2024 15:05:21 -0400 Subject: [PATCH 29/29] Code review comments --- src/mitol/olposthog/README.md | 2 +- .../changelog.d/20240416_151714_collin_preston.rst | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/mitol/olposthog/README.md b/src/mitol/olposthog/README.md index 33d9f8f2..c5879dcb 100644 --- a/src/mitol/olposthog/README.md +++ b/src/mitol/olposthog/README.md @@ -58,6 +58,6 @@ This will return a boolean value based on whether the Posthog feature flag is Tr #### Retrieve all feature flags from Posthog You can retrieve all the feature flags from Posthog using: ``` -from mitol.olposthog.features import is_enabled +from mitol.olposthog.features import get_all_feature_flags get_all_feature_flags() ``` diff --git a/src/mitol/olposthog/changelog.d/20240416_151714_collin_preston.rst b/src/mitol/olposthog/changelog.d/20240416_151714_collin_preston.rst index 5a41ace6..e1f8c38f 100644 --- a/src/mitol/olposthog/changelog.d/20240416_151714_collin_preston.rst +++ b/src/mitol/olposthog/changelog.d/20240416_151714_collin_preston.rst @@ -7,10 +7,10 @@ .. .. - A bullet item for the Removed category. .. -.. Added -.. ----- -.. -.. - A bullet item for the Added category. +Added +----- + +- Added posthog application. .. .. Changed .. -------