From 3e2fca6429dc94e29b473fc02c6394a2a22bc544 Mon Sep 17 00:00:00 2001 From: Rohini Chandra <61837065+r14chandra@users.noreply.github.com> Date: Thu, 28 Nov 2024 17:27:49 +0530 Subject: [PATCH] RHINENG-14556 remove old code to keep the new service independent --- Dockerfile | 4 +- ansible-playbooks/README.md | 3 - ansible-playbooks/ros_disable.yml | 49 - ansible-playbooks/ros_install_and_set_up.yml | 94 - clowdapp.yaml | 258 +-- ...hboard-insights-ros-general.configmap.yaml | 1428 ------------- docs/db_schema.puml | 94 - docs/ros_sequence.puml | 24 - poetry.lock | 1882 +++++++++-------- pr_check.sh | 2 +- ros/api/__init__.py | 0 ros/api/common/add_group_filter.py | 46 - ros/api/common/instance_types_helper.py | 11 - ros/api/common/pagination.py | 93 - ros/api/common/utils.py | 114 - ros/api/main.py | 18 - ros/api/modules/recommendations.py | 50 - ros/api/routes.py | 30 - ros/api/v1/call_to_action.py | 62 - ros/api/v1/hosts.py | 574 ----- ros/api/v1/openapi_spec.py | 7 - ros/api/v1/recommendation_ratings.py | 46 - ros/api/v1/recommendations.py | 75 - ros/api/v1/status.py | 8 - ros/api/v1/suggested_instance_types.py | 210 -- ros/openapi/openapi.json | 1051 --------- ros/processor/event_producer.py | 68 - ros/processor/garbage_collector.py | 60 - ros/processor/insights_engine_consumer.py | 277 --- ros/processor/inventory_events_consumer.py | 236 --- run_org_id_populator.yaml | 9 - tests/conftest.py | 5 - tests/test_api_endpoints.py | 802 ------- tests/test_archive_processor.py | 97 - tests/test_garbage_collector.py | 55 - tests/test_insights_engine_result_consumer.py | 250 --- tests/test_inventory_events_consumer.py | 148 -- 37 files changed, 972 insertions(+), 7268 deletions(-) delete mode 100644 ansible-playbooks/README.md delete mode 100644 ansible-playbooks/ros_disable.yml delete mode 100644 ansible-playbooks/ros_install_and_set_up.yml delete mode 100644 dashboards/grafana-dashboard-insights-ros-general.configmap.yaml delete mode 100644 docs/db_schema.puml delete mode 100644 docs/ros_sequence.puml delete mode 100644 ros/api/__init__.py delete mode 100644 ros/api/common/add_group_filter.py delete mode 100644 ros/api/common/instance_types_helper.py delete mode 100644 ros/api/common/pagination.py delete mode 100644 ros/api/common/utils.py delete mode 100644 ros/api/main.py delete mode 100644 ros/api/modules/recommendations.py delete mode 100644 ros/api/routes.py delete mode 100644 ros/api/v1/call_to_action.py delete mode 100644 ros/api/v1/hosts.py delete mode 100644 ros/api/v1/openapi_spec.py delete mode 100644 ros/api/v1/recommendation_ratings.py delete mode 100644 ros/api/v1/recommendations.py delete mode 100644 ros/api/v1/status.py delete mode 100644 ros/api/v1/suggested_instance_types.py delete mode 100644 ros/openapi/openapi.json delete mode 100644 ros/processor/event_producer.py delete mode 100644 ros/processor/garbage_collector.py delete mode 100644 ros/processor/insights_engine_consumer.py delete mode 100644 ros/processor/inventory_events_consumer.py delete mode 100644 run_org_id_populator.yaml delete mode 100644 tests/conftest.py delete mode 100644 tests/test_api_endpoints.py delete mode 100644 tests/test_archive_processor.py delete mode 100644 tests/test_garbage_collector.py delete mode 100644 tests/test_insights_engine_result_consumer.py delete mode 100644 tests/test_inventory_events_consumer.py diff --git a/Dockerfile b/Dockerfile index 31d51871..26f01625 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,10 +17,8 @@ ENV VIRTUAL_ENV=/app_root/src \ PATH="/app_root/src/bin:$POETRY_HOME/bin:$PATH" WORKDIR /app_root/src -COPY pyproject.toml poetry.lock manage.py seed.py gunicorn.conf.py ./ +COPY pyproject.toml poetry.lock gunicorn.conf.py ./ COPY ros ros -COPY migrations migrations -COPY seed.d seed.d RUN python -m venv $VIRTUAL_ENV && \ $VIRTUAL_ENV/bin/pip install --upgrade pip==$PYTHON_PIP_VERSION setuptools wheel && \ diff --git a/ansible-playbooks/README.md b/ansible-playbooks/README.md deleted file mode 100644 index 3a677369..00000000 --- a/ansible-playbooks/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# ROS ansible playbooks - -Ansible playbooks to Enable/Disable ROS service through service enablement dashboard diff --git a/ansible-playbooks/ros_disable.yml b/ansible-playbooks/ros_disable.yml deleted file mode 100644 index 97547f2e..00000000 --- a/ansible-playbooks/ros_disable.yml +++ /dev/null @@ -1,49 +0,0 @@ -# This playbook will take care of all steps required to remove -# Insights resource-optimization (pcp packages) -# Optionally with the tag "clean-up", it will remove pcp package and its dependencies - -- hosts: all - become: yes - tasks: - - name: Ensure PCP service is stopped - systemd: - state: stopped - enabled: no - name: "{{ item }}" - with_items: - - 'pmcd' - - 'pmlogger' - tags: - - always - - name: Remove ROS pmlogger service instance - lineinfile: - dest: /etc/pcp/pmlogger/control.d/local - regexp: ".*config.ros.*" - state: absent - tags: - - always - - name: Remove ROS configuration file - file: - state: absent - path: /var/lib/pcp/config/pmlogger/config.ros - tags: - - always - - name: Remove pcp package and dependencies - yum: - name: pcp - state: absent - when: "'clean-up' in ansible_run_tags" - tags: - - always - - name: Restart PCP service - systemd: - state: restarted - enabled: yes - name: "{{ item }}" - with_items: - - 'pmcd' - - 'pmlogger' - when: "'clean-up' not in ansible_run_tags" - tags: - - always - diff --git a/ansible-playbooks/ros_install_and_set_up.yml b/ansible-playbooks/ros_install_and_set_up.yml deleted file mode 100644 index 04dd966e..00000000 --- a/ansible-playbooks/ros_install_and_set_up.yml +++ /dev/null @@ -1,94 +0,0 @@ ---- -# Steps required to get system ready for the Insights resource-optimization service: -# 1. Check if insights-client is installed on system. -# 2. Check if core_collect is enabled on system. -# 3. Install pcp package on your system. -# 4. Configure pmlogger -# 5. Create configuration file for pcp -# 6. Start and enable pmcd service -# 7. Start and enable pmlogger service - -- hosts: all - become: yes - gather_facts: True - tasks: - - name: Ensure latest version of insights-client is installed - yum: - name: insights-client - state: latest - - - name: Ensure core_collect is enabled in insights-client.conf - lineinfile: - state: present - dest: /etc/insights-client/insights-client.conf - insertafter: "^#core_collect=True" - line: "core_collect=True" - when: not ansible_check_mode - - - name: Install pcp packages - yum: - name: pcp - state: latest - - - name: Configure pmlogger - lineinfile: - dest: /etc/pcp/pmlogger/control.d/local - regexp: ".*config.ros.*" - line: "LOCALHOSTNAME n n PCP_LOG_DIR/pmlogger/ros -r -T24h10m -c config.ros -v 100Mb" - create: yes - - - name: Create pcp configuration file for ROS - copy: - dest: /var/lib/pcp/config/pmlogger/config.ros - content: | - log mandatory on default { - hinv.ncpu - mem.physmem - mem.util.available - disk.dev.total - kernel.all.cpu.idle - kernel.all.pressure.cpu.some.avg - kernel.all.pressure.io.full.avg - kernel.all.pressure.io.some.avg - kernel.all.pressure.memory.full.avg - kernel.all.pressure.memory.some.avg - } - [access] - disallow .* : all; - disallow :* : all; - allow local:* : enquire; - - - name: Ensure pcp services are running - systemd: - state: started - enabled: yes - name: "{{ item }}" - with_items: - - 'pmcd' - - 'pmlogger' - - - name: (Re)Register insights-client and upload archive - shell: insights-client --register - - - name: Get system's Insights-ID - shell: cat /etc/insights-client/machine-id - register: insights_id - - - name: Fetch system's information from Insights inventory - environment: - SSL_CERT_FILE: /etc/rhsm/ca/redhat-uep.pem - uri: - url: "https://cert-api.access.redhat.com/r/insights/platform/inventory/v1/hosts?insights_id={{ insights_id.stdout }}" - method: GET - client_cert: /etc/pki/consumer/cert.pem - client_key: /etc/pki/consumer/key.pem - validate_certs: yes - body_format: json - return_content: yes - register: inventory - - - name: ROS setup successful - debug: - msg: > - Red Hat Insights Resource Optimization Service configured successfully. Please wait for 24 hours. - View details about this system at https://console.redhat.com/insights/ros/{{ inventory['json']['results'][0]['id'] }}" diff --git a/clowdapp.yaml b/clowdapp.yaml index f82eff71..012e0ef6 100644 --- a/clowdapp.yaml +++ b/clowdapp.yaml @@ -2,236 +2,19 @@ apiVersion: v1 kind: Template metadata: - name: ros-backend + name: ros-backend-pcp-zeroconf objects: - apiVersion: cloud.redhat.com/v1alpha1 kind: ClowdApp metadata: - name: ros-backend + name: ros-backend-pcp-zeroconf spec: envName: ${ENV_NAME} featureFlags: true dependencies: - host-inventory - rbac - - engine deployments: - - name: api - replicas: ${{API_REPLICA_COUNT}} - webServices: - public: - enabled: true - apiPath: ros - podSpec: - image: ${IMAGE}:${IMAGE_TAG} - command: ["sh"] - args: ["-c", "export FLASK_APP=manage.py && poetry run flask db upgrade && poetry run flask seed && poetry run gunicorn ros.api.main:app"] - resources: - requests: - cpu: ${CPU_REQUEST_ROSRHEL} - memory: ${MEMORY_REQUEST_ROSRHEL} - limits: - cpu: ${CPU_LIMIT_ROSRHEL} - memory: ${MEMORY_LIMIT_ROSRHEL} - livenessProbe: - failureThreshold: 3 - httpGet: - path: /api/ros/v1/status - port: 8000 - scheme: HTTP - initialDelaySeconds: 30 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 3 - readinessProbe: - httpGet: - path: /api/ros/v1/status - port: 8000 - scheme: HTTP - initialDelaySeconds: 3 - periodSeconds: 10 - successThreshold: 1 - failureThreshold: 3 - timeoutSeconds: 3 - env: - - name: PATH_PREFIX - value: /api - - name: CLOWDER_ENABLED - value: ${CLOWDER_ENABLED} - - name: ENABLE_RBAC - value: "${ENABLE_RBAC}" - - name: DB_POOL_SIZE - value: ${DB_POOL_SIZE} - - name: DB_MAX_OVERFLOW - value: ${DB_MAX_OVERFLOW} - - name: UNLEASH_URL - value: ${UNLEASH_URL} - - name: UNLEASH_TOKEN - valueFrom: - secretKeyRef: - name: ${UNLEASH_SECRET_NAME} - key: CLIENT_ACCESS_TOKEN - optional: true - - name: BYPASS_UNLEASH - value: ${BYPASS_UNLEASH} - - - name: inventory-events-processor - replicas: ${{INVENTORY_PROCESSOR_REPLICA_COUNT}} - podSpec: - image: ${IMAGE}:${IMAGE_TAG} - command: ["bash"] - args: ["-c", "python -m ros.processor.inventory_events_consumer"] - resources: - requests: - cpu: ${CPU_REQUEST_ROSRHEL} - memory: ${MEMORY_REQUEST_ROSRHEL} - limits: - cpu: ${CPU_LIMIT_ROSRHEL} - memory: ${MEMORY_LIMIT_ROSRHEL} - livenessProbe: - failureThreshold: 3 - httpGet: - path: / - port: 9000 - scheme: HTTP - initialDelaySeconds: 10 - periodSeconds: 30 - successThreshold: 1 - timeoutSeconds: 3 - readinessProbe: - httpGet: - path: / - port: 9000 - scheme: HTTP - initialDelaySeconds: 10 - periodSeconds: 30 - successThreshold: 1 - failureThreshold: 3 - timeoutSeconds: 3 - env: - - name: CLOWDER_ENABLED - value: ${CLOWDER_ENABLED} - - name: DB_POOL_SIZE - value: ${DB_POOL_SIZE} - - name: DB_MAX_OVERFLOW - value: ${DB_MAX_OVERFLOW} - - name: UNLEASH_URL - value: ${UNLEASH_URL} - - name: UNLEASH_TOKEN - valueFrom: - secretKeyRef: - name: ${UNLEASH_SECRET_NAME} - key: CLIENT_ACCESS_TOKEN - optional: true - - name: BYPASS_UNLEASH - value: ${BYPASS_UNLEASH} - - - name: engine-result-processor - replicas: ${{ENGINE_PROCESSOR_REPLICA_COUNT}} - podSpec: - image: ${IMAGE}:${IMAGE_TAG} - command: ["bash"] - args: ["-c", "python -m ros.processor.insights_engine_consumer"] - resources: - requests: - cpu: ${CPU_REQUEST_ROSRHEL} - memory: ${MEMORY_REQUEST_ROSRHEL} - limits: - cpu: ${CPU_LIMIT_ROSRHEL} - memory: ${MEMORY_LIMIT_ROSRHEL} - livenessProbe: - failureThreshold: 3 - httpGet: - path: / - port: 9000 - scheme: HTTP - initialDelaySeconds: 10 - periodSeconds: 30 - successThreshold: 1 - timeoutSeconds: 3 - readinessProbe: - httpGet: - path: / - port: 9000 - scheme: HTTP - initialDelaySeconds: 10 - periodSeconds: 30 - successThreshold: 1 - failureThreshold: 3 - timeoutSeconds: 3 - env: - - name: CLOWDER_ENABLED - value: ${CLOWDER_ENABLED} - - name: DB_POOL_SIZE - value: ${DB_POOL_SIZE} - - name: DB_MAX_OVERFLOW - value: ${DB_MAX_OVERFLOW} - - name: UNLEASH_URL - value: ${UNLEASH_URL} - - name: UNLEASH_TOKEN - valueFrom: - secretKeyRef: - name: ${UNLEASH_SECRET_NAME} - key: CLIENT_ACCESS_TOKEN - optional: true - - name: BYPASS_UNLEASH - value: ${BYPASS_UNLEASH} - - - name: garbage-collector-processor - replicas: ${{GARBAGE_COLLECTOR_REPLICA_COUNT}} - podSpec: - image: ${IMAGE}:${IMAGE_TAG} - command: ["bash"] - args: ["-c", "python -m ros.processor.garbage_collector"] - resources: - requests: - cpu: ${CPU_REQUEST_ROSRHEL} - memory: ${MEMORY_REQUEST_ROSRHEL} - limits: - cpu: ${CPU_LIMIT_ROSRHEL} - memory: ${MEMORY_LIMIT_ROSRHEL} - livenessProbe: - failureThreshold: 3 - httpGet: - path: / - port: 9000 - scheme: HTTP - initialDelaySeconds: 10 - periodSeconds: 30 - successThreshold: 1 - timeoutSeconds: 3 - readinessProbe: - httpGet: - path: / - port: 9000 - scheme: HTTP - initialDelaySeconds: 10 - periodSeconds: 30 - successThreshold: 1 - failureThreshold: 3 - timeoutSeconds: 3 - env: - - name: CLOWDER_ENABLED - value: ${CLOWDER_ENABLED} - - name: GARBAGE_COLLECTION_INTERVAL - value: ${GARBAGE_COLLECTION_INTERVAL} - - name: DAYS_UNTIL_STALE - value: ${DAYS_UNTIL_STALE} - - name: DB_POOL_SIZE - value: ${DB_POOL_SIZE} - - name: DB_MAX_OVERFLOW - value: ${DB_MAX_OVERFLOW} - - name: UNLEASH_URL - value: ${UNLEASH_URL} - - name: UNLEASH_TOKEN - valueFrom: - secretKeyRef: - name: ${UNLEASH_SECRET_NAME} - key: CLIENT_ACCESS_TOKEN - optional: true - - name: BYPASS_UNLEASH - value: ${BYPASS_UNLEASH} - - name: pcp-generator replicas: ${{PCP_GENERATOR_REPLICA_COUNT}} podSpec: @@ -259,8 +42,6 @@ objects: partitions: 1 - topicName: platform.notifications.ingress partitions: 1 - testing: - iqePlugin: ros parameters: - description: Enable rbac needs to be "True" or "False" @@ -269,25 +50,13 @@ parameters: - description : ClowdEnvironment name name: ENV_NAME required: true -- description: Replica count for api pod - name: API_REPLICA_COUNT - value: "1" -- description: Replica count for inventory processor pod - name: INVENTORY_PROCESSOR_REPLICA_COUNT - value: "1" -- description: Replica count for engine processor pod - name: ENGINE_PROCESSOR_REPLICA_COUNT - value: "1" -- description: Replica count for garbage collector pod - name: GARBAGE_COLLECTOR_REPLICA_COUNT - value: "1" - description: Replica count for pcp generator name: PCP_GENERATOR_REPLICA_COUNT value: "1" - description: Image NAME name: IMAGE required: true - value: quay.io/repository/cloudservices/ros-backend + value: quay.io/cloudservices/ros-backend - description: Image tag name: IMAGE_TAG required: true @@ -314,27 +83,6 @@ parameters: - description: Is clowder enabled name: CLOWDER_ENABLED value: "True" -- description: The interval at which garbage collection should run (in seconds) - name: GARBAGE_COLLECTION_INTERVAL - value: "86400" -- description: Number of days after which data is considered to be outdated - name: DAYS_UNTIL_STALE - value: "45" -- description: Host for the EAN to OrgId translator. - name: TENANT_TRANSLATOR_HOST - required: true - value: 'gateway.3scale-dev.svc.cluster.local' -- description: Port for the EAN to OrgId translator. - name: TENANT_TRANSLATOR_PORT - value: '8892' -- name: PROMETHEUS_PUSHGATEWAY - value: "localhost" -- name: POPULATOR_LOG_FORMAT - value: cloudwatch -- name: DB_POOL_SIZE - value: "20" -- name: DB_MAX_OVERFLOW - value: "20" # Feature flags - description: Unleash secret name diff --git a/dashboards/grafana-dashboard-insights-ros-general.configmap.yaml b/dashboards/grafana-dashboard-insights-ros-general.configmap.yaml deleted file mode 100644 index 898a3ff4..00000000 --- a/dashboards/grafana-dashboard-insights-ros-general.configmap.yaml +++ /dev/null @@ -1,1428 +0,0 @@ -apiVersion: v1 -data: - grafana.json: |- - { - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "target": { - "limit": 100, - "matchAny": false, - "tags": [], - "type": "dashboard" - }, - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "gnetId": null, - "graphTooltip": 0, - "id": 222, - "iteration": 1641658267808, - "links": [], - "liveNow": false, - "panels": [ - { - "collapsed": false, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 69, - "panels": [], - "title": "Current status", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "cacheTimeout": null, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "unit": "none" - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 11, - "w": 11, - "x": 0, - "y": 1 - }, - "hiddenSeries": false, - "id": 8, - "interval": null, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "maxDataPoints": 100, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.2.7", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "exemplar": true, - "expr": "sum(increase(ros_archive_downloaded_success_total{}[24h]))", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Archive Download Requests", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:348", - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "$$hashKey": "object:349", - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "index": 0, - "text": "N/A" - } - }, - "type": "special" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 11, - "w": 13, - "x": 11, - "y": 1 - }, - "id": 71, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom" - }, - "tooltip": { - "mode": "single" - } - }, - "pluginVersion": "8.2.7", - "targets": [ - { - "exemplar": true, - "expr": "sum(increase(ros_archive_failed_to_download_total{}[24h])) ", - "interval": "", - "legendFormat": "", - "refId": "A" - } - ], - "title": "Archive Download Failed", - "type": "timeseries" - }, - { - "cacheTimeout": null, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ - { - "options": { - "null": { - "index": 0, - "text": "N/A" - } - }, - "type": "value" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "dark-red", - "value": null - }, - { - "color": "semi-dark-orange", - "value": 0.1 - }, - { - "color": "dark-green", - "value": 1 - } - ] - }, - "unit": "none" - }, - "overrides": [ - { - "__systemRef": "hideSeriesFrom", - "matcher": { - "id": "byNames", - "options": { - "mode": "exclude", - "names": [ - "sum(ros_processor_requests_success_total{reporter=~\"INSIGHTS ENGINE\"})" - ], - "prefix": "All except:", - "readOnly": true - } - }, - "properties": [ - { - "id": "custom.hideFrom", - "value": { - "legend": false, - "tooltip": false, - "viz": true - } - } - ] - } - ] - }, - "gridPos": { - "h": 9, - "w": 11, - "x": 0, - "y": 12 - }, - "id": 82, - "interval": null, - "links": [], - "maxDataPoints": 100, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom" - }, - "tooltip": { - "mode": "single" - } - }, - "pluginVersion": "8.2.7", - "targets": [ - { - "exemplar": true, - "expr": "sum(ros_processor_requests_success_total{reporter=~\"INSIGHTS ENGINE\"})", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - } - ], - "title": "Insights Engine pass requests", - "type": "timeseries" - }, - { - "cacheTimeout": null, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineStyle": { - "fill": "solid" - }, - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ - { - "options": { - "null": { - "index": 0, - "text": "N/A" - } - }, - "type": "value" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "dark-red", - "value": null - }, - { - "color": "semi-dark-orange", - "value": 0.1 - }, - { - "color": "dark-green", - "value": 1 - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 13, - "x": 11, - "y": 12 - }, - "id": 83, - "interval": null, - "links": [], - "maxDataPoints": 100, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom" - }, - "tooltip": { - "mode": "single" - } - }, - "pluginVersion": "8.2.7", - "targets": [ - { - "exemplar": true, - "expr": "sum(ros_archive_downloaded_success_total or on() vector(0) + ros_archive_failed_to_download_total or on() vector(0))", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - } - ], - "title": "Total download requests", - "type": "timeseries" - }, - { - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "__systemRef": "hideSeriesFrom", - "matcher": { - "id": "byNames", - "options": { - "mode": "exclude", - "names": [ - "INVENTORY EVENTS" - ], - "prefix": "All except:", - "readOnly": true - } - }, - "properties": [ - { - "id": "custom.hideFrom", - "value": { - "legend": false, - "tooltip": false, - "viz": true - } - } - ] - } - ] - }, - "gridPos": { - "h": 11, - "w": 11, - "x": 0, - "y": 21 - }, - "id": 75, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom" - }, - "tooltip": { - "mode": "single" - } - }, - "targets": [ - { - "exemplar": true, - "expr": "sum(increase(ros_processor_requests_success_total{}[24h])) by (reporter)", - "interval": "", - "legendFormat": "{{reporter}}", - "refId": "A" - } - ], - "title": "Processors Pass Requests", - "type": "timeseries" - }, - { - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 11, - "w": 13, - "x": 11, - "y": 21 - }, - "id": 77, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom" - }, - "tooltip": { - "mode": "single" - } - }, - "targets": [ - { - "exemplar": true, - "expr": "sum(increase(ros_http_request_total{}[24h])) by (status)", - "interval": "", - "legendFormat": "{{status}}", - "refId": "A" - } - ], - "title": "HTTP Requests", - "type": "timeseries" - }, - { - "aliasColors": { - "304": "#64b0c8", - "400": "#c15c17", - "401": "#cca300", - "404": "#f4d598", - "500": "#bf1b00" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 11, - "w": 11, - "x": 0, - "y": 32 - }, - "hiddenSeries": false, - "id": 10, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.2.7", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "exemplar": true, - "expr": "sum(rate(ros_http_request_total{}[$interval])) by (status)", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{status}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Backend traffic", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:405", - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "$$hashKey": "object:406", - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "cacheTimeout": null, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ - { - "options": { - "null": { - "index": 0, - "text": "N/A" - } - }, - "type": "value" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "dark-red", - "value": null - }, - { - "color": "semi-dark-orange", - "value": 0.1 - }, - { - "color": "dark-green", - "value": 1 - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 3, - "w": 3, - "x": 11, - "y": 32 - }, - "id": 67, - "interval": null, - "links": [], - "maxDataPoints": 100, - "options": { - "colorMode": "background", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "delta" - ], - "fields": "", - "values": false - }, - "text": {}, - "textMode": "auto" - }, - "pluginVersion": "8.2.7", - "targets": [ - { - "exemplar": true, - "expr": "sum(increase(ros_http_request_total{job=~\"ros-backend\"}[$__range]))", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - } - ], - "title": "ROS backend requests", - "type": "stat" - }, - { - "cacheTimeout": null, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "decimals": 2, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "#d44a3a", - "value": null - }, - { - "color": "rgba(237, 129, 40, 0.89)", - "value": 0.9 - }, - { - "color": "#299c46", - "value": 0.2 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 3, - "w": 3, - "x": 14, - "y": 32 - }, - "id": 14, - "interval": null, - "links": [], - "maxDataPoints": 100, - "options": { - "colorMode": "background", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "text": {}, - "textMode": "auto" - }, - "pluginVersion": "8.2.7", - "targets": [ - { - "expr": "sum(increase(ros_http_request_total{job=~\"ros.*\", status=~\"2.*\"}[$__range])) / sum(increase(ros_http_request_total{job=~\"ros.*\"}[$__range]))", - "format": "time_series", - "intervalFactor": 1, - "refId": "A" - } - ], - "title": "ROS backend 2xx ratio", - "type": "stat" - }, - { - "cacheTimeout": null, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "decimals": 2, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "dark-green", - "value": null - }, - { - "color": "rgba(237, 129, 40, 0.89)", - "value": 0.05 - }, - { - "color": "dark-red", - "value": 0.2 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 3, - "w": 3, - "x": 17, - "y": 32 - }, - "id": 80, - "interval": null, - "links": [], - "maxDataPoints": 100, - "options": { - "colorMode": "background", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "text": {}, - "textMode": "auto" - }, - "pluginVersion": "8.2.7", - "targets": [ - { - "exemplar": true, - "expr": "sum(increase(ros_http_request_total{job=~\"ros.*\", status=~\"5.*\"}[$__range])) / sum(increase(ros_http_request_total{job=~\"ros.*\"}[$__range]))", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - } - ], - "title": "ROS backend 5xx ratio", - "type": "stat" - }, - { - "cacheTimeout": null, - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "decimals": 2, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "dark-green", - "value": null - }, - { - "color": "rgba(237, 129, 40, 0.89)", - "value": 0.05 - }, - { - "color": "dark-red", - "value": 0.2 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 3, - "w": 3, - "x": 20, - "y": 32 - }, - "id": 81, - "interval": null, - "links": [], - "maxDataPoints": 100, - "options": { - "colorMode": "background", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "text": {}, - "textMode": "auto" - }, - "pluginVersion": "8.2.7", - "targets": [ - { - "exemplar": true, - "expr": "sum(increase(ros_http_request_total{job=~\"ros.*\", status=~\"4.*\"}[$__range])) / sum(increase(ros_http_request_total{job=~\"ros.*\"}[$__range]))", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - } - ], - "title": "ROS backend 4xx ratio", - "type": "stat" - }, - { - "datasource": "$datasource", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "index": 0, - "text": "N/A" - } - }, - "type": "special" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 13, - "x": 11, - "y": 35 - }, - "id": 73, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom" - }, - "tooltip": { - "mode": "single" - } - }, - "pluginVersion": "8.2.7", - "targets": [ - { - "exemplar": true, - "expr": "sum(increase(ros_kafka_failures_total{namespace=~\"$namespace\"}[$__range])) ", - "interval": "", - "legendFormat": "", - "refId": "A" - } - ], - "title": "Kafka Failures", - "type": "timeseries" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "$datasource", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 10, - "w": 11, - "x": 0, - "y": 43 - }, - "hiddenSeries": false, - "id": 79, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.2.7", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "exemplar": true, - "expr": "sum(rate(container_cpu_usage_seconds_total{container=~\"ros-.*\", namespace=~\"${namespace}\"}[$interval])) by (container)/ sum(kube_pod_container_resource_limits{container=~\"ros-.*\", namespace=~\"${namespace}\", resource=\"cpu\"}) by (container)", - "interval": "", - "legendFormat": "{{container}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "CPU consumed", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:291", - "format": "percentunit", - "label": null, - "logBase": 1, - "max": "1", - "min": null, - "show": true - }, - { - "$$hashKey": "object:292", - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": "", - "schemaVersion": 32, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "current": { - "selected": false, - "text": "crcp01ue1-prometheus", - "value": "crcp01ue1-prometheus" - }, - "description": null, - "error": null, - "hide": 0, - "includeAll": false, - "label": "datasource", - "multi": false, - "name": "datasource", - "options": [], - "query": "prometheus", - "queryValue": "", - "refresh": 1, - "regex": "/.*crc.*/", - "skipUrlSync": false, - "type": "datasource" - }, - { - "allValue": null, - "current": { - "selected": true, - "text": "ros-prod", - "value": "ros-prod" - }, - "description": null, - "error": null, - "hide": 0, - "includeAll": false, - "label": "", - "multi": false, - "name": "namespace", - "options": [ - { - "selected": false, - "text": "ros-stage", - "value": "ros-stage" - }, - { - "selected": true, - "text": "ros-prod", - "value": "ros-prod" - } - ], - "query": "ros-stage, ros-prod", - "queryValue": "", - "skipUrlSync": false, - "type": "custom" - }, - { - "auto": false, - "auto_count": 30, - "auto_min": "10s", - "current": { - "selected": false, - "text": "5m", - "value": "5m" - }, - "description": null, - "error": null, - "hide": 0, - "label": null, - "name": "interval", - "options": [ - { - "selected": false, - "text": "1m", - "value": "1m" - }, - { - "selected": true, - "text": "5m", - "value": "5m" - }, - { - "selected": false, - "text": "10m", - "value": "10m" - }, - { - "selected": false, - "text": "30m", - "value": "30m" - }, - { - "selected": false, - "text": "1h", - "value": "1h" - }, - { - "selected": false, - "text": "6h", - "value": "6h" - }, - { - "selected": false, - "text": "12h", - "value": "12h" - }, - { - "selected": false, - "text": "1d", - "value": "1d" - }, - { - "selected": false, - "text": "7d", - "value": "7d" - }, - { - "selected": false, - "text": "14d", - "value": "14d" - }, - { - "selected": false, - "text": "30d", - "value": "30d" - } - ], - "query": "1m,5m,10m,30m,1h,6h,12h,1d,7d,14d,30d", - "queryValue": "", - "refresh": 2, - "skipUrlSync": false, - "type": "interval" - } - ] - }, - "time": { - "from": "now-7d", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "ROS", - "uid": "ofkkVX0nk", - "version": 1 - } -kind: ConfigMap -metadata: - name: grafana-dashboard-insights-ros-general - labels: - grafana_dashboard: "true" - annotations: - grafana-folder: /grafana-dashboard-definitions/Insights diff --git a/docs/db_schema.puml b/docs/db_schema.puml deleted file mode 100644 index 48788609..00000000 --- a/docs/db_schema.puml +++ /dev/null @@ -1,94 +0,0 @@ -@startuml -title ROS Backend DB Schema -' hide the spot -' hide circle - -' avoid problems with angled crows feet -skinparam linetype ortho - -entity alembic_version { - *version_num <> : int -} - -entity rh_accounts { - *id <> : int - -- - account : text - org_id : text -} - -entity performance_profile { - *system_id <> : int - -- - performance_record : jsonb - performance_utilization : jsonb - report_date : timestamp - number_of_recommendations : int - state : varchar - operating_system : jsonb - rule_hit_details : jsonb - psi_enabled : bool, - top_candidate : varchar - top_candidate_price : double -} - -entity performance_profile_history { - *system_id <> : int - *report_date <> : timestamp - -- - performance_record : jsonb - performance_utilization : jsonb - report_date : timestamp - number_of_recommendations : int - state : varchar - operating_system : jsonb - rule_hit_details : jsonb - psi_enabled : bool, -} - -entity systems{ - *id <> : int - -- - tenant_id <> : int - inventory_id : uuid - cloud_provider : varchar - display_name : varchar - fqdn : varchar - instance_type : varchar - state : varchar - stale_timestamp : timestamp - region : varchar - operating_system : jsonb - cpu_states : varchar - io_states : varchar - memory_states : varchar - groups : jsonb -} - -entity rules { - *id <> : int - -- - rule_id : varchar - description : text - reason : text - resolution : text - condition : text -} - -entity recommendation_rating{ - *id <> : int - -- - system_id <> : int - rated_by : text - rating : int - created_at : timestamp - updated_at : timestamp -} - - - -systems }o..|| rh_accounts -systems ||..|| performance_profile -systems ||..|| performance_profile_history -systems ||..o{ recommendation_rating -@enduml \ No newline at end of file diff --git a/docs/ros_sequence.puml b/docs/ros_sequence.puml deleted file mode 100644 index ecd67bd3..00000000 --- a/docs/ros_sequence.puml +++ /dev/null @@ -1,24 +0,0 @@ -@startuml -title ROS Backend Processing Flow -participant hbi -entity platform.inventory.events -participant "insights\nengine" -entity platform.engine.results -box "ROS Backend" #LightBlue - participant "inventory events\nprocessor" - participant "engine results\nprocessor" -end box -database "ROS DB" -hbi->platform.inventory.events: host-inventory payload -platform.inventory.events->"insights\nengine" -"insights\nengine"->platform.engine.results: insights-engine payload -platform.engine.results->"engine results\nprocessor" -Note right of platform.engine.results: {"input": ,\n"type": "updated"},\n{"results": {"system": "metadata": {..}},\n{"reports": \n[{"rule_id": 'ros_instance_evaluation|}]\n"details": \n{"instance_type": "t2.micro",\n"region": "us-east-1",\n"states":\n{"cpu": ["CPU_OVERSIZED", ".."],\n"memory": ["MEMORY_OVERSIZED", ".."],\n"io": [IO_UNDERSIZED_BY_PRESSURE],}}]}} -"engine results\nprocessor"<-"ROS DB": Get account details from Rh_accounts table -"ROS DB"<-"engine results\nprocessor": Create / Update system info in Systems table -"ROS DB"<-"engine results\nprocessor": Create Performance Profile record for a system \nin Performance_profile table. -platform.inventory.events->"inventory events\nprocessor" -Note right of platform.inventory.events: {"platform_metadata": \n{"account": , \n"url": , \n"is_ros": true},\n"host": \n{"system_profile": \n{"cloud_provider": "aws", "reporter": "puptoo", "id": },\n"type": "created",\n"metadata": {..},}} -"ROS DB"<-"inventory events\nprocessor": Create / Update system info in Systems table\nAdd / Verify account_id and org_id in Rh_accounts table -skinparam BoxPadding 100 -@enduml \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index df3c49be..fa84475e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,14 +1,14 @@ -# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "alembic" -version = "1.13.2" +version = "1.14.0" description = "A database migration tool for SQLAlchemy." optional = false python-versions = ">=3.8" files = [ - {file = "alembic-1.13.2-py3-none-any.whl", hash = "sha256:6b8733129a6224a9a711e17c99b08462dbf7cc9670ba8f2e2ae9af860ceb1953"}, - {file = "alembic-1.13.2.tar.gz", hash = "sha256:1ff0ae32975f4fd96028c39ed9bb3c867fe3af956bd7bb37343b54c9fe7445ef"}, + {file = "alembic-1.14.0-py3-none-any.whl", hash = "sha256:99bd884ca390466db5e27ffccff1d179ec5c05c965cfefc0607e69f9e411cb25"}, + {file = "alembic-1.14.0.tar.gz", hash = "sha256:b00892b53b3642d0b8dbedba234dbf1924b69be83a9a769d5a624b01094e304b"}, ] [package.dependencies] @@ -57,86 +57,85 @@ files = [ [[package]] name = "apscheduler" -version = "3.10.4" +version = "3.11.0" description = "In-process task scheduler with Cron-like capabilities" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "APScheduler-3.10.4-py3-none-any.whl", hash = "sha256:fb91e8a768632a4756a585f79ec834e0e27aad5860bac7eaa523d9ccefd87661"}, - {file = "APScheduler-3.10.4.tar.gz", hash = "sha256:e6df071b27d9be898e486bc7940a7be50b4af2e9da7c08f0744a96d4bd4cef4a"}, + {file = "APScheduler-3.11.0-py3-none-any.whl", hash = "sha256:fc134ca32e50f5eadcc4938e3a4545ab19131435e851abb40b34d63d5141c6da"}, + {file = "apscheduler-3.11.0.tar.gz", hash = "sha256:4c622d250b0955a65d5d0eb91c33e6d43fd879834bf541e0a18661ae60460133"}, ] [package.dependencies] -pytz = "*" -six = ">=1.4.0" -tzlocal = ">=2.0,<3.dev0 || >=4.dev0" +tzlocal = ">=3.0" [package.extras] -doc = ["sphinx", "sphinx-rtd-theme"] +doc = ["packaging", "sphinx", "sphinx-rtd-theme (>=1.3.0)"] +etcd = ["etcd3", "protobuf (<=3.21.0)"] gevent = ["gevent"] mongodb = ["pymongo (>=3.0)"] redis = ["redis (>=3.0)"] rethinkdb = ["rethinkdb (>=2.4.0)"] sqlalchemy = ["sqlalchemy (>=1.4)"] -testing = ["pytest", "pytest-asyncio", "pytest-cov", "pytest-tornado5"] +test = ["APScheduler[etcd,mongodb,redis,rethinkdb,sqlalchemy,tornado,zookeeper]", "PySide6", "anyio (>=4.5.2)", "gevent", "pytest", "pytz", "twisted"] tornado = ["tornado (>=4.3)"] twisted = ["twisted"] zookeeper = ["kazoo"] [[package]] name = "async-timeout" -version = "4.0.3" +version = "5.0.1" description = "Timeout context manager for asyncio programs" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, - {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, + {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, + {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, ] [[package]] name = "attrs" -version = "23.2.0" +version = "24.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, - {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, + {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, + {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, ] [package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] [[package]] name = "blinker" -version = "1.8.2" +version = "1.9.0" description = "Fast, simple object-to-object and broadcast signaling" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "blinker-1.8.2-py3-none-any.whl", hash = "sha256:1779309f71bf239144b9399d06ae925637cf6634cf6bd131104184531bf67c01"}, - {file = "blinker-1.8.2.tar.gz", hash = "sha256:8f77b09d3bf7c795e969e9486f39c2c5e9c39d4ee07424be2bc594ece9642d83"}, + {file = "blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc"}, + {file = "blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf"}, ] [[package]] name = "boto3" -version = "1.34.144" +version = "1.35.71" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" files = [ - {file = "boto3-1.34.144-py3-none-any.whl", hash = "sha256:b8433d481d50b68a0162c0379c0dd4aabfc3d1ad901800beb5b87815997511c1"}, - {file = "boto3-1.34.144.tar.gz", hash = "sha256:2f3e88b10b8fcc5f6100a9d74cd28230edc9d4fa226d99dd40a3ab38ac213673"}, + {file = "boto3-1.35.71-py3-none-any.whl", hash = "sha256:e2969a246bb3208122b3c349c49cc6604c6fc3fc2b2f65d99d3e8ccd745b0c16"}, + {file = "boto3-1.35.71.tar.gz", hash = "sha256:3ed7172b3d4fceb6218bb0ec3668c4d40c03690939c2fca4f22bb875d741a07f"}, ] [package.dependencies] -botocore = ">=1.34.144,<1.35.0" +botocore = ">=1.35.71,<1.36.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.10.0,<0.11.0" @@ -145,13 +144,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.34.144" +version = "1.35.71" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" files = [ - {file = "botocore-1.34.144-py3-none-any.whl", hash = "sha256:a2cf26e1bf10d5917a2285e50257bc44e94a1d16574f282f3274f7a5d8d1f08b"}, - {file = "botocore-1.34.144.tar.gz", hash = "sha256:4215db28d25309d59c99507f1f77df9089e5bebbad35f6e19c7c44ec5383a3e8"}, + {file = "botocore-1.35.71-py3-none-any.whl", hash = "sha256:fc46e7ab1df3cef66dfba1633f4da77c75e07365b36f03bd64a3793634be8fc1"}, + {file = "botocore-1.35.71.tar.gz", hash = "sha256:f9fa058e0393660c3fe53c1e044751beb64b586def0bd2212448a7c328b0cbba"}, ] [package.dependencies] @@ -160,17 +159,17 @@ python-dateutil = ">=2.1,<3.0.0" urllib3 = {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""} [package.extras] -crt = ["awscrt (==0.20.11)"] +crt = ["awscrt (==0.22.0)"] [[package]] name = "cachecontrol" -version = "0.14.0" +version = "0.14.1" description = "httplib2 caching for requests" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "cachecontrol-0.14.0-py3-none-any.whl", hash = "sha256:f5bf3f0620c38db2e5122c0726bdebb0d16869de966ea6a2befe92470b740ea0"}, - {file = "cachecontrol-0.14.0.tar.gz", hash = "sha256:7db1195b41c81f8274a7bbd97c956f44e8348265a1bc7641c37dfebc39f0c938"}, + {file = "cachecontrol-0.14.1-py3-none-any.whl", hash = "sha256:65e3abd62b06382ce3894df60dde9e0deb92aeb734724f68fa4f3b91e97206b9"}, + {file = "cachecontrol-0.14.1.tar.gz", hash = "sha256:06ef916a1e4eb7dba9948cdfc9c76e749db2e02104a9a1277e8b642591a0f717"}, ] [package.dependencies] @@ -180,7 +179,7 @@ redis = {version = ">=2.10.5", optional = true, markers = "extra == \"redis\""} requests = ">=2.16.0" [package.extras] -dev = ["CacheControl[filecache,redis]", "black", "build", "cherrypy", "furo", "mypy", "pytest", "pytest-cov", "sphinx", "sphinx-copybutton", "tox", "types-redis", "types-requests"] +dev = ["CacheControl[filecache,redis]", "build", "cherrypy", "codespell[tomli]", "furo", "mypy", "pytest", "pytest-cov", "ruff", "sphinx", "sphinx-copybutton", "tox", "types-redis", "types-requests"] filecache = ["filelock (>=3.8.0)"] redis = ["redis (>=2.10.5)"] @@ -197,112 +196,127 @@ files = [ [[package]] name = "certifi" -version = "2024.7.4" +version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, - {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, ] [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, ] [[package]] @@ -332,114 +346,129 @@ files = [ [[package]] name = "confluent-kafka" -version = "2.5.0" +version = "2.6.1" description = "Confluent's Python client for Apache Kafka" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "confluent-kafka-2.5.0.tar.gz", hash = "sha256:551cabaade717bb56ec13eb860ce439bedbcf1c97f4a4aa26957572ed1bfa74f"}, - {file = "confluent_kafka-2.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5509a219128fb177fa4186a8669071cc52acd52eba436f339edb9063aabb486d"}, - {file = "confluent_kafka-2.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ff98d8fbe7d3671cac3e1b692c13f160cf508b525c110a89906ffabd1cc140fe"}, - {file = "confluent_kafka-2.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:72ffae4387d283cb5657b6381a893c7231c26a9b4248557e7f030de76156290a"}, - {file = "confluent_kafka-2.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:75873087fd1bd753e082f74ab97f68cc3a0765d6b600c2ac3d3a0beffbdc569d"}, - {file = "confluent_kafka-2.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:2af917f93ac3a0aa88e6bee9b2056c1c176621e4a9c8f7051cc8646b81f91327"}, - {file = "confluent_kafka-2.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:efc8c48d5dbbcd1b56afe737df8156a74e62b50481ccffe581b9926eaa16c014"}, - {file = "confluent_kafka-2.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7b9f867c7e955a48ed60dee0da9c157b0f84e67724f7e42591bbcf6867e3865f"}, - {file = "confluent_kafka-2.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:b064baf6a93ab58199e63bddf73d9f2c855b89cc376d5313c2f89c633aa3254a"}, - {file = "confluent_kafka-2.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a55f3d761c8463c504012ad9b06be33ef07f301f246e61d656cc927d35763f82"}, - {file = "confluent_kafka-2.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:c05a677b1dbdcf2a4532e2cf41e78d2e2ffb3a6829347caf2825f472cda59e69"}, - {file = "confluent_kafka-2.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:db987d8953d0d58a28a455e43a1da74a0e9dec7a12a74f5abd85a7cb308aefd4"}, - {file = "confluent_kafka-2.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d828ebb45db153cd462e72c575f8683c2c56ddba62b282aa36d9c365847e212"}, - {file = "confluent_kafka-2.5.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:fb863f76605e9bbbb1d7f02abf05899cf1435421aa721a5be212c600bd054aa3"}, - {file = "confluent_kafka-2.5.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:92efb98908e29f597c77ab97faa064f670b681f4540c3eabc415b8a6e58df9bf"}, - {file = "confluent_kafka-2.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:d668b5c426af595271bf6fce2917a6c3a15453656077a59db85f440958b5ccc2"}, - {file = "confluent_kafka-2.5.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:797250f1a66024dd8b1c94764cc75e1d7bd1b7224a0b982678eafbb39714874e"}, - {file = "confluent_kafka-2.5.0-cp36-cp36m-manylinux_2_28_aarch64.whl", hash = "sha256:e81dc0a2980e597848b73983ce6e0b4ae7d129c01370cd9f31599c15c5d02a5d"}, - {file = "confluent_kafka-2.5.0-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:ffda33c86f5fee6ae678cca039915a0c4c1863bbc592b6f2f82abfddc173b0d3"}, - {file = "confluent_kafka-2.5.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7410bd5b0d6f54df5fa3313c75801a6ebcfab7cbfb947c3f56149e38b0fe924c"}, - {file = "confluent_kafka-2.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9a29dc4b7d4a754037d7d8e3ad1873a27b16e7de8c0a06755456b20803a70b16"}, - {file = "confluent_kafka-2.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:089b68a43c3b911356a4ff08fa862245f1333387b79221ac7f60d99e5b4e24d6"}, - {file = "confluent_kafka-2.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:c3a17ebdd97c803cf369c8615a474ca0bea39b5f5944e51f1c320aee8d6d5da9"}, - {file = "confluent_kafka-2.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:151656afaeb623b46c042a752091d8b17fd05ff7d309be6d8b4953b8dc0783bc"}, - {file = "confluent_kafka-2.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:570fc091cdcf9d1baf90c5f4965322cea8185ba8698d0f02cd1c8bd38bf6664a"}, - {file = "confluent_kafka-2.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bd57edf51434d6ec289339a0c9b627ca1f1e7c1130e348c0b411407183db53c6"}, - {file = "confluent_kafka-2.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:8975fea2ccd6927aad188e198e1688ef16589dc36b42f7a33ad07b1ca1341901"}, - {file = "confluent_kafka-2.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7c0b1a7774905c9e3c24d09d9b8463d771685e4105150c2503185537a6a590f9"}, - {file = "confluent_kafka-2.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:eaf01cd79b4d2cdbdf1e7b6ace9c846ae9ad9f4cf573617bbb5735a5c48cbd20"}, - {file = "confluent_kafka-2.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa789332fd40a9e99b9388f87f28db8fc7dd8ca54a1d24d0bcd0ad33f50f3528"}, - {file = "confluent_kafka-2.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e917db155dc3a64e1496b293a3ceb0a8edf23e0bd6f93d43576c40f0c59d3067"}, - {file = "confluent_kafka-2.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:a8bb3af6d1f109aaac5514c65a46cac933d78b3935f6fea52fe1f2ea6a9951bf"}, - {file = "confluent_kafka-2.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:a1fb72461dcf7aa7e1834133eb733f824331aafda87ef48ec917d9b09c805a99"}, - {file = "confluent_kafka-2.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:4bda1b5fa87cb993bcd964d271a76cc11cafa2455de02ab5eff6efd9e688d55e"}, + {file = "confluent_kafka-2.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:832f17bc8568bdec1823a46ebe66e0ccbffbb0f5917f8ed6226258186aed9bae"}, + {file = "confluent_kafka-2.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c41b8461958690aa35ceb5619cf910c664535fb395a8f331998c74760d51e1d1"}, + {file = "confluent_kafka-2.6.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:8fef7efc866e12db75060d3ec7b74cd6cf5322d8bf72267f1e3204a98ee6b75b"}, + {file = "confluent_kafka-2.6.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:802af9c60c1c0e068adfc73a10322f9d9d9260f508978ebe853cd6d1e8d6f4ef"}, + {file = "confluent_kafka-2.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:24cc1833658a93b727337fc31088f4e7d04fdc8e73eae3f946ecae0308737822"}, + {file = "confluent_kafka-2.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db46641c7a48cc998900c4e85778c4ea838d2b940433948831deae0d883945f3"}, + {file = "confluent_kafka-2.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:44d8d1bb3ffaba84f2e169614651662fb57c3645c50f88effb653d76149ac18e"}, + {file = "confluent_kafka-2.6.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:56473c3e8189b63fceae42569c31e339d0b9a4aac2fb3d38f744400837251857"}, + {file = "confluent_kafka-2.6.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:15af5ae70c9376aba62462f20dbc846364a41f6ae4071baac36a3adb44ec29bb"}, + {file = "confluent_kafka-2.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:a6cea569aa1fb7171b59f87edaf000d40fe0f92f9722d107230a6338fbd20f61"}, + {file = "confluent_kafka-2.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a5062f24f3af27f6edd63cb71a663144de09dd3249647c80c4aec9655a0ea1dd"}, + {file = "confluent_kafka-2.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a21b712b17362fd0602faa87c4363bd604f271ca62076bcf2d83ca91d2bd62c2"}, + {file = "confluent_kafka-2.6.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:0c2b63f7f764dc504296a8a474a3f09e408a456626cf938635eb31f59cac59fa"}, + {file = "confluent_kafka-2.6.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:298aa323eb8507862ccfa619367667b41ab76ddf3657e8a45dafe4b270208257"}, + {file = "confluent_kafka-2.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b17da915fc35b1bef49d599f685656f65f379094dbbc7aafc5ede1843cc72699"}, + {file = "confluent_kafka-2.6.1-cp313-cp313-macosx_13_0_arm64.whl", hash = "sha256:2584812d8834932e194929544d09325dd09039223aced7ab09095ffd4e96a1ca"}, + {file = "confluent_kafka-2.6.1-cp313-cp313-macosx_13_0_x86_64.whl", hash = "sha256:90853bbf466c57e0295076549b9b3b9cb6ab9447965977f3cde7f0790c39b5d6"}, + {file = "confluent_kafka-2.6.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:8c38bf716dbf99bd0e84ba867417e397c4d544d37a530b28df6cadd227a57f98"}, + {file = "confluent_kafka-2.6.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:efc94016d3b438f0af2ddd3f5a8fb293616fda296644f341161033b24282b23d"}, + {file = "confluent_kafka-2.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:150735910da42c44f7fa21ad96e3ae0f52df34066f163d3f544001a64ea776d2"}, + {file = "confluent_kafka-2.6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7670bf37fb46892a070f4b191edfe43d8564aa29446c80ddb32a95d183905086"}, + {file = "confluent_kafka-2.6.1-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:98cd678cc955cc3ab88b10823ef01aab2937f9d5ff0cba85abe5a5de11696159"}, + {file = "confluent_kafka-2.6.1-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:d250199230fdb90eeb48313ed5ca3526ec7a1f30a67c1ae1a98b4d98316172bc"}, + {file = "confluent_kafka-2.6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:93e02a8fa4152355b95cd1d6fc82b987f318ca591439dace481d818ad2237ad5"}, + {file = "confluent_kafka-2.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac80ae38a3f44103191cd30177f2871ba6af26ca7511f496cf25f0962eccc523"}, + {file = "confluent_kafka-2.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc22c426e2b87b92a93b4acd6c762a8cea3fae529ca0b1ba80165b358e041604"}, + {file = "confluent_kafka-2.6.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:dc2ad05ad5283cf9280b64949ed1f83a7201c70ce22f262a8f1939d384e45bed"}, + {file = "confluent_kafka-2.6.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:b5e22e09c7316b25c262e45aaffbf254605ebc1bcf0e8ec1fc77b941065acde9"}, + {file = "confluent_kafka-2.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:fd2b97770525e1e181fab64f715c21593cc5e3ac858d71300de9a45e8453e31c"}, + {file = "confluent_kafka-2.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e1f54816890249316b47a5d479041311445c2829cf71967e2abbc2a5581b06e0"}, + {file = "confluent_kafka-2.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:65cb90cf046e649fd68414fb45b3c9b0db28b4f051474db78ebca527190fb246"}, + {file = "confluent_kafka-2.6.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:b615cd8d35c94bed594bfc0905cf9d5e83f8be1ff49902898b29896748015394"}, + {file = "confluent_kafka-2.6.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:e4294ff4e9031a31f2cb807e284aedbf988e49a27bfe90dec35aad9f8e07db9e"}, + {file = "confluent_kafka-2.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:a6d3f65f6df9bdeeafd3de206159c0d0c529e17c89c839376df39af029ba1260"}, + {file = "confluent_kafka-2.6.1.tar.gz", hash = "sha256:71fdab0f65ccdb00eff0f14ccde65723ebbd20392723f8c1e87e5d8ab29e50cf"}, ] [package.extras] -avro = ["avro (>=1.11.1,<2)", "fastavro (>=0.23.0,<1.0)", "fastavro (>=1.0)", "requests"] -dev = ["avro (>=1.11.1,<2)", "fastavro (>=0.23.0,<1.0)", "fastavro (>=1.0)", "flake8", "pytest", "pytest (==4.6.4)", "pytest-timeout", "requests"] -doc = ["avro (>=1.11.1,<2)", "fastavro (>=0.23.0,<1.0)", "fastavro (>=1.0)", "requests", "sphinx", "sphinx-rtd-theme"] -json = ["jsonschema", "pyrsistent", "pyrsistent (==0.16.1)", "requests"] +all = ["avro (>=1.11.1,<2)", "confluent-kafka", "fastapi", "fastavro (<1.8.0)", "fastavro (<2)", "flake8", "jsonschema", "opentelemetry-distro", "opentelemetry-exporter-otlp", "protobuf", "psutil", "pydantic", "pyrsistent", "pyrsistent", "pyrsistent (==0.16.1)", "pytest", "pytest-timeout", "requests", "requests-mock", "six", "sphinx", "sphinx-rtd-theme", "urllib3 (<2.0.0)", "urllib3 (>=2.0.0,<3)", "uvicorn"] +avro = ["avro (>=1.11.1,<2)", "fastavro (<1.8.0)", "fastavro (<2)", "requests"] +dev = ["avro (>=1.11.1,<2)", "confluent-kafka", "fastapi", "fastavro (<1.8.0)", "fastavro (<2)", "flake8", "jsonschema", "protobuf", "pydantic", "pyrsistent", "pyrsistent", "pyrsistent (==0.16.1)", "pytest", "pytest-timeout", "requests", "requests-mock", "six", "sphinx", "sphinx-rtd-theme", "urllib3 (<2.0.0)", "urllib3 (>=2.0.0,<3)", "uvicorn"] +docs = ["avro (>=1.11.1,<2)", "fastavro (<1.8.0)", "fastavro (<2)", "jsonschema", "protobuf", "pyrsistent", "requests", "sphinx", "sphinx-rtd-theme"] +examples = ["confluent-kafka", "fastapi", "jsonschema", "protobuf", "pydantic", "pyrsistent", "pyrsistent (==0.16.1)", "requests", "six", "uvicorn"] +json = ["jsonschema", "pyrsistent", "requests"] protobuf = ["protobuf", "requests"] -schema-registry = ["requests"] +schemaregistry = ["requests"] +soaktest = ["opentelemetry-distro", "opentelemetry-exporter-otlp", "psutil"] +tests = ["avro (>=1.11.1,<2)", "fastavro (<1.8.0)", "fastavro (<2)", "flake8", "jsonschema", "protobuf", "pyrsistent", "pytest", "pytest-timeout", "requests", "requests-mock", "urllib3 (<2.0.0)", "urllib3 (>=2.0.0,<3)"] [[package]] name = "coverage" -version = "7.6.0" +version = "7.6.8" description = "Code coverage measurement for Python" optional = false -python-versions = ">=3.8" -files = [ - {file = "coverage-7.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd"}, - {file = "coverage-7.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c"}, - {file = "coverage-7.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463"}, - {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4b3cd1ca7cd73d229487fa5caca9e4bc1f0bca96526b922d61053ea751fe791"}, - {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7e128f85c0b419907d1f38e616c4f1e9f1d1b37a7949f44df9a73d5da5cd53c"}, - {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783"}, - {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6"}, - {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb"}, - {file = "coverage-7.6.0-cp310-cp310-win32.whl", hash = "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c"}, - {file = "coverage-7.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169"}, - {file = "coverage-7.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933"}, - {file = "coverage-7.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d"}, - {file = "coverage-7.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94"}, - {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01c322ef2bbe15057bc4bf132b525b7e3f7206f071799eb8aa6ad1940bcf5fb1"}, - {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03cafe82c1b32b770a29fd6de923625ccac3185a54a5e66606da26d105f37dac"}, - {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57"}, - {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d"}, - {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63"}, - {file = "coverage-7.6.0-cp311-cp311-win32.whl", hash = "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713"}, - {file = "coverage-7.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1"}, - {file = "coverage-7.6.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b"}, - {file = "coverage-7.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8"}, - {file = "coverage-7.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5"}, - {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807"}, - {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382"}, - {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b"}, - {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee"}, - {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605"}, - {file = "coverage-7.6.0-cp312-cp312-win32.whl", hash = "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da"}, - {file = "coverage-7.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67"}, - {file = "coverage-7.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b"}, - {file = "coverage-7.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d"}, - {file = "coverage-7.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca"}, - {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6616d1c9bf1e3faea78711ee42a8b972367d82ceae233ec0ac61cc7fec09fa6b"}, - {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad4567d6c334c46046d1c4c20024de2a1c3abc626817ae21ae3da600f5779b44"}, - {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03"}, - {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6"}, - {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b"}, - {file = "coverage-7.6.0-cp38-cp38-win32.whl", hash = "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428"}, - {file = "coverage-7.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8"}, - {file = "coverage-7.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c"}, - {file = "coverage-7.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2"}, - {file = "coverage-7.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390"}, - {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:831b476d79408ab6ccfadaaf199906c833f02fdb32c9ab907b1d4aa0713cfa3b"}, - {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46c3d091059ad0b9c59d1034de74a7f36dcfa7f6d3bde782c49deb42438f2450"}, - {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6"}, - {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166"}, - {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd"}, - {file = "coverage-7.6.0-cp39-cp39-win32.whl", hash = "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2"}, - {file = "coverage-7.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca"}, - {file = "coverage-7.6.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6"}, - {file = "coverage-7.6.0.tar.gz", hash = "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51"}, +python-versions = ">=3.9" +files = [ + {file = "coverage-7.6.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b39e6011cd06822eb964d038d5dff5da5d98652b81f5ecd439277b32361a3a50"}, + {file = "coverage-7.6.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:63c19702db10ad79151a059d2d6336fe0c470f2e18d0d4d1a57f7f9713875dcf"}, + {file = "coverage-7.6.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3985b9be361d8fb6b2d1adc9924d01dec575a1d7453a14cccd73225cb79243ee"}, + {file = "coverage-7.6.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:644ec81edec0f4ad17d51c838a7d01e42811054543b76d4ba2c5d6af741ce2a6"}, + {file = "coverage-7.6.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f188a2402f8359cf0c4b1fe89eea40dc13b52e7b4fd4812450da9fcd210181d"}, + {file = "coverage-7.6.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e19122296822deafce89a0c5e8685704c067ae65d45e79718c92df7b3ec3d331"}, + {file = "coverage-7.6.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:13618bed0c38acc418896005732e565b317aa9e98d855a0e9f211a7ffc2d6638"}, + {file = "coverage-7.6.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:193e3bffca48ad74b8c764fb4492dd875038a2f9925530cb094db92bb5e47bed"}, + {file = "coverage-7.6.8-cp310-cp310-win32.whl", hash = "sha256:3988665ee376abce49613701336544041f2117de7b7fbfe91b93d8ff8b151c8e"}, + {file = "coverage-7.6.8-cp310-cp310-win_amd64.whl", hash = "sha256:f56f49b2553d7dd85fd86e029515a221e5c1f8cb3d9c38b470bc38bde7b8445a"}, + {file = "coverage-7.6.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:86cffe9c6dfcfe22e28027069725c7f57f4b868a3f86e81d1c62462764dc46d4"}, + {file = "coverage-7.6.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d82ab6816c3277dc962cfcdc85b1efa0e5f50fb2c449432deaf2398a2928ab94"}, + {file = "coverage-7.6.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13690e923a3932e4fad4c0ebfb9cb5988e03d9dcb4c5150b5fcbf58fd8bddfc4"}, + {file = "coverage-7.6.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4be32da0c3827ac9132bb488d331cb32e8d9638dd41a0557c5569d57cf22c9c1"}, + {file = "coverage-7.6.8-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44e6c85bbdc809383b509d732b06419fb4544dca29ebe18480379633623baafb"}, + {file = "coverage-7.6.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:768939f7c4353c0fac2f7c37897e10b1414b571fd85dd9fc49e6a87e37a2e0d8"}, + {file = "coverage-7.6.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e44961e36cb13c495806d4cac67640ac2866cb99044e210895b506c26ee63d3a"}, + {file = "coverage-7.6.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3ea8bb1ab9558374c0ab591783808511d135a833c3ca64a18ec927f20c4030f0"}, + {file = "coverage-7.6.8-cp311-cp311-win32.whl", hash = "sha256:629a1ba2115dce8bf75a5cce9f2486ae483cb89c0145795603d6554bdc83e801"}, + {file = "coverage-7.6.8-cp311-cp311-win_amd64.whl", hash = "sha256:fb9fc32399dca861584d96eccd6c980b69bbcd7c228d06fb74fe53e007aa8ef9"}, + {file = "coverage-7.6.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e683e6ecc587643f8cde8f5da6768e9d165cd31edf39ee90ed7034f9ca0eefee"}, + {file = "coverage-7.6.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1defe91d41ce1bd44b40fabf071e6a01a5aa14de4a31b986aa9dfd1b3e3e414a"}, + {file = "coverage-7.6.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7ad66e8e50225ebf4236368cc43c37f59d5e6728f15f6e258c8639fa0dd8e6d"}, + {file = "coverage-7.6.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fe47da3e4fda5f1abb5709c156eca207eacf8007304ce3019eb001e7a7204cb"}, + {file = "coverage-7.6.8-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:202a2d645c5a46b84992f55b0a3affe4f0ba6b4c611abec32ee88358db4bb649"}, + {file = "coverage-7.6.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4674f0daa1823c295845b6a740d98a840d7a1c11df00d1fd62614545c1583787"}, + {file = "coverage-7.6.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:74610105ebd6f33d7c10f8907afed696e79c59e3043c5f20eaa3a46fddf33b4c"}, + {file = "coverage-7.6.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37cda8712145917105e07aab96388ae76e787270ec04bcb9d5cc786d7cbb8443"}, + {file = "coverage-7.6.8-cp312-cp312-win32.whl", hash = "sha256:9e89d5c8509fbd6c03d0dd1972925b22f50db0792ce06324ba069f10787429ad"}, + {file = "coverage-7.6.8-cp312-cp312-win_amd64.whl", hash = "sha256:379c111d3558272a2cae3d8e57e6b6e6f4fe652905692d54bad5ea0ca37c5ad4"}, + {file = "coverage-7.6.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0b0c69f4f724c64dfbfe79f5dfb503b42fe6127b8d479b2677f2b227478db2eb"}, + {file = "coverage-7.6.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c15b32a7aca8038ed7644f854bf17b663bc38e1671b5d6f43f9a2b2bd0c46f63"}, + {file = "coverage-7.6.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63068a11171e4276f6ece913bde059e77c713b48c3a848814a6537f35afb8365"}, + {file = "coverage-7.6.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f4548c5ead23ad13fb7a2c8ea541357474ec13c2b736feb02e19a3085fac002"}, + {file = "coverage-7.6.8-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b4b4299dd0d2c67caaaf286d58aef5e75b125b95615dda4542561a5a566a1e3"}, + {file = "coverage-7.6.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c9ebfb2507751f7196995142f057d1324afdab56db1d9743aab7f50289abd022"}, + {file = "coverage-7.6.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c1b4474beee02ede1eef86c25ad4600a424fe36cff01a6103cb4533c6bf0169e"}, + {file = "coverage-7.6.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d9fd2547e6decdbf985d579cf3fc78e4c1d662b9b0ff7cc7862baaab71c9cc5b"}, + {file = "coverage-7.6.8-cp313-cp313-win32.whl", hash = "sha256:8aae5aea53cbfe024919715eca696b1a3201886ce83790537d1c3668459c7146"}, + {file = "coverage-7.6.8-cp313-cp313-win_amd64.whl", hash = "sha256:ae270e79f7e169ccfe23284ff5ea2d52a6f401dc01b337efb54b3783e2ce3f28"}, + {file = "coverage-7.6.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:de38add67a0af869b0d79c525d3e4588ac1ffa92f39116dbe0ed9753f26eba7d"}, + {file = "coverage-7.6.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b07c25d52b1c16ce5de088046cd2432b30f9ad5e224ff17c8f496d9cb7d1d451"}, + {file = "coverage-7.6.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62a66ff235e4c2e37ed3b6104d8b478d767ff73838d1222132a7a026aa548764"}, + {file = "coverage-7.6.8-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09b9f848b28081e7b975a3626e9081574a7b9196cde26604540582da60235fdf"}, + {file = "coverage-7.6.8-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:093896e530c38c8e9c996901858ac63f3d4171268db2c9c8b373a228f459bbc5"}, + {file = "coverage-7.6.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9a7b8ac36fd688c8361cbc7bf1cb5866977ece6e0b17c34aa0df58bda4fa18a4"}, + {file = "coverage-7.6.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:38c51297b35b3ed91670e1e4efb702b790002e3245a28c76e627478aa3c10d83"}, + {file = "coverage-7.6.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2e4e0f60cb4bd7396108823548e82fdab72d4d8a65e58e2c19bbbc2f1e2bfa4b"}, + {file = "coverage-7.6.8-cp313-cp313t-win32.whl", hash = "sha256:6535d996f6537ecb298b4e287a855f37deaf64ff007162ec0afb9ab8ba3b8b71"}, + {file = "coverage-7.6.8-cp313-cp313t-win_amd64.whl", hash = "sha256:c79c0685f142ca53256722a384540832420dff4ab15fec1863d7e5bc8691bdcc"}, + {file = "coverage-7.6.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3ac47fa29d8d41059ea3df65bd3ade92f97ee4910ed638e87075b8e8ce69599e"}, + {file = "coverage-7.6.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:24eda3a24a38157eee639ca9afe45eefa8d2420d49468819ac5f88b10de84f4c"}, + {file = "coverage-7.6.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4c81ed2820b9023a9a90717020315e63b17b18c274a332e3b6437d7ff70abe0"}, + {file = "coverage-7.6.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd55f8fc8fa494958772a2a7302b0354ab16e0b9272b3c3d83cdb5bec5bd1779"}, + {file = "coverage-7.6.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f39e2f3530ed1626c66e7493be7a8423b023ca852aacdc91fb30162c350d2a92"}, + {file = "coverage-7.6.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:716a78a342679cd1177bc8c2fe957e0ab91405bd43a17094324845200b2fddf4"}, + {file = "coverage-7.6.8-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:177f01eeaa3aee4a5ffb0d1439c5952b53d5010f86e9d2667963e632e30082cc"}, + {file = "coverage-7.6.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:912e95017ff51dc3d7b6e2be158dedc889d9a5cc3382445589ce554f1a34c0ea"}, + {file = "coverage-7.6.8-cp39-cp39-win32.whl", hash = "sha256:4db3ed6a907b555e57cc2e6f14dc3a4c2458cdad8919e40b5357ab9b6db6c43e"}, + {file = "coverage-7.6.8-cp39-cp39-win_amd64.whl", hash = "sha256:428ac484592f780e8cd7b6b14eb568f7c85460c92e2a37cb0c0e5186e1a0d076"}, + {file = "coverage-7.6.8-pp39.pp310-none-any.whl", hash = "sha256:5c52a036535d12590c32c49209e79cabaad9f9ad8aa4cbd875b68c4d67a9cbce"}, + {file = "coverage-7.6.8.tar.gz", hash = "sha256:8b2b8503edb06822c86d82fa64a4a5cb0760bb8f31f26e138ec743f422f37cfc"}, ] [package.extras] @@ -458,13 +487,13 @@ files = [ [[package]] name = "fcache" -version = "0.5.2" +version = "0.6.0" description = "a dictionary-like, file-based cache module for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "fcache-0.5.2-py3-none-any.whl", hash = "sha256:b5913594389e04fde2b9d7797c37972e507f9d20bd225ffa5b0ee43d7cb9b7e0"}, - {file = "fcache-0.5.2.tar.gz", hash = "sha256:db127459a0c184a8aa8599fb9f85c5f403216282f27697cdf7adee012ccda5be"}, + {file = "fcache-0.6.0-py3-none-any.whl", hash = "sha256:dbf0753bb7400ed80d703df9ffcfb438786698872ed92c50169f95cb0eac8306"}, + {file = "fcache-0.6.0.tar.gz", hash = "sha256:79949f0aafe8cedc5c9064631b3c157941a288e59f9991dd158c23e8e60b5422"}, ] [package.dependencies] @@ -472,29 +501,29 @@ platformdirs = ">=3.0,<4.0" [[package]] name = "filelock" -version = "3.15.4" +version = "3.16.1" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, - {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, + {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, + {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"] -typing = ["typing-extensions (>=4.8)"] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] +typing = ["typing-extensions (>=4.12.2)"] [[package]] name = "flake8" -version = "7.1.0" +version = "7.1.1" description = "the modular source code checker: pep8 pyflakes and co" optional = false python-versions = ">=3.8.1" files = [ - {file = "flake8-7.1.0-py2.py3-none-any.whl", hash = "sha256:2e416edcc62471a64cea09353f4e7bdba32aeb079b6e360554c659a122b1bc6a"}, - {file = "flake8-7.1.0.tar.gz", hash = "sha256:48a07b626b55236e0fb4784ee69a465fbf59d79eec1f5b4785c3d3bc57d17aa5"}, + {file = "flake8-7.1.1-py2.py3-none-any.whl", hash = "sha256:597477df7860daa5aa0fdd84bf5208a043ab96b8e96ab708770ae0364dd03213"}, + {file = "flake8-7.1.1.tar.gz", hash = "sha256:049d058491e228e03e67b390f311bbf88fce2dbaa8fa673e7aea87b7198b8d38"}, ] [package.dependencies] @@ -621,69 +650,84 @@ UnleashClient = "*" [[package]] name = "greenlet" -version = "3.0.3" +version = "3.1.1" description = "Lightweight in-process concurrent programming" optional = false python-versions = ">=3.7" files = [ - {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, - {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, - {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, - {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, - {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, - {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, - {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, - {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, - {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, - {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, - {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, - {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, - {file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"}, - {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"}, - {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"}, - {file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"}, - {file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"}, - {file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"}, - {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"}, - {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"}, - {file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"}, - {file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"}, - {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, - {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, - {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, - {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, - {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, - {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, + {file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617"}, + {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7"}, + {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6"}, + {file = "greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80"}, + {file = "greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395"}, + {file = "greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39"}, + {file = "greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942"}, + {file = "greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01"}, + {file = "greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c"}, + {file = "greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de"}, + {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa"}, + {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af"}, + {file = "greenlet-3.1.1-cp37-cp37m-win32.whl", hash = "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798"}, + {file = "greenlet-3.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef"}, + {file = "greenlet-3.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1"}, + {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd"}, + {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7"}, + {file = "greenlet-3.1.1-cp38-cp38-win32.whl", hash = "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef"}, + {file = "greenlet-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d"}, + {file = "greenlet-3.1.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c"}, + {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e"}, + {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e"}, + {file = "greenlet-3.1.1-cp39-cp39-win32.whl", hash = "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c"}, + {file = "greenlet-3.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22"}, + {file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"}, ] [package.extras] @@ -713,33 +757,40 @@ tornado = ["tornado (>=0.2)"] [[package]] name = "idna" -version = "3.7" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "importlib-metadata" -version = "8.0.0" +version = "8.5.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-8.0.0-py3-none-any.whl", hash = "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f"}, - {file = "importlib_metadata-8.0.0.tar.gz", hash = "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812"}, + {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"}, + {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"}, ] [package.dependencies] -zipp = ">=0.5" +zipp = ">=3.20" [package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] perf = ["ipython"] -test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +type = ["pytest-mypy"] [[package]] name = "iniconfig" @@ -754,13 +805,13 @@ files = [ [[package]] name = "insights-core" -version = "3.4.3" +version = "3.4.23" description = "Insights Core is a data collection and analysis framework" optional = false python-versions = "*" files = [ - {file = "insights_core-3.4.3-py3-none-any.whl", hash = "sha256:8938d74350a5b9c678d2c80306253ecb297591168d769c9875ab5c3e892b8ca2"}, - {file = "insights_core-3.4.3.tar.gz", hash = "sha256:dbc7bde16ad97073cb75486bc8821cdf4b3f112cfb5835a237579ee5ee436ed6"}, + {file = "insights_core-3.4.23-py3-none-any.whl", hash = "sha256:342f155af29ec02267041dec2473d12922ab47564dcd2fa306f33fb1e2311f51"}, + {file = "insights_core-3.4.23.tar.gz", hash = "sha256:190bfc40c726b74d2b8720153d7bfca256552198197e3db0788966666e24b744"}, ] [package.dependencies] @@ -780,11 +831,11 @@ six = "*" [package.extras] client = ["cachecontrol", "cachecontrol[filecache]", "cachecontrol[redis]", "defusedxml", "jinja2", "jinja2 (<=2.11.3)", "lockfile", "oyaml", "python-gnupg (==0.4.6)", "pyyaml", "pyyaml (>=3.10,<=3.13)", "redis", "requests", "setuptools", "six"] -client-develop = ["cachecontrol", "cachecontrol[filecache]", "cachecontrol[redis]", "coverage", "coverage (==4.3.4)", "defusedxml", "flake8", "flake8 (==2.6.2)", "jinja2", "jinja2 (<=2.11.3)", "lockfile", "mock (==2.0.0)", "oyaml", "pytest", "pytest (==3.0.6)", "pytest (>=4.6.0,<4.7.0)", "pytest-cov", "pytest-cov (==2.4.0)", "python-gnupg (==0.4.6)", "pyyaml", "pyyaml (>=3.10,<=3.13)", "redis", "requests", "setuptools", "six", "wheel"] +client-develop = ["cachecontrol", "cachecontrol[filecache]", "cachecontrol[redis]", "coverage", "coverage (==4.3.4)", "defusedxml", "flake8", "flake8 (==2.6.2)", "jinja2", "jinja2 (<=2.11.3)", "lockfile", "mock (==2.0.0)", "oyaml", "pre-commit", "pytest", "pytest (==3.0.6)", "pytest (>=4.6.0,<4.7.0)", "pytest-cov", "pytest-cov (==2.4.0)", "python-gnupg (==0.4.6)", "pyyaml", "pyyaml (>=3.10,<=3.13)", "redis", "requests", "setuptools", "six", "wheel"] cluster = ["ansible", "cachecontrol", "cachecontrol[filecache]", "cachecontrol[redis]", "colorama", "defusedxml", "jinja2", "jinja2 (<=2.11.3)", "lockfile", "pandas", "pyyaml", "pyyaml (>=3.10,<=3.13)", "redis", "requests", "setuptools", "six"] -develop = ["MarkupSafe (==2.0.1)", "Pygments", "Sphinx", "ansible", "cachecontrol", "cachecontrol[filecache]", "cachecontrol[redis]", "colorama", "coverage", "coverage (==4.3.4)", "defusedxml", "docutils", "flake8", "flake8 (==2.6.2)", "ipython (<8.7.0)", "jedi", "jinja2", "jinja2 (<=2.11.3)", "lockfile", "mock (==2.0.0)", "nbsphinx", "oyaml", "pandas", "pytest", "pytest (==3.0.6)", "pytest (>=4.6.0,<4.7.0)", "pytest-cov", "pytest-cov (==2.4.0)", "python-gnupg (==0.4.6)", "pyyaml", "pyyaml (>=3.10,<=3.13)", "redis", "requests", "setuptools", "six", "sphinx-rtd-theme", "wheel"] -develop26 = ["ansible", "cachecontrol", "cachecontrol[filecache]", "cachecontrol[redis]", "colorama", "coverage", "coverage (==4.3.4)", "defusedxml", "flake8", "flake8 (==2.6.2)", "jinja2", "jinja2 (<=2.11.3)", "lockfile", "mock (==2.0.0)", "oyaml", "pandas", "pytest", "pytest (==3.0.6)", "pytest (>=4.6.0,<4.7.0)", "pytest-cov", "pytest-cov (==2.4.0)", "python-gnupg (==0.4.6)", "pyyaml", "pyyaml (>=3.10,<=3.13)", "redis", "requests", "setuptools", "six", "wheel"] -docs = ["MarkupSafe (==2.0.1)", "Pygments", "Sphinx", "colorama", "docutils", "ipython (<8.7.0)", "jedi", "nbsphinx", "sphinx-rtd-theme"] +develop = ["MarkupSafe (==2.0.1)", "Pygments", "Sphinx", "ansible", "cachecontrol", "cachecontrol[filecache]", "cachecontrol[redis]", "colorama", "coverage", "coverage (==4.3.4)", "defusedxml", "docutils", "flake8", "flake8 (==2.6.2)", "ipython (<8.7.0)", "jedi", "jinja2", "jinja2 (<=2.11.3)", "lockfile", "mock (==2.0.0)", "nbsphinx", "oyaml", "pandas", "pre-commit", "pytest", "pytest (==3.0.6)", "pytest (>=4.6.0,<4.7.0)", "pytest-cov", "pytest-cov (==2.4.0)", "python-gnupg (==0.4.6)", "pyyaml", "pyyaml (>=3.10,<=3.13)", "redis", "requests", "setuptools", "six", "sphinx_rtd_theme", "wheel"] +develop26 = ["ansible", "cachecontrol", "cachecontrol[filecache]", "cachecontrol[redis]", "colorama", "coverage", "coverage (==4.3.4)", "defusedxml", "flake8", "flake8 (==2.6.2)", "jinja2", "jinja2 (<=2.11.3)", "lockfile", "mock (==2.0.0)", "oyaml", "pandas", "pre-commit", "pytest", "pytest (==3.0.6)", "pytest (>=4.6.0,<4.7.0)", "pytest-cov", "pytest-cov (==2.4.0)", "python-gnupg (==0.4.6)", "pyyaml", "pyyaml (>=3.10,<=3.13)", "redis", "requests", "setuptools", "six", "wheel"] +docs = ["MarkupSafe (==2.0.1)", "Pygments", "Sphinx", "colorama", "docutils", "ipython (<8.7.0)", "jedi", "nbsphinx", "sphinx_rtd_theme"] linting = ["flake8", "flake8 (==2.6.2)", "oyaml", "python-gnupg (==0.4.6)", "requests"] openshift = ["cachecontrol", "cachecontrol[filecache]", "cachecontrol[redis]", "defusedxml", "jinja2", "jinja2 (<=2.11.3)", "lockfile", "openshift", "pyyaml", "pyyaml (>=3.10,<=3.13)", "redis", "requests", "setuptools", "six"] optional = ["python-cjson", "python-logstash", "python-statsd", "watchdog"] @@ -852,13 +903,13 @@ files = [ [[package]] name = "mako" -version = "1.3.5" +version = "1.3.6" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." optional = false python-versions = ">=3.8" files = [ - {file = "Mako-1.3.5-py3-none-any.whl", hash = "sha256:260f1dbc3a519453a9c856dedfe4beb4e50bd5a26d96386cb6c80856556bb91a"}, - {file = "Mako-1.3.5.tar.gz", hash = "sha256:48dbc20568c1d276a2698b36d968fa76161bf127194907ea6fc594fa81f943bc"}, + {file = "Mako-1.3.6-py3-none-any.whl", hash = "sha256:a91198468092a2f1a0de86ca92690fb0cfc43ca90ee17e15d93662b4c04b241a"}, + {file = "mako-1.3.6.tar.gz", hash = "sha256:9ec3a1583713479fae654f83ed9fa8c9a4c16b7bb0daba0e6bbebff50c0d983d"}, ] [package.dependencies] @@ -869,97 +920,74 @@ babel = ["Babel"] lingua = ["lingua"] testing = ["pytest"] -[[package]] -name = "markdown-it-py" -version = "3.0.0" -description = "Python port of markdown-it. Markdown parsing, done right!" -optional = false -python-versions = ">=3.8" -files = [ - {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, - {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, -] - -[package.dependencies] -mdurl = ">=0.1,<1.0" - -[package.extras] -benchmarking = ["psutil", "pytest", "pytest-benchmark"] -code-style = ["pre-commit (>=3.0,<4.0)"] -compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] -linkify = ["linkify-it-py (>=1,<3)"] -plugins = ["mdit-py-plugins"] -profiling = ["gprof2dot"] -rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] -testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] - [[package]] name = "markupsafe" -version = "2.1.5" +version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = false -python-versions = ">=3.7" -files = [ - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +python-versions = ">=3.9" +files = [ + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, ] [[package]] @@ -973,183 +1001,201 @@ files = [ {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] -[[package]] -name = "mdurl" -version = "0.1.2" -description = "Markdown URL utilities" -optional = false -python-versions = ">=3.7" -files = [ - {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, - {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, -] - [[package]] name = "mmh3" -version = "4.1.0" +version = "5.0.1" description = "Python extension for MurmurHash (MurmurHash3), a set of fast and robust hash functions." optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "mmh3-4.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:be5ac76a8b0cd8095784e51e4c1c9c318c19edcd1709a06eb14979c8d850c31a"}, - {file = "mmh3-4.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:98a49121afdfab67cd80e912b36404139d7deceb6773a83620137aaa0da5714c"}, - {file = "mmh3-4.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5259ac0535874366e7d1a5423ef746e0d36a9e3c14509ce6511614bdc5a7ef5b"}, - {file = "mmh3-4.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5950827ca0453a2be357696da509ab39646044e3fa15cad364eb65d78797437"}, - {file = "mmh3-4.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1dd0f652ae99585b9dd26de458e5f08571522f0402155809fd1dc8852a613a39"}, - {file = "mmh3-4.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99d25548070942fab1e4a6f04d1626d67e66d0b81ed6571ecfca511f3edf07e6"}, - {file = "mmh3-4.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53db8d9bad3cb66c8f35cbc894f336273f63489ce4ac416634932e3cbe79eb5b"}, - {file = "mmh3-4.1.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75da0f615eb55295a437264cc0b736753f830b09d102aa4c2a7d719bc445ec05"}, - {file = "mmh3-4.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b926b07fd678ea84b3a2afc1fa22ce50aeb627839c44382f3d0291e945621e1a"}, - {file = "mmh3-4.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c5b053334f9b0af8559d6da9dc72cef0a65b325ebb3e630c680012323c950bb6"}, - {file = "mmh3-4.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:5bf33dc43cd6de2cb86e0aa73a1cc6530f557854bbbe5d59f41ef6de2e353d7b"}, - {file = "mmh3-4.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fa7eacd2b830727ba3dd65a365bed8a5c992ecd0c8348cf39a05cc77d22f4970"}, - {file = "mmh3-4.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:42dfd6742b9e3eec599f85270617debfa0bbb913c545bb980c8a4fa7b2d047da"}, - {file = "mmh3-4.1.0-cp310-cp310-win32.whl", hash = "sha256:2974ad343f0d39dcc88e93ee6afa96cedc35a9883bc067febd7ff736e207fa47"}, - {file = "mmh3-4.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:74699a8984ded645c1a24d6078351a056f5a5f1fe5838870412a68ac5e28d865"}, - {file = "mmh3-4.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:f0dc874cedc23d46fc488a987faa6ad08ffa79e44fb08e3cd4d4cf2877c00a00"}, - {file = "mmh3-4.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3280a463855b0eae64b681cd5b9ddd9464b73f81151e87bb7c91a811d25619e6"}, - {file = "mmh3-4.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:97ac57c6c3301769e757d444fa7c973ceb002cb66534b39cbab5e38de61cd896"}, - {file = "mmh3-4.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a7b6502cdb4dbd880244818ab363c8770a48cdccecf6d729ade0241b736b5ec0"}, - {file = "mmh3-4.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52ba2da04671a9621580ddabf72f06f0e72c1c9c3b7b608849b58b11080d8f14"}, - {file = "mmh3-4.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a5fef4c4ecc782e6e43fbeab09cff1bac82c998a1773d3a5ee6a3605cde343e"}, - {file = "mmh3-4.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5135358a7e00991f73b88cdc8eda5203bf9de22120d10a834c5761dbeb07dd13"}, - {file = "mmh3-4.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cff9ae76a54f7c6fe0167c9c4028c12c1f6de52d68a31d11b6790bb2ae685560"}, - {file = "mmh3-4.1.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f02576a4d106d7830ca90278868bf0983554dd69183b7bbe09f2fcd51cf54f"}, - {file = "mmh3-4.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:073d57425a23721730d3ff5485e2da489dd3c90b04e86243dd7211f889898106"}, - {file = "mmh3-4.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:71e32ddec7f573a1a0feb8d2cf2af474c50ec21e7a8263026e8d3b4b629805db"}, - {file = "mmh3-4.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7cbb20b29d57e76a58b40fd8b13a9130db495a12d678d651b459bf61c0714cea"}, - {file = "mmh3-4.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:a42ad267e131d7847076bb7e31050f6c4378cd38e8f1bf7a0edd32f30224d5c9"}, - {file = "mmh3-4.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4a013979fc9390abadc445ea2527426a0e7a4495c19b74589204f9b71bcaafeb"}, - {file = "mmh3-4.1.0-cp311-cp311-win32.whl", hash = "sha256:1d3b1cdad7c71b7b88966301789a478af142bddcb3a2bee563f7a7d40519a00f"}, - {file = "mmh3-4.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:0dc6dc32eb03727467da8e17deffe004fbb65e8b5ee2b502d36250d7a3f4e2ec"}, - {file = "mmh3-4.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:9ae3a5c1b32dda121c7dc26f9597ef7b01b4c56a98319a7fe86c35b8bc459ae6"}, - {file = "mmh3-4.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0033d60c7939168ef65ddc396611077a7268bde024f2c23bdc283a19123f9e9c"}, - {file = "mmh3-4.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d6af3e2287644b2b08b5924ed3a88c97b87b44ad08e79ca9f93d3470a54a41c5"}, - {file = "mmh3-4.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d82eb4defa245e02bb0b0dc4f1e7ee284f8d212633389c91f7fba99ba993f0a2"}, - {file = "mmh3-4.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba245e94b8d54765e14c2d7b6214e832557e7856d5183bc522e17884cab2f45d"}, - {file = "mmh3-4.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb04e2feeabaad6231e89cd43b3d01a4403579aa792c9ab6fdeef45cc58d4ec0"}, - {file = "mmh3-4.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e3b1a27def545ce11e36158ba5d5390cdbc300cfe456a942cc89d649cf7e3b2"}, - {file = "mmh3-4.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce0ab79ff736d7044e5e9b3bfe73958a55f79a4ae672e6213e92492ad5e734d5"}, - {file = "mmh3-4.1.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b02268be6e0a8eeb8a924d7db85f28e47344f35c438c1e149878bb1c47b1cd3"}, - {file = "mmh3-4.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:deb887f5fcdaf57cf646b1e062d56b06ef2f23421c80885fce18b37143cba828"}, - {file = "mmh3-4.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99dd564e9e2b512eb117bd0cbf0f79a50c45d961c2a02402787d581cec5448d5"}, - {file = "mmh3-4.1.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:08373082dfaa38fe97aa78753d1efd21a1969e51079056ff552e687764eafdfe"}, - {file = "mmh3-4.1.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:54b9c6a2ea571b714e4fe28d3e4e2db37abfd03c787a58074ea21ee9a8fd1740"}, - {file = "mmh3-4.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a7b1edf24c69e3513f879722b97ca85e52f9032f24a52284746877f6a7304086"}, - {file = "mmh3-4.1.0-cp312-cp312-win32.whl", hash = "sha256:411da64b951f635e1e2284b71d81a5a83580cea24994b328f8910d40bed67276"}, - {file = "mmh3-4.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:bebc3ecb6ba18292e3d40c8712482b4477abd6981c2ebf0e60869bd90f8ac3a9"}, - {file = "mmh3-4.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:168473dd608ade6a8d2ba069600b35199a9af837d96177d3088ca91f2b3798e3"}, - {file = "mmh3-4.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:372f4b7e1dcde175507640679a2a8790185bb71f3640fc28a4690f73da986a3b"}, - {file = "mmh3-4.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:438584b97f6fe13e944faf590c90fc127682b57ae969f73334040d9fa1c7ffa5"}, - {file = "mmh3-4.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6e27931b232fc676675fac8641c6ec6b596daa64d82170e8597f5a5b8bdcd3b6"}, - {file = "mmh3-4.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:571a92bad859d7b0330e47cfd1850b76c39b615a8d8e7aa5853c1f971fd0c4b1"}, - {file = "mmh3-4.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a69d6afe3190fa08f9e3a58e5145549f71f1f3fff27bd0800313426929c7068"}, - {file = "mmh3-4.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:afb127be0be946b7630220908dbea0cee0d9d3c583fa9114a07156f98566dc28"}, - {file = "mmh3-4.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:940d86522f36348ef1a494cbf7248ab3f4a1638b84b59e6c9e90408bd11ad729"}, - {file = "mmh3-4.1.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3dcccc4935686619a8e3d1f7b6e97e3bd89a4a796247930ee97d35ea1a39341"}, - {file = "mmh3-4.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01bb9b90d61854dfc2407c5e5192bfb47222d74f29d140cb2dd2a69f2353f7cc"}, - {file = "mmh3-4.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:bcb1b8b951a2c0b0fb8a5426c62a22557e2ffc52539e0a7cc46eb667b5d606a9"}, - {file = "mmh3-4.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6477a05d5e5ab3168e82e8b106e316210ac954134f46ec529356607900aea82a"}, - {file = "mmh3-4.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:da5892287e5bea6977364b15712a2573c16d134bc5fdcdd4cf460006cf849278"}, - {file = "mmh3-4.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:99180d7fd2327a6fffbaff270f760576839dc6ee66d045fa3a450f3490fda7f5"}, - {file = "mmh3-4.1.0-cp38-cp38-win32.whl", hash = "sha256:9b0d4f3949913a9f9a8fb1bb4cc6ecd52879730aab5ff8c5a3d8f5b593594b73"}, - {file = "mmh3-4.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:598c352da1d945108aee0c3c3cfdd0e9b3edef74108f53b49d481d3990402169"}, - {file = "mmh3-4.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:475d6d1445dd080f18f0f766277e1237fa2914e5fe3307a3b2a3044f30892103"}, - {file = "mmh3-4.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5ca07c41e6a2880991431ac717c2a049056fff497651a76e26fc22224e8b5732"}, - {file = "mmh3-4.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ebe052fef4bbe30c0548d12ee46d09f1b69035ca5208a7075e55adfe091be44"}, - {file = "mmh3-4.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eaefd42e85afb70f2b855a011f7b4d8a3c7e19c3f2681fa13118e4d8627378c5"}, - {file = "mmh3-4.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0ae43caae5a47afe1b63a1ae3f0986dde54b5fb2d6c29786adbfb8edc9edfb"}, - {file = "mmh3-4.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6218666f74c8c013c221e7f5f8a693ac9cf68e5ac9a03f2373b32d77c48904de"}, - {file = "mmh3-4.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac59294a536ba447b5037f62d8367d7d93b696f80671c2c45645fa9f1109413c"}, - {file = "mmh3-4.1.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:086844830fcd1e5c84fec7017ea1ee8491487cfc877847d96f86f68881569d2e"}, - {file = "mmh3-4.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e42b38fad664f56f77f6fbca22d08450f2464baa68acdbf24841bf900eb98e87"}, - {file = "mmh3-4.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d08b790a63a9a1cde3b5d7d733ed97d4eb884bfbc92f075a091652d6bfd7709a"}, - {file = "mmh3-4.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:73ea4cc55e8aea28c86799ecacebca09e5f86500414870a8abaedfcbaf74d288"}, - {file = "mmh3-4.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:f90938ff137130e47bcec8dc1f4ceb02f10178c766e2ef58a9f657ff1f62d124"}, - {file = "mmh3-4.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:aa1f13e94b8631c8cd53259250556edcf1de71738936b60febba95750d9632bd"}, - {file = "mmh3-4.1.0-cp39-cp39-win32.whl", hash = "sha256:a3b680b471c181490cf82da2142029edb4298e1bdfcb67c76922dedef789868d"}, - {file = "mmh3-4.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:fefef92e9c544a8dbc08f77a8d1b6d48006a750c4375bbcd5ff8199d761e263b"}, - {file = "mmh3-4.1.0-cp39-cp39-win_arm64.whl", hash = "sha256:8e2c1f6a2b41723a4f82bd5a762a777836d29d664fc0095f17910bea0adfd4a6"}, - {file = "mmh3-4.1.0.tar.gz", hash = "sha256:a1cf25348b9acd229dda464a094d6170f47d2850a1fcb762a3b6172d2ce6ca4a"}, + {file = "mmh3-5.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f0a4b4bf05778ed77d820d6e7d0e9bd6beb0c01af10e1ce9233f5d2f814fcafa"}, + {file = "mmh3-5.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac7a391039aeab95810c2d020b69a94eb6b4b37d4e2374831e92db3a0cdf71c6"}, + {file = "mmh3-5.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3a2583b5521ca49756d8d8bceba80627a9cc295f255dcab4e3df7ccc2f09679a"}, + {file = "mmh3-5.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:081a8423fe53c1ac94f87165f3e4c500125d343410c1a0c5f1703e898a3ef038"}, + {file = "mmh3-5.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8b4d72713799755dc8954a7d36d5c20a6c8de7b233c82404d122c7c7c1707cc"}, + {file = "mmh3-5.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:389a6fd51efc76d3182d36ec306448559c1244f11227d2bb771bdd0e6cc91321"}, + {file = "mmh3-5.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39f4128edaa074bff721b1d31a72508cba4d2887ee7867f22082e1fe9d4edea0"}, + {file = "mmh3-5.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d5d23a94d91aabba3386b3769048d5f4210fdfef80393fece2f34ba5a7b466c"}, + {file = "mmh3-5.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:16347d038361f8b8f24fd2b7ef378c9b68ddee9f7706e46269b6e0d322814713"}, + {file = "mmh3-5.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6e299408565af7d61f2d20a5ffdd77cf2ed902460fe4e6726839d59ba4b72316"}, + {file = "mmh3-5.0.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:42050af21ddfc5445ee5a66e73a8fc758c71790305e3ee9e4a85a8e69e810f94"}, + {file = "mmh3-5.0.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2ae9b1f5ef27ec54659920f0404b7ceb39966e28867c461bfe83a05e8d18ddb0"}, + {file = "mmh3-5.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:50c2495a02045f3047d71d4ae9cdd7a15efc0bcbb7ff17a18346834a8e2d1d19"}, + {file = "mmh3-5.0.1-cp310-cp310-win32.whl", hash = "sha256:c028fa77cddf351ca13b4a56d43c1775652cde0764cadb39120b68f02a23ecf6"}, + {file = "mmh3-5.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:c5e741e421ec14400c4aae30890515c201f518403bdef29ae1e00d375bb4bbb5"}, + {file = "mmh3-5.0.1-cp310-cp310-win_arm64.whl", hash = "sha256:b17156d56fabc73dbf41bca677ceb6faed435cc8544f6566d72ea77d8a17e9d0"}, + {file = "mmh3-5.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a6d5a9b1b923f1643559ba1fc0bf7a5076c90cbb558878d3bf3641ce458f25d"}, + {file = "mmh3-5.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3349b968be555f7334bbcce839da98f50e1e80b1c615d8e2aa847ea4a964a012"}, + {file = "mmh3-5.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1bd3c94b110e55db02ab9b605029f48a2f7f677c6e58c09d44e42402d438b7e1"}, + {file = "mmh3-5.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47ba84d48608f79adbb10bb09986b6dc33eeda5c2d1bd75d00820081b73bde9"}, + {file = "mmh3-5.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c0217987a8b8525c8d9170f66d036dec4ab45cfbd53d47e8d76125791ceb155e"}, + {file = "mmh3-5.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2797063a34e78d1b61639a98b0edec1c856fa86ab80c7ec859f1796d10ba429"}, + {file = "mmh3-5.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8bba16340adcbd47853a2fbe5afdb397549e8f2e79324ff1dced69a3f8afe7c3"}, + {file = "mmh3-5.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:282797957c9f60b51b9d768a602c25f579420cc9af46feb77d457a27823d270a"}, + {file = "mmh3-5.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e4fb670c29e63f954f9e7a2cdcd57b36a854c2538f579ef62681ccbaa1de2b69"}, + {file = "mmh3-5.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ee7d85438dc6aff328e19ab052086a3c29e8a9b632998a49e5c4b0034e9e8d6"}, + {file = "mmh3-5.0.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b7fb5db231f3092444bc13901e6a8d299667126b00636ffbad4a7b45e1051e2f"}, + {file = "mmh3-5.0.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c100dd441703da5ec136b1d9003ed4a041d8a1136234c9acd887499796df6ad8"}, + {file = "mmh3-5.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:71f3b765138260fd7a7a2dba0ea5727dabcd18c1f80323c9cfef97a7e86e01d0"}, + {file = "mmh3-5.0.1-cp311-cp311-win32.whl", hash = "sha256:9a76518336247fd17689ce3ae5b16883fd86a490947d46a0193d47fb913e26e3"}, + {file = "mmh3-5.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:336bc4df2e44271f1c302d289cc3d78bd52d3eed8d306c7e4bff8361a12bf148"}, + {file = "mmh3-5.0.1-cp311-cp311-win_arm64.whl", hash = "sha256:af6522722fbbc5999aa66f7244d0986767a46f1fb05accc5200f75b72428a508"}, + {file = "mmh3-5.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f2730bb263ed9c388e8860438b057a53e3cc701134a6ea140f90443c4c11aa40"}, + {file = "mmh3-5.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6246927bc293f6d56724536400b85fb85f5be26101fa77d5f97dd5e2a4c69bf2"}, + {file = "mmh3-5.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fbca322519a6e6e25b6abf43e940e1667cf8ea12510e07fb4919b48a0cd1c411"}, + {file = "mmh3-5.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eae8c19903ed8a1724ad9e67e86f15d198a7a1271a4f9be83d47e38f312ed672"}, + {file = "mmh3-5.0.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a09fd6cc72c07c0c07c3357714234b646d78052487c4a3bd5f7f6e08408cff60"}, + {file = "mmh3-5.0.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ff8551fee7ae3b11c5d986b6347ade0dccaadd4670ffdb2b944dee120ffcc84"}, + {file = "mmh3-5.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e39694c73a5a20c8bf36dfd8676ed351e5234d55751ba4f7562d85449b21ef3f"}, + {file = "mmh3-5.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eba6001989a92f72a89c7cf382fda831678bd780707a66b4f8ca90239fdf2123"}, + {file = "mmh3-5.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0771f90c9911811cc606a5c7b7b58f33501c9ee896ed68a6ac22c7d55878ecc0"}, + {file = "mmh3-5.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:09b31ed0c0c0920363e96641fac4efde65b1ab62b8df86293142f35a254e72b4"}, + {file = "mmh3-5.0.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5cf4a8deda0235312db12075331cb417c4ba163770edfe789bde71d08a24b692"}, + {file = "mmh3-5.0.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:41f7090a95185ef20ac018581a99337f0cbc84a2135171ee3290a9c0d9519585"}, + {file = "mmh3-5.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b97b5b368fb7ff22194ec5854f5b12d8de9ab67a0f304728c7f16e5d12135b76"}, + {file = "mmh3-5.0.1-cp312-cp312-win32.whl", hash = "sha256:842516acf04da546f94fad52db125ee619ccbdcada179da51c326a22c4578cb9"}, + {file = "mmh3-5.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:d963be0dbfd9fca209c17172f6110787ebf78934af25e3694fe2ba40e55c1e2b"}, + {file = "mmh3-5.0.1-cp312-cp312-win_arm64.whl", hash = "sha256:a5da292ceeed8ce8e32b68847261a462d30fd7b478c3f55daae841404f433c15"}, + {file = "mmh3-5.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:673e3f1c8d4231d6fb0271484ee34cb7146a6499fc0df80788adb56fd76842da"}, + {file = "mmh3-5.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f795a306bd16a52ad578b663462cc8e95500b3925d64118ae63453485d67282b"}, + {file = "mmh3-5.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5ed57a5e28e502a1d60436cc25c76c3a5ba57545f250f2969af231dc1221e0a5"}, + {file = "mmh3-5.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:632c28e7612e909dbb6cbe2fe496201ada4695b7715584005689c5dc038e59ad"}, + {file = "mmh3-5.0.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:53fd6bd525a5985e391c43384672d9d6b317fcb36726447347c7fc75bfed34ec"}, + {file = "mmh3-5.0.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dceacf6b0b961a0e499836af3aa62d60633265607aef551b2a3e3c48cdaa5edd"}, + {file = "mmh3-5.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f0738d478fdfb5d920f6aff5452c78f2c35b0eff72caa2a97dfe38e82f93da2"}, + {file = "mmh3-5.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e70285e7391ab88b872e5bef632bad16b9d99a6d3ca0590656a4753d55988af"}, + {file = "mmh3-5.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:27e5fc6360aa6b828546a4318da1a7da6bf6e5474ccb053c3a6aa8ef19ff97bd"}, + {file = "mmh3-5.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7989530c3c1e2c17bf5a0ec2bba09fd19819078ba90beedabb1c3885f5040b0d"}, + {file = "mmh3-5.0.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:cdad7bee649950da7ecd3cbbbd12fb81f1161072ecbdb5acfa0018338c5cb9cf"}, + {file = "mmh3-5.0.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e143b8f184c1bb58cecd85ab4a4fd6dc65a2d71aee74157392c3fddac2a4a331"}, + {file = "mmh3-5.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e5eb12e886f3646dd636f16b76eb23fc0c27e8ff3c1ae73d4391e50ef60b40f6"}, + {file = "mmh3-5.0.1-cp313-cp313-win32.whl", hash = "sha256:16e6dddfa98e1c2d021268e72c78951234186deb4df6630e984ac82df63d0a5d"}, + {file = "mmh3-5.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:d3ffb792d70b8c4a2382af3598dad6ae0c5bd9cee5b7ffcc99aa2f5fd2c1bf70"}, + {file = "mmh3-5.0.1-cp313-cp313-win_arm64.whl", hash = "sha256:122fa9ec148383f9124292962bda745f192b47bfd470b2af5fe7bb3982b17896"}, + {file = "mmh3-5.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b12bad8c75e6ff5d67319794fb6a5e8c713826c818d47f850ad08b4aa06960c6"}, + {file = "mmh3-5.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e5bbb066538c1048d542246fc347bb7994bdda29a3aea61c22f9f8b57111ce69"}, + {file = "mmh3-5.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:eee6134273f64e2a106827cc8fd77e70cc7239a285006fc6ab4977d59b015af2"}, + {file = "mmh3-5.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d04d9aa19d48e4c7bbec9cabc2c4dccc6ff3b2402f856d5bf0de03e10f167b5b"}, + {file = "mmh3-5.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79f37da1eed034d06567a69a7988456345c7f29e49192831c3975b464493b16e"}, + {file = "mmh3-5.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:242f77666743337aa828a2bf2da71b6ba79623ee7f93edb11e009f69237c8561"}, + {file = "mmh3-5.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffd943fff690463945f6441a2465555b3146deaadf6a5e88f2590d14c655d71b"}, + {file = "mmh3-5.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:565b15f8d7df43acb791ff5a360795c20bfa68bca8b352509e0fbabd06cc48cd"}, + {file = "mmh3-5.0.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fc6aafb867c2030df98ac7760ff76b500359252867985f357bd387739f3d5287"}, + {file = "mmh3-5.0.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:32898170644d45aa27c974ab0d067809c066205110f5c6d09f47d9ece6978bfe"}, + {file = "mmh3-5.0.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:42865567838d2193eb64e0ef571f678bf361a254fcdef0c5c8e73243217829bd"}, + {file = "mmh3-5.0.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5ff5c1f301c4a8b6916498969c0fcc7e3dbc56b4bfce5cfe3fe31f3f4609e5ae"}, + {file = "mmh3-5.0.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:be74c2dda8a6f44a504450aa2c3507f8067a159201586fc01dd41ab80efc350f"}, + {file = "mmh3-5.0.1-cp38-cp38-win32.whl", hash = "sha256:5610a842621ff76c04b20b29cf5f809b131f241a19d4937971ba77dc99a7f330"}, + {file = "mmh3-5.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:de15739ac50776fe8aa1ef13f1be46a6ee1fbd45f6d0651084097eb2be0a5aa4"}, + {file = "mmh3-5.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:48e84cf3cc7e8c41bc07de72299a73b92d9e3cde51d97851420055b1484995f7"}, + {file = "mmh3-5.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6dd9dc28c2d168c49928195c2e29b96f9582a5d07bd690a28aede4cc07b0e696"}, + {file = "mmh3-5.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2771a1c56a3d4bdad990309cff5d0a8051f29c8ec752d001f97d6392194ae880"}, + {file = "mmh3-5.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5ff2a8322ba40951a84411550352fba1073ce1c1d1213bb7530f09aed7f8caf"}, + {file = "mmh3-5.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a16bd3ec90682c9e0a343e6bd4c778c09947c8c5395cdb9e5d9b82b2559efbca"}, + {file = "mmh3-5.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d45733a78d68b5b05ff4a823aea51fa664df1d3bf4929b152ff4fd6dea2dd69b"}, + {file = "mmh3-5.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:904285e83cedebc8873b0838ed54c20f7344120be26e2ca5a907ab007a18a7a0"}, + {file = "mmh3-5.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac4aeb1784e43df728034d0ed72e4b2648db1a69fef48fa58e810e13230ae5ff"}, + {file = "mmh3-5.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:cb3d4f751a0b8b4c8d06ef1c085216c8fddcc8b8c8d72445976b5167a40c6d1e"}, + {file = "mmh3-5.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:8021851935600e60c42122ed1176399d7692df338d606195cd599d228a04c1c6"}, + {file = "mmh3-5.0.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:6182d5924a5efc451900f864cbb021d7e8ad5d524816ca17304a0f663bc09bb5"}, + {file = "mmh3-5.0.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:5f30b834552a4f79c92e3d266336fb87fd92ce1d36dc6813d3e151035890abbd"}, + {file = "mmh3-5.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cd4383f35e915e06d077df27e04ffd3be7513ec6a9de2d31f430393f67e192a7"}, + {file = "mmh3-5.0.1-cp39-cp39-win32.whl", hash = "sha256:1455fb6b42665a97db8fc66e89a861e52b567bce27ed054c47877183f86ea6e3"}, + {file = "mmh3-5.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:9e26a0f4eb9855a143f5938a53592fa14c2d3b25801c2106886ab6c173982780"}, + {file = "mmh3-5.0.1-cp39-cp39-win_arm64.whl", hash = "sha256:0d0a35a69abdad7549c4030a714bb4ad07902edb3bbe61e1bbc403ded5d678be"}, + {file = "mmh3-5.0.1.tar.gz", hash = "sha256:7dab080061aeb31a6069a181f27c473a1f67933854e36a3464931f2716508896"}, ] [package.extras] -test = ["mypy (>=1.0)", "pytest (>=7.0.0)"] +benchmark = ["pymmh3 (==0.0.5)", "pyperf (==2.7.0)", "xxhash (==3.5.0)"] +docs = ["myst-parser (==4.0.0)", "shibuya (==2024.8.30)", "sphinx (==8.0.2)", "sphinx-copybutton (==0.5.2)"] +lint = ["black (==24.8.0)", "clang-format (==18.1.8)", "isort (==5.13.2)", "pylint (==3.2.7)"] +plot = ["matplotlib (==3.9.2)", "pandas (==2.2.2)"] +test = ["pytest (==8.3.3)", "pytest-sugar (==1.0.0)"] +type = ["mypy (==1.11.2)"] [[package]] name = "msgpack" -version = "1.0.8" +version = "1.1.0" description = "MessagePack serializer" optional = false python-versions = ">=3.8" files = [ - {file = "msgpack-1.0.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:505fe3d03856ac7d215dbe005414bc28505d26f0c128906037e66d98c4e95868"}, - {file = "msgpack-1.0.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6b7842518a63a9f17107eb176320960ec095a8ee3b4420b5f688e24bf50c53c"}, - {file = "msgpack-1.0.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:376081f471a2ef24828b83a641a02c575d6103a3ad7fd7dade5486cad10ea659"}, - {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e390971d082dba073c05dbd56322427d3280b7cc8b53484c9377adfbae67dc2"}, - {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e073efcba9ea99db5acef3959efa45b52bc67b61b00823d2a1a6944bf45982"}, - {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82d92c773fbc6942a7a8b520d22c11cfc8fd83bba86116bfcf962c2f5c2ecdaa"}, - {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9ee32dcb8e531adae1f1ca568822e9b3a738369b3b686d1477cbc643c4a9c128"}, - {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e3aa7e51d738e0ec0afbed661261513b38b3014754c9459508399baf14ae0c9d"}, - {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69284049d07fce531c17404fcba2bb1df472bc2dcdac642ae71a2d079d950653"}, - {file = "msgpack-1.0.8-cp310-cp310-win32.whl", hash = "sha256:13577ec9e247f8741c84d06b9ece5f654920d8365a4b636ce0e44f15e07ec693"}, - {file = "msgpack-1.0.8-cp310-cp310-win_amd64.whl", hash = "sha256:e532dbd6ddfe13946de050d7474e3f5fb6ec774fbb1a188aaf469b08cf04189a"}, - {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9517004e21664f2b5a5fd6333b0731b9cf0817403a941b393d89a2f1dc2bd836"}, - {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d16a786905034e7e34098634b184a7d81f91d4c3d246edc6bd7aefb2fd8ea6ad"}, - {file = "msgpack-1.0.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2872993e209f7ed04d963e4b4fbae72d034844ec66bc4ca403329db2074377b"}, - {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c330eace3dd100bdb54b5653b966de7f51c26ec4a7d4e87132d9b4f738220ba"}, - {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83b5c044f3eff2a6534768ccfd50425939e7a8b5cf9a7261c385de1e20dcfc85"}, - {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1876b0b653a808fcd50123b953af170c535027bf1d053b59790eebb0aeb38950"}, - {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dfe1f0f0ed5785c187144c46a292b8c34c1295c01da12e10ccddfc16def4448a"}, - {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3528807cbbb7f315bb81959d5961855e7ba52aa60a3097151cb21956fbc7502b"}, - {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e2f879ab92ce502a1e65fce390eab619774dda6a6ff719718069ac94084098ce"}, - {file = "msgpack-1.0.8-cp311-cp311-win32.whl", hash = "sha256:26ee97a8261e6e35885c2ecd2fd4a6d38252246f94a2aec23665a4e66d066305"}, - {file = "msgpack-1.0.8-cp311-cp311-win_amd64.whl", hash = "sha256:eadb9f826c138e6cf3c49d6f8de88225a3c0ab181a9b4ba792e006e5292d150e"}, - {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:114be227f5213ef8b215c22dde19532f5da9652e56e8ce969bf0a26d7c419fee"}, - {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d661dc4785affa9d0edfdd1e59ec056a58b3dbb9f196fa43587f3ddac654ac7b"}, - {file = "msgpack-1.0.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d56fd9f1f1cdc8227d7b7918f55091349741904d9520c65f0139a9755952c9e8"}, - {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0726c282d188e204281ebd8de31724b7d749adebc086873a59efb8cf7ae27df3"}, - {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8db8e423192303ed77cff4dce3a4b88dbfaf43979d280181558af5e2c3c71afc"}, - {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99881222f4a8c2f641f25703963a5cefb076adffd959e0558dc9f803a52d6a58"}, - {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b5505774ea2a73a86ea176e8a9a4a7c8bf5d521050f0f6f8426afe798689243f"}, - {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ef254a06bcea461e65ff0373d8a0dd1ed3aa004af48839f002a0c994a6f72d04"}, - {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e1dd7839443592d00e96db831eddb4111a2a81a46b028f0facd60a09ebbdd543"}, - {file = "msgpack-1.0.8-cp312-cp312-win32.whl", hash = "sha256:64d0fcd436c5683fdd7c907eeae5e2cbb5eb872fafbc03a43609d7941840995c"}, - {file = "msgpack-1.0.8-cp312-cp312-win_amd64.whl", hash = "sha256:74398a4cf19de42e1498368c36eed45d9528f5fd0155241e82c4082b7e16cffd"}, - {file = "msgpack-1.0.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0ceea77719d45c839fd73abcb190b8390412a890df2f83fb8cf49b2a4b5c2f40"}, - {file = "msgpack-1.0.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1ab0bbcd4d1f7b6991ee7c753655b481c50084294218de69365f8f1970d4c151"}, - {file = "msgpack-1.0.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1cce488457370ffd1f953846f82323cb6b2ad2190987cd4d70b2713e17268d24"}, - {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3923a1778f7e5ef31865893fdca12a8d7dc03a44b33e2a5f3295416314c09f5d"}, - {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a22e47578b30a3e199ab067a4d43d790249b3c0587d9a771921f86250c8435db"}, - {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd739c9251d01e0279ce729e37b39d49a08c0420d3fee7f2a4968c0576678f77"}, - {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d3420522057ebab1728b21ad473aa950026d07cb09da41103f8e597dfbfaeb13"}, - {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5845fdf5e5d5b78a49b826fcdc0eb2e2aa7191980e3d2cfd2a30303a74f212e2"}, - {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a0e76621f6e1f908ae52860bdcb58e1ca85231a9b0545e64509c931dd34275a"}, - {file = "msgpack-1.0.8-cp38-cp38-win32.whl", hash = "sha256:374a8e88ddab84b9ada695d255679fb99c53513c0a51778796fcf0944d6c789c"}, - {file = "msgpack-1.0.8-cp38-cp38-win_amd64.whl", hash = "sha256:f3709997b228685fe53e8c433e2df9f0cdb5f4542bd5114ed17ac3c0129b0480"}, - {file = "msgpack-1.0.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f51bab98d52739c50c56658cc303f190785f9a2cd97b823357e7aeae54c8f68a"}, - {file = "msgpack-1.0.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:73ee792784d48aa338bba28063e19a27e8d989344f34aad14ea6e1b9bd83f596"}, - {file = "msgpack-1.0.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f9904e24646570539a8950400602d66d2b2c492b9010ea7e965025cb71d0c86d"}, - {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e75753aeda0ddc4c28dce4c32ba2f6ec30b1b02f6c0b14e547841ba5b24f753f"}, - {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5dbf059fb4b7c240c873c1245ee112505be27497e90f7c6591261c7d3c3a8228"}, - {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4916727e31c28be8beaf11cf117d6f6f188dcc36daae4e851fee88646f5b6b18"}, - {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7938111ed1358f536daf311be244f34df7bf3cdedb3ed883787aca97778b28d8"}, - {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:493c5c5e44b06d6c9268ce21b302c9ca055c1fd3484c25ba41d34476c76ee746"}, - {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fbb160554e319f7b22ecf530a80a3ff496d38e8e07ae763b9e82fadfe96f273"}, - {file = "msgpack-1.0.8-cp39-cp39-win32.whl", hash = "sha256:f9af38a89b6a5c04b7d18c492c8ccf2aee7048aff1ce8437c4683bb5a1df893d"}, - {file = "msgpack-1.0.8-cp39-cp39-win_amd64.whl", hash = "sha256:ed59dd52075f8fc91da6053b12e8c89e37aa043f8986efd89e61fae69dc1b011"}, - {file = "msgpack-1.0.8.tar.gz", hash = "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3"}, + {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ad442d527a7e358a469faf43fda45aaf4ac3249c8310a82f0ccff9164e5dccd"}, + {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:74bed8f63f8f14d75eec75cf3d04ad581da6b914001b474a5d3cd3372c8cc27d"}, + {file = "msgpack-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:914571a2a5b4e7606997e169f64ce53a8b1e06f2cf2c3a7273aa106236d43dd5"}, + {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c921af52214dcbb75e6bdf6a661b23c3e6417f00c603dd2070bccb5c3ef499f5"}, + {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8ce0b22b890be5d252de90d0e0d119f363012027cf256185fc3d474c44b1b9e"}, + {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73322a6cc57fcee3c0c57c4463d828e9428275fb85a27aa2aa1a92fdc42afd7b"}, + {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e1f3c3d21f7cf67bcf2da8e494d30a75e4cf60041d98b3f79875afb5b96f3a3f"}, + {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64fc9068d701233effd61b19efb1485587560b66fe57b3e50d29c5d78e7fef68"}, + {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:42f754515e0f683f9c79210a5d1cad631ec3d06cea5172214d2176a42e67e19b"}, + {file = "msgpack-1.1.0-cp310-cp310-win32.whl", hash = "sha256:3df7e6b05571b3814361e8464f9304c42d2196808e0119f55d0d3e62cd5ea044"}, + {file = "msgpack-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:685ec345eefc757a7c8af44a3032734a739f8c45d1b0ac45efc5d8977aa4720f"}, + {file = "msgpack-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d364a55082fb2a7416f6c63ae383fbd903adb5a6cf78c5b96cc6316dc1cedc7"}, + {file = "msgpack-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79ec007767b9b56860e0372085f8504db5d06bd6a327a335449508bbee9648fa"}, + {file = "msgpack-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ad622bf7756d5a497d5b6836e7fc3752e2dd6f4c648e24b1803f6048596f701"}, + {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e59bca908d9ca0de3dc8684f21ebf9a690fe47b6be93236eb40b99af28b6ea6"}, + {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1da8f11a3dd397f0a32c76165cf0c4eb95b31013a94f6ecc0b280c05c91b59"}, + {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452aff037287acb1d70a804ffd022b21fa2bb7c46bee884dbc864cc9024128a0"}, + {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8da4bf6d54ceed70e8861f833f83ce0814a2b72102e890cbdfe4b34764cdd66e"}, + {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:41c991beebf175faf352fb940bf2af9ad1fb77fd25f38d9142053914947cdbf6"}, + {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a52a1f3a5af7ba1c9ace055b659189f6c669cf3657095b50f9602af3a3ba0fe5"}, + {file = "msgpack-1.1.0-cp311-cp311-win32.whl", hash = "sha256:58638690ebd0a06427c5fe1a227bb6b8b9fdc2bd07701bec13c2335c82131a88"}, + {file = "msgpack-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fd2906780f25c8ed5d7b323379f6138524ba793428db5d0e9d226d3fa6aa1788"}, + {file = "msgpack-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d"}, + {file = "msgpack-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2"}, + {file = "msgpack-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420"}, + {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2"}, + {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39"}, + {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f"}, + {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247"}, + {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c"}, + {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b"}, + {file = "msgpack-1.1.0-cp312-cp312-win32.whl", hash = "sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b"}, + {file = "msgpack-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f"}, + {file = "msgpack-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:071603e2f0771c45ad9bc65719291c568d4edf120b44eb36324dcb02a13bfddf"}, + {file = "msgpack-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0f92a83b84e7c0749e3f12821949d79485971f087604178026085f60ce109330"}, + {file = "msgpack-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1964df7b81285d00a84da4e70cb1383f2e665e0f1f2a7027e683956d04b734"}, + {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59caf6a4ed0d164055ccff8fe31eddc0ebc07cf7326a2aaa0dbf7a4001cd823e"}, + {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0907e1a7119b337971a689153665764adc34e89175f9a34793307d9def08e6ca"}, + {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65553c9b6da8166e819a6aa90ad15288599b340f91d18f60b2061f402b9a4915"}, + {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7a946a8992941fea80ed4beae6bff74ffd7ee129a90b4dd5cf9c476a30e9708d"}, + {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4b51405e36e075193bc051315dbf29168d6141ae2500ba8cd80a522964e31434"}, + {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4c01941fd2ff87c2a934ee6055bda4ed353a7846b8d4f341c428109e9fcde8c"}, + {file = "msgpack-1.1.0-cp313-cp313-win32.whl", hash = "sha256:7c9a35ce2c2573bada929e0b7b3576de647b0defbd25f5139dcdaba0ae35a4cc"}, + {file = "msgpack-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f"}, + {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c40ffa9a15d74e05ba1fe2681ea33b9caffd886675412612d93ab17b58ea2fec"}, + {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1ba6136e650898082d9d5a5217d5906d1e138024f836ff48691784bbe1adf96"}, + {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0856a2b7e8dcb874be44fea031d22e5b3a19121be92a1e098f46068a11b0870"}, + {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:471e27a5787a2e3f974ba023f9e265a8c7cfd373632247deb225617e3100a3c7"}, + {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:646afc8102935a388ffc3914b336d22d1c2d6209c773f3eb5dd4d6d3b6f8c1cb"}, + {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:13599f8829cfbe0158f6456374e9eea9f44eee08076291771d8ae93eda56607f"}, + {file = "msgpack-1.1.0-cp38-cp38-win32.whl", hash = "sha256:8a84efb768fb968381e525eeeb3d92857e4985aacc39f3c47ffd00eb4509315b"}, + {file = "msgpack-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:879a7b7b0ad82481c52d3c7eb99bf6f0645dbdec5134a4bddbd16f3506947feb"}, + {file = "msgpack-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:53258eeb7a80fc46f62fd59c876957a2d0e15e6449a9e71842b6d24419d88ca1"}, + {file = "msgpack-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e7b853bbc44fb03fbdba34feb4bd414322180135e2cb5164f20ce1c9795ee48"}, + {file = "msgpack-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3e9b4936df53b970513eac1758f3882c88658a220b58dcc1e39606dccaaf01c"}, + {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46c34e99110762a76e3911fc923222472c9d681f1094096ac4102c18319e6468"}, + {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a706d1e74dd3dea05cb54580d9bd8b2880e9264856ce5068027eed09680aa74"}, + {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:534480ee5690ab3cbed89d4c8971a5c631b69a8c0883ecfea96c19118510c846"}, + {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8cf9e8c3a2153934a23ac160cc4cba0ec035f6867c8013cc6077a79823370346"}, + {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3180065ec2abbe13a4ad37688b61b99d7f9e012a535b930e0e683ad6bc30155b"}, + {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c5a91481a3cc573ac8c0d9aace09345d989dc4a0202b7fcb312c88c26d4e71a8"}, + {file = "msgpack-1.1.0-cp39-cp39-win32.whl", hash = "sha256:f80bc7d47f76089633763f952e67f8214cb7b3ee6bfa489b3cb6a84cfac114cd"}, + {file = "msgpack-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:4d1b7ff2d6146e16e8bd665ac726a89c74163ef8cd39fa8c1087d4e52d3a2325"}, + {file = "msgpack-1.1.0.tar.gz", hash = "sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e"}, ] [[package]] name = "packaging" -version = "24.1" +version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, - {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] [[package]] @@ -1213,155 +1259,160 @@ prometheus-client = "*" [[package]] name = "psycopg2" -version = "2.9.9" +version = "2.9.10" description = "psycopg2 - Python-PostgreSQL Database Adapter" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "psycopg2-2.9.9-cp310-cp310-win32.whl", hash = "sha256:38a8dcc6856f569068b47de286b472b7c473ac7977243593a288ebce0dc89516"}, - {file = "psycopg2-2.9.9-cp310-cp310-win_amd64.whl", hash = "sha256:426f9f29bde126913a20a96ff8ce7d73fd8a216cfb323b1f04da402d452853c3"}, - {file = "psycopg2-2.9.9-cp311-cp311-win32.whl", hash = "sha256:ade01303ccf7ae12c356a5e10911c9e1c51136003a9a1d92f7aa9d010fb98372"}, - {file = "psycopg2-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:121081ea2e76729acfb0673ff33755e8703d45e926e416cb59bae3a86c6a4981"}, - {file = "psycopg2-2.9.9-cp312-cp312-win32.whl", hash = "sha256:d735786acc7dd25815e89cc4ad529a43af779db2e25aa7c626de864127e5a024"}, - {file = "psycopg2-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:a7653d00b732afb6fc597e29c50ad28087dcb4fbfb28e86092277a559ae4e693"}, - {file = "psycopg2-2.9.9-cp37-cp37m-win32.whl", hash = "sha256:5e0d98cade4f0e0304d7d6f25bbfbc5bd186e07b38eac65379309c4ca3193efa"}, - {file = "psycopg2-2.9.9-cp37-cp37m-win_amd64.whl", hash = "sha256:7e2dacf8b009a1c1e843b5213a87f7c544b2b042476ed7755be813eaf4e8347a"}, - {file = "psycopg2-2.9.9-cp38-cp38-win32.whl", hash = "sha256:ff432630e510709564c01dafdbe996cb552e0b9f3f065eb89bdce5bd31fabf4c"}, - {file = "psycopg2-2.9.9-cp38-cp38-win_amd64.whl", hash = "sha256:bac58c024c9922c23550af2a581998624d6e02350f4ae9c5f0bc642c633a2d5e"}, - {file = "psycopg2-2.9.9-cp39-cp39-win32.whl", hash = "sha256:c92811b2d4c9b6ea0285942b2e7cac98a59e166d59c588fe5cfe1eda58e72d59"}, - {file = "psycopg2-2.9.9-cp39-cp39-win_amd64.whl", hash = "sha256:de80739447af31525feddeb8effd640782cf5998e1a4e9192ebdf829717e3913"}, - {file = "psycopg2-2.9.9.tar.gz", hash = "sha256:d1454bde93fb1e224166811694d600e746430c006fbb031ea06ecc2ea41bf156"}, + {file = "psycopg2-2.9.10-cp310-cp310-win32.whl", hash = "sha256:5df2b672140f95adb453af93a7d669d7a7bf0a56bcd26f1502329166f4a61716"}, + {file = "psycopg2-2.9.10-cp310-cp310-win_amd64.whl", hash = "sha256:c6f7b8561225f9e711a9c47087388a97fdc948211c10a4bccbf0ba68ab7b3b5a"}, + {file = "psycopg2-2.9.10-cp311-cp311-win32.whl", hash = "sha256:47c4f9875125344f4c2b870e41b6aad585901318068acd01de93f3677a6522c2"}, + {file = "psycopg2-2.9.10-cp311-cp311-win_amd64.whl", hash = "sha256:0435034157049f6846e95103bd8f5a668788dd913a7c30162ca9503fdf542cb4"}, + {file = "psycopg2-2.9.10-cp312-cp312-win32.whl", hash = "sha256:65a63d7ab0e067e2cdb3cf266de39663203d38d6a8ed97f5ca0cb315c73fe067"}, + {file = "psycopg2-2.9.10-cp312-cp312-win_amd64.whl", hash = "sha256:4a579d6243da40a7b3182e0430493dbd55950c493d8c68f4eec0b302f6bbf20e"}, + {file = "psycopg2-2.9.10-cp39-cp39-win32.whl", hash = "sha256:9d5b3b94b79a844a986d029eee38998232451119ad653aea42bb9220a8c5066b"}, + {file = "psycopg2-2.9.10-cp39-cp39-win_amd64.whl", hash = "sha256:88138c8dedcbfa96408023ea2b0c369eda40fe5d75002c0964c78f46f11fa442"}, + {file = "psycopg2-2.9.10.tar.gz", hash = "sha256:12ec0b40b0273f95296233e8750441339298e6a572f7039da5b260e3c8b60e11"}, ] [[package]] name = "pycodestyle" -version = "2.12.0" +version = "2.12.1" description = "Python style guide checker" optional = false python-versions = ">=3.8" files = [ - {file = "pycodestyle-2.12.0-py2.py3-none-any.whl", hash = "sha256:949a39f6b86c3e1515ba1787c2022131d165a8ad271b11370a8819aa070269e4"}, - {file = "pycodestyle-2.12.0.tar.gz", hash = "sha256:442f950141b4f43df752dd303511ffded3a04c2b6fb7f65980574f0c31e6e79c"}, + {file = "pycodestyle-2.12.1-py2.py3-none-any.whl", hash = "sha256:46f0fb92069a7c28ab7bb558f05bfc0110dac69a0cd23c61ea0040283a9d78b3"}, + {file = "pycodestyle-2.12.1.tar.gz", hash = "sha256:6838eae08bbce4f6accd5d5572075c63626a15ee3e6f842df996bf62f6d73521"}, ] [[package]] name = "pydantic" -version = "2.8.2" +version = "2.10.2" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, - {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, + {file = "pydantic-2.10.2-py3-none-any.whl", hash = "sha256:cfb96e45951117c3024e6b67b25cdc33a3cb7b2fa62e239f7af1378358a1d99e"}, + {file = "pydantic-2.10.2.tar.gz", hash = "sha256:2bc2d7f17232e0841cbba4641e65ba1eb6fafb3a08de3a091ff3ce14a197c4fa"}, ] [package.dependencies] -annotated-types = ">=0.4.0" -pydantic-core = "2.20.1" -typing-extensions = [ - {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, - {version = ">=4.6.1", markers = "python_version < \"3.13\""}, -] +annotated-types = ">=0.6.0" +pydantic-core = "2.27.1" +typing-extensions = ">=4.12.2" [package.extras] email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.20.1" +version = "2.27.1" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"}, - {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"}, - {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"}, - {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"}, - {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"}, - {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"}, - {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"}, - {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"}, - {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"}, - {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"}, - {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"}, - {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"}, - {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"}, - {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, - {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, - {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, - {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"}, - {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"}, - {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"}, - {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"}, - {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"}, - {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"}, - {file = "pydantic_core-2.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91"}, - {file = "pydantic_core-2.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd"}, - {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa"}, - {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987"}, - {file = "pydantic_core-2.20.1-cp38-none-win32.whl", hash = "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a"}, - {file = "pydantic_core-2.20.1-cp38-none-win_amd64.whl", hash = "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434"}, - {file = "pydantic_core-2.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c"}, - {file = "pydantic_core-2.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1"}, - {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09"}, - {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab"}, - {file = "pydantic_core-2.20.1-cp39-none-win32.whl", hash = "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2"}, - {file = "pydantic_core-2.20.1-cp39-none-win_amd64.whl", hash = "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, - {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, + {file = "pydantic_core-2.27.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:71a5e35c75c021aaf400ac048dacc855f000bdfed91614b4a726f7432f1f3d6a"}, + {file = "pydantic_core-2.27.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f82d068a2d6ecfc6e054726080af69a6764a10015467d7d7b9f66d6ed5afa23b"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:121ceb0e822f79163dd4699e4c54f5ad38b157084d97b34de8b232bcaad70278"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4603137322c18eaf2e06a4495f426aa8d8388940f3c457e7548145011bb68e05"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a33cd6ad9017bbeaa9ed78a2e0752c5e250eafb9534f308e7a5f7849b0b1bfb4"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15cc53a3179ba0fcefe1e3ae50beb2784dede4003ad2dfd24f81bba4b23a454f"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45d9c5eb9273aa50999ad6adc6be5e0ecea7e09dbd0d31bd0c65a55a2592ca08"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8bf7b66ce12a2ac52d16f776b31d16d91033150266eb796967a7e4621707e4f6"}, + {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:655d7dd86f26cb15ce8a431036f66ce0318648f8853d709b4167786ec2fa4807"}, + {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:5556470f1a2157031e676f776c2bc20acd34c1990ca5f7e56f1ebf938b9ab57c"}, + {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f69ed81ab24d5a3bd93861c8c4436f54afdf8e8cc421562b0c7504cf3be58206"}, + {file = "pydantic_core-2.27.1-cp310-none-win32.whl", hash = "sha256:f5a823165e6d04ccea61a9f0576f345f8ce40ed533013580e087bd4d7442b52c"}, + {file = "pydantic_core-2.27.1-cp310-none-win_amd64.whl", hash = "sha256:57866a76e0b3823e0b56692d1a0bf722bffb324839bb5b7226a7dbd6c9a40b17"}, + {file = "pydantic_core-2.27.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac3b20653bdbe160febbea8aa6c079d3df19310d50ac314911ed8cc4eb7f8cb8"}, + {file = "pydantic_core-2.27.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a5a8e19d7c707c4cadb8c18f5f60c843052ae83c20fa7d44f41594c644a1d330"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f7059ca8d64fea7f238994c97d91f75965216bcbe5f695bb44f354893f11d52"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bed0f8a0eeea9fb72937ba118f9db0cb7e90773462af7962d382445f3005e5a4"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3cb37038123447cf0f3ea4c74751f6a9d7afef0eb71aa07bf5f652b5e6a132c"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84286494f6c5d05243456e04223d5a9417d7f443c3b76065e75001beb26f88de"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acc07b2cfc5b835444b44a9956846b578d27beeacd4b52e45489e93276241025"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4fefee876e07a6e9aad7a8c8c9f85b0cdbe7df52b8a9552307b09050f7512c7e"}, + {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:258c57abf1188926c774a4c94dd29237e77eda19462e5bb901d88adcab6af919"}, + {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:35c14ac45fcfdf7167ca76cc80b2001205a8d5d16d80524e13508371fb8cdd9c"}, + {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d1b26e1dff225c31897696cab7d4f0a315d4c0d9e8666dbffdb28216f3b17fdc"}, + {file = "pydantic_core-2.27.1-cp311-none-win32.whl", hash = "sha256:2cdf7d86886bc6982354862204ae3b2f7f96f21a3eb0ba5ca0ac42c7b38598b9"}, + {file = "pydantic_core-2.27.1-cp311-none-win_amd64.whl", hash = "sha256:3af385b0cee8df3746c3f406f38bcbfdc9041b5c2d5ce3e5fc6637256e60bbc5"}, + {file = "pydantic_core-2.27.1-cp311-none-win_arm64.whl", hash = "sha256:81f2ec23ddc1b476ff96563f2e8d723830b06dceae348ce02914a37cb4e74b89"}, + {file = "pydantic_core-2.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9cbd94fc661d2bab2bc702cddd2d3370bbdcc4cd0f8f57488a81bcce90c7a54f"}, + {file = "pydantic_core-2.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f8c4718cd44ec1580e180cb739713ecda2bdee1341084c1467802a417fe0f02"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15aae984e46de8d376df515f00450d1522077254ef6b7ce189b38ecee7c9677c"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ba5e3963344ff25fc8c40da90f44b0afca8cfd89d12964feb79ac1411a260ac"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:992cea5f4f3b29d6b4f7f1726ed8ee46c8331c6b4eed6db5b40134c6fe1768bb"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0325336f348dbee6550d129b1627cb8f5351a9dc91aad141ffb96d4937bd9529"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7597c07fbd11515f654d6ece3d0e4e5093edc30a436c63142d9a4b8e22f19c35"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3bbd5d8cc692616d5ef6fbbbd50dbec142c7e6ad9beb66b78a96e9c16729b089"}, + {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:dc61505e73298a84a2f317255fcc72b710b72980f3a1f670447a21efc88f8381"}, + {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:e1f735dc43da318cad19b4173dd1ffce1d84aafd6c9b782b3abc04a0d5a6f5bb"}, + {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f4e5658dbffe8843a0f12366a4c2d1c316dbe09bb4dfbdc9d2d9cd6031de8aae"}, + {file = "pydantic_core-2.27.1-cp312-none-win32.whl", hash = "sha256:672ebbe820bb37988c4d136eca2652ee114992d5d41c7e4858cdd90ea94ffe5c"}, + {file = "pydantic_core-2.27.1-cp312-none-win_amd64.whl", hash = "sha256:66ff044fd0bb1768688aecbe28b6190f6e799349221fb0de0e6f4048eca14c16"}, + {file = "pydantic_core-2.27.1-cp312-none-win_arm64.whl", hash = "sha256:9a3b0793b1bbfd4146304e23d90045f2a9b5fd5823aa682665fbdaf2a6c28f3e"}, + {file = "pydantic_core-2.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f216dbce0e60e4d03e0c4353c7023b202d95cbaeff12e5fd2e82ea0a66905073"}, + {file = "pydantic_core-2.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a2e02889071850bbfd36b56fd6bc98945e23670773bc7a76657e90e6b6603c08"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42b0e23f119b2b456d07ca91b307ae167cc3f6c846a7b169fca5326e32fdc6cf"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:764be71193f87d460a03f1f7385a82e226639732214b402f9aa61f0d025f0737"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c00666a3bd2f84920a4e94434f5974d7bbc57e461318d6bb34ce9cdbbc1f6b2"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ccaa88b24eebc0f849ce0a4d09e8a408ec5a94afff395eb69baf868f5183107"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c65af9088ac534313e1963443d0ec360bb2b9cba6c2909478d22c2e363d98a51"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:206b5cf6f0c513baffaeae7bd817717140770c74528f3e4c3e1cec7871ddd61a"}, + {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:062f60e512fc7fff8b8a9d680ff0ddaaef0193dba9fa83e679c0c5f5fbd018bc"}, + {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:a0697803ed7d4af5e4c1adf1670af078f8fcab7a86350e969f454daf598c4960"}, + {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:58ca98a950171f3151c603aeea9303ef6c235f692fe555e883591103da709b23"}, + {file = "pydantic_core-2.27.1-cp313-none-win32.whl", hash = "sha256:8065914ff79f7eab1599bd80406681f0ad08f8e47c880f17b416c9f8f7a26d05"}, + {file = "pydantic_core-2.27.1-cp313-none-win_amd64.whl", hash = "sha256:ba630d5e3db74c79300d9a5bdaaf6200172b107f263c98a0539eeecb857b2337"}, + {file = "pydantic_core-2.27.1-cp313-none-win_arm64.whl", hash = "sha256:45cf8588c066860b623cd11c4ba687f8d7175d5f7ef65f7129df8a394c502de5"}, + {file = "pydantic_core-2.27.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:5897bec80a09b4084aee23f9b73a9477a46c3304ad1d2d07acca19723fb1de62"}, + {file = "pydantic_core-2.27.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d0165ab2914379bd56908c02294ed8405c252250668ebcb438a55494c69f44ab"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b9af86e1d8e4cfc82c2022bfaa6f459381a50b94a29e95dcdda8442d6d83864"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f6c8a66741c5f5447e047ab0ba7a1c61d1e95580d64bce852e3df1f895c4067"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a42d6a8156ff78981f8aa56eb6394114e0dedb217cf8b729f438f643608cbcd"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64c65f40b4cd8b0e049a8edde07e38b476da7e3aaebe63287c899d2cff253fa5"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdcf339322a3fae5cbd504edcefddd5a50d9ee00d968696846f089b4432cf78"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bf99c8404f008750c846cb4ac4667b798a9f7de673ff719d705d9b2d6de49c5f"}, + {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8f1edcea27918d748c7e5e4d917297b2a0ab80cad10f86631e488b7cddf76a36"}, + {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:159cac0a3d096f79ab6a44d77a961917219707e2a130739c64d4dd46281f5c2a"}, + {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:029d9757eb621cc6e1848fa0b0310310de7301057f623985698ed7ebb014391b"}, + {file = "pydantic_core-2.27.1-cp38-none-win32.whl", hash = "sha256:a28af0695a45f7060e6f9b7092558a928a28553366519f64083c63a44f70e618"}, + {file = "pydantic_core-2.27.1-cp38-none-win_amd64.whl", hash = "sha256:2d4567c850905d5eaaed2f7a404e61012a51caf288292e016360aa2b96ff38d4"}, + {file = "pydantic_core-2.27.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:e9386266798d64eeb19dd3677051f5705bf873e98e15897ddb7d76f477131967"}, + {file = "pydantic_core-2.27.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4228b5b646caa73f119b1ae756216b59cc6e2267201c27d3912b592c5e323b60"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3dfe500de26c52abe0477dde16192ac39c98f05bf2d80e76102d394bd13854"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aee66be87825cdf72ac64cb03ad4c15ffef4143dbf5c113f64a5ff4f81477bf9"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b748c44bb9f53031c8cbc99a8a061bc181c1000c60a30f55393b6e9c45cc5bd"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ca038c7f6a0afd0b2448941b6ef9d5e1949e999f9e5517692eb6da58e9d44be"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e0bd57539da59a3e4671b90a502da9a28c72322a4f17866ba3ac63a82c4498e"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ac6c2c45c847bbf8f91930d88716a0fb924b51e0c6dad329b793d670ec5db792"}, + {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b94d4ba43739bbe8b0ce4262bcc3b7b9f31459ad120fb595627eaeb7f9b9ca01"}, + {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:00e6424f4b26fe82d44577b4c842d7df97c20be6439e8e685d0d715feceb9fb9"}, + {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:38de0a70160dd97540335b7ad3a74571b24f1dc3ed33f815f0880682e6880131"}, + {file = "pydantic_core-2.27.1-cp39-none-win32.whl", hash = "sha256:7ccebf51efc61634f6c2344da73e366c75e735960b5654b63d7e6f69a5885fa3"}, + {file = "pydantic_core-2.27.1-cp39-none-win_amd64.whl", hash = "sha256:a57847b090d7892f123726202b7daa20df6694cbd583b67a592e856bff603d6c"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3fa80ac2bd5856580e242dbc202db873c60a01b20309c8319b5c5986fbe53ce6"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d950caa237bb1954f1b8c9227b5065ba6875ac9771bb8ec790d956a699b78676"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e4216e64d203e39c62df627aa882f02a2438d18a5f21d7f721621f7a5d3611d"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02a3d637bd387c41d46b002f0e49c52642281edacd2740e5a42f7017feea3f2c"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:161c27ccce13b6b0c8689418da3885d3220ed2eae2ea5e9b2f7f3d48f1d52c27"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:19910754e4cc9c63bc1c7f6d73aa1cfee82f42007e407c0f413695c2f7ed777f"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:e173486019cc283dc9778315fa29a363579372fe67045e971e89b6365cc035ed"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:af52d26579b308921b73b956153066481f064875140ccd1dfd4e77db89dbb12f"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:981fb88516bd1ae8b0cbbd2034678a39dedc98752f264ac9bc5839d3923fa04c"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5fde892e6c697ce3e30c61b239330fc5d569a71fefd4eb6512fc6caec9dd9e2f"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:816f5aa087094099fff7edabb5e01cc370eb21aa1a1d44fe2d2aefdfb5599b31"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c10c309e18e443ddb108f0ef64e8729363adbfd92d6d57beec680f6261556f3"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98476c98b02c8e9b2eec76ac4156fd006628b1b2d0ef27e548ffa978393fd154"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c3027001c28434e7ca5a6e1e527487051136aa81803ac812be51802150d880dd"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:7699b1df36a48169cdebda7ab5a2bac265204003f153b4bd17276153d997670a"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1c39b07d90be6b48968ddc8c19e7585052088fd7ec8d568bb31ff64c70ae3c97"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:46ccfe3032b3915586e469d4972973f893c0a2bb65669194a5bdea9bacc088c2"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:62ba45e21cf6571d7f716d903b5b7b6d2617e2d5d67c0923dc47b9d41369f840"}, + {file = "pydantic_core-2.27.1.tar.gz", hash = "sha256:62a763352879b84aa31058fc931884055fd75089cccbd9d58bb6afd01141b235"}, ] [package.dependencies] @@ -1392,20 +1443,6 @@ files = [ {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"}, ] -[[package]] -name = "pygments" -version = "2.18.0" -description = "Pygments is a syntax highlighting package written in Python." -optional = false -python-versions = ">=3.8" -files = [ - {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, - {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, -] - -[package.extras] -windows-terminal = ["colorama (>=0.4.6)"] - [[package]] name = "pytest" version = "7.2.2" @@ -1429,17 +1466,17 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2. [[package]] name = "pytest-cov" -version = "5.0.0" +version = "6.0.0" description = "Pytest plugin for measuring coverage." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, - {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, + {file = "pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0"}, + {file = "pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35"}, ] [package.dependencies] -coverage = {version = ">=5.2.1", extras = ["toml"]} +coverage = {version = ">=7.5", extras = ["toml"]} pytest = ">=4.6" [package.extras] @@ -1464,13 +1501,13 @@ dev = ["pre-commit", "pytest-asyncio", "tox"] [[package]] name = "pytest-mock-resources" -version = "2.12.0" +version = "2.12.1" description = "A pytest plugin for easily instantiating reproducible mock resources." optional = false python-versions = "<4,>=3.7" files = [ - {file = "pytest_mock_resources-2.12.0-py3-none-any.whl", hash = "sha256:3614ed28b1e6855e62bc2c3148cb6b9f6a5bd245e50d0638a91ae2faf079f028"}, - {file = "pytest_mock_resources-2.12.0.tar.gz", hash = "sha256:09ffa3d8b2146598f09ba8422a955a80b4dd3b19c8d7e918b14e7e15a2c71f1f"}, + {file = "pytest_mock_resources-2.12.1-py3-none-any.whl", hash = "sha256:788d9b72d9155d3cd49c281da26527e23ca3511136b1594bbc7ee95ef19be236"}, + {file = "pytest_mock_resources-2.12.1.tar.gz", hash = "sha256:f95c231e5dd957b5f48caf60141a43f57bbe7182d6e4d09a806a78e8d060f9b3"}, ] [package.dependencies] @@ -1505,102 +1542,109 @@ six = ">=1.5" [[package]] name = "python-on-whales" -version = "0.71.0" +version = "0.74.0" description = "A Docker client for Python, designed to be fun and intuitive!" optional = false python-versions = "<4,>=3.8" files = [ - {file = "python_on_whales-0.71.0-py3-none-any.whl", hash = "sha256:9d23c025e2e887f8336fbdd324ce764e72e60f7db2d0599601e8f6ddac1cae2d"}, - {file = "python_on_whales-0.71.0.tar.gz", hash = "sha256:0967be1b716f4a40e44a4b3bf091f721b494205425c1215f64a1a612eb932900"}, + {file = "python_on_whales-0.74.0-py3-none-any.whl", hash = "sha256:94d1d2f633bcf4bbc81d29ea76a0eadba1b88bb4d1bb4cfeffde2312e08135ca"}, + {file = "python_on_whales-0.74.0.tar.gz", hash = "sha256:edc21d4c28a952d779433e417f85719928aff53cef9c8a77e6fdc7eae0cf05fa"}, ] [package.dependencies] -pydantic = ">=1.9,<2.0.dev0 || >=2.1.dev0,<3" -requests = "*" -tqdm = "*" -typer = ">=0.4.1" +pydantic = ">=2.1.dev0,<3" typing-extensions = "*" -[package.extras] -test = ["pytest"] - [[package]] name = "pytz" -version = "2024.1" +version = "2024.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, - {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, + {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, + {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, ] [[package]] name = "pyyaml" -version = "6.0.1" +version = "6.0.2" description = "YAML parser and emitter for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] name = "redis" -version = "5.0.7" +version = "5.2.0" description = "Python client for Redis database and key-value store" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "redis-5.0.7-py3-none-any.whl", hash = "sha256:0e479e24da960c690be5d9b96d21f7b918a98c0cf49af3b6fafaa0753f93a0db"}, - {file = "redis-5.0.7.tar.gz", hash = "sha256:8f611490b93c8109b50adc317b31bfd84fff31def3475b92e7e80bf39f48175b"}, + {file = "redis-5.2.0-py3-none-any.whl", hash = "sha256:ae174f2bb3b1bf2b09d54bf3e51fbc1469cf6c10aa03e21141f51969801a7897"}, + {file = "redis-5.2.0.tar.gz", hash = "sha256:0b1087665a771b1ff2e003aa5bdd354f15a70c9e25d5a7dbf9c722c16528a7b0"}, ] [package.dependencies] async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} [package.extras] -hiredis = ["hiredis (>=1.0.0)"] -ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] +hiredis = ["hiredis (>=3.0.0)"] +ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==23.2.1)", "requests (>=2.31.0)"] [[package]] name = "requests" @@ -1623,33 +1667,15 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] -[[package]] -name = "rich" -version = "13.7.1" -description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, - {file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"}, -] - -[package.dependencies] -markdown-it-py = ">=2.2.0" -pygments = ">=2.13.0,<3.0.0" - -[package.extras] -jupyter = ["ipywidgets (>=7.5.1,<9)"] - [[package]] name = "s3transfer" -version = "0.10.2" +version = "0.10.4" description = "An Amazon S3 Transfer Manager" optional = false python-versions = ">=3.8" files = [ - {file = "s3transfer-0.10.2-py3-none-any.whl", hash = "sha256:eca1c20de70a39daee580aef4986996620f365c4e0fda6a86100231d62f1bf69"}, - {file = "s3transfer-0.10.2.tar.gz", hash = "sha256:0711534e9356d3cc692fdde846b4a1e4b0cb6519971860796e6bc4c7aea00ef6"}, + {file = "s3transfer-0.10.4-py3-none-any.whl", hash = "sha256:244a76a24355363a68164241438de1b72f8781664920260c48465896b712a41e"}, + {file = "s3transfer-0.10.4.tar.gz", hash = "sha256:29edc09801743c21eb5ecbc617a152df41d3c287f67b615f73e5f750583666a7"}, ] [package.dependencies] @@ -1671,30 +1697,23 @@ files = [ [[package]] name = "setuptools" -version = "71.0.1" +version = "75.6.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "setuptools-71.0.1-py3-none-any.whl", hash = "sha256:1eb8ef012efae7f6acbc53ec0abde4bc6746c43087fd215ee09e1df48998711f"}, - {file = "setuptools-71.0.1.tar.gz", hash = "sha256:c51d7fd29843aa18dad362d4b4ecd917022131425438251f4e3d766c964dd1ad"}, + {file = "setuptools-75.6.0-py3-none-any.whl", hash = "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d"}, + {file = "setuptools-75.6.0.tar.gz", hash = "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6"}, ] [package.extras] -core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "ordered-set (>=3.1.1)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (<7.4)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (<0.4)", "pytest-ruff (>=0.2.1)", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] - -[[package]] -name = "shellingham" -version = "1.5.4" -description = "Tool to Detect Surrounding Shell" -optional = false -python-versions = ">=3.7" -files = [ - {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, - {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, -] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.7.0)"] +core = ["importlib_metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (>=1.12,<1.14)", "pytest-mypy"] [[package]] name = "six" @@ -1709,60 +1728,68 @@ files = [ [[package]] name = "sqlalchemy" -version = "2.0.31" +version = "2.0.36" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.31-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f2a213c1b699d3f5768a7272de720387ae0122f1becf0901ed6eaa1abd1baf6c"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9fea3d0884e82d1e33226935dac990b967bef21315cbcc894605db3441347443"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3ad7f221d8a69d32d197e5968d798217a4feebe30144986af71ada8c548e9fa"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2bee229715b6366f86a95d497c347c22ddffa2c7c96143b59a2aa5cc9eebbc"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cd5b94d4819c0c89280b7c6109c7b788a576084bf0a480ae17c227b0bc41e109"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:750900a471d39a7eeba57580b11983030517a1f512c2cb287d5ad0fcf3aebd58"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-win32.whl", hash = "sha256:7bd112be780928c7f493c1a192cd8c5fc2a2a7b52b790bc5a84203fb4381c6be"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-win_amd64.whl", hash = "sha256:5a48ac4d359f058474fadc2115f78a5cdac9988d4f99eae44917f36aa1476327"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f68470edd70c3ac3b6cd5c2a22a8daf18415203ca1b036aaeb9b0fb6f54e8298"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e2c38c2a4c5c634fe6c3c58a789712719fa1bf9b9d6ff5ebfce9a9e5b89c1ca"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd15026f77420eb2b324dcb93551ad9c5f22fab2c150c286ef1dc1160f110203"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2196208432deebdfe3b22185d46b08f00ac9d7b01284e168c212919891289396"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:352b2770097f41bff6029b280c0e03b217c2dcaddc40726f8f53ed58d8a85da4"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:56d51ae825d20d604583f82c9527d285e9e6d14f9a5516463d9705dab20c3740"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-win32.whl", hash = "sha256:6e2622844551945db81c26a02f27d94145b561f9d4b0c39ce7bfd2fda5776dac"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-win_amd64.whl", hash = "sha256:ccaf1b0c90435b6e430f5dd30a5aede4764942a695552eb3a4ab74ed63c5b8d3"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3b74570d99126992d4b0f91fb87c586a574a5872651185de8297c6f90055ae42"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f77c4f042ad493cb8595e2f503c7a4fe44cd7bd59c7582fd6d78d7e7b8ec52c"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd1591329333daf94467e699e11015d9c944f44c94d2091f4ac493ced0119449"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74afabeeff415e35525bf7a4ecdab015f00e06456166a2eba7590e49f8db940e"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b9c01990d9015df2c6f818aa8f4297d42ee71c9502026bb074e713d496e26b67"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:66f63278db425838b3c2b1c596654b31939427016ba030e951b292e32b99553e"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-win32.whl", hash = "sha256:0b0f658414ee4e4b8cbcd4a9bb0fd743c5eeb81fc858ca517217a8013d282c96"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-win_amd64.whl", hash = "sha256:fa4b1af3e619b5b0b435e333f3967612db06351217c58bfb50cee5f003db2a5a"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f43e93057cf52a227eda401251c72b6fbe4756f35fa6bfebb5d73b86881e59b0"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d337bf94052856d1b330d5fcad44582a30c532a2463776e1651bd3294ee7e58b"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c06fb43a51ccdff3b4006aafee9fcf15f63f23c580675f7734245ceb6b6a9e05"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:b6e22630e89f0e8c12332b2b4c282cb01cf4da0d26795b7eae16702a608e7ca1"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:79a40771363c5e9f3a77f0e28b3302801db08040928146e6808b5b7a40749c88"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-win32.whl", hash = "sha256:501ff052229cb79dd4c49c402f6cb03b5a40ae4771efc8bb2bfac9f6c3d3508f"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-win_amd64.whl", hash = "sha256:597fec37c382a5442ffd471f66ce12d07d91b281fd474289356b1a0041bdf31d"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dc6d69f8829712a4fd799d2ac8d79bdeff651c2301b081fd5d3fe697bd5b4ab9"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:23b9fbb2f5dd9e630db70fbe47d963c7779e9c81830869bd7d137c2dc1ad05fb"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a21c97efcbb9f255d5c12a96ae14da873233597dfd00a3a0c4ce5b3e5e79704"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26a6a9837589c42b16693cf7bf836f5d42218f44d198f9343dd71d3164ceeeac"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc251477eae03c20fae8db9c1c23ea2ebc47331bcd73927cdcaecd02af98d3c3"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2fd17e3bb8058359fa61248c52c7b09a97cf3c820e54207a50af529876451808"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-win32.whl", hash = "sha256:c76c81c52e1e08f12f4b6a07af2b96b9b15ea67ccdd40ae17019f1c373faa227"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-win_amd64.whl", hash = "sha256:4b600e9a212ed59355813becbcf282cfda5c93678e15c25a0ef896b354423238"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b6cf796d9fcc9b37011d3f9936189b3c8074a02a4ed0c0fbbc126772c31a6d4"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78fe11dbe37d92667c2c6e74379f75746dc947ee505555a0197cfba9a6d4f1a4"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc47dc6185a83c8100b37acda27658fe4dbd33b7d5e7324111f6521008ab4fe"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a41514c1a779e2aa9a19f67aaadeb5cbddf0b2b508843fcd7bafdf4c6864005"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:afb6dde6c11ea4525318e279cd93c8734b795ac8bb5dda0eedd9ebaca7fa23f1"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3f9faef422cfbb8fd53716cd14ba95e2ef655400235c3dfad1b5f467ba179c8c"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-win32.whl", hash = "sha256:fc6b14e8602f59c6ba893980bea96571dd0ed83d8ebb9c4479d9ed5425d562e9"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-win_amd64.whl", hash = "sha256:3cb8a66b167b033ec72c3812ffc8441d4e9f5f78f5e31e54dcd4c90a4ca5bebc"}, - {file = "SQLAlchemy-2.0.31-py3-none-any.whl", hash = "sha256:69f3e3c08867a8e4856e92d7afb618b95cdee18e0bc1647b77599722c9a28911"}, - {file = "SQLAlchemy-2.0.31.tar.gz", hash = "sha256:b607489dd4a54de56984a0c7656247504bd5523d9d0ba799aef59d4add009484"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:59b8f3adb3971929a3e660337f5dacc5942c2cdb760afcabb2614ffbda9f9f72"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37350015056a553e442ff672c2d20e6f4b6d0b2495691fa239d8aa18bb3bc908"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8318f4776c85abc3f40ab185e388bee7a6ea99e7fa3a30686580b209eaa35c08"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c245b1fbade9c35e5bd3b64270ab49ce990369018289ecfde3f9c318411aaa07"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:69f93723edbca7342624d09f6704e7126b152eaed3cdbb634cb657a54332a3c5"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f9511d8dd4a6e9271d07d150fb2f81874a3c8c95e11ff9af3a2dfc35fe42ee44"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-win32.whl", hash = "sha256:c3f3631693003d8e585d4200730616b78fafd5a01ef8b698f6967da5c605b3fa"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-win_amd64.whl", hash = "sha256:a86bfab2ef46d63300c0f06936bd6e6c0105faa11d509083ba8f2f9d237fb5b5"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fd3a55deef00f689ce931d4d1b23fa9f04c880a48ee97af488fd215cf24e2a6c"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4f5e9cd989b45b73bd359f693b935364f7e1f79486e29015813c338450aa5a71"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ddd9db6e59c44875211bc4c7953a9f6638b937b0a88ae6d09eb46cced54eff"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2519f3a5d0517fc159afab1015e54bb81b4406c278749779be57a569d8d1bb0d"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59b1ee96617135f6e1d6f275bbe988f419c5178016f3d41d3c0abb0c819f75bb"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:39769a115f730d683b0eb7b694db9789267bcd027326cccc3125e862eb03bfd8"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-win32.whl", hash = "sha256:66bffbad8d6271bb1cc2f9a4ea4f86f80fe5e2e3e501a5ae2a3dc6a76e604e6f"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-win_amd64.whl", hash = "sha256:23623166bfefe1487d81b698c423f8678e80df8b54614c2bf4b4cfcd7c711959"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7b64e6ec3f02c35647be6b4851008b26cff592a95ecb13b6788a54ef80bbdd4"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:46331b00096a6db1fdc052d55b101dbbfc99155a548e20a0e4a8e5e4d1362855"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdf3386a801ea5aba17c6410dd1dc8d39cf454ca2565541b5ac42a84e1e28f53"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac9dfa18ff2a67b09b372d5db8743c27966abf0e5344c555d86cc7199f7ad83a"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:90812a8933df713fdf748b355527e3af257a11e415b613dd794512461eb8a686"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1bc330d9d29c7f06f003ab10e1eaced295e87940405afe1b110f2eb93a233588"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-win32.whl", hash = "sha256:79d2e78abc26d871875b419e1fd3c0bca31a1cb0043277d0d850014599626c2e"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-win_amd64.whl", hash = "sha256:b544ad1935a8541d177cb402948b94e871067656b3a0b9e91dbec136b06a2ff5"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b5cc79df7f4bc3d11e4b542596c03826063092611e481fcf1c9dfee3c94355ef"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3c01117dd36800f2ecaa238c65365b7b16497adc1522bf84906e5710ee9ba0e8"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bc633f4ee4b4c46e7adcb3a9b5ec083bf1d9a97c1d3854b92749d935de40b9b"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e46ed38affdfc95d2c958de328d037d87801cfcbea6d421000859e9789e61c2"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b2985c0b06e989c043f1dc09d4fe89e1616aadd35392aea2844f0458a989eacf"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a121d62ebe7d26fec9155f83f8be5189ef1405f5973ea4874a26fab9f1e262c"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-win32.whl", hash = "sha256:0572f4bd6f94752167adfd7c1bed84f4b240ee6203a95e05d1e208d488d0d436"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-win_amd64.whl", hash = "sha256:8c78ac40bde930c60e0f78b3cd184c580f89456dd87fc08f9e3ee3ce8765ce88"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:be9812b766cad94a25bc63bec11f88c4ad3629a0cec1cd5d4ba48dc23860486b"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50aae840ebbd6cdd41af1c14590e5741665e5272d2fee999306673a1bb1fdb4d"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4557e1f11c5f653ebfdd924f3f9d5ebfc718283b0b9beebaa5dd6b77ec290971"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:07b441f7d03b9a66299ce7ccf3ef2900abc81c0db434f42a5694a37bd73870f2"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:28120ef39c92c2dd60f2721af9328479516844c6b550b077ca450c7d7dc68575"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-win32.whl", hash = "sha256:b81ee3d84803fd42d0b154cb6892ae57ea6b7c55d8359a02379965706c7efe6c"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-win_amd64.whl", hash = "sha256:f942a799516184c855e1a32fbc7b29d7e571b52612647866d4ec1c3242578fcb"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3d6718667da04294d7df1670d70eeddd414f313738d20a6f1d1f379e3139a545"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:72c28b84b174ce8af8504ca28ae9347d317f9dba3999e5981a3cd441f3712e24"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b11d0cfdd2b095e7b0686cf5fabeb9c67fae5b06d265d8180715b8cfa86522e3"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e32092c47011d113dc01ab3e1d3ce9f006a47223b18422c5c0d150af13a00687"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6a440293d802d3011028e14e4226da1434b373cbaf4a4bbb63f845761a708346"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c54a1e53a0c308a8e8a7dffb59097bff7facda27c70c286f005327f21b2bd6b1"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-win32.whl", hash = "sha256:1e0d612a17581b6616ff03c8e3d5eff7452f34655c901f75d62bd86449d9750e"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-win_amd64.whl", hash = "sha256:8958b10490125124463095bbdadda5aa22ec799f91958e410438ad6c97a7b793"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc022184d3e5cacc9579e41805a681187650e170eb2fd70e28b86192a479dcaa"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b817d41d692bf286abc181f8af476c4fbef3fd05e798777492618378448ee689"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4e46a888b54be23d03a89be510f24a7652fe6ff660787b96cd0e57a4ebcb46d"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4ae3005ed83f5967f961fd091f2f8c5329161f69ce8480aa8168b2d7fe37f06"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:03e08af7a5f9386a43919eda9de33ffda16b44eb11f3b313e6822243770e9763"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3dbb986bad3ed5ceaf090200eba750b5245150bd97d3e67343a3cfed06feecf7"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-win32.whl", hash = "sha256:9fe53b404f24789b5ea9003fc25b9a3988feddebd7e7b369c8fac27ad6f52f28"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-win_amd64.whl", hash = "sha256:af148a33ff0349f53512a049c6406923e4e02bf2f26c5fb285f143faf4f0e46a"}, + {file = "SQLAlchemy-2.0.36-py3-none-any.whl", hash = "sha256:fddbe92b4760c6f5d48162aef14824add991aeda8ddadb3c31d56eb15ca69f8e"}, + {file = "sqlalchemy-2.0.36.tar.gz", hash = "sha256:7f2767680b6d2398aea7082e45a774b2b0767b5c8d8ffb9c8b683088ea9b29c5"}, ] [package.dependencies] @@ -1775,7 +1802,7 @@ aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] -mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10)"] mssql = ["pyodbc"] mssql-pymssql = ["pymssql"] mssql-pyodbc = ["pyodbc"] @@ -1822,43 +1849,6 @@ test-all = ["Babel (>=1.3)", "Jinja2 (>=2.3)", "Pygments (>=1.2)", "arrow (>=0.3 timezone = ["python-dateutil"] url = ["furl (>=0.4.1)"] -[[package]] -name = "tqdm" -version = "4.66.4" -description = "Fast, Extensible Progress Meter" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, - {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[package.extras] -dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] -notebook = ["ipywidgets (>=6)"] -slack = ["slack-sdk"] -telegram = ["requests"] - -[[package]] -name = "typer" -version = "0.12.3" -description = "Typer, build great CLIs. Easy to code. Based on Python type hints." -optional = false -python-versions = ">=3.7" -files = [ - {file = "typer-0.12.3-py3-none-any.whl", hash = "sha256:070d7ca53f785acbccba8e7d28b08dcd88f79f1fbda035ade0aecec71ca5c914"}, - {file = "typer-0.12.3.tar.gz", hash = "sha256:49e73131481d804288ef62598d97a1ceef3058905aa536a1134f90891ba35482"}, -] - -[package.dependencies] -click = ">=8.0.0" -rich = ">=10.11.0" -shellingham = ">=1.3.0" -typing-extensions = ">=3.7.4.3" - [[package]] name = "typing-extensions" version = "4.12.2" @@ -1872,13 +1862,13 @@ files = [ [[package]] name = "tzdata" -version = "2024.1" +version = "2024.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, - {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, + {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, + {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, ] [[package]] @@ -1900,33 +1890,34 @@ devenv = ["check-manifest", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3) [[package]] name = "unleashclient" -version = "5.12.1" +version = "6.0.1" description = "Python client for the Unleash feature toggle system!" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "UnleashClient-5.12.1-py3-none-any.whl", hash = "sha256:858bad6abd94e4c5d197c09114e336069953d64c2c3ed510af136e7f8f2bd6da"}, - {file = "unleashclient-5.12.1.tar.gz", hash = "sha256:45987efa420bf5ea6aa25eaef25fceae83072bd6388cd048734b69b4523d41f8"}, + {file = "UnleashClient-6.0.1-py3-none-any.whl", hash = "sha256:b0fe04394d4b56295a5a8decaa1a4e5372c4425639e744b3f40b370f26055152"}, + {file = "unleashclient-6.0.1.tar.gz", hash = "sha256:277f24767ff588013ddfdc649f1e4b78f6eb5c98a2a8c081f6dcd61f2cd2e1f9"}, ] [package.dependencies] apscheduler = "<4.0.0" fcache = "*" -importlib-metadata = "*" +importlib_metadata = "*" mmh3 = "*" python-dateutil = "*" requests = "*" semver = "<4.0.0" +yggdrasil-engine = "*" [[package]] name = "urllib3" -version = "2.2.2" +version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, - {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] @@ -1937,13 +1928,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "watchtower" -version = "3.2.0" +version = "3.3.1" description = "Python CloudWatch Logging" optional = false python-versions = ">=3.8" files = [ - {file = "watchtower-3.2.0-py3-none-any.whl", hash = "sha256:3c41396e022dd48af2261737d3e78edaaa2d1c60ad59704fc7e2524ddfe50bfb"}, - {file = "watchtower-3.2.0.tar.gz", hash = "sha256:7d515b2d0ae0d36168d3b32937e7f79c19b3efd25bbd16bcda233a092666b98c"}, + {file = "watchtower-3.3.1-py3-none-any.whl", hash = "sha256:72d4f3f2ec906302e0478c042a2076611eb22f5a491ceda6411fec531aa2ee85"}, + {file = "watchtower-3.3.1.tar.gz", hash = "sha256:5e654f52b54b39e279592d6c18a033b22cfbffda676f5b3cf6dfef712ed5738c"}, ] [package.dependencies] @@ -1954,13 +1945,13 @@ tests = ["build", "coverage", "mypy", "pyyaml", "ruff", "wheel"] [[package]] name = "werkzeug" -version = "3.0.3" +version = "3.1.3" description = "The comprehensive WSGI web application library." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "werkzeug-3.0.3-py3-none-any.whl", hash = "sha256:fc9645dc43e03e4d630d23143a04a7f947a9a3b5727cd535fdfe155a17cc48c8"}, - {file = "werkzeug-3.0.3.tar.gz", hash = "sha256:097e5bfda9f0aba8da6b8545146def481d06aa7d3266e7448e2cccf67dd8bd18"}, + {file = "werkzeug-3.1.3-py3-none-any.whl", hash = "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e"}, + {file = "werkzeug-3.1.3.tar.gz", hash = "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746"}, ] [package.dependencies] @@ -1969,20 +1960,81 @@ MarkupSafe = ">=2.1.1" [package.extras] watchdog = ["watchdog (>=2.3)"] +[[package]] +name = "yggdrasil-engine" +version = "0.1.4" +description = "Engine for evaluating Unleash feature flags" +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "yggdrasil_engine-0.1.4-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:47891b2ddf80f289504f794dc7e4d275f2c28f32e24ada1f460358cc22be2539"}, + {file = "yggdrasil_engine-0.1.4-cp310-abi3-macosx_11_0_x86_64.whl", hash = "sha256:b8ee2e5976e6941a46a012a8eae48e6726369e024832deab9105007f588122fa"}, + {file = "yggdrasil_engine-0.1.4-cp310-abi3-manylinux2014_aarch64.whl", hash = "sha256:70579e273b894162a030e539df6ce517ac7efe399b7002c8bc37780c2e36a6a7"}, + {file = "yggdrasil_engine-0.1.4-cp310-abi3-manylinux2014_x86_64.whl", hash = "sha256:14e1ead52784c7ae69879f6aeda50dcdab1f5c8559313b6fb17cb867da2bd826"}, + {file = "yggdrasil_engine-0.1.4-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:621fe65c2909f2df987816dc3e3d13f035b283c6c918ccc14e514c7aba8b732e"}, + {file = "yggdrasil_engine-0.1.4-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:310768a4d81c4d7038fe8955ce930c8077489f6beac92a1199bc642931024370"}, + {file = "yggdrasil_engine-0.1.4-cp310-abi3-win_amd64.whl", hash = "sha256:dce8f6b799fea918e25f5486d69297a5e5b0dee744a854332ee9b0bda850327e"}, + {file = "yggdrasil_engine-0.1.4-cp310-abi3-win_arm64.whl", hash = "sha256:1f9a6122381e6d993ad355b6731cd7985bb91755b07b51abdc8cd02b04aab5b1"}, + {file = "yggdrasil_engine-0.1.4-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:c76fd0e52e61bbf14d16767814ee249b8cf88102e663eb646d6a805b0177f7d3"}, + {file = "yggdrasil_engine-0.1.4-cp311-abi3-macosx_11_0_x86_64.whl", hash = "sha256:ac7595f5101504242f2d8684304ed2404e4d051c65d540538c38da269cd43c92"}, + {file = "yggdrasil_engine-0.1.4-cp311-abi3-manylinux2014_aarch64.whl", hash = "sha256:ef971cec53a09d6ff167fd0930b32142ff4f4c0ca56b814c62de34764bffe5cd"}, + {file = "yggdrasil_engine-0.1.4-cp311-abi3-manylinux2014_x86_64.whl", hash = "sha256:7610955c0e05fbb92be5c7283adc926a539b0b9a108b10e162d7bbc84e0f9ccb"}, + {file = "yggdrasil_engine-0.1.4-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:90918dc0a58861fabd63f3ca704234259b15ed1a86cb827f47f6e181cbc9fa77"}, + {file = "yggdrasil_engine-0.1.4-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:73dcb91e2d42fe6d6a2a8ffe78bf997a815be5f481a2aca028f5dca7c9fd00df"}, + {file = "yggdrasil_engine-0.1.4-cp311-abi3-win_amd64.whl", hash = "sha256:1d60dd784715dd41c6438d62e135dc930f88ddba8dbcac980a10f996797b4a49"}, + {file = "yggdrasil_engine-0.1.4-cp311-abi3-win_arm64.whl", hash = "sha256:0bda99f164b2442724c87e164f877b67e7f8145c1e041b6c0d72195e140a9266"}, + {file = "yggdrasil_engine-0.1.4-cp312-abi3-macosx_11_0_arm64.whl", hash = "sha256:a0da2e6b05f23c4cf2301f533cdc9c0ce8eec5df83a42634cf46fccb4a2edef6"}, + {file = "yggdrasil_engine-0.1.4-cp312-abi3-macosx_11_0_x86_64.whl", hash = "sha256:c8e423e6dfe1027cb4b6a3a39a0c3351532fd9b16731a12d30f0d1fcd01072d6"}, + {file = "yggdrasil_engine-0.1.4-cp312-abi3-manylinux2014_aarch64.whl", hash = "sha256:66971229d6f34a1949189a5fa4903b20c2380393d1c09a5facf04a51a1705a29"}, + {file = "yggdrasil_engine-0.1.4-cp312-abi3-manylinux2014_x86_64.whl", hash = "sha256:20c65ea8237638894b301aba1d7de417f2e60bf08a01622df5ac92016d22072f"}, + {file = "yggdrasil_engine-0.1.4-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e9603b8cc3bd5e321c5491b0c2dedef6df58e0bdbc56228793ced471f4d5b4a3"}, + {file = "yggdrasil_engine-0.1.4-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e9122f72c10ee909c48809568c02632801c502cb94ec45733507e8f3e6ce4be7"}, + {file = "yggdrasil_engine-0.1.4-cp312-abi3-win_amd64.whl", hash = "sha256:962e569c7dd1344265b327236455d08ca9949d28b7ff0ff94bb6cc74504bece0"}, + {file = "yggdrasil_engine-0.1.4-cp312-abi3-win_arm64.whl", hash = "sha256:e4848d90bfaefdcc8ea53ade813645fd73ab755f28bb71945386ea9c30aa77fe"}, + {file = "yggdrasil_engine-0.1.4-cp313-abi3-macosx_11_0_arm64.whl", hash = "sha256:29535afd342356484b70d554afa768b466b0e0e242bbb4452fe646dc797750bd"}, + {file = "yggdrasil_engine-0.1.4-cp313-abi3-macosx_11_0_x86_64.whl", hash = "sha256:446fa58b5133615f72ec852a75b399672b2c7dfb2890d81a922cf5cd3cfd024f"}, + {file = "yggdrasil_engine-0.1.4-cp313-abi3-manylinux2014_aarch64.whl", hash = "sha256:7d62aa259141fec428e2e0934c9d38e1013269615e15bdb69b5103d89208f89f"}, + {file = "yggdrasil_engine-0.1.4-cp313-abi3-manylinux2014_x86_64.whl", hash = "sha256:121fdfa61d3e4689ad90bb6c871cf357ec77120b10a6a41bc0bdc6920bf57724"}, + {file = "yggdrasil_engine-0.1.4-cp313-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:77272bc65bfa4c31586cf90ecdd4780e683b36881681b60ef346bb27cc2163c2"}, + {file = "yggdrasil_engine-0.1.4-cp313-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9a01d5c8661d9db21ed2052e6592df8c271507287bd5b6c727dd7fec0bc19294"}, + {file = "yggdrasil_engine-0.1.4-cp313-abi3-win_amd64.whl", hash = "sha256:2a812d15086a2e9138a1d576bdcab7d4b090d6d3ae6d34b49897ed5fb8027500"}, + {file = "yggdrasil_engine-0.1.4-cp313-abi3-win_arm64.whl", hash = "sha256:3039f14a717d4edbdda91b286be6067bfd13e30fcbf28b0efc729ae8c04b1f0e"}, + {file = "yggdrasil_engine-0.1.4-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:bf7a6ae9184571c771a9be8c970e65f9fa3ee480ce3af69beb70c0317ffd173b"}, + {file = "yggdrasil_engine-0.1.4-cp38-abi3-macosx_11_0_x86_64.whl", hash = "sha256:a53e8ff2128ef210e3989ae60269934755d1bda04bcf18f57266a46c8631ca7c"}, + {file = "yggdrasil_engine-0.1.4-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:5d52681c3f18e2ac5f6168dd8051867d5e97f8ae004deaa3da904f454c8f3a40"}, + {file = "yggdrasil_engine-0.1.4-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:952df78e031e2068b111484366cc76401cd07feca01401ffbe90d3ab1ef7edad"}, + {file = "yggdrasil_engine-0.1.4-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:4e15534eda3c55fd0c1d4e3d069e33e99617c6e3bd19b166d0a6ff7ef6a00990"}, + {file = "yggdrasil_engine-0.1.4-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:21231c12aa850f0a3fef0f15ece08fee978044640e5cf98c9262e0e8f2c4284a"}, + {file = "yggdrasil_engine-0.1.4-cp38-abi3-win_amd64.whl", hash = "sha256:086d8521343e5281e5d750df374029617ff4aead9475e9269507e6dc54635fdc"}, + {file = "yggdrasil_engine-0.1.4-cp38-abi3-win_arm64.whl", hash = "sha256:7d90ff5dad22e458ed3b16997d5b3c502531e7857f3fbc4f1c530ee582c98504"}, + {file = "yggdrasil_engine-0.1.4-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:e418d0c725e7889affa36115a8627195074e8fed59e3417eed97a31f9be3cd90"}, + {file = "yggdrasil_engine-0.1.4-cp39-abi3-macosx_11_0_x86_64.whl", hash = "sha256:39732c6ab0f7528efa3eec3924f81767e050434f65e7446852aa9db95fc3dbce"}, + {file = "yggdrasil_engine-0.1.4-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:bf3c55e93cebc0d1c45d9be652b85fc0c06c38ab7ee9864df6cf248734702c2d"}, + {file = "yggdrasil_engine-0.1.4-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:02d6fe91af4c1d5c1efeb288a4d23ac80223c335d03afa769e672495bee665ca"}, + {file = "yggdrasil_engine-0.1.4-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fa4d1694f236e8f9a1c829bb99630236ba1fbbcf0fafbdb94dcf1982363851e3"}, + {file = "yggdrasil_engine-0.1.4-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:508905e1309798a8fabb472bd857997c71100d61622b0b22c7e4133f1419a056"}, + {file = "yggdrasil_engine-0.1.4-cp39-abi3-win_amd64.whl", hash = "sha256:7c692cedb4630af4a4734d9c969506ebe32e5054e87ee72fa83286cbf430752b"}, + {file = "yggdrasil_engine-0.1.4-cp39-abi3-win_arm64.whl", hash = "sha256:ced1977d514104bb4ea061f9c7c3f90a5af79a21580e63dbbfcf73723565083d"}, +] + [[package]] name = "zipp" -version = "3.19.2" +version = "3.21.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, - {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, + {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, + {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, ] [package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +type = ["pytest-mypy"] [metadata] lock-version = "2.0" diff --git a/pr_check.sh b/pr_check.sh index 79385643..f7ae36b3 100755 --- a/pr_check.sh +++ b/pr_check.sh @@ -25,4 +25,4 @@ source $CICD_ROOT/build.sh source $CICD_ROOT/deploy_ephemeral_env.sh # Run iqe-ros somke tests with ClowdJobInvocation -source $CICD_ROOT/cji_smoke_test.sh +# source $CICD_ROOT/cji_smoke_test.sh # require revisit after the new backed is up diff --git a/ros/api/__init__.py b/ros/api/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/ros/api/common/add_group_filter.py b/ros/api/common/add_group_filter.py deleted file mode 100644 index c50d41d6..00000000 --- a/ros/api/common/add_group_filter.py +++ /dev/null @@ -1,46 +0,0 @@ -from sqlalchemy import or_ - -from ros.lib.models import System -from flask import request -from ros.lib.config import get_logger - -logger = get_logger(__name__) - - -def group_filtered_query(query): - if able_to_access_all_systems(): - return query - - total_groups_from_request = get_host_groups() - len_of_total_groups = len(total_groups_from_request) - no_none_groups = [grp for grp in total_groups_from_request if grp is not None] - len_of_no_none_groups = len(no_none_groups) - is_none_present = (len_of_total_groups - len_of_no_none_groups) > 0 - filters = [] - if len_of_total_groups: - if len_of_no_none_groups: - filters.append(System.groups[0]['id'].astext.in_(no_none_groups)) - if is_none_present: - filters.append(System.groups == '[]') - if len(filters) > 0: - query = query.filter(or_(*filters)) - return query - - -def get_host_groups(): - host_groups = [] - try: - host_groups = [gid for gid in request.host_groups] - except AttributeError as e: - logger.debug(f"Can't parse the host_groups, setting host_groups attr to default empty array([])!: {e}") - return host_groups - - -def able_to_access_all_systems(): - access_all_systems = False - try: - access_all_systems = request.able_to_access_all_systems - except AttributeError as e: - logger.debug("Can't parse the able_to_access_all_systems," - f"setting able_to_access_all_systems attr to default False value!: {e}") - return access_all_systems diff --git a/ros/api/common/instance_types_helper.py b/ros/api/common/instance_types_helper.py deleted file mode 100644 index 06b843bf..00000000 --- a/ros/api/common/instance_types_helper.py +++ /dev/null @@ -1,11 +0,0 @@ -from ros.lib.aws_instance_types import INSTANCE_TYPES - - -def instance_types_desc_dict(): - instance_and_descriptions = {} - for instance, info in INSTANCE_TYPES.items(): - processor = info['extra']['physicalProcessor'] - v_cpu = info['extra']['vcpu'] - memory = info['extra']['memory'] - instance_and_descriptions[instance] = f"{processor} instance with {v_cpu} vCPUs and {memory} RAM" - return instance_and_descriptions diff --git a/ros/api/common/pagination.py b/ros/api/common/pagination.py deleted file mode 100644 index 50c936eb..00000000 --- a/ros/api/common/pagination.py +++ /dev/null @@ -1,93 +0,0 @@ -"""Module to construct response for paginated list.""" -from urllib.parse import urlencode -from flask import request - -DEFAULT_RECORDS_PER_REP = 10 -DEFAULT_OFFSET = 0 - - -def _cast_to_int(integer_string): - """Cast a string to a integer.""" - ret = int(integer_string) - if ret < -1: - raise ValueError() - return ret - - -def limit_value(): - """Get limit value.""" - limit_param = request.args.get('limit') - if limit_param: - try: - return _cast_to_int(limit_param) - except ValueError: - pass - return DEFAULT_RECORDS_PER_REP - - -def offset_value(): - """Get offset value.""" - offset_param = request.args.get('offset') - if offset_param: - try: - return _cast_to_int(offset_param) - except ValueError: - pass - return DEFAULT_OFFSET - - -def _create_link(path, limit, offset, args_dict): - params = dict(args_dict) - params["limit"] = limit - params["offset"] = offset - return "{}?{}".format(path, urlencode(params)) - - -def _create_first_link(path, limit, _offset, _count, args_dict): - return _create_link(path, limit, 0, args_dict) - - -def _create_previous_link(path, limit, offset, _count, args_dict): - prev_offset = offset - limit - if offset == 0 or prev_offset < 0: - return None - return _create_link(path, limit, prev_offset, args_dict) - - -def _create_next_link(path, limit, offset, count, args_dict): - next_offset = limit + offset - if next_offset >= count: - return None - return _create_link(path, limit, next_offset, args_dict) - - -def _create_last_link(path, limit, _offset, count, args_dict): - final_offset = count - limit if (count - limit) >= 0 else 0 - return _create_link(path, limit, final_offset, args_dict) - - -def build_paginated_system_list_response( - limit, offset, json_list, count, args_dict={}): - output = { - "meta": { - "count": count, - "limit": limit, - "offset": offset, - }, - "links": { - "first": _create_first_link( - request.path, limit, offset, count, args_dict - ), - "last": _create_last_link( - request.path, limit, offset, count, args_dict - ), - "next": _create_next_link( - request.path, limit, offset, count, args_dict - ), - "previous": _create_previous_link( - request.path, limit, offset, count, args_dict - ), - }, - "data": json_list, - } - return output diff --git a/ros/api/common/utils.py b/ros/api/common/utils.py deleted file mode 100644 index 90617d7c..00000000 --- a/ros/api/common/utils.py +++ /dev/null @@ -1,114 +0,0 @@ -import json -import logging -from flask import request -from flask_restful import abort -from ros.lib.models import System, RatingChoicesEnum -from ros.lib.utils import ( - identity, - user_data_from_identity, - is_valid_uuid, - system_ids_by_org_id, - service_account_from_identity -) -from ros.extensions import db -from sqlalchemy import exc -from ros.api.common.add_group_filter import group_filtered_query -from sqlalchemy import asc, desc - -LOG = logging.getLogger(__name__) -prefix = "VALIDATE REQUEST" - - -def validate_rating_data(func): - """Validate POST rating request.""" - allowed_choices = [c.value for c in RatingChoicesEnum] - - def error_msg(error_code, value): - errors = { - 400: "is invalid value for rating.", - 422: "is invalid choice of input for rating." - } - return ( - f"'{value}' { errors.get(error_code, 'Invalid') }" - f" Possible values - { *allowed_choices, }" - ) - - def check_for_rating(data): - rating = None - try: - rating = int(data['rating']) - except ValueError: - abort(400, message=(error_msg(400, data['rating']))) - - if rating not in allowed_choices: - abort(422, message=(error_msg(422, data['rating']))) - - return rating - - def check_for_user(): - username = None - ident = identity(request)['identity'] - user = user_data_from_identity(ident) - service_account_info = service_account_from_identity(ident) - if isinstance(user, dict): - username = user.get('username') - elif isinstance(service_account_info, dict): - username = service_account_info.get('username') - - if username is None: - abort(403, message="Username doesn't exist") - - return ident, username - - def check_for_system(ident, inventory_id): - system_id = None - if not is_valid_uuid(inventory_id): - abort(404, message='Invalid inventory_id, Id should be in form of UUID4') - systems = group_filtered_query(system_ids_by_org_id(ident['org_id']). - filter(System.inventory_id == inventory_id)) - try: - system_id = db.session.execute(systems).scalar_one() - except exc.NoResultFound: - abort(404, message=f"System {inventory_id} doesn't exist.") - - return system_id - - def validate_request(*args, **kwargs): - ident, username = check_for_user() - data = None - try: - data = json.loads(request.data) - except json.decoder.JSONDecodeError as err: - LOG.error(f"{prefix} - Decoding JSON has failed. {repr(err)}") - abort(400, message="Decoding JSON has failed.") - except TypeError as ex: - LOG.error(f"{prefix} - Invalid JSON format. {repr(ex)}") - abort(400, message="Invalid JSON format.") - - inventory_id = data['inventory_id'] - system_id = check_for_system(ident, inventory_id) - - rating = check_for_rating(data) - new_kwargs = { - 'rating': rating, 'username': username, - 'inventory_id': inventory_id, 'system_id': system_id - } - new_kwargs.update(kwargs) - return func(*args, **new_kwargs) - - return validate_request - - -def sorting_order(order_how): - """Sorting order method.""" - method_name = None - if order_how == 'asc': - method_name = asc - elif order_how == 'desc': - method_name = desc - else: - abort( - 403, - message="Incorrect sorting order. Possible values - ASC/DESC" - ) - return method_name diff --git a/ros/api/main.py b/ros/api/main.py deleted file mode 100644 index b10e46f6..00000000 --- a/ros/api/main.py +++ /dev/null @@ -1,18 +0,0 @@ -from flask_restful import Api -from flask_cors import CORS -from ros.lib.app import app -from ros.api.routes import initialize_routes -from ros.extensions import metrics -from ros.extensions import cache -from ros.lib.cw_logging import commence_cw_log_streaming -from ros.lib.config import ROS_API_PORT - -CORS(app) -api = Api(app) -initialize_routes(api) -cache.init_app(app) -metrics.init_app(app, api) -commence_cw_log_streaming('ros-api') - -if __name__ == "__main__": - app.run(host='0.0.0.0', port=ROS_API_PORT) diff --git a/ros/api/modules/recommendations.py b/ros/api/modules/recommendations.py deleted file mode 100644 index 99998300..00000000 --- a/ros/api/modules/recommendations.py +++ /dev/null @@ -1,50 +0,0 @@ -""" -Custom readonly class for Recommendation -""" -from ros.lib.constants import ( - RosSummary, Suggestions - ) - - -class Recommendation: - """Custom readonly recommendation class to generate list.""" - def __init__(self, rule_data, rule_hit, system, psi_enabled): - rule_hit_key = rule_hit.get("key") - - rule_dict = rule_data.__dict__ - self.rule_hit_details = rule_hit.get('details') - self.detected_issues = self.detected_issues_by_states(rule_hit_key) - self.suggested_instances = self.candidates_str() - self.current_instance = self.instance_info_str() - self.psi_enabled = psi_enabled - for rkey in Suggestions.RULES_COLUMNS.value: - setattr(self, rkey, eval("f'{}'".format(rule_dict[rkey]))) - - def instance_info_str(self): - """Return current instance type with price info.""" - return f'{self.rule_hit_details.get("instance_type")} ' + \ - f'({self.rule_hit_details.get("price")} {Suggestions.INSTANCE_PRICE_UNIT.value})' - - def candidates_str(self): - """Get string of instance types separated by newline.""" - candidates = self.rule_hit_details.get('candidates') - formatted_candidates = [] - - for candidate in candidates[0:3]: - formatted_candidates.append( - f'{candidate[0]} ({candidate[1]} {Suggestions.INSTANCE_PRICE_UNIT.value})') - - return Suggestions.NEWLINE_SEPARATOR.value.join(formatted_candidates) - - def detected_issues_by_states(self, rule_hit_key): - """Get string of issues descriptions per state.""" - if rule_hit_key == 'INSTANCE_IDLE': - return None - - states = self.rule_hit_details.get('states') - summaries = [ - RosSummary[state].value for substates in states.values() - for state in substates - if RosSummary[state].value is not None - ] - return Suggestions.NEWLINE_SEPARATOR.value.join(summaries) diff --git a/ros/api/routes.py b/ros/api/routes.py deleted file mode 100644 index c57e9f9c..00000000 --- a/ros/api/routes.py +++ /dev/null @@ -1,30 +0,0 @@ -from .v1.recommendation_ratings import RecommendationRatingsApi -from .v1.recommendations import RecommendationsApi -from .v1.openapi_spec import OpenAPISpec -from .v1.status import Status -from .v1.call_to_action import CallToActionApi -from .v1.suggested_instance_types import SuggestedInstanceTypes, SuggestedInstanceDetails - -from .v1.hosts import ( - HostsApi, - HostDetailsApi, - HostHistoryApi, - IsROSConfiguredApi, - ExecutiveReportAPI, -) - - -# Initialize Routes -def initialize_routes(api): - api.add_resource(Status, '/api/ros/v1/status') - api.add_resource(IsROSConfiguredApi, '/api/ros/v1/is_configured') - api.add_resource(HostsApi, '/api/ros/v1/systems') - api.add_resource(HostHistoryApi, '/api/ros/v1/systems//history') - api.add_resource(RecommendationsApi, '/api/ros/v1/systems//suggestions') - api.add_resource(HostDetailsApi, '/api/ros/v1/systems/') - api.add_resource(RecommendationRatingsApi, '/api/ros/v1/rating') - api.add_resource(OpenAPISpec, '/api/ros/v1/openapi.json') - api.add_resource(CallToActionApi, '/api/ros/v1/call_to_action') - api.add_resource(ExecutiveReportAPI, '/api/ros/v1/executive_report') - api.add_resource(SuggestedInstanceTypes, '/api/ros/v1/suggested_instance_types') - api.add_resource(SuggestedInstanceDetails, '/api/ros/v1/suggested_instance_types/') diff --git a/ros/api/v1/call_to_action.py b/ros/api/v1/call_to_action.py deleted file mode 100644 index 91465ca6..00000000 --- a/ros/api/v1/call_to_action.py +++ /dev/null @@ -1,62 +0,0 @@ -from flask_restful import Resource -from flask import request -from ros.lib.utils import ( - org_id_from_identity_header, systems_ids_for_existing_profiles) -from ros.lib.models import ( - PerformanceProfile) -from ros.extensions import cache - - -class CallToActionApi(Resource): - def get(self): - org_id = org_id_from_identity_header(request) - cache_key = "call_to_action_"+org_id - if res := cache.get(cache_key): - return res - - query = systems_ids_for_existing_profiles(org_id).filter(PerformanceProfile.number_of_recommendations > 0) - total_system_count = query.count() - - configTryLearn_Object = { - "try": [{ - "shape": { - "title": "Install and begin using Resource optimization service.", - "description": "Optimize your spending in public cloud.", - "link": { - "title": "Get started", - "href": "/insights/ros?with_suggestions=true", - }, - }, - }] - } - if total_system_count == 0: - result = { - "configTryLearn": configTryLearn_Object - } - cache.set(cache_key, result) - return result - - if total_system_count > 1: - suffix = 'systems' - else: - suffix = 'system' - result = { - "recommendations": { - "redhatInsights": [ - { - "id": "ros-1", - "description": "Resource optimization recommends to assess and monitor" - + " cloud usage and optimization on these systems", - "icon": "cog", - "action": { - "title": f"View {total_system_count} {suffix}" - + " with suggestions", - "href": "/insights/ros?with_suggestions=true" - } - } - ] - }, - "configTryLearn": configTryLearn_Object - } - cache.set(cache_key, result) - return result diff --git a/ros/api/v1/hosts.py b/ros/api/v1/hosts.py deleted file mode 100644 index 06eeb9d3..00000000 --- a/ros/api/v1/hosts.py +++ /dev/null @@ -1,574 +0,0 @@ -import logging -from flask import request -from sqlalchemy.types import Float -from ros.lib.constants import SubStates, SystemStatesWithKeys, SystemsTableColumn - -from datetime import datetime, timedelta, timezone -from sqlalchemy import asc, nullslast, nullsfirst -from flask_restful import Resource, abort, fields, marshal_with -from ros.api.common.add_group_filter import group_filtered_query -from ros.api.common.utils import sorting_order - -from ros.lib.models import ( - db, - System, - RhAccount, - PerformanceProfile, - RecommendationRating, - PerformanceProfileHistory, -) -from ros.lib.utils import ( - is_valid_uuid, - identity, - user_data_from_identity, - systems_ids_for_existing_profiles, - sort_io_dict, - system_ids_by_org_id, - count_per_state, - calculate_percentage, - org_id_from_identity_header, - highlights_instance_types, get_psi_count, -) -from ros.api.common.pagination import ( - limit_value, - offset_value, - build_paginated_system_list_response -) - -LOG = logging.getLogger(__name__) - - -class IsROSConfiguredApi(Resource): - def get(self): - org_id = org_id_from_identity_header(request) - query = group_filtered_query(systems_ids_for_existing_profiles(org_id)) - system_count = query.count() - systems_with_suggestions = query.filter(PerformanceProfile.number_of_recommendations > 0).count() - systems_waiting_for_data = query.filter(PerformanceProfile.state == 'Waiting for data').count() - - if system_count <= 0: - status, code = False, 'NO_SYSTEMS' - else: - status, code = True, 'SYSTEMSEXIST' - return { - 'success': status, - 'code': code, - 'count': system_count, - 'systems_stats': { - 'waiting_for_data': systems_waiting_for_data, - 'with_suggestions': systems_with_suggestions - } - } - - -class HostsApi(Resource): - performance_utilization_fields = { - 'cpu': fields.Integer, - 'memory': fields.Integer, - 'max_io': fields.Float, - 'io_all': fields.Raw - } - - groups_fields = { - 'id': fields.String, - 'name': fields.String - } - - hosts_fields = { - 'fqdn': fields.String, - 'display_name': fields.String, - 'inventory_id': fields.String, - 'org_id': fields.String, - 'number_of_suggestions': fields.Integer(attribute='number_of_recommendations'), - 'state': fields.String, - 'performance_utilization': fields.Nested(performance_utilization_fields), - 'cloud_provider': fields.String, - 'instance_type': fields.String, - 'idling_time': fields.String, - 'os': fields.String, - 'report_date': fields.DateTime(dt_format='iso8601'), - 'groups': fields.List(fields.Nested(groups_fields)) - } - meta_fields = { - 'count': fields.Integer, - 'limit': fields.Integer, - 'offset': fields.Integer, - } - links_fields = { - 'first': fields.String, - 'last': fields.String, - 'next': fields.String, - 'previous': fields.String - } - output_fields = { - 'meta': fields.Nested(meta_fields), - 'links': fields.Nested(links_fields), - 'data': fields.List(fields.Nested(hosts_fields)) - } - - @marshal_with(output_fields) - def get(self): - limit = limit_value() - offset = offset_value() - order_by = ( - request.args.get('order_by') or 'report_date' - ).strip().lower() - order_how = (request.args.get('order_how') or 'desc').strip().lower() - - org_id = org_id_from_identity_header(request) - # Note that When using LIMIT, it is important to use an ORDER BY clause - # that constrains the result rows into a unique order. - # Otherwise you will get an unpredictable subset of the query's rows. - # Refer - https://www.postgresql.org/docs/13/queries-limit.html - - sys_query = group_filtered_query(system_ids_by_org_id(org_id)) - system_query = sys_query.filter(*self.build_system_filters()) - sort_expression = self.build_sort_expression(order_how, order_by) - query = ( - db.session.query(PerformanceProfile, System, RhAccount) - .join(System, System.id == PerformanceProfile.system_id) - .join(RhAccount, RhAccount.id == System.tenant_id) - .filter(PerformanceProfile.system_id.in_(system_query)) - .order_by(*sort_expression) - ) - count = query.count() - # NOTE: Override limit value to get all the systems when it is -1 - if limit == -1: - limit = count - query = query.limit(limit).offset(offset) - query_results = query.all() - hosts = [] - for row in query_results: - try: - system_dict = row.System.__dict__ - host = {skey: system_dict[skey] for skey in SystemsTableColumn.SYSTEM_COLUMNS.value} - host['org_id'] = row.RhAccount.org_id - host['performance_utilization'] = sort_io_dict( - row.PerformanceProfile.performance_utilization - ) - host['idling_time'] = row.PerformanceProfile.idling_time - host['os'] = row.System.deserialize_host_os_data - host['report_date'] = row.PerformanceProfile.report_date - host['number_of_recommendations'] = row.PerformanceProfile.number_of_recommendations - hosts.append(host) - except Exception as err: - LOG.error( - f"An error occured while fetching the host. {repr(err)}" - ) - count -= 1 - - return build_paginated_system_list_response( - limit, offset, hosts, count - ) - - @staticmethod - def build_system_filters(): - """Build system filters.""" - filters = [] - if filter_display_name := request.args.get('display_name'): - filters.append(System.display_name.ilike(f'%{filter_display_name}%')) - - system_states = [i.value for i in SystemStatesWithKeys] - if states := request.args.getlist('state'): - modified_states = [] - for state in states: - state = state.capitalize() - if state not in system_states: - abort(400, message='values are not matching') - modified_states.append(state) - filters.append(System.state.in_(modified_states)) - else: - filters.append(System.state.in_(system_states)) - if operating_systems := request.args.getlist('os'): - modified_operating_systems = [] - for os in operating_systems: - if os.replace('.', '', 1).isdigit(): - os_object = {"name": "RHEL"} - if len(os) == 1: - os += ".0" - os_object["major"] = int(os.split(".")[0]) - os_object["minor"] = int(os.split(".")[1]) - modified_operating_systems.append(os_object) - else: - abort(400, message='Not a valid RHEL version') - filters.append(System.operating_system.in_(modified_operating_systems)) - if request.args.getlist('group_name'): - group_names = request.args.getlist('group_name') - filters.append(System.groups[0]['name'].astext.in_(group_names)) - return filters - - def build_sort_expression(self, order_how, order_method): - """Build sort expression.""" - sort_order = sorting_order(order_how) - - if order_method == 'display_name': - return (sort_order(System.display_name), - asc(PerformanceProfile.system_id),) - - score_methods = ['cpu', 'memory', 'max_io'] - if order_method in score_methods: - return ( - sort_order(PerformanceProfile.performance_utilization[ - order_method].astext.cast(Float)), - asc(PerformanceProfile.system_id),) - - if order_method == 'number_of_suggestions': - return (sort_order(PerformanceProfile.number_of_recommendations), - asc(PerformanceProfile.system_id),) - - if order_method == 'state': - return (sort_order(System.state), - asc(PerformanceProfile.system_id),) - - if order_method == 'os': - nulls_method = nullsfirst if order_how == 'asc' else nullslast - return ( - nulls_method(sort_order(System.operating_system['name'])), - sort_order(System.operating_system['major']), - sort_order(System.operating_system['minor']) - ) - if order_method == 'report_date': - return (sort_order(PerformanceProfile.report_date), - asc(PerformanceProfile.system_id)) - - if order_method == 'group_name': - return (sort_order(System.groups[0]['name']), - asc(PerformanceProfile.system_id),) - - abort(403, message="Unexpected sort method {}".format(order_method)) - return None - - -class HostDetailsApi(Resource): - performance_utilization_fields = { - 'cpu': fields.Integer, - 'memory': fields.Integer, - 'max_io': fields.Float, - 'io_all': fields.Raw - } - profile_fields = { - 'fqdn': fields.String, - 'inventory_id': fields.String, - 'display_name': fields.String, - 'performance_utilization': fields.Nested(performance_utilization_fields), - 'rating': fields.Integer, - 'number_of_suggestions': fields.Integer(attribute='number_of_recommendations'), - 'state': fields.String, - 'report_date': fields.DateTime(dt_format='iso8601'), - 'instance_type': fields.String, - 'cloud_provider': fields.String, - 'idling_time': fields.String, - 'os': fields.String, - 'psi_enabled': fields.Boolean - } - - @marshal_with(profile_fields) - def get(self, host_id): - if not is_valid_uuid(host_id): - abort(404, message='Invalid host_id, Id should be in form of UUID4') - - ident = identity(request)['identity'] - user = user_data_from_identity(ident) - username = user['username'] if 'username' in user else None - org_id = org_id_from_identity_header(request) - system_query = group_filtered_query(system_ids_by_org_id(org_id).filter(System.inventory_id == host_id)) - - profile = PerformanceProfile.query.filter( - PerformanceProfile.system_id.in_(system_query)).first() - - rating_record = RecommendationRating.query.filter( - RecommendationRating.system_id.in_(system_query), - RecommendationRating.rated_by == username - ).first() - - system = db.session.scalar(db.select(System).filter(System.inventory_id == host_id)) - - record = None - if profile: - record = {key: system.__dict__[key] for key in SystemsTableColumn.SYSTEM_COLUMNS.value} - record['performance_utilization'] = sort_io_dict(profile.performance_utilization) - record['rating'] = rating_record.rating if rating_record else None - record['report_date'] = profile.report_date - record['idling_time'] = profile.idling_time - record['os'] = system.deserialize_host_os_data - record['number_of_recommendations'] = profile.number_of_recommendations - record['psi_enabled'] = profile.psi_enabled - else: - abort(404, message="System {} doesn't exist" - .format(host_id)) - - return record - - -class HostHistoryApi(Resource): - performance_utilization_fields = { - 'cpu': fields.Integer, - 'memory': fields.Integer, - 'io_all': fields.Raw, - 'max_io': fields.Float, - 'report_date': fields.DateTime(dt_format='iso8601') - } - meta_fields = { - 'count': fields.Integer, - 'limit': fields.Integer, - 'offset': fields.Integer - } - links_fields = { - 'first': fields.String, - 'last': fields.String, - 'next': fields.String, - 'previous': fields.String - } - history_fields = { - 'meta': fields.Nested(meta_fields), - 'links': fields.Nested(links_fields), - 'inventory_id': fields.String, - 'data': fields.List(fields.Nested(performance_utilization_fields)) - } - - @marshal_with(history_fields) - def get(self, host_id): - limit = limit_value() - offset = offset_value() - if not is_valid_uuid(host_id): - abort(404, message='Invalid host_id, Id should be in form of UUID4') - - org_id = org_id_from_identity_header(request) - system_query = group_filtered_query(system_ids_by_org_id(org_id).filter(System.inventory_id == host_id)) - - query = PerformanceProfileHistory.query.filter( - PerformanceProfileHistory.system_id.in_(system_query) - ).order_by(PerformanceProfileHistory.report_date.desc()) - - count = query.count() - query = query.limit(limit).offset(offset) - query_results = query.all() - - if not query_results: - abort(404, message="System {} doesn't exist" - .format(host_id)) - - performance_history = [] - for profile in query_results: - performance_record = sort_io_dict(profile.performance_utilization) - performance_record['report_date'] = profile.report_date - performance_history.append(performance_record) - - paginated_response = build_paginated_system_list_response( - limit, offset, performance_history, count - ) - paginated_response['inventory_id'] = host_id - return paginated_response - - -class ExecutiveReportAPI(Resource): - count_and_percentage = { - "count": fields.Integer, - "percentage": fields.Float - } - systems_per_state = { - "optimized": fields.Nested(count_and_percentage), - "under_pressure": fields.Nested(count_and_percentage), - "undersized": fields.Nested(count_and_percentage), - "oversized": fields.Nested(count_and_percentage), - "idling": fields.Nested(count_and_percentage), - "waiting_for_data": fields.Nested(count_and_percentage) - } - conditions = { - "io": fields.Raw, - "memory": fields.Raw, - "cpu": fields.Raw - } - instance_types_highlights = { - "current": fields.Raw, - "suggested": fields.Raw, - "historical": fields.Raw, - } - meta = { - "total_count": fields.Integer, - "non_optimized_count": fields.Integer, - "conditions_count": fields.Integer, - "stale_count": fields.Integer, - "non_psi_count": fields.Integer, - "psi_enabled_count": fields.Integer, - } - report_fields = { - "systems_per_state": fields.Nested(systems_per_state), - "conditions": fields.Nested(conditions), - "instance_types_highlights": fields.Nested(instance_types_highlights), - "meta": fields.Nested(meta) - } - - @marshal_with(report_fields) - def get(self): - org_id = org_id_from_identity_header(request) - systems_with_performance_record_queryset = db.session.query( - System.id, - System.state, - System.instance_type, - System.cpu_states, - System.io_states, - System.memory_states, - System.region, - System.groups, - PerformanceProfile.system_id, - PerformanceProfile.report_date, - PerformanceProfile.rule_hit_details, - PerformanceProfile.psi_enabled, - PerformanceProfile.operating_system - ).select_from(System).join(PerformanceProfile).filter( - System.id == PerformanceProfile.system_id, - System.id.in_(system_ids_by_org_id(org_id)) - ) - - sys_query = group_filtered_query(systems_with_performance_record_queryset) - systems_with_performance_record_subquery = sys_query.subquery() - - # System counts - total_systems = systems_with_performance_record_queryset.count() - optimized_systems = count_per_state(systems_with_performance_record_queryset, {'state': "Optimized"}) - under_pressure_systems = count_per_state(systems_with_performance_record_queryset, {'state': "Under pressure"}) - undersized_systems = count_per_state(systems_with_performance_record_queryset, {'state': "Undersized"}) - oversized_systems = count_per_state(systems_with_performance_record_queryset, {'state': "Oversized"}) - waiting_for_data_systems = count_per_state( - systems_with_performance_record_queryset, - {'state': "Waiting for data"} - ) - idling_systems = count_per_state(systems_with_performance_record_queryset, {'state': "Idling"}) - - non_optimized_queryset = systems_with_performance_record_queryset.filter( - System.state.in_( - ['Oversized', 'Undersized', 'Idling', 'Under pressure'] - ) - ) - non_optimized_count = 0 - total_keys = ['cpu', 'memory', 'io'] - state_keys = ['undersized', 'under_pressure', 'oversized'] - totals = dict.fromkeys(total_keys, 0) - cpu_states_dict = dict.fromkeys(state_keys, 0) - memory_states_dict = dict.fromkeys(state_keys, 0) - io_states_dict = dict.fromkeys(state_keys, 0) - - for record in non_optimized_queryset: - non_optimized_count += 1 - if record.cpu_states: - totals['cpu'] = totals['cpu'] + len(record.cpu_states) - if SubStates.CPU_UNDERSIZED.value in record.cpu_states: - cpu_states_dict['undersized'] += 1 - if SubStates.CPU_UNDER_PRESSURE.value in record.cpu_states: - cpu_states_dict['under_pressure'] += 1 - if SubStates.CPU_OVERSIZED.value in record.cpu_states: - cpu_states_dict['oversized'] += 1 - if record.memory_states: - totals['memory'] = totals['memory'] + len(record.memory_states) - if SubStates.MEMORY_UNDERSIZED.value in record.memory_states: - memory_states_dict['undersized'] += 1 - if SubStates.MEMORY_UNDER_PRESSURE.value in record.memory_states: - memory_states_dict['under_pressure'] += 1 - if SubStates.MEMORY_OVERSIZED.value in record.memory_states: - memory_states_dict['oversized'] += 1 - if record.io_states: - totals['io'] = totals['io'] + len(record.io_states) - if SubStates.IO_UNDER_PRESSURE.value in record.io_states: - io_states_dict['under_pressure'] += 1 - # FIXME - enable this logic after getting IO states from advisor engine - # if SubStates.IO_UNDERSIZED.value in system.io_states: - # io_states_dict['undersized'] += 1 - # if SubStates.IO_OVERSIZED.value in system.io_states: - # io_states_dict['oversized'] += 1 - - io_states_dict['oversized'] = -1 - io_states_dict['undersized'] = -1 - total_conditions = totals['cpu'] + totals['memory'] + totals['io'] - - current_utc_datetime = datetime.now(timezone.utc) - stale_date = (current_utc_datetime - timedelta(days=7)).date() - - current_performance_profiles = [ - record - for record in systems_with_performance_record_queryset - if current_utc_datetime.date() >= record.report_date.date() > stale_date - ] - - historical_performance_profiles = db.session.query( - PerformanceProfileHistory.system_id, - PerformanceProfileHistory.rule_hit_details, - systems_with_performance_record_subquery.c.region - ).join( - systems_with_performance_record_subquery, - systems_with_performance_record_subquery.c.system_id == PerformanceProfileHistory.system_id - ) # Systems older than 7 days/stale systems are considered here - - stale_count = systems_with_performance_record_queryset.filter( - PerformanceProfile.report_date <= stale_date - ).count() - - non_psi_count = get_psi_count(systems_with_performance_record_queryset, False) - psi_enabled_count = get_psi_count(systems_with_performance_record_queryset, True) - - response = { - "systems_per_state": { - "optimized": { - "count": optimized_systems, - "percentage": calculate_percentage(optimized_systems, total_systems) - }, - "under_pressure": { - "count": under_pressure_systems, - "percentage": calculate_percentage(under_pressure_systems, total_systems) - }, - "undersized": { - "count": undersized_systems, - "percentage": calculate_percentage(undersized_systems, total_systems) - }, - "oversized": { - "count": oversized_systems, - "percentage": calculate_percentage(oversized_systems, total_systems) - }, - "idling": { - "count": idling_systems, - "percentage": calculate_percentage(idling_systems, total_systems) - }, - "waiting_for_data": { - "count": waiting_for_data_systems, - "percentage": calculate_percentage(waiting_for_data_systems, total_systems) - } - }, - "conditions": { - "io": { - "count": totals['io'], - "percentage": calculate_percentage(totals['io'], total_conditions), - "undersized": io_states_dict['undersized'], - "oversized": io_states_dict['oversized'], - "under_pressure": io_states_dict['under_pressure'] - }, - "memory": { - "count": totals['memory'], - "percentage": calculate_percentage(totals['memory'], total_conditions), - "undersized": memory_states_dict['undersized'], - "oversized": memory_states_dict['oversized'], - "under_pressure": memory_states_dict['under_pressure'] - }, - "cpu": { - "count": totals['cpu'], - "percentage": calculate_percentage(totals['cpu'], total_conditions), - "undersized": cpu_states_dict['undersized'], - "oversized": cpu_states_dict['oversized'], - "under_pressure": cpu_states_dict['under_pressure'] - } - }, - "instance_types_highlights": { - "current": highlights_instance_types(current_performance_profiles, 'current'), - "suggested": highlights_instance_types(current_performance_profiles, 'suggested'), - "historical": highlights_instance_types(historical_performance_profiles, 'historical') - }, - "meta": { - "total_count": total_systems, - "non_optimized_count": non_optimized_count, - "conditions_count": total_conditions, - "stale_count": stale_count, - "non_psi_count": non_psi_count, - "psi_enabled_count": psi_enabled_count - } - } - - return response diff --git a/ros/api/v1/openapi_spec.py b/ros/api/v1/openapi_spec.py deleted file mode 100644 index 874a4c14..00000000 --- a/ros/api/v1/openapi_spec.py +++ /dev/null @@ -1,7 +0,0 @@ -from flask import send_file -from flask_restful import Resource - - -class OpenAPISpec(Resource): - def get(self): - return send_file("../openapi/openapi.json") diff --git a/ros/api/v1/recommendation_ratings.py b/ros/api/v1/recommendation_ratings.py deleted file mode 100644 index 511f92d9..00000000 --- a/ros/api/v1/recommendation_ratings.py +++ /dev/null @@ -1,46 +0,0 @@ -from flask_restful import Resource, fields, marshal_with -from ros.lib.models import RecommendationRating, db -from ros.api.common.utils import validate_rating_data - - -class RecommendationRatingsApi(Resource): - - rating_fields = { - 'inventory_id': fields.String, - 'rating': fields.Integer - } - - @validate_rating_data - @marshal_with(rating_fields) - def post(self, **kwargs): - """ - Add or update a rating for a system, by system ID. - Return the new rating. Any previous rating for this rule by this - user is amended to the current value. - """ - username = kwargs.get('username') - inventory_id = kwargs.get('inventory_id') - rating = kwargs.get('rating') - system_id = kwargs.get('system_id') - - rating_record = RecommendationRating.query.filter( - RecommendationRating.system_id == system_id, - RecommendationRating.rated_by == username - ).first() - - if rating_record: - rating_record.rating = rating - db.session.commit() - status_code = 200 - else: - rating_record = RecommendationRating( - system_id=system_id, rating=rating, rated_by=username - ) - db.session.add(rating_record) - db.session.commit() - status_code = 201 - - return { - 'rating': rating_record.rating, - 'inventory_id': inventory_id - }, status_code diff --git a/ros/api/v1/recommendations.py b/ros/api/v1/recommendations.py deleted file mode 100644 index 58ae6da4..00000000 --- a/ros/api/v1/recommendations.py +++ /dev/null @@ -1,75 +0,0 @@ -from ros.lib.models import Rule, System, db, PerformanceProfile -from ros.lib.utils import is_valid_uuid, identity, system_ids_by_org_id -from ros.api.modules.recommendations import Recommendation -from flask_restful import Resource, abort, fields, marshal_with -from flask import request -from sqlalchemy import exc -from ros.api.common.add_group_filter import group_filtered_query - - -class RecommendationsApi(Resource): - recommendation_fields = { - 'rule_id': fields.String, - 'description': fields.String, - 'reason': fields.String, - 'resolution': fields.String, - 'condition': fields.String, - 'detected_issues': fields.String, - 'suggested_instances': fields.String, - 'current_instance': fields.String, - 'psi_enabled': fields.Boolean - } - - meta_fields = { - 'count': fields.Integer - } - - data_fields = { - 'inventory_id': fields.String, - 'meta': fields.Nested(meta_fields), - 'data': fields.List(fields.Nested(recommendation_fields)) - } - - @marshal_with(data_fields) - def get(self, host_id): - system = None - if not is_valid_uuid(host_id): - abort(404, message='Invalid host_id, Id should be in form of UUID4') - - ident = identity(request)['identity'] - - filter_description = request.args.get('description') - system_query = group_filtered_query(system_ids_by_org_id(ident['org_id'], True). - filter(System.inventory_id == host_id)) - try: - system = db.session.execute(system_query).scalar_one() - except exc.NoResultFound: - abort(404, message=f"System {host_id} doesn't exist.") - - profile = PerformanceProfile.query.filter_by(system_id=system.id).first() - if not profile: - abort( - 404, - message="No records for host with id {} doesn't exist".format(host_id)) - - rule_hits = profile.rule_hit_details - psi_enabled = profile.psi_enabled - recommendations_list = [] - if rule_hits: - for rule_hit in rule_hits: - if filter_description: - rule_data = db.session.scalar(db.select(Rule).filter(Rule.rule_id == rule_hit['rule_id']) - .filter(Rule.description.ilike(f'%{filter_description}%'))) - else: - rule_data = db.session.scalar(db.select(Rule).filter(Rule.rule_id == rule_hit['rule_id'])) - - if rule_data: - recommendation = Recommendation( - rule_data, rule_hit, system, psi_enabled - ).__dict__ - recommendations_list.append(recommendation) - return { - 'inventory_id': system.inventory_id, - 'data': recommendations_list, - 'meta': {'count': len(recommendations_list)} - } diff --git a/ros/api/v1/status.py b/ros/api/v1/status.py deleted file mode 100644 index 53351a48..00000000 --- a/ros/api/v1/status.py +++ /dev/null @@ -1,8 +0,0 @@ -from flask_restful import Resource -from ros.extensions import metrics - - -class Status(Resource): - @metrics.do_not_track() - def get(self): - return {'status': 'Application is running!'} diff --git a/ros/api/v1/suggested_instance_types.py b/ros/api/v1/suggested_instance_types.py deleted file mode 100644 index 1982b82b..00000000 --- a/ros/api/v1/suggested_instance_types.py +++ /dev/null @@ -1,210 +0,0 @@ -import logging -from flask import request -from sqlalchemy import func -from flask_restful import Resource, fields, marshal_with, abort -from ros.api.common.add_group_filter import group_filtered_query -from ros.lib.utils import ( - system_ids_by_org_id, - org_id_from_identity_header, sort_io_dict, -) - -from ros.lib.models import ( - db, - PerformanceProfile, - System -) - -from ros.api.common.pagination import ( - limit_value, - offset_value, - build_paginated_system_list_response -) -from ros.api.common.instance_types_helper import instance_types_desc_dict -from ros.api.common.utils import sorting_order -from ros.lib.config import get_logger - -LOG = get_logger(__name__) - -LOG = logging.getLogger(__name__) - - -def non_null_suggested_instance_types(): - org_id = org_id_from_identity_header(request) - systems_query = group_filtered_query(system_ids_by_org_id(org_id)) - return db.session.query(PerformanceProfile.top_candidate, - func.count(PerformanceProfile.system_id).label('system_count')).filter( - PerformanceProfile.top_candidate.is_not(None)).filter( - PerformanceProfile.system_id.in_(systems_query)).group_by(PerformanceProfile.top_candidate) - - -class SuggestedInstanceTypes(Resource): - data = { - 'instance_type': fields.String, - 'cloud_provider': fields.String, - 'system_count': fields.Integer, - 'description': fields.String, - } - meta_fields = { - 'count': fields.Integer, - 'limit': fields.Integer, - 'offset': fields.Integer - } - links_fields = { - 'first': fields.String, - 'last': fields.String, - 'next': fields.String, - 'previous': fields.String - } - output = { - 'meta': fields.Nested(meta_fields), - 'links': fields.Nested(links_fields), - 'data': fields.List(fields.Nested(data)) - } - - @marshal_with(output) - def get(self): - limit = limit_value() - offset = offset_value() - order_by = ( - request.args.get('order_by') or 'system_count' - ).strip().lower() - order_how = (request.args.get('order_how') or 'desc').strip().lower() - sort_expression = self.build_sort_expression(order_how, order_by) - query = non_null_suggested_instance_types().filter(*self.build_instance_filters()).order_by(*sort_expression) - count = query.count() - query = query.limit(limit).offset(offset) - query_result = query.all() - suggested_instance_types = [] - for row in query_result: - # FIXME: As of now we only support AWS cloud, so statically adding it to the dict. Fix this code block - # upon supporting multiple clouds. - record = {'instance_type': row.top_candidate, 'cloud_provider': 'AWS', 'system_count': row.system_count} - try: - record['description'] = instance_types_desc_dict()[row.top_candidate] - except KeyError: - LOG.info(f"Unable to get the description for {row.top_candidate}! " - f"Looks like lib/aws_instance_types.py is stale!") - suggested_instance_types.append(record) - return build_paginated_system_list_response(limit, offset, suggested_instance_types, count) - - @staticmethod - def build_instance_filters(): - filters = [] - if filter_instance_type := request.args.get('instance_type'): - filters.append(PerformanceProfile.top_candidate.ilike(f'%{filter_instance_type}%')) - # TODO: once ROS has multi cloud support, add cloud provider filter - return filters - - def build_sort_expression(self, order_how, order_method): - """Build sort expression.""" - sort_order = sorting_order(order_how) - - if order_method == 'instance_type': - return (sort_order(PerformanceProfile.top_candidate),) - - if order_method == 'system_count': - return (sort_order(func.count(PerformanceProfile.system_id)),) - - abort(403, message="Unexpected sort method {}".format(order_method)) - return None - - -class SuggestedInstanceDetails(Resource): - performance_utilization_fields = { - 'cpu': fields.Integer, - 'memory': fields.Integer, - 'max_io': fields.Float, - 'io_all': fields.Raw - } - - data = { - 'fqdn': fields.String, - 'display_name': fields.String, - 'instance_type': fields.String, - 'os': fields.String, - 'performance_utilization': fields.Nested(performance_utilization_fields), - 'state': fields.String, - 'last_reported': fields.DateTime(dt_format='iso8601') - } - - instance_type_detail = { - 'instance_type': fields.String, - 'cloud_provider': fields.String, - 'description': fields.String - } - - meta_fields = { - 'count': fields.Integer, - 'limit': fields.Integer, - 'offset': fields.Integer, - 'suggested_instance_type_detail': fields.Nested(instance_type_detail) - } - - links_fields = { - 'first': fields.String, - 'last': fields.String, - 'next': fields.String, - 'previous': fields.String - } - output = { - 'meta': fields.Nested(meta_fields), - 'links': fields.Nested(links_fields), - 'data': fields.List(fields.Nested(data)) - } - - @marshal_with(output) - def get(self, instance_type): - limit = limit_value() - offset = offset_value() - org_id = org_id_from_identity_header(request) - system_query = group_filtered_query(system_ids_by_org_id(org_id)) - query = db.session.query( - System.fqdn, - System.display_name, - func.concat(System.operating_system["name"].astext, ' ', System.operating_system['major'], '.', - System.operating_system['minor']).label("os"), - PerformanceProfile.top_candidate.label('instance_type'), - PerformanceProfile.performance_utilization, - PerformanceProfile.state, - PerformanceProfile.report_date.label('last_reported')).select_from(System).join(PerformanceProfile).filter( - System.id == PerformanceProfile.system_id, - System.id.in_(system_query), - PerformanceProfile.top_candidate == instance_type - ) - - query = query.filter(*self.build_instance_details_filters()) - count = query.count() - if limit == -1: - limit = count - query_after_request_filters = query.limit(limit).offset(offset) - query_results = query_after_request_filters.all() - instance_details = [] - for result in query_results: - try: - record = result._asdict() - record['performance_utilization'] = sort_io_dict(result.performance_utilization) - instance_details.append(record) - except Exception as err: - LOG.error( - f"An error occurred while fetching the host! {repr(err)}" - ) - count -= 1 - - instance_type_details = {'instance_type': instance_type, 'cloud_provider': 'AWS', - 'description': instance_types_desc_dict()[instance_type]} - paginated_system_list_response = build_paginated_system_list_response(limit, offset, instance_details, count) - paginated_system_list_response['meta']['suggested_instance_type_detail'] = instance_type_details - return paginated_system_list_response - - @staticmethod - def build_instance_details_filters(): - filters = [] - if filter_display_name := request.args.get('display_name'): - filters.append(System.display_name.ilike(f'%{filter_display_name}')) - if filter_state := request.args.get('state'): - filters.append(System.state.ilike(f'%{filter_state}')) - if filter_os := request.args.get('os'): - filters.append(func.concat(System.operating_system["name"].astext, ' ', - System.operating_system['major'], '.', - System.operating_system['minor']).ilike(filter_os)) - return filters diff --git a/ros/openapi/openapi.json b/ros/openapi/openapi.json deleted file mode 100644 index 97b4ef90..00000000 --- a/ros/openapi/openapi.json +++ /dev/null @@ -1,1051 +0,0 @@ -{ - "openapi": "3.0.1", - "info": { - "title": "Ros-backend API", - "description": "Flask Backend API for Resource Optimization Service", - "contact": {}, - "license": { - "name": "GPLv3", - "url": "https://www.gnu.org/licenses/gpl-3.0.en.html" - }, - "version": "v1" - }, - "servers": [ - { - "url": "https://console.redhat.com/api/ros/v1", - "description": "ROS Production API" - } - ], - "paths": { - "/status": { - "get": { - "summary": "Health check liveness call", - "description": "A small JSON indicating the application is deployed. This serves as both the liveness and readiness call.", - "operationId": "getStatus", - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Status" - } - } - } - } - } - } - }, - "/is_configured": { - "get": { - "summary": "Check ROS configured", - "description": "Check whether service is configured.", - "operationId": "getServiceConfigurationInfo", - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/IsServiceConfigured" - } - } - } - } - } - } - }, - "/systems": { - "get": { - "summary": "Lists all systems from cloud having performance profile", - "description": "Lists all systems from cloud having performance profile", - "operationId": "getSystems", - "parameters": [ - { - "$ref": "#/components/parameters/limitParam" - }, - { - "$ref": "#/components/parameters/offsetParam" - }, - { - "$ref": "#/components/parameters/orderByParam" - }, - { - "$ref": "#/components/parameters/orderHowParam" - }, - { - "$ref": "#/components/parameters/filterParam" - }, - { - "$ref": "#/components/parameters/filterStateParam" - }, - { - "$ref": "#/components/parameters/filterOSParam" - }, - { - "$ref": "#/components/parameters/filterGroupParam" - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Systems" - } - } - } - } - }, - "security": [ - { - "RhIdentity": [] - } - ] - } - }, - "/systems/{inventory_id}": { - "get": { - "summary": "Show the system details by given inventory id", - "description": "Show the system details by given inventory id", - "operationId": "getSystemDetails", - "parameters": [ - { - "name": "inventory_id", - "in": "path", - "description": "Inventory ID", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SystemDetails" - } - } - } - } - } - } - }, - "/systems/{inventory_id}/history": { - "get": { - "summary": "Show the system's performance history by given inventory id", - "description": "Show the system's performance history by given inventory id", - "operationId": "getPerformanceHistoryForSystem", - "parameters": [ - { - "name": "inventory_id", - "in": "path", - "description": "Inventory ID", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PerformanceHistory" - } - } - } - } - } - } - }, - "/systems/{inventory_id}/suggestions": { - "get": { - "summary": "Show the list of suggestions by given inventory id", - "description": "Show the list of suggestions by given inventory id", - "operationId": "getSuggestionsForSystem", - "parameters": [ - { - "name": "inventory_id", - "in": "path", - "description": "Inventory ID", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "description", - "in": "query", - "required": false, - "description": "Filter system with the given description", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SuggestionsList" - } - } - } - } - } - } - }, - "/executive_report": { - "get": { - "summary": "Executive report for systems", - "description": "Executive report for systems", - "operationId": "getExecutiveReportForSystems", - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ExecutiveReportItem" - } - } - } - } - } - } - }, - "/rating": { - "post": { - "summary": "submit suggestion rating", - "description": "submit suggestion rating", - "operationId": "addSuggestionRatingToSystem", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Rating" - } - } - - } - }, - "responses": { - "201": { - "description": "Created", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Rating" - } - } - } - }, - "200": { - "description": "Updated an existing rating submitted by same user", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Rating" - } - } - } - }, - "422": { - "description": "Invalid choice of input for rating", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "403": { - "description": "Forbidden", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "404": { - "description": "Not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - }, - "400": { - "description": "Bad request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Message" - } - } - } - } - } - } - }, - "/suggested_instance_types": { - "get": { - "summary": "List all suggested instance types for the system", - "description": "Lists suggested instance types as per the suggestions", - "operationId": "getSuggestedInstanceTypes", - "parameters": [ - { - "$ref": "#/components/parameters/limitParam" - }, - { - "$ref": "#/components/parameters/offsetParam" - }, - { - "$ref": "#/components/parameters/SuggestedInstanceTypeOrderByParam" - }, - { - "$ref": "#/components/parameters/orderHowParam" - }, - { - "$ref":"#/components/parameters/filterInstanceType" - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SuggestedInstanceTypes" - } - } - } - } - } - } - } - - }, - "components": { - "schemas": { - "Links": { - "type": "object", - "properties": { - "first": { - "type": "string" - }, - "last": { - "type": "string" - }, - "next": { - "type": "string" - }, - "previous": { - "type": "string" - } - } - }, - "ListMeta": { - "type": "object", - "properties": { - "limit": { - "type": "integer" - }, - "offset" : { - "type": "integer" - }, - "count": { - "type": "integer" - } - } - }, - "Systems": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/SystemItem" - } - }, - "links": { - "$ref": "#/components/schemas/Links" - }, - "meta": { - "$ref": "#/components/schemas/ListMeta" - } - } - }, - "IsServiceConfigured": { - "type": "object", - "properties": { - "success": { - "type": "boolean" - }, - "code" : { - "type": "string" - }, - "count": { - "type": "integer" - }, - "systems_stats": { - "type": "object", - "properties": { - "waiting_for_data": { - "type": "integer" - }, - "with_suggestions": { - "type": "integer" - } - } - } - - } - }, - "SystemItem": { - "type": "object", - "properties": { - "fqdn": { - "type": "string" - }, - "display_name": { - "type": "string" - }, - "inventory_id": { - "type": "string" - }, - "org_id": { - "type": "string" - }, - "number_of_suggestions": { - "type": "integer" - }, - "state": { - "type": "string" - }, - "performance_utilization": { - "type": "object", - "properties": { - "cpu": { - "type": "integer" - }, - "memory": { - "type": "integer" - }, - "max_io": { - "type": "number" - }, - "io_all": { - "type": "object" - } - } - }, - "cloud_provider": { - "type": "string" - }, - "instance_type": { - "type": "string" - }, - "idling_time": { - "type": "number" - }, - "os": { - "type": "string" - }, - "report_date": { - "type": "string" - }, - "groups": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - } - } - } - } - } - }, - "Status": { - "required": [ - "status" - ], - "properties": { - "status": { - "type": "string" - } - } - }, - "SystemDetails": { - "type": "object", - "properties": { - "fqdn": { - "type": "string" - }, - "inventory_id": { - "type": "string" - }, - "display_name": { - "type": "string" - }, - "performance_utilization": { - "type": "object", - "properties": { - "cpu": { - "type": "integer" - }, - "memory": { - "type": "integer" - }, - "max_io": { - "type": "number" - }, - "io_all": { - "type": "object" - } - } - }, - "rating": { - "type": "integer", - "enum": [-1, 0, 1] - }, - "number_of_suggestions": { - "type": "integer" - }, - "state": { - "type": "string" - }, - "report_date": { - "type": "string" - }, - "instance_type": { - "type": "string" - }, - "cloud_provider": { - "type": "string" - }, - "idling_time": { - "type": "number" - }, - "os": { - "type": "string" - }, - "psi_enabled": { - "type": "boolean" - } - } - }, - "PerformanceHistory": { - "type": "object", - "properties": { - "meta": { - "$ref": "#/components/schemas/ListMeta" - }, - "links": { - "$ref": "#/components/schemas/Links" - }, - "inventory_id": { - "type": "string" - }, - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/PerformanceItem" - } - } - } - }, - "ExecutiveReportItem": { - "type": "object", - "properties": { - "systems_per_state": { - "type": "object", - "properties": { - "under_pressure": { - "type": "object", - "properties": { - "count": { - "type": "integer" - }, - "percentage": { - "type": "number" - } - } - }, - "undersized": { - "type": "object", - "properties": { - "count": { - "type": "integer" - }, - "percentage": { - "type": "number" - } - } - }, - "oversized": { - "type": "object", - "properties": { - "count": { - "type": "integer" - }, - "percentage": { - "type": "number" - } - } - }, - "waiting_for_data": { - "type": "object", - "properties": { - "count": { - "type": "integer" - }, - "percentage": { - "type": "number" - } - } - }, - "idling": { - "type": "object", - "properties": { - "count": { - "type": "integer" - }, - "percentage": { - "type": "number" - } - } - } - } - }, - "conditions": { - "type": "object", - "properties": { - "cpu": { - "type": "object", - "properties": { - "count": { - "type": "integer" - }, - "percentage": { - "type": "number" - }, - "undersized": { - "type": "integer" - }, - "oversized": { - "type": "integer" - }, - "under_pressure": { - "type": "integer" - } - } - }, - "io": { - "type": "object", - "properties": { - "count": { - "type": "integer" - }, - "percentage": { - "type": "number" - }, - "undersized": { - "type": "integer" - }, - "oversized": { - "type": "integer" - }, - "under_pressure": { - "type": "integer" - } - } - }, - "memory": { - "type": "object", - "properties": { - "count": { - "type": "integer" - }, - "percentage": { - "type": "number" - }, - "undersized": { - "type": "integer" - }, - "oversized": { - "type": "integer" - }, - "under_pressure": { - "type": "integer" - } - } - }, - "instance_types_highlights": { - "type": "object", - "properties":{ - "current": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "count": { - "type": "integer" - }, - "desc": { - "type": "string" - } - } - }, - "suggested": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "count": { - "type": "integer" - }, - "desc": { - "type": "string" - } - } - }, - "historical": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "count": { - "type": "integer" - }, - "desc": { - "type": "string" - } - } - } - } - }, - "meta": { - "type": "object", - "properties": { - "total_count": { - "type": "integer" - }, - "non_optimized_count": { - "type": "integer" - }, - "conditions_count": { - "type": "integer" - }, - "stale_count": { - "type": "integer" - }, - "non_psi_count": { - "type": "integer" - }, - "psi_enabled_count": { - "type": "integer" - } - } - } - } - } - } - }, - "PerformanceItem": { - "type": "object", - "properties": { - "cpu": { - "type": "integer" - }, - "memory": { - "type": "integer" - }, - "max_io": { - "type": "number" - }, - "io_all": { - "type": "object" - }, - "report_date": { - "type": "string" - } - } - }, - "SuggestionsList": { - "type": "object", - "properties": { - "inventory_id": { - "type": "string" - }, - "meta": { - "type": "object", - "properties": { - "count": { - "type": "integer" - } - } - }, - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/SuggestionsItem" - } - } - } - }, - "SuggestionsItem": { - "type": "object", - "properties": { - "rule_id": { - "type": "string" - }, - "description": { - "type": "string" - }, - "reason": { - "type": "string" - }, - "resolution": { - "type": "string" - }, - "condition": { - "type": "string" - }, - "detected_issues": { - "type": "string" - }, - "suggested_instances": { - "type": "string" - }, - "current_instance": { - "type": "string" - }, - "psi_enabled": { - "type": "boolean" - } - } - }, - "Rating": { - "type": "object", - "properties": { - "inventory_id": { - "type": "string" - }, - "rating": { - "type": "integer", - "enum": [-1, 0, 1] - } - } - }, - "Message": { - "type": "object", - "properties": { - "message": { - "type": "string", - "description": "Message text" - } - } - }, - "SuggestedInstanceTypes": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/SuggestedInstanceTypesItem" - } - }, - "links": { - "$ref": "#/components/schemas/Links" - }, - "meta": { - "$ref": "#/components/schemas/ListMeta" - } - } - }, - "SuggestedInstanceTypesItem": { - "type": "object", - "properties": { - "instance_type": { - "type": "string" - }, - "cloud_provider": { - "type": "string" - }, - "system_count": { - "type": "integer" - }, - "description": { - "type": "string" - } - } - } - }, - "parameters": { - "limitParam": { - "name": "limit", - "in": "query", - "required": false, - "description": "Number of items to return", - "schema": { - "type": "integer", - "default": 10 - } - }, - "offsetParam": { - "name": "offset", - "in": "query", - "required": false, - "description": "Number of items to skip before starting to collect the result set", - "schema": { - "type": "integer", - "default": 0 - } - }, - "orderByParam": { - "name": "order_by", - "in": "query", - "required": false, - "description": "Ordering field name, defaults to report_date", - "schema": { - "type": "string", - "default": "report_date", - "enum": [ - "display_name", - "cpu", - "memory", - "max_io", - "number_of_suggestions", - "state", - "os", - "report_date", - "group_name" - ] - } - }, - "orderHowParam": { - "name": "order_how", - "in": "query", - "required": false, - "description": "Direction of the ordering, defaults to DESC", - "schema": { - "type": "string", - "default": "DESC", - "enum": [ - "ASC", - "DESC" - ] - } - }, - "filterParam": { - "name": "display_name", - "in": "query", - "required": false, - "description": "Filter system with the given display name ", - "schema": { - "type": "string" - } - }, - "filterStateParam": { - "name": "state", - "in": "query", - "required": false, - "description": "Filter system with the given state", - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "Idling", - "Oversized", - "Undersized", - "Optimized", - "Under pressure", - "Waiting for data" - ] - } - } - }, - "filterOSParam": { - "name": "os", - "in": "query", - "required": false, - "description": "Filter system with the given RHEL OS version. Eg, 8.4", - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "filterGroupParam": { - "name": "group_name", - "in": "query", - "required": false, - "description": "Filter systems by given group name", - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "filterInstanceType": { - "name": "instance_type", - "in": "query", - "required": false, - "description": "Filter by instance type's name", - "schema": { - "type": "string" - } - - }, - "SuggestedInstanceTypeOrderByParam": { - "name": "order_by", - "in": "query", - "required": false, - "description": "Ordering field name, defaults to system count", - "schema": { - "type": "string", - "default": "system_count", - "enum": [ - "instance_type", - "system_count" - ] - } - } - - }, - "securitySchemes": { - "RhIdentity": { - "in": "header", - "name": "x-rh-identity", - "description": "Base64-encoded JSON identity header provided by 3Scale. Contains an account number of the user issuing the request. Format of the JSON{'identity': {'account_number': '12345678'}}", - "type": "apiKey" - } - } - } -} diff --git a/ros/processor/event_producer.py b/ros/processor/event_producer.py deleted file mode 100644 index 2298a79c..00000000 --- a/ros/processor/event_producer.py +++ /dev/null @@ -1,68 +0,0 @@ -import json -from confluent_kafka import KafkaError -from datetime import datetime, timezone -from ros.lib.models import PerformanceProfile -from ros.lib.config import NOTIFICATIONS_TOPIC, get_logger -from ros.lib.utils import systems_ids_for_existing_profiles -from ros.lib.constants import Notification - -logger = get_logger(__name__) - - -def notification_payload(host, system_previous_state, system_current_state): - - org_id = host.get("org_id") - query = systems_ids_for_existing_profiles(org_id) - systems_with_suggestions = query.filter(PerformanceProfile.number_of_recommendations > 0).count() - payload = { - "bundle": Notification.BUNDLE.value, - "application": Notification.APPLICATION.value, - "event_type": Notification.EVENT_TYPE.value, - "timestamp": datetime.now(timezone.utc).isoformat(), - "account_id": host.get("account") or "", - "org_id": org_id, - "context": { - "event_name": "New suggestion", - "systems_with_suggestions": systems_with_suggestions, - "display_name": host.get('display_name'), - "inventory_id": host.get('id') - }, - "events": [ - { - "metadata": {}, - "payload": { - "display_name": host.get('display_name'), - "inventory_id": host.get('id'), - "message": f"{host.get('display_name')} has a new suggestion.", - "previous_state": system_previous_state, - "current_state": system_current_state - }, - } - ], - } - return payload - - -def delivery_report(err, msg, request_id): - try: - if not err: - logger.info( - f"Message delivered to {msg.topic()} [{msg.partition()}] for request_id [{request_id}]" - ) - return - - logger.error( - f"Message delivery for topic {msg.topic()} failed for request_id [{err}]: {request_id}" - ) - except KafkaError: - logger.exception( - f"Failed to produce message to [{NOTIFICATIONS_TOPIC}] topic: {request_id}" - ) - - -def new_suggestion_event(host, platform_metadata, system_previous_state, system_current_state, producer): - request_id = platform_metadata.get('request_id') - payload = notification_payload(host, system_previous_state, system_current_state) - bytes_ = json.dumps(payload).encode('utf-8') - producer.produce(NOTIFICATIONS_TOPIC, bytes_, on_delivery=lambda err, msg: delivery_report(err, msg, request_id)) - producer.poll() diff --git a/ros/processor/garbage_collector.py b/ros/processor/garbage_collector.py deleted file mode 100644 index 37d55bbe..00000000 --- a/ros/processor/garbage_collector.py +++ /dev/null @@ -1,60 +0,0 @@ -from ros.lib.app import app -from ros.extensions import db -from ros.lib.models import PerformanceProfile, PerformanceProfileHistory -from datetime import datetime, timedelta, timezone -from ros.lib.config import GARBAGE_COLLECTION_INTERVAL, DAYS_UNTIL_STALE, METRICS_PORT, get_logger -from ros.lib.cw_logging import commence_cw_log_streaming -from prometheus_client import start_http_server -import time - -LOG = get_logger(__name__) - - -class GarbageCollector(): - def __init__(self): - self.prefix = 'GARBAGE COLLECTOR' - - def run(self): - while True: - self.remove_outdated_data() - time.sleep(GARBAGE_COLLECTION_INTERVAL) - - def remove_outdated_data(self): - try: - time_value = datetime.now(timezone.utc) - timedelta( - days=DAYS_UNTIL_STALE) - with app.app_context(): - deleted_history = db.session.execute( - db.delete(PerformanceProfileHistory).filter( - PerformanceProfileHistory.report_date < time_value - ) - ) - - if deleted_history.rowcount > 0: - LOG.info( - f"{self.prefix} - Deleted {deleted_history.rowcount} outdated history record(s) " - f"older than {DAYS_UNTIL_STALE} days" - ) - - deleted_profiles = db.session.execute( - db.delete(PerformanceProfile).filter(PerformanceProfile.report_date < time_value) - ) - - if deleted_profiles.rowcount > 0: - LOG.info( - f"{self.prefix} - Deleted {deleted_profiles.rowcount} outdated performance profile(s) " - f"older than {DAYS_UNTIL_STALE} days" - ) - db.session.commit() - except Exception as error: # pylint: disable=broad-except - LOG.error( - f"{self.prefix} - Could not remove outdated records " - f"due to the following error {str(error)}." - ) - - -if __name__ == "__main__": - start_http_server(int(METRICS_PORT)) - commence_cw_log_streaming('ros-garbage-collector') - processor = GarbageCollector() - processor.run() diff --git a/ros/processor/insights_engine_consumer.py b/ros/processor/insights_engine_consumer.py deleted file mode 100644 index c0ecab9c..00000000 --- a/ros/processor/insights_engine_consumer.py +++ /dev/null @@ -1,277 +0,0 @@ -import json -from ros.lib import consume, produce -from ros.lib.app import app -from ros.extensions import db, cache -from datetime import datetime, timezone -from confluent_kafka import KafkaException -from ros.lib.models import RhAccount, System -from ros.lib.config import ( - ENGINE_RESULT_TOPIC, - METRICS_PORT, - get_logger, - CACHE_KEYWORD_FOR_DELETED_SYSTEM -) -from ros.processor.process_archive import get_performance_profile -from ros.processor.event_producer import new_suggestion_event -from ros.lib.cw_logging import commence_cw_log_streaming, threadctx -from prometheus_client import start_http_server -from ros.lib.constants import SystemStatesWithKeys -from ros.lib.utils import ( - get_or_create, - cast_iops_as_float, - insert_performance_profiles, - system_allowed_in_ros, -) -from ros.processor.metrics import (processor_requests_success, - processor_requests_failures, - kafka_failures) - -LOG = get_logger(__name__) - -producer = None - - -def topmost_candidate_from_rule_hit(reports, state_key): - if state_key in ["OPTIMIZED", "NO_PCP_DATA"]: - return [None, None] - all_instances = reports[0]['details']['candidates'] - return all_instances[0] - - -class InsightsEngineConsumer: - def __init__(self): - """Create Engine Consumer.""" - self.consumer = consume.init_consumer(ENGINE_RESULT_TOPIC) - - self.prefix = 'PROCESSING ENGINE RESULTS' - self.reporter = 'INSIGHTS ENGINE' - - def __iter__(self): - return self - - def __next__(self): - msg = self.consumer.poll() - if msg is None: - raise StopIteration - return msg - - def run(self): - LOG.info(f"{self.prefix} - Processor is running. Awaiting msgs.") - - # initialize producer - global producer - producer = produce.init_producer() - - for msg in iter(self): - if msg.error(): - LOG.error(f"{self.prefix} - Consumer error: {msg.error()}") - kafka_failures.labels(reporter=self.reporter).inc() - raise KafkaException(msg.error()) - try: - msg = json.loads(msg.value().decode("utf-8")) - self.handle_msg(msg) - except json.decoder.JSONDecodeError: - kafka_failures.labels(reporter=self.reporter).inc() - LOG.error( - f"{self.prefix} - Unable to decode kafka message: {msg.value()}" - ) - except Exception as err: - processor_requests_failures.labels( - reporter=self.reporter, - org_id=msg["input"]["platform_metadata"].get('org_id') - ).inc() - LOG.error( - f"{self.prefix} - An error occurred during message processing: {repr(err)}" - ) - finally: - self.consumer.commit() - - def handle_msg(self, msg): - with app.app_context(): - if system_allowed_in_ros(msg, self.reporter): - host = msg["input"]["host"] - platform_metadata = msg["input"]["platform_metadata"] - system_metadata = msg["results"]["system"]["metadata"] - - threadctx.request_id = platform_metadata.get('request_id') - threadctx.account = platform_metadata.get('account') - threadctx.org_id = platform_metadata.get('org_id') - - cache_key = (f"{platform_metadata.get('org_id')}" - f"{CACHE_KEYWORD_FOR_DELETED_SYSTEM}{host['id']}") - if cache.get(cache_key): - LOG.info( - f"{self.prefix} - Received a msg for deleted system " - f"with inventory id: {host['id']}. Hence, rejecting a msg." - ) - return - performance_record = get_performance_profile( - platform_metadata['url'], - platform_metadata.get('org_id'), - host['id'], - custom_prefix=self.prefix - ) - - reports = [] - if msg["results"]["reports"] \ - and isinstance(msg["results"]["reports"], list): - reports = msg["results"]["reports"] - ros_reports = [ - report for report in reports - if 'ros_instance_evaluation' in report["rule_id"] - ] - self.process_report(host, platform_metadata, ros_reports, - system_metadata, performance_record) - - def process_report(self, host, platform_metadata, reports, system_metadata, performance_record): - """create/update system and performance_profile based on reports data.""" - with app.app_context(): - try: - account = get_or_create( - db.session, RhAccount, 'org_id', - account=host['account'], - org_id=platform_metadata.get('org_id') - ) - if len(reports) == 0: - rec_count = len(reports) - state_key = "OPTIMIZED" - LOG.info( - f"{self.prefix} - No ROS rule hits found for system with inventory id: {host['id']}. " - f"Hence, marking the state as {SystemStatesWithKeys[state_key].value}." - ) - else: - state_key = reports[0].get('key') - rec_count = 0 if state_key == 'NO_PCP_DATA' else len(reports) - LOG.info( - f"{self.prefix} - Marking the state of system with " - f"inventory id: {host['id']} as {SystemStatesWithKeys[state_key].value}" - ) - - # get previous state of the system - system_previous_state = db.session.scalar(db.select(System.state) - .filter(System.inventory_id == host['id'])) - - system_attrs = { - 'tenant_id': account.id, - 'inventory_id': host['id'], - 'display_name': host['display_name'], - 'fqdn': host['fqdn'], - 'state': SystemStatesWithKeys[state_key].value, - 'instance_type': performance_record.get('instance_type'), - 'region': performance_record.get('region'), - 'cloud_provider': system_metadata.get('cloud_provider'), - 'groups': host.get('groups', []) - } - - # get current state of the system - system_current_state = system_attrs['state'] - - if reports and 'states' in reports[0]['details'].keys(): - substates = reports[0]['details']['states'] - else: - substates = {} - - system_attrs.update({ - 'cpu_states': substates.get('cpu'), - 'io_states': substates.get('io'), - 'memory_states': substates.get('memory') - }) - - system = get_or_create( - db.session, System, 'inventory_id', **system_attrs) - LOG.info( - f"{self.prefix} - System {host['id']} created/updated successfully." - ) - - set_default_utilization = False - # For Optimized state, reports would be empty, but system_metadata would be present - if reports and reports[0].get('key') == 'NO_PCP_DATA': - set_default_utilization = True - - if set_default_utilization is False: - performance_utilization = { - 'memory': int(system_metadata['mem_utilization']), - 'cpu': int(system_metadata['cpu_utilization']), - 'io': cast_iops_as_float(system_metadata['io_utilization']) - } - # max_io will be used to sort systems endpoint response instead of io - performance_utilization.update( - {'max_io': max(performance_utilization['io'].values())} - ) - else: - LOG.debug(f"{self.prefix} - Setting default utilization for performance profile") - performance_utilization = { - 'memory': -1, - 'cpu': -1, - 'max_io': -1.0, - 'io': {} - } - # Following are saved on respective system record - del performance_record['instance_type'] - del performance_record['region'] - - top_candidate, top_candidate_price = topmost_candidate_from_rule_hit(reports, state_key) - pprofile_fields = { - "system_id": system.id, - "performance_record": performance_record, - "performance_utilization": performance_utilization, - "report_date": datetime.now(timezone.utc), - "rule_hit_details": reports, - "number_of_recommendations": -1 if state_key == 'NO_PCP_DATA' else rec_count, - "state": SystemStatesWithKeys[state_key].value, - "operating_system": system.operating_system, - 'psi_enabled': system_metadata.get('psi_enabled'), - 'top_candidate': top_candidate, - 'top_candidate_price': top_candidate_price, - } - - insert_performance_profiles( - db.session, system.id, pprofile_fields) - LOG.info( - f"{self.prefix} - Performance profile created/updated successfully for the system: {host['id']}" - ) - db.session.commit() - - # Trigger event for notification - self.trigger_notification( - system.inventory_id, account, host, platform_metadata, system_previous_state, system_current_state - ) - - processor_requests_success.labels( - reporter=self.reporter, org_id=account.org_id - ).inc() - LOG.info( - f"{self.prefix} - Refreshed system {system.inventory_id} ({system.id}) " - f"belonging to account: {account.account} ({account.id}) and org_id: {account.org_id}" - ) - except Exception as err: - processor_requests_failures.labels( - reporter=self.reporter, org_id=account.org_id - ).inc() - LOG.error( - f"{self.prefix} - Unable to add system {host['id']} to DB " - f"belonging to account: {account.account} " - f"and org_id: {account.org_id} - {repr(err)}" - ) - - def trigger_notification( - self, inventory_id, account, host, platform_metadata, system_previous_state, system_current_state - ): - if system_previous_state is not None: - if system_current_state not in ( - SystemStatesWithKeys.OPTIMIZED.value, - system_previous_state - ): - LOG.info( - f"{self.prefix} - Triggering a new suggestion event for the system: {inventory_id} belonging" - f" to account: {account.account} ({account.id}) and org_id: {account.org_id}" - ) - new_suggestion_event(host, platform_metadata, system_previous_state, system_current_state, producer) - - -if __name__ == "__main__": - start_http_server(int(METRICS_PORT)) - cache.init_app(app) - commence_cw_log_streaming('ros-processor') - processor = InsightsEngineConsumer() - processor.run() diff --git a/ros/processor/inventory_events_consumer.py b/ros/processor/inventory_events_consumer.py deleted file mode 100644 index f2ec660a..00000000 --- a/ros/processor/inventory_events_consumer.py +++ /dev/null @@ -1,236 +0,0 @@ -import json -import os -import sys -from prometheus_client import start_http_server -from ros.lib import consume -from ros.lib.app import app -from ros.extensions import db, cache -from ros.lib.utils import get_or_create, system_allowed_in_ros, update_system_record -from confluent_kafka import KafkaException -from ros.lib.models import RhAccount, System -from ros.lib.config import ( - INVENTORY_EVENTS_TOPIC, - METRICS_PORT, - get_logger, - CACHE_TIMEOUT_FOR_DELETED_SYSTEM, - CACHE_KEYWORD_FOR_DELETED_SYSTEM -) -from ros.lib.cw_logging import commence_cw_log_streaming, threadctx -from ros.processor.metrics import (processor_requests_success, - processor_requests_failures, - kafka_failures) - -LOG = get_logger(__name__) - - -class InventoryEventsConsumer: - """Inventory events consumer.""" - - def __init__(self): - """Create Inventory Events Consumer.""" - self.consumer = consume.init_consumer(INVENTORY_EVENTS_TOPIC) - - self.event_type_map = { - 'delete': self.host_delete_event, - 'created': self.host_create_update_events, - 'updated': self.host_create_update_events - } - self.prefix = 'INVENTORY EVENTS' - self.reporter = 'INVENTORY EVENTS' - - def __iter__(self): - return self - - def __next__(self): - msg = self.consumer.poll() - if msg is None: - raise StopIteration - return msg - - def run(self): - """Initialize Consumer.""" - LOG.info(f"{self.prefix} - Processor is running. Awaiting msgs.") - for msg in iter(self): - if msg.error(): - LOG.error(f"{self.prefix} - Consumer error: {msg.error()}") - kafka_failures.labels(reporter=self.reporter).inc() - raise KafkaException(msg.error()) - - account = None - host_id = None - org_id = None - try: - msg = json.loads(msg.value().decode("utf-8")) - # SEE under consoledot documentation > services > inventory - # where there is a section called event_interface to get - # what keys present in event message. - event_type = msg['type'] - metadata = msg['metadata'] - if event_type == 'delete': - account = msg['account'] - host_id = msg['id'] - org_id = msg['org_id'] - else: - account = msg['host']['account'] - host_id = msg['host']['id'] - org_id = msg['host'].get('org_id') - - threadctx.request_id = None - if metadata is not None and isinstance(metadata, dict): - threadctx.request_id = metadata.get('request_id') - threadctx.account = account - threadctx.org_id = org_id - - if event_type in self.event_type_map.keys(): - handler = self.event_type_map[event_type] - handler(msg) - else: - LOG.info( - f"{self.prefix} - Unknown event of type {event_type}" - ) - except json.decoder.JSONDecodeError: - kafka_failures.labels(reporter=self.reporter).inc() - LOG.error( - f"{self.prefix} - Unable to decode kafka message: {msg.value()}" - ) - except Exception as err: - processor_requests_failures.labels( - reporter=self.reporter, org_id=org_id - ).inc() - _exc_type, _exc_obj, exc_tb = sys.exc_info() - fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] - LOG.error( - f"{self.prefix} - An error occurred: {repr(err)}" - f" in {fname} at {exc_tb.tb_lineno} for a system {host_id}" - f" from account: {account} & org_id: {org_id}" - ) - finally: - self.consumer.commit() - LOG.warning("Stopping inventory consumer") - self.consumer.close() - - def host_delete_event(self, msg): - """Process delete message.""" - self.prefix = "INVENTORY DELETE EVENT" - host_id = msg['id'] - with app.app_context(): - LOG.debug( - f"{self.prefix} - Received a message for system with inventory_id {host_id}" - ) - - rows_deleted = db.session.execute(db.delete(System).filter(System.inventory_id == host_id)) - db.session.commit() - - if rows_deleted.rowcount == 1: - processor_requests_success.labels( - reporter=self.reporter, org_id=msg['org_id'] - ).inc() - LOG.info( - f"{self.prefix} - Deleted system with inventory id: {host_id}" - ) - cache_key = (f"{msg['org_id']}{CACHE_KEYWORD_FOR_DELETED_SYSTEM}" - f'{host_id}') - cache.set( - cache_key, 1, timeout=CACHE_TIMEOUT_FOR_DELETED_SYSTEM - ) - - def host_create_update_events(self, msg): - """ Process created/updated message ( create system record, store new report )""" - self.prefix = "INVENTORY Update EVENT" if msg['type'] == 'updated' else "INVENTORY CREATE EVENT" - if system_allowed_in_ros(msg, self.reporter): - LOG.info( - f"{self.prefix} - Processing a message for system({msg['host']['id']}) " - f"belonging to account: {msg['host']['account']} and org_id: {msg['host'].get('org_id')}" - ) - self.process_system_details(msg) - - def process_system_details(self, msg): - """ Store new system information (stale, stale_warning timestamp) and return internal DB id""" - host = msg['host'] - with app.app_context(): - if (msg.get('type') == 'updated'): - system_fields = { - "inventory_id": host['id'], - "display_name": host['display_name'], - "fqdn": host['fqdn'], - "stale_timestamp": host['stale_timestamp'], - "groups": host.get('groups', []) - } - - operating_system = host['system_profile'].get('operating_system') - cloud_provider = host['system_profile'].get('cloud_provider') - if (operating_system is not None): - system_fields.update({"operating_system": operating_system}) - if (cloud_provider is not None): - system_fields.update({"cloud_provider": cloud_provider}) - - system = update_system_record(db.session, **system_fields) - if system is not None: - db.session.commit() - account = db.session.scalar(db.select(RhAccount).filter_by(id=system.tenant_id)) - processor_requests_success.labels( - reporter=self.reporter, org_id=account.org_id - ).inc() - LOG.info( - f"{self.prefix} - Refreshed system {system.inventory_id} ({system.id}) " - f"belonging to account: {account.account} ({account.id}) and org_id: {account.org_id}" - ) - self.expired_del_cache_if_exists( - host['id'], account.org_id - ) - else: - try: - account = get_or_create( - db.session, RhAccount, 'org_id', - account=host['account'], - org_id=host.get('org_id') - ) - - system_fields = { - "tenant_id": account.id, - "inventory_id": host['id'], - "display_name": host['display_name'], - "fqdn": host['fqdn'], - "cloud_provider": host['system_profile']['cloud_provider'], - "stale_timestamp": host['stale_timestamp'], - "operating_system": host['system_profile'].get('operating_system'), - "groups": host.get('groups', []) - } - system = get_or_create(db.session, System, 'inventory_id', **system_fields) - - # Commit changes - db.session.commit() - processor_requests_success.labels( - reporter=self.reporter, org_id=account.org_id - ).inc() - LOG.info( - f"{self.prefix} - Refreshed system {system.inventory_id} ({system.id}) " - f"belonging to account: {account.account} ({account.id}) and org_id: {account.org_id}" - ) - self.expired_del_cache_if_exists( - host['id'], account.org_id - ) - except Exception as err: - processor_requests_failures.labels( - reporter=self.reporter, org_id=account.org_id - ).inc() - - LOG.error( - f"{self.prefix} - Unable to add system {host['id']} to DB " - f"belonging to account: {account.account} and org_id: {account.org_id} - {err}" - ) - - def expired_del_cache_if_exists(self, host_id, org_id): - with app.app_context(): - cache_key = (f"{org_id}{CACHE_KEYWORD_FOR_DELETED_SYSTEM}" - f'{host_id}') - if cache.get(cache_key): - cache.delete(cache_key) - - -if __name__ == "__main__": - start_http_server(int(METRICS_PORT)) - cache.init_app(app) - commence_cw_log_streaming('ros-processor') - processor = InventoryEventsConsumer() - processor.run() diff --git a/run_org_id_populator.yaml b/run_org_id_populator.yaml deleted file mode 100644 index d36b8ed2..00000000 --- a/run_org_id_populator.yaml +++ /dev/null @@ -1,9 +0,0 @@ ---- -apiVersion: cloud.redhat.com/v1alpha1 -kind: ClowdJobInvocation -metadata: - name: populate-org-id-column -spec: - appName: ros-backend - jobs: - - org-id-populator \ No newline at end of file diff --git a/tests/conftest.py b/tests/conftest.py deleted file mode 100644 index c776beed..00000000 --- a/tests/conftest.py +++ /dev/null @@ -1,5 +0,0 @@ -pytest_plugins = [ - "tests.fixtures.db_fixtures", - "tests.fixtures.db_fixtures_for_inventory_groups", - "tests.fixtures.redis_fixture", -] diff --git a/tests/test_api_endpoints.py b/tests/test_api_endpoints.py deleted file mode 100644 index e99284a5..00000000 --- a/tests/test_api_endpoints.py +++ /dev/null @@ -1,802 +0,0 @@ -import datetime -import pytest -from dateutil import parser -import json -from base64 import b64encode -from ros.api.main import app -from ros.lib.feature_flags import FLAG_INVENTORY_GROUPS -from ros.lib.models import db, PerformanceProfile, System -from tests.helpers.db_helper import db_get_host, db_get_record -from pathlib import Path - - -def assert_report_date_with_current_date(report_date): - date_format = "%m/%d/%Y" - report_date = parser.parse(report_date).strftime(date_format) - utcnow_date = str(datetime.datetime.utcnow().strftime(date_format)) - assert report_date == utcnow_date - - -def test_status(): - with app.test_client() as client: - response = client.get('/api/ros/v1/status') - assert response.status_code == 200 - assert response.json["status"] == "Application is running!" - - -def test_is_configured(auth_token, db_setup, db_create_account, db_create_system, db_create_performance_profile): - with app.test_client() as client: - response = client.get('/api/ros/v1/is_configured', headers={"x-rh-identity": auth_token}) - sys_response = client.get('/api/ros/v1/systems', headers={"x-rh-identity": auth_token}) - assert response.status_code == 200 - assert response.json["count"] == 1 - assert response.json["systems_stats"]["with_suggestions"] == 1 - assert response.json["systems_stats"]["waiting_for_data"] == 0 - assert response.json["count"] == sys_response.json["meta"]["count"] - - -def test_systems(auth_token, db_setup, db_create_account, db_create_system, db_create_performance_profile): - with app.test_client() as client: - response = client.get('/api/ros/v1/systems', headers={"x-rh-identity": auth_token}) - assert response.status_code == 200 - assert response.json["meta"]["count"] == 1 - assert response.json["data"][0]["os"] == "RHEL 8.4" - assert response.json["data"][0]["groups"] == [] - - -def test_system_detail(auth_token, db_setup, db_create_account, db_create_system, db_create_performance_profile): - with app.test_client() as client: - response = client.get( - '/api/ros/v1/systems/ee0b9978-fe1b-4191-8408-cbadbd47f7a3', # inventory_id from db_create_system - headers={"x-rh-identity": auth_token} - ) - assert response.status_code == 200 - assert response.json["inventory_id"] == 'ee0b9978-fe1b-4191-8408-cbadbd47f7a3' - assert response.json["os"] == "RHEL 8.4" # from db fixture - assert_report_date_with_current_date(response.json["report_date"]) - - -def test_system_history(auth_token, db_setup, db_create_account, - db_create_system, db_create_performance_profile_history): - with app.test_client() as client: - response = client.get( - '/api/ros/v1/systems/ee0b9978-fe1b-4191-8408-cbadbd47f7a3/history', - headers={"x-rh-identity": auth_token} - ) - assert response.status_code == 200 - assert response.json["meta"]["count"] == 1 - assert_report_date_with_current_date( - response.json["data"][0]["report_date"] - ) - assert response.json["inventory_id"] == 'ee0b9978-fe1b-4191-8408-cbadbd47f7a3' - - -def test_system_no_os(auth_token, db_setup, db_create_account, db_create_system, db_create_performance_profile): - # Setting db_record.operating_system to None/null - system_record = db_get_host('ee0b9978-fe1b-4191-8408-cbadbd47f7a3') - system_record.operating_system = None - db.session.commit() - - with app.test_client() as client: - response_individual_system = client.get( - '/api/ros/v1/systems/ee0b9978-fe1b-4191-8408-cbadbd47f7a3', - headers={"x-rh-identity": auth_token} - ) - - assert response_individual_system.status_code == 200 - assert response_individual_system.json["os"] is None - - response_all_systems = client.get( - '/api/ros/v1/systems', - headers={"x-rh-identity": auth_token} - ) - - assert response_all_systems.status_code == 200 - assert response_all_systems.json["data"][0]["os"] is None - - -def test_system_os_filter(auth_token, db_setup, db_create_account, db_create_system, db_create_performance_profile): - with app.test_client() as client: - response = client.get( - '/api/ros/v1/systems?os=8.4', - headers={"x-rh-identity": auth_token} - ) - assert response.status_code == 200 - assert response.json["meta"]["count"] == 1 - assert response.json["data"][0]["os"] == "RHEL 8.4" - - -def test_system_groups( - auth_token, db_setup, db_create_account, db_create_system, db_create_performance_profile, mocker): - with app.test_client() as client: - response_all_systems = client.get( - '/api/ros/v1/systems', - headers={"x-rh-identity": auth_token} - ) - assert response_all_systems.status_code == 200 - assert response_all_systems.json["data"][0]["groups"] == [] - - system = db_get_record(System) - system.groups = [{ - "id": "12345678-fe1b-4191-8408-cbadbd47f7a3", - "name": "ros-test-3" - }] - db.session.commit() - - with app.test_client() as client: - mock_enable_rbac(mocker) - mock_rbac(get_rbac_mock_file("mock_rbac_returns_groups_including_example_group.json"), mocker) - - mock_unleash_hbi_flag_enabled(mocker) - response_all_systems = client.get( - '/api/ros/v1/systems', - headers={"x-rh-identity": auth_token} - ) - assert response_all_systems.status_code == 200 - assert response_all_systems.json["data"][0]["groups"] == [{ - "id": "12345678-fe1b-4191-8408-cbadbd47f7a3", - "name": "ros-test-3" - }] - - -def test_system_group_filter( - auth_token, db_setup, db_create_account, db_create_system, db_create_performance_profile, mocker): - system = db_get_record(System) - system.groups = [{ - "id": "12345678-fe1b-4191-8408-cbadbd47f7a3", - "name": "ros-group-test" - }] - db.session.commit() - - with app.test_client() as client: - mock_enable_rbac(mocker) - mock_rbac(get_rbac_mock_file("mock_rbac_returns_groups_including_example_group.json"), mocker) - mock_unleash_hbi_flag_enabled(mocker) - response = client.get( - '/api/ros/v1/systems?group_name=ros-group-test', - headers={"x-rh-identity": auth_token} - ) - assert response.status_code == 200 - assert response.json["meta"]["count"] == 1 - assert response.json["data"][0]["groups"][0]["name"] == "ros-group-test" - - -def test_system_suggestions( - auth_token, - db_setup, - db_create_account, - db_create_system, - db_create_performance_profile, - db_instantiate_rules -): - with app.test_client() as client: - response = client.get( - '/api/ros/v1/systems/ee0b9978-fe1b-4191-8408-cbadbd47f7a3/suggestions', - headers={"x-rh-identity": auth_token} - ) - assert response.status_code == 200 - assert response.json["inventory_id"] == 'ee0b9978-fe1b-4191-8408-cbadbd47f7a3' - assert response.json["meta"]["count"] == 1 - assert response.json["data"][0]["rule_id"] == "ros_instance_evaluation|INSTANCE_IDLE" - assert not response.json["data"][0]['psi_enabled'] - - -def test_system_under_pressure_suggestions( - auth_token, - db_setup, - db_create_account, - db_create_system, - db_create_performance_profile_for_under_pressure, - db_instantiate_rules -): - rule_id = 'ros_instance_evaluation|INSTANCE_OPTIMIZED_UNDER_PRESSURE' - with app.test_client() as client: - response = client.get( - '/api/ros/v1/systems/ee0b9978-fe1b-4191-8408-cbadbd47f7a3/suggestions', - headers={"x-rh-identity": auth_token} - ) - assert response.status_code == 200 - assert response.json["inventory_id"] == 'ee0b9978-fe1b-4191-8408-cbadbd47f7a3' - assert response.json["meta"]["count"] == 1 - assert response.json["data"][0]['rule_id'] == rule_id - assert response.json["data"][0]['psi_enabled'] - - -def test_system_rating( - auth_token, - db_setup, - db_create_account, - db_create_system, - db_create_performance_profile -): - with app.test_client() as client: - data_dict = { - "inventory_id": "ee0b9978-fe1b-4191-8408-cbadbd47f7a3", - "rating": -1 - } - response = client.post( - '/api/ros/v1/rating', - headers={"x-rh-identity": auth_token}, - data=json.dumps(data_dict) - ) - assert response.status_code == 201 - assert response.json["inventory_id"] == data_dict['inventory_id'] - assert response.json["rating"] == data_dict['rating'] - - # Checking if the set rating shows up on system detail - test_host_detail = client.get( - '/api/ros/v1/systems/ee0b9978-fe1b-4191-8408-cbadbd47f7a3', - headers={"x-rh-identity": auth_token} - ) - assert test_host_detail.json["rating"] == data_dict['rating'] - - -def test_system_rating_with_invalid_args( - auth_token, - db_setup, - db_create_account, - db_create_system, - db_create_performance_profile -): - with app.test_client() as client: - response = client.post( - '/api/ros/v1/rating', - headers={"x-rh-identity": auth_token}, - data='inventory_id' - ) - assert response.status_code == 400 - assert response.json["message"] == 'Decoding JSON has failed.' - - -def test_system_rating_with_invalid_rating_choice( - auth_token, - db_setup, - db_create_account, - db_create_system, - db_create_performance_profile -): - with app.test_client() as client: - data_dict = { - "inventory_id": "ee0b9978-fe1b-4191-8408-cbadbd47f7a3", - "rating": 4 - } - response = client.post( - '/api/ros/v1/rating', - headers={"x-rh-identity": auth_token}, - data=json.dumps(data_dict) - ) - assert response.status_code == 422 - - -def test_system_rating_with_invalid_rating_value( - auth_token, - db_setup, - db_create_account, - db_create_system, - db_create_performance_profile -): - with app.test_client() as client: - data_dict = { - "inventory_id": "ee0b9978-fe1b-4191-8408-cbadbd47f7a3", - "rating": "-1;start-sleep -s 15 #" - } - response = client.post( - '/api/ros/v1/rating', - headers={"x-rh-identity": auth_token}, - data=json.dumps(data_dict) - ) - assert response.status_code == 400 - - -def test_system_rating_with_invalid_system( - auth_token, - db_setup, - db_create_account, - db_create_system, - db_create_performance_profile -): - with app.test_client() as client: - data_dict = { - "inventory_id": "cbadbd47f7a3", - "rating": 1 - } - response = client.post( - '/api/ros/v1/rating', - headers={"x-rh-identity": auth_token}, - data=json.dumps(data_dict) - ) - assert response.status_code == 404 - - -def test_should_check_authorization_for_rating_request( - auth_token, - db_setup, - db_create_account, - db_create_system, - db_create_performance_profile -): - identity = { - "identity": { - "account_number": "67890", - "type": "User", - "user": { - "username": "t1@redhat.com", - "email": "t1@redhat.com" - }, - "org_id": "000002", - "internal": { - "org_id": "000002" - } - } - } - auth_token_for_t1 = b64encode(json.dumps(identity).encode('utf-8')).decode() - with app.test_client() as client: - data_dict = { - "inventory_id": "ee0b9978-fe1b-4191-8408-cbadbd47f7a3", - "rating": "-1" - } - response = client.post( - '/api/ros/v1/rating', - headers={"x-rh-identity": auth_token_for_t1}, - data=json.dumps(data_dict) - ) - assert response.status_code == 404 - - -def test_executive_report( - auth_token, - db_setup, - db_create_account, - db_create_system, - db_create_performance_profile -): - with app.test_client() as client: - response = client.get( - '/api/ros/v1/executive_report', - headers={"x-rh-identity": auth_token} - ) - assert response.json['systems_per_state']['idling']['count'] == 1 - assert response.json['systems_per_state']['idling']['percentage'] == 100 - assert response.json['conditions']['cpu']['count'] == 2 - assert response.json['conditions']['io']['count'] == 1 - assert response.json['conditions']['memory']['count'] == 2 - - -def test_candidates_region_info_in_executive_report( - auth_token, - db_setup, - db_create_account, - db_create_system, - db_create_performance_profile -): - region_info = 'ap-south-1' - candidate_type = 't2.micro' - with app.test_client() as client: - response = client.get( - '/api/ros/v1/executive_report', - headers={"x-rh-identity": auth_token} - ) - assert response.json - assert response.status_code == 200 - current_section = response.json['instance_types_highlights']['current'] - first_candidate_from_current = current_section[0] - - assert current_section - assert first_candidate_from_current['type'] == candidate_type - assert region_info in first_candidate_from_current['desc'] - - -def test_psi_enabled( - auth_token, - db_setup, - db_create_account, - db_create_system, - db_create_performance_profile -): - with app.test_client() as client: - response = client.get( - '/api/ros/v1/executive_report', - headers={"x-rh-identity": auth_token} - ) - assert response.json['meta']['non_psi_count'] == 1 - - performance_profile = db_get_record(PerformanceProfile) - performance_profile.operating_system = {"name": "RHEL", "major": 7, "minor": 7} - db.session.commit() - - with app.test_client() as client: - response = client.get( - '/api/ros/v1/executive_report', - headers={"x-rh-identity": auth_token} - ) - assert response.json['meta']['non_psi_count'] == 0 - - -def test_openapi_endpoint(auth_token): - with open("ros/openapi/openapi.json") as f: - content_from_file = json.loads(f.read()) - f.close() - with app.test_client() as client: - response = client.get( - '/api/ros/v1/openapi.json', - headers={"x-rh-identity": auth_token} - ) - assert response.json == content_from_file - - -def get_rbac_mock_file(filename): - with open(f"{Path(__file__).parent}/data_files/{filename}") as f: - json_data = json.loads(f.read()) - return json_data - - -def mock_enable_rbac(mocker): - mocker.patch('ros.lib.rbac_interface.ENABLE_RBAC', return_value=True) - - -def mock_rbac(json_data, mocker): - mocker.patch('ros.lib.rbac_interface.query_rbac', return_value=json_data) - - -def mock_unleash_hbi_flag_enabled(mocker): - mocker.patch('ros.lib.feature_flags.FLAG_FALLBACK_VALUES', return_value={FLAG_INVENTORY_GROUPS: True}) - - -def test_systems_rbac_returns_ungrouped_and_example_group( - auth_token, - db_setup, - db_create_account, - db_create_system, - system_with_example_group, - system_with_test_group, - system_with_foo_group, - db_create_performance_profile, - create_performance_profiles, - mocker): - """This is to test filtering of system groups when RBAC returns one or more group(s) in response. - While filtering based on groups we check if group id we get from are there in the System's group field - It is expected that we also return systems which are in no groups""" - with app.test_client() as client: - mock_unleash_hbi_flag_enabled(mocker) - mock_enable_rbac(mocker) - mock_rbac(get_rbac_mock_file("mock_rbac_returns_groups_including_example_group.json"), mocker) - response = client.get('/api/ros/v1/systems', headers={"x-rh-identity": auth_token}) - assert response.status_code == 200 - assert response.json["meta"]["count"] == 2 - assert response.json["data"][0]["groups"][0]["name"] == "example-group" - assert response.json["data"][1]["groups"] == [] - - -def test_systems_rbac_returns_emtpy_group( - auth_token, - db_setup, - db_create_account, - db_create_system, - system_with_example_group, - system_with_test_group, - system_with_foo_group, - db_create_performance_profile, - create_performance_profiles, - mocker): - """This is to test filtering of system groups when RBAC returns no groups in response however group.id is present. - This is the situation when user has no groups created however groups as features in enabled from inventory - In this case we can only return the systems which are not included in any of the groups""" - with app.test_client() as client: - mock_unleash_hbi_flag_enabled(mocker) - mock_enable_rbac(mocker) - mock_rbac(get_rbac_mock_file("mock_rbac_returns_emtpy_group.json"), mocker) - response = client.get('/api/ros/v1/systems', headers={"x-rh-identity": auth_token}) - assert response.status_code == 200 - assert response.json["meta"]["count"] == 1 - assert response.json["data"][0]["groups"] == [] - - -def test_systems_mock_rbac_returns_no_groups( - auth_token, - db_setup, - db_create_account, - db_create_system, - system_with_example_group, - system_with_test_group, - system_with_foo_group, - db_create_performance_profile, - create_performance_profiles, - mocker): - """This is to test filtering of system groups when RBAC does not return group.id at all. - This is the use case where for some reason RBAC does not have group.id included(i.e inventory groups disabled) - In this case we return all the systems because we can't find groups as feature enabled""" - with app.test_client() as client: - mock_unleash_hbi_flag_enabled(mocker) - mock_enable_rbac(mocker) - mock_rbac(get_rbac_mock_file("mock_rbac_returns_no_groups.json"), mocker) - response = client.get('/api/ros/v1/systems', headers={"x-rh-identity": auth_token}) - assert response.status_code == 200 - assert response.json["meta"]["count"] == 4 - - -def test_systems_multiple_inventory_hosts_read_without_ungrouped( - auth_token, - db_setup, - db_create_account, - db_create_system, - system_with_example_group, - system_with_test_group, - system_with_foo_group, - db_create_performance_profile, - create_performance_profiles, - mocker): - with app.test_client() as client: - mock_unleash_hbi_flag_enabled(mocker) - mock_enable_rbac(mocker) - # This mocks example and foo groups - mock_rbac(get_rbac_mock_file("mock_rbac_returns_multiple_read_permissions.json"), mocker) - response = client.get('/api/ros/v1/systems', headers={"x-rh-identity": auth_token}) - assert response.status_code == 200 - assert response.json["meta"]["count"] == 2 - assert response.json["data"][0]["groups"][0]["name"] == "foo-group" - assert response.json["data"][1]["groups"][0]["name"] == "test-group" - - -def test_systems_multiple_types_of_read_permissions_without_ungrouped( - auth_token, - db_setup, - db_create_account, - db_create_system, - system_with_example_group, - system_with_test_group, - system_with_foo_group, - db_create_performance_profile, - create_performance_profiles, - mocker): - with app.test_client() as client: - mock_enable_rbac(mocker) - # This mocks example, test and foo groups - mock_rbac(get_rbac_mock_file("mock_rbac_returns_multiple_types_of_read_permissions.json"), mocker) - response = client.get('/api/ros/v1/systems', headers={"x-rh-identity": auth_token}) - assert response.status_code == 200 - assert response.json["meta"]["count"] == 3 - assert response.json["data"][0]["groups"][0]["name"] == "foo-group" - assert response.json["data"][1]["groups"][0]["name"] == "test-group" - assert response.json["data"][2]["groups"][0]["name"] == "example-group" - - -def test_systems_multiple_types_of_read_permissions_with_ungrouped( - auth_token, - db_setup, - db_create_account, - db_create_system, - system_with_example_group, - system_with_test_group, - system_with_foo_group, - db_create_performance_profile, - create_performance_profiles, - mocker): - with app.test_client() as client: - mock_enable_rbac(mocker) - # This mocks example, test and foo groups - mock_rbac(get_rbac_mock_file("mock_rbac_returns_multiple_types_of_read_permissions_with_ungrouped.json"), - mocker) - response = client.get('/api/ros/v1/systems', headers={"x-rh-identity": auth_token}) - assert response.status_code == 200 - assert response.json["meta"]["count"] == 4 - assert response.json["data"][0]["groups"][0]["name"] == "foo-group" - assert response.json["data"][1]["groups"][0]["name"] == "test-group" - assert response.json["data"][2]["groups"][0]["name"] == "example-group" - assert response.json["data"][3]["groups"] == [] - - -def test_systems_array_of_groups( - auth_token, - db_setup, - db_create_account, - db_create_system, - system_with_example_group, - system_with_test_group, - system_with_foo_group, - db_create_performance_profile, - create_performance_profiles, - mocker): - with app.test_client() as client: - mock_enable_rbac(mocker) - # This mocks example, test and foo groups returned in single array - mock_rbac(get_rbac_mock_file("mock_rbac_returns_array_of_groups.json"), mocker) - response = client.get('/api/ros/v1/systems', headers={"x-rh-identity": auth_token}) - assert response.status_code == 200 - assert response.json["meta"]["count"] == 3 - assert response.json["data"][0]["groups"][0]["name"] == "foo-group" - assert response.json["data"][1]["groups"][0]["name"] == "test-group" - assert response.json["data"][2]["groups"][0]["name"] == "example-group" - - -def test_systems_array_of_groups_with_ungrouped( - auth_token, - db_setup, - db_create_account, - db_create_system, - system_with_example_group, - system_with_test_group, - system_with_foo_group, - db_create_performance_profile, - create_performance_profiles, - mocker): - with app.test_client() as client: - mock_enable_rbac(mocker) - # This mocks example, test and foo groups returned in single array - mock_rbac(get_rbac_mock_file("mock_rbac_returns_array_of_groups_with_null.json"), mocker) - response = client.get('/api/ros/v1/systems', headers={"x-rh-identity": auth_token}) - assert response.status_code == 200 - assert response.json["meta"]["count"] == 4 - assert response.json["data"][0]["groups"][0]["name"] == "foo-group" - assert response.json["data"][1]["groups"][0]["name"] == "test-group" - assert response.json["data"][2]["groups"][0]["name"] == "example-group" - assert response.json["data"][3]["groups"] == [] - - -def test_access_of_all_systems( - auth_token, - db_setup, - db_create_account, - db_create_system, - system_with_example_group, - system_with_test_group, - system_with_foo_group, - db_create_performance_profile, - create_performance_profiles, - mocker): - """When user has 'inventory:hosts:*' or 'inventory:hosts:read' or 'inventory:*:*' or 'inventory:*:read' permissions - and resource definition does not have any groups it means user can see all the systems on ROS""" - with app.test_client() as client: - mock_enable_rbac(mocker) - rbac_mocks = ['mock_rbac_returns_inventory_hosts_star_without_groups.json', - 'mock_rbac_returns_inventory_hosts_read_without_groups.json', - 'mock_rbac_returns_inventory_star_star_without_groups.json', - 'mock_rbac_returns_inventory_star_read_without_groups.json'] - for mocks in rbac_mocks: - mock_rbac(get_rbac_mock_file(mocks), mocker) - response = client.get('/api/ros/v1/systems', headers={"x-rh-identity": auth_token}) - assert response.status_code == 200 - assert response.json["meta"]["count"] == 4 - assert response.json["data"][0]["groups"][0]["name"] == "foo-group" - assert response.json["data"][1]["groups"][0]["name"] == "test-group" - assert response.json["data"][2]["groups"][0]["name"] == "example-group" - assert response.json["data"][3]["groups"] == [] - - -@pytest.mark.no_suggestions -def test_no_suggestions_when_system_is_optimized( - auth_token, - db_setup, - db_create_account, - db_create_optimized_system, - db_create_performance_profile_for_optimized): - with app.test_client() as client: - response = client.get('/api/ros/v1/suggested_instance_types', headers={"x-rh-identity": auth_token}) - assert response.status_code == 200 - assert response.json["meta"]["count"] == 0 - - -@pytest.mark.no_suggestions -def test_no_suggestions_when_system_missing_pcp_data( - auth_token, - db_setup, - db_create_account, - db_create_no_pcp_system, - db_create_performance_profile_for_no_pcp): - with app.test_client() as client: - response = client.get('/api/ros/v1/suggested_instance_types', headers={"x-rh-identity": auth_token}) - assert response.status_code == 200 - assert response.json["meta"]["count"] == 0 - - -@pytest.mark.generate_suggestions -def test_generate_suggestions_for_idle_system( - auth_token, - db_setup, - db_create_account, - db_create_idle_system, - db_create_performance_profile_for_idle): - with app.test_client() as client: - response = client.get('/api/ros/v1/suggested_instance_types', headers={"x-rh-identity": auth_token}) - assert response.status_code == 200 - assert response.json["meta"]["count"] == 1 - assert response.json["data"][0]["instance_type"] == "t2.nano" - - -@pytest.mark.generate_suggestions -def test_generate_suggestions_for_under_pressure_system( - auth_token, - db_setup, - db_create_account, - db_create_underpressure_system, - db_create_performance_profile_for_underpressure): - with app.test_client() as client: - response = client.get('/api/ros/v1/suggested_instance_types', headers={"x-rh-identity": auth_token}) - assert response.status_code == 200 - assert response.json["meta"]["count"] == 1 - assert response.json["data"][0]["instance_type"] == "t2.small" - - -@pytest.mark.generate_suggestions -def test_generate_suggestions_for_undersized_system( - auth_token, - db_setup, - db_create_account, - db_create_undersized_system, - db_create_performance_profile_for_undersized): - with app.test_client() as client: - response = client.get('/api/ros/v1/suggested_instance_types', headers={"x-rh-identity": auth_token}) - assert response.status_code == 200 - assert response.json["meta"]["count"] == 1 - assert response.json["data"][0]["instance_type"] == "t2.medium" - - -@pytest.mark.generate_suggestions -def test_get_suggested_instance_details( - auth_token, - db_setup, - db_create_account, - db_create_undersized_system, - db_create_performance_profile_for_undersized, - db_create_underpressure_system, - db_create_performance_profile_for_underpressure, - db_create_idle_system, - db_create_performance_profile_for_idle): - with app.test_client() as client: - response = client.get('/api/ros/v1/suggested_instance_types/t2.medium', headers={"x-rh-identity": auth_token}) - assert response.status_code == 200 - assert response.json["meta"]["count"] == 1 - assert response.json["data"][0]["instance_type"] == "t2.medium" - assert response.json["data"][0]["display_name"] == "undersized.ap-south-1.compute.internal" - - -@pytest.mark.generate_suggestions -def test_get_suggested_instance_details_filtered_by_display_name( - auth_token, - db_setup, - db_create_account, - db_create_idle_system, - db_create_performance_profile_for_idle, - db_create_idle_system_two, - db_create_performance_profile_for_idle_two): - with app.test_client() as client: - response = client.get('/api/ros/v1/suggested_instance_types/t2.nano?display_name=idle.ap-south-1.compute' - '.internal', headers={"x-rh-identity": auth_token}) - assert response.json["meta"]["count"] == 1 - assert response.json["data"][0]["instance_type"] == "t2.nano" - assert response.json["data"][0]["display_name"] == "idle.ap-south-1.compute.internal" - - -@pytest.mark.generate_suggestions -def test_get_suggested_instance_details_filtered_by_state( - auth_token, - db_setup, - db_create_account, - db_create_idle_system, - db_create_performance_profile_for_idle, - db_create_idle_system_two, - db_create_performance_profile_for_idle_two): - with app.test_client() as client: - response = client.get('/api/ros/v1/suggested_instance_types/t2.nano?state=idling', - headers={"x-rh-identity": auth_token}) - assert response.json["meta"]["count"] == 2 - assert response.json["data"][0]["instance_type"] == "t2.nano" - assert response.json["data"][1]["instance_type"] == "t2.nano" - assert response.json["data"][0]["state"] == "Idling" - assert response.json["data"][1]["state"] == "Idling" - - -@pytest.mark.generate_suggestions -def test_get_suggested_instance_details_filtered_by_os( - auth_token, - db_setup, - db_create_account, - db_create_idle_system, - db_create_performance_profile_for_idle, - db_create_idle_system_two, - db_create_performance_profile_for_idle_two): - with app.test_client() as client: - response = client.get('/api/ros/v1/suggested_instance_types/t2.nano?os=RHEL 7.4', - headers={"x-rh-identity": auth_token}) - assert response.json["meta"]["count"] == 1 - assert response.json["data"][0]["instance_type"] == "t2.nano" - assert response.json["data"][0]["os"] == "RHEL 7.4" diff --git a/tests/test_archive_processor.py b/tests/test_archive_processor.py deleted file mode 100644 index 5ed58a99..00000000 --- a/tests/test_archive_processor.py +++ /dev/null @@ -1,97 +0,0 @@ -from unittest import mock - -from ros.processor.process_archive import performance_profile - -EXPECTED_PERFORMANCE_RECORD = { - 'disk.dev.total': {'nvme0n1': {'units': 'count / sec', 'val': 7.22}}, - 'hinv.ncpu': 8.0, - 'instance_type': 't2.micro', - 'kernel.all.cpu.idle': 7.55, - 'kernel.all.pressure.cpu.some.avg': { - '1 minute': {'units': 'none', 'val': 0.575}, - '10 second': {'units': 'none', 'val': 0.579}, - '5 minute': {'units': 'none', 'val': 0.572} - }, - 'kernel.all.pressure.io.full.avg': { - '1 minute': {'units': 'none', 'val': 0.006}, - '10 second': {'units': 'none', 'val': 0.012}, - '5 minute': {'units': 'none', 'val': 0.004} - }, - 'kernel.all.pressure.io.some.avg': { - '1 minute': {'units': 'none', 'val': 0.006}, - '10 second': {'units': 'none', 'val': 0.013}, - '5 minute': {'units': 'none', 'val': 0.004} - }, - 'kernel.all.pressure.memory.full.avg': { - '1 minute': {'units': 'none', 'val': 0.0}, - '10 second': {'units': 'none', 'val': 0.0}, - '5 minute': {'units': 'none', 'val': 0.0} - }, - 'kernel.all.pressure.memory.some.avg': { - '1 minute': {'units': 'none', 'val': 0.0}, - '10 second': {'units': 'none', 'val': 0.0}, - '5 minute': {'units': 'none', 'val': 0.0} - }, - 'mem.physmem': 32617072.0, - 'mem.util.available': 27455175.254, - 'region': 'ap-northeast-1', - 'total_cpus': 1, - 'type': 'metadata' -} - - -def test_performance_profile_response(): - # test setup - lscpu = mock.Mock() - setattr(lscpu, 'info', {'CPUs': '1'}) - aws_instance_id = {'instanceType': 't2.micro', 'region': 'ap-northeast-1'} - sample_pmlog_summary = { - 'hinv': {'ncpu': {'val': 8.0, 'units': 'none'}}, - 'mem': { - 'physmem': {'val': 32617072.0, 'units': 'Kbyte'}, - 'util': {'available': {'val': 27455175.254, 'units': 'Kbyte'}} - }, - 'disk': {'dev': {'total': {'nvme0n1': {'val': 7.22, 'units': 'count / sec'}}}}, - 'kernel': { - 'all': { - 'cpu': {'idle': {'val': 7.55, 'units': 'none'}}, - 'pressure': {'cpu': {'some': { - 'avg': { - '10 second': {'val': 0.579, 'units': 'none'}, - '1 minute': {'val': 0.575, 'units': 'none'}, - '5 minute': {'val': 0.572, 'units': 'none'} - } - } - }, - 'io': { - 'full': {'avg': { - '10 second': {'val': 0.012, 'units': 'none'}, - '1 minute': {'val': 0.006, 'units': 'none'}, - '5 minute': {'val': 0.004, 'units': 'none'}} - }, - 'some': {'avg': { - '10 second': {'val': 0.013, 'units': 'none'}, - '1 minute': {'val': 0.006, 'units': 'none'}, - '5 minute': {'val': 0.004, 'units': 'none'}} - } - }, - 'memory': { - 'full': {'avg': { - '10 second': {'val': 0.0, 'units': 'none'}, - '1 minute': {'val': 0.0, 'units': 'none'}, - '5 minute': {'val': 0.0, 'units': 'none'} - } - }, - 'some': {'avg': { - '10 second': {'val': 0.0, 'units': 'none'}, - '1 minute': {'val': 0.0, 'units': 'none'}, - '5 minute': {'val': 0.0, 'units': 'none'} - } - } - } - } - } - } - } - generated_performance_record = performance_profile(lscpu, aws_instance_id, None, sample_pmlog_summary) - assert generated_performance_record == EXPECTED_PERFORMANCE_RECORD diff --git a/tests/test_garbage_collector.py b/tests/test_garbage_collector.py deleted file mode 100644 index 30f05a8c..00000000 --- a/tests/test_garbage_collector.py +++ /dev/null @@ -1,55 +0,0 @@ -import pytest -from datetime import datetime -from datetime import timedelta -from ros.lib.models import db, PerformanceProfile, PerformanceProfileHistory -from ros.processor.garbage_collector import GarbageCollector -from tests.helpers.db_helper import db_get_records - - -@pytest.fixture -def garbage_collector(): - return GarbageCollector() - - -def test_remove_outdated_data( - garbage_collector, - db_setup, - db_create_system, - db_create_performance_profile, - db_create_performance_profile_history): - system_id = 1 - date_to_set = datetime.utcnow() - timedelta(days=46) - profile_records = db_get_records(PerformanceProfile, system_id=system_id) - history_records = db_get_records(PerformanceProfileHistory, system_id=system_id) - total_profile_records_before = profile_records.count() - total_history_records_before = history_records.count() - assert total_profile_records_before == 1 - assert total_history_records_before == 1 - history_rec = history_records.first() - pprofile_rec = profile_records.first() - history_rec.report_date = date_to_set - pprofile_rec.report_date = date_to_set - db.session.commit() - garbage_collector.remove_outdated_data() - profile_records = db_get_records(PerformanceProfile, system_id=system_id) - history_records = db_get_records(PerformanceProfileHistory, system_id=system_id) - assert profile_records.count() == (total_profile_records_before - 1) - assert history_records.count() == (total_history_records_before - 1) - - -def test_gc_method_when_no_outdated_data( - garbage_collector, - db_setup, - db_create_system, - db_create_performance_profile, - db_create_performance_profile_history): - system_id = 1 - profile_records = db_get_records(PerformanceProfile, system_id=system_id) - historical_profile_records = db_get_records( - PerformanceProfileHistory, system_id=system_id) - assert profile_records.count() == historical_profile_records.count() == 1 - garbage_collector.remove_outdated_data() - profile_records = db_get_records(PerformanceProfile, system_id=system_id) - historical_profile_records = db_get_records( - PerformanceProfileHistory, system_id=system_id) - assert profile_records.count() == historical_profile_records.count() == 1 diff --git a/tests/test_insights_engine_result_consumer.py b/tests/test_insights_engine_result_consumer.py deleted file mode 100644 index 11a664ae..00000000 --- a/tests/test_insights_engine_result_consumer.py +++ /dev/null @@ -1,250 +0,0 @@ -import pytest -import json -import copy -from pathlib import Path -from ros.lib.app import app -from ros.lib.models import db, PerformanceProfile, PerformanceProfileHistory -from ros.processor.insights_engine_consumer import InsightsEngineConsumer -from ros.lib.constants import SystemStatesWithKeys -from tests.helpers.db_helper import db_get_host, db_get_record -from ros.processor.event_producer import notification_payload - - -@pytest.fixture(scope="function") -def performance_record(): - PERFORMANCE_RECORD = { - "hinv.ncpu": 8.0, "total_cpus": 1, "mem.physmem": 32617072.0, - "instance_type": "t2.micro", "disk.dev.total": {"nvme0n1": {"val": 7.22, "units": "count / sec"}}, - "mem.util.available": 27455175.254, "kernel.all.cpu.idle": 7.55, 'region': 'ap-northeast-1', - "kernel.all.pressure.io.full.avg": {"1 minute": {"val": 0.006, "units": "none"}, - "5 minute": {"val": 0.004, "units": "none"}, - "10 second": {"val": 0.012, "units": "none"}}, - "kernel.all.pressure.io.some.avg": {"1 minute": {"val": 0.006, "units": "none"}, - "5 minute": {"val": 0.004, "units": "none"}, - "10 second": {"val": 0.013, "units": "none"}}, - "kernel.all.pressure.cpu.some.avg": {"1 minute": {"val": 0.575, "units": "none"}, - "5 minute": {"val": 0.572, "units": "none"}, - "10 second": {"val": 0.579, "units": "none"}}, - "kernel.all.pressure.memory.full.avg": {"1 minute": {"val": 0.0, "units": "none"}, - "5 minute": {"val": 0.0, "units": "none"}, - "10 second": {"val": 0.0, "units": "none"}}, - "kernel.all.pressure.memory.some.avg": {"1 minute": {"val": 0.0, "units": "none"}, - "5 minute": {"val": 0.0, "units": "none"}, - "10 second": {"val": 0.0, "units": "none"}} - } - return PERFORMANCE_RECORD - - -@pytest.fixture(scope="session") -def engine_result_message(): - def _return_engine_msg_json(filename): - f = open(f"{Path(__file__).parent}/data_files/{filename}") - msg_data = json.loads(f.read()) - f.close() - return msg_data - - return _return_engine_msg_json - - -@pytest.fixture -def engine_consumer(): - return InsightsEngineConsumer() - - -def test_handle_msg(engine_result_message, engine_consumer, mocker, performance_record, redis_client): - engine_result_message = engine_result_message("insights-engine-result-idle.json") - mocker.patch( - 'ros.processor.insights_engine_consumer.get_performance_profile', - return_value=performance_record, - autospec=True - ) - mocker.patch.object(engine_consumer, 'process_report', return_value=True, autospec=True) - engine_consumer.handle_msg(engine_result_message) - engine_consumer.process_report.assert_called_once() - - -def test_process_report_idle(engine_result_message, engine_consumer, db_setup, performance_record): - engine_result_message = engine_result_message("insights-engine-result-idle.json") - host = engine_result_message["input"]["host"] - ros_reports = [engine_result_message["results"]["reports"][7]] - system_metadata = engine_result_message["results"]["system"]["metadata"] - platform_metadata = engine_result_message["input"]["platform_metadata"] - _performance_record = copy.copy(performance_record) - engine_consumer.process_report(host, platform_metadata, ros_reports, system_metadata, performance_record) - system_record = db_get_host(host['id']) - assert str(system_record.inventory_id) == host['id'] - assert system_record.groups == host['groups'] - with app.app_context(): - assert system_record.instance_type == _performance_record['instance_type'] - assert system_record.region == _performance_record['region'] - assert system_record.state == SystemStatesWithKeys.INSTANCE_IDLE.value - assert db.session.scalar(db.select(PerformanceProfile).filter_by(system_id=system_record.id))\ - .performance_record == performance_record - - -def test_process_report_under_pressure(engine_result_message, engine_consumer, - db_setup, performance_record): - engine_result_message = engine_result_message("insights-engine-result-under-pressure.json") - host = engine_result_message["input"]["host"] - ros_reports = [engine_result_message["results"]["reports"][7]] - system_metadata = engine_result_message["results"]["system"]["metadata"] - platform_metadata = engine_result_message["input"]["platform_metadata"] - _performance_record = copy.copy(performance_record) - engine_consumer.process_report(host, platform_metadata, ros_reports, system_metadata, performance_record) - system_record = db_get_host(host['id']) - assert str(system_record.inventory_id) == host['id'] - assert system_record.groups == host['groups'] - with app.app_context(): - assert system_record.instance_type == _performance_record['instance_type'] - assert system_record.region == _performance_record['region'] - assert system_record.state == SystemStatesWithKeys.INSTANCE_OPTIMIZED_UNDER_PRESSURE.value - assert db.session.scalar(db.select(PerformanceProfile).filter_by(system_id=system_record.id))\ - .performance_record == performance_record - - -def test_process_report_no_pcp(engine_result_message, engine_consumer, db_setup, performance_record): - engine_result_message = engine_result_message("insights-engine-result-no-pcp.json") - host = engine_result_message["input"]["host"] - ros_reports = [engine_result_message["results"]["reports"][7]] - system_metadata = engine_result_message["results"]["system"]["metadata"] - platform_metadata = engine_result_message["input"]["platform_metadata"] - _performance_record = copy.copy(performance_record) - engine_consumer.process_report(host, platform_metadata, ros_reports, system_metadata, performance_record) - system_record = db_get_host(host['id']) - performance_utilization = db.session.scalar(db.select(PerformanceProfile) - .filter_by(system_id=system_record.id)).performance_utilization - sample_performance_util_no_pcp = {'cpu': -1, 'memory': -1, 'max_io': -1.0, 'io': {}} - assert str(system_record.inventory_id) == host['id'] - assert system_record.groups == host['groups'] - with app.app_context(): - assert system_record.instance_type == _performance_record['instance_type'] - assert system_record.region == _performance_record['region'] - assert system_record.state == SystemStatesWithKeys.NO_PCP_DATA.value - assert performance_utilization == sample_performance_util_no_pcp - - -def test_process_report_undersized(engine_result_message, engine_consumer, db_setup, performance_record): - engine_result_message = engine_result_message("insights-engine-result-undersized.json") - host = engine_result_message["input"]["host"] - ros_reports = [engine_result_message["results"]["reports"][7]] - system_metadata = engine_result_message["results"]["system"]["metadata"] - platform_metadata = engine_result_message["input"]["platform_metadata"] - _performance_record = copy.copy(performance_record) - engine_consumer.process_report(host, platform_metadata, ros_reports, system_metadata, performance_record) - system_record = db_get_host(host['id']) - assert str(system_record.inventory_id) == host['id'] - assert system_record.groups == host['groups'] - with app.app_context(): - assert system_record.instance_type == _performance_record['instance_type'] - assert system_record.region == _performance_record['region'] - assert system_record.state == SystemStatesWithKeys.INSTANCE_UNDERSIZED.value - assert db.session.scalar(db.select(PerformanceProfile).filter_by(system_id=system_record.id))\ - .performance_record == performance_record - - -def test_process_report_optimized(engine_result_message, engine_consumer, db_setup, performance_record): - engine_result_message = engine_result_message("insights-engine-result-optimized.json") - host = engine_result_message["input"]["host"] - ros_reports = [] - system_metadata = engine_result_message["results"]["system"]["metadata"] - platform_metadata = engine_result_message["input"]["platform_metadata"] - _performance_record = copy.copy(performance_record) - engine_consumer.process_report(host, platform_metadata, ros_reports, system_metadata, performance_record) - system_record = db_get_host(host['id']) - profile_record = db_get_record(PerformanceProfile, system_id=system_record.id) - assert str(system_record.inventory_id) == host['id'] - assert system_record.groups == host['groups'] - with app.app_context(): - assert profile_record.rule_hit_details == ros_reports - assert system_record.instance_type == _performance_record['instance_type'] - assert system_record.region == _performance_record['region'] - assert system_record.state == SystemStatesWithKeys.OPTIMIZED.value - assert db.session.scalar(db.select(PerformanceProfile).filter_by(system_id=system_record.id))\ - .performance_record == performance_record - - -def test_system_properties(engine_result_message, engine_consumer, db_setup, performance_record): - engine_result_message = engine_result_message("insights-engine-result-idle.json") - host = engine_result_message["input"]["host"] - ros_reports = [engine_result_message["results"]["reports"][7]] - system_metadata = engine_result_message["results"]["system"]["metadata"] - platform_metadata = engine_result_message["input"]["platform_metadata"] - engine_consumer.process_report(host, platform_metadata, ros_reports, system_metadata, performance_record) - data = db_get_host(host['id']) - assert str(data.inventory_id) == host['id'] - assert data.groups == host['groups'] - - -def test_history_record_creation(engine_result_message, engine_consumer, db_setup, performance_record): - engine_result_message = engine_result_message("insights-engine-result-idle.json") - host = engine_result_message["input"]["host"] - ros_reports = [engine_result_message["results"]["reports"][7]] - system_metadata = engine_result_message["results"]["system"]["metadata"] - platform_metadata = engine_result_message["input"]["platform_metadata"] - engine_consumer.process_report(host, platform_metadata, ros_reports, system_metadata, performance_record) - system_record = db_get_host(host['id']) - assert str(system_record.inventory_id) == host['id'] - with app.app_context(): - history_rec_count = PerformanceProfileHistory.query.filter_by( - system_id=system_record.id - ).count() - assert history_rec_count == 1 - - -def test_substate_updates(engine_result_message, engine_consumer, db_setup, performance_record): - engine_result_message = engine_result_message("insights-engine-result-under-pressure.json") - host = engine_result_message["input"]["host"] - ros_reports = [engine_result_message["results"]["reports"][7]] - system_metadata = engine_result_message["results"]["system"]["metadata"] - platform_metadata = engine_result_message["input"]["platform_metadata"] - ros_reports[0]['details'].update({ - "states": - { - 'cpu': ['CPU_UNDERSIZED', 'CPU_UNDERSIZED_BY_PRESSURE'], - 'io': ['IO_UNDERSIZED_BY_PRESSURE'], - 'memory': ['MEMORY_UNDERSIZED', 'MEMORY_UNDERSIZED_BY_PRESSURE'] - } - - }) - engine_consumer.process_report(host, platform_metadata, ros_reports, system_metadata, performance_record) - system_record = db_get_host(host['id']) - assert str(system_record.inventory_id) == host['id'] - with app.app_context(): - assert system_record.cpu_states == ['CPU_UNDERSIZED', 'CPU_UNDERSIZED_BY_PRESSURE'] - assert system_record.io_states == ['IO_UNDERSIZED_BY_PRESSURE'] - assert system_record.memory_states == ['MEMORY_UNDERSIZED', 'MEMORY_UNDERSIZED_BY_PRESSURE'] - - -def test_process_report_psi_enabled(engine_result_message, engine_consumer, db_setup, performance_record): - engine_result_message = engine_result_message("insights-engine-result-idle.json") - host = engine_result_message["input"]["host"] - ros_reports = [engine_result_message["results"]["reports"][7]] - system_metadata = engine_result_message["results"]["system"]["metadata"] - platform_metadata = engine_result_message["input"]["platform_metadata"] - engine_consumer.process_report(host, platform_metadata, ros_reports, system_metadata, performance_record) - system_record = db_get_host(host['id']) - psi_enabled = db.session.scalar(db.select(PerformanceProfile).filter_by(system_id=system_record.id))\ - .psi_enabled - assert psi_enabled is True - - -def test_notification(engine_result_message, engine_consumer, db_setup, performance_record): - engine_result_message = engine_result_message("insights-engine-result-under-pressure.json") - host = engine_result_message["input"]["host"] - platform_metadata = engine_result_message["input"]["platform_metadata"] - ros_reports = [engine_result_message["results"]["reports"][7]] - system_metadata = engine_result_message["results"]["system"]["metadata"] - system_previous_state = "Idle" - engine_consumer.process_report(host, platform_metadata, ros_reports, system_metadata, performance_record) - system_record = db_get_host(host['id']) - response = notification_payload( - host, system_previous_state, system_record.state) - - assert response["account_id"] == host["account"] - assert response["context"]["display_name"] == "ip-172-31-28-69.ec2.internal" - assert response["events"][0]["payload"]["inventory_id"] == host["id"] - assert response["events"][0]["payload"]["previous_state"] == system_previous_state - assert response["events"][0]["payload"]["current_state"] == system_record.state - assert response["bundle"] == "rhel" - assert response["application"] == "resource-optimization" - assert response["event_type"] == "new-suggestion" diff --git a/tests/test_inventory_events_consumer.py b/tests/test_inventory_events_consumer.py deleted file mode 100644 index 28dcf2e6..00000000 --- a/tests/test_inventory_events_consumer.py +++ /dev/null @@ -1,148 +0,0 @@ -import pytest -import json -from pathlib import Path -from ros.lib.app import app -from ros.extensions import cache -from ros.processor.inventory_events_consumer import InventoryEventsConsumer -from tests.helpers.db_helper import db_get_host -from ros.lib.config import CACHE_KEYWORD_FOR_DELETED_SYSTEM - - -PERFORMANCE_RECORD = {'total_cpus': 1, 'instance_type': 't2.micro', 'mem.physmem': 825152.0, - 'mem.util.used': 663245.405, 'kernel.all.cpu.user': 0.003, 'kernel.all.cpu.sys': 0.001, - 'kernel.all.cpu.nice': 0.001, 'kernel.all.cpu.steal': 0.0, 'kernel.all.cpu.idle': 0.994, - 'disk.all.total': 2.727, 'mem.util.cached': 351730.563, 'mem.util.bufmem': 335.552, - 'mem.util.free': 161906.595, 'region': 'ap-south-1'} - - -@pytest.fixture(scope="function") -def inventory_event_message(): - f = open(f"{Path(__file__).parent}/data_files/events-message.json") - msg = json.loads(f.read()) - yield msg - f.close() - - -@pytest.fixture(scope="function") -def inventory_event_consumer(): - return InventoryEventsConsumer() - - -def test_process_system_details(inventory_event_consumer, inventory_event_message, db_setup): - inventory_event_message['type'] = 'created' - inventory_event_consumer.process_system_details(inventory_event_message) - with app.app_context(): - host = db_get_host(inventory_event_message['host']['id']) - assert str(host.inventory_id) == inventory_event_message['host']['id'] - - -def test_host_create_events(inventory_event_consumer, inventory_event_message, db_setup, mocker): - mocker.patch.object( - inventory_event_consumer, - 'process_system_details', - side_effect=inventory_event_consumer.process_system_details, - autospec=True - ) - - inventory_event_message['type'] = 'created' # Setup to meet test case conditions - inventory_event_consumer.host_create_update_events(inventory_event_message) - inventory_event_consumer.process_system_details.assert_called_once() - inventory_event_consumer.process_system_details(msg=inventory_event_message) - with app.app_context(): - assert db_get_host(inventory_event_message['host']['id']).display_name == \ - inventory_event_message['host']['display_name'] - assert type(db_get_host(inventory_event_message['host']['id'])).__name__ == 'System' - assert db_get_host(inventory_event_message['host']['id']).operating_system == \ - inventory_event_message['host']['system_profile']['operating_system'] - assert db_get_host(inventory_event_message['host']['id']).groups == \ - inventory_event_message['host']['groups'] - - -def test_host_update_events(inventory_event_consumer, inventory_event_message, db_setup, mocker): - mocker.patch.object( - inventory_event_consumer, - 'process_system_details', - side_effect=inventory_event_consumer.process_system_details, - autospec=True - ) - - # Setup to meet test case conditions - inventory_event_message['type'] = 'created' - inventory_event_consumer.host_create_update_events(inventory_event_message) # creating system for test - inventory_event_message['type'] = 'updated' - inventory_event_message['platform_metadata'] = {'org_id': '000001'} - updated_display_name = 'Test - Display Name Update' # Test case change - inventory_event_message['host']['display_name'] = updated_display_name - inventory_event_message['host']['groups'] = [] - inventory_event_consumer.host_create_update_events(inventory_event_message) - inventory_event_consumer.process_system_details.call_count = 2 - inventory_event_consumer.process_system_details(msg=inventory_event_message) - with app.app_context(): - updated_system = db_get_host(inventory_event_message['host']['id']) - assert updated_system.display_name == updated_display_name - assert updated_system.groups == [] - - -def test_host_update_event_no_cp(inventory_event_consumer, inventory_event_message, db_setup, mocker): - mocker.patch.object( - inventory_event_consumer, - 'process_system_details', - side_effect=inventory_event_consumer.process_system_details, - autospec=True - ) - - # Setup to meet test case conditions - inventory_event_message['type'] = 'created' - inventory_event_consumer.host_create_update_events(inventory_event_message) # creating system for test - inventory_event_message['type'] = 'updated' - inventory_event_message['platform_metadata'] = {'org_id': '000001'} - updated_display_name = 'Test - Display Name Update' # Test case change - inventory_event_message['host']['display_name'] = updated_display_name - inventory_event_message['host']['system_profile']['cloud_provider'] = None - inventory_event_consumer.host_create_update_events(inventory_event_message) - inventory_event_consumer.process_system_details.call_count = 2 - with app.app_context(): - updated_system = db_get_host(inventory_event_message['host']['id']) - assert updated_system.display_name != updated_display_name - - -def test_host_delete_event(inventory_event_consumer, inventory_event_message, db_setup, redis_client, mocker): - inventory_event_message['type'] = 'created' - inventory_event_consumer.host_create_update_events(inventory_event_message) - - msg = {"type": "delete", - "insights_id": "677fb960-e164-48a4-929f-59e2d917b444", - "id": "ee0b9978-fe1b-4191-8408-cbadbd47f7a2", - "account": '0000001', 'org_id': '000001'} - inventory_event_consumer.host_delete_event(msg) - with app.app_context(): - cached_deleted_sys = cache.get( - f"{msg['org_id']}{CACHE_KEYWORD_FOR_DELETED_SYSTEM}{msg['id']}" - ) - assert cached_deleted_sys == 1 - - host = db_get_host(msg['id']) - assert host is None - - -def test_recreate_remove_cached_key(inventory_event_consumer, inventory_event_message, db_setup, redis_client, mocker): - msg = {"type": "delete", - "insights_id": "677fb960-e164-48a4-929f-59e2d917b444", - "id": "bb0b9978-fe1b-4191-8408-cbadbd47f7a3", - "account": '0000002', 'org_id': '000002'} - cached_skey = f"{msg['org_id']}{CACHE_KEYWORD_FOR_DELETED_SYSTEM}{msg['id']}" - with app.app_context(): - cache.set(cached_skey, 1) - assert cache.get(cached_skey) == 1 - - inventory_event_message['type'] = 'created' - inventory_event_message['host']['id'] = 'bb0b9978-fe1b-4191-8408-cbadbd47f7a3' - inventory_event_message['host']['account'] = '0000002' - inventory_event_message['host']['org_id'] = '000002' - inventory_event_message['platform_metadata']['account'] = '0000002' - inventory_event_message['platform_metadata']['org_id'] = '000002' - inventory_event_consumer.host_create_update_events(inventory_event_message) - - with app.app_context(): - cached_sys_val = cache.get(cached_skey) - assert cached_sys_val is None