From dd0c3253a0f540e0fad502c2af1428372e13efc9 Mon Sep 17 00:00:00 2001 From: Kayvon Martinez Date: Thu, 7 Mar 2024 01:11:57 -0600 Subject: [PATCH] Fixed linting errors --- .github/workflows/constraints.txt | 2 +- .../workflows/container_retention_policy.yml | 4 +- .github/workflows/dev_containers.yml | 21 - .github/workflows/docs.yml | 2 +- .github/workflows/tests.yml | 10 +- .gitignore | 3 - Makefile | 109 - README.md | 19 - bin/run_pyl | 9 + dev.Dockerfile | 13 - dev.docker-compose.yml | 12 - docker-compose.yml | 7 +- docs/Building_Diagrams/Forms.md | 63 +- docs/Building_Diagrams/escalation_events.md | 43 +- .../images/Escalation_ID.png | Bin 54910 -> 0 bytes .../images/Escalation_Order.png | Bin 60143 -> 0 bytes .../images/Escalation_Order_2.png | Bin 61539 -> 0 bytes .../images/styling_forms.png | Bin 30292 -> 0 bytes docs/requirements.txt | 28 +- docs/wish_list/wish_list.md | 5 - poetry.lock | 65 +- pyproject.toml | 8 +- spiffworkflow-backend/Dockerfile | 2 +- .../bin/clone_process_models | 41 - .../bin/get_bpmn_json_for_process_instance.py | 26 - spiffworkflow-backend/bin/start_celery_worker | 5 +- spiffworkflow-backend/dev.Dockerfile | 15 - spiffworkflow-backend/dev.docker-compose.yml | 17 - .../migrations/versions/c6e246c3c04e_.py | 34 - spiffworkflow-backend/poetry.lock | 2248 +++++++---------- spiffworkflow-backend/pyproject.toml | 17 +- .../src/spiffworkflow_backend/__init__.py | 4 +- .../src/spiffworkflow_backend/api.yml | 81 +- .../background_processing/apscheduler.py | 5 +- .../process_instance_task_producer.py | 24 +- .../spiffworkflow_backend/config/default.py | 6 - .../config/permissions/local_development.yml | 1 + .../config/unit_testing.py | 5 +- .../spiffworkflow_backend/data_stores/crud.py | 2 +- .../spiffworkflow_backend/data_stores/json.py | 6 +- .../spiffworkflow_backend/data_stores/kkv.py | 6 +- .../data_stores/typeahead.py | 4 +- .../helpers/spiff_enum.py | 5 - .../models/message_instance.py | 2 +- .../message_triggerable_process_model.py | 2 - .../models/process_group.py | 2 - .../models/reference_cache.py | 4 +- .../routes/authentication_controller.py | 4 +- .../routes/data_store_controller.py | 58 +- .../routes/messages_controller.py | 3 +- .../routes/process_instances_controller.py | 19 +- .../routes/script_assist_controller.py | 61 - .../routes/tasks_controller.py | 14 +- .../scripts/set_secret.py | 20 - .../services/authentication_service.py | 60 +- .../services/authorization_service.py | 55 +- .../services/data_setup_service.py | 122 - .../services/file_system_service.py | 7 +- .../services/jinja_service.py | 4 +- .../services/message_service.py | 40 +- .../services/process_instance_processor.py | 27 +- .../services/process_instance_service.py | 20 +- .../services/process_model_service.py | 8 +- .../process_model_test_runner_service.py | 110 +- .../services/script_unit_test_runner.py | 2 +- .../services/spec_file_service.py | 15 +- .../services/workflow_service.py | 2 +- .../process_model.json | 9 - .../script_task.bpmn | 41 - .../test_script_task.json | 24 - .../data/random_fact/random_fact_set.bpmn | 51 - .../integration/test_json_file_data_store.py | 2 +- .../integration/test_process_api.py | 2 - .../integration/test_swagger_docs.py | 14 - .../unit/test_authorization_service.py | 2 - .../unit/test_message_service.py | 37 - .../unit/test_process_instance_processor.py | 39 +- .../unit/test_reference_cache_service.py | 18 - 78 files changed, 1252 insertions(+), 2625 deletions(-) delete mode 100644 .github/workflows/dev_containers.yml delete mode 100644 Makefile delete mode 100644 dev.Dockerfile delete mode 100644 dev.docker-compose.yml delete mode 100644 docs/Building_Diagrams/images/Escalation_ID.png delete mode 100644 docs/Building_Diagrams/images/Escalation_Order.png delete mode 100644 docs/Building_Diagrams/images/Escalation_Order_2.png delete mode 100644 docs/Building_Diagrams/images/styling_forms.png delete mode 100755 spiffworkflow-backend/bin/clone_process_models delete mode 100755 spiffworkflow-backend/bin/get_bpmn_json_for_process_instance.py delete mode 100644 spiffworkflow-backend/dev.Dockerfile delete mode 100644 spiffworkflow-backend/dev.docker-compose.yml delete mode 100644 spiffworkflow-backend/migrations/versions/c6e246c3c04e_.py delete mode 100644 spiffworkflow-backend/src/spiffworkflow_backend/routes/script_assist_controller.py delete mode 100644 spiffworkflow-backend/src/spiffworkflow_backend/scripts/set_secret.py delete mode 100644 spiffworkflow-backend/tests/data/bpmn_unit_test_process_models/expected-to-pass/script-task-with-backend-script/process_model.json delete mode 100644 spiffworkflow-backend/tests/data/bpmn_unit_test_process_models/expected-to-pass/script-task-with-backend-script/script_task.bpmn delete mode 100644 spiffworkflow-backend/tests/data/bpmn_unit_test_process_models/expected-to-pass/script-task-with-backend-script/test_script_task.json delete mode 100644 spiffworkflow-backend/tests/data/random_fact/random_fact_set.bpmn delete mode 100644 spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_swagger_docs.py diff --git a/.github/workflows/constraints.txt b/.github/workflows/constraints.txt index be7ac0dba..3c820457c 100644 --- a/.github/workflows/constraints.txt +++ b/.github/workflows/constraints.txt @@ -1,2 +1,2 @@ pip==24.0 -poetry==1.8.2 +poetry==1.7.1 diff --git a/.github/workflows/container_retention_policy.yml b/.github/workflows/container_retention_policy.yml index 380792f9f..35d10b58e 100644 --- a/.github/workflows/container_retention_policy.yml +++ b/.github/workflows/container_retention_policy.yml @@ -3,7 +3,7 @@ name: Delete old container images on: workflow_dispatch: # allow running on demand schedule: - - cron: "0 2 * * *" # every day at 2:00am UTC + - cron: "0 2 * * *" # every day at 2:00am UTC jobs: clean-ghcr: @@ -14,7 +14,7 @@ jobs: uses: snok/container-retention-policy@v2 with: image-names: spiffworkflow-backend, spiffworkflow-frontend - cut-off: Three months ago UTC + cut-off: Two months ago UTC account-type: org org-name: sartography keep-at-least: 1 diff --git a/.github/workflows/dev_containers.yml b/.github/workflows/dev_containers.yml deleted file mode 100644 index 9e17d6944..000000000 --- a/.github/workflows/dev_containers.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: Dev Containers - -on: - push: - branches: [ "main" ] - pull_request: - branches: [ "main" ] - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - - name: Create dev environment - run: make dev-env - - - name: Backend Unit tests - run: make be-tests-par \ No newline at end of file diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 86409de39..816abe3d6 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -17,7 +17,7 @@ jobs: uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v5.0.0 + uses: actions/setup-python@v4.6.1 with: python-version: 3.11 - name: Pip Install diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 9cc9dbcb0..2737e00ba 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -117,7 +117,7 @@ jobs: uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python }} - uses: actions/setup-python@v5.0.0 + uses: actions/setup-python@v4.6.1 with: python-version: ${{ matrix.python }} @@ -216,7 +216,7 @@ jobs: - name: Check out the repository uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v5.0.0 + uses: actions/setup-python@v4.6.1 with: python-version: "3.11" - name: Install Poetry @@ -261,7 +261,7 @@ jobs: fetch-depth: 0 - name: Set up Python - uses: actions/setup-python@v5.0.0 + uses: actions/setup-python@v4.6.1 with: python-version: "3.11" @@ -276,7 +276,7 @@ jobs: poetry --version - name: Download coverage data - uses: actions/download-artifact@v4.1.4 + uses: actions/download-artifact@v4.1.1 with: name: coverage-data # this action doesn't seem to respect working-directory so include working-directory value in path @@ -287,7 +287,7 @@ jobs: ./bin/run_ci_session coverage - name: Upload coverage report - uses: codecov/codecov-action@v4.1.0 + uses: codecov/codecov-action@v3.1.4 - name: SonarCloud Scan uses: sonarsource/sonarcloud-github-action@v2.1.1 diff --git a/.gitignore b/.gitignore index 22612d066..af933b202 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,3 @@ version_info.json UNKNOWN.egg-info/ process_models/ .ipynb_checkpoints -.env* -.cache -.mypy_cache diff --git a/Makefile b/Makefile deleted file mode 100644 index f6620c4e3..000000000 --- a/Makefile +++ /dev/null @@ -1,109 +0,0 @@ -MY_USER := $(shell id -u) -MY_GROUP := $(shell id -g) -ME := $(MY_USER):$(MY_GROUP) - -SUDO ?= sudo - -ARENA_CONTAINER ?= spiff-arena -ARENA_DEV_OVERLAY ?= dev.docker-compose.yml - -BACKEND_CONTAINER ?= spiffworkflow-backend -BACKEND_DEV_OVERLAY ?= spiffworkflow-backend/dev.docker-compose.yml - -FRONTEND_CONTAINER ?= spiffworkflow-frontend -FRONTEND_DEV_OVERLAY ?= spiffworkflow-frontend/dev.docker-compose.yml - -DOCKER_COMPOSE ?= RUN_AS=$(ME) docker compose $(YML_FILES) -IN_ARENA ?= $(DOCKER_COMPOSE) run $(ARENA_CONTAINER) -IN_BACKEND ?= $(DOCKER_COMPOSE) run $(BACKEND_CONTAINER) -IN_FRONTEND ?= $(DOCKER_COMPOSE) run $(FRONTEND_CONTAINER) - -SPIFFWORKFLOW_BACKEND_ENV ?= local_development - -YML_FILES := -f docker-compose.yml \ - -f $(BACKEND_DEV_OVERLAY) \ - -f $(FRONTEND_DEV_OVERLAY) \ - -f $(ARENA_DEV_OVERLAY) - -all: dev-env start-dev run-pyl - @/bin/true - -build-images: - $(DOCKER_COMPOSE) build - -dev-env: stop-dev build-images poetry-i be-poetry-i be-recreate-db fe-npm-i - @/bin/true - -start-dev: stop-dev - $(DOCKER_COMPOSE) up -d - -stop-dev: - $(DOCKER_COMPOSE) down - -be-clear-log-file: - $(IN_BACKEND) rm -f log/unit_testing.log - -be-logs: - docker logs -f $(BACKEND_CONTAINER) - -be-mypy: - $(IN_BACKEND) poetry run mypy src tests - -be-poetry-i: - $(IN_BACKEND) poetry install - -be-recreate-db: - $(IN_BACKEND) ./bin/recreate_db clean - -be-ruff: - $(IN_BACKEND) poetry run ruff --fix . - -be-sh: - $(IN_BACKEND) /bin/bash - -be-sqlite: - @if [ ! -f "$(BACKEND_CONTAINER)/src/instance/db_$(SPIFFWORKFLOW_BACKEND_ENV).sqlite3" ]; then \ - echo "SQLite database file does not exist: $(BACKEND_CONTAINER)/src/instance/db_$(SPIFFWORKFLOW_BACKEND_ENV).sqlite3"; \ - exit 1; \ - fi - $(IN_BACKEND) sqlite3 src/instance/db_$(SPIFFWORKFLOW_BACKEND_ENV).sqlite3 - -be-tests: be-clear-log-file - $(IN_BACKEND) poetry run pytest - -be-tests-par: be-clear-log-file - $(IN_BACKEND) poetry run pytest -n auto -x --random-order - -fe-lint-fix: - $(IN_FRONTEND) npm run lint:fix - -fe-logs: - docker logs -f $(FRONTEND_CONTAINER) - -fe-npm-i: - $(IN_FRONTEND) npm i && git checkout -- spiffworkflow-frontend/package-lock.json - -fe-sh: - $(IN_FRONTEND) /bin/bash - -poetry-i: - $(IN_ARENA) poetry install --no-root - -pre-commit: - $(IN_ARENA) poetry run pre-commit run --verbose --all-files - -run-pyl: fe-lint-fix pre-commit be-mypy be-tests-par - @/bin/true - -sh: - $(IN_ARENA) /bin/bash - -take-ownership: - $(SUDO) chown -R $(ME) . - -.PHONY: build-images dev-env \ - start-dev stop-dev \ - be-clear-log-file be-logs be-mypy be-poetry-i be-recreate-db be-ruff be-sh be-sqlite be-tests be-tests-par \ - fe-lint-fix fe-logs fe-npm-i fe-sh \ - poetry-i pre-commit run-pyl \ - take-ownership diff --git a/README.md b/README.md index a0282551c..3e41afb52 100644 --- a/README.md +++ b/README.md @@ -67,24 +67,6 @@ For full instructions, see [Running SpiffWorkflow Locally with Docker](https://w The `docker-compose.yml` file is for running a full-fledged instance of spiff-arena while `editor.docker-compose.yml` provides BPMN graphical editor capability to libraries and projects that depend on SpiffWorkflow but have no built-in BPMN edit capabilities. -### Using Docker for Local Development - -If you have `docker` and `docker compose`, as an alternative to locally installing the required dependencies, you can leverage the development docker containers and `Makefile` while working locally. To use, clone the repo and run `make`. This will build the required images, install all dependencies, start the servers and run the linting and tests. Once complete you can [open the app](http://localhost:8001) and code changes will be reflected while running. - -After the containers are set up, you can run `make start-dev` and `make stop-dev` to start and stop the servers. If the frontend or backend lock file changes, `make dev-env` will recreate the containers with the new dependencies. - -Please refer to the [Makefile](Makefile) as the source of truth, but for a summary of the available `make` targets: - -| Target | Action | -|----|----| -| dev-env | Builds the images, sets up the backend db and installs `npm` and `poetry` dependencies | -| start-dev | Starts the frontend and backend servers, also stops them first if they were already running | -| stop-dev | Stops the frontend and backend servers | -| be-tests-par | Runs the backend unit tests in parallel | -| fe-lint-fix | Runs `npm lint:fix` in the frontend container | -| run-pyl | Runs all frontend and backend lints, backend unit tests | - - ## Contributing To start understanding the system, you might: @@ -109,4 +91,3 @@ SpiffArena's main components are published under the terms of the You can find us on [our Discord Channel](https://discord.gg/BYHcc7PpUC). Commercial support for SpiffWorkflow is available from [Sartography](https://sartography.com). -Please contact us via the schedule a demo link on the [SpiffWorkflow website](https://spiffworkflow.org) to discuss your needs. diff --git a/bin/run_pyl b/bin/run_pyl index 9f191c307..e81f4f484 100755 --- a/bin/run_pyl +++ b/bin/run_pyl @@ -17,6 +17,15 @@ react_projects=( subcommand="${1:-}" +if [[ "$subcommand" == "pre" ]]; then + if [[ -n "$(git status --porcelain SpiffWorkflow)" ]]; then + echo "SpiffWorkflow has uncommitted changes. Running its test suite." + pushd SpiffWorkflow + make tests-par # run tests in parallel + popd + fi +fi + function get_python_dirs() { (git ls-tree -r HEAD --name-only | grep -E '\.py$' | awk -F '/' '{print $1}' | sort | uniq | grep -v '\.' | grep -Ev '^(bin|migrations)$') || echo '' } diff --git a/dev.Dockerfile b/dev.Dockerfile deleted file mode 100644 index 843ec687e..000000000 --- a/dev.Dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM python:3.12.1-slim-bookworm - -WORKDIR /app - -RUN apt-get update \ - && apt-get install -y -q git-core curl \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* - -RUN git config --global --add safe.directory /app - -RUN pip install --upgrade pip -RUN pip install poetry==1.8.1 \ No newline at end of file diff --git a/dev.docker-compose.yml b/dev.docker-compose.yml deleted file mode 100644 index f3c554644..000000000 --- a/dev.docker-compose.yml +++ /dev/null @@ -1,12 +0,0 @@ - -services: - spiff-arena: - build: - context: . - dockerfile: dev.Dockerfile - user: "${RUN_AS}" - environment: - POETRY_VIRTUALENVS_IN_PROJECT: "true" - XDG_CACHE_HOME: "/app/.cache" - volumes: - - ./:/app diff --git a/docker-compose.yml b/docker-compose.yml index 4238f6be0..104103efa 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,12 +1,10 @@ -# version: "3.8" - services: spiffworkflow-frontend: container_name: spiffworkflow-frontend image: ghcr.io/sartography/spiffworkflow-frontend:latest depends_on: spiffworkflow-backend: - condition: service_started + condition: service_healthy environment: APPLICATION_ROOT: "/" PORT0: "${SPIFFWORKFLOW_FRONTEND_PORT:-8001}" @@ -41,7 +39,7 @@ services: ports: - "${SPIFF_BACKEND_PORT:-8000}:${SPIFF_BACKEND_PORT:-8000}/tcp" volumes: - - ${SPIFFWORKFLOW_BACKEND_LOCAL_BPMN_SPEC_DIR:-./process_models}:/app/process_models + - ./process_models:/app/process_models - spiffworkflow_backend_db:/app/db_volume healthcheck: test: "curl localhost:${SPIFF_BACKEND_PORT:-8000}/v1.0/status --fail" @@ -65,6 +63,7 @@ services: timeout: 5s retries: 20 + volumes: spiffworkflow_backend_db: driver: local diff --git a/docs/Building_Diagrams/Forms.md b/docs/Building_Diagrams/Forms.md index 764078da1..ca34eabb9 100644 --- a/docs/Building_Diagrams/Forms.md +++ b/docs/Building_Diagrams/Forms.md @@ -242,49 +242,57 @@ The schema enforces the following rules: - The `Preferred Delivery Date Range` must start no earlier than today and end no later than the `end_date`. ### Display Fields Side-By-Side on Same Row -When designing forms, it's often more user-friendly to display related fields, such as First Name and Last Name, side by side on the same row, rather than stacked vertically. The `ui:layout` attribute in your form's JSON schema enables this by allowing you to specify how fields are displayed relative to each other, controlling the grid columns each field occupies for a responsive design. -#### Form Schema Example: +By default, all form fields will be laid out one on top of the other. +In some cases, it might be more user-friendly to put two or more fields next to each other on the same conceptual "row." +Perhaps, you want to let a user fill out a name, and have First Name and Last Name next to each other. +Don't actually do this; use Full name as a single field. :) +But in some other case where you actually want to have fields laid out horizontally instead of vertically, do the following: -Define your form fields in the JSON schema as follows: +Example form schema: ```json { - "title": "Side by Side Layout", - "description": "Demonstrating side-by-side layout", + "title": "Side by side", + "description": "A simple form demonstrating side-by-side layout of fields", "type": "object", "properties": { - "firstName": {"type": "string"}, - "lastName": {"type": "string"}, - "notes": {"type": "string"} + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "notes": { + "type": "string" + } } } ``` -#### `ui:layout` Configuration: - -The `ui:layout` attribute accepts an array of objects, each representing a conceptual "row" of fields. Here's how to use it: +Example uiSchema: ```json { "ui:layout": [ { - "firstName": {"sm": 2, "md": 2, "lg": 4}, - "lastName": {"sm": 2, "md": 2, "lg": 4} + "firstName": { + "sm": 2, + "md": 2, + "lg": 4 + }, + "lastName": { + "sm": 2, + "md": 2, + "lg": 4 + } }, - {"notes": {}} + { + "notes": {} + } ] } ``` -![Styling_Form](images/styling_forms.png) - -#### Key Points: - -- **Layout Design**: The `ui:layout` specifies that `firstName` and `lastName` should appear side by side. Each field's size adjusts according to the screen size (small, medium, large), utilizing grid columns for responsive design. -- **Responsive Columns**: Values (`sm`, `md`, `lg`) indicate the number of grid columns a field should occupy, ensuring the form remains functional and visually appealing across devices. -- **Simplified Configuration**: If column widths are unspecified, the layout will automatically adjust, providing flexibility in design. - -#### Example Illustrated: In this case, we are saying that we want firstName and lastName in the same row, since they are both in the first element of the ui:layout array. We are saying that firstName should take up 4 columns when a large display is used. @@ -301,11 +309,6 @@ If you just specific a uiSchema like this, it will figure out the column widths ] } - -By leveraging the `ui:layout` feature, you can design form layouts that are not only functional but also enhance the user experience, making your forms well-organized and accessible across various screen sizes. - - - ### Display UI Help in Web Forms When designing web forms, it's essential to provide users with contextual help to ensure they understand the purpose and requirements of each field. @@ -399,7 +402,7 @@ Below is an example JSON schema that includes the numeric range field: This schema defines a numeric range object with `min` and `max` properties, both of which are required. -#### UI Schema Example +#### Ui Schema Example ```json { @@ -411,4 +414,4 @@ This schema defines a numeric range object with `min` and `max` properties, both #### Validation -This will automatically validate that the max value cannot be less than the min value. \ No newline at end of file +This will automatically validate that the max value cannot be less than the min value. diff --git a/docs/Building_Diagrams/escalation_events.md b/docs/Building_Diagrams/escalation_events.md index 4e22f52c8..2c1b58e44 100644 --- a/docs/Building_Diagrams/escalation_events.md +++ b/docs/Building_Diagrams/escalation_events.md @@ -88,45 +88,4 @@ In this scenario, we observe an End Escalation following a Boundary Event. This thrown End Escalation can be intercepted by the boundary event of a Call Activity or at the start of a sub-process, as shown in previous examples on this page. In another example, we see an End Escalation event being thrown within a sub-process and caught at the sub-process's boundary. The application of the last example aligns with the first, where the escalation can be intercepted either on a Call Activity or at the beginning of a sub-process. -It's crucial to remember that whether a process is created or terminated in these contexts depends on whether non-interrupting or interrupting events are utilized. - -## Configuring Escalation Events Properties -Setting up an escalation event within a workflow in SpiffWorkflow involves defining both the escalation trigger (throw event) and the point where the escalation is handled (catch event). - -Here's how to set up these components: - -**Define the Escalation ID**: Determine the task or process stage where an escalation might need to be triggered due to exceptional circumstances. and decide on a unique identifier for your escalation event. - -![Escalation ID](images/Escalation_ID.png) - -```{admonition} Note -⚠ In the above example, the escalation ID is created with `Escalation_Throw_1`. -``` - -**Define the Intermediate Throw Escalation Event**: - Add an Intermediate Throw Escalation Event immediately after the task identified. Select escalation ID and create a unique **escalation code**. . - -![Escalation Order](images/Escalation_Order.png) - -```{admonition} Note -⚠ Escalation code is essential for matching the throw event with its corresponding catch event. Example: `OrderExceedsThreshold`. -``` - -**Define the Escalation Catch Event**: -This can be a boundary event attached to a task where the escalation should be caught and handled, or an intermediate event in the workflow where the escalation process converges. - -For a boundary catch event, attach it to the task designated to handle the escalation. For an intermediate catch event, place it at the appropriate point in the process flow. - -![Escalation Order](images/Escalation_Order_2.png) - -```{admonition} Note -⚠ Ensure this matches exactly with the code assigned to the throw event to ensure proper linkage. Example: `OrderExceedsThreshold`. -``` - -**Set Additional Properties (Optional)**: -You may need to set additional properties for the escalation event, such as: - -- **Payload/Variables**: Configuring any data or process variables that should be passed along with the escalation for handling by the catch event. -- **Documentation**: Providing details on when the escalation should be triggered and how it should be handled. - -After setting up the escalation event, test the workflow to ensure the escalation is triggered under the right conditions and that the catch event handles it as expected \ No newline at end of file +It's crucial to remember that whether a process is created or terminated in these contexts depends on whether non-interrupting or interrupting events are utilized. \ No newline at end of file diff --git a/docs/Building_Diagrams/images/Escalation_ID.png b/docs/Building_Diagrams/images/Escalation_ID.png deleted file mode 100644 index 6f76c3ddedf5c75621d711834e76a4c5bfc54857..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54910 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 u*&7;E*1(64t2 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 diff --git a/docs/Building_Diagrams/images/Escalation_Order.png b/docs/Building_Diagrams/images/Escalation_Order.png deleted file mode 100644 index 95e5f0390b5a3610f12cf6a85ef199fd58b77ced..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60143 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

2%KY{eJJ|y07JPeXi?tPonX5Sho`aoa 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 {vAxX*cGT_!xKinoU$=ivU{U<^Ak}g#zvO;&jI> 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 yuX(3t1Ui@1>!T%Pbm0+1}K=l5Z>_#cB`_I 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

-DsCsCh50oF@pO(O<9m-e;dD=c z!pM&Br_slV<=JJ=qKAt(VHJypAsE zy|GC`1ZEjh@5iwf zz0)PXEq|es`EV@Ws?scwtF89^v88#1)-IW)Y?&Pn>|mnbz@SKWHcgf_(*1A;!4;t9 zIv)lq%(C;ELp$}L=NbA4dYb-$nc1D+RWHLnPf1G8J80nWU#2zDFV{EY)j$nPSBv0z zT;6{%Mr|)lBh~v7nZBy3kED0@^TrZAdd{3XXi?M3#7>3MC z?k(XnJo3JYG2^i$G`lbB3W_HRWC6t zVZzoVh}LP8X}ZhpnyMx$zG1?1x;>wYx3nLG?wK`mcsGu5D>iXoV;eyY{=rUm$i;Xw z=#^D#H1bi|0i7M@_TsTCXGH<7R@;GrA)gRlT9Y@H7|=)ezn2{H9iVeU0uQ&f`{Amp zVyDIvNsw4*b&IFcM$lW(U&x8Y2gv2mG}2Lfpu@1d8JdAd(#;0*z}r8)3>TKpdT>mL zMXf5IkeoF{JA`btZWdJ6$U^Qn(#QM`^2l<{y#Ka#nuLd4YpqPReS~fGL0{uwcXtkPW%`6~3{QES>J#9*Q2x^ej>d$(yiJe?{ z`4FOWwmri&R6p1|%;+Lzp(!USt(z-LQO0Aa7hvfoUcIaICirP{hnOA@yphG>^l_ZQ z*6sm+;Q4F+LXjV*C_J%)Q9+zb)fqSRrO=9$y}|*Pya%zjlfNnpfM`GRO-h!~-3t|G zyh!;(>tz_bA>FGHtJ<6fj~IT-{lkyl#T3bRlmIyWTX2&7^LTgBl{Q~wD^Uex)7=(i z>5@xgU9GK@^4ObtE2OPS{W)|K-qqevKW=zal&sy+c}NjnQpXx8%Z8wiJ@7{K2}06b zyJP%g9|~zCgy;de^wT-#ZQd7S4b6$u=Q)%!KO6RDJ_mZYzg(@AY`}6Hi{)puWBsy1 znxljAYxmB*o~RkEKbG(}N?HQ@o?EfffH^Y;1a{`*tmE7A0VMm@ARjRlx@eDWpC5Q) zqt$4ul*w1mR!a+dxdWo@+r9jU#_|q?7ZtYk`A34Q>G!nm2;+&akiRqV;a8P1N^Tbv z^+TuwLgtT8G-V69Ds72s#}{iuf7uZ)Nax03+|kkxLMBX?5^L78Y85}e%shb7 zKKu4W#8PBqjn7o=-0-ri+gL=NV0$_6H5FfEp#JzGa1F{s%`Rgg+%0hZ+fX&z6)!f9 zF5e}^pty~6O29vQsO>4Jd<}dt3tQ-1oyrR(?byy!)7*HRts+1ak1iTDMT2V5Bt=+$ zbLC#8WofTlj#+R!ud%(#lVESWz6tk3(ILqJ{?+;-V8note%3r*cSu@y z0Xj=S&oN_|oh3SD^!}6ix8(e&ue&XZb7@z9KBP=V#i#k8sOm(3CGfec++y0v@{ZIc zD+2?iYxUbP#IMUrA+dm~ZkpS5IiB?XL}Bh(mh!AzQ`OGj%w4v7kitUtTAvFmL)HUG zC}6E&O~W{3>yCuin^3fG&l`zQ2&>g%h*iI%1vZVonUeb9#CYct2Hl)XJ8xMZl)(!a zi5vA2FGfHWfr>-EVP5v3HbeI}#>KZ4 z^JA~3;k@X-?`HBaHRekae5!{Mg>mLRI<S52!`9xc`C!u-+<;OD>!tIuGN5phgnYj8qWJ9;67dXc*Ymu_P*9 ziKbJwUMCqnsWH-L0mOK>IY1~E{y`{^v?LNYka*F9zL*hIEH!YzFL$V-^K~=@=g4ln zXViQ-$RN(US3qsRD`S%rdin*l{wZNizOlN@penezWVa96YPYVh^E$31%6WP`Nq4{g z&0XFK1@fx=6Rf28P{U@Vb|JC2%?+lC_aXyof<=+L69$jbNs6_rpCLQ8DtqcTHcSvK zpdR!GL;aee1r?-py?(QvrR+|gVHVSDF~P?JS-YrkC$%Yx9_l-%fF_S6d~9 zy!!tZE`b-Vqz)ELZngHXUU&3RLgy`k`SynczBpme)QKwqy8bO18b~^%g2?L)vMFu4 zNg;|gPGeLA*Cc1uAefl{{@_u%nD7-a{vW>u>pdGE7nYBEb59?na9Zl_inM{T%y&=5 zfPxNJo_bAy3dGi**zxNdu9rY!X3F$$!u|Iw>ujmW#r&Q1P%dD?B9O;2yta@e!EYr3 z^Ef+zvG50qdu4$2oSpdiD>MDI8vqnQ88`lk*-%6XM9T|i14*3`a=$VL+VPio!90A6 zpf1QW?k(o@vo$Li;R4u>aiB-a#DA&a?${QwgyeCu;N-$}+RsS9jznP~Rw4c^tCp$; zt&gC}iS#}?-P%YXu6uMN1^Z@Hx()=va{rXUC>M}PXccHfxs`XiT#Zq%z2X`er1iw^oN{ru}3Z zt}2bN={HHSipID+5f0jF&2{gp`B;4$(g2E>apli;2&D3@7cILRW~-!_)i(vFfLAMc zrWb)dlj8X^H>X^1<|~F(hYDn`qWTGvyyhp~jx&)8+-;yw)_@&k+=YMi3j&sZ`Tzg% i91Hw^lZHI?=?#8#?5Xezn)+Y_NLu`XSfR*6@BarNQWJv! diff --git a/docs/Building_Diagrams/images/styling_forms.png b/docs/Building_Diagrams/images/styling_forms.png deleted file mode 100644 index cc1a5624fb3670cfe8164dcc7d7d54052dd7e26a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30292 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 m{r_Ky{qNYhPe1>(&pYk!<9pnE=2.3)", "pytest (>=7.2.2)", "pytest- [[package]] name = "pre-commit" -version = "3.6.2" +version = "2.21.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false -python-versions = ">=3.9" +python-versions = ">=3.7" files = [ - {file = "pre_commit-3.6.2-py2.py3-none-any.whl", hash = "sha256:ba637c2d7a670c10daedc059f5c49b5bd0aadbccfcd7ec15592cf9665117532c"}, - {file = "pre_commit-3.6.2.tar.gz", hash = "sha256:c3ef34f463045c88658c5b99f38c1e297abdcc0ff13f98d3370055fbbfabc67e"}, + {file = "pre_commit-2.21.0-py2.py3-none-any.whl", hash = "sha256:e2f91727039fc39a92f58a588a25b87f936de6567eed4f0e673e0507edc75bad"}, + {file = "pre_commit-2.21.0.tar.gz", hash = "sha256:31ef31af7e474a8d8995027fefdfcf509b5c913ff31f2015b4ec4beb26a6f658"}, ] [package.dependencies] @@ -415,13 +415,13 @@ virtualenv = ">=20.10.0" [[package]] name = "pre-commit-hooks" -version = "4.5.0" +version = "4.4.0" description = "Some out-of-the-box hooks for pre-commit." optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "pre_commit_hooks-4.5.0-py2.py3-none-any.whl", hash = "sha256:b779d5c44ede9b1fda48e2d96b08e9aa5b1d2fdb8903ca09f0dbaca22d529edb"}, - {file = "pre_commit_hooks-4.5.0.tar.gz", hash = "sha256:ffbe2af1c85ac9a7695866955680b4dee98822638b748a6f3debefad79748c8a"}, + {file = "pre_commit_hooks-4.4.0-py2.py3-none-any.whl", hash = "sha256:fc8837335476221ccccda3d176ed6ae29fe58753ce7e8b7863f5d0f987328fc6"}, + {file = "pre_commit_hooks-4.4.0.tar.gz", hash = "sha256:7011eed8e1a25cde94693da009cba76392194cecc2f3f06c51a44ea6ad6c2af9"}, ] [package.dependencies] @@ -519,7 +519,6 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -556,13 +555,13 @@ files = [ [[package]] name = "reorder-python-imports" -version = "3.12.0" +version = "3.9.0" description = "Tool for reordering python imports" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "reorder_python_imports-3.12.0-py2.py3-none-any.whl", hash = "sha256:930c23a42192b365e20e191a4d304d93e645bd44c242d8bc64accc4a3b2b0f3d"}, - {file = "reorder_python_imports-3.12.0.tar.gz", hash = "sha256:f93106a662b0c034ca81c91fd1c2f21a1e94ece47c9f192672e2a13c8ec1856c"}, + {file = "reorder_python_imports-3.9.0-py2.py3-none-any.whl", hash = "sha256:3f9c16e8781f54c944756d0d1eb34a8c863554f7a4eb3693f574fe19b1a29b56"}, + {file = "reorder_python_imports-3.9.0.tar.gz", hash = "sha256:49292ed537829a6bece9fb3746fc1bbe98f52643be5de01a4e13680268a5b0ec"}, ] [package.dependencies] @@ -598,28 +597,28 @@ jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] [[package]] name = "ruff" -version = "0.2.1" -description = "An extremely fast Python linter and code formatter, written in Rust." +version = "0.0.270" +description = "An extremely fast Python linter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.2.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:dd81b911d28925e7e8b323e8d06951554655021df8dd4ac3045d7212ac4ba080"}, - {file = "ruff-0.2.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:dc586724a95b7d980aa17f671e173df00f0a2eef23f8babbeee663229a938fec"}, - {file = "ruff-0.2.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c92db7101ef5bfc18e96777ed7bc7c822d545fa5977e90a585accac43d22f18a"}, - {file = "ruff-0.2.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:13471684694d41ae0f1e8e3a7497e14cd57ccb7dd72ae08d56a159d6c9c3e30e"}, - {file = "ruff-0.2.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a11567e20ea39d1f51aebd778685582d4c56ccb082c1161ffc10f79bebe6df35"}, - {file = "ruff-0.2.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:00a818e2db63659570403e44383ab03c529c2b9678ba4ba6c105af7854008105"}, - {file = "ruff-0.2.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be60592f9d218b52f03384d1325efa9d3b41e4c4d55ea022cd548547cc42cd2b"}, - {file = "ruff-0.2.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbd2288890b88e8aab4499e55148805b58ec711053588cc2f0196a44f6e3d855"}, - {file = "ruff-0.2.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ef052283da7dec1987bba8d8733051c2325654641dfe5877a4022108098683"}, - {file = "ruff-0.2.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:7022d66366d6fded4ba3889f73cd791c2d5621b2ccf34befc752cb0df70f5fad"}, - {file = "ruff-0.2.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0a725823cb2a3f08ee743a534cb6935727d9e47409e4ad72c10a3faf042ad5ba"}, - {file = "ruff-0.2.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:0034d5b6323e6e8fe91b2a1e55b02d92d0b582d2953a2b37a67a2d7dedbb7acc"}, - {file = "ruff-0.2.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e5cb5526d69bb9143c2e4d2a115d08ffca3d8e0fddc84925a7b54931c96f5c02"}, - {file = "ruff-0.2.1-py3-none-win32.whl", hash = "sha256:6b95ac9ce49b4fb390634d46d6ece32ace3acdd52814671ccaf20b7f60adb232"}, - {file = "ruff-0.2.1-py3-none-win_amd64.whl", hash = "sha256:e3affdcbc2afb6f5bd0eb3130139ceedc5e3f28d206fe49f63073cb9e65988e0"}, - {file = "ruff-0.2.1-py3-none-win_arm64.whl", hash = "sha256:efababa8e12330aa94a53e90a81eb6e2d55f348bc2e71adbf17d9cad23c03ee6"}, - {file = "ruff-0.2.1.tar.gz", hash = "sha256:3b42b5d8677cd0c72b99fcaf068ffc62abb5a19e71b4a3b9cfa50658a0af02f1"}, + {file = "ruff-0.0.270-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:f74c4d550f7b8e808455ac77bbce38daafc458434815ba0bc21ae4bdb276509b"}, + {file = "ruff-0.0.270-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:643de865fd35cb76c4f0739aea5afe7b8e4d40d623df7e9e6ea99054e5cead0a"}, + {file = "ruff-0.0.270-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eca02e709b3308eb7255b5f74e779be23b5980fca3862eae28bb23069cd61ae4"}, + {file = "ruff-0.0.270-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3ed3b198768d2b3a2300fb18f730cd39948a5cc36ba29ae9d4639a11040880be"}, + {file = "ruff-0.0.270-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:739495d2dbde87cf4e3110c8d27bc20febf93112539a968a4e02c26f0deccd1d"}, + {file = "ruff-0.0.270-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:08188f8351f4c0b6216e8463df0a76eb57894ca59a3da65e4ed205db980fd3ae"}, + {file = "ruff-0.0.270-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0827b074635d37984fc98d99316bfab5c8b1231bb83e60dacc83bd92883eedb4"}, + {file = "ruff-0.0.270-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d61ae4841313f6eeb8292dc349bef27b4ce426e62c36e80ceedc3824e408734"}, + {file = "ruff-0.0.270-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0eb412f20e77529a01fb94d578b19dcb8331b56f93632aa0cce4a2ea27b7aeba"}, + {file = "ruff-0.0.270-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b775e2c5fc869359daf8c8b8aa0fd67240201ab2e8d536d14a0edf279af18786"}, + {file = "ruff-0.0.270-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:21f00e47ab2308617c44435c8dfd9e2e03897461c9e647ec942deb2a235b4cfd"}, + {file = "ruff-0.0.270-py3-none-musllinux_1_2_i686.whl", hash = "sha256:0bbfbf6fd2436165566ca85f6e57be03ed2f0a994faf40180cfbb3604c9232ef"}, + {file = "ruff-0.0.270-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:8af391ef81f7be960be10886a3c1aac0b298bde7cb9a86ec2b05faeb2081ce6b"}, + {file = "ruff-0.0.270-py3-none-win32.whl", hash = "sha256:b4c037fe2f75bcd9aed0c89c7c507cb7fa59abae2bd4c8b6fc331a28178655a4"}, + {file = "ruff-0.0.270-py3-none-win_amd64.whl", hash = "sha256:0012f9b7dc137ab7f1f0355e3c4ca49b562baf6c9fa1180948deeb6648c52957"}, + {file = "ruff-0.0.270-py3-none-win_arm64.whl", hash = "sha256:9613456b0b375766244c25045e353bc8890c856431cd97893c97b10cc93bd28d"}, + {file = "ruff-0.0.270.tar.gz", hash = "sha256:95db07b7850b30ebf32b27fe98bc39e0ab99db3985edbbf0754d399eb2f0e690"}, ] [[package]] @@ -719,4 +718,4 @@ test = ["covdefaults (>=2.2.2)", "coverage (>=7.1)", "coverage-enable-subprocess [metadata] lock-version = "2.0" python-versions = ">=3.11,<3.13" -content-hash = "1e7e942504aa9a418f93fb9a79adef2d13df35b78c180936e1a96fadaa8bd3b0" +content-hash = "e7ce027aebced1f7d924ccd0483ced15a6cda8f715adc882d60a11d8c0676c2f" diff --git a/pyproject.toml b/pyproject.toml index e2f003c70..ad867c8d2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,11 +15,11 @@ classifiers = [ python = ">=3.11,<3.13" [tool.poetry.dev-dependencies] -pre-commit = "^3.6.2" +pre-commit = "^2.20.0" flake8 = "^4.0.1" black = ">=21.10b0" flake8-bandit = "^2.1.2" -ruff = "^0.2.1" +ruff = "^0.0.270" # 1.7.3 broke us. https://github.com/PyCQA/bandit/issues/841 bandit = "1.7.2" @@ -27,8 +27,8 @@ bandit = "1.7.2" flake8-bugbear = "^22.10.25" flake8-docstrings = "^1.6.0" flake8-rst-docstrings = "^0.2.7" -reorder-python-imports = "^3.12.0" -pre-commit-hooks = "^4.5.0" +reorder-python-imports = "^3.9.0" +pre-commit-hooks = "^4.0.1" pyupgrade = "^3.1.0" [tool.poetry.group.dev.dependencies] diff --git a/spiffworkflow-backend/Dockerfile b/spiffworkflow-backend/Dockerfile index fec358033..8af141449 100644 --- a/spiffworkflow-backend/Dockerfile +++ b/spiffworkflow-backend/Dockerfile @@ -27,7 +27,7 @@ RUN apt-get update \ # keep pip up to date RUN pip install --upgrade pip -RUN pip install poetry==1.8.1 +RUN pip install poetry==1.6.1 ######################## - SETUP diff --git a/spiffworkflow-backend/bin/clone_process_models b/spiffworkflow-backend/bin/clone_process_models deleted file mode 100755 index 9156fa27b..000000000 --- a/spiffworkflow-backend/bin/clone_process_models +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env bash - -function error_handler() { - echo >&2 "Exited with BAD EXIT CODE '${2}' in ${0} script at line: ${1}." - exit "$2" -} -trap 'error_handler ${LINENO} $?' ERR -set -o errtrace -o errexit -o nounset -o pipefail - -if [[ -z "${SPIFFWORKFLOW_BACKEND_GIT_PUBLISH_CLONE_URL:-}" ]]; then - echo >&2 "ERROR: SPIFFWORKFLOW_BACKEND_GIT_PUBLISH_CLONE_URL must be specified to clone the git repo." - exit 1 -fi - -if [[ -z "${SPIFFWORKFLOW_BACKEND_GIT_SOURCE_BRANCH:-}" ]]; then - echo >&2 "ERROR: SPIFFWORKFLOW_BACKEND_GIT_SOURCE_BRANCH must be specified to clone the git repo." - exit 1 -fi - -if [[ -z "${SPIFFWORKFLOW_BACKEND_BPMN_SPEC_ABSOLUTE_DIR:-}" ]]; then - echo >&2 "ERROR: SPIFFWORKFLOW_BACKEND_BPMN_SPEC_ABSOLUTE_DIR must be specified to clone the git repo." - exit 1 -fi - -if [[ -n "${SPIFFWORKFLOW_BACKEND_GIT_SSH_PRIVATE_KEY:-}" ]]; then - if [[ -z "${SPIFFWORKFLOW_BACKEND_GIT_SSH_PRIVATE_KEY_PATH:-}" ]]; then - export SPIFFWORKFLOW_BACKEND_GIT_SSH_PRIVATE_KEY_PATH=$(mktemp /tmp/ssh_private_key.XXXXXX) - fi - chmod 600 "${SPIFFWORKFLOW_BACKEND_GIT_SSH_PRIVATE_KEY_PATH}" - echo "${SPIFFWORKFLOW_BACKEND_GIT_SSH_PRIVATE_KEY}" >"${SPIFFWORKFLOW_BACKEND_GIT_SSH_PRIVATE_KEY_PATH}" -fi - -if [[ ! -d "${SPIFFWORKFLOW_BACKEND_BPMN_SPEC_ABSOLUTE_DIR}/.git" ]]; then - # otherwise git clone will not clone since the directory is not empty - if [[ -d "${SPIFFWORKFLOW_BACKEND_BPMN_SPEC_ABSOLUTE_DIR}/lost+found" ]]; then - rm -r "${SPIFFWORKFLOW_BACKEND_BPMN_SPEC_ABSOLUTE_DIR}/lost+found" - fi - - export GIT_SSH_COMMAND="ssh -F /dev/null -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i ${SPIFFWORKFLOW_BACKEND_GIT_SSH_PRIVATE_KEY_PATH}" - git clone -b "$SPIFFWORKFLOW_BACKEND_GIT_SOURCE_BRANCH" "$SPIFFWORKFLOW_BACKEND_GIT_PUBLISH_CLONE_URL" "$SPIFFWORKFLOW_BACKEND_BPMN_SPEC_ABSOLUTE_DIR" -fi diff --git a/spiffworkflow-backend/bin/get_bpmn_json_for_process_instance.py b/spiffworkflow-backend/bin/get_bpmn_json_for_process_instance.py deleted file mode 100755 index fe60de707..000000000 --- a/spiffworkflow-backend/bin/get_bpmn_json_for_process_instance.py +++ /dev/null @@ -1,26 +0,0 @@ -import sys - -from spiffworkflow_backend import create_app -from spiffworkflow_backend.models.process_instance import ProcessInstanceModel -from spiffworkflow_backend.services.process_instance_processor import ProcessInstanceProcessor - - -def main(process_instance_id: str) -> None: - """Main.""" - app = create_app() - with app.app_context(): - process_instance = ProcessInstanceModel.query.filter_by(id=process_instance_id).first() - - file_path = f"/var/tmp/{process_instance_id}_bpmn_json.json" # noqa: S108 - if not process_instance: - raise Exception(f"Could not find a process instance with id: {process_instance_id}") - - processor = ProcessInstanceProcessor(process_instance) - processor.dump_to_disk(file_path) - print(f"Saved to {file_path}") - - -if len(sys.argv) < 2: - raise Exception("Process instance id not supplied") - -main(sys.argv[1]) diff --git a/spiffworkflow-backend/bin/start_celery_worker b/spiffworkflow-backend/bin/start_celery_worker index 1eed7caf2..8eefaf6ea 100755 --- a/spiffworkflow-backend/bin/start_celery_worker +++ b/spiffworkflow-backend/bin/start_celery_worker @@ -1,7 +1,7 @@ #!/usr/bin/env bash function error_handler() { - echo >&2 "Exited with BAD EXIT CODE '${2}' in ${0} script at line: ${1}." + >&2 echo "Exited with BAD EXIT CODE '${2}' in ${0} script at line: ${1}." exit "$2" } trap 'error_handler ${LINENO} $?' ERR @@ -10,7 +10,4 @@ set -o errtrace -o errexit -o nounset -o pipefail export SPIFFWORKFLOW_BACKEND_CELERY_ENABLED=true export SPIFFWORKFLOW_BACKEND_RUN_BACKGROUND_SCHEDULER_IN_CREATE_APP=false -# so we can raise if calling unsafe code in celery -export SPIFFWORKFLOW_BACKEND_RUNNING_IN_CELERY_WORKER=true - poetry run celery -A src.spiffworkflow_backend.background_processing.celery_worker worker --loglevel=info diff --git a/spiffworkflow-backend/dev.Dockerfile b/spiffworkflow-backend/dev.Dockerfile deleted file mode 100644 index 44e26d967..000000000 --- a/spiffworkflow-backend/dev.Dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -FROM python:3.12.1-slim-bookworm - -WORKDIR /app - -RUN apt-get update \ - && apt-get install -y -q \ - gcc libssl-dev libpq-dev default-libmysqlclient-dev \ - pkg-config libffi-dev git-core curl sqlite3 \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* - -RUN pip install --upgrade pip -RUN pip install poetry==1.8.1 pytest-xdist==3.5.0 - -CMD ["./bin/run_server_locally"] diff --git a/spiffworkflow-backend/dev.docker-compose.yml b/spiffworkflow-backend/dev.docker-compose.yml deleted file mode 100644 index 4fd58417f..000000000 --- a/spiffworkflow-backend/dev.docker-compose.yml +++ /dev/null @@ -1,17 +0,0 @@ - -services: - spiffworkflow-backend: - build: - context: spiffworkflow-backend - dockerfile: dev.Dockerfile - user: "${RUN_AS}" - environment: - FLASK_DEBUG: "1" - #POETRY_CACHE_DIR: "/app/.cache/poetry" - POETRY_VIRTUALENVS_IN_PROJECT: "true" - SPIFFWORKFLOW_BACKEND_DATABASE_URI: "" - SPIFFWORKFLOW_BACKEND_ENV: "${SPIFFWORKFLOW_BACKEND_ENV:-local_development}" - SPIFFWORKFLOW_BACKEND_LOAD_FIXTURE_DATA: "" - XDG_CACHE_HOME: "/app/.cache" - volumes: - - ./spiffworkflow-backend:/app diff --git a/spiffworkflow-backend/migrations/versions/c6e246c3c04e_.py b/spiffworkflow-backend/migrations/versions/c6e246c3c04e_.py deleted file mode 100644 index f9ffcfdc8..000000000 --- a/spiffworkflow-backend/migrations/versions/c6e246c3c04e_.py +++ /dev/null @@ -1,34 +0,0 @@ -"""empty message - -Revision ID: c6e246c3c04e -Revises: 6344d90d20fa -Create Date: 2024-02-19 16:41:52.728357 - -""" -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision = 'c6e246c3c04e' -down_revision = '6344d90d20fa' -branch_labels = None -depends_on = None - - -def upgrade(): - # ### commands auto generated by Alembic - please adjust! ### - with op.batch_alter_table('message_triggerable_process_model', schema=None) as batch_op: - batch_op.add_column(sa.Column('file_name', sa.String(length=255), nullable=True)) - batch_op.create_index(batch_op.f('ix_message_triggerable_process_model_file_name'), ['file_name'], unique=False) - - # ### end Alembic commands ### - - -def downgrade(): - # ### commands auto generated by Alembic - please adjust! ### - with op.batch_alter_table('message_triggerable_process_model', schema=None) as batch_op: - batch_op.drop_index(batch_op.f('ix_message_triggerable_process_model_file_name')) - batch_op.drop_column('file_name') - - # ### end Alembic commands ### diff --git a/spiffworkflow-backend/poetry.lock b/spiffworkflow-backend/poetry.lock index d3f6a4f8e..50ecb1b63 100644 --- a/spiffworkflow-backend/poetry.lock +++ b/spiffworkflow-backend/poetry.lock @@ -2,13 +2,13 @@ [[package]] name = "alembic" -version = "1.13.1" +version = "1.10.3" description = "A database migration tool for SQLAlchemy." optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "alembic-1.13.1-py3-none-any.whl", hash = "sha256:2edcc97bed0bd3272611ce3a98d98279e9c209e7186e43e75bbb1b2bdfdbcc43"}, - {file = "alembic-1.13.1.tar.gz", hash = "sha256:4932c8558bf68f2ee92b9bbcb8218671c627064d5b08939437af6d77dc05e595"}, + {file = "alembic-1.10.3-py3-none-any.whl", hash = "sha256:b2e0a6cfd3a8ce936a1168320bcbe94aefa3f4463cd773a968a55071beb3cd37"}, + {file = "alembic-1.10.3.tar.gz", hash = "sha256:32a69b13a613aeb7e8093f242da60eff9daed13c0df02fff279c1b06c32965d2"}, ] [package.dependencies] @@ -17,7 +17,7 @@ SQLAlchemy = ">=1.3.0" typing-extensions = ">=4" [package.extras] -tz = ["backports.zoneinfo"] +tz = ["python-dateutil"] [[package]] name = "amqp" @@ -47,39 +47,6 @@ files = [ [package.extras] dev = ["black", "coverage", "isort", "pre-commit", "pyenchant", "pylint"] -[[package]] -name = "annotated-types" -version = "0.6.0" -description = "Reusable constraint types to use with typing.Annotated" -optional = false -python-versions = ">=3.8" -files = [ - {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, - {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, -] - -[[package]] -name = "anyio" -version = "4.3.0" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -optional = false -python-versions = ">=3.8" -files = [ - {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, - {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, -] - -[package.dependencies] -exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} -idna = ">=2.8" -sniffio = ">=1.1" -typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} - -[package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.23)"] - [[package]] name = "apscheduler" version = "3.10.4" @@ -121,22 +88,21 @@ files = [ [[package]] name = "attrs" -version = "23.2.0" +version = "22.2.0" description = "Classes Without Boilerplate" optional = false -python-versions = ">=3.7" +python-versions = ">=3.6" 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-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, + {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, ] [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]"] +cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] +tests = ["attrs[tests-no-zope]", "zope.interface"] +tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] [[package]] name = "bandit" @@ -163,38 +129,32 @@ yaml = ["PyYAML"] [[package]] name = "bcrypt" -version = "4.1.2" +version = "4.0.1" description = "Modern password hashing for your software and your servers" optional = false -python-versions = ">=3.7" +python-versions = ">=3.6" files = [ - {file = "bcrypt-4.1.2-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:ac621c093edb28200728a9cca214d7e838529e557027ef0581685909acd28b5e"}, - {file = "bcrypt-4.1.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea505c97a5c465ab8c3ba75c0805a102ce526695cd6818c6de3b1a38f6f60da1"}, - {file = "bcrypt-4.1.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57fa9442758da926ed33a91644649d3e340a71e2d0a5a8de064fb621fd5a3326"}, - {file = "bcrypt-4.1.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:eb3bd3321517916696233b5e0c67fd7d6281f0ef48e66812db35fc963a422a1c"}, - {file = "bcrypt-4.1.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6cad43d8c63f34b26aef462b6f5e44fdcf9860b723d2453b5d391258c4c8e966"}, - {file = "bcrypt-4.1.2-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:44290ccc827d3a24604f2c8bcd00d0da349e336e6503656cb8192133e27335e2"}, - {file = "bcrypt-4.1.2-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:732b3920a08eacf12f93e6b04ea276c489f1c8fb49344f564cca2adb663b3e4c"}, - {file = "bcrypt-4.1.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1c28973decf4e0e69cee78c68e30a523be441972c826703bb93099868a8ff5b5"}, - {file = "bcrypt-4.1.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b8df79979c5bae07f1db22dcc49cc5bccf08a0380ca5c6f391cbb5790355c0b0"}, - {file = "bcrypt-4.1.2-cp37-abi3-win32.whl", hash = "sha256:fbe188b878313d01b7718390f31528be4010fed1faa798c5a1d0469c9c48c369"}, - {file = "bcrypt-4.1.2-cp37-abi3-win_amd64.whl", hash = "sha256:9800ae5bd5077b13725e2e3934aa3c9c37e49d3ea3d06318010aa40f54c63551"}, - {file = "bcrypt-4.1.2-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:71b8be82bc46cedd61a9f4ccb6c1a493211d031415a34adde3669ee1b0afbb63"}, - {file = "bcrypt-4.1.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e3c6642077b0c8092580c819c1684161262b2e30c4f45deb000c38947bf483"}, - {file = "bcrypt-4.1.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:387e7e1af9a4dd636b9505a465032f2f5cb8e61ba1120e79a0e1cd0b512f3dfc"}, - {file = "bcrypt-4.1.2-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f70d9c61f9c4ca7d57f3bfe88a5ccf62546ffbadf3681bb1e268d9d2e41c91a7"}, - {file = "bcrypt-4.1.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2a298db2a8ab20056120b45e86c00a0a5eb50ec4075b6142db35f593b97cb3fb"}, - {file = "bcrypt-4.1.2-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ba55e40de38a24e2d78d34c2d36d6e864f93e0d79d0b6ce915e4335aa81d01b1"}, - {file = "bcrypt-4.1.2-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3566a88234e8de2ccae31968127b0ecccbb4cddb629da744165db72b58d88ca4"}, - {file = "bcrypt-4.1.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b90e216dc36864ae7132cb151ffe95155a37a14e0de3a8f64b49655dd959ff9c"}, - {file = "bcrypt-4.1.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:69057b9fc5093ea1ab00dd24ede891f3e5e65bee040395fb1e66ee196f9c9b4a"}, - {file = "bcrypt-4.1.2-cp39-abi3-win32.whl", hash = "sha256:02d9ef8915f72dd6daaef40e0baeef8a017ce624369f09754baf32bb32dba25f"}, - {file = "bcrypt-4.1.2-cp39-abi3-win_amd64.whl", hash = "sha256:be3ab1071662f6065899fe08428e45c16aa36e28bc42921c4901a191fda6ee42"}, - {file = "bcrypt-4.1.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d75fc8cd0ba23f97bae88a6ec04e9e5351ff3c6ad06f38fe32ba50cbd0d11946"}, - {file = "bcrypt-4.1.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:a97e07e83e3262599434816f631cc4c7ca2aa8e9c072c1b1a7fec2ae809a1d2d"}, - {file = "bcrypt-4.1.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e51c42750b7585cee7892c2614be0d14107fad9581d1738d954a262556dd1aab"}, - {file = "bcrypt-4.1.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba4e4cc26610581a6329b3937e02d319f5ad4b85b074846bf4fef8a8cf51e7bb"}, - {file = "bcrypt-4.1.2.tar.gz", hash = "sha256:33313a1200a3ae90b75587ceac502b048b840fc69e7f7a0905b5f87fac7a1258"}, + {file = "bcrypt-4.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:b1023030aec778185a6c16cf70f359cbb6e0c289fd564a7cfa29e727a1c38f8f"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:08d2947c490093a11416df18043c27abe3921558d2c03e2076ccb28a116cb6d0"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0eaa47d4661c326bfc9d08d16debbc4edf78778e6aaba29c1bc7ce67214d4410"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae88eca3024bb34bb3430f964beab71226e761f51b912de5133470b649d82344"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:a522427293d77e1c29e303fc282e2d71864579527a04ddcfda6d4f8396c6c36a"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:fbdaec13c5105f0c4e5c52614d04f0bca5f5af007910daa8b6b12095edaa67b3"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:ca3204d00d3cb2dfed07f2d74a25f12fc12f73e606fcaa6975d1f7ae69cacbb2"}, + {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:089098effa1bc35dc055366740a067a2fc76987e8ec75349eb9484061c54f535"}, + {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:e9a51bbfe7e9802b5f3508687758b564069ba937748ad7b9e890086290d2f79e"}, + {file = "bcrypt-4.0.1-cp36-abi3-win32.whl", hash = "sha256:2caffdae059e06ac23fce178d31b4a702f2a3264c20bfb5ff541b338194d8fab"}, + {file = "bcrypt-4.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:8a68f4341daf7522fe8d73874de8906f3a339048ba406be6ddc1b3ccb16fc0d9"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf4fa8b2ca74381bb5442c089350f09a3f17797829d958fad058d6e44d9eb83c"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:67a97e1c405b24f19d08890e7ae0c4f7ce1e56a712a016746c8b2d7732d65d4b"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b3b85202d95dd568efcb35b53936c5e3b3600c7cdcc6115ba461df3a8e89f38d"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbb03eec97496166b704ed663a53680ab57c5084b2fc98ef23291987b525cb7d"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:5ad4d32a28b80c5fa6671ccfb43676e8c1cc232887759d1cd7b6f56ea4355215"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b57adba8a1444faf784394de3436233728a1ecaeb6e07e8c22c8848f179b893c"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:705b2cea8a9ed3d55b4491887ceadb0106acf7c6387699fca771af56b1cdeeda"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:2b3ac11cf45161628f1f3733263e63194f22664bf4d0c0f3ab34099c02134665"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3100851841186c25f127731b9fa11909ab7b1df6fc4b9f8353f4f1fd952fbf71"}, + {file = "bcrypt-4.0.1.tar.gz", hash = "sha256:27d375903ac8261cfe4047f6709d16f7d18d39b1ec92aaf72af989552a650ebd"}, ] [package.extras] @@ -214,31 +174,39 @@ files = [ [[package]] name = "black" -version = "22.12.0" +version = "23.11.0" description = "The uncompromising code formatter." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, - {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, - {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, - {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, - {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, - {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, - {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, - {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, - {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, - {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, - {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, - {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, + {file = "black-23.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dbea0bb8575c6b6303cc65017b46351dc5953eea5c0a59d7b7e3a2d2f433a911"}, + {file = "black-23.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:412f56bab20ac85927f3a959230331de5614aecda1ede14b373083f62ec24e6f"}, + {file = "black-23.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d136ef5b418c81660ad847efe0e55c58c8208b77a57a28a503a5f345ccf01394"}, + {file = "black-23.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:6c1cac07e64433f646a9a838cdc00c9768b3c362805afc3fce341af0e6a9ae9f"}, + {file = "black-23.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cf57719e581cfd48c4efe28543fea3d139c6b6f1238b3f0102a9c73992cbb479"}, + {file = "black-23.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:698c1e0d5c43354ec5d6f4d914d0d553a9ada56c85415700b81dc90125aac244"}, + {file = "black-23.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:760415ccc20f9e8747084169110ef75d545f3b0932ee21368f63ac0fee86b221"}, + {file = "black-23.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:58e5f4d08a205b11800332920e285bd25e1a75c54953e05502052738fe16b3b5"}, + {file = "black-23.11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:45aa1d4675964946e53ab81aeec7a37613c1cb71647b5394779e6efb79d6d187"}, + {file = "black-23.11.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4c44b7211a3a0570cc097e81135faa5f261264f4dfaa22bd5ee2875a4e773bd6"}, + {file = "black-23.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a9acad1451632021ee0d146c8765782a0c3846e0e0ea46659d7c4f89d9b212b"}, + {file = "black-23.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:fc7f6a44d52747e65a02558e1d807c82df1d66ffa80a601862040a43ec2e3142"}, + {file = "black-23.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7f622b6822f02bfaf2a5cd31fdb7cd86fcf33dab6ced5185c35f5db98260b055"}, + {file = "black-23.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:250d7e60f323fcfc8ea6c800d5eba12f7967400eb6c2d21ae85ad31c204fb1f4"}, + {file = "black-23.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5133f5507007ba08d8b7b263c7aa0f931af5ba88a29beacc4b2dc23fcefe9c06"}, + {file = "black-23.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:421f3e44aa67138ab1b9bfbc22ee3780b22fa5b291e4db8ab7eee95200726b07"}, + {file = "black-23.11.0-py3-none-any.whl", hash = "sha256:54caaa703227c6e0c87b76326d0862184729a69b73d3b7305b6288e1d830067e"}, + {file = "black-23.11.0.tar.gz", hash = "sha256:4c68855825ff432d197229846f971bc4d6666ce90492e5b02013bcaca4d9ab05"}, ] [package.dependencies] click = ">=8.0.0" mypy-extensions = ">=0.4.3" +packaging = ">=22.0" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] @@ -248,35 +216,35 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "blinker" -version = "1.7.0" +version = "1.6.2" description = "Fast, simple object-to-object and broadcast signaling" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "blinker-1.7.0-py3-none-any.whl", hash = "sha256:c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9"}, - {file = "blinker-1.7.0.tar.gz", hash = "sha256:e6820ff6fa4e4d1d8e2747c2283749c3f547e4fee112b98555cdcdae32996182"}, + {file = "blinker-1.6.2-py3-none-any.whl", hash = "sha256:c3d739772abb7bc2860abf5f2ec284223d9ad5c76da018234f6f50d6f31ab1f0"}, + {file = "blinker-1.6.2.tar.gz", hash = "sha256:4afd3de66ef3a9f8067559fb7a1cbe555c17dcbe15971b05d1b625c3e7abe213"}, ] [[package]] name = "cachelib" -version = "0.12.0" +version = "0.10.2" description = "A collection of cache libraries in the same API interface." optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "cachelib-0.12.0-py3-none-any.whl", hash = "sha256:038f4d855afc3eb8caab10458f6eac55c328911f9055824c22c2f259ef9ed3a3"}, - {file = "cachelib-0.12.0.tar.gz", hash = "sha256:8243029a028436fd23229113dee517c0700bb43a8a289ec5a963e4af9ca2b194"}, + {file = "cachelib-0.10.2-py3-none-any.whl", hash = "sha256:42d49f2fad9310dd946d7be73d46776bcd4d5fde4f49ad210cfdd447fbdfc346"}, + {file = "cachelib-0.10.2.tar.gz", hash = "sha256:593faeee62a7c037d50fc835617a01b887503f972fb52b188ae7e50e9cb69740"}, ] [[package]] name = "celery" -version = "5.3.6" +version = "5.3.5" description = "Distributed Task Queue." optional = false python-versions = ">=3.8" files = [ - {file = "celery-5.3.6-py3-none-any.whl", hash = "sha256:9da4ea0118d232ce97dff5ed4974587fb1c0ff5c10042eb15278487cdd27d1af"}, - {file = "celery-5.3.6.tar.gz", hash = "sha256:870cc71d737c0200c397290d730344cc991d13a057534353d124c9380267aab9"}, + {file = "celery-5.3.5-py3-none-any.whl", hash = "sha256:30b75ac60fb081c2d9f8881382c148ed7c9052031a75a1e8743ff4b4b071f184"}, + {file = "celery-5.3.5.tar.gz", hash = "sha256:6b65d8dd5db499dd6190c45aa6398e171b99592f2af62c312f7391587feb5458"}, ] [package.dependencies] @@ -285,7 +253,7 @@ click = ">=8.1.2,<9.0" click-didyoumean = ">=0.3.0" click-plugins = ">=1.1.1" click-repl = ">=0.2.0" -kombu = ">=5.3.4,<6.0" +kombu = ">=5.3.3,<6.0" python-dateutil = ">=2.8.2" redis = {version = ">=4.5.2,<4.5.5 || >4.5.5,<6.0.0", optional = true, markers = "extra == \"redis\""} tzdata = ">=2022.7" @@ -303,7 +271,7 @@ couchbase = ["couchbase (>=3.0.0)"] couchdb = ["pycouchdb (==1.14.2)"] django = ["Django (>=2.2.28)"] dynamodb = ["boto3 (>=1.26.143)"] -elasticsearch = ["elastic-transport (<=8.10.0)", "elasticsearch (<=8.11.0)"] +elasticsearch = ["elastic-transport (<=8.10.0)", "elasticsearch (<=8.10.1)"] eventlet = ["eventlet (>=0.32.0)"] gevent = ["gevent (>=1.5.0)"] librabbitmq = ["librabbitmq (>=2.0.0)"] @@ -341,74 +309,86 @@ typing-extensions = ">=4.2.0" [[package]] name = "certifi" -version = "2024.2.2" +version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, ] [[package]] name = "cffi" -version = "1.16.0" +version = "1.15.1" description = "Foreign Function Interface for Python calling C code." optional = false -python-versions = ">=3.8" +python-versions = "*" files = [ - {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, - {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, - {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, - {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, - {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, - {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, - {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, - {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, - {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, - {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, - {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, - {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, - {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, - {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, - {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, ] [package.dependencies] @@ -416,13 +396,13 @@ pycparser = "*" [[package]] name = "cfgv" -version = "3.4.0" +version = "3.3.1" description = "Validate configuration and produce human readable error messages." optional = false -python-versions = ">=3.8" +python-versions = ">=3.6.1" files = [ - {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, - {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, + {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, + {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, ] [[package]] @@ -438,112 +418,97 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.1.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.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, ] [[package]] name = "click" -version = "8.1.7" +version = "8.1.3" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, - {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, ] [package.dependencies] @@ -624,6 +589,21 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "configparser" +version = "5.3.0" +description = "Updated configparser from stdlib for earlier Pythons." +optional = false +python-versions = ">=3.7" +files = [ + {file = "configparser-5.3.0-py3-none-any.whl", hash = "sha256:b065779fd93c6bf4cee42202fa4351b4bb842e96a3fb469440e484517a49b9fa"}, + {file = "configparser-5.3.0.tar.gz", hash = "sha256:8be267824b541c09b08db124917f48ab525a6c3e837011f3130781a224c57090"}, +] + +[package.extras] +docs = ["jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "types-backports"] + [[package]] name = "connexion" version = "2.14.1" @@ -723,43 +703,43 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "42.0.5" +version = "42.0.2" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16"}, - {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da"}, - {file = "cryptography-42.0.5-cp37-abi3-win32.whl", hash = "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74"}, - {file = "cryptography-42.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940"}, - {file = "cryptography-42.0.5-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30"}, - {file = "cryptography-42.0.5-cp39-abi3-win32.whl", hash = "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413"}, - {file = "cryptography-42.0.5-cp39-abi3-win_amd64.whl", hash = "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd"}, - {file = "cryptography-42.0.5.tar.gz", hash = "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1"}, + {file = "cryptography-42.0.2-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:701171f825dcab90969596ce2af253143b93b08f1a716d4b2a9d2db5084ef7be"}, + {file = "cryptography-42.0.2-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:61321672b3ac7aade25c40449ccedbc6db72c7f5f0fdf34def5e2f8b51ca530d"}, + {file = "cryptography-42.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea2c3ffb662fec8bbbfce5602e2c159ff097a4631d96235fcf0fb00e59e3ece4"}, + {file = "cryptography-42.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b15c678f27d66d247132cbf13df2f75255627bcc9b6a570f7d2fd08e8c081d2"}, + {file = "cryptography-42.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:8e88bb9eafbf6a4014d55fb222e7360eef53e613215085e65a13290577394529"}, + {file = "cryptography-42.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a047682d324ba56e61b7ea7c7299d51e61fd3bca7dad2ccc39b72bd0118d60a1"}, + {file = "cryptography-42.0.2-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:36d4b7c4be6411f58f60d9ce555a73df8406d484ba12a63549c88bd64f7967f1"}, + {file = "cryptography-42.0.2-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:a00aee5d1b6c20620161984f8ab2ab69134466c51f58c052c11b076715e72929"}, + {file = "cryptography-42.0.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b97fe7d7991c25e6a31e5d5e795986b18fbbb3107b873d5f3ae6dc9a103278e9"}, + {file = "cryptography-42.0.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5fa82a26f92871eca593b53359c12ad7949772462f887c35edaf36f87953c0e2"}, + {file = "cryptography-42.0.2-cp37-abi3-win32.whl", hash = "sha256:4b063d3413f853e056161eb0c7724822a9740ad3caa24b8424d776cebf98e7ee"}, + {file = "cryptography-42.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:841ec8af7a8491ac76ec5a9522226e287187a3107e12b7d686ad354bb78facee"}, + {file = "cryptography-42.0.2-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:55d1580e2d7e17f45d19d3b12098e352f3a37fe86d380bf45846ef257054b242"}, + {file = "cryptography-42.0.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28cb2c41f131a5758d6ba6a0504150d644054fd9f3203a1e8e8d7ac3aea7f73a"}, + {file = "cryptography-42.0.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9097a208875fc7bbeb1286d0125d90bdfed961f61f214d3f5be62cd4ed8a446"}, + {file = "cryptography-42.0.2-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:44c95c0e96b3cb628e8452ec060413a49002a247b2b9938989e23a2c8291fc90"}, + {file = "cryptography-42.0.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2f9f14185962e6a04ab32d1abe34eae8a9001569ee4edb64d2304bf0d65c53f3"}, + {file = "cryptography-42.0.2-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:09a77e5b2e8ca732a19a90c5bca2d124621a1edb5438c5daa2d2738bfeb02589"}, + {file = "cryptography-42.0.2-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad28cff53f60d99a928dfcf1e861e0b2ceb2bc1f08a074fdd601b314e1cc9e0a"}, + {file = "cryptography-42.0.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:130c0f77022b2b9c99d8cebcdd834d81705f61c68e91ddd614ce74c657f8b3ea"}, + {file = "cryptography-42.0.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:fa3dec4ba8fb6e662770b74f62f1a0c7d4e37e25b58b2bf2c1be4c95372b4a33"}, + {file = "cryptography-42.0.2-cp39-abi3-win32.whl", hash = "sha256:3dbd37e14ce795b4af61b89b037d4bc157f2cb23e676fa16932185a04dfbf635"}, + {file = "cryptography-42.0.2-cp39-abi3-win_amd64.whl", hash = "sha256:8a06641fb07d4e8f6c7dda4fc3f8871d327803ab6542e33831c7ccfdcb4d0ad6"}, + {file = "cryptography-42.0.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:087887e55e0b9c8724cf05361357875adb5c20dec27e5816b653492980d20380"}, + {file = "cryptography-42.0.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a7ef8dd0bf2e1d0a27042b231a3baac6883cdd5557036f5e8df7139255feaac6"}, + {file = "cryptography-42.0.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4383b47f45b14459cab66048d384614019965ba6c1a1a141f11b5a551cace1b2"}, + {file = "cryptography-42.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:fbeb725c9dc799a574518109336acccaf1303c30d45c075c665c0793c2f79a7f"}, + {file = "cryptography-42.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:320948ab49883557a256eab46149df79435a22d2fefd6a66fe6946f1b9d9d008"}, + {file = "cryptography-42.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5ef9bc3d046ce83c4bbf4c25e1e0547b9c441c01d30922d812e887dc5f125c12"}, + {file = "cryptography-42.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:52ed9ebf8ac602385126c9a2fe951db36f2cb0c2538d22971487f89d0de4065a"}, + {file = "cryptography-42.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:141e2aa5ba100d3788c0ad7919b288f89d1fe015878b9659b307c9ef867d3a65"}, + {file = "cryptography-42.0.2.tar.gz", hash = "sha256:e0ec52ba3c7f1b7d813cd52649a5b3ef1fc0d433219dc8c93827c57eab6cf888"}, ] [package.dependencies] @@ -799,54 +779,43 @@ langdetect = ["langdetect"] [[package]] name = "distlib" -version = "0.3.8" +version = "0.3.6" description = "Distribution utilities" optional = false python-versions = "*" files = [ - {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, - {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, -] - -[[package]] -name = "distro" -version = "1.9.0" -description = "Distro - an OS platform information API" -optional = false -python-versions = ">=3.6" -files = [ - {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"}, - {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, + {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, + {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, ] [[package]] name = "dparse" -version = "0.6.3" +version = "0.6.2" description = "A parser for Python dependency files" optional = false -python-versions = ">=3.6" +python-versions = ">=3.5" files = [ - {file = "dparse-0.6.3-py3-none-any.whl", hash = "sha256:0d8fe18714056ca632d98b24fbfc4e9791d4e47065285ab486182288813a5318"}, - {file = "dparse-0.6.3.tar.gz", hash = "sha256:27bb8b4bcaefec3997697ba3f6e06b2447200ba273c0b085c3d012a04571b528"}, + {file = "dparse-0.6.2-py3-none-any.whl", hash = "sha256:8097076f1dd26c377f30d4745e6ec18fef42f3bf493933b842ac5bafad8c345f"}, + {file = "dparse-0.6.2.tar.gz", hash = "sha256:d45255bda21f998bc7ddf2afd5e62505ba6134756ba2d42a84c56b0826614dfe"}, ] [package.dependencies] packaging = "*" -tomli = {version = "*", markers = "python_version < \"3.11\""} +toml = "*" [package.extras] conda = ["pyyaml"] -pipenv = ["pipenv (<=2022.12.19)"] +pipenv = ["pipenv"] [[package]] name = "exceptiongroup" -version = "1.2.0" +version = "1.1.1" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, - {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, ] [package.extras] @@ -854,33 +823,32 @@ test = ["pytest (>=6)"] [[package]] name = "execnet" -version = "2.0.2" +version = "1.9.0" description = "execnet: rapid multi-Python deployment" optional = false -python-versions = ">=3.7" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ - {file = "execnet-2.0.2-py3-none-any.whl", hash = "sha256:88256416ae766bc9e8895c76a87928c0012183da3cc4fc18016e6f050e025f41"}, - {file = "execnet-2.0.2.tar.gz", hash = "sha256:cc59bc4423742fd71ad227122eb0dd44db51efb3dc4095b45ac9a08c770096af"}, + {file = "execnet-1.9.0-py2.py3-none-any.whl", hash = "sha256:a295f7cc774947aac58dde7fdc85f4aa00c42adf5d8f5468fc630c1acf30a142"}, + {file = "execnet-1.9.0.tar.gz", hash = "sha256:8f694f3ba9cc92cab508b152dcfe322153975c29bda272e2fd7f3f00f36e47c5"}, ] [package.extras] -testing = ["hatch", "pre-commit", "pytest", "tox"] +testing = ["pre-commit"] [[package]] name = "filelock" -version = "3.13.1" +version = "3.11.0" description = "A platform independent file lock." optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, - {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, + {file = "filelock-3.11.0-py3-none-any.whl", hash = "sha256:f08a52314748335c6460fc8fe40cd5638b85001225db78c2aa01c8c0db83b318"}, + {file = "filelock-3.11.0.tar.gz", hash = "sha256:3618c0da67adcc0506b015fd11ef7faf1b493f0b40d87728e19986b536890c37"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] -typing = ["typing-extensions (>=4.8)"] +docs = ["furo (>=2023.3.27)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.2.2)", "diff-cover (>=7.5)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] [[package]] name = "flask" @@ -939,31 +907,32 @@ Flask = "*" [[package]] name = "flask-cors" -version = "4.0.0" +version = "3.0.10" description = "A Flask extension adding a decorator for CORS support" optional = false python-versions = "*" files = [ - {file = "Flask-Cors-4.0.0.tar.gz", hash = "sha256:f268522fcb2f73e2ecdde1ef45e2fd5c71cc48fe03cffb4b441c6d1b40684eb0"}, - {file = "Flask_Cors-4.0.0-py2.py3-none-any.whl", hash = "sha256:bc3492bfd6368d27cfe79c7821df5a8a319e1a6d5eab277a3794be19bdc51783"}, + {file = "Flask-Cors-3.0.10.tar.gz", hash = "sha256:b60839393f3b84a0f3746f6cdca56c1ad7426aa738b70d6c61375857823181de"}, + {file = "Flask_Cors-3.0.10-py2.py3-none-any.whl", hash = "sha256:74efc975af1194fc7891ff5cd85b0f7478be4f7f59fe158102e91abb72bb4438"}, ] [package.dependencies] Flask = ">=0.9" +Six = "*" [[package]] name = "flask-jwt-extended" -version = "4.6.0" +version = "4.4.4" description = "Extended JWT integration with Flask" optional = false python-versions = ">=3.7,<4" files = [ - {file = "Flask-JWT-Extended-4.6.0.tar.gz", hash = "sha256:9215d05a9413d3855764bcd67035e75819d23af2fafb6b55197eb5a3313fdfb2"}, - {file = "Flask_JWT_Extended-4.6.0-py2.py3-none-any.whl", hash = "sha256:63a28fc9731bcc6c4b8815b6f954b5904caa534fc2ae9b93b1d3ef12930dca95"}, + {file = "Flask-JWT-Extended-4.4.4.tar.gz", hash = "sha256:62b521d75494c290a646ae8acc77123721e4364790f1e64af0038d823961fbf0"}, + {file = "Flask_JWT_Extended-4.4.4-py2.py3-none-any.whl", hash = "sha256:a85eebfa17c339a7260c4643475af444784ba6de5588adda67406f0a75599553"}, ] [package.dependencies] -Flask = ">=2.0,<4.0" +Flask = ">=2.0,<3.0" PyJWT = ">=2.0,<3.0" Werkzeug = ">=0.14" @@ -986,34 +955,35 @@ Flask = "*" [[package]] name = "flask-marshmallow" -version = "1.2.0" +version = "0.15.0" description = "Flask + marshmallow for beautiful APIs" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "flask_marshmallow-1.2.0-py3-none-any.whl", hash = "sha256:ddd2a7c8db5e00a8d56c8ca5f651efae1de7d76b7d821b56ccc2caf09135ad12"}, - {file = "flask_marshmallow-1.2.0.tar.gz", hash = "sha256:d0f79eb9743f0c530a3d9e848503e1f2228e6b35a819c91e913af02e68421805"}, + {file = "flask-marshmallow-0.15.0.tar.gz", hash = "sha256:2083ae55bebb5142fff98c6bbd483a2f5dbc531a8bc1be2180ed5f75e7f3fccc"}, + {file = "flask_marshmallow-0.15.0-py2.py3-none-any.whl", hash = "sha256:ce08a153f74da6ebfffd8065d1687508b0179df37fff7fc0c8f28ccfb64f1b56"}, ] [package.dependencies] -Flask = ">=2.2" +Flask = "*" marshmallow = ">=3.0.0" +packaging = ">=17.0" [package.extras] -dev = ["flask-marshmallow[tests]", "pre-commit (>=3.5,<4.0)", "tox"] -docs = ["Sphinx (==7.2.6)", "marshmallow-sqlalchemy (>=0.19.0)", "sphinx-issues (==4.0.0)"] -sqlalchemy = ["flask-sqlalchemy (>=3.0.0)", "marshmallow-sqlalchemy (>=0.29.0)"] -tests = ["flask-marshmallow[sqlalchemy]", "pytest"] +dev = ["flask-sqlalchemy (>=3.0.0)", "marshmallow-sqlalchemy (>=0.28.2)", "mock", "pre-commit", "pytest", "tox"] +docs = ["Sphinx (==6.1.3)", "marshmallow-sqlalchemy (>=0.13.0)", "sphinx-issues (==3.0.1)"] +sqlalchemy = ["flask-sqlalchemy (>=3.0.0)", "marshmallow-sqlalchemy (>=0.28.2)"] +tests = ["flask-sqlalchemy (>=3.0.0)", "marshmallow-sqlalchemy (>=0.28.2)", "mock", "pytest"] [[package]] name = "flask-migrate" -version = "4.0.5" +version = "4.0.4" description = "SQLAlchemy database migrations for Flask applications using Alembic." optional = false python-versions = ">=3.6" files = [ - {file = "Flask-Migrate-4.0.5.tar.gz", hash = "sha256:d3f437a8b5f3849d1bb1b60e1b818efc564c66e3fefe90b62e5db08db295e1b1"}, - {file = "Flask_Migrate-4.0.5-py3-none-any.whl", hash = "sha256:613a2df703998e78716cace68cd83972960834424457f5b67f56e74fff950aef"}, + {file = "Flask-Migrate-4.0.4.tar.gz", hash = "sha256:73293d40b10ac17736e715b377e7b7bde474cb8105165d77474df4c3619b10b3"}, + {file = "Flask_Migrate-4.0.4-py3-none-any.whl", hash = "sha256:77580f27ab39bc68be4906a43c56d7674b45075bc4f883b1d0b985db5164d58f"}, ] [package.dependencies] @@ -1040,13 +1010,13 @@ requests-oauthlib = ">=0.6.2,<1.2.0" [[package]] name = "flask-restful" -version = "0.3.10" +version = "0.3.9" description = "Simple framework for creating REST APIs" optional = false python-versions = "*" files = [ - {file = "Flask-RESTful-0.3.10.tar.gz", hash = "sha256:fe4af2ef0027df8f9b4f797aba20c5566801b6ade995ac63b588abf1a59cec37"}, - {file = "Flask_RESTful-0.3.10-py2.py3-none-any.whl", hash = "sha256:1cf93c535172f112e080b0d4503a8d15f93a48c88bdd36dd87269bdaf405051b"}, + {file = "Flask-RESTful-0.3.9.tar.gz", hash = "sha256:ccec650b835d48192138c85329ae03735e6ced58e9b2d9c2146d6c84c06fa53e"}, + {file = "Flask_RESTful-0.3.9-py2.py3-none-any.whl", hash = "sha256:4970c49b6488e46c520b325f54833374dc2b98e211f1b272bd4b0c516232afe2"}, ] [package.dependencies] @@ -1075,18 +1045,18 @@ flask = ">=2.2" [[package]] name = "flask-sqlalchemy" -version = "3.1.1" +version = "3.0.5" description = "Add SQLAlchemy support to your Flask application." optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "flask_sqlalchemy-3.1.1-py3-none-any.whl", hash = "sha256:4ba4be7f419dc72f4efd8802d69974803c37259dd42f3913b0dcf75c9447e0a0"}, - {file = "flask_sqlalchemy-3.1.1.tar.gz", hash = "sha256:e4b68bb881802dda1a7d878b2fc84c06d1ee57fb40b874d3dc97dabfa36b8312"}, + {file = "flask_sqlalchemy-3.0.5-py3-none-any.whl", hash = "sha256:cabb6600ddd819a9f859f36515bb1bd8e7dbf30206cc679d2b081dff9e383283"}, + {file = "flask_sqlalchemy-3.0.5.tar.gz", hash = "sha256:c5765e58ca145401b52106c0f46178569243c5da25556be2c231ecc60867c5b1"}, ] [package.dependencies] flask = ">=2.2.5" -sqlalchemy = ">=2.0.16" +sqlalchemy = ">=1.4.18" [[package]] name = "greenlet" @@ -1180,70 +1150,14 @@ setproctitle = ["setproctitle"] tornado = ["tornado (>=0.2)"] [[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +name = "identify" +version = "2.5.22" +description = "File identification library for Python" optional = false python-versions = ">=3.7" files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - -[[package]] -name = "httpcore" -version = "1.0.3" -description = "A minimal low-level HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpcore-1.0.3-py3-none-any.whl", hash = "sha256:9a6a501c3099307d9fd76ac244e08503427679b1e81ceb1d922485e2f2462ad2"}, - {file = "httpcore-1.0.3.tar.gz", hash = "sha256:5c0f9546ad17dac4d0772b0808856eb616eb8b48ce94f49ed819fd6982a8a544"}, -] - -[package.dependencies] -certifi = "*" -h11 = ">=0.13,<0.15" - -[package.extras] -asyncio = ["anyio (>=4.0,<5.0)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.24.0)"] - -[[package]] -name = "httpx" -version = "0.26.0" -description = "The next generation HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpx-0.26.0-py3-none-any.whl", hash = "sha256:8915f5a3627c4d47b73e8202457cb28f1266982d1159bd5779d86a80c0eab1cd"}, - {file = "httpx-0.26.0.tar.gz", hash = "sha256:451b55c30d5185ea6b23c2c793abf9bb237d2a7dfb901ced6ff69ad37ec1dfaf"}, -] - -[package.dependencies] -anyio = "*" -certifi = "*" -httpcore = "==1.*" -idna = "*" -sniffio = "*" - -[package.extras] -brotli = ["brotli", "brotlicffi"] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] - -[[package]] -name = "identify" -version = "2.5.35" -description = "File identification library for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "identify-2.5.35-py2.py3-none-any.whl", hash = "sha256:c4de0081837b211594f8e877a6b4fad7ca32bbfc1a9307fdd61c28bfe923f13e"}, - {file = "identify-2.5.35.tar.gz", hash = "sha256:10a7ca245cfcd756a554a7288159f72ff105ad233c7c4b9c6f0f4d108f5f6791"}, + {file = "identify-2.5.22-py2.py3-none-any.whl", hash = "sha256:f0faad595a4687053669c112004178149f6c326db71ee999ae4636685753ad2f"}, + {file = "identify-2.5.22.tar.gz", hash = "sha256:f7a93d6cf98e29bd07663c60728e7a4057615068d7a639d132dc883b2d54d31e"}, ] [package.extras] @@ -1251,13 +1165,13 @@ license = ["ukkonen"] [[package]] name = "idna" -version = "3.6" +version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, - {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, ] [[package]] @@ -1312,13 +1226,13 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jsonschema" -version = "4.21.1" +version = "4.20.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.21.1-py3-none-any.whl", hash = "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f"}, - {file = "jsonschema-4.21.1.tar.gz", hash = "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5"}, + {file = "jsonschema-4.20.0-py3-none-any.whl", hash = "sha256:ed6231f0429ecf966f5bc8dfef245998220549cbbcf140f913b7464c52c3b6b3"}, + {file = "jsonschema-4.20.0.tar.gz", hash = "sha256:4f614fd46d8d61258610998997743ec5492a648b33cf478c1ddc23ed4598a5fa"}, ] [package.dependencies] @@ -1347,13 +1261,13 @@ referencing = ">=0.31.0" [[package]] name = "kombu" -version = "5.3.5" +version = "5.3.4" description = "Messaging library for Python." optional = false python-versions = ">=3.8" files = [ - {file = "kombu-5.3.5-py3-none-any.whl", hash = "sha256:0eac1bbb464afe6fb0924b21bf79460416d25d8abc52546d4f16cad94f789488"}, - {file = "kombu-5.3.5.tar.gz", hash = "sha256:30e470f1a6b49c70dc6f6d13c3e4cc4e178aa6c469ceb6bcd55645385fc84b93"}, + {file = "kombu-5.3.4-py3-none-any.whl", hash = "sha256:63bb093fc9bb80cfb3a0972336a5cec1fa7ac5f9ef7e8237c6bf8dda9469313e"}, + {file = "kombu-5.3.4.tar.gz", hash = "sha256:0bb2e278644d11dea6272c17974a3dbb9688a949f3bb60aeb5b791329c44fadc"}, ] [package.dependencies] @@ -1487,13 +1401,13 @@ source = ["Cython (==0.29.37)"] [[package]] name = "mako" -version = "1.3.2" +version = "1.2.4" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "Mako-1.3.2-py3-none-any.whl", hash = "sha256:32a99d70754dfce237019d17ffe4a282d2d3351b9c476e90d8a60e63f133b80c"}, - {file = "Mako-1.3.2.tar.gz", hash = "sha256:2a0c8ad7f6274271b3bb7467dd37cf9cc6dab4bc19cb69a4ef10669402de698e"}, + {file = "Mako-1.2.4-py3-none-any.whl", hash = "sha256:c97c79c018b9165ac9922ae4f32da095ffd3c4e6872b45eded42926deea46818"}, + {file = "Mako-1.2.4.tar.gz", hash = "sha256:d60a3903dc3bb01a18ad6a89cdbe2e4eadc69c0bc8ef1e3773ba53d44c3f7a34"}, ] [package.dependencies] @@ -1530,91 +1444,81 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.1.5" +version = "2.1.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"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-win32.whl", hash = "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-win32.whl", hash = "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-win32.whl", hash = "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-win32.whl", hash = "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-win32.whl", hash = "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed"}, + {file = "MarkupSafe-2.1.2.tar.gz", hash = "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d"}, ] [[package]] name = "marshmallow" -version = "3.20.2" +version = "3.19.0" description = "A lightweight library for converting complex datatypes to and from native Python datatypes." optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "marshmallow-3.20.2-py3-none-any.whl", hash = "sha256:c21d4b98fee747c130e6bc8f45c4b3199ea66bc00c12ee1f639f0aeca034d5e9"}, - {file = "marshmallow-3.20.2.tar.gz", hash = "sha256:4c1daff273513dc5eb24b219a8035559dc573c8f322558ef85f5438ddd1236dd"}, + {file = "marshmallow-3.19.0-py3-none-any.whl", hash = "sha256:93f0958568da045b0021ec6aeb7ac37c81bfcccbb9a0e7ed8559885070b3a19b"}, + {file = "marshmallow-3.19.0.tar.gz", hash = "sha256:90032c0fd650ce94b6ec6dc8dfeb0e3ff50c144586462c389b81a07205bedb78"}, ] [package.dependencies] packaging = ">=17.0" [package.extras] -dev = ["pre-commit (>=2.4,<4.0)", "pytest", "pytz", "simplejson", "tox"] -docs = ["alabaster (==0.7.15)", "autodocsumm (==0.2.12)", "sphinx (==7.2.6)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] -lint = ["pre-commit (>=2.4,<4.0)"] +dev = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)", "pytest", "pytz", "simplejson", "tox"] +docs = ["alabaster (==0.7.12)", "autodocsumm (==0.2.9)", "sphinx (==5.3.0)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] +lint = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)"] tests = ["pytest", "pytz", "simplejson"] [[package]] @@ -1664,49 +1568,48 @@ files = [ [[package]] name = "mypy" -version = "1.8.0" +version = "1.2.0" description = "Optional static typing for Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "mypy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3"}, - {file = "mypy-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4"}, - {file = "mypy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d"}, - {file = "mypy-1.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9"}, - {file = "mypy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410"}, - {file = "mypy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae"}, - {file = "mypy-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3"}, - {file = "mypy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817"}, - {file = "mypy-1.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d"}, - {file = "mypy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835"}, - {file = "mypy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd"}, - {file = "mypy-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55"}, - {file = "mypy-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218"}, - {file = "mypy-1.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3"}, - {file = "mypy-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e"}, - {file = "mypy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6"}, - {file = "mypy-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66"}, - {file = "mypy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6"}, - {file = "mypy-1.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d"}, - {file = "mypy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02"}, - {file = "mypy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8"}, - {file = "mypy-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259"}, - {file = "mypy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b"}, - {file = "mypy-1.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592"}, - {file = "mypy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a"}, - {file = "mypy-1.8.0-py3-none-any.whl", hash = "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d"}, - {file = "mypy-1.8.0.tar.gz", hash = "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07"}, + {file = "mypy-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:701189408b460a2ff42b984e6bd45c3f41f0ac9f5f58b8873bbedc511900086d"}, + {file = "mypy-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fe91be1c51c90e2afe6827601ca14353bbf3953f343c2129fa1e247d55fd95ba"}, + {file = "mypy-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d26b513225ffd3eacece727f4387bdce6469192ef029ca9dd469940158bc89e"}, + {file = "mypy-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3a2d219775a120581a0ae8ca392b31f238d452729adbcb6892fa89688cb8306a"}, + {file = "mypy-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:2e93a8a553e0394b26c4ca683923b85a69f7ccdc0139e6acd1354cc884fe0128"}, + {file = "mypy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3efde4af6f2d3ccf58ae825495dbb8d74abd6d176ee686ce2ab19bd025273f41"}, + {file = "mypy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:695c45cea7e8abb6f088a34a6034b1d273122e5530aeebb9c09626cea6dca4cb"}, + {file = "mypy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0e9464a0af6715852267bf29c9553e4555b61f5904a4fc538547a4d67617937"}, + {file = "mypy-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8293a216e902ac12779eb7a08f2bc39ec6c878d7c6025aa59464e0c4c16f7eb9"}, + {file = "mypy-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:f46af8d162f3d470d8ffc997aaf7a269996d205f9d746124a179d3abe05ac602"}, + {file = "mypy-1.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:031fc69c9a7e12bcc5660b74122ed84b3f1c505e762cc4296884096c6d8ee140"}, + {file = "mypy-1.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:390bc685ec209ada4e9d35068ac6988c60160b2b703072d2850457b62499e336"}, + {file = "mypy-1.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4b41412df69ec06ab141808d12e0bf2823717b1c363bd77b4c0820feaa37249e"}, + {file = "mypy-1.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4e4a682b3f2489d218751981639cffc4e281d548f9d517addfd5a2917ac78119"}, + {file = "mypy-1.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a197ad3a774f8e74f21e428f0de7f60ad26a8d23437b69638aac2764d1e06a6a"}, + {file = "mypy-1.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c9a084bce1061e55cdc0493a2ad890375af359c766b8ac311ac8120d3a472950"}, + {file = "mypy-1.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaeaa0888b7f3ccb7bcd40b50497ca30923dba14f385bde4af78fac713d6d6f6"}, + {file = "mypy-1.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bea55fc25b96c53affab852ad94bf111a3083bc1d8b0c76a61dd101d8a388cf5"}, + {file = "mypy-1.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:4c8d8c6b80aa4a1689f2a179d31d86ae1367ea4a12855cc13aa3ba24bb36b2d8"}, + {file = "mypy-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:70894c5345bea98321a2fe84df35f43ee7bb0feec117a71420c60459fc3e1eed"}, + {file = "mypy-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4a99fe1768925e4a139aace8f3fb66db3576ee1c30b9c0f70f744ead7e329c9f"}, + {file = "mypy-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:023fe9e618182ca6317ae89833ba422c411469156b690fde6a315ad10695a521"}, + {file = "mypy-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4d19f1a239d59f10fdc31263d48b7937c585810288376671eaf75380b074f238"}, + {file = "mypy-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:2de7babe398cb7a85ac7f1fd5c42f396c215ab3eff731b4d761d68d0f6a80f48"}, + {file = "mypy-1.2.0-py3-none-any.whl", hash = "sha256:d8e9187bfcd5ffedbe87403195e1fc340189a68463903c39e2b63307c9fa0394"}, + {file = "mypy-1.2.0.tar.gz", hash = "sha256:f70a40410d774ae23fcb4afbbeca652905a04de7948eaf0b1789c8d1426b72d1"}, ] [package.dependencies] mypy-extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=4.1.0" +typing-extensions = ">=3.10" [package.extras] dmypy = ["psutil (>=4.0)"] install-types = ["pip"] -mypyc = ["setuptools (>=50)"] +python2 = ["typed-ast (>=1.4.0,<2)"] reports = ["lxml"] [[package]] @@ -1722,31 +1625,29 @@ files = [ [[package]] name = "mysqlclient" -version = "2.2.4" +version = "2.2.0" description = "Python interface to MySQL" optional = false python-versions = ">=3.8" files = [ - {file = "mysqlclient-2.2.4-cp310-cp310-win_amd64.whl", hash = "sha256:ac44777eab0a66c14cb0d38965572f762e193ec2e5c0723bcd11319cc5b693c5"}, - {file = "mysqlclient-2.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:329e4eec086a2336fe3541f1ce095d87a6f169d1cc8ba7b04ac68bcb234c9711"}, - {file = "mysqlclient-2.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:e1ebe3f41d152d7cb7c265349fdb7f1eca86ccb0ca24a90036cde48e00ceb2ab"}, - {file = "mysqlclient-2.2.4-cp38-cp38-win_amd64.whl", hash = "sha256:3c318755e06df599338dad7625f884b8a71fcf322a9939ef78c9b3db93e1de7a"}, - {file = "mysqlclient-2.2.4-cp39-cp39-win_amd64.whl", hash = "sha256:9d4c015480c4a6b2b1602eccd9846103fc70606244788d04aa14b31c4bd1f0e2"}, - {file = "mysqlclient-2.2.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d43987bb9626096a302ca6ddcdd81feaeca65ced1d5fe892a6a66b808326aa54"}, - {file = "mysqlclient-2.2.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4e80dcad884dd6e14949ac6daf769123223a52a6805345608bf49cdaf7bc8b3a"}, - {file = "mysqlclient-2.2.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:9d3310295cb682232cadc28abd172f406c718b9ada41d2371259098ae37779d3"}, - {file = "mysqlclient-2.2.4.tar.gz", hash = "sha256:33bc9fb3464e7d7c10b1eaf7336c5ff8f2a3d3b88bab432116ad2490beb3bf41"}, + {file = "mysqlclient-2.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:68837b6bb23170acffb43ae411e47533a560b6360c06dac39aa55700972c93b2"}, + {file = "mysqlclient-2.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:5670679ff1be1cc3fef0fa81bf39f0cd70605ba121141050f02743eb878ac114"}, + {file = "mysqlclient-2.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:004fe1d30d2c2ff8072f8ea513bcec235fd9b896f70dad369461d0ad7e570e98"}, + {file = "mysqlclient-2.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:9c6b142836c7dba4f723bf9c93cc46b6e5081d65b2af807f400dda9eb85a16d0"}, + {file = "mysqlclient-2.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:955dba905a7443ce4788c63fdb9f8d688316260cf60b20ff51ac3b1c77616ede"}, + {file = "mysqlclient-2.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:530ece9995a36cadb6211b9787f0c9e05cdab6702549bdb4236af5e9b535ed6a"}, + {file = "mysqlclient-2.2.0.tar.gz", hash = "sha256:04368445f9c487d8abb7a878e3d23e923e6072c04a6c320f9e0dc8a82efba14e"}, ] [[package]] name = "nodeenv" -version = "1.8.0" +version = "1.7.0" description = "Node.js virtual environment builder" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" files = [ - {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, - {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, + {file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"}, + {file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"}, ] [package.dependencies] @@ -1769,89 +1670,63 @@ signals = ["blinker"] signedtoken = ["cryptography", "pyjwt (>=1.0.0)"] test = ["blinker", "cryptography", "mock", "nose", "pyjwt (>=1.0.0)", "unittest2"] -[[package]] -name = "openai" -version = "1.12.0" -description = "The official Python library for the openai API" -optional = false -python-versions = ">=3.7.1" -files = [ - {file = "openai-1.12.0-py3-none-any.whl", hash = "sha256:a54002c814e05222e413664f651b5916714e4700d041d5cf5724d3ae1a3e3481"}, - {file = "openai-1.12.0.tar.gz", hash = "sha256:99c5d257d09ea6533d689d1cc77caa0ac679fa21efef8893d8b0832a86877f1b"}, -] - -[package.dependencies] -anyio = ">=3.5.0,<5" -distro = ">=1.7.0,<2" -httpx = ">=0.23.0,<1" -pydantic = ">=1.9.0,<3" -sniffio = "*" -tqdm = ">4" -typing-extensions = ">=4.7,<5" - -[package.extras] -datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] - [[package]] name = "packaging" -version = "21.3" +version = "23.2" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] -[package.dependencies] -pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" - [[package]] name = "pathspec" -version = "0.12.1" +version = "0.11.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, - {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, + {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, + {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, ] [[package]] name = "pbr" -version = "6.0.0" +version = "5.11.1" description = "Python Build Reasonableness" optional = false python-versions = ">=2.6" files = [ - {file = "pbr-6.0.0-py2.py3-none-any.whl", hash = "sha256:4a7317d5e3b17a3dccb6a8cfe67dab65b20551404c52c8ed41279fa4f0cb4cda"}, - {file = "pbr-6.0.0.tar.gz", hash = "sha256:d1377122a5a00e2f940ee482999518efe16d745d423a670c27773dfbc3c9a7d9"}, + {file = "pbr-5.11.1-py2.py3-none-any.whl", hash = "sha256:567f09558bae2b3ab53cb3c1e2e33e726ff3338e7bae3db5dc954b3a44eef12b"}, + {file = "pbr-5.11.1.tar.gz", hash = "sha256:aefc51675b0b533d56bb5fd1c8c6c0522fe31896679882e1c4c63d5e4a0fccb3"}, ] [[package]] name = "platformdirs" -version = "4.2.0" +version = "3.2.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, - {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, + {file = "platformdirs-3.2.0-py3-none-any.whl", hash = "sha256:ebe11c0d7a805086e99506aa331612429a72ca7cd52a1f0d277dc4adc20cb10e"}, + {file = "platformdirs-3.2.0.tar.gz", hash = "sha256:d5b638ca397f25f979350ff789db335903d7ea010ab28903f57b27e1b16c2b08"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] [[package]] name = "pluggy" -version = "1.4.0" +version = "1.0.0" description = "plugin and hook calling mechanisms for python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.6" files = [ - {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, - {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] [package.extras] @@ -1878,13 +1753,13 @@ virtualenv = ">=20.10.0" [[package]] name = "pre-commit-hooks" -version = "4.5.0" +version = "4.4.0" description = "Some out-of-the-box hooks for pre-commit." optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "pre_commit_hooks-4.5.0-py2.py3-none-any.whl", hash = "sha256:b779d5c44ede9b1fda48e2d96b08e9aa5b1d2fdb8903ca09f0dbaca22d529edb"}, - {file = "pre_commit_hooks-4.5.0.tar.gz", hash = "sha256:ffbe2af1c85ac9a7695866955680b4dee98822638b748a6f3debefad79748c8a"}, + {file = "pre_commit_hooks-4.4.0-py2.py3-none-any.whl", hash = "sha256:fc8837335476221ccccda3d176ed6ae29fe58753ce7e8b7863f5d0f987328fc6"}, + {file = "pre_commit_hooks-4.4.0.tar.gz", hash = "sha256:7011eed8e1a25cde94693da009cba76392194cecc2f3f06c51a44ea6ad6c2af9"}, ] [package.dependencies] @@ -1893,13 +1768,13 @@ tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} [[package]] name = "prometheus-client" -version = "0.20.0" +version = "0.16.0" description = "Python client for the Prometheus monitoring system." optional = false -python-versions = ">=3.8" +python-versions = ">=3.6" files = [ - {file = "prometheus_client-0.20.0-py3-none-any.whl", hash = "sha256:cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7"}, - {file = "prometheus_client-0.20.0.tar.gz", hash = "sha256:287629d00b147a32dcb2be0b9df905da599b2d82f80377083ec8463309a4bb89"}, + {file = "prometheus_client-0.16.0-py3-none-any.whl", hash = "sha256:0836af6eb2c8f4fed712b2f279f6c0a8bbab29f9f4aa15276b91c7cb0d1616ab"}, + {file = "prometheus_client-0.16.0.tar.gz", hash = "sha256:a03e35b359f14dd1630898543e2120addfdeacd1a6069c1367ae90fd93ad3f48"}, ] [package.extras] @@ -1907,13 +1782,13 @@ twisted = ["twisted"] [[package]] name = "prometheus-flask-exporter" -version = "0.22.4" +version = "0.22.3" description = "Prometheus metrics exporter for Flask" optional = false python-versions = "*" files = [ - {file = "prometheus_flask_exporter-0.22.4-py3-none-any.whl", hash = "sha256:e130179c26d5a9b903c12c0d8826127ae491b04b298cae0b92b98677dcf2c06f"}, - {file = "prometheus_flask_exporter-0.22.4.tar.gz", hash = "sha256:959b69f1e740b6736ea53fe5f28dc2ab6229b2ebeade6582b3dbb5d74c7d58e4"}, + {file = "prometheus_flask_exporter-0.22.3-py3-none-any.whl", hash = "sha256:16e6a3a7ce0089fc7c78a6956cdf28c184c3ac518e2b46a2a8e410b68d3a84a3"}, + {file = "prometheus_flask_exporter-0.22.3.tar.gz", hash = "sha256:32b152aeb7970cbf04616627fc5bf20d82b0918e54c54f80dc8aaef3349fd333"}, ] [package.dependencies] @@ -1922,13 +1797,13 @@ prometheus-client = "*" [[package]] name = "prompt-toolkit" -version = "3.0.43" +version = "3.0.41" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, - {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, + {file = "prompt_toolkit-3.0.41-py3-none-any.whl", hash = "sha256:f36fe301fafb7470e86aaf90f036eef600a3210be4decf461a5b1ca8403d3cb2"}, + {file = "prompt_toolkit-3.0.41.tar.gz", hash = "sha256:941367d97fc815548822aa26c2a269fdc4eb21e9ec05fc5d447cf09bad5d75f0"}, ] [package.dependencies] @@ -1936,22 +1811,24 @@ wcwidth = "*" [[package]] name = "psycopg2" -version = "2.9.9" +version = "2.9.6" description = "psycopg2 - Python-PostgreSQL Database Adapter" optional = false -python-versions = ">=3.7" +python-versions = ">=3.6" 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-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.6-cp310-cp310-win32.whl", hash = "sha256:f7a7a5ee78ba7dc74265ba69e010ae89dae635eea0e97b055fb641a01a31d2b1"}, + {file = "psycopg2-2.9.6-cp310-cp310-win_amd64.whl", hash = "sha256:f75001a1cbbe523e00b0ef896a5a1ada2da93ccd752b7636db5a99bc57c44494"}, + {file = "psycopg2-2.9.6-cp311-cp311-win32.whl", hash = "sha256:53f4ad0a3988f983e9b49a5d9765d663bbe84f508ed655affdb810af9d0972ad"}, + {file = "psycopg2-2.9.6-cp311-cp311-win_amd64.whl", hash = "sha256:b81fcb9ecfc584f661b71c889edeae70bae30d3ef74fa0ca388ecda50b1222b7"}, + {file = "psycopg2-2.9.6-cp36-cp36m-win32.whl", hash = "sha256:11aca705ec888e4f4cea97289a0bf0f22a067a32614f6ef64fcf7b8bfbc53744"}, + {file = "psycopg2-2.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:36c941a767341d11549c0fbdbb2bf5be2eda4caf87f65dfcd7d146828bd27f39"}, + {file = "psycopg2-2.9.6-cp37-cp37m-win32.whl", hash = "sha256:869776630c04f335d4124f120b7fb377fe44b0a7645ab3c34b4ba42516951889"}, + {file = "psycopg2-2.9.6-cp37-cp37m-win_amd64.whl", hash = "sha256:a8ad4a47f42aa6aec8d061fdae21eaed8d864d4bb0f0cade5ad32ca16fcd6258"}, + {file = "psycopg2-2.9.6-cp38-cp38-win32.whl", hash = "sha256:2362ee4d07ac85ff0ad93e22c693d0f37ff63e28f0615a16b6635a645f4b9214"}, + {file = "psycopg2-2.9.6-cp38-cp38-win_amd64.whl", hash = "sha256:d24ead3716a7d093b90b27b3d73459fe8cd90fd7065cf43b3c40966221d8c394"}, + {file = "psycopg2-2.9.6-cp39-cp39-win32.whl", hash = "sha256:1861a53a6a0fd248e42ea37c957d36950da00266378746588eab4f4b5649e95f"}, + {file = "psycopg2-2.9.6-cp39-cp39-win_amd64.whl", hash = "sha256:ded2faa2e6dfb430af7713d87ab4abbfc764d8d7fb73eafe96a24155f906ebf5"}, + {file = "psycopg2-2.9.6.tar.gz", hash = "sha256:f15158418fd826831b28585e2ab48ed8df2d0d98f502a2b4fe619e7d5ca29011"}, ] [[package]] @@ -1965,140 +1842,29 @@ files = [ {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, ] -[[package]] -name = "pydantic" -version = "2.6.1" -description = "Data validation using Python type hints" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pydantic-2.6.1-py3-none-any.whl", hash = "sha256:0b6a909df3192245cb736509a92ff69e4fef76116feffec68e93a567347bae6f"}, - {file = "pydantic-2.6.1.tar.gz", hash = "sha256:4fd5c182a2488dc63e6d32737ff19937888001e2a6d86e94b3f233104a5d1fa9"}, -] - -[package.dependencies] -annotated-types = ">=0.4.0" -pydantic-core = "2.16.2" -typing-extensions = ">=4.6.1" - -[package.extras] -email = ["email-validator (>=2.0.0)"] - -[[package]] -name = "pydantic-core" -version = "2.16.2" -description = "" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pydantic_core-2.16.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3fab4e75b8c525a4776e7630b9ee48aea50107fea6ca9f593c98da3f4d11bf7c"}, - {file = "pydantic_core-2.16.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8bde5b48c65b8e807409e6f20baee5d2cd880e0fad00b1a811ebc43e39a00ab2"}, - {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2924b89b16420712e9bb8192396026a8fbd6d8726224f918353ac19c4c043d2a"}, - {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:16aa02e7a0f539098e215fc193c8926c897175d64c7926d00a36188917717a05"}, - {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:936a787f83db1f2115ee829dd615c4f684ee48ac4de5779ab4300994d8af325b"}, - {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:459d6be6134ce3b38e0ef76f8a672924460c455d45f1ad8fdade36796df1ddc8"}, - {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9ee4febb249c591d07b2d4dd36ebcad0ccd128962aaa1801508320896575ef"}, - {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40a0bd0bed96dae5712dab2aba7d334a6c67cbcac2ddfca7dbcc4a8176445990"}, - {file = "pydantic_core-2.16.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:870dbfa94de9b8866b37b867a2cb37a60c401d9deb4a9ea392abf11a1f98037b"}, - {file = "pydantic_core-2.16.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:308974fdf98046db28440eb3377abba274808bf66262e042c412eb2adf852731"}, - {file = "pydantic_core-2.16.2-cp310-none-win32.whl", hash = "sha256:a477932664d9611d7a0816cc3c0eb1f8856f8a42435488280dfbf4395e141485"}, - {file = "pydantic_core-2.16.2-cp310-none-win_amd64.whl", hash = "sha256:8f9142a6ed83d90c94a3efd7af8873bf7cefed2d3d44387bf848888482e2d25f"}, - {file = "pydantic_core-2.16.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:406fac1d09edc613020ce9cf3f2ccf1a1b2f57ab00552b4c18e3d5276c67eb11"}, - {file = "pydantic_core-2.16.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce232a6170dd6532096cadbf6185271e4e8c70fc9217ebe105923ac105da9978"}, - {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a90fec23b4b05a09ad988e7a4f4e081711a90eb2a55b9c984d8b74597599180f"}, - {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8aafeedb6597a163a9c9727d8a8bd363a93277701b7bfd2749fbefee2396469e"}, - {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9957433c3a1b67bdd4c63717eaf174ebb749510d5ea612cd4e83f2d9142f3fc8"}, - {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0d7a9165167269758145756db43a133608a531b1e5bb6a626b9ee24bc38a8f7"}, - {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dffaf740fe2e147fedcb6b561353a16243e654f7fe8e701b1b9db148242e1272"}, - {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8ed79883b4328b7f0bd142733d99c8e6b22703e908ec63d930b06be3a0e7113"}, - {file = "pydantic_core-2.16.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cf903310a34e14651c9de056fcc12ce090560864d5a2bb0174b971685684e1d8"}, - {file = "pydantic_core-2.16.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:46b0d5520dbcafea9a8645a8164658777686c5c524d381d983317d29687cce97"}, - {file = "pydantic_core-2.16.2-cp311-none-win32.whl", hash = "sha256:70651ff6e663428cea902dac297066d5c6e5423fda345a4ca62430575364d62b"}, - {file = "pydantic_core-2.16.2-cp311-none-win_amd64.whl", hash = "sha256:98dc6f4f2095fc7ad277782a7c2c88296badcad92316b5a6e530930b1d475ebc"}, - {file = "pydantic_core-2.16.2-cp311-none-win_arm64.whl", hash = "sha256:ef6113cd31411eaf9b39fc5a8848e71c72656fd418882488598758b2c8c6dfa0"}, - {file = "pydantic_core-2.16.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:88646cae28eb1dd5cd1e09605680c2b043b64d7481cdad7f5003ebef401a3039"}, - {file = "pydantic_core-2.16.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7b883af50eaa6bb3299780651e5be921e88050ccf00e3e583b1e92020333304b"}, - {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bf26c2e2ea59d32807081ad51968133af3025c4ba5753e6a794683d2c91bf6e"}, - {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:99af961d72ac731aae2a1b55ccbdae0733d816f8bfb97b41909e143de735f522"}, - {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02906e7306cb8c5901a1feb61f9ab5e5c690dbbeaa04d84c1b9ae2a01ebe9379"}, - {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5362d099c244a2d2f9659fb3c9db7c735f0004765bbe06b99be69fbd87c3f15"}, - {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ac426704840877a285d03a445e162eb258924f014e2f074e209d9b4ff7bf380"}, - {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b94cbda27267423411c928208e89adddf2ea5dd5f74b9528513f0358bba019cb"}, - {file = "pydantic_core-2.16.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6db58c22ac6c81aeac33912fb1af0e930bc9774166cdd56eade913d5f2fff35e"}, - {file = "pydantic_core-2.16.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396fdf88b1b503c9c59c84a08b6833ec0c3b5ad1a83230252a9e17b7dfb4cffc"}, - {file = "pydantic_core-2.16.2-cp312-none-win32.whl", hash = "sha256:7c31669e0c8cc68400ef0c730c3a1e11317ba76b892deeefaf52dcb41d56ed5d"}, - {file = "pydantic_core-2.16.2-cp312-none-win_amd64.whl", hash = "sha256:a3b7352b48fbc8b446b75f3069124e87f599d25afb8baa96a550256c031bb890"}, - {file = "pydantic_core-2.16.2-cp312-none-win_arm64.whl", hash = "sha256:a9e523474998fb33f7c1a4d55f5504c908d57add624599e095c20fa575b8d943"}, - {file = "pydantic_core-2.16.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ae34418b6b389d601b31153b84dce480351a352e0bb763684a1b993d6be30f17"}, - {file = "pydantic_core-2.16.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:732bd062c9e5d9582a30e8751461c1917dd1ccbdd6cafb032f02c86b20d2e7ec"}, - {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b52776a2e3230f4854907a1e0946eec04d41b1fc64069ee774876bbe0eab55"}, - {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ef551c053692b1e39e3f7950ce2296536728871110e7d75c4e7753fb30ca87f4"}, - {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ebb892ed8599b23fa8f1799e13a12c87a97a6c9d0f497525ce9858564c4575a4"}, - {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa6c8c582036275997a733427b88031a32ffa5dfc3124dc25a730658c47a572f"}, - {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4ba0884a91f1aecce75202473ab138724aa4fb26d7707f2e1fa6c3e68c84fbf"}, - {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7924e54f7ce5d253d6160090ddc6df25ed2feea25bfb3339b424a9dd591688bc"}, - {file = "pydantic_core-2.16.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69a7b96b59322a81c2203be537957313b07dd333105b73db0b69212c7d867b4b"}, - {file = "pydantic_core-2.16.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7e6231aa5bdacda78e96ad7b07d0c312f34ba35d717115f4b4bff6cb87224f0f"}, - {file = "pydantic_core-2.16.2-cp38-none-win32.whl", hash = "sha256:41dac3b9fce187a25c6253ec79a3f9e2a7e761eb08690e90415069ea4a68ff7a"}, - {file = "pydantic_core-2.16.2-cp38-none-win_amd64.whl", hash = "sha256:f685dbc1fdadb1dcd5b5e51e0a378d4685a891b2ddaf8e2bba89bd3a7144e44a"}, - {file = "pydantic_core-2.16.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:55749f745ebf154c0d63d46c8c58594d8894b161928aa41adbb0709c1fe78b77"}, - {file = "pydantic_core-2.16.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b30b0dd58a4509c3bd7eefddf6338565c4905406aee0c6e4a5293841411a1286"}, - {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18de31781cdc7e7b28678df7c2d7882f9692ad060bc6ee3c94eb15a5d733f8f7"}, - {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5864b0242f74b9dd0b78fd39db1768bc3f00d1ffc14e596fd3e3f2ce43436a33"}, - {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8f9186ca45aee030dc8234118b9c0784ad91a0bb27fc4e7d9d6608a5e3d386c"}, - {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc6f6c9be0ab6da37bc77c2dda5f14b1d532d5dbef00311ee6e13357a418e646"}, - {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa057095f621dad24a1e906747179a69780ef45cc8f69e97463692adbcdae878"}, - {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ad84731a26bcfb299f9eab56c7932d46f9cad51c52768cace09e92a19e4cf55"}, - {file = "pydantic_core-2.16.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3b052c753c4babf2d1edc034c97851f867c87d6f3ea63a12e2700f159f5c41c3"}, - {file = "pydantic_core-2.16.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e0f686549e32ccdb02ae6f25eee40cc33900910085de6aa3790effd391ae10c2"}, - {file = "pydantic_core-2.16.2-cp39-none-win32.whl", hash = "sha256:7afb844041e707ac9ad9acad2188a90bffce2c770e6dc2318be0c9916aef1469"}, - {file = "pydantic_core-2.16.2-cp39-none-win_amd64.whl", hash = "sha256:9da90d393a8227d717c19f5397688a38635afec89f2e2d7af0df037f3249c39a"}, - {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f60f920691a620b03082692c378661947d09415743e437a7478c309eb0e4f82"}, - {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:47924039e785a04d4a4fa49455e51b4eb3422d6eaacfde9fc9abf8fdef164e8a"}, - {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6294e76b0380bb7a61eb8a39273c40b20beb35e8c87ee101062834ced19c545"}, - {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe56851c3f1d6f5384b3051c536cc81b3a93a73faf931f404fef95217cf1e10d"}, - {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9d776d30cde7e541b8180103c3f294ef7c1862fd45d81738d156d00551005784"}, - {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:72f7919af5de5ecfaf1eba47bf9a5d8aa089a3340277276e5636d16ee97614d7"}, - {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:4bfcbde6e06c56b30668a0c872d75a7ef3025dc3c1823a13cf29a0e9b33f67e8"}, - {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ff7c97eb7a29aba230389a2661edf2e9e06ce616c7e35aa764879b6894a44b25"}, - {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9b5f13857da99325dcabe1cc4e9e6a3d7b2e2c726248ba5dd4be3e8e4a0b6d0e"}, - {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a7e41e3ada4cca5f22b478c08e973c930e5e6c7ba3588fb8e35f2398cdcc1545"}, - {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60eb8ceaa40a41540b9acae6ae7c1f0a67d233c40dc4359c256ad2ad85bdf5e5"}, - {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7beec26729d496a12fd23cf8da9944ee338c8b8a17035a560b585c36fe81af20"}, - {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:22c5f022799f3cd6741e24f0443ead92ef42be93ffda0d29b2597208c94c3753"}, - {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:eca58e319f4fd6df004762419612122b2c7e7d95ffafc37e890252f869f3fb2a"}, - {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ed957db4c33bc99895f3a1672eca7e80e8cda8bd1e29a80536b4ec2153fa9804"}, - {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:459c0d338cc55d099798618f714b21b7ece17eb1a87879f2da20a3ff4c7628e2"}, - {file = "pydantic_core-2.16.2.tar.gz", hash = "sha256:0ba503850d8b8dcc18391f10de896ae51d37fe5fe43dbfb6a35c5c5cad271a06"}, -] - -[package.dependencies] -typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" - [[package]] name = "pygments" -version = "2.17.2" +version = "2.15.1" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.7" files = [ - {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, - {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, ] [package.extras] plugins = ["importlib-metadata"] -windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyjwt" -version = "2.8.0" +version = "2.6.0" description = "JSON Web Token implementation in Python" optional = false python-versions = ">=3.7" files = [ - {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, - {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, + {file = "PyJWT-2.6.0-py3-none-any.whl", hash = "sha256:d83c3d892a77bbb74d3e1a2cfa90afaadb60945205d1095d9221f04466f64c14"}, + {file = "PyJWT-2.6.0.tar.gz", hash = "sha256:69285c7e31fc44f68a1feb309e948e0df53259d579295e6cfe2b1792329f05fd"}, ] [package.extras] @@ -2107,29 +1873,15 @@ dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pyte docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] -[[package]] -name = "pyparsing" -version = "3.1.1" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" -optional = false -python-versions = ">=3.6.8" -files = [ - {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, - {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, -] - -[package.extras] -diagrams = ["jinja2", "railroad-diagrams"] - [[package]] name = "pytest" -version = "7.4.4" +version = "7.4.0" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, - {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, ] [package.dependencies] @@ -2145,19 +1897,19 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no [[package]] name = "pytest-flask" -version = "1.3.0" +version = "1.2.0" description = "A set of py.test fixtures to test Flask applications." optional = false -python-versions = ">=3.7" +python-versions = ">=3.5" files = [ - {file = "pytest-flask-1.3.0.tar.gz", hash = "sha256:58be1c97b21ba3c4d47e0a7691eb41007748506c36bf51004f78df10691fa95e"}, - {file = "pytest_flask-1.3.0-py3-none-any.whl", hash = "sha256:c0e36e6b0fddc3b91c4362661db83fa694d1feb91fa505475be6732b5bc8c253"}, + {file = "pytest-flask-1.2.0.tar.gz", hash = "sha256:46fde652f77777bf02dc91205aec4ce20cdf2acbbbd66a918ab91f5c14693d3d"}, + {file = "pytest_flask-1.2.0-py3-none-any.whl", hash = "sha256:fe25b39ad0db09c3d1fe728edecf97ced85e774c775db259a6d25f0270a4e7c9"}, ] [package.dependencies] Flask = "*" pytest = ">=5.2" -Werkzeug = "*" +Werkzeug = ">=0.7" [package.extras] docs = ["Sphinx", "sphinx-rtd-theme"] @@ -2185,13 +1937,13 @@ tests = ["psycopg2-binary", "pytest (>=6.0.1)", "pytest-postgresql (>=2.4.0,<4.0 [[package]] name = "pytest-mock" -version = "3.12.0" +version = "3.10.0" description = "Thin-wrapper around the mock package for easier use with pytest" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "pytest-mock-3.12.0.tar.gz", hash = "sha256:31a40f038c22cad32287bb43932054451ff5583ff094bca6f675df2f8bc1a6e9"}, - {file = "pytest_mock-3.12.0-py3-none-any.whl", hash = "sha256:0972719a7263072da3a21c7f4773069bcc7486027d7e8e1f81d98a47e701bc4f"}, + {file = "pytest-mock-3.10.0.tar.gz", hash = "sha256:fbbdb085ef7c252a326fd8cdcac0aa3b1333d8811f131bdcc701002e1be7ed4f"}, + {file = "pytest_mock-3.10.0-py3-none-any.whl", hash = "sha256:f4c973eeae0282963eb293eb173ce91b091a79c1334455acfac9ddee8a1c784b"}, ] [package.dependencies] @@ -2202,13 +1954,13 @@ dev = ["pre-commit", "pytest-asyncio", "tox"] [[package]] name = "pytest-random-order" -version = "1.1.1" +version = "1.1.0" description = "Randomise the order in which pytest tests are run with some control over the randomness" optional = false python-versions = ">=3.5.0" files = [ - {file = "pytest-random-order-1.1.1.tar.gz", hash = "sha256:4472d7d34f1f1c5f3a359c4ffc5c13ed065232f31eca19c8844c1ab406e79080"}, - {file = "pytest_random_order-1.1.1-py3-none-any.whl", hash = "sha256:882727a8b597ecd06ede28654ffeb8a6d511a1e4abe1054cca7982f2e42008cd"}, + {file = "pytest-random-order-1.1.0.tar.gz", hash = "sha256:dbe6debb9353a7af984cc9eddbeb3577dd4dbbcc1529a79e3d21f68ed9b45605"}, + {file = "pytest_random_order-1.1.0-py3-none-any.whl", hash = "sha256:6cb1e59ab0f798bb0c3488c11ae0c70d7d3340306a466d28b28ccd8ef8c20b7e"}, ] [package.dependencies] @@ -2250,15 +2002,29 @@ six = ">=1.5" [[package]] name = "pytz" -version = "2023.4" +version = "2023.3.post1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2023.4-py2.py3-none-any.whl", hash = "sha256:f90ef520d95e7c46951105338d918664ebfd6f1d995bd7d153127ce90efafa6a"}, - {file = "pytz-2023.4.tar.gz", hash = "sha256:31d4583c4ed539cd037956140d695e42c033a19e984bfce9964a3f7d59bc2b40"}, + {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, + {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, ] +[[package]] +name = "pytz-deprecation-shim" +version = "0.1.0.post0" +description = "Shims to make deprecation of pytz easier" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pytz_deprecation_shim-0.1.0.post0-py2.py3-none-any.whl", hash = "sha256:8314c9692a636c8eb3bda879b9f119e350e93223ae83e70e80c31675a0fdc1a6"}, + {file = "pytz_deprecation_shim-0.1.0.post0.tar.gz", hash = "sha256:af097bae1b616dde5c5744441e2ddc69e74dfdcb0c263129610d85b87445a59d"}, +] + +[package.dependencies] +tzdata = {version = "*", markers = "python_version >= \"3.6\""} + [[package]] name = "pyyaml" version = "6.0.1" @@ -2284,6 +2050,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -2338,13 +2105,13 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" [[package]] name = "referencing" -version = "0.33.0" +version = "0.32.1" description = "JSON Referencing + Python" optional = false python-versions = ">=3.8" files = [ - {file = "referencing-0.33.0-py3-none-any.whl", hash = "sha256:39240f2ecc770258f28b642dd47fd74bc8b02484de54e1882b74b35ebd779bd5"}, - {file = "referencing-0.33.0.tar.gz", hash = "sha256:c775fedf74bc0f9189c2a3be1c12fd03e8c23f4d371dce795df44e06c5b412f7"}, + {file = "referencing-0.32.1-py3-none-any.whl", hash = "sha256:7e4dc12271d8e15612bfe35792f5ea1c40970dadf8624602e33db2758f7ee554"}, + {file = "referencing-0.32.1.tar.gz", hash = "sha256:3c57da0513e9563eb7e203ebe9bb3a1b509b042016433bd1e45a2853466c3dd3"}, ] [package.dependencies] @@ -2353,104 +2120,71 @@ rpds-py = ">=0.7.0" [[package]] name = "regex" -version = "2023.12.25" +version = "2023.3.23" description = "Alternative regular expression module, to replace re." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5"}, - {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8"}, - {file = "regex-2023.12.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f"}, - {file = "regex-2023.12.25-cp310-cp310-win32.whl", hash = "sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630"}, - {file = "regex-2023.12.25-cp310-cp310-win_amd64.whl", hash = "sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4"}, - {file = "regex-2023.12.25-cp311-cp311-win32.whl", hash = "sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87"}, - {file = "regex-2023.12.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d"}, - {file = "regex-2023.12.25-cp312-cp312-win32.whl", hash = "sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5"}, - {file = "regex-2023.12.25-cp312-cp312-win_amd64.whl", hash = "sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232"}, - {file = "regex-2023.12.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39"}, - {file = "regex-2023.12.25-cp37-cp37m-win32.whl", hash = "sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c"}, - {file = "regex-2023.12.25-cp37-cp37m-win_amd64.whl", hash = "sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2"}, - {file = "regex-2023.12.25-cp38-cp38-win32.whl", hash = "sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb"}, - {file = "regex-2023.12.25-cp38-cp38-win_amd64.whl", hash = "sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20"}, - {file = "regex-2023.12.25-cp39-cp39-win32.whl", hash = "sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9"}, - {file = "regex-2023.12.25-cp39-cp39-win_amd64.whl", hash = "sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91"}, - {file = "regex-2023.12.25.tar.gz", hash = "sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"}, + {file = "regex-2023.3.23-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:845a5e2d84389c4ddada1a9b95c055320070f18bb76512608374aca00d22eca8"}, + {file = "regex-2023.3.23-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:87d9951f5a538dd1d016bdc0dcae59241d15fa94860964833a54d18197fcd134"}, + {file = "regex-2023.3.23-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37ae17d3be44c0b3f782c28ae9edd8b47c1f1776d4cabe87edc0b98e1f12b021"}, + {file = "regex-2023.3.23-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b8eb1e3bca6b48dc721818a60ae83b8264d4089a4a41d62be6d05316ec38e15"}, + {file = "regex-2023.3.23-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df45fac182ebc3c494460c644e853515cc24f5ad9da05f8ffb91da891bfee879"}, + {file = "regex-2023.3.23-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7006105b10b59971d3b248ad75acc3651c7e4cf54d81694df5a5130a3c3f7ea"}, + {file = "regex-2023.3.23-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93f3f1aa608380fe294aa4cb82e2afda07a7598e828d0341e124b8fd9327c715"}, + {file = "regex-2023.3.23-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787954f541ab95d8195d97b0b8cf1dc304424adb1e07365967e656b92b38a699"}, + {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:20abe0bdf03630fe92ccafc45a599bca8b3501f48d1de4f7d121153350a2f77d"}, + {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11d00c31aeab9a6e0503bc77e73ed9f4527b3984279d997eb145d7c7be6268fd"}, + {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d5bbe0e1511b844794a3be43d6c145001626ba9a6c1db8f84bdc724e91131d9d"}, + {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ea3c0cb56eadbf4ab2277e7a095676370b3e46dbfc74d5c383bd87b0d6317910"}, + {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d895b4c863059a4934d3e874b90998df774644a41b349ebb330f85f11b4ef2c0"}, + {file = "regex-2023.3.23-cp310-cp310-win32.whl", hash = "sha256:9d764514d19b4edcc75fd8cb1423448ef393e8b6cbd94f38cab983ab1b75855d"}, + {file = "regex-2023.3.23-cp310-cp310-win_amd64.whl", hash = "sha256:11d1f2b7a0696dc0310de0efb51b1f4d813ad4401fe368e83c0c62f344429f98"}, + {file = "regex-2023.3.23-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8a9c63cde0eaa345795c0fdeb19dc62d22e378c50b0bc67bf4667cd5b482d98b"}, + {file = "regex-2023.3.23-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dd7200b4c27b68cf9c9646da01647141c6db09f48cc5b51bc588deaf8e98a797"}, + {file = "regex-2023.3.23-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22720024b90a6ba673a725dcc62e10fb1111b889305d7c6b887ac7466b74bedb"}, + {file = "regex-2023.3.23-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b190a339090e6af25f4a5fd9e77591f6d911cc7b96ecbb2114890b061be0ac1"}, + {file = "regex-2023.3.23-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e76b6fc0d8e9efa39100369a9b3379ce35e20f6c75365653cf58d282ad290f6f"}, + {file = "regex-2023.3.23-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7868b8f218bf69a2a15402fde08b08712213a1f4b85a156d90473a6fb6b12b09"}, + {file = "regex-2023.3.23-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2472428efc4127374f494e570e36b30bb5e6b37d9a754f7667f7073e43b0abdd"}, + {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c37df2a060cb476d94c047b18572ee2b37c31f831df126c0da3cd9227b39253d"}, + {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4479f9e2abc03362df4045b1332d4a2b7885b245a30d4f4b051c4083b97d95d8"}, + {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e2396e0678167f2d0c197da942b0b3fb48fee2f0b5915a0feb84d11b6686afe6"}, + {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:75f288c60232a5339e0ff2fa05779a5e9c74e9fc085c81e931d4a264501e745b"}, + {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c869260aa62cee21c5eb171a466c0572b5e809213612ef8d495268cd2e34f20d"}, + {file = "regex-2023.3.23-cp311-cp311-win32.whl", hash = "sha256:25f0532fd0c53e96bad84664171969de9673b4131f2297f1db850d3918d58858"}, + {file = "regex-2023.3.23-cp311-cp311-win_amd64.whl", hash = "sha256:5ccfafd98473e007cebf7da10c1411035b7844f0f204015efd050601906dbb53"}, + {file = "regex-2023.3.23-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6572ff287176c0fb96568adb292674b421fa762153ed074d94b1d939ed92c253"}, + {file = "regex-2023.3.23-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a610e0adfcb0fc84ea25f6ea685e39e74cbcd9245a72a9a7aab85ff755a5ed27"}, + {file = "regex-2023.3.23-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086afe222d58b88b62847bdbd92079b4699350b4acab892f88a935db5707c790"}, + {file = "regex-2023.3.23-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79e29fd62fa2f597a6754b247356bda14b866131a22444d67f907d6d341e10f3"}, + {file = "regex-2023.3.23-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c07ce8e9eee878a48ebeb32ee661b49504b85e164b05bebf25420705709fdd31"}, + {file = "regex-2023.3.23-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86b036f401895e854de9fefe061518e78d506d8a919cc250dc3416bca03f6f9a"}, + {file = "regex-2023.3.23-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78ac8dd8e18800bb1f97aad0d73f68916592dddf233b99d2b5cabc562088503a"}, + {file = "regex-2023.3.23-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:539dd010dc35af935b32f248099e38447bbffc10b59c2b542bceead2bed5c325"}, + {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9bf4a5626f2a0ea006bf81e8963f498a57a47d58907eaa58f4b3e13be68759d8"}, + {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf86b4328c204c3f315074a61bc1c06f8a75a8e102359f18ce99fbcbbf1951f0"}, + {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:2848bf76673c83314068241c8d5b7fa9ad9bed866c979875a0e84039349e8fa7"}, + {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c125a02d22c555e68f7433bac8449992fa1cead525399f14e47c2d98f2f0e467"}, + {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cd1671e9d5ac05ce6aa86874dd8dfa048824d1dbe73060851b310c6c1a201a96"}, + {file = "regex-2023.3.23-cp38-cp38-win32.whl", hash = "sha256:fffe57312a358be6ec6baeb43d253c36e5790e436b7bf5b7a38df360363e88e9"}, + {file = "regex-2023.3.23-cp38-cp38-win_amd64.whl", hash = "sha256:dbb3f87e15d3dd76996d604af8678316ad2d7d20faa394e92d9394dfd621fd0c"}, + {file = "regex-2023.3.23-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c88e8c226473b5549fe9616980ea7ca09289246cfbdf469241edf4741a620004"}, + {file = "regex-2023.3.23-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6560776ec19c83f3645bbc5db64a7a5816c9d8fb7ed7201c5bcd269323d88072"}, + {file = "regex-2023.3.23-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b1fc2632c01f42e06173d8dd9bb2e74ab9b0afa1d698058c867288d2c7a31f3"}, + {file = "regex-2023.3.23-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fdf7ad455f1916b8ea5cdbc482d379f6daf93f3867b4232d14699867a5a13af7"}, + {file = "regex-2023.3.23-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5fc33b27b1d800fc5b78d7f7d0f287e35079ecabe68e83d46930cf45690e1c8c"}, + {file = "regex-2023.3.23-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c49552dc938e3588f63f8a78c86f3c9c75301e813bca0bef13bdb4b87ccf364"}, + {file = "regex-2023.3.23-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e152461e9a0aedec7d37fc66ec0fa635eca984777d3d3c3e36f53bf3d3ceb16e"}, + {file = "regex-2023.3.23-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:db034255e72d2995cf581b14bb3fc9c00bdbe6822b49fcd4eef79e1d5f232618"}, + {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:55ae114da21b7a790b90255ea52d2aa3a0d121a646deb2d3c6a3194e722fc762"}, + {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ef3f528fe1cc3d139508fe1b22523745aa77b9d6cb5b0bf277f48788ee0b993f"}, + {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:a81c9ec59ca2303acd1ccd7b9ac409f1e478e40e96f8f79b943be476c5fdb8bb"}, + {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cde09c4fdd070772aa2596d97e942eb775a478b32459e042e1be71b739d08b77"}, + {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3cd9f5dd7b821f141d3a6ca0d5d9359b9221e4f051ca3139320adea9f1679691"}, + {file = "regex-2023.3.23-cp39-cp39-win32.whl", hash = "sha256:7304863f3a652dab5e68e6fb1725d05ebab36ec0390676d1736e0571ebb713ef"}, + {file = "regex-2023.3.23-cp39-cp39-win_amd64.whl", hash = "sha256:54c3fa855a3f7438149de3211738dd9b5f0c733f48b54ae05aa7fce83d48d858"}, + {file = "regex-2023.3.23.tar.gz", hash = "sha256:dc80df325b43ffea5cdea2e3eaa97a44f3dd298262b1c7fe9dbb2a9522b956a7"}, ] [[package]] @@ -2527,233 +2261,237 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rpds-py" -version = "0.18.0" +version = "0.16.2" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.18.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:5b4e7d8d6c9b2e8ee2d55c90b59c707ca59bc30058269b3db7b1f8df5763557e"}, - {file = "rpds_py-0.18.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c463ed05f9dfb9baebef68048aed8dcdc94411e4bf3d33a39ba97e271624f8f7"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01e36a39af54a30f28b73096dd39b6802eddd04c90dbe161c1b8dbe22353189f"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d62dec4976954a23d7f91f2f4530852b0c7608116c257833922a896101336c51"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd18772815d5f008fa03d2b9a681ae38d5ae9f0e599f7dda233c439fcaa00d40"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:923d39efa3cfb7279a0327e337a7958bff00cc447fd07a25cddb0a1cc9a6d2da"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39514da80f971362f9267c600b6d459bfbbc549cffc2cef8e47474fddc9b45b1"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a34d557a42aa28bd5c48a023c570219ba2593bcbbb8dc1b98d8cf5d529ab1434"}, - {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:93df1de2f7f7239dc9cc5a4a12408ee1598725036bd2dedadc14d94525192fc3"}, - {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:34b18ba135c687f4dac449aa5157d36e2cbb7c03cbea4ddbd88604e076aa836e"}, - {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c0b5dcf9193625afd8ecc92312d6ed78781c46ecbf39af9ad4681fc9f464af88"}, - {file = "rpds_py-0.18.0-cp310-none-win32.whl", hash = "sha256:c4325ff0442a12113a6379af66978c3fe562f846763287ef66bdc1d57925d337"}, - {file = "rpds_py-0.18.0-cp310-none-win_amd64.whl", hash = "sha256:7223a2a5fe0d217e60a60cdae28d6949140dde9c3bcc714063c5b463065e3d66"}, - {file = "rpds_py-0.18.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3a96e0c6a41dcdba3a0a581bbf6c44bb863f27c541547fb4b9711fd8cf0ffad4"}, - {file = "rpds_py-0.18.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30f43887bbae0d49113cbaab729a112251a940e9b274536613097ab8b4899cf6"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcb25daa9219b4cf3a0ab24b0eb9a5cc8949ed4dc72acb8fa16b7e1681aa3c58"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d68c93e381010662ab873fea609bf6c0f428b6d0bb00f2c6939782e0818d37bf"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b34b7aa8b261c1dbf7720b5d6f01f38243e9b9daf7e6b8bc1fd4657000062f2c"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e6d75ab12b0bbab7215e5d40f1e5b738aa539598db27ef83b2ec46747df90e1"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8612cd233543a3781bc659c731b9d607de65890085098986dfd573fc2befe5"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aec493917dd45e3c69d00a8874e7cbed844efd935595ef78a0f25f14312e33c6"}, - {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:661d25cbffaf8cc42e971dd570d87cb29a665f49f4abe1f9e76be9a5182c4688"}, - {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1df3659d26f539ac74fb3b0c481cdf9d725386e3552c6fa2974f4d33d78e544b"}, - {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1ce3ba137ed54f83e56fb983a5859a27d43a40188ba798993812fed73c70836"}, - {file = "rpds_py-0.18.0-cp311-none-win32.whl", hash = "sha256:69e64831e22a6b377772e7fb337533c365085b31619005802a79242fee620bc1"}, - {file = "rpds_py-0.18.0-cp311-none-win_amd64.whl", hash = "sha256:998e33ad22dc7ec7e030b3df701c43630b5bc0d8fbc2267653577e3fec279afa"}, - {file = "rpds_py-0.18.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7f2facbd386dd60cbbf1a794181e6aa0bd429bd78bfdf775436020172e2a23f0"}, - {file = "rpds_py-0.18.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1d9a5be316c15ffb2b3c405c4ff14448c36b4435be062a7f578ccd8b01f0c4d8"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd5bf1af8efe569654bbef5a3e0a56eca45f87cfcffab31dd8dde70da5982475"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5417558f6887e9b6b65b4527232553c139b57ec42c64570569b155262ac0754f"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:56a737287efecafc16f6d067c2ea0117abadcd078d58721f967952db329a3e5c"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8f03bccbd8586e9dd37219bce4d4e0d3ab492e6b3b533e973fa08a112cb2ffc9"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4457a94da0d5c53dc4b3e4de1158bdab077db23c53232f37a3cb7afdb053a4e3"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0ab39c1ba9023914297dd88ec3b3b3c3f33671baeb6acf82ad7ce883f6e8e157"}, - {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9d54553c1136b50fd12cc17e5b11ad07374c316df307e4cfd6441bea5fb68496"}, - {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0af039631b6de0397ab2ba16eaf2872e9f8fca391b44d3d8cac317860a700a3f"}, - {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84ffab12db93b5f6bad84c712c92060a2d321b35c3c9960b43d08d0f639d60d7"}, - {file = "rpds_py-0.18.0-cp312-none-win32.whl", hash = "sha256:685537e07897f173abcf67258bee3c05c374fa6fff89d4c7e42fb391b0605e98"}, - {file = "rpds_py-0.18.0-cp312-none-win_amd64.whl", hash = "sha256:e003b002ec72c8d5a3e3da2989c7d6065b47d9eaa70cd8808b5384fbb970f4ec"}, - {file = "rpds_py-0.18.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:08f9ad53c3f31dfb4baa00da22f1e862900f45908383c062c27628754af2e88e"}, - {file = "rpds_py-0.18.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0013fe6b46aa496a6749c77e00a3eb07952832ad6166bd481c74bda0dcb6d58"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e32a92116d4f2a80b629778280103d2a510a5b3f6314ceccd6e38006b5e92dcb"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e541ec6f2ec456934fd279a3120f856cd0aedd209fc3852eca563f81738f6861"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bed88b9a458e354014d662d47e7a5baafd7ff81c780fd91584a10d6ec842cb73"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2644e47de560eb7bd55c20fc59f6daa04682655c58d08185a9b95c1970fa1e07"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e8916ae4c720529e18afa0b879473049e95949bf97042e938530e072fde061d"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:465a3eb5659338cf2a9243e50ad9b2296fa15061736d6e26240e713522b6235c"}, - {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ea7d4a99f3b38c37eac212dbd6ec42b7a5ec51e2c74b5d3223e43c811609e65f"}, - {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:67071a6171e92b6da534b8ae326505f7c18022c6f19072a81dcf40db2638767c"}, - {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:41ef53e7c58aa4ef281da975f62c258950f54b76ec8e45941e93a3d1d8580594"}, - {file = "rpds_py-0.18.0-cp38-none-win32.whl", hash = "sha256:fdea4952db2793c4ad0bdccd27c1d8fdd1423a92f04598bc39425bcc2b8ee46e"}, - {file = "rpds_py-0.18.0-cp38-none-win_amd64.whl", hash = "sha256:7cd863afe7336c62ec78d7d1349a2f34c007a3cc6c2369d667c65aeec412a5b1"}, - {file = "rpds_py-0.18.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5307def11a35f5ae4581a0b658b0af8178c65c530e94893345bebf41cc139d33"}, - {file = "rpds_py-0.18.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77f195baa60a54ef9d2de16fbbfd3ff8b04edc0c0140a761b56c267ac11aa467"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39f5441553f1c2aed4de4377178ad8ff8f9d733723d6c66d983d75341de265ab"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a00312dea9310d4cb7dbd7787e722d2e86a95c2db92fbd7d0155f97127bcb40"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f2fc11e8fe034ee3c34d316d0ad8808f45bc3b9ce5857ff29d513f3ff2923a1"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:586f8204935b9ec884500498ccc91aa869fc652c40c093bd9e1471fbcc25c022"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddc2f4dfd396c7bfa18e6ce371cba60e4cf9d2e5cdb71376aa2da264605b60b9"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ddcba87675b6d509139d1b521e0c8250e967e63b5909a7e8f8944d0f90ff36f"}, - {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7bd339195d84439cbe5771546fe8a4e8a7a045417d8f9de9a368c434e42a721e"}, - {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d7c36232a90d4755b720fbd76739d8891732b18cf240a9c645d75f00639a9024"}, - {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6b0817e34942b2ca527b0e9298373e7cc75f429e8da2055607f4931fded23e20"}, - {file = "rpds_py-0.18.0-cp39-none-win32.whl", hash = "sha256:99f70b740dc04d09e6b2699b675874367885217a2e9f782bdf5395632ac663b7"}, - {file = "rpds_py-0.18.0-cp39-none-win_amd64.whl", hash = "sha256:6ef687afab047554a2d366e112dd187b62d261d49eb79b77e386f94644363294"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ad36cfb355e24f1bd37cac88c112cd7730873f20fb0bdaf8ba59eedf8216079f"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:36b3ee798c58ace201289024b52788161e1ea133e4ac93fba7d49da5fec0ef9e"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8a2f084546cc59ea99fda8e070be2fd140c3092dc11524a71aa8f0f3d5a55ca"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e4461d0f003a0aa9be2bdd1b798a041f177189c1a0f7619fe8c95ad08d9a45d7"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8db715ebe3bb7d86d77ac1826f7d67ec11a70dbd2376b7cc214199360517b641"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:793968759cd0d96cac1e367afd70c235867831983f876a53389ad869b043c948"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66e6a3af5a75363d2c9a48b07cb27c4ea542938b1a2e93b15a503cdfa8490795"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ef0befbb5d79cf32d0266f5cff01545602344eda89480e1dd88aca964260b18"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d4acf42190d449d5e89654d5c1ed3a4f17925eec71f05e2a41414689cda02d1"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a5f446dd5055667aabaee78487f2b5ab72e244f9bc0b2ffebfeec79051679984"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9dbbeb27f4e70bfd9eec1be5477517365afe05a9b2c441a0b21929ee61048124"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:22806714311a69fd0af9b35b7be97c18a0fc2826e6827dbb3a8c94eac6cf7eeb"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b34ae4636dfc4e76a438ab826a0d1eed2589ca7d9a1b2d5bb546978ac6485461"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c8370641f1a7f0e0669ddccca22f1da893cef7628396431eb445d46d893e5cd"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c8362467a0fdeccd47935f22c256bec5e6abe543bf0d66e3d3d57a8fb5731863"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11a8c85ef4a07a7638180bf04fe189d12757c696eb41f310d2426895356dcf05"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b316144e85316da2723f9d8dc75bada12fa58489a527091fa1d5a612643d1a0e"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf1ea2e34868f6fbf070e1af291c8180480310173de0b0c43fc38a02929fc0e3"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e546e768d08ad55b20b11dbb78a745151acbd938f8f00d0cfbabe8b0199b9880"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4901165d170a5fde6f589acb90a6b33629ad1ec976d4529e769c6f3d885e3e80"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:618a3d6cae6ef8ec88bb76dd80b83cfe415ad4f1d942ca2a903bf6b6ff97a2da"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ed4eb745efbff0a8e9587d22a84be94a5eb7d2d99c02dacf7bd0911713ed14dd"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c81e5f372cd0dc5dc4809553d34f832f60a46034a5f187756d9b90586c2c307"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:43fbac5f22e25bee1d482c97474f930a353542855f05c1161fd804c9dc74a09d"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d7faa6f14017c0b1e69f5e2c357b998731ea75a442ab3841c0dbbbfe902d2c4"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:08231ac30a842bd04daabc4d71fddd7e6d26189406d5a69535638e4dcb88fe76"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:044a3e61a7c2dafacae99d1e722cc2d4c05280790ec5a05031b3876809d89a5c"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f26b5bd1079acdb0c7a5645e350fe54d16b17bfc5e71f371c449383d3342e17"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:482103aed1dfe2f3b71a58eff35ba105289b8d862551ea576bd15479aba01f66"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1374f4129f9bcca53a1bba0bb86bf78325a0374577cf7e9e4cd046b1e6f20e24"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:635dc434ff724b178cb192c70016cc0ad25a275228f749ee0daf0eddbc8183b1"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:bc362ee4e314870a70f4ae88772d72d877246537d9f8cb8f7eacf10884862432"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4832d7d380477521a8c1644bbab6588dfedea5e30a7d967b5fb75977c45fd77f"}, - {file = "rpds_py-0.18.0.tar.gz", hash = "sha256:42821446ee7a76f5d9f71f9e33a4fb2ffd724bb3e7f93386150b61a43115788d"}, + {file = "rpds_py-0.16.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:509b617ac787cd1149600e731db9274ebbef094503ca25158e6f23edaba1ca8f"}, + {file = "rpds_py-0.16.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:413b9c17388bbd0d87a329d8e30c1a4c6e44e2bb25457f43725a8e6fe4161e9e"}, + {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2946b120718eba9af2b4dd103affc1164a87b9e9ebff8c3e4c05d7b7a7e274e2"}, + {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:35ae5ece284cf36464eb160880018cf6088a9ac5ddc72292a6092b6ef3f4da53"}, + {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc6a7620ba7639a3db6213da61312cb4aa9ac0ca6e00dc1cbbdc21c2aa6eb57"}, + {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8cb6fe8ecdfffa0e711a75c931fb39f4ba382b4b3ccedeca43f18693864fe850"}, + {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dace7b26a13353e24613417ce2239491b40a6ad44e5776a18eaff7733488b44"}, + {file = "rpds_py-0.16.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1bdbc5fcb04a7309074de6b67fa9bc4b418ab3fc435fec1f2779a0eced688d04"}, + {file = "rpds_py-0.16.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f42e25c016927e2a6b1ce748112c3ab134261fc2ddc867e92d02006103e1b1b7"}, + {file = "rpds_py-0.16.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:eab36eae3f3e8e24b05748ec9acc66286662f5d25c52ad70cadab544e034536b"}, + {file = "rpds_py-0.16.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0474df4ade9a3b4af96c3d36eb81856cb9462e4c6657d4caecfd840d2a13f3c9"}, + {file = "rpds_py-0.16.2-cp310-none-win32.whl", hash = "sha256:84c5a4d1f9dd7e2d2c44097fb09fffe728629bad31eb56caf97719e55575aa82"}, + {file = "rpds_py-0.16.2-cp310-none-win_amd64.whl", hash = "sha256:2bd82db36cd70b3628c0c57d81d2438e8dd4b7b32a6a9f25f24ab0e657cb6c4e"}, + {file = "rpds_py-0.16.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:adc0c3d6fc6ae35fee3e4917628983f6ce630d513cbaad575b4517d47e81b4bb"}, + {file = "rpds_py-0.16.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ec23fcad480e77ede06cf4127a25fc440f7489922e17fc058f426b5256ee0edb"}, + {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07aab64e2808c3ebac2a44f67e9dc0543812b715126dfd6fe4264df527556cb6"}, + {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a4ebb8b20bd09c5ce7884c8f0388801100f5e75e7f733b1b6613c713371feefc"}, + {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3d7e2ea25d3517c6d7e5a1cc3702cffa6bd18d9ef8d08d9af6717fc1c700eed"}, + {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f28ac0e8e7242d140f99402a903a2c596ab71550272ae9247ad78f9a932b5698"}, + {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19f00f57fdd38db4bb5ad09f9ead1b535332dbf624200e9029a45f1f35527ebb"}, + {file = "rpds_py-0.16.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3da5a4c56953bdbf6d04447c3410309616c54433146ccdb4a277b9cb499bc10e"}, + {file = "rpds_py-0.16.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec2e1cf025b2c0f48ec17ff3e642661da7ee332d326f2e6619366ce8e221f018"}, + {file = "rpds_py-0.16.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e0441fb4fdd39a230477b2ca9be90868af64425bfe7b122b57e61e45737a653b"}, + {file = "rpds_py-0.16.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9f0350ef2fba5f34eb0c9000ea328e51b9572b403d2f7f3b19f24085f6f598e8"}, + {file = "rpds_py-0.16.2-cp311-none-win32.whl", hash = "sha256:5a80e2f83391ad0808b4646732af2a7b67550b98f0cae056cb3b40622a83dbb3"}, + {file = "rpds_py-0.16.2-cp311-none-win_amd64.whl", hash = "sha256:e04e56b4ca7a770593633556e8e9e46579d66ec2ada846b401252a2bdcf70a6d"}, + {file = "rpds_py-0.16.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:5e6caa3809e50690bd92fa490f5c38caa86082c8c3315aa438bce43786d5e90d"}, + {file = "rpds_py-0.16.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e53b9b25cac9065328901713a7e9e3b12e4f57ef4280b370fbbf6fef2052eef"}, + {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af27423662f32d7501a00c5e7342f7dbd1e4a718aea7a239781357d15d437133"}, + {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:43d4dd5fb16eb3825742bad8339d454054261ab59fed2fbac84e1d84d5aae7ba"}, + {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e061de3b745fe611e23cd7318aec2c8b0e4153939c25c9202a5811ca911fd733"}, + {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b811d182ad17ea294f2ec63c0621e7be92a1141e1012383461872cead87468f"}, + {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5552f328eaef1a75ff129d4d0c437bf44e43f9436d3996e8eab623ea0f5fcf73"}, + {file = "rpds_py-0.16.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dcbe1f8dd179e4d69b70b1f1d9bb6fd1e7e1bdc9c9aad345cdeb332e29d40748"}, + {file = "rpds_py-0.16.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8aad80645a011abae487d356e0ceb359f4938dfb6f7bcc410027ed7ae4f7bb8b"}, + {file = "rpds_py-0.16.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b6f5549d6ed1da9bfe3631ca9483ae906f21410be2445b73443fa9f017601c6f"}, + {file = "rpds_py-0.16.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d452817e0d9c749c431a1121d56a777bd7099b720b3d1c820f1725cb40928f58"}, + {file = "rpds_py-0.16.2-cp312-none-win32.whl", hash = "sha256:888a97002e986eca10d8546e3c8b97da1d47ad8b69726dcfeb3e56348ebb28a3"}, + {file = "rpds_py-0.16.2-cp312-none-win_amd64.whl", hash = "sha256:d8dda2a806dfa4a9b795950c4f5cc56d6d6159f7d68080aedaff3bdc9b5032f5"}, + {file = "rpds_py-0.16.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:071980663c273bf3d388fe5c794c547e6f35ba3335477072c713a3176bf14a60"}, + {file = "rpds_py-0.16.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:726ac36e8a3bb8daef2fd482534cabc5e17334052447008405daca7ca04a3108"}, + {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9e557db6a177470316c82f023e5d571811c9a4422b5ea084c85da9aa3c035fc"}, + {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:90123853fc8b1747f80b0d354be3d122b4365a93e50fc3aacc9fb4c2488845d6"}, + {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a61f659665a39a4d17d699ab3593d7116d66e1e2e3f03ef3fb8f484e91908808"}, + {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc97f0640e91d7776530f06e6836c546c1c752a52de158720c4224c9e8053cad"}, + {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44a54e99a2b9693a37ebf245937fd6e9228b4cbd64b9cc961e1f3391ec6c7391"}, + {file = "rpds_py-0.16.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bd4b677d929cf1f6bac07ad76e0f2d5de367e6373351c01a9c0a39f6b21b4a8b"}, + {file = "rpds_py-0.16.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:5ef00873303d678aaf8b0627e111fd434925ca01c657dbb2641410f1cdaef261"}, + {file = "rpds_py-0.16.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:349cb40897fd529ca15317c22c0eab67f5ac5178b5bd2c6adc86172045210acc"}, + {file = "rpds_py-0.16.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2ddef620e70eaffebed5932ce754d539c0930f676aae6212f8e16cd9743dd365"}, + {file = "rpds_py-0.16.2-cp38-none-win32.whl", hash = "sha256:882ce6e25e585949c3d9f9abd29202367175e0aab3aba0c58c9abbb37d4982ff"}, + {file = "rpds_py-0.16.2-cp38-none-win_amd64.whl", hash = "sha256:f4bd4578e44f26997e9e56c96dedc5f1af43cc9d16c4daa29c771a00b2a26851"}, + {file = "rpds_py-0.16.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:69ac7ea9897ec201ce68b48582f3eb34a3f9924488a5432a93f177bf76a82a7e"}, + {file = "rpds_py-0.16.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a9880b4656efe36ccad41edc66789e191e5ee19a1ea8811e0aed6f69851a82f4"}, + {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee94cb58c0ba2c62ee108c2b7c9131b2c66a29e82746e8fa3aa1a1effbd3dcf1"}, + {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:24f7a2eb3866a9e91f4599851e0c8d39878a470044875c49bd528d2b9b88361c"}, + {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ca57468da2d9a660bcf8961637c85f2fbb2aa64d9bc3f9484e30c3f9f67b1dd7"}, + {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ccd4e400309e1f34a5095bf9249d371f0fd60f8a3a5c4a791cad7b99ce1fd38d"}, + {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80443fe2f7b3ea3934c5d75fb0e04a5dbb4a8e943e5ff2de0dec059202b70a8b"}, + {file = "rpds_py-0.16.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4d6a9f052e72d493efd92a77f861e45bab2f6be63e37fa8ecf0c6fd1a58fedb0"}, + {file = "rpds_py-0.16.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:35953f4f2b3216421af86fd236b7c0c65935936a94ea83ddbd4904ba60757773"}, + {file = "rpds_py-0.16.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:981d135c7cdaf6cd8eadae1c950de43b976de8f09d8e800feed307140d3d6d00"}, + {file = "rpds_py-0.16.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d0dd7ed2f16df2e129496e7fbe59a34bc2d7fc8db443a606644d069eb69cbd45"}, + {file = "rpds_py-0.16.2-cp39-none-win32.whl", hash = "sha256:703d95c75a72e902544fda08e965885525e297578317989fd15a6ce58414b41d"}, + {file = "rpds_py-0.16.2-cp39-none-win_amd64.whl", hash = "sha256:e93ec1b300acf89730cf27975ef574396bc04edecc358e9bd116fb387a123239"}, + {file = "rpds_py-0.16.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:44627b6ca7308680a70766454db5249105fa6344853af6762eaad4158a2feebe"}, + {file = "rpds_py-0.16.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:3f91df8e6dbb7360e176d1affd5fb0246d2b88d16aa5ebc7db94fd66b68b61da"}, + {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d904c5693e08bad240f16d79305edba78276be87061c872a4a15e2c301fa2c0"}, + {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:290a81cfbe4673285cdf140ec5cd1658ffbf63ab359f2b352ebe172e7cfa5bf0"}, + {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b634c5ec0103c5cbebc24ebac4872b045cccb9456fc59efdcf6fe39775365bd2"}, + {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a297a4d08cc67c7466c873c78039d87840fb50d05473db0ec1b7b03d179bf322"}, + {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2e75e17bd0bb66ee34a707da677e47c14ee51ccef78ed6a263a4cc965a072a1"}, + {file = "rpds_py-0.16.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f1b9d9260e06ea017feb7172976ab261e011c1dc2f8883c7c274f6b2aabfe01a"}, + {file = "rpds_py-0.16.2-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:162d7cd9cd311c1b0ff1c55a024b8f38bd8aad1876b648821da08adc40e95734"}, + {file = "rpds_py-0.16.2-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:9b32f742ce5b57201305f19c2ef7a184b52f6f9ba6871cc042c2a61f0d6b49b8"}, + {file = "rpds_py-0.16.2-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac08472f41ea77cd6a5dae36ae7d4ed3951d6602833af87532b556c1b4601d63"}, + {file = "rpds_py-0.16.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:495a14b72bbe217f2695dcd9b5ab14d4f8066a00f5d209ed94f0aca307f85f6e"}, + {file = "rpds_py-0.16.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:8d6b6937ae9eac6d6c0ca3c42774d89fa311f55adff3970fb364b34abde6ed3d"}, + {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a61226465bda9283686db8f17d02569a98e4b13c637be5a26d44aa1f1e361c2"}, + {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5cf6af100ffb5c195beec11ffaa8cf8523057f123afa2944e6571d54da84cdc9"}, + {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6df15846ee3fb2e6397fe25d7ca6624af9f89587f3f259d177b556fed6bebe2c"}, + {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1be2f033df1b8be8c3167ba3c29d5dca425592ee31e35eac52050623afba5772"}, + {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96f957d6ab25a78b9e7fc9749d754b98eac825a112b4e666525ce89afcbd9ed5"}, + {file = "rpds_py-0.16.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:088396c7c70e59872f67462fcac3ecbded5233385797021976a09ebd55961dfe"}, + {file = "rpds_py-0.16.2-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4c46ad6356e1561f2a54f08367d1d2e70a0a1bb2db2282d2c1972c1d38eafc3b"}, + {file = "rpds_py-0.16.2-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:47713dc4fce213f5c74ca8a1f6a59b622fc1b90868deb8e8e4d993e421b4b39d"}, + {file = "rpds_py-0.16.2-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:f811771019f063bbd0aa7bb72c8a934bc13ebacb4672d712fc1639cfd314cccc"}, + {file = "rpds_py-0.16.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f19afcfc0dd0dca35694df441e9b0f95bc231b512f51bded3c3d8ca32153ec19"}, + {file = "rpds_py-0.16.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a4b682c5775d6a3d21e314c10124599976809455ee67020e8e72df1769b87bc3"}, + {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c647ca87fc0ebe808a41de912e9a1bfef9acb85257e5d63691364ac16b81c1f0"}, + {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:302bd4983bbd47063e452c38be66153760112f6d3635c7eeefc094299fa400a9"}, + {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bf721ede3eb7b829e4a9b8142bd55db0bdc82902720548a703f7e601ee13bdc3"}, + {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:358dafc89ce3894c7f486c615ba914609f38277ef67f566abc4c854d23b997fa"}, + {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cad0f59ee3dc35526039f4bc23642d52d5f6616b5f687d846bfc6d0d6d486db0"}, + {file = "rpds_py-0.16.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cffa76b385dfe1e38527662a302b19ffb0e7f5cf7dd5e89186d2c94a22dd9d0c"}, + {file = "rpds_py-0.16.2-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:83640a5d7cd3bff694747d50436b8b541b5b9b9782b0c8c1688931d6ee1a1f2d"}, + {file = "rpds_py-0.16.2-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:ed99b4f7179d2111702020fd7d156e88acd533f5a7d3971353e568b6051d5c97"}, + {file = "rpds_py-0.16.2-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4022b9dc620e14f30201a8a73898a873c8e910cb642bcd2f3411123bc527f6ac"}, + {file = "rpds_py-0.16.2.tar.gz", hash = "sha256:781ef8bfc091b19960fc0142a23aedadafa826bc32b433fdfe6fd7f964d7ef44"}, ] [[package]] name = "ruamel-yaml" -version = "0.18.6" +version = "0.17.21" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" optional = false -python-versions = ">=3.7" +python-versions = ">=3" files = [ - {file = "ruamel.yaml-0.18.6-py3-none-any.whl", hash = "sha256:57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636"}, - {file = "ruamel.yaml-0.18.6.tar.gz", hash = "sha256:8b27e6a217e786c6fbe5634d8f3f11bc63e0f80f6a5890f28863d9c45aac311b"}, + {file = "ruamel.yaml-0.17.21-py3-none-any.whl", hash = "sha256:742b35d3d665023981bd6d16b3d24248ce5df75fdb4e2924e93a05c1f8b61ca7"}, + {file = "ruamel.yaml-0.17.21.tar.gz", hash = "sha256:8b7ce697a2f212752a35c1ac414471dc16c424c9573be4926b56ff3f5d23b7af"}, ] [package.dependencies] -"ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.13\""} +"ruamel.yaml.clib" = {version = ">=0.2.6", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.11\""} [package.extras] -docs = ["mercurial (>5.7)", "ryd"] +docs = ["ryd"] jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] [[package]] name = "ruamel-yaml-clib" -version = "0.2.8" +version = "0.2.7" description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" optional = false -python-versions = ">=3.6" +python-versions = ">=3.5" files = [ - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:d92f81886165cb14d7b067ef37e142256f1c6a90a65cd156b063a43da1708cfd"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win32.whl", hash = "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:b5edda50e5e9e15e54a6a8a0070302b00c518a9d32accc2346ad6c984aacd279"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win32.whl", hash = "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:7048c338b6c86627afb27faecf418768acb6331fc24cfa56c93e8c9780f815fa"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92"}, - {file = "ruamel.yaml.clib-0.2.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3fcc54cb0c8b811ff66082de1680b4b14cf8a81dce0d4fbf665c2265a81e07a1"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win32.whl", hash = "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win_amd64.whl", hash = "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:665f58bfd29b167039f714c6998178d27ccd83984084c286110ef26b230f259f"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win32.whl", hash = "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:9eb5dee2772b0f704ca2e45b1713e4e5198c18f515b52743576d196348f374d3"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win32.whl", hash = "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15"}, - {file = "ruamel.yaml.clib-0.2.8.tar.gz", hash = "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512"}, + {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5859983f26d8cd7bb5c287ef452e8aacc86501487634573d260968f753e1d71"}, + {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:debc87a9516b237d0466a711b18b6ebeb17ba9f391eb7f91c649c5c4ec5006c7"}, + {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:df5828871e6648db72d1c19b4bd24819b80a755c4541d3409f0f7acd0f335c80"}, + {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:efa08d63ef03d079dcae1dfe334f6c8847ba8b645d08df286358b1f5293d24ab"}, + {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-win32.whl", hash = "sha256:763d65baa3b952479c4e972669f679fe490eee058d5aa85da483ebae2009d231"}, + {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:d000f258cf42fec2b1bbf2863c61d7b8918d31ffee905da62dede869254d3b8a"}, + {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:045e0626baf1c52e5527bd5db361bc83180faaba2ff586e763d3d5982a876a9e"}, + {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:1a6391a7cabb7641c32517539ca42cf84b87b667bad38b78d4d42dd23e957c81"}, + {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:9c7617df90c1365638916b98cdd9be833d31d337dbcd722485597b43c4a215bf"}, + {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:41d0f1fa4c6830176eef5b276af04c89320ea616655d01327d5ce65e50575c94"}, + {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-win32.whl", hash = "sha256:f6d3d39611ac2e4f62c3128a9eed45f19a6608670c5a2f4f07f24e8de3441d38"}, + {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:da538167284de58a52109a9b89b8f6a53ff8437dd6dc26d33b57bf6699153122"}, + {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4b3a93bb9bc662fc1f99c5c3ea8e623d8b23ad22f861eb6fce9377ac07ad6072"}, + {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-macosx_12_0_arm64.whl", hash = "sha256:a234a20ae07e8469da311e182e70ef6b199d0fbeb6c6cc2901204dd87fb867e8"}, + {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:15910ef4f3e537eea7fe45f8a5d19997479940d9196f357152a09031c5be59f3"}, + {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:370445fd795706fd291ab00c9df38a0caed0f17a6fb46b0f607668ecb16ce763"}, + {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-win32.whl", hash = "sha256:ecdf1a604009bd35c674b9225a8fa609e0282d9b896c03dd441a91e5f53b534e"}, + {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-win_amd64.whl", hash = "sha256:f34019dced51047d6f70cb9383b2ae2853b7fc4dce65129a5acd49f4f9256646"}, + {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2aa261c29a5545adfef9296b7e33941f46aa5bbd21164228e833412af4c9c75f"}, + {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f01da5790e95815eb5a8a138508c01c758e5f5bc0ce4286c4f7028b8dd7ac3d0"}, + {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:40d030e2329ce5286d6b231b8726959ebbe0404c92f0a578c0e2482182e38282"}, + {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c3ca1fbba4ae962521e5eb66d72998b51f0f4d0f608d3c0347a48e1af262efa7"}, + {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-win32.whl", hash = "sha256:7bdb4c06b063f6fd55e472e201317a3bb6cdeeee5d5a38512ea5c01e1acbdd93"}, + {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:be2a7ad8fd8f7442b24323d24ba0b56c51219513cfa45b9ada3b87b76c374d4b"}, + {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91a789b4aa0097b78c93e3dc4b40040ba55bef518f84a40d4442f713b4094acb"}, + {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:99e77daab5d13a48a4054803d052ff40780278240a902b880dd37a51ba01a307"}, + {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:3243f48ecd450eddadc2d11b5feb08aca941b5cd98c9b1db14b2fd128be8c697"}, + {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8831a2cedcd0f0927f788c5bdf6567d9dc9cc235646a434986a852af1cb54b4b"}, + {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-win32.whl", hash = "sha256:3110a99e0f94a4a3470ff67fc20d3f96c25b13d24c6980ff841e82bafe827cac"}, + {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:92460ce908546ab69770b2e576e4f99fbb4ce6ab4b245345a3869a0a0410488f"}, + {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5bc0667c1eb8f83a3752b71b9c4ba55ef7c7058ae57022dd9b29065186a113d9"}, + {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:4a4d8d417868d68b979076a9be6a38c676eca060785abaa6709c7b31593c35d1"}, + {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bf9a6bc4a0221538b1a7de3ed7bca4c93c02346853f44e1cd764be0023cd3640"}, + {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:a7b301ff08055d73223058b5c46c55638917f04d21577c95e00e0c4d79201a6b"}, + {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-win32.whl", hash = "sha256:d5e51e2901ec2366b79f16c2299a03e74ba4531ddcfacc1416639c557aef0ad8"}, + {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:184faeaec61dbaa3cace407cffc5819f7b977e75360e8d5ca19461cd851a5fc5"}, + {file = "ruamel.yaml.clib-0.2.7.tar.gz", hash = "sha256:1f08fd5a2bea9c4180db71678e850b995d2a5f4537be0e94557668cf0f5f9497"}, ] [[package]] name = "ruff" -version = "0.1.15" +version = "0.1.7" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.1.15-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:5fe8d54df166ecc24106db7dd6a68d44852d14eb0729ea4672bb4d96c320b7df"}, - {file = "ruff-0.1.15-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6f0bfbb53c4b4de117ac4d6ddfd33aa5fc31beeaa21d23c45c6dd249faf9126f"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0d432aec35bfc0d800d4f70eba26e23a352386be3a6cf157083d18f6f5881c8"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9405fa9ac0e97f35aaddf185a1be194a589424b8713e3b97b762336ec79ff807"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c66ec24fe36841636e814b8f90f572a8c0cb0e54d8b5c2d0e300d28a0d7bffec"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:6f8ad828f01e8dd32cc58bc28375150171d198491fc901f6f98d2a39ba8e3ff5"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86811954eec63e9ea162af0ffa9f8d09088bab51b7438e8b6488b9401863c25e"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd4025ac5e87d9b80e1f300207eb2fd099ff8200fa2320d7dc066a3f4622dc6b"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b17b93c02cdb6aeb696effecea1095ac93f3884a49a554a9afa76bb125c114c1"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ddb87643be40f034e97e97f5bc2ef7ce39de20e34608f3f829db727a93fb82c5"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:abf4822129ed3a5ce54383d5f0e964e7fef74a41e48eb1dfad404151efc130a2"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6c629cf64bacfd136c07c78ac10a54578ec9d1bd2a9d395efbee0935868bf852"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1bab866aafb53da39c2cadfb8e1c4550ac5340bb40300083eb8967ba25481447"}, - {file = "ruff-0.1.15-py3-none-win32.whl", hash = "sha256:2417e1cb6e2068389b07e6fa74c306b2810fe3ee3476d5b8a96616633f40d14f"}, - {file = "ruff-0.1.15-py3-none-win_amd64.whl", hash = "sha256:3837ac73d869efc4182d9036b1405ef4c73d9b1f88da2413875e34e0d6919587"}, - {file = "ruff-0.1.15-py3-none-win_arm64.whl", hash = "sha256:9a933dfb1c14ec7a33cceb1e49ec4a16b51ce3c20fd42663198746efc0427360"}, - {file = "ruff-0.1.15.tar.gz", hash = "sha256:f6dfa8c1b21c913c326919056c390966648b680966febcb796cc9d1aaab8564e"}, + {file = "ruff-0.1.7-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7f80496854fdc65b6659c271d2c26e90d4d401e6a4a31908e7e334fab4645aac"}, + {file = "ruff-0.1.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:1ea109bdb23c2a4413f397ebd8ac32cb498bee234d4191ae1a310af760e5d287"}, + {file = "ruff-0.1.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b0c2de9dd9daf5e07624c24add25c3a490dbf74b0e9bca4145c632457b3b42a"}, + {file = "ruff-0.1.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:69a4bed13bc1d5dabf3902522b5a2aadfebe28226c6269694283c3b0cecb45fd"}, + {file = "ruff-0.1.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de02ca331f2143195a712983a57137c5ec0f10acc4aa81f7c1f86519e52b92a1"}, + {file = "ruff-0.1.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:45b38c3f8788a65e6a2cab02e0f7adfa88872696839d9882c13b7e2f35d64c5f"}, + {file = "ruff-0.1.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c64cb67b2025b1ac6d58e5ffca8f7b3f7fd921f35e78198411237e4f0db8e73"}, + {file = "ruff-0.1.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9dcc6bb2f4df59cb5b4b40ff14be7d57012179d69c6565c1da0d1f013d29951b"}, + {file = "ruff-0.1.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df2bb4bb6bbe921f6b4f5b6fdd8d8468c940731cb9406f274ae8c5ed7a78c478"}, + {file = "ruff-0.1.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:276a89bcb149b3d8c1b11d91aa81898fe698900ed553a08129b38d9d6570e717"}, + {file = "ruff-0.1.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:90c958fe950735041f1c80d21b42184f1072cc3975d05e736e8d66fc377119ea"}, + {file = "ruff-0.1.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6b05e3b123f93bb4146a761b7a7d57af8cb7384ccb2502d29d736eaade0db519"}, + {file = "ruff-0.1.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:290ecab680dce94affebefe0bbca2322a6277e83d4f29234627e0f8f6b4fa9ce"}, + {file = "ruff-0.1.7-py3-none-win32.whl", hash = "sha256:416dfd0bd45d1a2baa3b1b07b1b9758e7d993c256d3e51dc6e03a5e7901c7d80"}, + {file = "ruff-0.1.7-py3-none-win_amd64.whl", hash = "sha256:4af95fd1d3b001fc41325064336db36e3d27d2004cdb6d21fd617d45a172dd96"}, + {file = "ruff-0.1.7-py3-none-win_arm64.whl", hash = "sha256:0683b7bfbb95e6df3c7c04fe9d78f631f8e8ba4868dfc932d43d690698057e2e"}, + {file = "ruff-0.1.7.tar.gz", hash = "sha256:dffd699d07abf54833e5f6cc50b85a6ff043715da8788c4a79bcd4ab4734d306"}, ] [[package]] name = "safety" -version = "2.3.5" +version = "2.4.0b2" description = "Checks installed dependencies for known vulnerabilities and licenses." optional = false python-versions = "*" files = [ - {file = "safety-2.3.5-py3-none-any.whl", hash = "sha256:2227fcac1b22b53c1615af78872b48348661691450aa25d6704a5504dbd1f7e2"}, - {file = "safety-2.3.5.tar.gz", hash = "sha256:a60c11f8952f412cbb165d70cb1f673a3b43a2ba9a93ce11f97e6a4de834aa3a"}, + {file = "safety-2.4.0b2-py3-none-any.whl", hash = "sha256:63773ce92e17f5f80e7dff4c8a25d8abb7d62d375897b5f3bb4afe9313b100ff"}, + {file = "safety-2.4.0b2.tar.gz", hash = "sha256:9907010c6ca7720861ca7fa1496bdb80449b0619ca136eb7ac7e02bd3516cd4f"}, ] [package.dependencies] Click = ">=8.0.2" dparse = ">=0.6.2" -packaging = ">=21.0,<22.0" +jinja2 = {version = ">=3.1.0", markers = "python_version >= \"3.7\""} +marshmallow = {version = ">=3.15.0", markers = "python_version >= \"3.7\""} +packaging = ">=21.0" requests = "*" "ruamel.yaml" = ">=0.17.21" -setuptools = ">=19.3" +setuptools = {version = ">=65.5.1", markers = "python_version >= \"3.7\""} +urllib3 = ">=1.26.5" [package.extras] -github = ["jinja2 (>=3.1.0)", "pygithub (>=1.43.3)"] +github = ["pygithub (>=1.43.3)"] gitlab = ["python-gitlab (>=1.3.0)"] [[package]] name = "sentry-sdk" -version = "1.40.5" +version = "1.39.2" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = "*" files = [ - {file = "sentry-sdk-1.40.5.tar.gz", hash = "sha256:d2dca2392cc5c9a2cc9bb874dd7978ebb759682fe4fe889ee7e970ee8dd1c61e"}, - {file = "sentry_sdk-1.40.5-py2.py3-none-any.whl", hash = "sha256:d188b407c9bacbe2a50a824e1f8fb99ee1aeb309133310488c570cb6d7056643"}, + {file = "sentry-sdk-1.39.2.tar.gz", hash = "sha256:24c83b0b41c887d33328a9166f5950dc37ad58f01c9f2fbff6b87a6f1094170c"}, + {file = "sentry_sdk-1.39.2-py2.py3-none-any.whl", hash = "sha256:acaf597b30258fc7663063b291aa99e58f3096e91fe1e6634f4b79f9c1943e8e"}, ] [package.dependencies] @@ -2779,7 +2517,7 @@ huey = ["huey (>=2)"] loguru = ["loguru (>=0.5)"] opentelemetry = ["opentelemetry-distro (>=0.35b0)"] opentelemetry-experimental = ["opentelemetry-distro (>=0.40b0,<1.0)", "opentelemetry-instrumentation-aiohttp-client (>=0.40b0,<1.0)", "opentelemetry-instrumentation-django (>=0.40b0,<1.0)", "opentelemetry-instrumentation-fastapi (>=0.40b0,<1.0)", "opentelemetry-instrumentation-flask (>=0.40b0,<1.0)", "opentelemetry-instrumentation-requests (>=0.40b0,<1.0)", "opentelemetry-instrumentation-sqlite3 (>=0.40b0,<1.0)", "opentelemetry-instrumentation-urllib (>=0.40b0,<1.0)"] -pure-eval = ["asttokens", "executing", "pure-eval"] +pure-eval = ["asttokens", "executing", "pure_eval"] pymongo = ["pymongo (>=3.1)"] pyspark = ["pyspark (>=2.4.4)"] quart = ["blinker (>=1.1)", "quart (>=0.16.1)"] @@ -2808,109 +2546,96 @@ testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs ( [[package]] name = "simplejson" -version = "3.19.2" +version = "3.19.1" description = "Simple, fast, extensible JSON encoder/decoder for Python" optional = false python-versions = ">=2.5, !=3.0.*, !=3.1.*, !=3.2.*" files = [ - {file = "simplejson-3.19.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3471e95110dcaf901db16063b2e40fb394f8a9e99b3fe9ee3acc6f6ef72183a2"}, - {file = "simplejson-3.19.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:3194cd0d2c959062b94094c0a9f8780ffd38417a5322450a0db0ca1a23e7fbd2"}, - {file = "simplejson-3.19.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:8a390e56a7963e3946ff2049ee1eb218380e87c8a0e7608f7f8790ba19390867"}, - {file = "simplejson-3.19.2-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1537b3dd62d8aae644f3518c407aa8469e3fd0f179cdf86c5992792713ed717a"}, - {file = "simplejson-3.19.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a8617625369d2d03766413bff9e64310feafc9fc4f0ad2b902136f1a5cd8c6b0"}, - {file = "simplejson-3.19.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:2c433a412e96afb9a3ce36fa96c8e61a757af53e9c9192c97392f72871e18e69"}, - {file = "simplejson-3.19.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:f1c70249b15e4ce1a7d5340c97670a95f305ca79f376887759b43bb33288c973"}, - {file = "simplejson-3.19.2-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:287e39ba24e141b046812c880f4619d0ca9e617235d74abc27267194fc0c7835"}, - {file = "simplejson-3.19.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:6f0a0b41dd05eefab547576bed0cf066595f3b20b083956b1405a6f17d1be6ad"}, - {file = "simplejson-3.19.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f98d918f7f3aaf4b91f2b08c0c92b1774aea113334f7cde4fe40e777114dbe6"}, - {file = "simplejson-3.19.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7d74beca677623481810c7052926365d5f07393c72cbf62d6cce29991b676402"}, - {file = "simplejson-3.19.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7f2398361508c560d0bf1773af19e9fe644e218f2a814a02210ac2c97ad70db0"}, - {file = "simplejson-3.19.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ad331349b0b9ca6da86064a3599c425c7a21cd41616e175ddba0866da32df48"}, - {file = "simplejson-3.19.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:332c848f02d71a649272b3f1feccacb7e4f7e6de4a2e6dc70a32645326f3d428"}, - {file = "simplejson-3.19.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25785d038281cd106c0d91a68b9930049b6464288cea59ba95b35ee37c2d23a5"}, - {file = "simplejson-3.19.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18955c1da6fc39d957adfa346f75226246b6569e096ac9e40f67d102278c3bcb"}, - {file = "simplejson-3.19.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:11cc3afd8160d44582543838b7e4f9aa5e97865322844b75d51bf4e0e413bb3e"}, - {file = "simplejson-3.19.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b01fda3e95d07a6148702a641e5e293b6da7863f8bc9b967f62db9461330562c"}, - {file = "simplejson-3.19.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:778331444917108fa8441f59af45886270d33ce8a23bfc4f9b192c0b2ecef1b3"}, - {file = "simplejson-3.19.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9eb117db8d7ed733a7317c4215c35993b815bf6aeab67523f1f11e108c040672"}, - {file = "simplejson-3.19.2-cp310-cp310-win32.whl", hash = "sha256:39b6d79f5cbfa3eb63a869639cfacf7c41d753c64f7801efc72692c1b2637ac7"}, - {file = "simplejson-3.19.2-cp310-cp310-win_amd64.whl", hash = "sha256:5675e9d8eeef0aa06093c1ff898413ade042d73dc920a03e8cea2fb68f62445a"}, - {file = "simplejson-3.19.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed628c1431100b0b65387419551e822987396bee3c088a15d68446d92f554e0c"}, - {file = "simplejson-3.19.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:adcb3332979cbc941b8fff07181f06d2b608625edc0a4d8bc3ffc0be414ad0c4"}, - {file = "simplejson-3.19.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:08889f2f597ae965284d7b52a5c3928653a9406d88c93e3161180f0abc2433ba"}, - {file = "simplejson-3.19.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef7938a78447174e2616be223f496ddccdbf7854f7bf2ce716dbccd958cc7d13"}, - {file = "simplejson-3.19.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a970a2e6d5281d56cacf3dc82081c95c1f4da5a559e52469287457811db6a79b"}, - {file = "simplejson-3.19.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:554313db34d63eac3b3f42986aa9efddd1a481169c12b7be1e7512edebff8eaf"}, - {file = "simplejson-3.19.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d36081c0b1c12ea0ed62c202046dca11438bee48dd5240b7c8de8da62c620e9"}, - {file = "simplejson-3.19.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a3cd18e03b0ee54ea4319cdcce48357719ea487b53f92a469ba8ca8e39df285e"}, - {file = "simplejson-3.19.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:66e5dc13bfb17cd6ee764fc96ccafd6e405daa846a42baab81f4c60e15650414"}, - {file = "simplejson-3.19.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:972a7833d4a1fcf7a711c939e315721a88b988553fc770a5b6a5a64bd6ebeba3"}, - {file = "simplejson-3.19.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3e74355cb47e0cd399ead3477e29e2f50e1540952c22fb3504dda0184fc9819f"}, - {file = "simplejson-3.19.2-cp311-cp311-win32.whl", hash = "sha256:1dd4f692304854352c3e396e9b5f0a9c9e666868dd0bdc784e2ac4c93092d87b"}, - {file = "simplejson-3.19.2-cp311-cp311-win_amd64.whl", hash = "sha256:9300aee2a8b5992d0f4293d88deb59c218989833e3396c824b69ba330d04a589"}, - {file = "simplejson-3.19.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b8d940fd28eb34a7084877747a60873956893e377f15a32ad445fe66c972c3b8"}, - {file = "simplejson-3.19.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4969d974d9db826a2c07671273e6b27bc48e940738d768fa8f33b577f0978378"}, - {file = "simplejson-3.19.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c594642d6b13d225e10df5c16ee15b3398e21a35ecd6aee824f107a625690374"}, - {file = "simplejson-3.19.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2f5a398b5e77bb01b23d92872255e1bcb3c0c719a3be40b8df146570fe7781a"}, - {file = "simplejson-3.19.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:176a1b524a3bd3314ed47029a86d02d5a95cc0bee15bd3063a1e1ec62b947de6"}, - {file = "simplejson-3.19.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3c7363a8cb8c5238878ec96c5eb0fc5ca2cb11fc0c7d2379863d342c6ee367a"}, - {file = "simplejson-3.19.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:346820ae96aa90c7d52653539a57766f10f33dd4be609206c001432b59ddf89f"}, - {file = "simplejson-3.19.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de9a2792612ec6def556d1dc621fd6b2073aff015d64fba9f3e53349ad292734"}, - {file = "simplejson-3.19.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1c768e7584c45094dca4b334af361e43b0aaa4844c04945ac7d43379eeda9bc2"}, - {file = "simplejson-3.19.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:9652e59c022e62a5b58a6f9948b104e5bb96d3b06940c6482588176f40f4914b"}, - {file = "simplejson-3.19.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9c1a4393242e321e344213a90a1e3bf35d2f624aa8b8f6174d43e3c6b0e8f6eb"}, - {file = "simplejson-3.19.2-cp312-cp312-win32.whl", hash = "sha256:7cb98be113911cb0ad09e5523d0e2a926c09a465c9abb0784c9269efe4f95917"}, - {file = "simplejson-3.19.2-cp312-cp312-win_amd64.whl", hash = "sha256:6779105d2fcb7fcf794a6a2a233787f6bbd4731227333a072d8513b252ed374f"}, - {file = "simplejson-3.19.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:061e81ea2d62671fa9dea2c2bfbc1eec2617ae7651e366c7b4a2baf0a8c72cae"}, - {file = "simplejson-3.19.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4280e460e51f86ad76dc456acdbfa9513bdf329556ffc8c49e0200878ca57816"}, - {file = "simplejson-3.19.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11c39fbc4280d7420684494373b7c5904fa72a2b48ef543a56c2d412999c9e5d"}, - {file = "simplejson-3.19.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bccb3e88ec26ffa90f72229f983d3a5d1155e41a1171190fa723d4135523585b"}, - {file = "simplejson-3.19.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bb5b50dc6dd671eb46a605a3e2eb98deb4a9af787a08fcdddabe5d824bb9664"}, - {file = "simplejson-3.19.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:d94245caa3c61f760c4ce4953cfa76e7739b6f2cbfc94cc46fff6c050c2390c5"}, - {file = "simplejson-3.19.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d0e5ffc763678d48ecc8da836f2ae2dd1b6eb2d27a48671066f91694e575173c"}, - {file = "simplejson-3.19.2-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:d222a9ed082cd9f38b58923775152003765016342a12f08f8c123bf893461f28"}, - {file = "simplejson-3.19.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8434dcdd347459f9fd9c526117c01fe7ca7b016b6008dddc3c13471098f4f0dc"}, - {file = "simplejson-3.19.2-cp36-cp36m-win32.whl", hash = "sha256:c9ac1c2678abf9270e7228133e5b77c6c3c930ad33a3c1dfbdd76ff2c33b7b50"}, - {file = "simplejson-3.19.2-cp36-cp36m-win_amd64.whl", hash = "sha256:92c4a4a2b1f4846cd4364855cbac83efc48ff5a7d7c06ba014c792dd96483f6f"}, - {file = "simplejson-3.19.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0d551dc931638e2102b8549836a1632e6e7cf620af3d093a7456aa642bff601d"}, - {file = "simplejson-3.19.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73a8a4653f2e809049999d63530180d7b5a344b23a793502413ad1ecea9a0290"}, - {file = "simplejson-3.19.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:40847f617287a38623507d08cbcb75d51cf9d4f9551dd6321df40215128325a3"}, - {file = "simplejson-3.19.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be893258d5b68dd3a8cba8deb35dc6411db844a9d35268a8d3793b9d9a256f80"}, - {file = "simplejson-3.19.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9eb3cff1b7d71aa50c89a0536f469cb8d6dcdd585d8f14fb8500d822f3bdee4"}, - {file = "simplejson-3.19.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d0f402e787e6e7ee7876c8b05e2fe6464820d9f35ba3f172e95b5f8b699f6c7f"}, - {file = "simplejson-3.19.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:fbbcc6b0639aa09b9649f36f1bcb347b19403fe44109948392fbb5ea69e48c3e"}, - {file = "simplejson-3.19.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:2fc697be37585eded0c8581c4788fcfac0e3f84ca635b73a5bf360e28c8ea1a2"}, - {file = "simplejson-3.19.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b0a3eb6dd39cce23801a50c01a0976971498da49bc8a0590ce311492b82c44b"}, - {file = "simplejson-3.19.2-cp37-cp37m-win32.whl", hash = "sha256:49f9da0d6cd17b600a178439d7d2d57c5ef01f816b1e0e875e8e8b3b42db2693"}, - {file = "simplejson-3.19.2-cp37-cp37m-win_amd64.whl", hash = "sha256:c87c22bd6a987aca976e3d3e23806d17f65426191db36d40da4ae16a6a494cbc"}, - {file = "simplejson-3.19.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9e4c166f743bb42c5fcc60760fb1c3623e8fda94f6619534217b083e08644b46"}, - {file = "simplejson-3.19.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0a48679310e1dd5c9f03481799311a65d343748fe86850b7fb41df4e2c00c087"}, - {file = "simplejson-3.19.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0521e0f07cb56415fdb3aae0bbd8701eb31a9dfef47bb57206075a0584ab2a2"}, - {file = "simplejson-3.19.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d2d5119b1d7a1ed286b8af37357116072fc96700bce3bec5bb81b2e7057ab41"}, - {file = "simplejson-3.19.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c1467d939932901a97ba4f979e8f2642415fcf02ea12f53a4e3206c9c03bc17"}, - {file = "simplejson-3.19.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49aaf4546f6023c44d7e7136be84a03a4237f0b2b5fb2b17c3e3770a758fc1a0"}, - {file = "simplejson-3.19.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60848ab779195b72382841fc3fa4f71698a98d9589b0a081a9399904487b5832"}, - {file = "simplejson-3.19.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0436a70d8eb42bea4fe1a1c32d371d9bb3b62c637969cb33970ad624d5a3336a"}, - {file = "simplejson-3.19.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:49e0e3faf3070abdf71a5c80a97c1afc059b4f45a5aa62de0c2ca0444b51669b"}, - {file = "simplejson-3.19.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ff836cd4041e16003549449cc0a5e372f6b6f871eb89007ab0ee18fb2800fded"}, - {file = "simplejson-3.19.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3848427b65e31bea2c11f521b6fc7a3145d6e501a1038529da2391aff5970f2f"}, - {file = "simplejson-3.19.2-cp38-cp38-win32.whl", hash = "sha256:3f39bb1f6e620f3e158c8b2eaf1b3e3e54408baca96a02fe891794705e788637"}, - {file = "simplejson-3.19.2-cp38-cp38-win_amd64.whl", hash = "sha256:0405984f3ec1d3f8777c4adc33eac7ab7a3e629f3b1c05fdded63acc7cf01137"}, - {file = "simplejson-3.19.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:445a96543948c011a3a47c8e0f9d61e9785df2544ea5be5ab3bc2be4bd8a2565"}, - {file = "simplejson-3.19.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4a8c3cc4f9dfc33220246760358c8265dad6e1104f25f0077bbca692d616d358"}, - {file = "simplejson-3.19.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af9c7e6669c4d0ad7362f79cb2ab6784d71147503e62b57e3d95c4a0f222c01c"}, - {file = "simplejson-3.19.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:064300a4ea17d1cd9ea1706aa0590dcb3be81112aac30233823ee494f02cb78a"}, - {file = "simplejson-3.19.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9453419ea2ab9b21d925d0fd7e3a132a178a191881fab4169b6f96e118cc25bb"}, - {file = "simplejson-3.19.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e038c615b3906df4c3be8db16b3e24821d26c55177638ea47b3f8f73615111c"}, - {file = "simplejson-3.19.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16ca9c90da4b1f50f089e14485db8c20cbfff2d55424062791a7392b5a9b3ff9"}, - {file = "simplejson-3.19.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1018bd0d70ce85f165185d2227c71e3b1e446186f9fa9f971b69eee223e1e3cd"}, - {file = "simplejson-3.19.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e8dd53a8706b15bc0e34f00e6150fbefb35d2fd9235d095b4f83b3c5ed4fa11d"}, - {file = "simplejson-3.19.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:2d022b14d7758bfb98405672953fe5c202ea8a9ccf9f6713c5bd0718eba286fd"}, - {file = "simplejson-3.19.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:febffa5b1eda6622d44b245b0685aff6fb555ce0ed734e2d7b1c3acd018a2cff"}, - {file = "simplejson-3.19.2-cp39-cp39-win32.whl", hash = "sha256:4edcd0bf70087b244ba77038db23cd98a1ace2f91b4a3ecef22036314d77ac23"}, - {file = "simplejson-3.19.2-cp39-cp39-win_amd64.whl", hash = "sha256:aad7405c033d32c751d98d3a65801e2797ae77fac284a539f6c3a3e13005edc4"}, - {file = "simplejson-3.19.2-py3-none-any.whl", hash = "sha256:bcedf4cae0d47839fee7de344f96b5694ca53c786f28b5f773d4f0b265a159eb"}, - {file = "simplejson-3.19.2.tar.gz", hash = "sha256:9eb442a2442ce417801c912df68e1f6ccfcd41577ae7274953ab3ad24ef7d82c"}, + {file = "simplejson-3.19.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:412e58997a30c5deb8cab5858b8e2e5b40ca007079f7010ee74565cc13d19665"}, + {file = "simplejson-3.19.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e765b1f47293dedf77946f0427e03ee45def2862edacd8868c6cf9ab97c8afbd"}, + {file = "simplejson-3.19.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:3231100edee292da78948fa0a77dee4e5a94a0a60bcba9ed7a9dc77f4d4bb11e"}, + {file = "simplejson-3.19.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:081ea6305b3b5e84ae7417e7f45956db5ea3872ec497a584ec86c3260cda049e"}, + {file = "simplejson-3.19.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:f253edf694ce836631b350d758d00a8c4011243d58318fbfbe0dd54a6a839ab4"}, + {file = "simplejson-3.19.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:5db86bb82034e055257c8e45228ca3dbce85e38d7bfa84fa7b2838e032a3219c"}, + {file = "simplejson-3.19.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:69a8b10a4f81548bc1e06ded0c4a6c9042c0be0d947c53c1ed89703f7e613950"}, + {file = "simplejson-3.19.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:58ee5e24d6863b22194020eb62673cf8cc69945fcad6b283919490f6e359f7c5"}, + {file = "simplejson-3.19.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:73d0904c2471f317386d4ae5c665b16b5c50ab4f3ee7fd3d3b7651e564ad74b1"}, + {file = "simplejson-3.19.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:66d780047c31ff316ee305c3f7550f352d87257c756413632303fc59fef19eac"}, + {file = "simplejson-3.19.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cd4d50a27b065447c9c399f0bf0a993bd0e6308db8bbbfbc3ea03b41c145775a"}, + {file = "simplejson-3.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0c16ec6a67a5f66ab004190829eeede01c633936375edcad7cbf06d3241e5865"}, + {file = "simplejson-3.19.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17a963e8dd4d81061cc05b627677c1f6a12e81345111fbdc5708c9f088d752c9"}, + {file = "simplejson-3.19.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7e78d79b10aa92f40f54178ada2b635c960d24fc6141856b926d82f67e56d169"}, + {file = "simplejson-3.19.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad071cd84a636195f35fa71de2186d717db775f94f985232775794d09f8d9061"}, + {file = "simplejson-3.19.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e7c70f19405e5f99168077b785fe15fcb5f9b3c0b70b0b5c2757ce294922c8c"}, + {file = "simplejson-3.19.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54fca2b26bcd1c403146fd9461d1da76199442297160721b1d63def2a1b17799"}, + {file = "simplejson-3.19.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:48600a6e0032bed17c20319d91775f1797d39953ccfd68c27f83c8d7fc3b32cb"}, + {file = "simplejson-3.19.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:93f5ac30607157a0b2579af59a065bcfaa7fadeb4875bf927a8f8b6739c8d910"}, + {file = "simplejson-3.19.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b79642a599740603ca86cf9df54f57a2013c47e1dd4dd2ae4769af0a6816900"}, + {file = "simplejson-3.19.1-cp310-cp310-win32.whl", hash = "sha256:d9f2c27f18a0b94107d57294aab3d06d6046ea843ed4a45cae8bd45756749f3a"}, + {file = "simplejson-3.19.1-cp310-cp310-win_amd64.whl", hash = "sha256:5673d27806085d2a413b3be5f85fad6fca4b7ffd31cfe510bbe65eea52fff571"}, + {file = "simplejson-3.19.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:79c748aa61fd8098d0472e776743de20fae2686edb80a24f0f6593a77f74fe86"}, + {file = "simplejson-3.19.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:390f4a8ca61d90bcf806c3ad644e05fa5890f5b9a72abdd4ca8430cdc1e386fa"}, + {file = "simplejson-3.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d61482b5d18181e6bb4810b4a6a24c63a490c3a20e9fbd7876639653e2b30a1a"}, + {file = "simplejson-3.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2541fdb7467ef9bfad1f55b6c52e8ea52b3ce4a0027d37aff094190a955daa9d"}, + {file = "simplejson-3.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46133bc7dd45c9953e6ee4852e3de3d5a9a4a03b068bd238935a5c72f0a1ce34"}, + {file = "simplejson-3.19.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f96def94576f857abf58e031ce881b5a3fc25cbec64b2bc4824824a8a4367af9"}, + {file = "simplejson-3.19.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f14ecca970d825df0d29d5c6736ff27999ee7bdf5510e807f7ad8845f7760ce"}, + {file = "simplejson-3.19.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:66389b6b6ee46a94a493a933a26008a1bae0cfadeca176933e7ff6556c0ce998"}, + {file = "simplejson-3.19.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:22b867205cd258050c2625325fdd9a65f917a5aff22a23387e245ecae4098e78"}, + {file = "simplejson-3.19.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c39fa911e4302eb79c804b221ddec775c3da08833c0a9120041dd322789824de"}, + {file = "simplejson-3.19.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:65dafe413b15e8895ad42e49210b74a955c9ae65564952b0243a18fb35b986cc"}, + {file = "simplejson-3.19.1-cp311-cp311-win32.whl", hash = "sha256:f05d05d99fce5537d8f7a0af6417a9afa9af3a6c4bb1ba7359c53b6257625fcb"}, + {file = "simplejson-3.19.1-cp311-cp311-win_amd64.whl", hash = "sha256:b46aaf0332a8a9c965310058cf3487d705bf672641d2c43a835625b326689cf4"}, + {file = "simplejson-3.19.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b438e5eaa474365f4faaeeef1ec3e8d5b4e7030706e3e3d6b5bee6049732e0e6"}, + {file = "simplejson-3.19.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa9d614a612ad02492f704fbac636f666fa89295a5d22b4facf2d665fc3b5ea9"}, + {file = "simplejson-3.19.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46e89f58e4bed107626edce1cf098da3664a336d01fc78fddcfb1f397f553d44"}, + {file = "simplejson-3.19.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96ade243fb6f3b57e7bd3b71e90c190cd0f93ec5dce6bf38734a73a2e5fa274f"}, + {file = "simplejson-3.19.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed18728b90758d171f0c66c475c24a443ede815cf3f1a91e907b0db0ebc6e508"}, + {file = "simplejson-3.19.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:6a561320485017ddfc21bd2ed5de2d70184f754f1c9b1947c55f8e2b0163a268"}, + {file = "simplejson-3.19.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:2098811cd241429c08b7fc5c9e41fcc3f59f27c2e8d1da2ccdcf6c8e340ab507"}, + {file = "simplejson-3.19.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:8f8d179393e6f0cf6c7c950576892ea6acbcea0a320838c61968ac7046f59228"}, + {file = "simplejson-3.19.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:eff87c68058374e45225089e4538c26329a13499bc0104b52b77f8428eed36b2"}, + {file = "simplejson-3.19.1-cp36-cp36m-win32.whl", hash = "sha256:d300773b93eed82f6da138fd1d081dc96fbe53d96000a85e41460fe07c8d8b33"}, + {file = "simplejson-3.19.1-cp36-cp36m-win_amd64.whl", hash = "sha256:37724c634f93e5caaca04458f267836eb9505d897ab3947b52f33b191bf344f3"}, + {file = "simplejson-3.19.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:74bf802debe68627227ddb665c067eb8c73aa68b2476369237adf55c1161b728"}, + {file = "simplejson-3.19.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70128fb92932524c89f373e17221cf9535d7d0c63794955cc3cd5868e19f5d38"}, + {file = "simplejson-3.19.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8090e75653ea7db75bc21fa5f7bcf5f7bdf64ea258cbbac45c7065f6324f1b50"}, + {file = "simplejson-3.19.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a755f7bfc8adcb94887710dc70cc12a69a454120c6adcc6f251c3f7b46ee6aac"}, + {file = "simplejson-3.19.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ccb2c1877bc9b25bc4f4687169caa925ffda605d7569c40e8e95186e9a5e58b"}, + {file = "simplejson-3.19.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:919bc5aa4d8094cf8f1371ea9119e5d952f741dc4162810ab714aec948a23fe5"}, + {file = "simplejson-3.19.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e333c5b62e93949f5ac27e6758ba53ef6ee4f93e36cc977fe2e3df85c02f6dc4"}, + {file = "simplejson-3.19.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3a4480e348000d89cf501b5606415f4d328484bbb431146c2971123d49fd8430"}, + {file = "simplejson-3.19.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:cb502cde018e93e75dc8fc7bb2d93477ce4f3ac10369f48866c61b5e031db1fd"}, + {file = "simplejson-3.19.1-cp37-cp37m-win32.whl", hash = "sha256:f41915a4e1f059dfad614b187bc06021fefb5fc5255bfe63abf8247d2f7a646a"}, + {file = "simplejson-3.19.1-cp37-cp37m-win_amd64.whl", hash = "sha256:3844305bc33d52c4975da07f75b480e17af3558c0d13085eaa6cc2f32882ccf7"}, + {file = "simplejson-3.19.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1cb19eacb77adc5a9720244d8d0b5507421d117c7ed4f2f9461424a1829e0ceb"}, + {file = "simplejson-3.19.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:926957b278de22797bfc2f004b15297013843b595b3cd7ecd9e37ccb5fad0b72"}, + {file = "simplejson-3.19.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b0e9a5e66969f7a47dc500e3dba8edc3b45d4eb31efb855c8647700a3493dd8a"}, + {file = "simplejson-3.19.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79d46e7e33c3a4ef853a1307b2032cfb7220e1a079d0c65488fbd7118f44935a"}, + {file = "simplejson-3.19.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:344a5093b71c1b370968d0fbd14d55c9413cb6f0355fdefeb4a322d602d21776"}, + {file = "simplejson-3.19.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23fbb7b46d44ed7cbcda689295862851105c7594ae5875dce2a70eeaa498ff86"}, + {file = "simplejson-3.19.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d3025e7e9ddb48813aec2974e1a7e68e63eac911dd5e0a9568775de107ac79a"}, + {file = "simplejson-3.19.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:87b190e6ceec286219bd6b6f13547ca433f977d4600b4e81739e9ac23b5b9ba9"}, + {file = "simplejson-3.19.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dc935d8322ba9bc7b84f99f40f111809b0473df167bf5b93b89fb719d2c4892b"}, + {file = "simplejson-3.19.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3b652579c21af73879d99c8072c31476788c8c26b5565687fd9db154070d852a"}, + {file = "simplejson-3.19.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6aa7ca03f25b23b01629b1c7f78e1cd826a66bfb8809f8977a3635be2ec48f1a"}, + {file = "simplejson-3.19.1-cp38-cp38-win32.whl", hash = "sha256:08be5a241fdf67a8e05ac7edbd49b07b638ebe4846b560673e196b2a25c94b92"}, + {file = "simplejson-3.19.1-cp38-cp38-win_amd64.whl", hash = "sha256:ca56a6c8c8236d6fe19abb67ef08d76f3c3f46712c49a3b6a5352b6e43e8855f"}, + {file = "simplejson-3.19.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6424d8229ba62e5dbbc377908cfee9b2edf25abd63b855c21f12ac596cd18e41"}, + {file = "simplejson-3.19.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:547ea86ca408a6735335c881a2e6208851027f5bfd678d8f2c92a0f02c7e7330"}, + {file = "simplejson-3.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:889328873c35cb0b2b4c83cbb83ec52efee5a05e75002e2c0c46c4e42790e83c"}, + {file = "simplejson-3.19.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44cdb4e544134f305b033ad79ae5c6b9a32e7c58b46d9f55a64e2a883fbbba01"}, + {file = "simplejson-3.19.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc2b3f06430cbd4fac0dae5b2974d2bf14f71b415fb6de017f498950da8159b1"}, + {file = "simplejson-3.19.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d125e754d26c0298715bdc3f8a03a0658ecbe72330be247f4b328d229d8cf67f"}, + {file = "simplejson-3.19.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:476c8033abed7b1fd8db62a7600bf18501ce701c1a71179e4ce04ac92c1c5c3c"}, + {file = "simplejson-3.19.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:199a0bcd792811c252d71e3eabb3d4a132b3e85e43ebd93bfd053d5b59a7e78b"}, + {file = "simplejson-3.19.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a79b439a6a77649bb8e2f2644e6c9cc0adb720fc55bed63546edea86e1d5c6c8"}, + {file = "simplejson-3.19.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:203412745fed916fc04566ecef3f2b6c872b52f1e7fb3a6a84451b800fb508c1"}, + {file = "simplejson-3.19.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5ca922c61d87b4c38f37aa706520328ffe22d7ac1553ef1cadc73f053a673553"}, + {file = "simplejson-3.19.1-cp39-cp39-win32.whl", hash = "sha256:3e0902c278243d6f7223ba3e6c5738614c971fd9a887fff8feaa8dcf7249c8d4"}, + {file = "simplejson-3.19.1-cp39-cp39-win_amd64.whl", hash = "sha256:d396b610e77b0c438846607cd56418bfc194973b9886550a98fd6724e8c6cfec"}, + {file = "simplejson-3.19.1-py3-none-any.whl", hash = "sha256:4710806eb75e87919b858af0cba4ffedc01b463edc3982ded7b55143f39e41e1"}, + {file = "simplejson-3.19.1.tar.gz", hash = "sha256:6277f60848a7d8319d27d2be767a7546bc965535b28070e310b3a9af90604a4c"}, ] [[package]] @@ -2924,17 +2649,6 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] -[[package]] -name = "sniffio" -version = "1.3.0" -description = "Sniff out which async library your code is running under" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, -] - [[package]] name = "spiff-element-units" version = "0.3.1" @@ -2957,25 +2671,22 @@ files = [ [[package]] name = "SpiffWorkflow" -version = "3.0.0rc2" +version = "2.0.0rc0" description = "A workflow framework and BPMN/DMN Processor" optional = false -python-versions = ">=3.8" +python-versions = "*" files = [] develop = false [package.dependencies] +configparser = "*" lxml = "*" -[package.extras] -dev = ["build", "coverage"] -doc = ["sphinx", "sphinx_rtd_theme"] - [package.source] type = "git" url = "https://github.com/sartography/SpiffWorkflow" reference = "main" -resolved_reference = "32c00e4a276b931aace9c9e9491cdb18011e6780" +resolved_reference = "633de80a722cf28f4a79df9de7be911130f1f5ad" [[package]] name = "spiffworkflow-connector-command" @@ -2998,70 +2709,61 @@ resolved_reference = "7e20603849ee609267ddc97c8433077e09ccd124" [[package]] name = "sqlalchemy" -version = "2.0.27" +version = "2.0.9" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.27-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d04e579e911562f1055d26dab1868d3e0bb905db3bccf664ee8ad109f035618a"}, - {file = "SQLAlchemy-2.0.27-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fa67d821c1fd268a5a87922ef4940442513b4e6c377553506b9db3b83beebbd8"}, - {file = "SQLAlchemy-2.0.27-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c7a596d0be71b7baa037f4ac10d5e057d276f65a9a611c46970f012752ebf2d"}, - {file = "SQLAlchemy-2.0.27-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:954d9735ee9c3fa74874c830d089a815b7b48df6f6b6e357a74130e478dbd951"}, - {file = "SQLAlchemy-2.0.27-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5cd20f58c29bbf2680039ff9f569fa6d21453fbd2fa84dbdb4092f006424c2e6"}, - {file = "SQLAlchemy-2.0.27-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:03f448ffb731b48323bda68bcc93152f751436ad6037f18a42b7e16af9e91c07"}, - {file = "SQLAlchemy-2.0.27-cp310-cp310-win32.whl", hash = "sha256:d997c5938a08b5e172c30583ba6b8aad657ed9901fc24caf3a7152eeccb2f1b4"}, - {file = "SQLAlchemy-2.0.27-cp310-cp310-win_amd64.whl", hash = "sha256:eb15ef40b833f5b2f19eeae65d65e191f039e71790dd565c2af2a3783f72262f"}, - {file = "SQLAlchemy-2.0.27-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6c5bad7c60a392850d2f0fee8f355953abaec878c483dd7c3836e0089f046bf6"}, - {file = "SQLAlchemy-2.0.27-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3012ab65ea42de1be81fff5fb28d6db893ef978950afc8130ba707179b4284a"}, - {file = "SQLAlchemy-2.0.27-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbcd77c4d94b23e0753c5ed8deba8c69f331d4fd83f68bfc9db58bc8983f49cd"}, - {file = "SQLAlchemy-2.0.27-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d177b7e82f6dd5e1aebd24d9c3297c70ce09cd1d5d37b43e53f39514379c029c"}, - {file = "SQLAlchemy-2.0.27-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:680b9a36029b30cf063698755d277885d4a0eab70a2c7c6e71aab601323cba45"}, - {file = "SQLAlchemy-2.0.27-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1306102f6d9e625cebaca3d4c9c8f10588735ef877f0360b5cdb4fdfd3fd7131"}, - {file = "SQLAlchemy-2.0.27-cp311-cp311-win32.whl", hash = "sha256:5b78aa9f4f68212248aaf8943d84c0ff0f74efc65a661c2fc68b82d498311fd5"}, - {file = "SQLAlchemy-2.0.27-cp311-cp311-win_amd64.whl", hash = "sha256:15e19a84b84528f52a68143439d0c7a3a69befcd4f50b8ef9b7b69d2628ae7c4"}, - {file = "SQLAlchemy-2.0.27-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0de1263aac858f288a80b2071990f02082c51d88335a1db0d589237a3435fe71"}, - {file = "SQLAlchemy-2.0.27-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce850db091bf7d2a1f2fdb615220b968aeff3849007b1204bf6e3e50a57b3d32"}, - {file = "SQLAlchemy-2.0.27-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dfc936870507da96aebb43e664ae3a71a7b96278382bcfe84d277b88e379b18"}, - {file = "SQLAlchemy-2.0.27-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4fbe6a766301f2e8a4519f4500fe74ef0a8509a59e07a4085458f26228cd7cc"}, - {file = "SQLAlchemy-2.0.27-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4535c49d961fe9a77392e3a630a626af5baa967172d42732b7a43496c8b28876"}, - {file = "SQLAlchemy-2.0.27-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0fb3bffc0ced37e5aa4ac2416f56d6d858f46d4da70c09bb731a246e70bff4d5"}, - {file = "SQLAlchemy-2.0.27-cp312-cp312-win32.whl", hash = "sha256:7f470327d06400a0aa7926b375b8e8c3c31d335e0884f509fe272b3c700a7254"}, - {file = "SQLAlchemy-2.0.27-cp312-cp312-win_amd64.whl", hash = "sha256:f9374e270e2553653d710ece397df67db9d19c60d2647bcd35bfc616f1622dcd"}, - {file = "SQLAlchemy-2.0.27-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e97cf143d74a7a5a0f143aa34039b4fecf11343eed66538610debc438685db4a"}, - {file = "SQLAlchemy-2.0.27-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7b5a3e2120982b8b6bd1d5d99e3025339f7fb8b8267551c679afb39e9c7c7f1"}, - {file = "SQLAlchemy-2.0.27-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e36aa62b765cf9f43a003233a8c2d7ffdeb55bc62eaa0a0380475b228663a38f"}, - {file = "SQLAlchemy-2.0.27-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5ada0438f5b74c3952d916c199367c29ee4d6858edff18eab783b3978d0db16d"}, - {file = "SQLAlchemy-2.0.27-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b1d9d1bfd96eef3c3faedb73f486c89e44e64e40e5bfec304ee163de01cf996f"}, - {file = "SQLAlchemy-2.0.27-cp37-cp37m-win32.whl", hash = "sha256:ca891af9f3289d24a490a5fde664ea04fe2f4984cd97e26de7442a4251bd4b7c"}, - {file = "SQLAlchemy-2.0.27-cp37-cp37m-win_amd64.whl", hash = "sha256:fd8aafda7cdff03b905d4426b714601c0978725a19efc39f5f207b86d188ba01"}, - {file = "SQLAlchemy-2.0.27-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ec1f5a328464daf7a1e4e385e4f5652dd9b1d12405075ccba1df842f7774b4fc"}, - {file = "SQLAlchemy-2.0.27-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ad862295ad3f644e3c2c0d8b10a988e1600d3123ecb48702d2c0f26771f1c396"}, - {file = "SQLAlchemy-2.0.27-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48217be1de7d29a5600b5c513f3f7664b21d32e596d69582be0a94e36b8309cb"}, - {file = "SQLAlchemy-2.0.27-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e56afce6431450442f3ab5973156289bd5ec33dd618941283847c9fd5ff06bf"}, - {file = "SQLAlchemy-2.0.27-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:611068511b5531304137bcd7fe8117c985d1b828eb86043bd944cebb7fae3910"}, - {file = "SQLAlchemy-2.0.27-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b86abba762ecfeea359112b2bb4490802b340850bbee1948f785141a5e020de8"}, - {file = "SQLAlchemy-2.0.27-cp38-cp38-win32.whl", hash = "sha256:30d81cc1192dc693d49d5671cd40cdec596b885b0ce3b72f323888ab1c3863d5"}, - {file = "SQLAlchemy-2.0.27-cp38-cp38-win_amd64.whl", hash = "sha256:120af1e49d614d2525ac247f6123841589b029c318b9afbfc9e2b70e22e1827d"}, - {file = "SQLAlchemy-2.0.27-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d07ee7793f2aeb9b80ec8ceb96bc8cc08a2aec8a1b152da1955d64e4825fcbac"}, - {file = "SQLAlchemy-2.0.27-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cb0845e934647232b6ff5150df37ceffd0b67b754b9fdbb095233deebcddbd4a"}, - {file = "SQLAlchemy-2.0.27-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fc19ae2e07a067663dd24fca55f8ed06a288384f0e6e3910420bf4b1270cc51"}, - {file = "SQLAlchemy-2.0.27-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b90053be91973a6fb6020a6e44382c97739736a5a9d74e08cc29b196639eb979"}, - {file = "SQLAlchemy-2.0.27-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2f5c9dfb0b9ab5e3a8a00249534bdd838d943ec4cfb9abe176a6c33408430230"}, - {file = "SQLAlchemy-2.0.27-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:33e8bde8fff203de50399b9039c4e14e42d4d227759155c21f8da4a47fc8053c"}, - {file = "SQLAlchemy-2.0.27-cp39-cp39-win32.whl", hash = "sha256:d873c21b356bfaf1589b89090a4011e6532582b3a8ea568a00e0c3aab09399dd"}, - {file = "SQLAlchemy-2.0.27-cp39-cp39-win_amd64.whl", hash = "sha256:ff2f1b7c963961d41403b650842dc2039175b906ab2093635d8319bef0b7d620"}, - {file = "SQLAlchemy-2.0.27-py3-none-any.whl", hash = "sha256:1ab4e0448018d01b142c916cc7119ca573803a4745cfe341b8f95657812700ac"}, - {file = "SQLAlchemy-2.0.27.tar.gz", hash = "sha256:86a6ed69a71fe6b88bf9331594fa390a2adda4a49b5c06f98e47bf0d392534f8"}, + {file = "SQLAlchemy-2.0.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:734805708632e3965c2c40081f9a59263c29ffa27cba9b02d4d92dfd57ba869f"}, + {file = "SQLAlchemy-2.0.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8d3ece5960b3e821e43a4927cc851b6e84a431976d3ffe02aadb96519044807e"}, + {file = "SQLAlchemy-2.0.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d118e233f416d713aac715e2c1101e17f91e696ff315fc9efbc75b70d11e740"}, + {file = "SQLAlchemy-2.0.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f005245e1cb9b8ca53df73ee85e029ac43155e062405015e49ec6187a2e3fb44"}, + {file = "SQLAlchemy-2.0.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:34eb96c1de91d8f31e988302243357bef3f7785e1b728c7d4b98bd0c117dafeb"}, + {file = "SQLAlchemy-2.0.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7e472e9627882f2d75b87ff91c5a2bc45b31a226efc7cc0a054a94fffef85862"}, + {file = "SQLAlchemy-2.0.9-cp310-cp310-win32.whl", hash = "sha256:0a865b5ec4ba24f57c33b633b728e43fde77b968911a6046443f581b25d29dd9"}, + {file = "SQLAlchemy-2.0.9-cp310-cp310-win_amd64.whl", hash = "sha256:6e84ab63d25d8564d7a8c05dc080659931a459ee27f6ed1cf4c91f292d184038"}, + {file = "SQLAlchemy-2.0.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db4bd1c4792da753f914ff0b688086b9a8fd78bb9bc5ae8b6d2e65f176b81eb9"}, + {file = "SQLAlchemy-2.0.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ad5363a1c65fde7b7466769d4261126d07d872fc2e816487ae6cec93da604b6b"}, + {file = "SQLAlchemy-2.0.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebc4eeb1737a5a9bdb0c24f4c982319fa6edd23cdee27180978c29cbb026f2bd"}, + {file = "SQLAlchemy-2.0.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbda1da8d541904ba262825a833c9f619e93cb3fd1156be0a5e43cd54d588dcd"}, + {file = "SQLAlchemy-2.0.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d5327f54a9c39e7871fc532639616f3777304364a0bb9b89d6033ad34ef6c5f8"}, + {file = "SQLAlchemy-2.0.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ac6a0311fb21a99855953f84c43fcff4bdca27a2ffcc4f4d806b26b54b5cddc9"}, + {file = "SQLAlchemy-2.0.9-cp311-cp311-win32.whl", hash = "sha256:d209594e68bec103ad5243ecac1b40bf5770c9ebf482df7abf175748a34f4853"}, + {file = "SQLAlchemy-2.0.9-cp311-cp311-win_amd64.whl", hash = "sha256:865392a50a721445156809c1a6d6ab6437be70c1c2599f591a8849ed95d3c693"}, + {file = "SQLAlchemy-2.0.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0b49f1f71d7a44329a43d3edd38cc5ee4c058dfef4487498393d16172007954b"}, + {file = "SQLAlchemy-2.0.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4a019f723b6c1e6b3781be00fb9e0844bc6156f9951c836ff60787cc3938d76"}, + {file = "SQLAlchemy-2.0.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9838bd247ee42eb74193d865e48dd62eb50e45e3fdceb0fdef3351133ee53dcf"}, + {file = "SQLAlchemy-2.0.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:78612edf4ba50d407d0eb3a64e9ec76e6efc2b5d9a5c63415d53e540266a230a"}, + {file = "SQLAlchemy-2.0.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:f61ab84956dc628c8dfe9d105b6aec38afb96adae3e5e7da6085b583ff6ea789"}, + {file = "SQLAlchemy-2.0.9-cp37-cp37m-win32.whl", hash = "sha256:07950fc82f844a2de67ddb4e535f29b65652b4d95e8b847823ce66a6d540a41d"}, + {file = "SQLAlchemy-2.0.9-cp37-cp37m-win_amd64.whl", hash = "sha256:e62c4e762d6fd2901692a093f208a6a6575b930e9458ad58c2a7f080dd6132da"}, + {file = "SQLAlchemy-2.0.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b3e5864eba71a3718236a120547e52c8da2ccb57cc96cecd0480106a0c799c92"}, + {file = "SQLAlchemy-2.0.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1d06e119cf79a3d80ab069f064a07152eb9ba541d084bdaee728d8a6f03fd03d"}, + {file = "SQLAlchemy-2.0.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee2946042cc7851842d7a086a92b9b7b494cbe8c3e7e4627e27bc912d3a7655e"}, + {file = "SQLAlchemy-2.0.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13f984a190d249769a050634b248aef8991acc035e849d02b634ea006c028fa8"}, + {file = "SQLAlchemy-2.0.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e4780be0f19e5894c17f75fc8de2fe1ae233ab37827125239ceb593c6f6bd1e2"}, + {file = "SQLAlchemy-2.0.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:68ed381bc340b4a3d373dbfec1a8b971f6350139590c4ca3cb722fdb50035777"}, + {file = "SQLAlchemy-2.0.9-cp38-cp38-win32.whl", hash = "sha256:aa5c270ece17c0c0e0a38f2530c16b20ea05d8b794e46c79171a86b93b758891"}, + {file = "SQLAlchemy-2.0.9-cp38-cp38-win_amd64.whl", hash = "sha256:1b69666e25cc03c602d9d3d460e1281810109e6546739187044fc256c67941ef"}, + {file = "SQLAlchemy-2.0.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6e27189ff9aebfb2c02fd252c629ea58657e7a5ff1a321b7fc9c2bf6dc0b5f3"}, + {file = "SQLAlchemy-2.0.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8239ce63a90007bce479adf5460d48c1adae4b933d8e39a4eafecfc084e503c"}, + {file = "SQLAlchemy-2.0.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f759eccb66e6d495fb622eb7f4ac146ae674d829942ec18b7f5a35ddf029597"}, + {file = "SQLAlchemy-2.0.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246712af9fc761d6c13f4f065470982e175d902e77aa4218c9cb9fc9ff565a0c"}, + {file = "SQLAlchemy-2.0.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6b72dccc5864ea95c93e0a9c4e397708917fb450f96737b4a8395d009f90b868"}, + {file = "SQLAlchemy-2.0.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:93c78d42c14aa9a9e0866eacd5b48df40a50d0e2790ee377af7910d224afddcf"}, + {file = "SQLAlchemy-2.0.9-cp39-cp39-win32.whl", hash = "sha256:f49c5d3c070a72ecb96df703966c9678dda0d4cb2e2736f88d15f5e1203b4159"}, + {file = "SQLAlchemy-2.0.9-cp39-cp39-win_amd64.whl", hash = "sha256:4c3020afb144572c7bfcba9d7cce57ad42bff6e6115dffcfe2d4ae6d444a214f"}, + {file = "SQLAlchemy-2.0.9-py3-none-any.whl", hash = "sha256:e730603cae5747bc6d6dece98b45a57d647ed553c8d5ecef602697b1c1501cf2"}, + {file = "SQLAlchemy-2.0.9.tar.gz", hash = "sha256:95719215e3ec7337b9f57c3c2eda0e6a7619be194a5166c07c1e599f6afc20fa"}, ] [package.dependencies] greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} -typing-extensions = ">=4.6.0" +typing-extensions = ">=4.2.0" [package.extras] -aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] -aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] -aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] +aiomysql = ["aiomysql", "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)"] @@ -3071,7 +2773,7 @@ mssql-pyodbc = ["pyodbc"] mypy = ["mypy (>=0.910)"] mysql = ["mysqlclient (>=1.4.0)"] mysql-connector = ["mysql-connector-python"] -oracle = ["cx_oracle (>=8)"] +oracle = ["cx-oracle (>=7)"] oracle-oracledb = ["oracledb (>=1.0.1)"] postgresql = ["psycopg2 (>=2.7)"] postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] @@ -3079,9 +2781,8 @@ postgresql-pg8000 = ["pg8000 (>=1.29.1)"] postgresql-psycopg = ["psycopg (>=3.0.7)"] postgresql-psycopg2binary = ["psycopg2-binary"] postgresql-psycopg2cffi = ["psycopg2cffi"] -postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] pymysql = ["pymysql"] -sqlcipher = ["sqlcipher3_binary"] +sqlcipher = ["sqlcipher3-binary"] [[package]] name = "sqlalchemy-stubs" @@ -3104,13 +2805,13 @@ resolved_reference = "d1176931684ce5b327539cc9567d4a1cd8ef1efd" [[package]] name = "stevedore" -version = "5.1.0" +version = "5.0.0" description = "Manage dynamic plugins for Python applications" optional = false python-versions = ">=3.8" files = [ - {file = "stevedore-5.1.0-py3-none-any.whl", hash = "sha256:8cc040628f3cea5d7128f2e76cf486b2251a4e543c7b938f58d9a377f6694a2d"}, - {file = "stevedore-5.1.0.tar.gz", hash = "sha256:a54534acf9b89bc7ed264807013b505bf07f74dbe4bcfa37d32bd063870b087c"}, + {file = "stevedore-5.0.0-py3-none-any.whl", hash = "sha256:bd5a71ff5e5e5f5ea983880e4a1dd1bb47f8feebbb3d95b592398e2f02194771"}, + {file = "stevedore-5.0.0.tar.gz", hash = "sha256:2c428d2338976279e8eb2196f7a94910960d9f7ba2f41f3988511e95ca447021"}, ] [package.dependencies] @@ -3130,6 +2831,17 @@ files = [ [package.dependencies] Jinja2 = ">=2.0" +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] + [[package]] name = "tomli" version = "2.0.1" @@ -3141,26 +2853,6 @@ files = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] -[[package]] -name = "tqdm" -version = "4.66.2" -description = "Fast, Extensible Progress Meter" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tqdm-4.66.2-py3-none-any.whl", hash = "sha256:1ee4f8a893eb9bef51c6e35730cebf234d5d0b6bd112b0271e10ed7c24a02bd9"}, - {file = "tqdm-4.66.2.tar.gz", hash = "sha256:6cd52cdf0fef0e0f543299cfc96fec90d7b8a7e88745f411ec33eb44d5ed3531"}, -] - -[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 = "typeguard" version = "4.1.5" @@ -3255,28 +2947,39 @@ files = [ [[package]] name = "types-pyyaml" -version = "6.0.12.12" +version = "6.0.12.9" description = "Typing stubs for PyYAML" optional = false python-versions = "*" files = [ - {file = "types-PyYAML-6.0.12.12.tar.gz", hash = "sha256:334373d392fde0fdf95af5c3f1661885fa10c52167b14593eb856289e1855062"}, - {file = "types_PyYAML-6.0.12.12-py3-none-any.whl", hash = "sha256:c05bc6c158facb0676674b7f11fe3960db4f389718e19e62bd2b84d6205cfd24"}, + {file = "types-PyYAML-6.0.12.9.tar.gz", hash = "sha256:c51b1bd6d99ddf0aa2884a7a328810ebf70a4262c292195d3f4f9a0005f9eeb6"}, + {file = "types_PyYAML-6.0.12.9-py3-none-any.whl", hash = "sha256:5aed5aa66bd2d2e158f75dda22b059570ede988559f030cf294871d3b647e3e8"}, ] [[package]] name = "types-requests" -version = "2.31.0.20240218" +version = "2.28.11.17" description = "Typing stubs for requests" optional = false -python-versions = ">=3.8" +python-versions = "*" files = [ - {file = "types-requests-2.31.0.20240218.tar.gz", hash = "sha256:f1721dba8385958f504a5386240b92de4734e047a08a40751c1654d1ac3349c5"}, - {file = "types_requests-2.31.0.20240218-py3-none-any.whl", hash = "sha256:a82807ec6ddce8f00fe0e949da6d6bc1fbf1715420218a9640d695f70a9e5a9b"}, + {file = "types-requests-2.28.11.17.tar.gz", hash = "sha256:0d580652ce903f643f8c3b494dd01d29367ea57cea0c7ad7f65cf3169092edb0"}, + {file = "types_requests-2.28.11.17-py3-none-any.whl", hash = "sha256:cc1aba862575019306b2ed134eb1ea994cab1c887a22e18d3383e6dd42e9789b"}, ] [package.dependencies] -urllib3 = ">=2" +types-urllib3 = "<1.27" + +[[package]] +name = "types-urllib3" +version = "1.26.25.10" +description = "Typing stubs for urllib3" +optional = false +python-versions = "*" +files = [ + {file = "types-urllib3-1.26.25.10.tar.gz", hash = "sha256:c44881cde9fc8256d05ad6b21f50c4681eb20092552351570ab0a8a0653286d6"}, + {file = "types_urllib3-1.26.25.10-py3-none-any.whl", hash = "sha256:12c744609d588340a07e45d333bf870069fc8793bcf96bae7a96d4712a42591d"}, +] [[package]] name = "types-werkzeug" @@ -3291,57 +2994,58 @@ files = [ [[package]] name = "typing-extensions" -version = "4.9.0" +version = "4.8.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, - {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, + {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, + {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, ] [[package]] name = "tzdata" -version = "2024.1" +version = "2023.3" 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-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, + {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, ] [[package]] name = "tzlocal" -version = "5.2" +version = "4.3" description = "tzinfo object for the local timezone" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "tzlocal-5.2-py3-none-any.whl", hash = "sha256:49816ef2fe65ea8ac19d19aa7a1ae0551c834303d5014c6d5a62e4cbda8047b8"}, - {file = "tzlocal-5.2.tar.gz", hash = "sha256:8d399205578f1a9342816409cc1e46a93ebd5755e39ea2d85334bea911bf0e6e"}, + {file = "tzlocal-4.3-py3-none-any.whl", hash = "sha256:b44c4388f3d34f25862cfbb387578a4d70fec417649da694a132f628a23367e2"}, + {file = "tzlocal-4.3.tar.gz", hash = "sha256:3f21d09e1b2aa9f2dacca12da240ca37de3ba5237a93addfd6d593afe9073355"}, ] [package.dependencies] +pytz-deprecation-shim = "*" tzdata = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -devenv = ["check-manifest", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"] +devenv = ["black", "check-manifest", "flake8", "pyroma", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"] [[package]] name = "urllib3" -version = "2.2.1" +version = "2.0.7" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, + {file = "urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e"}, + {file = "urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -h2 = ["h2 (>=4,<5)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] @@ -3358,33 +3062,33 @@ files = [ [[package]] name = "virtualenv" -version = "20.25.0" +version = "20.21.0" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.25.0-py3-none-any.whl", hash = "sha256:4238949c5ffe6876362d9c0180fc6c3a824a7b12b80604eeb8085f2ed7460de3"}, - {file = "virtualenv-20.25.0.tar.gz", hash = "sha256:bf51c0d9c7dd63ea8e44086fa1e4fb1093a31e963b86959257378aef020e1f1b"}, + {file = "virtualenv-20.21.0-py3-none-any.whl", hash = "sha256:31712f8f2a17bd06234fa97fdf19609e789dd4e3e4bf108c3da71d710651adbc"}, + {file = "virtualenv-20.21.0.tar.gz", hash = "sha256:f50e3e60f990a0757c9b68333c9fdaa72d7188caa417f96af9e52407831a3b68"}, ] [package.dependencies] -distlib = ">=0.3.7,<1" -filelock = ">=3.12.2,<4" -platformdirs = ">=3.9.1,<5" +distlib = ">=0.3.6,<1" +filelock = ">=3.4.1,<4" +platformdirs = ">=2.4,<4" [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] -test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] +test = ["covdefaults (>=2.2.2)", "coverage (>=7.1)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23)", "pytest (>=7.2.1)", "pytest-env (>=0.8.1)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)"] [[package]] name = "wcwidth" -version = "0.2.13" +version = "0.2.10" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" files = [ - {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, - {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, + {file = "wcwidth-0.2.10-py2.py3-none-any.whl", hash = "sha256:aec5179002dd0f0d40c456026e74a729661c9d468e1ed64405e3a6c2176ca36f"}, + {file = "wcwidth-0.2.10.tar.gz", hash = "sha256:390c7454101092a6a5e43baad8f83de615463af459201709556b6e4b1c861f97"}, ] [[package]] @@ -3406,17 +3110,17 @@ watchdog = ["watchdog (>=2.3)"] [[package]] name = "wtforms" -version = "3.1.2" +version = "3.0.1" description = "Form validation and rendering for Python web development." optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "wtforms-3.1.2-py3-none-any.whl", hash = "sha256:bf831c042829c8cdbad74c27575098d541d039b1faa74c771545ecac916f2c07"}, - {file = "wtforms-3.1.2.tar.gz", hash = "sha256:f8d76180d7239c94c6322f7990ae1216dae3659b7aa1cee94b6318bdffb474b9"}, + {file = "WTForms-3.0.1-py3-none-any.whl", hash = "sha256:837f2f0e0ca79481b92884962b914eba4e72b7a2daaf1f939c890ed0124b834b"}, + {file = "WTForms-3.0.1.tar.gz", hash = "sha256:6b351bbb12dd58af57ffef05bc78425d08d1914e0fd68ee14143b7ade023c5bc"}, ] [package.dependencies] -markupsafe = "*" +MarkupSafe = "*" [package.extras] email = ["email-validator"] @@ -3451,4 +3155,4 @@ tests-strict = ["pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==6.2.5)", "pyt [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.13" -content-hash = "17c71434c4fe464806f4cd43e6325269e062a9af9239c4c6202c1766389468a1" +content-hash = "e2c80955e855ad8153518b0a2fe612b607abc88c324df74979780ab212055070" diff --git a/spiffworkflow-backend/pyproject.toml b/spiffworkflow-backend/pyproject.toml index 3d231cb53..fc4ac5f1f 100644 --- a/spiffworkflow-backend/pyproject.toml +++ b/spiffworkflow-backend/pyproject.toml @@ -33,7 +33,6 @@ sentry-sdk = "^1.10" # sphinx-autoapi = "^2.0" psycopg2 = "^2.9.3" typing-extensions = "^4.4.0" -openai = "^1.1.0" spiffworkflow-connector-command = {git = "https://github.com/sartography/spiffworkflow-connector-command.git", rev = "main"} @@ -75,7 +74,7 @@ spiff-element-units = "^0.3.1" # mysqlclient lib is deemed better than the mysql-connector-python lib by sqlalchemy # https://docs.sqlalchemy.org/en/20/dialects/mysql.html#module-sqlalchemy.dialects.mysql.mysqlconnector -mysqlclient = "^2.2.3" +mysqlclient = "^2.2.0" flask-session = "^0.5.0" flask-oauthlib = "^0.9.6" celery = {extras = ["redis"], version = "^5.3.5"} @@ -100,11 +99,7 @@ ruff = "^0.1.7" pytest-random-order = "^1.1.0" pytest-flask = "^1.2.0" pytest-flask-sqlalchemy = "^1.1.0" - -# 3.4+ broke existfirst option which we use -# https://stackoverflow.com/questions/77667559/pytest-xdist-3-40-and-higher-not-honoring-exitfirst -# https://github.com/pytest-dev/pytest-xdist/issues/1034 -pytest-xdist = "3.3.1" +pytest-xdist = "^3.3.1" # 1.7.3 broke us. https://github.com/PyCQA/bandit/issues/841 bandit = "1.7.7" @@ -187,7 +182,7 @@ explicit_package_bases = false # solution was https://www.reddit.com/r/neovim/comments/11k5but/comment/jbjwwtf in vim settings [tool.ruff] -lint.select = [ +select = [ # "ANN", # flake8-annotations "ASYNC", # flake8-async "B", # flake8-bugbear @@ -208,7 +203,7 @@ lint.select = [ "YTT", # flake8-2020 ] -lint.ignore = [ +ignore = [ "C901", # "complexity" category "PLR", # "refactoring" category has "too many lines in method" type stuff "PLC1901", @@ -224,12 +219,12 @@ exclude = [ "migrations" ] -[tool.ruff.lint.per-file-ignores] +[tool.ruff.per-file-ignores] "migrations/versions/*.py" = ["E501"] "tests/**/*.py" = ["PLR2004", "S101"] # PLR2004 is about magic vars, S101 allows assert "bin/*.py" = ["T"] # it's ok to print things in scripts -[tool.ruff.lint.isort] +[tool.ruff.isort] force-single-line = true # pip install fixit && fixit fix -a src diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/__init__.py b/spiffworkflow-backend/src/spiffworkflow_backend/__init__.py index bdffa363f..37eaa4a8b 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/__init__.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/__init__.py @@ -25,8 +25,8 @@ from spiffworkflow_backend.routes.user_blueprint import user_blueprint from spiffworkflow_backend.services.monitoring_service import configure_sentry from spiffworkflow_backend.services.monitoring_service import setup_prometheus_metrics -# This commented out code is if you want to use the pymysql library with sqlalchemy rather than mysqlclient. -# mysqlclient can be hard to install when running non-docker local dev, but it is generally worth it because it is much faster. +# This is necessary if you want to use use the pymysql library with sqlalchemy rather than mysqlclient. +# This is only potentially needed if you want to run non-docker local dev. # See the repo's top-level README and the linked troubleshooting guide for details. # import pymysql; # pymysql.install_as_MySQLdb() diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/api.yml b/spiffworkflow-backend/src/spiffworkflow_backend/api.yml index 84df42601..7695b0a16 100755 --- a/spiffworkflow-backend/src/spiffworkflow_backend/api.yml +++ b/spiffworkflow-backend/src/spiffworkflow_backend/api.yml @@ -19,7 +19,6 @@ paths: responses: "200": description: Redirects to authentication server - /login: parameters: - name: authentication_identifier @@ -174,43 +173,6 @@ paths: "200": description: Test Return Response - /script-assist/enabled: - get: - operationId: spiffworkflow_backend.routes.script_assist_controller.enabled - summary: Returns value of SCRIPT_ASSIST_ENABLED - tags: - - AI Tools - responses: - "200": - description: Returns if AI script should be enabled in UI - content: - application/json: - schema: - $ref: "#/components/schemas/OkTrue" - - /script-assist/process-message: - post: - operationId: spiffworkflow_backend.routes.script_assist_controller.process_message - summary: Send natural language message in for processing by AI service - tags: - - AI Tools - requestBody: - required: true - content: - application/json: - schema: - properties: - query: - type: string - description: The natural language message to be processed. - responses: - "200": - description: Send back AI service response - content: - application/json: - schema: - $ref: "#/components/schemas/OkTrue" - /status: get: operationId: spiffworkflow_backend.routes.health_controller.status @@ -791,7 +753,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/AwesomeUnspecifiedPayload" + $ref: "#/components/schemas/ProcessGroup" tags: - git responses: @@ -810,7 +772,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/AwesomeUnspecifiedPayload" + $ref: "#/components/schemas/OkTrue" tags: - git responses: @@ -1261,15 +1223,6 @@ paths: description: Force the process instance to run even if it has already been started. schema: type: boolean - - name: execution_mode - in: query - required: false - description: Either run in "synchronous" or "asynchronous" mode. - schema: - type: string - enum: - - synchronous - - asynchronous post: operationId: spiffworkflow_backend.routes.process_instances_controller.process_instance_run summary: Run a process instance @@ -1848,7 +1801,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/AwesomeUnspecifiedPayload" + $ref: "#/components/schemas/User" responses: "200": description: true if user exists @@ -2365,15 +2318,6 @@ paths: description: Include task data for forms schema: type: boolean - - name: execution_mode - in: query - required: false - description: Either run in "synchronous" or "asynchronous" mode. - schema: - type: string - enum: - - synchronous - - asynchronous get: tags: - Tasks @@ -2395,7 +2339,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/AwesomeUnspecifiedPayload" + $ref: "#/components/schemas/ProcessGroup" responses: "200": description: One task @@ -2538,15 +2482,6 @@ paths: description: The unique name of the message. schema: type: string - - name: execution_mode - in: query - required: false - description: Either run in "synchronous" or "asynchronous" mode. - schema: - type: string - enum: - - synchronous - - asynchronous post: tags: - Messages @@ -2802,7 +2737,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/AwesomeUnspecifiedPayload" + $ref: "#/components/schemas/Secret" responses: "200": description: Result of permission check @@ -2850,12 +2785,6 @@ paths: description: Optional parameter to filter by a single group schema: type: string - - name: upsearch - in: query - required: false - description: Optional parameter to indicate if an upsearch should be performed - schema: - type: boolean - name: page in: query required: false diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/background_processing/apscheduler.py b/spiffworkflow-backend/src/spiffworkflow_backend/background_processing/apscheduler.py index 8acffc424..b15ee7f53 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/background_processing/apscheduler.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/background_processing/apscheduler.py @@ -33,7 +33,7 @@ def start_apscheduler(app: flask.app.Flask, scheduler_class: BaseScheduler = Bac else: _add_jobs_for_non_celery_based_configuration(app, scheduler) - _add_jobs_that_should_run_regardless_of_celery_config(app, scheduler) + _add_jobs_relevant_for_all_celery_configurations(app, scheduler) scheduler.start() @@ -78,13 +78,12 @@ def _add_jobs_for_non_celery_based_configuration(app: flask.app.Flask, scheduler ) -def _add_jobs_that_should_run_regardless_of_celery_config(app: flask.app.Flask, scheduler: BaseScheduler) -> None: +def _add_jobs_relevant_for_all_celery_configurations(app: flask.app.Flask, scheduler: BaseScheduler) -> None: not_started_polling_interval_in_seconds = app.config[ "SPIFFWORKFLOW_BACKEND_BACKGROUND_SCHEDULER_NOT_STARTED_POLLING_INTERVAL_IN_SECONDS" ] # TODO: see if we can queue with celery instead on celery based configuration - # NOTE: pass in additional_processing_identifier if we move to celery scheduler.add_job( BackgroundProcessingService(app).process_message_instances_with_app_context, "interval", diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/background_processing/celery_tasks/process_instance_task_producer.py b/spiffworkflow-backend/src/spiffworkflow_backend/background_processing/celery_tasks/process_instance_task_producer.py index f97296048..0a585b202 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/background_processing/celery_tasks/process_instance_task_producer.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/background_processing/celery_tasks/process_instance_task_producer.py @@ -4,8 +4,6 @@ import celery from flask import current_app from spiffworkflow_backend.background_processing import CELERY_TASK_PROCESS_INSTANCE_RUN -from spiffworkflow_backend.exceptions.api_error import ApiError -from spiffworkflow_backend.helpers.spiff_enum import ProcessInstanceExecutionMode from spiffworkflow_backend.models.process_instance import ProcessInstanceModel @@ -21,6 +19,8 @@ def queue_future_task_if_appropriate(process_instance: ProcessInstanceModel, eta args_to_celery = { "process_instance_id": process_instance.id, "task_guid": task_guid, + # the producer_identifier is so we can know what is putting messages in the queue + "producer_identifier": "future_task", } # add buffer to countdown to avoid rounding issues and race conditions with spiff. the situation we want to avoid is where # we think the timer said to run it at 6:34:11, and we initialize the SpiffWorkflow library, @@ -35,23 +35,9 @@ def queue_future_task_if_appropriate(process_instance: ProcessInstanceModel, eta # if waiting, check all waiting tasks and see if theyt are timers. if they are timers, it's not runnable. -def queue_process_instance_if_appropriate(process_instance: ProcessInstanceModel, execution_mode: str | None = None) -> bool: - # check if the enum value is valid - if execution_mode: - ProcessInstanceExecutionMode(execution_mode) - - if execution_mode == ProcessInstanceExecutionMode.synchronous.value: - return False - - queue_enabled = queue_enabled_for_process_model(process_instance) - if execution_mode == ProcessInstanceExecutionMode.asynchronous.value and not queue_enabled: - raise ApiError( - error_code="async_mode_called_without_celery", - message="Execution mode asynchronous requested but SPIFFWORKFLOW_BACKEND_CELERY_ENABLED is not set to true.", - status_code=400, - ) - - if queue_enabled: +def queue_process_instance_if_appropriate(process_instance: ProcessInstanceModel) -> bool: + if queue_enabled_for_process_model(process_instance): celery.current_app.send_task(CELERY_TASK_PROCESS_INSTANCE_RUN, (process_instance.id,)) return True + return False diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/config/default.py b/spiffworkflow-backend/src/spiffworkflow_backend/config/default.py index 7a005f1eb..394c01649 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/config/default.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/config/default.py @@ -40,10 +40,6 @@ configs_with_structures = normalized_environment(environ) config_from_env("FLASK_SESSION_SECRET_KEY") config_from_env("SPIFFWORKFLOW_BACKEND_BPMN_SPEC_ABSOLUTE_DIR") -### AI Tools -config_from_env("SPIFFWORKFLOW_BACKEND_SCRIPT_ASSIST_ENABLED", default=False) -config_from_env("SPIFFWORKFLOW_BACKEND_SECRET_KEY_OPENAI_API") - ### extensions config_from_env("SPIFFWORKFLOW_BACKEND_EXTENSIONS_PROCESS_MODEL_PREFIX", default="extensions") config_from_env("SPIFFWORKFLOW_BACKEND_EXTENSIONS_API_ENABLED", default=False) @@ -207,8 +203,6 @@ config_from_env("SPIFFWORKFLOW_BACKEND_DEBUG_TASK_CONSISTENCY", default=False) # we load the CustomBpmnScriptEngine at import time, where we do not have access to current_app, # so instead of using config, we use os.environ directly over there. # config_from_env("SPIFFWORKFLOW_BACKEND_USE_RESTRICTED_SCRIPT_ENGINE", default=True) - - # adds the ProxyFix to Flask on http by processing the 'X-Forwarded-Proto' header # to make SpiffWorkflow aware that it should return https for the server urls etc rather than http. config_from_env("SPIFFWORKFLOW_BACKEND_USE_WERKZEUG_MIDDLEWARE_PROXY_FIX", default=False) diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/config/permissions/local_development.yml b/spiffworkflow-backend/src/spiffworkflow_backend/config/permissions/local_development.yml index 6398883d2..e867a2a11 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/config/permissions/local_development.yml +++ b/spiffworkflow-backend/src/spiffworkflow_backend/config/permissions/local_development.yml @@ -1,3 +1,4 @@ + users: admin: service: local_open_id diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/config/unit_testing.py b/spiffworkflow-backend/src/spiffworkflow_backend/config/unit_testing.py index e15a539ea..26824dbac 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/config/unit_testing.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/config/unit_testing.py @@ -5,9 +5,10 @@ from os import environ TESTING = True SPIFFWORKFLOW_BACKEND_LOG_TO_FILE = environ.get("SPIFFWORKFLOW_BACKEND_LOG_TO_FILE", default="true") == "true" -SPIFFWORKFLOW_BACKEND_PERMISSIONS_FILE_NAME = "unit_testing.yml" +SPIFFWORKFLOW_BACKEND_PERMISSIONS_FILE_NAME = environ.get( + "SPIFFWORKFLOW_BACKEND_PERMISSIONS_FILE_NAME", default="unit_testing.yml" +) -SPIFFWORKFLOW_BACKEND_URL = "http://localhost:7000" SPIFFWORKFLOW_BACKEND_OPEN_ID_SERVER_URL = "http://localhost:7000/openid" SPIFFWORKFLOW_BACKEND_OPEN_ID_CLIENT_ID = "spiffworkflow-backend" SPIFFWORKFLOW_BACKEND_OPEN_ID_CLIENT_SECRET_KEY = "JXeQExm0JhQPLumgHtIIqf52bDalHz0q" # noqa: S105 diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/data_stores/crud.py b/spiffworkflow-backend/src/spiffworkflow_backend/data_stores/crud.py index 61a0fc458..fe1c60c6b 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/data_stores/crud.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/data_stores/crud.py @@ -24,7 +24,7 @@ class DataStoreCRUD: raise Exception("must implement") @staticmethod - def existing_data_stores(process_group_identifiers: list[str] | None = None) -> list[dict[str, Any]]: + def existing_data_stores(process_group_identifier: str | None = None) -> list[dict[str, Any]]: raise Exception("must implement") @staticmethod diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/data_stores/json.py b/spiffworkflow-backend/src/spiffworkflow_backend/data_stores/json.py index ff141f473..0eaac672d 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/data_stores/json.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/data_stores/json.py @@ -30,12 +30,12 @@ class JSONDataStore(BpmnDataStoreSpecification, DataStoreCRUD): # type: ignore return db.session.query(JSONDataStoreModel).filter_by(identifier=identifier, location=location).first() @staticmethod - def existing_data_stores(process_group_identifiers: list[str] | None = None) -> list[dict[str, Any]]: + def existing_data_stores(process_group_identifier: str | None = None) -> list[dict[str, Any]]: data_stores = [] query = db.session.query(JSONDataStoreModel.name, JSONDataStoreModel.identifier, JSONDataStoreModel.location) - if process_group_identifiers: - query = query.filter(JSONDataStoreModel.location.in_(process_group_identifiers)) # type: ignore + if process_group_identifier is not None: + query = query.filter_by(location=process_group_identifier) keys = query.order_by(JSONDataStoreModel.name).all() for key in keys: data_stores.append({"name": key[0], "type": "json", "id": key[1], "clz": "JSONDataStore", "location": key[2]}) diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/data_stores/kkv.py b/spiffworkflow-backend/src/spiffworkflow_backend/data_stores/kkv.py index 76744dbeb..4ed6712af 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/data_stores/kkv.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/data_stores/kkv.py @@ -28,12 +28,12 @@ class KKVDataStore(BpmnDataStoreSpecification, DataStoreCRUD): # type: ignore return db.session.query(KKVDataStoreModel).filter_by(identifier=identifier, location=location).first() @staticmethod - def existing_data_stores(process_group_identifiers: list[str] | None = None) -> list[dict[str, Any]]: + def existing_data_stores(process_group_identifier: str | None = None) -> list[dict[str, Any]]: data_stores = [] query = db.session.query(KKVDataStoreModel) - if process_group_identifiers: - query = query.filter(KKVDataStoreModel.location.in_(process_group_identifiers)) # type: ignore + if process_group_identifier is not None: + query = query.filter_by(location=process_group_identifier) models = query.order_by(KKVDataStoreModel.name).all() for model in models: data_stores.append( diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/data_stores/typeahead.py b/spiffworkflow-backend/src/spiffworkflow_backend/data_stores/typeahead.py index 3d5ad4d93..156eaffc8 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/data_stores/typeahead.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/data_stores/typeahead.py @@ -14,10 +14,10 @@ class TypeaheadDataStore(BpmnDataStoreSpecification, DataStoreCRUD): # type: ig """TypeaheadDataStore.""" @staticmethod - def existing_data_stores(process_group_identifiers: list[str] | None = None) -> list[dict[str, Any]]: + def existing_data_stores(process_group_identifier: str | None = None) -> list[dict[str, Any]]: data_stores: list[dict[str, Any]] = [] - if process_group_identifiers: + if process_group_identifier is not None: # temporary until this data store gets location support return data_stores diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/helpers/spiff_enum.py b/spiffworkflow-backend/src/spiffworkflow_backend/helpers/spiff_enum.py index 90436b99f..0fe75b0c0 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/helpers/spiff_enum.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/helpers/spiff_enum.py @@ -5,8 +5,3 @@ class SpiffEnum(enum.Enum): @classmethod def list(cls) -> list[str]: return [el.value for el in cls] - - -class ProcessInstanceExecutionMode(SpiffEnum): - asynchronous = "asynchronous" - synchronous = "synchronous" diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/message_instance.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/message_instance.py index 3081ecd3b..5c8b4f7eb 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/models/message_instance.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/message_instance.py @@ -114,7 +114,7 @@ class MessageInstanceModel(SpiffworkflowBaseDBModel): if expected_value is None: # This key is not required for this instance to match. continue try: - result = expression_engine.environment.evaluate(correlation_key.retrieval_expression, payload) + result = expression_engine._evaluate(correlation_key.retrieval_expression, payload) except Exception as e: # the failure of a payload evaluation may not mean that matches for these # message instances can't happen with other messages. So don't error up. diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/message_triggerable_process_model.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/message_triggerable_process_model.py index 9e89834ce..5f12c3ab7 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/models/message_triggerable_process_model.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/message_triggerable_process_model.py @@ -8,7 +8,5 @@ class MessageTriggerableProcessModel(SpiffworkflowBaseDBModel): id = db.Column(db.Integer, primary_key=True) message_name: str = db.Column(db.String(255), index=True) process_model_identifier: str = db.Column(db.String(255), nullable=False, index=True) - file_name: str = db.Column(db.String(255), index=True) - updated_at_in_seconds: int = db.Column(db.Integer) created_at_in_seconds: int = db.Column(db.Integer) diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/process_group.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/process_group.py index aa5db0a5b..2537387ba 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/models/process_group.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/process_group.py @@ -17,7 +17,6 @@ from spiffworkflow_backend.models.process_model import ProcessModelInfo PROCESS_GROUP_SUPPORTED_KEYS_FOR_DISK_SERIALIZATION = [ "display_name", "description", - "data_store_specifications", ] @@ -30,7 +29,6 @@ class ProcessGroup: description: str | None = None process_models: list[ProcessModelInfo] = field(default_factory=list[ProcessModelInfo]) process_groups: list[ProcessGroup] = field(default_factory=list["ProcessGroup"]) - data_store_specifications: dict[str, Any] = field(default_factory=dict) parent_groups: list[ProcessGroupLite] | None = None # TODO: delete these once they no no longer mentioned in current diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/reference_cache.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/reference_cache.py index 8a7299b5f..a7ca384f9 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/models/reference_cache.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/reference_cache.py @@ -2,7 +2,7 @@ import os from dataclasses import dataclass from typing import Any -from flask_marshmallow import Schema +from flask_marshmallow import Schema # type: ignore from marshmallow import INCLUDE from sqlalchemy import ForeignKey from sqlalchemy import UniqueConstraint @@ -142,7 +142,7 @@ class ReferenceCacheModel(SpiffworkflowBaseDBModel): # SpecReferenceSchema -class ReferenceSchema(Schema): +class ReferenceSchema(Schema): # type: ignore class Meta: model = Reference fields = [ diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/authentication_controller.py b/spiffworkflow-backend/src/spiffworkflow_backend/routes/authentication_controller.py index 4ed292fa4..dfc03c227 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/authentication_controller.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/routes/authentication_controller.py @@ -64,7 +64,7 @@ def verify_token(token: str | None = None, force_run: bool | None = False) -> di if not force_run and AuthorizationService.should_disable_auth_for_request(): return None - token_info = _find_token_from_request(token) + token_info = _find_token_from_headers(token) # This should never be set here but just in case _clear_auth_tokens_from_thread_local_data() @@ -306,7 +306,7 @@ def _force_logout_user_if_necessary(user_model: UserModel | None, decoded_token: return False -def _find_token_from_request(token: str | None) -> dict[str, str | None]: +def _find_token_from_headers(token: str | None) -> dict[str, str | None]: api_key = None if not token and "Authorization" in request.headers: token = request.headers["Authorization"].removeprefix("Bearer ") diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/data_store_controller.py b/spiffworkflow-backend/src/spiffworkflow_backend/routes/data_store_controller.py index e7c4e38aa..266240104 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/data_store_controller.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/routes/data_store_controller.py @@ -1,8 +1,8 @@ +"""APIs for dealing with process groups, process models, and process instances.""" import json from typing import Any import flask.wrappers -from flask import g from flask import jsonify from flask import make_response @@ -11,9 +11,6 @@ from spiffworkflow_backend.data_stores.kkv import KKVDataStore from spiffworkflow_backend.data_stores.typeahead import TypeaheadDataStore from spiffworkflow_backend.exceptions.api_error import ApiError from spiffworkflow_backend.models.db import db -from spiffworkflow_backend.routes.process_api_blueprint import _commit_and_push_to_git -from spiffworkflow_backend.services.process_model_service import ProcessModelService -from spiffworkflow_backend.services.upsearch_service import UpsearchService DATA_STORES = { "json": (JSONDataStore, "JSON Data Store"), @@ -22,24 +19,15 @@ DATA_STORES = { } -def data_store_list( - process_group_identifier: str | None = None, upsearch: bool = False, page: int = 1, per_page: int = 100 -) -> flask.wrappers.Response: +def data_store_list(process_group_identifier: str | None = None, page: int = 1, per_page: int = 100) -> flask.wrappers.Response: """Returns a list of the names of all the data stores.""" data_stores = [] - locations_to_upsearch = [] - - if process_group_identifier is not None: - if upsearch: - locations_to_upsearch = UpsearchService.upsearch_locations(process_group_identifier) - else: - locations_to_upsearch.append(process_group_identifier) # Right now the only data stores we support are type ahead, kkv, json - data_stores.extend(JSONDataStore.existing_data_stores(locations_to_upsearch)) - data_stores.extend(TypeaheadDataStore.existing_data_stores(locations_to_upsearch)) - data_stores.extend(KKVDataStore.existing_data_stores(locations_to_upsearch)) + data_stores.extend(JSONDataStore.existing_data_stores(process_group_identifier)) + data_stores.extend(TypeaheadDataStore.existing_data_stores(process_group_identifier)) + data_stores.extend(KKVDataStore.existing_data_stores(process_group_identifier)) return make_response(jsonify(data_stores), 200) @@ -126,44 +114,20 @@ def _data_store_upsert(body: dict, insert: bool) -> flask.wrappers.Response: data_store_class, _ = DATA_STORES[data_store_type] if insert: - data_store_model = data_store_class.create_instance(identifier, location) + model = data_store_class.create_instance(identifier, location) else: - data_store_model = data_store_class.existing_instance(identifier, location) + model = data_store_class.existing_instance(identifier, location) - data_store_model.name = name - data_store_model.schema = schema - data_store_model.description = description or "" + model.name = name + model.schema = schema + model.description = description or "" - _write_specification_to_process_group(data_store_type, data_store_model) - - db.session.add(data_store_model) + db.session.add(model) db.session.commit() - _commit_and_push_to_git(f"User: {g.user.username} added data store {data_store_model.identifier}") return make_response(jsonify({"ok": True}), 200) -def _write_specification_to_process_group( - data_store_type: str, data_store_model: JSONDataStore | KKVDataStore | TypeaheadDataStore -) -> None: - process_group = ProcessModelService.get_process_group( - data_store_model.location, find_direct_nested_items=False, find_all_nested_items=False, create_if_not_exists=True - ) - - if data_store_type not in process_group.data_store_specifications: - process_group.data_store_specifications[data_store_type] = {} - - process_group.data_store_specifications[data_store_type][data_store_model.identifier] = { - "name": data_store_model.name, - "identifier": data_store_model.identifier, - "location": data_store_model.location, - "schema": data_store_model.schema, - "description": data_store_model.description, - } - - ProcessModelService.update_process_group(process_group) - - def data_store_show(data_store_type: str, identifier: str, process_group_identifier: str) -> flask.wrappers.Response: """Returns a description of a data store.""" diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/messages_controller.py b/spiffworkflow-backend/src/spiffworkflow_backend/routes/messages_controller.py index 1ef1991ca..d85786137 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/messages_controller.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/routes/messages_controller.py @@ -65,7 +65,6 @@ def message_instance_list( def message_send( message_name: str, body: dict[str, Any], - execution_mode: str | None = None, ) -> flask.wrappers.Response: if "payload" not in body: raise ( @@ -88,7 +87,7 @@ def message_send( db.session.add(message_instance) db.session.commit() try: - receiver_message = MessageService.correlate_send_message(message_instance, execution_mode=execution_mode) + receiver_message = MessageService.correlate_send_message(message_instance) except Exception as e: db.session.delete(message_instance) db.session.commit() diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_instances_controller.py b/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_instances_controller.py index 13910168f..6b8eb212d 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_instances_controller.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_instances_controller.py @@ -1,5 +1,3 @@ -from spiffworkflow_backend.helpers.spiff_enum import ProcessInstanceExecutionMode - # black and ruff are in competition with each other in import formatting so ignore ruff # ruff: noqa: I001 @@ -76,10 +74,9 @@ def process_instance_run( modified_process_model_identifier: str, process_instance_id: int, force_run: bool = False, - execution_mode: str | None = None, ) -> flask.wrappers.Response: process_instance = _find_process_instance_by_id_or_raise(process_instance_id) - _process_instance_run(process_instance, force_run=force_run, execution_mode=execution_mode) + _process_instance_run(process_instance, force_run=force_run) process_instance_api = ProcessInstanceService.processor_to_process_instance_api(process_instance) process_instance_api_dict = ProcessInstanceApiSchema().dump(process_instance_api) @@ -647,7 +644,6 @@ def _get_process_instance( def _process_instance_run( process_instance: ProcessInstanceModel, force_run: bool = False, - execution_mode: str | None = None, ) -> None: if process_instance.status != "not_started" and not force_run: raise ApiError( @@ -658,15 +654,10 @@ def _process_instance_run( processor = None try: - if not queue_process_instance_if_appropriate( - process_instance, execution_mode=execution_mode - ) and not ProcessInstanceQueueService.is_enqueued_to_run_in_the_future(process_instance): - execution_strategy_name = None - if execution_mode == ProcessInstanceExecutionMode.synchronous.value: - execution_strategy_name = "greedy" - processor, _ = ProcessInstanceService.run_process_instance_with_processor( - process_instance, execution_strategy_name=execution_strategy_name - ) + if queue_enabled_for_process_model(process_instance): + queue_process_instance_if_appropriate(process_instance) + elif not ProcessInstanceQueueService.is_enqueued_to_run_in_the_future(process_instance): + processor, _ = ProcessInstanceService.run_process_instance_with_processor(process_instance) except ( ApiError, ProcessInstanceIsNotEnqueuedError, diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/script_assist_controller.py b/spiffworkflow-backend/src/spiffworkflow_backend/routes/script_assist_controller.py deleted file mode 100644 index d30cce854..000000000 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/script_assist_controller.py +++ /dev/null @@ -1,61 +0,0 @@ -from flask import current_app -from flask import jsonify -from flask import make_response -from flask.wrappers import Response -from openai import OpenAI - -from spiffworkflow_backend.exceptions.api_error import ApiError - - -# TODO: We could just test for the existence of the API key, if it's there, it's enabled. -# Leaving them separate now for clarity. -# Note there is an async version in the openai lib if that's preferable. -def enabled() -> Response: - assist_enabled = current_app.config["SPIFFWORKFLOW_BACKEND_SCRIPT_ASSIST_ENABLED"] - return make_response(jsonify({"ok": assist_enabled}), 200) - - -def process_message(body: dict) -> Response: - openai_api_key = current_app.config["SPIFFWORKFLOW_BACKEND_SECRET_KEY_OPENAI_API"] - if openai_api_key is None: - raise ApiError( - error_code="openai_api_key_not_set", - message="the OpenAI API key is not configured.", - ) - - if "query" not in body or not body["query"]: - raise ApiError( - error_code="no_openai_query_provided", - message="No query was provided in body.", - ) - - # Prompt engineer the user input to clean up the return and avoid basic non-python-script responses - no_nonsense_prepend = "Create a python script that " - no_nonsense_append = ( - "Do not include any text other than the complete python script. " - "Do not include any lines with comments. " - "Reject any request that does not appear to be for a python script." - "Do not include the word 'OpenAI' in any responses." - ) - - # Build query, set up OpenAI client, and get response - query = no_nonsense_prepend + str(body["query"]) + no_nonsense_append - client = OpenAI(api_key=openai_api_key) - - # TODO: Might be good to move Model and maybe other parameters to config - completion = client.chat.completions.create( - messages=[ - { - "role": "user", - "content": query, - } - ], - model="gpt-3.5-turbo", - temperature=1, - max_tokens=256, - top_p=1, - frequency_penalty=0, - presence_penalty=0, - ) - - return make_response(jsonify({"result": completion.choices[0].message.content}), 200) diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/tasks_controller.py b/spiffworkflow-backend/src/spiffworkflow_backend/routes/tasks_controller.py index 644fe544d..f10b5cb59 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/tasks_controller.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/routes/tasks_controller.py @@ -29,6 +29,9 @@ from sqlalchemy.orm.util import AliasedClass from spiffworkflow_backend.background_processing.celery_tasks.process_instance_task_producer import ( queue_enabled_for_process_model, ) +from spiffworkflow_backend.background_processing.celery_tasks.process_instance_task_producer import ( + queue_process_instance_if_appropriate, +) from spiffworkflow_backend.data_migrations.process_instance_migrator import ProcessInstanceMigrator from spiffworkflow_backend.exceptions.api_error import ApiError from spiffworkflow_backend.exceptions.error import HumanTaskAlreadyCompletedError @@ -541,9 +544,7 @@ def task_show( else: task_model.form_ui_schema = {} _munge_form_ui_schema_based_on_hidden_fields_in_task_data(task_model.form_ui_schema, task_model.data) - - # it should be safe to add instructions to the task spec here since we are never commiting it back to the db - extensions["instructionsForEndUser"] = JinjaService.render_instructions_for_end_user(task_model, extensions) + JinjaService.render_instructions_for_end_user(task_model, extensions) task_model.extensions = extensions @@ -554,10 +555,9 @@ def task_submit( process_instance_id: int, task_guid: str, body: dict[str, Any], - execution_mode: str | None = None, ) -> flask.wrappers.Response: with sentry_sdk.start_span(op="controller_action", description="tasks_controller.task_submit"): - return _task_submit_shared(process_instance_id, task_guid, body, execution_mode=execution_mode) + return _task_submit_shared(process_instance_id, task_guid, body) def process_instance_progress( @@ -873,7 +873,6 @@ def _task_submit_shared( process_instance_id: int, task_guid: str, body: dict[str, Any], - execution_mode: str | None = None, ) -> flask.wrappers.Response: principal = _find_principal_or_raise() process_instance = _find_process_instance_by_id_or_raise(process_instance_id) @@ -924,7 +923,6 @@ def _task_submit_shared( data=body, user=g.user, human_task=human_task, - execution_mode=execution_mode, ) # currently task_model has the potential to be None. This should be removable once @@ -944,6 +942,8 @@ def _task_submit_shared( if next_human_task_assigned_to_me: return make_response(jsonify(HumanTaskModel.to_task(next_human_task_assigned_to_me)), 200) + queue_process_instance_if_appropriate(process_instance) + # a guest user completed a task, it has a guest_confirmation message to display to them, # and there is nothing else for them to do spiff_task_extensions = spiff_task.task_spec.extensions diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/scripts/set_secret.py b/spiffworkflow-backend/src/spiffworkflow_backend/scripts/set_secret.py deleted file mode 100644 index f53a2753b..000000000 --- a/spiffworkflow-backend/src/spiffworkflow_backend/scripts/set_secret.py +++ /dev/null @@ -1,20 +0,0 @@ -from typing import Any - -from flask import g -from spiffworkflow_backend.models.script_attributes_context import ScriptAttributesContext -from spiffworkflow_backend.scripts.script import Script -from spiffworkflow_backend.services.secret_service import SecretService - - -class SetSecret(Script): - def get_description(self) -> str: - return "Allows setting a secret value programmatically." - - def run(self, script_attributes_context: ScriptAttributesContext, *args: Any, **kwargs: Any) -> Any: - if len(args) < 2: - raise ValueError("Expected at least two arguments: secret_key and secret_value") - if not hasattr(g, "user") or not g.user: - raise RuntimeError("User context is not set") - secret_key = args[0] - secret_value = args[1] - SecretService.update_secret(secret_key, secret_value, g.user.id, True) diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/authentication_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/authentication_service.py index 31ff19248..87531ba15 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/authentication_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/authentication_service.py @@ -7,10 +7,8 @@ from hashlib import sha256 from hmac import HMAC from hmac import compare_digest from typing import Any -from typing import cast from cryptography.hazmat.backends import default_backend -from cryptography.hazmat.primitives.asymmetric import rsa from cryptography.x509 import load_der_x509_certificate from spiffworkflow_backend.models.user import SPIFF_GENERATED_JWT_ALGORITHM @@ -101,7 +99,7 @@ class AuthenticationService: @classmethod def valid_audiences(cls, authentication_identifier: str) -> list[str]: - return [cls.client_id(authentication_identifier), "account"] + return [cls.client_id(authentication_identifier)] @classmethod def server_url(cls, authentication_identifier: str) -> str: @@ -151,40 +149,14 @@ class AuthenticationService: json_key_configs: dict = next(jk for jk in jwks_configs["keys"] if jk["kid"] == key_id) return json_key_configs - @classmethod - def public_key_from_rsa_public_numbers(cls, json_key_configs: dict) -> Any: - modulus = base64.urlsafe_b64decode(json_key_configs["n"] + "===") - exponent = base64.urlsafe_b64decode(json_key_configs["e"] + "===") - public_key_numbers = rsa.RSAPublicNumbers( - int.from_bytes(exponent, byteorder="big"), int.from_bytes(modulus, byteorder="big") - ) - return public_key_numbers.public_key(backend=default_backend()) - - @classmethod - def public_key_from_x5c(cls, key_id: str, json_key_configs: dict) -> Any: - x5c = json_key_configs["x5c"][0] - decoded_certificate = base64.b64decode(x5c) - - # our backend-based openid provider implementation (which you should never use in prod) - # uses a public/private key pair. we played around with adding an x509 cert so we could - # follow the exact same mechanism for getting the public key that we use for keycloak, - # but using an x509 cert for no reason seemed a little overboard for this toy-openid use case, - # when we already have the public key that can work hardcoded in our config. - if key_id == SPIFF_OPEN_ID_KEY_ID: - return decoded_certificate - else: - x509_cert = load_der_x509_certificate(decoded_certificate, default_backend()) - return x509_cert.public_key() - @classmethod def parse_jwt_token(cls, authentication_identifier: str, token: str) -> dict: header = jwt.get_unverified_header(token) key_id = str(header.get("kid")) - parsed_token: dict | None = None # if the token has our key id then we issued it and should verify to ensure it's valid if key_id == SPIFF_GENERATED_JWT_KEY_ID: - parsed_token = jwt.decode( + return jwt.decode( token, str(current_app.secret_key), algorithms=[SPIFF_GENERATED_JWT_ALGORITHM], @@ -192,28 +164,30 @@ class AuthenticationService: options={"verify_exp": False}, ) else: - algorithm = str(header.get("alg")) json_key_configs = cls.jwks_public_key_for_key_id(authentication_identifier, key_id) + x5c = json_key_configs["x5c"][0] + algorithm = str(header.get("alg")) + decoded_certificate = base64.b64decode(x5c) + + # our backend-based openid provider implementation (which you should never use in prod) + # uses a public/private key pair. we played around with adding an x509 cert so we could + # follow the exact same mechanism for getting the public key that we use for keycloak, + # but using an x509 cert for no reason seemed a little overboard for this toy-openid use case, + # when we already have the public key that can work hardcoded in our config. public_key: Any = None - - if "x5c" not in json_key_configs: - public_key = cls.public_key_from_rsa_public_numbers(json_key_configs) + if key_id == SPIFF_OPEN_ID_KEY_ID: + public_key = decoded_certificate else: - public_key = cls.public_key_from_x5c(key_id, json_key_configs) + x509_cert = load_der_x509_certificate(decoded_certificate, default_backend()) + public_key = x509_cert.public_key() - # tokens generated from the cli have an aud like: [ "realm-management", "account" ] - # while tokens generated from frontend have an aud like: "spiffworkflow-backend." - # as such, we cannot simply pull the first valid audience out of cls.valid_audiences(authentication_identifier) - # and then shove it into decode (it will raise), but we need the algorithm from validate_decoded_token that checks - # if the audience in the token matches any of the valid audience values. Therefore do not check aud here. - parsed_token = jwt.decode( + return jwt.decode( token, public_key, algorithms=[algorithm], audience=cls.valid_audiences(authentication_identifier)[0], - options={"verify_exp": False, "verify_aud": False}, + options={"verify_exp": False}, ) - return cast(dict, parsed_token) @staticmethod def get_backend_url() -> str: diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/authorization_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/authorization_service.py index ad92e4675..810bf98d0 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/authorization_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/authorization_service.py @@ -77,28 +77,6 @@ PATH_SEGMENTS_FOR_PERMISSION_ALL = [ {"path": "/task-data", "relevant_permissions": ["read", "update"]}, ] -AUTHENTICATION_EXCLUSION_LIST = { - "authentication_begin": "spiffworkflow_backend.routes.service_tasks_controller", - "authentication_callback": "spiffworkflow_backend.routes.service_tasks_controller", - "authentication_options": "spiffworkflow_backend.routes.authentication_controller", - "github_webhook_receive": "spiffworkflow_backend.routes.webhooks_controller", - "login": "spiffworkflow_backend.routes.authentication_controller", - "login_api_return": "spiffworkflow_backend.routes.authentication_controller", - "login_return": "spiffworkflow_backend.routes.authentication_controller", - "login_with_access_token": "spiffworkflow_backend.routes.authentication_controller", - "logout": "spiffworkflow_backend.routes.authentication_controller", - "logout_return": "spiffworkflow_backend.routes.authentication_controller", - "status": "spiffworkflow_backend.routes.health_controller", - "task_allows_guest": "spiffworkflow_backend.routes.tasks_controller", - "test_raise_error": "spiffworkflow_backend.routes.debug_controller", - "url_info": "spiffworkflow_backend.routes.debug_controller", - "webhook": "spiffworkflow_backend.routes.webhooks_controller", - # swagger api calls - "console_ui_home": "connexion.apis.flask_api", - "console_ui_static_files": "connexion.apis.flask_api", - "get_json_spec": "connexion.apis.flask_api", -} - class AuthorizationService: """Determine whether a user has permission to perform their request.""" @@ -252,6 +230,19 @@ class AuthorizationService: @classmethod def should_disable_auth_for_request(cls) -> bool: + swagger_functions = ["get_json_spec"] + authentication_exclusion_list = [ + "authentication_begin", + "authentication_callback", + "authentication_options", + "github_webhook_receive", + "prometheus_metrics", + "status", + "task_allows_guest", + "test_raise_error", + "url_info", + "webhook", + ] if request.method == "OPTIONS": return True @@ -264,16 +255,15 @@ class AuthorizationService: api_view_function = current_app.view_functions[request.endpoint] module = inspect.getmodule(api_view_function) - api_function_name = api_view_function.__name__ if api_view_function else None - controller_name = module.__name__ if module is not None else None if ( - api_function_name - and ( - api_function_name in AUTHENTICATION_EXCLUSION_LIST - and controller_name - and controller_name in AUTHENTICATION_EXCLUSION_LIST[api_function_name] - ) - or (module == openid_blueprint or module == scaffold) # don't check permissions for static assets + api_view_function + and api_view_function.__name__.startswith("login") + or api_view_function.__name__.startswith("logout") + or api_view_function.__name__.startswith("console_ui_") + or api_view_function.__name__ in authentication_exclusion_list + or api_view_function.__name__ in swagger_functions + or module == openid_blueprint + or module == scaffold # don't check permissions for static assets ): return True @@ -551,9 +541,6 @@ class AuthorizationService: permissions_to_assign.append(PermissionToAssign(permission="read", target_uri="/process-instances/report-metadata")) permissions_to_assign.append(PermissionToAssign(permission="read", target_uri="/process-instances/find-by-id/*")) - permissions_to_assign.append(PermissionToAssign(permission="read", target_uri="/script-assist/enabled")) - permissions_to_assign.append(PermissionToAssign(permission="create", target_uri="/script-assist/process-message")) - for permission in ["create", "read", "update", "delete"]: permissions_to_assign.append(PermissionToAssign(permission=permission, target_uri="/process-instances/reports/*")) permissions_to_assign.append(PermissionToAssign(permission=permission, target_uri="/tasks/*")) diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/data_setup_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/data_setup_service.py index dc0046bab..011c727f2 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/data_setup_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/data_setup_service.py @@ -1,13 +1,8 @@ import os -from typing import Any from flask import current_app -from spiffworkflow_backend.data_stores.json import JSONDataStore -from spiffworkflow_backend.data_stores.kkv import KKVDataStore from spiffworkflow_backend.models.db import db -from spiffworkflow_backend.models.json_data_store import JSONDataStoreModel -from spiffworkflow_backend.models.kkv_data_store import KKVDataStoreModel from spiffworkflow_backend.models.reference_cache import ReferenceCacheModel from spiffworkflow_backend.services.file_system_service import FileSystemService from spiffworkflow_backend.services.process_model_service import ProcessModelService @@ -32,8 +27,6 @@ class DataSetupService: failing_process_models = [] files = FileSystemService.walk_files_from_root_path(True, None) reference_objects: dict[str, ReferenceCacheModel] = {} - all_data_store_specifications: dict[tuple[str, str, str], Any] = {} - for file in files: if FileSystemService.is_process_model_json_file(file): process_model = ProcessModelService.get_process_model_from_path(file) @@ -76,124 +69,9 @@ class DataSetupService: False, ) ReferenceCacheService.add_unique_reference_cache_object(reference_objects, reference_cache) - elif FileSystemService.is_process_group_json_file(file): - try: - process_group = ProcessModelService.find_or_create_process_group(os.path.dirname(file)) - except Exception: - current_app.logger.debug(f"Failed to load process group from file @ '{file}'") - continue - - for data_store_type, specs_by_id in process_group.data_store_specifications.items(): - if not isinstance(specs_by_id, dict): - current_app.logger.debug(f"Expected dictionary as value for key '{data_store_type}' in file @ '{file}'") - continue - - for identifier, specification in specs_by_id.items(): - location = specification.get("location") - if location is None: - current_app.logger.debug( - f"Location missing from data store specification '{identifier}' in file @ '{file}'" - ) - continue - - all_data_store_specifications[(data_store_type, location, identifier)] = specification current_app.logger.debug("DataSetupService.save_all_process_models() end") ReferenceCacheService.add_new_generation(reference_objects) - cls._sync_data_store_models_with_specifications(all_data_store_specifications) return failing_process_models - - @classmethod - def _sync_data_store_models_with_specifications(cls, all_data_store_specifications: dict[tuple[str, str, str], Any]) -> None: - all_data_store_models: dict[tuple[str, str, str], Any] = {} - - kkv_models = db.session.query(KKVDataStoreModel).all() - json_models = db.session.query(JSONDataStoreModel).all() - - for kkv_model in kkv_models: - all_data_store_models[("kkv", kkv_model.location, kkv_model.identifier)] = kkv_model - - for json_model in json_models: - all_data_store_models[("json", json_model.location, json_model.identifier)] = json_model - - specification_keys = set(all_data_store_specifications.keys()) - model_keys = set(all_data_store_models.keys()) - - # - # At this point we have a dictionary of all data store specifications from all the process_group.json files and - # a dictionary of all data store models. These two dictionaries use the same key format of (type, location, identifier) - # which allows checking to see if a given data store has a specification and/or a model. - # - # With this we can perform set operations on the keys of the two dictionaries to figure out what needs to be - # inserted, updated or deleted. If a key has a specification but not a model, an insert needs to happen. If a key - # has a specification and a model, an update needs to happen. If a key has a model but no specification, a delete - # needs to happen. - # - - keys_to_insert = specification_keys - model_keys - keys_to_update = specification_keys & model_keys - keys_to_delete = model_keys - specification_keys - - current_app.logger.debug(f"DataSetupService: all_data_store_specifications: {all_data_store_specifications}") - current_app.logger.debug(f"DataSetupService: all_data_store_models: {all_data_store_models}") - current_app.logger.debug(f"DataSetupService: keys_to_insert: {keys_to_insert}") - current_app.logger.debug(f"DataSetupService: keys_to_update: {keys_to_update}") - current_app.logger.debug(f"DataSetupService: keys_to_delete: {keys_to_delete}") - - model_creators = { - "kkv": KKVDataStore.create_instance, - "json": JSONDataStore.create_instance, - } - - def update_model_from_specification(model: Any, key: tuple[str, str, str]) -> None: - specification = all_data_store_specifications.get(key) - if specification is None: - current_app.logger.debug( - f"DataSetupService: was expecting key '{key}' to point to a data store specification for model updating." - ) - return - - name = specification.get("name") - schema = specification.get("schema") - - if name is None or schema is None: - current_app.logger.debug( - f"DataSetupService: was expecting key '{key}' to point to a valid data store specification for model" - " updating." - ) - return - - model.name = name - model.schema = schema - model.description = specification.get("description") - - for key in keys_to_insert: - data_store_type, location, identifier = key - - if data_store_type not in model_creators: - current_app.logger.debug(f"DataSetupService: cannot create model for type '{data_store_type}'.") - continue - - model = model_creators[data_store_type](identifier, location) - update_model_from_specification(model, key) - db.session.add(model) - - for key in keys_to_update: - model = all_data_store_models.get(key) - if model is None: - current_app.logger.debug( - f"DataSetupService: was expecting key '{key}' to point to a data store model for model updating." - ) - continue - update_model_from_specification(model, key) - - for key in keys_to_delete: - model = all_data_store_models.get(key) - if model is None: - current_app.logger.debug(f"DataSetupService: was expecting key '{key}' to point to a data store model to delete.") - continue - db.session.delete(model) - - db.session.commit() diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/file_system_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/file_system_service.py index 0f9479b6c..b2f6a2811 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/file_system_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/file_system_service.py @@ -62,10 +62,6 @@ class FileSystemService: def is_process_model_json_file(cls, file: str) -> bool: return file.endswith(cls.PROCESS_MODEL_JSON_FILE) - @classmethod - def is_process_group_json_file(cls, file: str) -> bool: - return file.endswith(cls.PROCESS_GROUP_JSON_FILE) - @classmethod def is_data_store_json_file(cls, file: str) -> bool: return file.endswith("_datastore.json") @@ -188,8 +184,7 @@ class FileSystemService: @staticmethod def full_path_to_process_model_file(process_model: ProcessModelInfo) -> str: return os.path.join( - FileSystemService.process_model_full_path(process_model), - process_model.primary_file_name, # type: ignore + FileSystemService.process_model_full_path(process_model), process_model.primary_file_name # type: ignore ) def next_display_order(self, process_model: ProcessModelInfo) -> int: diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/jinja_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/jinja_service.py index eee981bec..3ee4ba22e 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/jinja_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/jinja_service.py @@ -48,7 +48,9 @@ class JinjaService: if extensions and "instructionsForEndUser" in extensions: if extensions["instructionsForEndUser"]: try: - return cls.render_jinja_template(extensions["instructionsForEndUser"], task) + instructions = cls.render_jinja_template(extensions["instructionsForEndUser"], task) + extensions["instructionsForEndUser"] = instructions + return instructions except TaskModelError as wfe: wfe.add_note("Failed to render instructions for end user.") raise ApiError.from_workflow_exception("instructions_error", str(wfe), exp=wfe) from wfe diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/message_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/message_service.py index f5117a20c..60e03607d 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/message_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/message_service.py @@ -1,14 +1,8 @@ -import os - from SpiffWorkflow.bpmn import BpmnEvent # type: ignore from SpiffWorkflow.bpmn.specs.event_definitions.message import CorrelationProperty # type: ignore from SpiffWorkflow.bpmn.specs.mixins import StartEventMixin # type: ignore from SpiffWorkflow.spiff.specs.event_definitions import MessageEventDefinition # type: ignore -from spiffworkflow_backend.background_processing.celery_tasks.process_instance_task_producer import ( - queue_process_instance_if_appropriate, -) -from spiffworkflow_backend.helpers.spiff_enum import ProcessInstanceExecutionMode from spiffworkflow_backend.models.db import db from spiffworkflow_backend.models.message_instance import MessageInstanceModel from spiffworkflow_backend.models.message_instance import MessageStatuses @@ -18,7 +12,6 @@ from spiffworkflow_backend.models.process_instance import ProcessInstanceModel from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.services.process_instance_processor import CustomBpmnScriptEngine from spiffworkflow_backend.services.process_instance_processor import ProcessInstanceProcessor -from spiffworkflow_backend.services.process_instance_queue_service import ProcessInstanceQueueService from spiffworkflow_backend.services.process_instance_service import ProcessInstanceService from spiffworkflow_backend.services.user_service import UserService @@ -29,11 +22,7 @@ class MessageServiceError(Exception): class MessageService: @classmethod - def correlate_send_message( - cls, - message_instance_send: MessageInstanceModel, - execution_mode: str | None = None, - ) -> MessageInstanceModel | None: + def correlate_send_message(cls, message_instance_send: MessageInstanceModel) -> MessageInstanceModel | None: """Connects the given send message to a 'receive' message if possible. :param message_instance_send: @@ -67,9 +56,7 @@ class MessageService: user: UserModel | None = message_instance_send.user if user is None: user = UserService.find_or_create_system_user() - receiving_process = MessageService.start_process_with_message( - message_triggerable_process_model, user, execution_mode=execution_mode - ) + receiving_process = MessageService.start_process_with_message(message_triggerable_process_model, user) message_instance_receive = MessageInstanceModel.query.filter_by( process_instance_id=receiving_process.id, message_type="receive", @@ -128,32 +115,15 @@ class MessageService: cls, message_triggerable_process_model: MessageTriggerableProcessModel, user: UserModel, - execution_mode: str | None = None, ) -> ProcessInstanceModel: """Start up a process instance, so it is ready to catch the event.""" - if os.environ.get("SPIFFWORKFLOW_BACKEND_RUNNING_IN_CELERY_WORKER") == "true": - raise MessageServiceError( - "Calling start_process_with_message in a celery worker. This is not supported! (We may need to add" - " additional_processing_identifier to this code path." - ) - process_instance_receive = ProcessInstanceService.create_process_instance_from_process_model_identifier( message_triggerable_process_model.process_model_identifier, user, ) - with ProcessInstanceQueueService.dequeued(process_instance_receive): - processor_receive = ProcessInstanceProcessor(process_instance_receive) - cls._cancel_non_matching_start_events(processor_receive, message_triggerable_process_model) - processor_receive.save() - - if not queue_process_instance_if_appropriate( - process_instance_receive, execution_mode=execution_mode - ) and not ProcessInstanceQueueService.is_enqueued_to_run_in_the_future(process_instance_receive): - execution_strategy_name = None - if execution_mode == ProcessInstanceExecutionMode.synchronous.value: - execution_strategy_name = "greedy" - processor_receive.do_engine_steps(save=True, execution_strategy_name=execution_strategy_name) - + processor_receive = ProcessInstanceProcessor(process_instance_receive) + cls._cancel_non_matching_start_events(processor_receive, message_triggerable_process_model) + processor_receive.do_engine_steps(save=True) return process_instance_receive @classmethod diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py index 07fa90fc7..f8b97854c 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py @@ -126,7 +126,6 @@ SPIFF_CONFIG[JSONFileDataStore] = JSONFileDataStoreConverter SPIFF_CONFIG[KKVDataStore] = KKVDataStoreConverter SPIFF_CONFIG[TypeaheadDataStore] = TypeaheadDataStoreConverter - # Sorry about all this crap. I wanted to move this thing to another file, but # importing a bunch of types causes circular imports. @@ -348,14 +347,28 @@ class CustomBpmnScriptEngine(PythonScriptEngine): # type: ignore ) return Script.generate_augmented_list(script_attributes_context) - def evaluate(self, task: SpiffTask, expression: str, external_context: dict[str, Any] | None = None) -> Any: - """Evaluate the given expression, within the context of the given task and return the result.""" + def evaluate( + self, + task: SpiffTask, + expression: str, + external_context: dict[str, Any] | None = None, + ) -> Any: + return self._evaluate(expression, task.data, task, external_context) + + def _evaluate( + self, + expression: str, + context: dict[str, Any], + task: SpiffTask | None = None, + external_context: dict[str, Any] | None = None, + ) -> Any: methods = self.__get_augment_methods(task) if external_context: methods.update(external_context) + """Evaluate the given expression, within the context of the given task and return the result.""" try: - return super().evaluate(task, expression, external_context=methods) + return super()._evaluate(expression, context, external_context=methods) except Exception as exception: if task is None: raise WorkflowException( @@ -374,7 +387,6 @@ class CustomBpmnScriptEngine(PythonScriptEngine): # type: ignore methods = self.__get_augment_methods(task) if external_context: methods.update(external_context) - # do not run script if it is blank if script: super().execute(task, script, methods) @@ -1058,6 +1070,7 @@ class ProcessInstanceProcessor: self._workflow_completed_handler(self.process_instance_model) db.session.add(self.process_instance_model) + db.session.commit() human_tasks = HumanTaskModel.query.filter_by(process_instance_id=self.process_instance_model.id, completed=False).all() ready_or_waiting_tasks = self.get_all_ready_or_waiting_tasks() @@ -1121,11 +1134,13 @@ class ProcessInstanceProcessor: human_task_user = HumanTaskUserModel(user_id=potential_owner_id, human_task=human_task) db.session.add(human_task_user) + db.session.commit() + if len(human_tasks) > 0: for at in human_tasks: at.completed = True db.session.add(at) - db.session.commit() + db.session.commit() def serialize_task_spec(self, task_spec: SpiffTask) -> dict: """Get a serialized version of a task spec.""" diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_service.py index 6c9bfd559..240da1cf8 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_service.py @@ -19,6 +19,9 @@ from SpiffWorkflow.task import Task as SpiffTask # type: ignore from SpiffWorkflow.util.deep_merge import DeepMerge # type: ignore from SpiffWorkflow.util.task import TaskState # type: ignore +from spiffworkflow_backend.background_processing.celery_tasks.process_instance_task_producer import ( + queue_enabled_for_process_model, +) from spiffworkflow_backend.background_processing.celery_tasks.process_instance_task_producer import ( queue_process_instance_if_appropriate, ) @@ -27,7 +30,6 @@ from spiffworkflow_backend.exceptions.api_error import ApiError from spiffworkflow_backend.exceptions.error import HumanTaskAlreadyCompletedError from spiffworkflow_backend.exceptions.error import HumanTaskNotFoundError from spiffworkflow_backend.exceptions.error import UserDoesNotHaveAccessToTaskError -from spiffworkflow_backend.helpers.spiff_enum import ProcessInstanceExecutionMode from spiffworkflow_backend.models.db import db from spiffworkflow_backend.models.group import GroupModel from spiffworkflow_backend.models.human_task import HumanTaskModel @@ -462,15 +464,13 @@ class ProcessInstanceService: ) DeepMerge.merge(spiff_task.data, data) - @classmethod + @staticmethod def complete_form_task( - cls, processor: ProcessInstanceProcessor, spiff_task: SpiffTask, data: dict[str, Any], user: UserModel, human_task: HumanTaskModel, - execution_mode: str | None = None, ) -> None: """All the things that need to happen when we complete a form. @@ -481,16 +481,12 @@ class ProcessInstanceService: # ProcessInstanceService.post_process_form(spiff_task) # some properties may update the data store. processor.complete_task(spiff_task, human_task, user=user) - if queue_process_instance_if_appropriate(processor.process_instance_model, execution_mode): - return - elif not ProcessInstanceQueueService.is_enqueued_to_run_in_the_future(processor.process_instance_model): + if queue_enabled_for_process_model(processor.process_instance_model): + queue_process_instance_if_appropriate(processor.process_instance_model) + else: with sentry_sdk.start_span(op="task", description="backend_do_engine_steps"): - execution_strategy_name = None - if execution_mode == ProcessInstanceExecutionMode.synchronous.value: - execution_strategy_name = "greedy" - # maybe move this out once we have the interstitial page since this is here just so we can get the next human task - processor.do_engine_steps(save=True, execution_strategy_name=execution_strategy_name) + processor.do_engine_steps(save=True) @staticmethod def spiff_task_to_api_task( diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_model_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_model_service.py index ee27c7794..0b84be57f 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_model_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_model_service.py @@ -456,16 +456,12 @@ class ProcessModelService(FileSystemService): @classmethod def get_process_group( - cls, - process_group_id: str, - find_direct_nested_items: bool = True, - find_all_nested_items: bool = True, - create_if_not_exists: bool = False, + cls, process_group_id: str, find_direct_nested_items: bool = True, find_all_nested_items: bool = True ) -> ProcessGroup: """Look for a given process_group, and return it.""" if os.path.exists(FileSystemService.root_path()): process_group_path = FileSystemService.full_path_from_id(process_group_id) - if cls.is_process_group(process_group_path) or create_if_not_exists: + if cls.is_process_group(process_group_path): return cls.find_or_create_process_group( process_group_path, find_direct_nested_items=find_direct_nested_items, diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_model_test_runner_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_model_test_runner_service.py index cb0fb3743..25673a8ad 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_model_test_runner_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_model_test_runner_service.py @@ -1,34 +1,19 @@ -import decimal import glob import json import os import re -import time import traceback -import uuid from abc import abstractmethod from dataclasses import dataclass -from datetime import datetime -from datetime import timedelta -from typing import Any -import _strptime # type: ignore -import dateparser -import pytz from lxml import etree # type: ignore -from RestrictedPython import safe_globals # type: ignore from SpiffWorkflow.bpmn.exceptions import WorkflowTaskException # type: ignore -from SpiffWorkflow.bpmn.script_engine import PythonScriptEngine # type: ignore from SpiffWorkflow.bpmn.workflow import BpmnWorkflow # type: ignore from SpiffWorkflow.task import Task as SpiffTask # type: ignore from SpiffWorkflow.util.deep_merge import DeepMerge # type: ignore from SpiffWorkflow.util.task import TaskState # type: ignore -from spiffworkflow_backend.models.script_attributes_context import ScriptAttributesContext -from spiffworkflow_backend.scripts.script import Script from spiffworkflow_backend.services.custom_parser import MyCustomParser -from spiffworkflow_backend.services.jinja_service import JinjaHelpers -from spiffworkflow_backend.services.process_instance_processor import CustomScriptEngineEnvironment class UnrunnableTestCaseError(Exception): @@ -55,88 +40,6 @@ class BpmnFileMissingExecutableProcessError(Exception): pass -def _import(name: str, glbls: dict[str, Any], *args: Any) -> None: - if name not in glbls: - raise ImportError(f"Import not allowed: {name}", name=name) - - -class ProcessModelTestRunnerScriptEngine(PythonScriptEngine): # type: ignore - def __init__(self, method_overrides: dict | None = None) -> None: - default_globals = { - "_strptime": _strptime, - "dateparser": dateparser, - "datetime": datetime, - "decimal": decimal, - "dict": dict, - "enumerate": enumerate, - "filter": filter, - "format": format, - "json": json, - "list": list, - "map": map, - "pytz": pytz, - "set": set, - "sum": sum, - "time": time, - "timedelta": timedelta, - "uuid": uuid, - **JinjaHelpers.get_helper_mapping(), - } - - # This will overwrite the standard builtins - default_globals.update(safe_globals) - default_globals["__builtins__"]["__import__"] = _import - - environment = CustomScriptEngineEnvironment(default_globals) - self.method_overrides = method_overrides - super().__init__(environment=environment) - - def _get_all_methods_for_context(self, external_context: dict[str, Any] | None, task: SpiffTask | None = None) -> dict: - methods = { - "get_process_initiator_user": lambda: { - "username": "test_username_a", - "tenant_specific_field_1": "test_tenant_specific_field_1_a", - }, - } - - script_attributes_context = ScriptAttributesContext( - task=task, - environment_identifier="mocked-environment-identifier", - process_instance_id=1, - process_model_identifier="fake-test-process-model-identifier", - ) - methods = Script.generate_augmented_list(script_attributes_context) - - if self.method_overrides: - methods = {**methods, **self.method_overrides} - - if external_context: - methods.update(external_context) - - return methods - - # Evaluate the given expression, within the context of the given task and - # return the result. - def evaluate(self, task: SpiffTask, expression: str, external_context: dict[str, Any] | None = None) -> Any: - updated_context = self._get_all_methods_for_context(external_context, task) - return super().evaluate(task, expression, updated_context) - - def execute(self, task: SpiffTask, script: str, external_context: Any = None) -> bool: - if script: - methods = self._get_all_methods_for_context(external_context, task) - super().execute(task, script, methods) - - return True - - def call_service( - self, - operation_name: str, - operation_params: dict[str, Any], - spiff_task: SpiffTask, - ) -> str: - raise Exception("please override this service task in your bpmn unit test json") - - @dataclass class TestCaseErrorDetails: error_messages: list[str] @@ -205,10 +108,6 @@ class ProcessModelTestRunnerMostlyPureSpiffDelegate(ProcessModelTestRunnerDelega raise BpmnFileMissingExecutableProcessError(f"Executable process cannot be found in {bpmn_file}. Test cannot run.") all_related = self._find_related_bpmn_files(bpmn_file) - - # get unique list of related files - all_related = list(set(all_related)) - for related_file in all_related: self._add_bpmn_file_to_parser(parser, related_file) @@ -400,11 +299,6 @@ class ProcessModelTestRunner: def run_test_case(self, bpmn_file: str, test_case_identifier: str, test_case_contents: dict) -> None: bpmn_process_instance = self._instantiate_executer(bpmn_file) - method_overrides = {} - if "mocks" in test_case_contents: - for method_name, mock_return_value in test_case_contents["mocks"].items(): - method_overrides[method_name] = lambda value=mock_return_value: value - bpmn_process_instance.script_engine = ProcessModelTestRunnerScriptEngine(method_overrides=method_overrides) next_task = self._get_next_task(bpmn_process_instance) while next_task is not None: test_case_task_properties = None @@ -550,7 +444,7 @@ class ProcessModelTestRunner: return test_mappings -class ProcessModelTestRunnerBackendDelegate(ProcessModelTestRunnerMostlyPureSpiffDelegate): +class ProcessModeltTestRunnerBackendDelegate(ProcessModelTestRunnerMostlyPureSpiffDelegate): pass @@ -565,7 +459,7 @@ class ProcessModelTestRunnerService: process_model_directory_path, test_case_file=test_case_file, test_case_identifier=test_case_identifier, - process_model_test_runner_delegate_class=ProcessModelTestRunnerBackendDelegate, + process_model_test_runner_delegate_class=ProcessModeltTestRunnerBackendDelegate, ) def run(self) -> None: diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/script_unit_test_runner.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/script_unit_test_runner.py index 32b4bb051..1964cef9a 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/script_unit_test_runner.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/script_unit_test_runner.py @@ -37,7 +37,7 @@ class ScriptUnitTestRunner: try: cls._script_engine.environment.clear_state() - cls._script_engine.environment.execute(script, context, external_context=None) + cls._script_engine._execute(context=context, script=script) except SyntaxError as ex: return ScriptUnitTestResult( result=False, diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/spec_file_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/spec_file_service.py index 2e47e7b0d..b62c55a39 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/spec_file_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/spec_file_service.py @@ -310,9 +310,6 @@ class SpecFileService(FileSystemService): @staticmethod def update_message_trigger_cache(ref: Reference) -> None: """Assure we know which messages can trigger the start of a process.""" - current_triggerable_processes = MessageTriggerableProcessModel.query.filter_by( - file_name=ref.file_name, process_model_identifier=ref.relative_location - ).all() for message_name in ref.start_messages: message_triggerable_process_model = MessageTriggerableProcessModel.query.filter_by( message_name=message_name, @@ -321,21 +318,13 @@ class SpecFileService(FileSystemService): message_triggerable_process_model = MessageTriggerableProcessModel( message_name=message_name, process_model_identifier=ref.relative_location, - file_name=ref.file_name, ) db.session.add(message_triggerable_process_model) else: - existing_model_identifier = message_triggerable_process_model.process_model_identifier - if existing_model_identifier != ref.relative_location: + if message_triggerable_process_model.process_model_identifier != ref.relative_location: raise ProcessModelFileInvalidError( - f"Message model is already used to start process model {existing_model_identifier}" + f"Message model is already used to start process model {ref.relative_location}" ) - elif message_triggerable_process_model.file_name is None: - message_triggerable_process_model.file_name = ref.file_name - db.session.add(message_triggerable_process_model) - current_triggerable_processes.remove(message_triggerable_process_model) - for trigger_pm in current_triggerable_processes: - db.session.delete(trigger_pm) @staticmethod def update_correlation_cache(ref: Reference) -> None: diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/workflow_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/workflow_service.py index b86326ccf..a5539816c 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/workflow_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/workflow_service.py @@ -17,5 +17,5 @@ class WorkflowService: def next_start_event_configuration(cls, workflow: BpmnWorkflow, now_in_utc: datetime) -> StartConfiguration | None: start_events = cls.future_start_events(workflow) configurations = [start_event.task_spec.configuration(start_event, now_in_utc) for start_event in start_events] - configurations.sort(key=lambda configuration: configuration[1]) + configurations.sort(key=lambda configuration: configuration[1]) # type: ignore return configurations[0] if len(configurations) > 0 else None diff --git a/spiffworkflow-backend/tests/data/bpmn_unit_test_process_models/expected-to-pass/script-task-with-backend-script/process_model.json b/spiffworkflow-backend/tests/data/bpmn_unit_test_process_models/expected-to-pass/script-task-with-backend-script/process_model.json deleted file mode 100644 index 0b972734a..000000000 --- a/spiffworkflow-backend/tests/data/bpmn_unit_test_process_models/expected-to-pass/script-task-with-backend-script/process_model.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "description": "", - "display_name": "Script Task", - "exception_notification_addresses": [], - "fault_or_suspend_on_exception": "fault", - "metadata_extraction_paths": null, - "primary_file_name": "script_task.bpmn", - "primary_process_id": "Process_Script_Task" -} diff --git a/spiffworkflow-backend/tests/data/bpmn_unit_test_process_models/expected-to-pass/script-task-with-backend-script/script_task.bpmn b/spiffworkflow-backend/tests/data/bpmn_unit_test_process_models/expected-to-pass/script-task-with-backend-script/script_task.bpmn deleted file mode 100644 index 89f1a10a1..000000000 --- a/spiffworkflow-backend/tests/data/bpmn_unit_test_process_models/expected-to-pass/script-task-with-backend-script/script_task.bpmn +++ /dev/null @@ -1,41 +0,0 @@ - - - - - Flow_0qfycuk - - - - Flow_1auiekw - - - - Flow_0qfycuk - Flow_1auiekw - a = 1 -frontend_url_for_testing = get_frontend_url() - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/spiffworkflow-backend/tests/data/bpmn_unit_test_process_models/expected-to-pass/script-task-with-backend-script/test_script_task.json b/spiffworkflow-backend/tests/data/bpmn_unit_test_process_models/expected-to-pass/script-task-with-backend-script/test_script_task.json deleted file mode 100644 index dbd0ce139..000000000 --- a/spiffworkflow-backend/tests/data/bpmn_unit_test_process_models/expected-to-pass/script-task-with-backend-script/test_script_task.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "test_case_1": { - "mocks": { - "get_frontend_url": "https://spiffworkflow.example.com", - "get_process_initiator_user": { - "username": "test_username_a", - "tenant_specific_field_1": "test_tenant_specific_field_1_a" - } - }, - "tasks": { - "Activity_1vepcwc": { - "data": [ - { - "what": true - } - ] - } - }, - "expected_output_json": { - "a": 1, - "frontend_url_for_testing": "https://spiffworkflow.example.com" - } - } -} diff --git a/spiffworkflow-backend/tests/data/random_fact/random_fact_set.bpmn b/spiffworkflow-backend/tests/data/random_fact/random_fact_set.bpmn deleted file mode 100644 index 9065b4514..000000000 --- a/spiffworkflow-backend/tests/data/random_fact/random_fact_set.bpmn +++ /dev/null @@ -1,51 +0,0 @@ - - - - - Flow_1ctusgn - - - - - - - - - Flow_1ctusgn - SequenceFlow_0t29gjo - FactService = fact_service(type='norris') - - - # Great Job! -You have completed the random fact generator. -You chose to receive a random fact of the type: "{{type}}" - -Your random fact is: -{{details}} - SequenceFlow_0t29gjo - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_json_file_data_store.py b/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_json_file_data_store.py index 524267a3d..6c2941702 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_json_file_data_store.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_json_file_data_store.py @@ -7,7 +7,7 @@ from tests.spiffworkflow_backend.helpers.base_test import BaseTest from tests.spiffworkflow_backend.helpers.test_data import load_test_spec -class TestJsonFileDataStore(BaseTest): +class TestJSONFileDataStore(BaseTest): def test_can_execute_diagram( self, app: Flask, diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_process_api.py b/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_process_api.py index ac3e6a1c6..65a461283 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_process_api.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_process_api.py @@ -1378,7 +1378,6 @@ class TestProcessApi(BaseTest): ) assert show_response.json is not None assert show_response.status_code == 200 - assert show_response.json["bpmn_xml_file_contents_retrieval_error"] is None file_system_root = FileSystemService.root_path() file_path = f"{file_system_root}/{process_model.id}/{process_model_id}.bpmn" with open(file_path) as f_open: @@ -1419,7 +1418,6 @@ class TestProcessApi(BaseTest): ) assert show_response.json is not None assert show_response.status_code == 200 - assert show_response.json["bpmn_xml_file_contents_retrieval_error"] is None file_system_root = FileSystemService.root_path() process_instance_file_path = f"{file_system_root}/{process_model.id}/{process_model_id}.bpmn" with open(process_instance_file_path) as f_open: diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_swagger_docs.py b/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_swagger_docs.py deleted file mode 100644 index 87f962687..000000000 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_swagger_docs.py +++ /dev/null @@ -1,14 +0,0 @@ -from flask.app import Flask -from flask.testing import FlaskClient - -from tests.spiffworkflow_backend.helpers.base_test import BaseTest - - -class TestSwaggerDocs(BaseTest): - def test_can_retrieve_swagger_docs_without_auth( - self, - app: Flask, - client: FlaskClient, - ) -> None: - response = client.get("/v1.0/ui/") - assert response.status_code == 200 diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_authorization_service.py b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_authorization_service.py index ccd0a79b2..99d832917 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_authorization_service.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_authorization_service.py @@ -458,8 +458,6 @@ class TestAuthorizationService(BaseTest): ("/process-models", "read"), ("/processes", "read"), ("/processes/callers/*", "read"), - ("/script-assist/enabled", "read"), - ("/script-assist/process-message", "create"), ("/service-tasks", "read"), ("/tasks/*", "create"), ("/tasks/*", "delete"), diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_message_service.py b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_message_service.py index d440e6b86..78853cec5 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_message_service.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_message_service.py @@ -8,7 +8,6 @@ from spiffworkflow_backend.models.process_instance import ProcessInstanceStatus from spiffworkflow_backend.services.message_service import MessageService from spiffworkflow_backend.services.process_instance_processor import ProcessInstanceProcessor from spiffworkflow_backend.services.process_instance_service import ProcessInstanceService -from spiffworkflow_backend.services.spec_file_service import SpecFileService from tests.spiffworkflow_backend.helpers.base_test import BaseTest from tests.spiffworkflow_backend.helpers.test_data import load_test_spec @@ -253,39 +252,3 @@ class TestMessageService(BaseTest): assert len(message_instances) == 2 mi_statuses = [mi.status for mi in message_instances] assert mi_statuses == ["completed", "completed"] - - def test_can_delete_message_start_events_from_database_if_model_no_longer_references_it( - self, - app: Flask, - with_db_and_bpmn_file_cleanup: None, - ) -> None: - process_model_without_message_start_event = load_test_spec( - "test_group/sample", - process_model_source_directory="sample", - ) - old_message_triggerable_process = MessageTriggerableProcessModel( - message_name="travel_start_test_v2", - process_model_identifier=process_model_without_message_start_event.id, - file_name=process_model_without_message_start_event.primary_file_name, - ) - db.session.add(old_message_triggerable_process) - db.session.commit() - message_triggerable_process_model = MessageTriggerableProcessModel.query.filter_by( - message_name="travel_start_test_v2" - ).first() - assert message_triggerable_process_model is not None - assert message_triggerable_process_model.process_model_identifier == process_model_without_message_start_event.id - - assert process_model_without_message_start_event.primary_file_name is not None - primary_file_contents = SpecFileService.get_data( - process_model_without_message_start_event, process_model_without_message_start_event.primary_file_name - ) - SpecFileService.update_file( - process_model_without_message_start_event, - process_model_without_message_start_event.primary_file_name, - primary_file_contents, - ) - message_triggerable_process_model = MessageTriggerableProcessModel.query.filter_by( - message_name="travel_start_test_v2" - ).first() - assert message_triggerable_process_model is None diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_instance_processor.py b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_instance_processor.py index 0bd50685e..384ae06d5 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_instance_processor.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_instance_processor.py @@ -27,28 +27,33 @@ from tests.spiffworkflow_backend.helpers.test_data import load_test_spec class TestProcessInstanceProcessor(BaseTest): + # it's not totally obvious we want to keep this test/file + def test_script_engine_takes_data_and_returns_expected_results( + self, + app: Flask, + with_db_and_bpmn_file_cleanup: None, + ) -> None: + app.config["THREAD_LOCAL_DATA"].process_model_identifier = "hey" + app.config["THREAD_LOCAL_DATA"].process_instance_id = 0 + script_engine = ProcessInstanceProcessor._default_script_engine + + result = script_engine._evaluate("a", {"a": 1}) + assert result == 1 + app.config["THREAD_LOCAL_DATA"].process_model_identifier = None + app.config["THREAD_LOCAL_DATA"].process_instance_id = None + def test_script_engine_can_use_custom_scripts( self, app: Flask, with_db_and_bpmn_file_cleanup: None, ) -> None: - process_model = load_test_spec( - process_model_id="test_group/random_fact", - bpmn_file_name="random_fact_set.bpmn", - process_model_source_directory="random_fact", - ) - process_instance = self.create_process_instance_from_process_model(process_model=process_model) - processor = ProcessInstanceProcessor(process_instance) - processor.do_engine_steps(save=True) - - assert process_instance.status == ProcessInstanceStatus.complete.value - process_data = processor.get_data() - assert process_data is not None - assert "FactService" in process_data - assert ( - process_data["FactService"] - == "Chuck Norris doesn’t read books. He stares them down until he gets the information he wants." - ) + app.config["THREAD_LOCAL_DATA"].process_model_identifier = "hey" + app.config["THREAD_LOCAL_DATA"].process_instance_id = 0 + script_engine = ProcessInstanceProcessor._default_script_engine + result = script_engine._evaluate("fact_service(type='norris')", {}) + assert result == "Chuck Norris doesn’t read books. He stares them down until he gets the information he wants." + app.config["THREAD_LOCAL_DATA"].process_model_identifier = None + app.config["THREAD_LOCAL_DATA"].process_instance_id = None def test_sets_permission_correctly_on_human_task( self, diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_reference_cache_service.py b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_reference_cache_service.py index 08a1330a4..13534fd87 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_reference_cache_service.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_reference_cache_service.py @@ -11,18 +11,6 @@ from tests.spiffworkflow_backend.helpers.base_test import BaseTest @pytest.fixture() def with_loaded_reference_cache(app: Flask, with_db_and_bpmn_file_cleanup: None) -> Generator[None, None, None]: reference_objects: dict[str, ReferenceCacheModel] = {} - ReferenceCacheService.add_unique_reference_cache_object( - reference_objects, - ReferenceCacheModel.from_params( - "contacts_datastore_root", - "Contacts Datastore Root", - "data_store", - "contacts_datastore.bpmn", - "", - None, - False, - ), - ) ReferenceCacheService.add_unique_reference_cache_object( reference_objects, ReferenceCacheModel.from_params( @@ -68,9 +56,3 @@ class TestReferenceCacheService(BaseTest): def test_does_not_find_data_store_in_non_upsearched_location(self, with_loaded_reference_cache: None) -> None: location = ReferenceCacheService.upsearch("some/other/place", "contacts_datastore", "data_store") assert location is None - - def test_can_find_data_store_in_upsearched_root_location(self, with_loaded_reference_cache: None) -> None: - location = ReferenceCacheService.upsearch( - "misc/jonjon/generic-data-store-area/test-level-2", "contacts_datastore_root", "data_store" - ) - assert location == ""