diff --git a/.github/workflows/minos-broker-kafka-tests.yml b/.github/workflows/minos-broker-kafka-tests.yml index 9fca0d856..0828e490c 100644 --- a/.github/workflows/minos-broker-kafka-tests.yml +++ b/.github/workflows/minos-broker-kafka-tests.yml @@ -20,16 +20,6 @@ jobs: working-directory: packages/plugins/minos-broker-kafka services: - postgres: - image: postgres - env: - POSTGRES_USER: minos - POSTGRES_PASSWORD: min0s - POSTGRES_DB: order_db - ports: - - 5432:5432 - options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 - zookeeper: image: wurstmeister/zookeeper:latest ports: @@ -44,10 +34,7 @@ jobs: KAFKA_ADVERTISED_HOST_NAME: kafka KAFKA_DELETE_TOPIC_ENABLE: "true" env: - MINOS_BROKER_QUEUE_HOST: postgres MINOS_BROKER_HOST: kafka - MINOS_REPOSITORY_HOST: postgres - MINOS_SNAPSHOT_HOST: postgres steps: - name: Check out repository code diff --git a/.github/workflows/minos-broker-rabbitmq-tests.yml b/.github/workflows/minos-broker-rabbitmq-tests.yml index 65db8140c..cf21e6258 100644 --- a/.github/workflows/minos-broker-rabbitmq-tests.yml +++ b/.github/workflows/minos-broker-rabbitmq-tests.yml @@ -18,28 +18,13 @@ jobs: defaults: run: working-directory: packages/plugins/minos-broker-rabbitmq - services: - postgres: - image: postgres - env: - POSTGRES_USER: minos - POSTGRES_PASSWORD: min0s - POSTGRES_DB: order_db - ports: - - 5432:5432 - options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 - rabbitmq: image: rabbitmq:3 ports: - - "5672:5672" - + - 5672:5672 env: - MINOS_BROKER_QUEUE_HOST: postgres MINOS_BROKER_HOST: rabbitmq - MINOS_REPOSITORY_HOST: postgres - MINOS_SNAPSHOT_HOST: postgres steps: - name: Check out repository code diff --git a/.github/workflows/minos-database-aiopg-publish.yml b/.github/workflows/minos-database-aiopg-publish.yml new file mode 100644 index 000000000..95d9c4760 --- /dev/null +++ b/.github/workflows/minos-database-aiopg-publish.yml @@ -0,0 +1,33 @@ +name: "Publish: minos-database-aiopg" + +on: + push: + branches: + - '*.*.x' + paths: + - 'packages/plugins/minos-database-aiopg/**' + +jobs: + deploy: + runs-on: ubuntu-latest + container: python:3.9-buster + defaults: + run: + working-directory: packages/plugins/minos-database-aiopg + + steps: + + - name: Check out repository code + uses: actions/checkout@v2 + + - name: Install Poetry + uses: snok/install-poetry@v1 + + - name: Install dependencies + run: make install + + - name: Publish package + run: make release + env: + POETRY_HTTP_BASIC_PYPI_USERNAME: ${{ secrets.PYPI_USERNAME }} + POETRY_HTTP_BASIC_PYPI_PASSWORD: ${{ secrets.PYPI_PASSWORD }} diff --git a/.github/workflows/minos-database-aiopg-tests.yml b/.github/workflows/minos-database-aiopg-tests.yml new file mode 100644 index 000000000..9dbc735cc --- /dev/null +++ b/.github/workflows/minos-database-aiopg-tests.yml @@ -0,0 +1,64 @@ +name: "Test: minos-database-aiopg" + +on: + push: + branches: + - main + - '*.*.x' + pull_request: + paths: + - 'packages/plugins/minos-database-aiopg/**' + - 'packages/core/minos-microservice-aggregate/**' + - 'packages/core/minos-microservice-networks/**' + - 'packages/core/minos-microservice-common/**' + +jobs: + build: + runs-on: ubuntu-latest + container: python:3.9-buster + defaults: + run: + working-directory: packages/plugins/minos-database-aiopg + + services: + postgres: + image: postgres + env: + POSTGRES_USER: minos + POSTGRES_PASSWORD: min0s + POSTGRES_DB: order_db + ports: + - 5432:5432 + options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 + + env: + MINOS_DATABASES_DEFAULT_HOST: postgres + + steps: + - name: Check out repository code + uses: actions/checkout@v2 + + - name: Install Poetry + uses: snok/install-poetry@v1 + + - name: Install dependencies + run: make install + + - name: Lint package + run: make lint + + - name: Test package with coverage + run: make coverage + + - name: Publish coverage + uses: codecov/codecov-action@v2 + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: ./packages/plugins/minos-database-aiopg/coverage.xml + fail_ci_if_error: true + + - name: Generate documentation + run: make docs + + - name: Generate build + run: make dist diff --git a/.github/workflows/minos-database-lmdb-publish.yml b/.github/workflows/minos-database-lmdb-publish.yml new file mode 100644 index 000000000..fc5721f93 --- /dev/null +++ b/.github/workflows/minos-database-lmdb-publish.yml @@ -0,0 +1,33 @@ +name: "Publish: minos-database-lmdb" + +on: + push: + branches: + - '*.*.x' + paths: + - 'packages/plugins/minos-database-lmdb/**' + +jobs: + deploy: + runs-on: ubuntu-latest + container: python:3.9-buster + defaults: + run: + working-directory: packages/plugins/minos-database-lmdb + + steps: + + - name: Check out repository code + uses: actions/checkout@v2 + + - name: Install Poetry + uses: snok/install-poetry@v1 + + - name: Install dependencies + run: make install + + - name: Publish package + run: make release + env: + POETRY_HTTP_BASIC_PYPI_USERNAME: ${{ secrets.PYPI_USERNAME }} + POETRY_HTTP_BASIC_PYPI_PASSWORD: ${{ secrets.PYPI_PASSWORD }} diff --git a/.github/workflows/minos-database-lmdb-tests.yml b/.github/workflows/minos-database-lmdb-tests.yml new file mode 100644 index 000000000..85eee5a98 --- /dev/null +++ b/.github/workflows/minos-database-lmdb-tests.yml @@ -0,0 +1,49 @@ +name: "Test: minos-database-lmdb" + +on: + push: + branches: + - main + - '*.*.x' + pull_request: + paths: + - 'packages/plugins/minos-database-lmdb/**' + - 'packages/core/minos-microservice-saga/**' + - 'packages/core/minos-microservice-common/**' + +jobs: + build: + runs-on: ubuntu-latest + container: python:3.9-buster + defaults: + run: + working-directory: packages/plugins/minos-database-lmdb + + steps: + - name: Check out repository code + uses: actions/checkout@v2 + + - name: Install Poetry + uses: snok/install-poetry@v1 + + - name: Install dependencies + run: make install + + - name: Lint package + run: make lint + + - name: Test package with coverage + run: make coverage + + - name: Publish coverage + uses: codecov/codecov-action@v2 + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: ./packages/plugins/minos-database-lmdb/coverage.xml + fail_ci_if_error: true + + - name: Generate documentation + run: make docs + + - name: Generate build + run: make dist diff --git a/.github/workflows/minos-discovery-kong-publish.yml b/.github/workflows/minos-discovery-kong-publish.yml new file mode 100644 index 000000000..b40da4f9a --- /dev/null +++ b/.github/workflows/minos-discovery-kong-publish.yml @@ -0,0 +1,33 @@ +name: "Publish: minos-discovery-kong" + +on: + push: + branches: + - '*.*.x' + paths: + - 'packages/plugins/minos-discovery-kong/**' + +jobs: + deploy: + runs-on: ubuntu-latest + container: python:3.9-buster + defaults: + run: + working-directory: packages/plugins/minos-discovery-kong + + steps: + + - name: Check out repository code + uses: actions/checkout@v2 + + - name: Install Poetry + uses: snok/install-poetry@v1 + + - name: Install dependencies + run: make install + + - name: Publish package + run: make release + env: + POETRY_HTTP_BASIC_PYPI_USERNAME: ${{ secrets.PYPI_USERNAME }} + POETRY_HTTP_BASIC_PYPI_PASSWORD: ${{ secrets.PYPI_PASSWORD }} diff --git a/.github/workflows/minos-discovery-kong-tests.yml b/.github/workflows/minos-discovery-kong-tests.yml new file mode 100644 index 000000000..241ae75cb --- /dev/null +++ b/.github/workflows/minos-discovery-kong-tests.yml @@ -0,0 +1,86 @@ +name: "Test: minos-discovery-kong" + +on: + push: + branches: + - main + - '*.*.x' + pull_request: + paths: + - 'packages/plugins/minos-discovery-kong/**' + - 'packages/core/minos-microservice-networks/**' + - 'packages/core/minos-microservice-common/**' + +jobs: + build: + runs-on: ubuntu-latest + container: python:3.9-buster + services: + postgres: + image: postgres:9.5 + env: + POSTGRES_DB: kong + POSTGRES_USER: kong + POSTGRES_PASSWORD: kong + ports: + # Maps tcp port 5432 on service container to the host + - 5432:5432 + defaults: + run: + working-directory: packages/plugins/minos-discovery-kong + + steps: + - name: Check out repository code + uses: actions/checkout@v2 + + - name: Install dependencies + run: apt install -y curl apt-transport-https + + - name: Update apt list + run: echo "deb [trusted=yes] https://download.konghq.com/gateway-2.x-debian-buster/ default all" | tee /etc/apt/sources.list.d/kong.list + + - name: Install kong + run: apt-get update && apt install -y kong-enterprise-edition=2.8.0.0 + + - name: Set env variables + run: | + echo "KONG_DATABASE=postgres" >> $GITHUB_ENV + echo "KONG_PG_DATABASE=kong" >> $GITHUB_ENV + echo "KONG_PG_HOST=postgres" >> $GITHUB_ENV + echo "KONG_PG_USER=kong" >> $GITHUB_ENV + echo "KONG_PG_PASSWORD=kong" >> $GITHUB_ENV + echo "KONG_ADMIN_ACCESS_LOG=/dev/stdout" >> $GITHUB_ENV + echo "KONG_ADMIN_ERROR_LOG=/dev/stderr" >> $GITHUB_ENV + echo "KONG_PROXY_LISTEN=0.0.0.0:8000" >> $GITHUB_ENV + echo "KONG_ADMIN_LISTEN=0.0.0.0:8001" >> $GITHUB_ENV + echo "KONG_PROXY_ACCESS_LOG=/dev/stdout" >> $GITHUB_ENV + echo "KONG_PROXY_ERROR_LOG=/dev/stderr" >> $GITHUB_ENV + echo "KONG_LOG_LEVEL=debug" >> $GITHUB_ENV + + - name: Kong Migration + run: kong migrations bootstrap && kong migrations up && kong migrations finish + + - name: Kong Start + run: kong start + + - name: Install Poetry + uses: snok/install-poetry@v1 + + - name: Install dependencies + run: make install + + - name: Lint package + run: make lint + + - name: Test package with coverage + run: make coverage + + - name: Publish coverage + uses: codecov/codecov-action@v2 + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: ./packages/plugins/minos-discovery-kong/coverage.xml + fail_ci_if_error: true + + - name: Generate build + run: make dist diff --git a/.github/workflows/minos-http-aiohttp-tests.yml b/.github/workflows/minos-http-aiohttp-tests.yml index 3d83928ae..d9a164f91 100644 --- a/.github/workflows/minos-http-aiohttp-tests.yml +++ b/.github/workflows/minos-http-aiohttp-tests.yml @@ -19,23 +19,6 @@ jobs: run: working-directory: packages/plugins/minos-http-aiohttp - services: - postgres: - image: postgres - env: - POSTGRES_USER: minos - POSTGRES_PASSWORD: min0s - POSTGRES_DB: order_db - ports: - - 5432:5432 - options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 - - env: - MINOS_BROKER_QUEUE_HOST: postgres - MINOS_BROKER_HOST: kafka - MINOS_REPOSITORY_HOST: postgres - MINOS_SNAPSHOT_HOST: postgres - steps: - name: Check out repository code uses: actions/checkout@v2 diff --git a/.github/workflows/minos-microservice-aggregate-tests.yml b/.github/workflows/minos-microservice-aggregate-tests.yml index 1c731a5dc..4b8604ea6 100644 --- a/.github/workflows/minos-microservice-aggregate-tests.yml +++ b/.github/workflows/minos-microservice-aggregate-tests.yml @@ -19,22 +19,6 @@ jobs: run: working-directory: packages/core/minos-microservice-aggregate - services: - postgres: - image: postgres - env: - POSTGRES_USER: minos - POSTGRES_PASSWORD: min0s - POSTGRES_DB: order_db - ports: - - 5432:5432 - options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 - - env: - MINOS_BROKER_QUEUE_HOST: postgres - MINOS_REPOSITORY_HOST: postgres - MINOS_SNAPSHOT_HOST: postgres - steps: - name: Check out repository code uses: actions/checkout@v2 diff --git a/.github/workflows/minos-microservice-common-tests.yml b/.github/workflows/minos-microservice-common-tests.yml index 637130b43..cc89ccefb 100644 --- a/.github/workflows/minos-microservice-common-tests.yml +++ b/.github/workflows/minos-microservice-common-tests.yml @@ -17,22 +17,6 @@ jobs: run: working-directory: packages/core/minos-microservice-common - services: - postgres: - image: postgres - env: - POSTGRES_USER: minos - POSTGRES_PASSWORD: min0s - POSTGRES_DB: order_db - ports: - - 5432:5432 - options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 - - env: - MINOS_BROKER_QUEUE_HOST: postgres - MINOS_REPOSITORY_HOST: postgres - MINOS_SNAPSHOT_HOST: postgres - steps: - name: Check out repository code uses: actions/checkout@v2 diff --git a/.github/workflows/minos-microservice-cqrs-tests.yml b/.github/workflows/minos-microservice-cqrs-tests.yml index dc2644ba4..1ab963a4a 100644 --- a/.github/workflows/minos-microservice-cqrs-tests.yml +++ b/.github/workflows/minos-microservice-cqrs-tests.yml @@ -20,22 +20,6 @@ jobs: run: working-directory: packages/core/minos-microservice-cqrs - services: - postgres: - image: postgres - env: - POSTGRES_USER: minos - POSTGRES_PASSWORD: min0s - POSTGRES_DB: order_db - ports: - - 5432:5432 - options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 - - env: - MINOS_BROKER_QUEUE_HOST: postgres - MINOS_REPOSITORY_HOST: postgres - MINOS_SNAPSHOT_HOST: postgres - steps: - name: Check out repository code uses: actions/checkout@v2 diff --git a/.github/workflows/minos-microservice-networks-tests.yml b/.github/workflows/minos-microservice-networks-tests.yml index 49a642b3e..5cf23e011 100644 --- a/.github/workflows/minos-microservice-networks-tests.yml +++ b/.github/workflows/minos-microservice-networks-tests.yml @@ -18,23 +18,6 @@ jobs: run: working-directory: packages/core/minos-microservice-networks - services: - postgres: - image: postgres - env: - POSTGRES_USER: minos - POSTGRES_PASSWORD: min0s - POSTGRES_DB: order_db - ports: - - 5432:5432 - options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 - - env: - MINOS_BROKER_QUEUE_HOST: postgres - MINOS_BROKER_HOST: kafka - MINOS_REPOSITORY_HOST: postgres - MINOS_SNAPSHOT_HOST: postgres - steps: - name: Check out repository code uses: actions/checkout@v2 diff --git a/.github/workflows/minos-router-graphql-tests.yml b/.github/workflows/minos-router-graphql-tests.yml index e830f4370..f36c3617b 100644 --- a/.github/workflows/minos-router-graphql-tests.yml +++ b/.github/workflows/minos-router-graphql-tests.yml @@ -19,23 +19,6 @@ jobs: run: working-directory: packages/plugins/minos-router-graphql - services: - postgres: - image: postgres - env: - POSTGRES_USER: minos - POSTGRES_PASSWORD: min0s - POSTGRES_DB: order_db - ports: - - 5432:5432 - options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 - - env: - MINOS_BROKER_QUEUE_HOST: postgres - MINOS_BROKER_HOST: kafka - MINOS_REPOSITORY_HOST: postgres - MINOS_SNAPSHOT_HOST: postgres - steps: - name: Check out repository code uses: actions/checkout@v2 diff --git a/.gitignore b/.gitignore index 8746393f5..b0db19fbb 100644 --- a/.gitignore +++ b/.gitignore @@ -323,7 +323,7 @@ $RECYCLE.BIN/ *.lmdb # Sphinx Api Documentation -**/docs/api* +**/docs/api-reference* **/docs/_build tutorials/stock-wallet/front/stock-front diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0ec427991..46f97e088 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -44,6 +44,20 @@ repos: files: ^packages/plugins/minos-broker-kafka/ language: system + - id: minos-database-aiopg-check + pass_filenames: false + entry: make --directory=packages/plugins/minos-database-aiopg check + name: Check minos-database-aiopg + files: ^packages/plugins/minos-database-aiopg/ + language: system + + - id: minos-database-lmdb-check + pass_filenames: false + entry: make --directory=packages/plugins/minos-database-lmdb check + name: Check minos-database-lmdb + files: ^packages/plugins/minos-database-lmdb/ + language: system + - id: minos-discovery-minos-check pass_filenames: false entry: make --directory=packages/plugins/minos-discovery-minos check @@ -51,6 +65,13 @@ repos: files: ^packages/plugins/minos-discovery-minos/ language: system + - id: minos-discovery-kong-check + pass_filenames: false + entry: make --directory=packages/plugins/minos-discovery-kong check + name: Check minos-discovery-kong + files: ^packages/plugins/minos-discovery-kong/ + language: system + - id: minos-http-aiohttp-check pass_filenames: false entry: make --directory=packages/plugins/minos-http-aiohttp check diff --git a/.sonarcloud.properties b/.sonarcloud.properties index f65be1b2a..566fa3ed0 100644 --- a/.sonarcloud.properties +++ b/.sonarcloud.properties @@ -1,3 +1,3 @@ sonar.python.version=3.9 sonar.exclusions=tutorials/** -sonar.cpd.exclusions=**/tests/** \ No newline at end of file +sonar.cpd.exclusions=**/tests/**, **/testing/** \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a582cde96..908ae1bd7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,18 +1,17 @@ # How to contribute -Minos being an open-source project, we are looking forward to having your contributions. No matter whether it is a pull -request with new features, or the creation of an issue related to a bug you have found. +Minos being an open-source project, we are looking forward to having your contributions. No matter whether it is a pull request with new features, or the creation of an issue related to a bug you have found. Please consider these guidelines before you submit any modification. -Create an issue ----------------- +## Create an issue + 1. If you happen to find a bug, please file a new issue filling the 'Bug report' template. 2. Set the appropriate labels, so we can categorise it easily. 3. Wait for any core developer's feedback on it. -Submit a Pull Request ------------------------ +## Submit a Pull Request + 1. Create an issue following the previous steps. 2. Fork the project. 3. Push your changes to a local branch. diff --git a/Makefile b/Makefile index adc26476f..545c73033 100644 --- a/Makefile +++ b/Makefile @@ -6,38 +6,5 @@ install: poetry install docs: - mkdir -p $(DOCS_TARGET)/core - mkdir -p $(DOCS_TARGET)/plugins - - $(MAKE) --directory=packages/core/minos-microservice-aggregate install docs - cp -R packages/core/minos-microservice-aggregate/docs/_build/html $(DOCS_TARGET)/core/minos-microservice-aggregate - - $(MAKE) --directory=packages/core/minos-microservice-common install docs - cp -R packages/core/minos-microservice-common/docs/_build/html $(DOCS_TARGET)/core/minos-microservice-common - - $(MAKE) --directory=packages/core/minos-microservice-cqrs install docs - cp -R packages/core/minos-microservice-cqrs/docs/_build/html $(DOCS_TARGET)/core/minos-microservice-cqrs - - $(MAKE) --directory=packages/core/minos-microservice-networks install docs - cp -R packages/core/minos-microservice-networks/docs/_build/html $(DOCS_TARGET)/core/minos-microservice-networks - - $(MAKE) --directory=packages/core/minos-microservice-saga install docs - cp -R packages/core/minos-microservice-saga/docs/_build/html $(DOCS_TARGET)/core/minos-microservice-saga - - $(MAKE) --directory=packages/plugins/minos-broker-kafka install docs - cp -R packages/plugins/minos-broker-kafka/docs/_build/html $(DOCS_TARGET)/plugins/minos-broker-kafka - - $(MAKE) --directory=packages/plugins/minos-broker-rabbitmq install docs - cp -R packages/plugins/minos-broker-rabbitmq/docs/_build/html $(DOCS_TARGET)/plugins/minos-broker-rabbitmq - - $(MAKE) --directory=packages/plugins/minos-discovery-minos install docs - cp -R packages/plugins/minos-discovery-minos/docs/_build/html $(DOCS_TARGET)/plugins/minos-discovery-minos - - $(MAKE) --directory=packages/plugins/minos-http-aiohttp install docs - cp -R packages/plugins/minos-http-aiohttp/docs/_build/html $(DOCS_TARGET)/plugins/minos-http-aiohttp - - $(MAKE) --directory=packages/plugins/minos-router-graphql install docs - cp -R packages/plugins/minos-router-graphql/docs/_build/html $(DOCS_TARGET)/plugins/minos-router-graphql - - + rm -rf docs/api-reference poetry run $(MAKE) --directory=docs html diff --git a/README.md b/README.md index 76d0206d3..7b69b2d31 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ # minos-python: The framework which helps you create reactive microservices in Python +[![GitHub Repo stars](https://img.shields.io/github/stars/minos-framework/minos-python?label=GitHub)](https://github.com/minos-framework/minos-python/stargazers) [![PyPI Latest Release](https://img.shields.io/pypi/v/minos-microservice-common.svg)](https://pypi.org/project/minos-microservice-common/) [![GitHub Workflow Status](https://img.shields.io/github/workflow/status/minos-framework/minos-python/pages%20build%20and%20deployment?label=docs)](https://minos-framework.github.io/minos-python) [![License](https://img.shields.io/github/license/minos-framework/minos-python.svg)](https://github.com/minos-framework/minos-python/blob/main/LICENSE) @@ -135,7 +136,9 @@ pip install \ minos-microservice-networks \ minos-microservice-saga \ minos-broker-kafka \ - minos-http-aiohttp + minos-http-aiohttp \ + minos-http-aiopg \ + minos-http-lmbdb ``` ### Configure a Microservice @@ -164,26 +167,28 @@ aggregate: entities: - main.Foo repositories: - transaction: minos.aggregate.PostgreSqlTransactionRepository - event: minos.aggregate.PostgreSqlEventRepository - snapshot: minos.aggregate.PostgreSqlSnapshotRepository + transaction: minos.aggregate.DatabaseTransactionRepository + event: minos.aggregate.DatabaseEventRepository + snapshot: minos.aggregate.DatabaseSnapshotRepository databases: default: + client: minos.plugins.aiopg.AiopgDatabaseClient database: foo_db user: minos password: min0s saga: + client: minos.plugins.lmdb.LmdbDatabaseClient path: "./foo.lmdb" interfaces: broker: port: minos.networks.BrokerPort publisher: client: minos.plugins.kafka.KafkaBrokerPublisher - queue: minos.networks.PostgreSqlBrokerPublisherQueue + queue: minos.networks.DatabaseBrokerPublisherQueue subscriber: client: minos.plugins.kafka.KafkaBrokerSubscriber - queue: minos.networks.PostgreSqlBrokerSubscriberQueue - validator: minos.networks.PostgreSqlBrokerSubscriberDuplicateValidator + queue: minos.networks.DatabaseBrokerSubscriberQueue + validator: minos.networks.DatabaseBrokerSubscriberDuplicateValidator http: port: minos.networks.HttpPort connector: @@ -192,8 +197,8 @@ interfaces: periodic: port: minos.networks.PeriodicPort pools: - lock: minos.common.PostgreSqlLockPool - databasse: minos.common.PostgreSqlPool + lock: minos.common.DatabaseLockPool + database: minos.common.DatabaseClientPool broker: minos.networks.BrokerClientPool saga: manager: minos.saga.SagaManager @@ -980,26 +985,28 @@ aggregate: entities: - main.FooBar repositories: - transaction: minos.aggregate.PostgreSqlTransactionRepository - event: minos.aggregate.PostgreSqlEventRepository - snapshot: minos.aggregate.PostgreSqlSnapshotRepository + transaction: minos.aggregate.DatabaseTransactionRepository + event: minos.aggregate.DatabaseEventRepository + snapshot: minos.aggregate.DatabaseSnapshotRepository databases: default: + client: minos.plugins.aiopg.AiopgDatabaseClient database: foobar_db user: minos password: min0s saga: + client: minos.plugins.lmdb.LmdbDatabaseClient path: "./foobar.lmdb" interfaces: broker: port: minos.networks.BrokerPort publisher: client: minos.plugins.kafka.KafkaBrokerPublisher - queue: minos.networks.PostgreSqlBrokerPublisherQueue + queue: minos.networks.DatabaseBrokerPublisherQueue subscriber: client: minos.plugins.kafka.KafkaBrokerSubscriber - queue: minos.networks.PostgreSqlBrokerSubscriberQueue - validator: minos.networks.PostgreSqlBrokerSubscriberDuplicateValidator + queue: minos.networks.DatabaseBrokerSubscriberQueue + validator: minos.networks.DatabaseBrokerSubscriberDuplicateValidator http: port: minos.networks.HttpPort connector: @@ -1008,8 +1015,8 @@ interfaces: periodic: port: minos.networks.PeriodicPort pools: - lock: minos.common.PostgreSqlLockPool - databasse: minos.common.PostgreSqlPool + lock: minos.common.DatabaseLockPool + database: minos.common.DatabaseClientPool broker: minos.networks.BrokerClientPool saga: manager: minos.saga.SagaManager @@ -1122,21 +1129,24 @@ This project follows a modular structure based on python packages. The core packages provide the base implementation of the framework. -* [minos-microservice-aggregate](https://minos-framework.github.io/minos-python/packages/core/minos-microservice-aggregate): The Aggregate pattern implementation. -* [minos-microservice-common](https://minos-framework.github.io/minos-python/packages/core/minos-microservice-common): The common core package. -* [minos-microservice-cqrs](https://minos-framework.github.io/minos-python/packages/core/minos-microservice-cqrs): The CQRS pattern implementation. -* [minos-microservice-networks](https://minos-framework.github.io/minos-python/packages/core/minos-microservice-networks): The networks core package. -* [minos-microservice-saga](https://minos-framework.github.io/minos-python/packages/core/minos-microservice-saga): The SAGA pattern implementation. +* [minos-microservice-aggregate](https://github.com/minos-framework/minos-python/tree/main/packages/core/minos-microservice-aggregate): The Aggregate pattern implementation. +* [minos-microservice-common](https://github.com/minos-framework/minos-python/tree/main/packages/core/minos-microservice-common): The common core package. +* [minos-microservice-cqrs](https://github.com/minos-framework/minos-python/tree/main/packages/core/minos-microservice-cqrs): The CQRS pattern implementation. +* [minos-microservice-networks](https://github.com/minos-framework/minos-python/tree/main/packages/core/minos-microservice-networks): The networks core package. +* [minos-microservice-saga](https://github.com/minos-framework/minos-python/tree/main/packages/core/minos-microservice-saga): The SAGA pattern implementation. ### Plugins The plugin packages provide connectors to external technologies like brokers, discovery services, databases, serializers and so on. -* [minos-broker-kafka](https://minos-framework.github.io/minos-python/packages/plugins/minos-broker-kafka): The `kafka` plugin package. -* [minos-broker-rabbitmq](https://minos-framework.github.io/minos-python/packages/plugins/minos-broker-rabbitmq): The `rabbitmq` plugin package. -* [minos-discovery-minos](https://minos-framework.github.io/minos-python/packages/plugins/minos-discovery-minos): The `minos-discovery` plugin package. -* [minos-http-aiohttp](https://minos-framework.github.io/minos-python/packages/plugins/minos-http-aiohttp): The `aiohttp` plugin package. -* [minos-router-graphql](https://minos-framework.github.io/minos-python/packages/plugins/minos-router-graphql): The `grapqhl` plugin package. +* [minos-broker-kafka](https://github.com/minos-framework/minos-python/tree/main/packages/plugins/minos-broker-kafka): The `kafka` plugin package. +* [minos-broker-rabbitmq](https://github.com/minos-framework/minos-python/tree/main/packages/plugins/minos-broker-rabbitmq): The `rabbitmq` plugin package. +* [minos-database-aiopg](https://github.com/minos-framework/minos-python/tree/main/packages/plugins/minos-database-aiopg): The `aiopg` plugin package. +* [minos-database-lmdb](https://github.com/minos-framework/minos-python/tree/main/packages/plugins/minos-database-lmdb): The `lmdb` plugin package. +* [minos-discovery-kong](https://github.com/minos-framework/minos-python/tree/main/packages/plugins/minos-discovery-kong): The `kong` plugin package. +* [minos-discovery-minos](https://github.com/minos-framework/minos-python/tree/main/packages/plugins/minos-discovery-minos): The `minos-discovery` plugin package. +* [minos-http-aiohttp](https://github.com/minos-framework/minos-python/tree/main/packages/plugins/minos-http-aiohttp): The `aiohttp` plugin package. +* [minos-router-graphql](https://github.com/minos-framework/minos-python/tree/main/packages/plugins/minos-router-graphql): The `grapqhl` plugin package. ## Source Code diff --git a/packages/core/minos-microservice-aggregate/SETUP.md b/SETUP.md similarity index 68% rename from packages/core/minos-microservice-aggregate/SETUP.md rename to SETUP.md index 8203965c7..dd0f26b3a 100644 --- a/packages/core/minos-microservice-aggregate/SETUP.md +++ b/SETUP.md @@ -1,11 +1,10 @@ -Set up a development environment -================================= +# Set up a development environment Since we use `poetry` as the default package manager, it must be installed. Please refer to `https://python-poetry.org/docs/#installation`. Run `poetry install` to get the dependencies. -Run `pre-commit install` to set the git checks before commiting. +Run `pre-commit install` to set the git checks before committing. Make yourself sure you are able to run the tests. Refer to the appropriate section in this guide. diff --git a/docs/_static/style.css b/docs/_static/style.css index 8aa6c288f..45da50c55 100644 --- a/docs/_static/style.css +++ b/docs/_static/style.css @@ -1,3 +1,11 @@ .wy-nav-content { max-width: 1200px !important; } + +dl[class*="py"] { + display: block !important; +} + +dl[class*="py"] > dt { + display: block !important; +} \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index f42516f84..0dbe83baf 100755 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,38 +1,60 @@ import os import sys +from datetime import datetime -sys.path.insert(0, os.path.abspath('..')) +sys.path.insert(0, os.path.abspath("..")) -import sphinx_rtd_theme # noqa +from minos import common + +exclude_patterns = [ + "standard/docs/*.md", # FIXME: Include these directories. + "standard/docs/architecture/*.md", # FIXME: Include these directories. + "_build", + "Thumbs.db", + ".DS_Store", +] extensions = [ + "sphinx.ext.autodoc", "sphinx.ext.viewcode", - "sphinx_rtd_theme", + "sphinx.ext.intersphinx", + "sphinx.ext.autosummary", "m2r2", ] +templates_path = ["_templates"] +source_suffix = [".rst", ".md"] -source_suffix = ['.rst', '.md'] - -master_doc = 'index' - -project = 'Minos Python' -copyright = "2021, Clariteia" +master_doc = "index" +project = "minos-python" +copyright = f"2021-{datetime.now().year}, Clariteia" author = "Minos Framework Devs" -language = None - -templates_path = ['_templates'] - -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] - -pygments_style = 'sphinx' - -todo_include_todos = False - -html_theme = 'sphinx_rtd_theme' - -html_extra_path = ['api-reference'] +version = common.__version__ +release = common.__version__ +html_theme = "sphinx_rtd_theme" html_sidebars = {"**": ["about.html", "navigation.html", "searchbox.html"]} - html_static_path = ["_static"] + +autodoc_default_options = { + "members": True, + "undoc-members": True, + "inherited-members": True, + "show-inheritance": True, + "member-order": "bysource", +} +autodoc_mock_imports = [ + "unittest", +] + +autoclass_content = "class" +autodoc_class_signature = "separated" +autodoc_member_order = "bysource" +autodoc_typehints_format = "short" +autodoc_typehints = "description" +autodoc_preserve_defaults = True +add_module_names = False +intersphinx_mapping = { + "python": ("https://docs.python.org/3", None), +} +autosummary_generate = True diff --git a/docs/index.md b/docs/index.md index 97d495851..63298435e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1 +1,42 @@ -.. mdinclude:: ../README.md +

+ Minos logo +

+ +# minos-python: The framework which helps you create reactive microservices in Python + +[![GitHub Repo stars](https://img.shields.io/github/stars/minos-framework/minos-python?label=GitHub)](https://github.com/minos-framework/minos-python/stargazers) +[![PyPI Latest Release](https://img.shields.io/pypi/v/minos-microservice-common.svg)](https://pypi.org/project/minos-microservice-common/) +[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/minos-framework/minos-python/pages%20build%20and%20deployment?label=docs)](https://minos-framework.github.io/minos-python) +[![License](https://img.shields.io/github/license/minos-framework/minos-python.svg)](https://github.com/minos-framework/minos-python/blob/main/LICENSE) +[![Coverage](https://codecov.io/github/minos-framework/minos-python/coverage.svg?branch=main)](https://codecov.io/gh/minos-framework/minos-python) +[![Stack Overflow](https://img.shields.io/badge/Stack%20Overflow-Ask%20a%20question-green)](https://stackoverflow.com/questions/tagged/minos) +[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/minos-framework/community) +[![Tokei](https://tokei.rs/b1/github/minos-framework/minos-python?category=code)](https://github.com/minos-framework/minos-python) + +## Summary + +Minos is a framework which helps you create [reactive](https://www.reactivemanifesto.org/) microservices in Python. Internally, it leverages Event Sourcing, CQRS and a message driven architecture to fulfil the commitments of an asynchronous environment. + + +## API Reference + +.. autosummary:: + :toctree: api-reference + :recursive: + + minos.aggregate + minos.common + minos.cqrs + minos.networks + minos.saga + minos.plugins.kafka + minos.plugins.rabbitmq + minos.plugins.minos_discovery + minos.plugins.kong + minos.plugins.aiohttp + minos.plugins.graphql + +## Indices and tables +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/packages/core/minos-microservice-aggregate/HISTORY.md b/packages/core/minos-microservice-aggregate/HISTORY.md index f010edf94..23f7ba1fa 100644 --- a/packages/core/minos-microservice-aggregate/HISTORY.md +++ b/packages/core/minos-microservice-aggregate/HISTORY.md @@ -78,24 +78,35 @@ * Rename `TransactionService` command topics to avoid collisions with application-level topics. * Minor changes. -0.5.3 (2022-03-04) ------------------- +## 0.5.3 (2022-03-04) * Add `RefException` to be raised when some reference cannot be resolved. * Improve attribute and item accessors of `Ref`, `Event` and `FieldDiffContainer` * Deprecate `Event.get_one` in favor of `Event.get_field`. * Deprecate `Event.get_all` in favor of `Event.get_fields`. -0.5.4 (2022-03-07) ------------------- +## 0.5.4 (2022-03-07) * Fix bug related with `Ref.resolve`. * Add `RefResolver.build_topic_name` static method. * Remove `SnapshotService.__get_one__` method. * Minor changes. -0.6.0 (2022-03-28) ------------------- +## 0.6.0 (2022-03-28) * Replace `dependency-injector`'s injection classes by the ones provided by the `minos.common.injections` module. -* Be compatible with latest `minos.common.Config` API. \ No newline at end of file +* Be compatible with latest `minos.common.Config` API. + +## 0.7.0 (2022-05-11) + +* Rename `PostgreSqlEventRepository` as `DatabaseEventRepository`. +* Add `EventDatabaseOperationFactory` as the abstract class to be implemented by database clients. +* Move `PostgreSqlSnapshotQueryBuilder` to the `minos-database-aiopg` package. +* Rename `PostgreSqlSnapshotRepository` as `DatabaseSnapshotRepository`. +* Add `SnapshotDatabaseOperationFactory` as the abstract class to be implemented by database clients. +* Remove `PostgreSqlSnapshotReader`, `PostgreSqlSnapshotSetup` and `PostgreSqlSnapshotWriter`. +* Rename `PostgreSqlTransactionRepository` as `DatabaseTransactionRepository`. +* Add `TransactionDatabaseOperationFactory` as the abstract class to be implemented by database clients. +* Unify documentation building pipeline across all `minos-python` packages. +* Fix documentation building warnings. +* Fix bug related with package building and additional files like `AUTHORS.md`, `HISTORY.md`, etc. \ No newline at end of file diff --git a/packages/core/minos-microservice-aggregate/Makefile b/packages/core/minos-microservice-aggregate/Makefile index acc861207..ef814b8bc 100644 --- a/packages/core/minos-microservice-aggregate/Makefile +++ b/packages/core/minos-microservice-aggregate/Makefile @@ -15,10 +15,6 @@ reformat: poetry run black --line-length 120 minos tests poetry run isort minos tests -docs: - rm -rf docs/api - poetry run $(MAKE) --directory=docs html - release: $(MAKE) dist poetry publish @@ -38,5 +34,4 @@ check: $(MAKE) reformat $(MAKE) lint $(MAKE) test - $(MAKE) docs $(MAKE) dist diff --git a/packages/core/minos-microservice-aggregate/RUNTHETESTS.md b/packages/core/minos-microservice-aggregate/RUNTHETESTS.md index 8b5e95b1f..386e2b0e7 100644 --- a/packages/core/minos-microservice-aggregate/RUNTHETESTS.md +++ b/packages/core/minos-microservice-aggregate/RUNTHETESTS.md @@ -1,5 +1,4 @@ -Run the tests -============== +# Run the tests In order to run the tests, please make sure you have the `Docker Engine `_ and `Docker Compose `_ installed. diff --git a/packages/core/minos-microservice-aggregate/docs/Makefile b/packages/core/minos-microservice-aggregate/docs/Makefile deleted file mode 100644 index c7f03de43..000000000 --- a/packages/core/minos-microservice-aggregate/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -SPHINXPROJ = minos-microservice-aggregate -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/packages/core/minos-microservice-aggregate/docs/_static/style.css b/packages/core/minos-microservice-aggregate/docs/_static/style.css deleted file mode 100644 index 8aa6c288f..000000000 --- a/packages/core/minos-microservice-aggregate/docs/_static/style.css +++ /dev/null @@ -1,3 +0,0 @@ -.wy-nav-content { - max-width: 1200px !important; -} diff --git a/packages/core/minos-microservice-aggregate/docs/_templates/layout.html b/packages/core/minos-microservice-aggregate/docs/_templates/layout.html deleted file mode 100644 index b0a448060..000000000 --- a/packages/core/minos-microservice-aggregate/docs/_templates/layout.html +++ /dev/null @@ -1,4 +0,0 @@ -{% extends "!layout.html" %} -{% block extrahead %} - -{% endblock %} \ No newline at end of file diff --git a/packages/core/minos-microservice-aggregate/docs/authors.rst b/packages/core/minos-microservice-aggregate/docs/authors.rst deleted file mode 100644 index cf16fc494..000000000 --- a/packages/core/minos-microservice-aggregate/docs/authors.rst +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../AUTHORS.md diff --git a/packages/core/minos-microservice-aggregate/docs/conf.py b/packages/core/minos-microservice-aggregate/docs/conf.py deleted file mode 100755 index bd3a84574..000000000 --- a/packages/core/minos-microservice-aggregate/docs/conf.py +++ /dev/null @@ -1,197 +0,0 @@ -#!/usr/bin/env python -# -# minos documentation build configuration file, created by -# sphinx-quickstart on Fri Jun 9 13:47:02 2017. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -# If extensions (or modules to document with autodoc) are in another -# directory, add these directories to sys.path here. If the directory is -# relative to the documentation root, use os.path.abspath to make it -# absolute, like shown here. -# -import os -import sys - -sys.path.insert(0, os.path.abspath("..")) - -import sphinx_rtd_theme - -from minos import ( - aggregate, -) - -# -- General configuration --------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. - - -extensions = [ - "sphinxcontrib.apidoc", - "sphinx.ext.autodoc", - "sphinx_autodoc_typehints", - "sphinx.ext.viewcode", - "sphinx_rtd_theme", - "m2r2", -] -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -source_suffix = [".rst", ".md"] - -# The master toctree document. -master_doc = "index" - -# General information about the project. -project = "Minos Microservice Aggregate" -copyright = "2021, Clariteia" -author = "Minos Framework Devs" - -# The version info for the project you're documenting, acts as replacement -# for |version| and |release|, also used in various other places throughout -# the built documents. -# -# The short X.Y version. -version = aggregate.__version__ -# The full version, including alpha/beta/rc tags. -release = aggregate.__version__ - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = "sphinx" - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = False - - -# -- Options for HTML output ------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# - -html_theme = "sphinx_rtd_theme" - -# Theme options are theme-specific and customize the look and feel of a -# theme further. For a list of options available for each theme, see the -# documentation. -# - -# html_theme_options = { -# "codecov_button": True, -# "description": "Reactive microservices for an asynchronous world", -# "github_button": True, -# "github_user": "Clariteia", -# "github_repo": "aggregate", -# "github_type": "star", -# } - -html_sidebars = {"**": ["about.html", "navigation.html", "searchbox.html"]} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] - - -# -- Options for HTMLHelp output --------------------------------------- - -# Output file base name for HTML help builder. -htmlhelp_basename = "minosdoc" - - -# -- Options for LaTeX output ------------------------------------------ - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass -# [howto, manual, or own class]). -latex_documents = [ - (master_doc, "minos.tex", "Minos Microservice Aggregate Documentation", "Minos Framework Devs", "manual"), -] - - -# -- Options for manual page output ------------------------------------ - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [(master_doc, "minos", "Minos Microservice Aggregate Documentation", [author], 1)] - - -# -- Options for Texinfo output ---------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ( - master_doc, - "minos", - "Minos Microservice Aggregate Documentation", - author, - "minos", - "One line description of project.", - "Miscellaneous", - ), -] - -# "apidoc" extension -apidoc_module_dir = "../minos" -apidoc_output_dir = "api" -apidoc_separate_modules = True -autodoc_default_options = { - "inherited-members": True, - "special-members": "__init__", - "undoc-members": True, -} - -apidoc_toc_file = False -apidoc_module_first = True -apidoc_extra_args = [ - "--force", - "--implicit-namespaces", -] -# "autodoc typehints" extension - -set_type_checking_flag = True -typehints_fully_qualified = True diff --git a/packages/core/minos-microservice-aggregate/docs/history.rst b/packages/core/minos-microservice-aggregate/docs/history.rst deleted file mode 100644 index d26e5be83..000000000 --- a/packages/core/minos-microservice-aggregate/docs/history.rst +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../HISTORY.md diff --git a/packages/core/minos-microservice-aggregate/docs/index.rst b/packages/core/minos-microservice-aggregate/docs/index.rst deleted file mode 100644 index ec3d028b7..000000000 --- a/packages/core/minos-microservice-aggregate/docs/index.rst +++ /dev/null @@ -1,18 +0,0 @@ -Welcome to Minos Microservice Aggregate's documentation! -====================================== - -.. toctree:: - :maxdepth: 2 - - readme - runthetests - usage - api/minos - authors - history - -Indices and tables -==================== -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/packages/core/minos-microservice-aggregate/docs/make.bat b/packages/core/minos-microservice-aggregate/docs/make.bat deleted file mode 100644 index 12f64c3bd..000000000 --- a/packages/core/minos-microservice-aggregate/docs/make.bat +++ /dev/null @@ -1,36 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=python -msphinx -) -set SOURCEDIR=. -set BUILDDIR=_build -set SPHINXPROJ=minos_microservice_aggregate - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The Sphinx module was not found. Make sure you have Sphinx installed, - echo.then set the SPHINXBUILD environment variable to point to the full - echo.path of the 'sphinx-build' executable. Alternatively you may add the - echo.Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% - -:end -popd diff --git a/packages/core/minos-microservice-aggregate/docs/readme.rst b/packages/core/minos-microservice-aggregate/docs/readme.rst deleted file mode 100644 index af09813a4..000000000 --- a/packages/core/minos-microservice-aggregate/docs/readme.rst +++ /dev/null @@ -1,4 +0,0 @@ -Introduction -************** - -.. mdinclude:: ../README.md diff --git a/packages/core/minos-microservice-aggregate/docs/runthetests.rst b/packages/core/minos-microservice-aggregate/docs/runthetests.rst deleted file mode 100644 index 309db1b96..000000000 --- a/packages/core/minos-microservice-aggregate/docs/runthetests.rst +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../RUNTHETESTS.md diff --git a/packages/core/minos-microservice-aggregate/docs/usage.rst b/packages/core/minos-microservice-aggregate/docs/usage.rst deleted file mode 100644 index a4149f5cd..000000000 --- a/packages/core/minos-microservice-aggregate/docs/usage.rst +++ /dev/null @@ -1,7 +0,0 @@ -===== -Usage -===== - -To use Minos Microservice Aggregate in a project:: - - import minos_microservice_aggregate diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/__init__.py b/packages/core/minos-microservice-aggregate/minos/aggregate/__init__.py index f6e04059f..d2a62b0a1 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/__init__.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/__init__.py @@ -1,6 +1,8 @@ +"""The Aggregate pattern of the Minos Framework.""" + __author__ = "Minos Framework Devs" __email__ = "hey@minos.run" -__version__ = "0.6.0" +__version__ = "0.7.0" from .actions import ( Action, @@ -27,14 +29,15 @@ RootEntity, ) from .events import ( + DatabaseEventRepository, Event, + EventDatabaseOperationFactory, EventEntry, EventRepository, FieldDiff, FieldDiffContainer, IncrementalFieldDiff, InMemoryEventRepository, - PostgreSqlEventRepository, ) from .exceptions import ( AggregateException, @@ -55,20 +58,18 @@ Ordering, ) from .snapshots import ( + DatabaseSnapshotRepository, InMemorySnapshotRepository, - PostgreSqlSnapshotQueryBuilder, - PostgreSqlSnapshotReader, - PostgreSqlSnapshotRepository, - PostgreSqlSnapshotSetup, - PostgreSqlSnapshotWriter, + SnapshotDatabaseOperationFactory, SnapshotEntry, SnapshotRepository, SnapshotService, ) from .transactions import ( TRANSACTION_CONTEXT_VAR, + DatabaseTransactionRepository, InMemoryTransactionRepository, - PostgreSqlTransactionRepository, + TransactionDatabaseOperationFactory, TransactionEntry, TransactionRepository, TransactionService, diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/contextvars.py b/packages/core/minos-microservice-aggregate/minos/aggregate/contextvars.py index e03e76bd9..2bcc02511 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/contextvars.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/contextvars.py @@ -8,3 +8,4 @@ IS_REPOSITORY_SERIALIZATION_CONTEXT_VAR: Final[ContextVar[bool]] = ContextVar( "is_repository_serialization", default=False ) +"""Context variable containing ``True`` if serialization has been started by a repository, or ``False`` otherwise.""" diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/entities/collections.py b/packages/core/minos-microservice-aggregate/minos/aggregate/entities/collections.py index 3925a7784..16c5392c0 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/entities/collections.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/entities/collections.py @@ -140,6 +140,8 @@ def decode_data(cls, decoder: DataDecoder, target: Any, type_: ModelType, **kwar :param type_: The data type. :return: A decoded instance. """ + data_cls = get_args(type_.type_hints["data"])[1] + target = (decoder.build(v, data_cls, **kwargs) for v in target) target = {str(v["uuid"]): v for v in target} decoded = decoder.build(target, type_.type_hints["data"], **kwargs) return cls(decoded, additional_type_hints=type_.type_hints) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/entities/refs/extractors.py b/packages/core/minos-microservice-aggregate/minos/aggregate/entities/refs/extractors.py index 298727725..96d22da41 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/entities/refs/extractors.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/entities/refs/extractors.py @@ -61,7 +61,11 @@ def _build(self, value: Any, type_: type, ans: dict[str, set[Ref]]) -> None: self._build_iterable(value.values(), get_args(type_)[1], ans) elif isinstance(value, Ref): - cls = value.data_cls or get_args(type_)[0] + cls = value.data_cls + if cls is None and len(args := get_args(type_)): + cls = args[0] + if cls is None and len(args := get_args(type_.type_hints["data"])): + cls = args[0] name = cls.__name__ ans[name].add(value) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/entities/refs/resolvers.py b/packages/core/minos-microservice-aggregate/minos/aggregate/entities/refs/resolvers.py index ba92a2ab6..cdfb86b7f 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/entities/refs/resolvers.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/entities/refs/resolvers.py @@ -10,6 +10,7 @@ ) from typing import ( Any, + Optional, Union, ) from uuid import ( @@ -19,6 +20,8 @@ from minos.common import ( Inject, Model, + NotProvidedException, + PoolFactory, ) from minos.networks import ( BrokerClient, @@ -45,7 +48,18 @@ class RefResolver: # noinspection PyUnusedLocal @Inject() - def __init__(self, broker_pool: BrokerClientPool, **kwargs): + def __init__( + self, + broker_pool: Optional[BrokerClientPool] = None, + pool_factory: Optional[PoolFactory] = None, + **kwargs, + ): + if broker_pool is None and pool_factory is not None: + broker_pool = pool_factory.get_pool("broker") + + if not isinstance(broker_pool, BrokerClientPool): + raise NotProvidedException(f"A {BrokerClientPool!r} instance is required. Obtained: {broker_pool}") + self.broker_pool = broker_pool # noinspection PyUnusedLocal diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/events/__init__.py b/packages/core/minos-microservice-aggregate/minos/aggregate/events/__init__.py index 7dcf102ef..08f4df4da 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/events/__init__.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/events/__init__.py @@ -10,7 +10,8 @@ Event, ) from .repositories import ( + DatabaseEventRepository, + EventDatabaseOperationFactory, EventRepository, InMemoryEventRepository, - PostgreSqlEventRepository, ) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/events/repositories/__init__.py b/packages/core/minos-microservice-aggregate/minos/aggregate/events/repositories/__init__.py index c95c37099..d4c3e79b1 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/events/repositories/__init__.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/events/repositories/__init__.py @@ -1,9 +1,10 @@ from .abc import ( EventRepository, ) +from .database import ( + DatabaseEventRepository, + EventDatabaseOperationFactory, +) from .memory import ( InMemoryEventRepository, ) -from .pg import ( - PostgreSqlEventRepository, -) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/events/repositories/abc.py b/packages/core/minos-microservice-aggregate/minos/aggregate/events/repositories/abc.py index 2b3c89a28..de03ccfd5 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/events/repositories/abc.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/events/repositories/abc.py @@ -13,6 +13,7 @@ suppress, ) from typing import ( + TYPE_CHECKING, AsyncIterator, Awaitable, Optional, @@ -29,7 +30,9 @@ Lock, LockPool, NotProvidedException, + PoolFactory, SetupMixin, + classname, ) from minos.networks import ( BrokerMessageV1, @@ -64,6 +67,11 @@ Event, ) +if TYPE_CHECKING: + from ...entities import ( + RootEntity, + ) + @Injectable("event_repository") class EventRepository(ABC, SetupMixin): @@ -74,12 +82,16 @@ def __init__( self, broker_publisher: BrokerPublisher, transaction_repository: TransactionRepository, - lock_pool: LockPool, + lock_pool: Optional[LockPool] = None, + pool_factory: Optional[PoolFactory] = None, *args, **kwargs, ): super().__init__(*args, **kwargs) + if lock_pool is None and pool_factory is not None: + lock_pool = pool_factory.get_pool("lock") + if broker_publisher is None: raise NotProvidedException("A broker instance is required.") @@ -228,7 +240,7 @@ async def _send_events(self, event: Event): async def select( self, uuid: Optional[UUID] = None, - name: Optional[str] = None, + name: Optional[Union[str, type[RootEntity]]] = None, version: Optional[int] = None, version_lt: Optional[int] = None, version_gt: Optional[int] = None, @@ -263,6 +275,8 @@ async def select( :param transaction_uuid_in: The destination transaction identifier must be equal to one of the given values. :return: A list of entries. """ + if isinstance(name, type): + name = classname(name) generator = self._select( uuid=uuid, name=name, diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/events/repositories/database/__init__.py b/packages/core/minos-microservice-aggregate/minos/aggregate/events/repositories/database/__init__.py new file mode 100644 index 000000000..c37452705 --- /dev/null +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/events/repositories/database/__init__.py @@ -0,0 +1,6 @@ +from .factories import ( + EventDatabaseOperationFactory, +) +from .impl import ( + DatabaseEventRepository, +) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/events/repositories/database/factories.py b/packages/core/minos-microservice-aggregate/minos/aggregate/events/repositories/database/factories.py new file mode 100644 index 000000000..1860507f9 --- /dev/null +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/events/repositories/database/factories.py @@ -0,0 +1,114 @@ +from abc import ( + ABC, + abstractmethod, +) +from collections.abc import ( + Iterable, +) +from datetime import ( + datetime, +) +from typing import ( + Optional, +) +from uuid import ( + UUID, +) + +from minos.common import ( + DatabaseOperation, + DatabaseOperationFactory, +) + +from ....actions import ( + Action, +) + + +class EventDatabaseOperationFactory(DatabaseOperationFactory, ABC): + """Event Database Operation Factory base class.""" + + @abstractmethod + def build_create(self) -> DatabaseOperation: + """Build the database operation to create the event table. + + :return: A ``DatabaseOperation`` instance.s + """ + + @abstractmethod + def build_submit( + self, + transaction_uuids: Iterable[UUID], + uuid: UUID, + action: Action, + name: str, + version: int, + data: bytes, + created_at: datetime, + transaction_uuid: UUID, + lock: Optional[int], + **kwargs, + ) -> DatabaseOperation: + """Build the database operation to submit a row into the event table. + + :param transaction_uuids: The sequence of nested transaction in on top of the current event's transaction. + :param uuid: The identifier of the entity. + :param action: The action of the event. + :param name: The name of the entity. + :param version: The version of the entity + :param data: The data of the event. + :param created_at: The creation datetime. + :param transaction_uuid: The identifier of the transaction. + :param lock: The lock identifier. + :param kwargs: Additional named arguments. + :return: A ``DatabaseOperation`` instance. + """ + + # noinspection PyShadowingBuiltins + @abstractmethod + def build_query( + self, + uuid: Optional[UUID] = None, + name: Optional[str] = None, + version: Optional[int] = None, + version_lt: Optional[int] = None, + version_gt: Optional[int] = None, + version_le: Optional[int] = None, + version_ge: Optional[int] = None, + id: Optional[int] = None, + id_lt: Optional[int] = None, + id_gt: Optional[int] = None, + id_le: Optional[int] = None, + id_ge: Optional[int] = None, + transaction_uuid: Optional[UUID] = None, + transaction_uuid_ne: Optional[UUID] = None, + transaction_uuid_in: Optional[tuple[UUID, ...]] = None, + **kwargs, + ) -> DatabaseOperation: + """Build the database operation to select rows. + + :param uuid: The identifier must be equal to the given value. + :param name: The classname must be equal to the given value. + :param version: The version must be equal to the given value. + :param version_lt: The version must be lower than the given value. + :param version_gt: The version must be greater than the given value. + :param version_le: The version must be lower or equal to the given value. + :param version_ge: The version must be greater or equal to the given value. + :param id: The entry identifier must be equal to the given value. + :param id_lt: The entry identifier must be lower than the given value. + :param id_gt: The entry identifier must be greater than the given value. + :param id_le: The entry identifier must be lower or equal to the given value. + :param id_ge: The entry identifier must be greater or equal to the given value. + :param transaction_uuid: The transaction identifier must be equal to the given value. + :param transaction_uuid_ne: The transaction identifier must be distinct of the given value. + :param transaction_uuid_in: The destination transaction identifier must be equal to one of the given values. + + :return: A ``DatabaseOperation`` instance. + """ + + @abstractmethod + def build_query_offset(self) -> DatabaseOperation: + """Build the database operation to get the maximum identifier. + + :return: A ``DatabaseOperation`` instance. + """ diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/events/repositories/database/impl.py b/packages/core/minos-microservice-aggregate/minos/aggregate/events/repositories/database/impl.py new file mode 100644 index 000000000..0f549e33e --- /dev/null +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/events/repositories/database/impl.py @@ -0,0 +1,85 @@ +from __future__ import ( + annotations, +) + +from typing import ( + AsyncIterator, + Optional, +) + +from minos.common import ( + NULL_UUID, + DatabaseMixin, + DatabaseOperation, + IntegrityException, +) + +from ....exceptions import ( + EventRepositoryConflictException, +) +from ...entries import ( + EventEntry, +) +from ..abc import ( + EventRepository, +) +from .factories import ( + EventDatabaseOperationFactory, +) + + +class DatabaseEventRepository(DatabaseMixin[EventDatabaseOperationFactory], EventRepository): + """Database-based implementation of the event repository class.""" + + def __init__(self, *args, database_key: Optional[tuple[str]] = None, **kwargs): + if database_key is None: + database_key = ("aggregate", "event") + super().__init__(*args, database_key=database_key, **kwargs) + + async def _setup(self): + """Setup miscellaneous repository things. + + :return: This method does not return anything. + """ + operation = self.database_operation_factory.build_create() + await self.execute_on_database(operation) + + async def _submit(self, entry: EventEntry, **kwargs) -> EventEntry: + operation = await self._build_submit_operation(entry) + + try: + response = await self.execute_on_database_and_fetch_one(operation) + except IntegrityException: + raise EventRepositoryConflictException( + f"{entry!r} could not be submitted due to a key (uuid, version, transaction) collision", + await self.offset, + ) + + entry.id, entry.uuid, entry.version, entry.created_at = response + return entry + + async def _build_submit_operation(self, entry: EventEntry) -> DatabaseOperation: + lock = None + if entry.uuid != NULL_UUID: + lock = entry.uuid.int & (1 << 32) - 1 + + if entry.transaction_uuid != NULL_UUID: + transaction = await self._transaction_repository.get(uuid=entry.transaction_uuid) + transaction_uuids = await transaction.uuids + else: + transaction_uuids = (NULL_UUID,) + + return self.database_operation_factory.build_submit( + transaction_uuids=transaction_uuids, **entry.as_raw(), lock=lock + ) + + async def _select(self, streaming_mode: Optional[bool] = None, **kwargs) -> AsyncIterator[EventEntry]: + operation = self.database_operation_factory.build_query(**kwargs) + async for row in self.execute_on_database_and_fetch_all(operation, streaming_mode=streaming_mode): + yield EventEntry(*row) + + @property + async def _offset(self) -> int: + operation = self.database_operation_factory.build_query_offset() + row = await self.execute_on_database_and_fetch_one(operation) + return row[0] or 0 diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/events/repositories/pg.py b/packages/core/minos-microservice-aggregate/minos/aggregate/events/repositories/pg.py deleted file mode 100644 index d7a8c9174..000000000 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/events/repositories/pg.py +++ /dev/null @@ -1,237 +0,0 @@ -from __future__ import ( - annotations, -) - -from typing import ( - AsyncIterator, - Optional, -) -from uuid import ( - UUID, -) - -from psycopg2 import ( - IntegrityError, -) -from psycopg2.sql import ( - SQL, - Composable, - Literal, - Placeholder, -) - -from minos.common import ( - NULL_UUID, - Config, - PostgreSqlMinosDatabase, -) - -from ...exceptions import ( - EventRepositoryConflictException, -) -from ..entries import ( - EventEntry, -) -from .abc import ( - EventRepository, -) - - -class PostgreSqlEventRepository(PostgreSqlMinosDatabase, EventRepository): - """PostgreSQL-based implementation of the event repository class in ``Minos``.""" - - @classmethod - def _from_config(cls, *args, config: Config, **kwargs) -> Optional[EventRepository]: - return cls(*args, **config.get_database_by_name("event"), **kwargs) - - async def _setup(self): - """Setup miscellaneous repository thing. - - In the PostgreSQL case, configures the needed table to be used to store the data. - - :return: This method does not return anything. - """ - await self.submit_query('CREATE EXTENSION IF NOT EXISTS "uuid-ossp";', lock="uuid-ossp") - - await self.submit_query(_CREATE_ACTION_ENUM_QUERY, lock="aggregate_event") - await self.submit_query(_CREATE_TABLE_QUERY, lock="aggregate_event") - - async def _submit(self, entry: EventEntry, **kwargs) -> EventEntry: - lock = None - if entry.uuid != NULL_UUID: - lock = entry.uuid.int & (1 << 32) - 1 - - query, params = await self._build_query(entry) - - try: - response = await self.submit_query_and_fetchone(query, params, lock=lock) - except IntegrityError: - raise EventRepositoryConflictException( - f"{entry!r} could not be submitted due to a key (uuid, version, transaction) collision", - await self.offset, - ) - - entry.id, entry.uuid, entry.version, entry.created_at = response - return entry - - async def _build_query(self, entry: EventEntry) -> tuple[Composable, dict[str, UUID]]: - if entry.transaction_uuid != NULL_UUID: - transaction = await self._transaction_repository.get(uuid=entry.transaction_uuid) - transaction_uuids = await transaction.uuids - else: - transaction_uuids = (NULL_UUID,) - - from_query_parts = list() - parameters = dict() - for index, transaction_uuid in enumerate(transaction_uuids, start=1): - name = f"transaction_uuid_{index}" - parameters[name] = transaction_uuid - - from_query_parts.append( - _SELECT_TRANSACTION_CHUNK.format(index=Literal(index), transaction_uuid=Placeholder(name)) - ) - - from_query = SQL(" UNION ALL ").join(from_query_parts) - - query = _INSERT_VALUES_QUERY.format(from_parts=from_query) - - return query, parameters | entry.as_raw() - - async def _select(self, **kwargs) -> AsyncIterator[EventEntry]: - query = self._build_select_query(**kwargs) - async for row in self.submit_query_and_iter(query, kwargs, **kwargs): - yield EventEntry(*row) - - # noinspection PyUnusedLocal - @staticmethod - def _build_select_query( - uuid: Optional[UUID] = None, - name: Optional[str] = None, - version: Optional[int] = None, - version_lt: Optional[int] = None, - version_gt: Optional[int] = None, - version_le: Optional[int] = None, - version_ge: Optional[int] = None, - id: Optional[int] = None, - id_lt: Optional[int] = None, - id_gt: Optional[int] = None, - id_le: Optional[int] = None, - id_ge: Optional[int] = None, - transaction_uuid: Optional[UUID] = None, - transaction_uuid_ne: Optional[UUID] = None, - transaction_uuid_in: Optional[tuple[UUID, ...]] = None, - **kwargs, - ) -> str: - conditions = list() - - if uuid is not None: - conditions.append("uuid = %(uuid)s") - if name is not None: - conditions.append("name = %(name)s") - if version is not None: - conditions.append("version = %(version)s") - if version_lt is not None: - conditions.append("version < %(version_lt)s") - if version_gt is not None: - conditions.append("version > %(version_gt)s") - if version_le is not None: - conditions.append("version <= %(version_le)s") - if version_ge is not None: - conditions.append("version >= %(version_ge)s") - if id is not None: - conditions.append("id = %(id)s") - if id_lt is not None: - conditions.append("id < %(id_lt)s") - if id_gt is not None: - conditions.append("id > %(id_gt)s") - if id_le is not None: - conditions.append("id <= %(id_le)s") - if id_ge is not None: - conditions.append("id >= %(id_ge)s") - if transaction_uuid is not None: - conditions.append("transaction_uuid = %(transaction_uuid)s") - if transaction_uuid_ne is not None: - conditions.append("transaction_uuid <> %(transaction_uuid_ne)s") - if transaction_uuid_in is not None: - conditions.append("transaction_uuid IN %(transaction_uuid_in)s") - - if not conditions: - return f"{_SELECT_ALL_ENTRIES_QUERY} ORDER BY id;" - - return f"{_SELECT_ALL_ENTRIES_QUERY} WHERE {' AND '.join(conditions)} ORDER BY id;" - - @property - async def _offset(self) -> int: - return (await self.submit_query_and_fetchone(_SELECT_MAX_ID_QUERY))[0] or 0 - - -_CREATE_ACTION_ENUM_QUERY = """ -DO -$$ - BEGIN - IF NOT EXISTS(SELECT * - FROM pg_type typ - INNER JOIN pg_namespace nsp - ON nsp.oid = typ.typnamespace - WHERE nsp.nspname = current_schema() - AND typ.typname = 'action_type') THEN - CREATE TYPE action_type AS ENUM ('create', 'update', 'delete'); - END IF; - END; -$$ -LANGUAGE plpgsql; -""".strip() - -_CREATE_TABLE_QUERY = """ -CREATE TABLE IF NOT EXISTS aggregate_event ( - id BIGSERIAL PRIMARY KEY, - action ACTION_TYPE NOT NULL, - uuid UUID NOT NULL, - name TEXT NOT NULL, - version INT NOT NULL, - data BYTEA NOT NULL, - created_at TIMESTAMPTZ NOT NULL, - transaction_uuid UUID NOT NULL DEFAULT uuid_nil(), - UNIQUE (uuid, version, transaction_uuid) -); -""".strip() - -_INSERT_VALUES_QUERY = SQL( - """ -INSERT INTO aggregate_event (id, action, uuid, name, version, data, created_at, transaction_uuid) -VALUES ( - default, - %(action)s, - CASE %(uuid)s WHEN uuid_nil() THEN uuid_generate_v4() ELSE %(uuid)s END, - %(name)s, - ( - SELECT (CASE WHEN %(version)s IS NULL THEN 1 + COALESCE(MAX(t2.version), 0) ELSE %(version)s END) - FROM ( - SELECT DISTINCT ON (t1.uuid) t1.version - FROM ( {from_parts} ) AS t1 - ORDER BY t1.uuid, t1.transaction_index DESC - ) AS t2 - ), - %(data)s, - (CASE WHEN %(created_at)s IS NULL THEN NOW() ELSE %(created_at)s END), - %(transaction_uuid)s -) -RETURNING id, uuid, version, created_at; - """ -) - -_SELECT_TRANSACTION_CHUNK = SQL( - """ -SELECT {index} AS transaction_index, uuid, MAX(version) AS version -FROM aggregate_event -WHERE uuid = %(uuid)s AND transaction_uuid = {transaction_uuid} -GROUP BY uuid - """ -) - -_SELECT_ALL_ENTRIES_QUERY = """ -SELECT uuid, name, version, data, id, action, created_at, transaction_uuid -FROM aggregate_event -""".strip() - -_SELECT_MAX_ID_QUERY = "SELECT MAX(id) FROM aggregate_event;".strip() diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/exceptions.py b/packages/core/minos-microservice-aggregate/minos/aggregate/exceptions.py index b0d8790ba..6958a2a48 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/exceptions.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/exceptions.py @@ -40,7 +40,7 @@ class TransactionRepositoryException(AggregateException): class TransactionRepositoryConflictException(TransactionRepositoryException): - """Exception to be raised when a transactions has invalid status.""" + """Exception to be raised when a transaction has invalid status.""" class TransactionNotFoundException(TransactionRepositoryException): diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/queries.py b/packages/core/minos-microservice-aggregate/minos/aggregate/queries.py index efe8ac77d..66411ed65 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/queries.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/queries.py @@ -173,11 +173,11 @@ class Condition: * `LOWER_EQUAL`: Evaluates as `True` only if the field of the given model is lower or equal (<=) to the parameter. * `GREATER`: Evaluates as `True` only if the field of the given model is greater (>) than the parameter. * `GREATER_EQUAL`: Evaluates as `True` only if the field of the given model is greater or equal (>=) to the - parameter. + parameter. * `EQUAL`: Evaluates as `True` only if the field of the given model is equal (==) to the parameter. * `NOT_EQUAL`: Evaluates as `True` only if the field of the given model is not equal (!=) to the parameter. * `IN`: Evaluates as `True` only if the field of the given model belongs (in) to the parameter (which must be a - collection). + collection). * `LIKE`: Evaluates as `True` only if the field of the given model matches to the parameter _pattern. diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/__init__.py b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/__init__.py index eb026d9fd..fa4e34c31 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/__init__.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/__init__.py @@ -1,18 +1,11 @@ -from .abc import ( - SnapshotRepository, -) from .entries import ( SnapshotEntry, ) -from .memory import ( +from .repositories import ( + DatabaseSnapshotRepository, InMemorySnapshotRepository, -) -from .pg import ( - PostgreSqlSnapshotQueryBuilder, - PostgreSqlSnapshotReader, - PostgreSqlSnapshotRepository, - PostgreSqlSnapshotSetup, - PostgreSqlSnapshotWriter, + SnapshotDatabaseOperationFactory, + SnapshotRepository, ) from .services import ( SnapshotService, diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/entries.py b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/entries.py index 73b8afab1..6a92f5078 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/entries.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/entries.py @@ -42,25 +42,14 @@ class SnapshotEntry: Is the python object representation of a row in the ``snapshot`` storage system. """ - __slots__ = ( - "uuid", - "name", - "version", - "schema", - "data", - "created_at", - "updated_at", - "transaction_uuid", - ) - # noinspection PyShadowingBuiltins def __init__( self, uuid: UUID, name: str, version: int, - schema: Optional[Union[list[dict[str, Any]], dict[str, Any]]] = None, - data: Optional[dict[str, Any]] = None, + schema: Optional[Union[list[dict[str, Any]], dict[str, Any]], bytes, memoryview] = None, + data: Optional[Union[dict[str, Any], str]] = None, created_at: Optional[datetime] = None, updated_at: Optional[datetime] = None, transaction_uuid: UUID = NULL_UUID, @@ -70,6 +59,9 @@ def __init__( if isinstance(schema, bytes): schema = MinosJsonBinaryProtocol.decode(schema) + if isinstance(data, str): + data = json.loads(data) + self.uuid = uuid self.name = name self.version = version diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/__init__.py b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/__init__.py deleted file mode 100644 index 4b4072b8c..000000000 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -from .abc import ( - PostgreSqlSnapshotSetup, -) -from .api import ( - PostgreSqlSnapshotRepository, -) -from .queries import ( - PostgreSqlSnapshotQueryBuilder, -) -from .readers import ( - PostgreSqlSnapshotReader, -) -from .writers import ( - PostgreSqlSnapshotWriter, -) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/abc.py b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/abc.py deleted file mode 100644 index 0d1f2173a..000000000 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/abc.py +++ /dev/null @@ -1,51 +0,0 @@ -from __future__ import ( - annotations, -) - -from typing import ( - Type, - TypeVar, -) - -from minos.common import ( - Config, - PostgreSqlMinosDatabase, -) - - -class PostgreSqlSnapshotSetup(PostgreSqlMinosDatabase): - """Minos Snapshot Setup Class""" - - @classmethod - def _from_config(cls: Type[T], config: Config, **kwargs) -> T: - return cls(**config.get_database_by_name("snapshot"), **kwargs) - - async def _setup(self) -> None: - await self.submit_query('CREATE EXTENSION IF NOT EXISTS "uuid-ossp";', lock="uuid-ossp") - await self.submit_query(_CREATE_TABLE_QUERY, lock="snapshot") - await self.submit_query(_CREATE_OFFSET_TABLE_QUERY, lock="snapshot_aux_offset") - - -T = TypeVar("T", bound=PostgreSqlSnapshotSetup) - -_CREATE_TABLE_QUERY = """ -CREATE TABLE IF NOT EXISTS snapshot ( - uuid UUID NOT NULL, - name TEXT NOT NULL, - version INT NOT NULL, - schema BYTEA, - data JSONB, - created_at TIMESTAMPTZ NOT NULL, - updated_at TIMESTAMPTZ NOT NULL, - transaction_uuid UUID NOT NULL DEFAULT uuid_nil(), - PRIMARY KEY (uuid, transaction_uuid) -); -""".strip() - -_CREATE_OFFSET_TABLE_QUERY = """ -CREATE TABLE IF NOT EXISTS snapshot_aux_offset ( - id bool PRIMARY KEY DEFAULT TRUE, - value BIGINT NOT NULL, - CONSTRAINT id_uni CHECK (id) -); -""".strip() diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/api.py b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/api.py deleted file mode 100644 index 9a6357171..000000000 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/api.py +++ /dev/null @@ -1,73 +0,0 @@ -from __future__ import ( - annotations, -) - -from typing import ( - TYPE_CHECKING, - AsyncIterator, - Awaitable, -) - -from minos.common import ( - Config, -) - -from ..abc import ( - SnapshotRepository, -) -from .readers import ( - PostgreSqlSnapshotReader, -) -from .writers import ( - PostgreSqlSnapshotWriter, -) - -if TYPE_CHECKING: - from ...entities import ( - RootEntity, - ) - - -class PostgreSqlSnapshotRepository(SnapshotRepository): - """PostgreSQL Snapshot class. - - The snapshot provides a direct accessor to the ``RootEntity`` instances stored as events by the event repository - class. - """ - - reader: PostgreSqlSnapshotReader - writer: PostgreSqlSnapshotWriter - - def __init__(self, *args, reader: PostgreSqlSnapshotReader, writer: PostgreSqlSnapshotWriter, **kwargs): - super().__init__(*args, **kwargs) - self.reader = reader - self.writer = writer - - @classmethod - def _from_config(cls, config: Config, **kwargs) -> PostgreSqlSnapshotRepository: - if "reader" not in kwargs: - kwargs["reader"] = PostgreSqlSnapshotReader.from_config(config, **kwargs) - - if "writer" not in kwargs: - kwargs["writer"] = PostgreSqlSnapshotWriter.from_config(config, **kwargs) - - return cls(**config.get_database_by_name("snapshot"), **kwargs) - - async def _setup(self) -> None: - await self.writer.setup() - await self.reader.setup() - await super()._setup() - - async def _destroy(self) -> None: - await super()._destroy() - await self.reader.destroy() - await self.writer.destroy() - - def _get(self, *args, **kwargs) -> Awaitable[RootEntity]: - return self.reader.get(*args, **kwargs) - - def _find(self, *args, **kwargs) -> AsyncIterator[RootEntity]: - return self.reader.find(*args, **kwargs) - - def _synchronize(self, *args, **kwargs) -> Awaitable[None]: - return self.writer.dispatch(**kwargs) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/readers.py b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/readers.py deleted file mode 100644 index 9793b7ddc..000000000 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/readers.py +++ /dev/null @@ -1,142 +0,0 @@ -from __future__ import ( - annotations, -) - -import logging -from typing import ( - TYPE_CHECKING, - AsyncIterator, - Optional, -) -from uuid import ( - UUID, -) - -from minos.common import ( - NULL_UUID, -) - -from ...exceptions import ( - NotFoundException, -) -from ...queries import ( - _Condition, - _EqualCondition, - _Ordering, -) -from ...transactions import ( - TransactionEntry, -) -from ..entries import ( - SnapshotEntry, -) -from .abc import ( - PostgreSqlSnapshotSetup, -) -from .queries import ( - PostgreSqlSnapshotQueryBuilder, -) - -if TYPE_CHECKING: - from ...entities import ( - RootEntity, - ) - -logger = logging.getLogger(__name__) - - -class PostgreSqlSnapshotReader(PostgreSqlSnapshotSetup): - """PostgreSQL Snapshot class. - - The snapshot provides a direct accessor to the ``RootEntity`` instances stored as events by the event repository - class. - """ - - async def get(self, name: str, uuid: UUID, **kwargs) -> RootEntity: - """Get a ``RootEntity`` instance from its identifier. - - :param name: Class name of the ``RootEntity``. - :param uuid: Identifier of the ``RootEntity``. - :param kwargs: Additional named arguments. - :return: The ``RootEntity`` instance. - """ - snapshot_entry = await self.get_entry(name, uuid, **kwargs) - instance = snapshot_entry.build(**kwargs) - return instance - - # noinspection PyUnusedLocal - async def get_entry(self, name: str, uuid: UUID, **kwargs) -> SnapshotEntry: - """Get a ``SnapshotEntry`` from its identifier. - - :param name: Class name of the ``RootEntity``. - :param uuid: Identifier of the ``RootEntity``. - :param kwargs: Additional named arguments. - :return: The ``SnapshotEntry`` instance. - """ - - try: - return await self.find_entries( - name, _EqualCondition("uuid", uuid), **kwargs | {"exclude_deleted": False} - ).__anext__() - except StopAsyncIteration: - raise NotFoundException(f"The instance could not be found: {uuid!s}") - - async def find(self, *args, **kwargs) -> AsyncIterator[RootEntity]: - """Find a collection of ``RootEntity`` instances based on a ``Condition``. - - :param args: Additional positional arguments. - :param kwargs: Additional named arguments. - :return: An asynchronous iterator that containing the ``RootEntity`` instances. - """ - async for snapshot_entry in self.find_entries(*args, **kwargs): - yield snapshot_entry.build(**kwargs) - - async def find_entries( - self, - name: str, - condition: _Condition, - ordering: Optional[_Ordering] = None, - limit: Optional[int] = None, - streaming_mode: bool = False, - transaction: Optional[TransactionEntry] = None, - exclude_deleted: bool = True, - **kwargs, - ) -> AsyncIterator[SnapshotEntry]: - """Find a collection of ``SnapshotEntry`` instances based on a ``Condition``. - - :param name: Class name of the ``RootEntity``. - :param condition: The condition that must be satisfied by the ``RootEntity`` instances. - :param ordering: Optional argument to return the instance with specific ordering strategy. The default behaviour - is to retrieve them without any order pattern. - :param limit: Optional argument to return only a subset of instances. The default behaviour is to return all the - instances that meet the given condition. - :param streaming_mode: If ``True`` return the values in streaming directly from the database (keep an open - database connection), otherwise preloads the full set of values on memory and then retrieves them. - :param transaction: The transaction within the operation is performed. If not any value is provided, then the - transaction is extracted from the context var. If not any transaction is being scoped then the query is - performed to the global snapshot. - :param exclude_deleted: If ``True``, deleted ``RootEntity`` entries are included, otherwise deleted - ``RootEntity`` entries are filtered. - :param kwargs: Additional named arguments. - :return: An asynchronous iterator that containing the ``RootEntity`` instances. - """ - if transaction is None: - transaction_uuids = (NULL_UUID,) - else: - transaction_uuids = await transaction.uuids - - qb = PostgreSqlSnapshotQueryBuilder(name, condition, ordering, limit, transaction_uuids, exclude_deleted) - query, parameters = qb.build() - - async with self.cursor() as cursor: - # noinspection PyTypeChecker - await cursor.execute(query, parameters) - if streaming_mode: - async for row in cursor: - # noinspection PyArgumentList - yield SnapshotEntry(*row) - return - else: - rows = await cursor.fetchall() - for row in rows: - yield SnapshotEntry(*row) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/repositories/__init__.py b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/repositories/__init__.py new file mode 100644 index 000000000..172c54117 --- /dev/null +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/repositories/__init__.py @@ -0,0 +1,10 @@ +from .abc import ( + SnapshotRepository, +) +from .database import ( + DatabaseSnapshotRepository, + SnapshotDatabaseOperationFactory, +) +from .memory import ( + InMemorySnapshotRepository, +) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/abc.py b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/repositories/abc.py similarity index 54% rename from packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/abc.py rename to packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/repositories/abc.py index f1b0f26a9..29f923ff1 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/abc.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/repositories/abc.py @@ -11,6 +11,7 @@ AsyncIterator, Awaitable, Optional, + Union, ) from uuid import ( UUID, @@ -19,20 +20,28 @@ from minos.common import ( Injectable, SetupMixin, + classname, ) -from ..queries import ( +from ...exceptions import ( + NotFoundException, +) +from ...queries import ( _TRUE_CONDITION, _Condition, + _EqualCondition, _Ordering, ) -from ..transactions import ( +from ...transactions import ( TRANSACTION_CONTEXT_VAR, TransactionEntry, ) +from ..entries import ( + SnapshotEntry, +) if TYPE_CHECKING: - from ..entities import ( + from ...entities import ( RootEntity, ) @@ -45,7 +54,13 @@ class SnapshotRepository(ABC, SetupMixin): class. """ - async def get(self, name: str, uuid: UUID, transaction: Optional[TransactionEntry] = None, **kwargs) -> RootEntity: + async def get( + self, + name: Union[str, type[RootEntity]], + uuid: UUID, + transaction: Optional[TransactionEntry] = None, + **kwargs, + ) -> RootEntity: """Get a ``RootEntity`` instance from its identifier. :param name: Class name of the ``RootEntity``. @@ -56,16 +71,25 @@ async def get(self, name: str, uuid: UUID, transaction: Optional[TransactionEntr :param kwargs: Additional named arguments. :return: The ``RootEntity`` instance. """ - if transaction is None: - transaction = TRANSACTION_CONTEXT_VAR.get() + snapshot_entry = await self.get_entry(name, uuid, transaction=transaction, **kwargs) + instance = snapshot_entry.build(**kwargs) + return instance - await self.synchronize(**kwargs) + async def get_entry(self, name: str, uuid: UUID, **kwargs) -> SnapshotEntry: + """Get a ``SnapshotEntry`` from its identifier. - return await self._get(name=name, uuid=uuid, transaction=transaction, **kwargs) + :param name: Class name of the ``RootEntity``. + :param uuid: Identifier of the ``RootEntity``. + :param kwargs: Additional named arguments. + :return: The ``SnapshotEntry`` instance. + """ - @abstractmethod - async def _get(self, *args, **kwargs) -> RootEntity: - raise NotImplementedError + try: + return await self.find_entries( + name, _EqualCondition("uuid", uuid), **kwargs | {"exclude_deleted": False} + ).__anext__() + except StopAsyncIteration: + raise NotFoundException(f"The instance could not be found: {uuid!s}") def get_all( self, @@ -103,7 +127,7 @@ def get_all( async def find( self, - name: str, + name: Union[str, type[RootEntity]], condition: _Condition, ordering: Optional[_Ordering] = None, limit: Optional[int] = None, @@ -127,26 +151,84 @@ async def find( :param kwargs: Additional named arguments. :return: An asynchronous iterator that containing the ``RootEntity`` instances. """ + iterable = self.find_entries( + name=name, + condition=condition, + ordering=ordering, + limit=limit, + streaming_mode=streaming_mode, + transaction=transaction, + **kwargs, + ) + async for snapshot_entry in iterable: + yield snapshot_entry.build(**kwargs) + + async def find_entries( + self, + name: str, + condition: _Condition, + ordering: Optional[_Ordering] = None, + limit: Optional[int] = None, + streaming_mode: bool = False, + transaction: Optional[TransactionEntry] = None, + exclude_deleted: bool = True, + synchronize: bool = True, + **kwargs, + ) -> AsyncIterator[SnapshotEntry]: + """Find a collection of ``SnapshotEntry`` instances based on a ``Condition``. + + :param name: Class name of the ``RootEntity``. + :param condition: The condition that must be satisfied by the ``RootEntity`` instances. + :param ordering: Optional argument to return the instance with specific ordering strategy. The default behaviour + is to retrieve them without any order pattern. + :param limit: Optional argument to return only a subset of instances. The default behaviour is to return all the + instances that meet the given condition. + :param streaming_mode: If ``True`` return the values in streaming directly from the database (keep an open + database connection), otherwise preloads the full set of values on memory and then retrieves them. + :param transaction: The transaction within the operation is performed. If not any value is provided, then the + transaction is extracted from the context var. If not any transaction is being scoped then the query is + performed to the global snapshot. + :param exclude_deleted: If ``True``, deleted ``RootEntity`` entries are included, otherwise deleted + ``RootEntity`` entries are filtered. + :param synchronize: If ``True`` a synchronization is performed before processing the query, otherwise the query + is performed without any synchronization step. + :param kwargs: Additional named arguments. + :return: An asynchronous iterator that containing the ``RootEntity`` instances. + """ + if isinstance(name, type): + name = classname(name) + if transaction is None: transaction = TRANSACTION_CONTEXT_VAR.get() - await self.synchronize(**kwargs) + if synchronize: + await self.synchronize(**kwargs) - iterable = self._find( + iterable = self._find_entries( name=name, condition=condition, ordering=ordering, limit=limit, streaming_mode=streaming_mode, transaction=transaction, + exclude_deleted=exclude_deleted, **kwargs, ) - - async for instance in iterable: - yield instance + async for entry in iterable: + yield entry @abstractmethod - def _find(self, *args, **kwargs) -> AsyncIterator[RootEntity]: + def _find_entries( + self, + name: str, + condition: _Condition, + ordering: Optional[_Ordering], + limit: Optional[int], + streaming_mode: bool, + transaction: Optional[TransactionEntry], + exclude_deleted: bool, + **kwargs, + ) -> AsyncIterator[SnapshotEntry]: raise NotImplementedError def synchronize(self, **kwargs) -> Awaitable[None]: @@ -155,7 +237,7 @@ def synchronize(self, **kwargs) -> Awaitable[None]: :param kwargs: Additional named arguments. :return: This method does not return anything. """ - return self._synchronize(**kwargs) + return self._synchronize(**kwargs, synchronize=False) @abstractmethod async def _synchronize(self, **kwargs) -> None: diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/repositories/database/__init__.py b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/repositories/database/__init__.py new file mode 100644 index 000000000..d45559535 --- /dev/null +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/repositories/database/__init__.py @@ -0,0 +1,6 @@ +from .factories import ( + SnapshotDatabaseOperationFactory, +) +from .impl import ( + DatabaseSnapshotRepository, +) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/repositories/database/factories.py b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/repositories/database/factories.py new file mode 100644 index 000000000..fe0d06937 --- /dev/null +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/repositories/database/factories.py @@ -0,0 +1,112 @@ +from abc import ( + ABC, + abstractmethod, +) +from collections.abc import ( + Iterable, +) +from datetime import ( + datetime, +) +from typing import ( + Any, + Optional, +) +from uuid import ( + UUID, +) + +from minos.common import ( + DatabaseOperation, + DatabaseOperationFactory, +) + +from ....queries import ( + _Condition, + _Ordering, +) + + +class SnapshotDatabaseOperationFactory(DatabaseOperationFactory, ABC): + """Snapshot Database Operation Factory class.""" + + @abstractmethod + def build_create(self) -> DatabaseOperation: + """Build the database operation to create the snapshot table. + + :return: A ``DatabaseOperation`` instance. + """ + + @abstractmethod + def build_delete(self, transaction_uuids: Iterable[UUID]) -> DatabaseOperation: + """Build the database operation to delete rows by transaction identifiers. + + :param transaction_uuids: The transaction identifiers. + :return: A ``DatabaseOperation`` instance. + """ + + @abstractmethod + def build_submit( + self, + uuid: UUID, + name: str, + version: int, + schema: bytes, + data: dict[str, Any], + created_at: datetime, + updated_at: datetime, + transaction_uuid: UUID, + ) -> DatabaseOperation: + """Build the insert database operation. + + :param uuid: The identifier of the entity. + :param name: The name of the entity. + :param version: The version of the entity. + :param schema: The schema of the entity. + :param data: The data of the entity. + :param created_at: The creation datetime. + :param updated_at: The last update datetime. + :param transaction_uuid: The transaction identifier. + :return: A ``DatabaseOperation`` instance. + """ + + @abstractmethod + def build_query( + self, + name: str, + condition: _Condition, + ordering: Optional[_Ordering], + limit: Optional[int], + transaction_uuids: tuple[UUID, ...], + exclude_deleted: bool, + ) -> DatabaseOperation: + """Build the query database operation. + + :param name: Class name of the ``RootEntity``. + :param condition: The condition that must be satisfied by the ``RootEntity`` instances. + :param ordering: Optional argument to return the instance with specific ordering strategy. The default behaviour + is to retrieve them without any order pattern. + :param limit: Optional argument to return only a subset of instances. The default behaviour is to return all the + instances that meet the given condition. + :param transaction_uuids: The transaction within the operation is performed. If not any value is provided, then + the transaction is extracted from the context var. If not any transaction is being scoped then the query is + performed to the global snapshot. + :param exclude_deleted: If ``True``, deleted ``RootEntity`` entries are included, otherwise deleted + ``RootEntity`` entries are filtered. + :return: A ``DatabaseOperation`` instance. + """ + + @abstractmethod + def build_submit_offset(self, value: int) -> DatabaseOperation: + """Build the database operation to store the offset. + + :param value: The value to be stored as the new offset. + :return: A ``DatabaseOperation`` instance. + """ + + @abstractmethod + def build_query_offset(self) -> DatabaseOperation: + """Build the database operation to get the current offset. + + :return: A ``DatabaseOperation`` instance. + """ diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/writers.py b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/repositories/database/impl.py similarity index 59% rename from packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/writers.py rename to packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/repositories/database/impl.py index 23fecf450..2f80ae02b 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/writers.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/repositories/database/impl.py @@ -2,63 +2,80 @@ annotations, ) +from collections.abc import ( + AsyncIterator, +) from typing import ( TYPE_CHECKING, - Type, + Optional, ) from uuid import ( UUID, ) from minos.common import ( + NULL_UUID, + DatabaseMixin, Inject, NotProvidedException, + ProgrammingException, import_module, ) -from ...events import ( +from ....events import ( Event, EventEntry, EventRepository, ) -from ...exceptions import ( +from ....exceptions import ( NotFoundException, SnapshotRepositoryConflictException, TransactionNotFoundException, ) -from ...transactions import ( +from ....queries import ( + _Condition, + _Ordering, +) +from ....transactions import ( + TransactionEntry, TransactionRepository, TransactionStatus, ) -from ..entries import ( +from ...entries import ( SnapshotEntry, ) -from .abc import ( - PostgreSqlSnapshotSetup, +from ..abc import ( + SnapshotRepository, ) -from .readers import ( - PostgreSqlSnapshotReader, +from .factories import ( + SnapshotDatabaseOperationFactory, ) if TYPE_CHECKING: - from ...entities import ( + from ....entities import ( RootEntity, ) -class PostgreSqlSnapshotWriter(PostgreSqlSnapshotSetup): - """Minos Snapshot Dispatcher class.""" +class DatabaseSnapshotRepository(SnapshotRepository, DatabaseMixin[SnapshotDatabaseOperationFactory]): + """Database Snapshot Repository class. + + The snapshot provides a direct accessor to the ``RootEntity`` instances stored as events by the event repository + class. + """ @Inject() def __init__( self, *args, - reader: PostgreSqlSnapshotReader, event_repository: EventRepository, transaction_repository: TransactionRepository, + database_key: Optional[tuple[str]] = None, **kwargs, ): - super().__init__(*args, **kwargs) + if database_key is None: + database_key = ("aggregate", "snapshot") + super().__init__(*args, database_key=database_key, **kwargs) if event_repository is None: raise NotProvidedException("An event repository instance is required.") @@ -66,17 +83,47 @@ def __init__( if transaction_repository is None: raise NotProvidedException("A transaction repository instance is required.") - self._reader = reader self._event_repository = event_repository self._transaction_repository = transaction_repository + async def _setup(self) -> None: + operation = self.database_operation_factory.build_create() + await self.execute_on_database(operation) + + async def _destroy(self) -> None: + await super()._destroy() + + # noinspection PyUnusedLocal + async def _find_entries( + self, + name: str, + condition: _Condition, + ordering: Optional[_Ordering], + limit: Optional[int], + streaming_mode: bool, + transaction: Optional[TransactionEntry], + exclude_deleted: bool, + **kwargs, + ) -> AsyncIterator[SnapshotEntry]: + if transaction is None: + transaction_uuids = (NULL_UUID,) + else: + transaction_uuids = await transaction.uuids + + operation = self.database_operation_factory.build_query( + name, condition, ordering, limit, transaction_uuids, exclude_deleted + ) + + async for row in self.execute_on_database_and_fetch_all(operation, streaming_mode=streaming_mode): + yield SnapshotEntry(*row) + async def is_synced(self, name: str, **kwargs) -> bool: """Check if the snapshot has the latest version of a ``RootEntity`` instance. :param name: Class name of the ``RootEntity`` to be checked. :return: ``True`` if it has the latest version for the identifier or ``False`` otherwise. """ - offset = await self._load_offset(**kwargs) + offset = await self._load_offset() iterable = self._event_repository.select(id_gt=offset, name=name, **kwargs) try: await iterable.__anext__() @@ -84,12 +131,8 @@ async def is_synced(self, name: str, **kwargs) -> bool: except StopAsyncIteration: return True - async def dispatch(self, **kwargs) -> None: - """Perform a dispatching step, based on the sequence of non already processed ``EventEntry`` objects. - - :return: This method does not return anything. - """ - initial_offset = await self._load_offset(**kwargs) + async def _synchronize(self, **kwargs) -> None: + initial_offset = await self._load_offset() offset = initial_offset async for event_entry in self._event_repository.select(id_gt=offset, **kwargs): @@ -104,33 +147,35 @@ async def dispatch(self, **kwargs) -> None: await self._store_offset(offset) - async def _load_offset(self, **kwargs) -> int: + async def _load_offset(self) -> int: + operation = self.database_operation_factory.build_query_offset() # noinspection PyBroadException try: - raw = await self.submit_query_and_fetchone(_SELECT_OFFSET_QUERY, **kwargs) - return raw[0] - except Exception: + row = await self.execute_on_database_and_fetch_one(operation) + except ProgrammingException: return 0 + return row[0] async def _store_offset(self, offset: int) -> None: - await self.submit_query(_INSERT_OFFSET_QUERY, {"value": offset}, lock="insert_snapshot_aux_offset") + operation = self.database_operation_factory.build_submit_offset(offset) + await self.execute_on_database(operation) async def _dispatch_one(self, event_entry: EventEntry, **kwargs) -> SnapshotEntry: if event_entry.action.is_delete: - return await self._submit_delete(event_entry, **kwargs) + return await self._submit_delete(event_entry) return await self._submit_update_or_create(event_entry, **kwargs) - async def _submit_delete(self, event_entry: EventEntry, **kwargs) -> SnapshotEntry: + async def _submit_delete(self, event_entry: EventEntry) -> SnapshotEntry: snapshot_entry = SnapshotEntry.from_event_entry(event_entry) - snapshot_entry = await self._submit_entry(snapshot_entry, **kwargs) + snapshot_entry = await self._submit_entry(snapshot_entry) return snapshot_entry async def _submit_update_or_create(self, event_entry: EventEntry, **kwargs) -> SnapshotEntry: instance = await self._build_instance(event_entry, **kwargs) snapshot_entry = SnapshotEntry.from_root_entity(instance, transaction_uuid=event_entry.transaction_uuid) - snapshot_entry = await self._submit_entry(snapshot_entry, **kwargs) + snapshot_entry = await self._submit_entry(snapshot_entry) return snapshot_entry async def _build_instance(self, event_entry: EventEntry, **kwargs) -> RootEntity: @@ -151,7 +196,7 @@ async def _update_instance_if_exists(self, event: Event, **kwargs) -> RootEntity previous = await self._select_one_instance(event.name, event.uuid, **kwargs) except NotFoundException: # noinspection PyTypeChecker - cls: Type[RootEntity] = import_module(event.name) + cls = import_module(event.name) return cls.from_diff(event, **kwargs) if previous.version >= event.version: @@ -161,12 +206,12 @@ async def _update_instance_if_exists(self, event: Event, **kwargs) -> RootEntity return previous async def _select_one_instance(self, name: str, uuid: UUID, **kwargs) -> RootEntity: - snapshot_entry = await self._reader.get_entry(name, uuid, **kwargs) + snapshot_entry = await self.get_entry(name, uuid, **kwargs) return snapshot_entry.build(**kwargs) - async def _submit_entry(self, snapshot_entry: SnapshotEntry, **kwargs) -> SnapshotEntry: - params = snapshot_entry.as_raw() - response = await self.submit_query_and_fetchone(_INSERT_ONE_SNAPSHOT_ENTRY_QUERY, params, **kwargs) + async def _submit_entry(self, snapshot_entry: SnapshotEntry) -> SnapshotEntry: + operation = self.database_operation_factory.build_submit(**snapshot_entry.as_raw()) + response = await self.execute_on_database_and_fetch_one(operation) snapshot_entry.created_at, snapshot_entry.updated_at = response @@ -178,41 +223,5 @@ async def _clean_transactions(self, offset: int, **kwargs) -> None: ) transaction_uuids = {transaction.uuid async for transaction in iterable} if len(transaction_uuids): - await self.submit_query(_DELETE_SNAPSHOT_ENTRIES_QUERY, {"transaction_uuids": tuple(transaction_uuids)}) - - -_INSERT_ONE_SNAPSHOT_ENTRY_QUERY = """ -INSERT INTO snapshot (uuid, name, version, schema, data, created_at, updated_at, transaction_uuid) -VALUES ( - %(uuid)s, - %(name)s, - %(version)s, - %(schema)s, - %(data)s, - %(created_at)s, - %(updated_at)s, - %(transaction_uuid)s -) -ON CONFLICT (uuid, transaction_uuid) -DO - UPDATE SET version = %(version)s, schema = %(schema)s, data = %(data)s, updated_at = %(updated_at)s -RETURNING created_at, updated_at; -""".strip() - -_DELETE_SNAPSHOT_ENTRIES_QUERY = """ -DELETE FROM snapshot -WHERE transaction_uuid IN %(transaction_uuids)s; -""".strip() - -_SELECT_OFFSET_QUERY = """ -SELECT value -FROM snapshot_aux_offset -WHERE id = TRUE; -""" - -_INSERT_OFFSET_QUERY = """ -INSERT INTO snapshot_aux_offset (id, value) -VALUES (TRUE, %(value)s) -ON CONFLICT (id) -DO UPDATE SET value = GREATEST(%(value)s, (SELECT value FROM snapshot_aux_offset WHERE id = TRUE)); -""".strip() + operation = self.database_operation_factory.build_delete(transaction_uuids) + await self.execute_on_database(operation) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/memory.py b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/repositories/memory.py similarity index 62% rename from packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/memory.py rename to packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/repositories/memory.py index c74df9a10..cc8ecfb69 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/memory.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/repositories/memory.py @@ -2,11 +2,16 @@ annotations, ) +from contextlib import ( + suppress, +) +from functools import ( + cmp_to_key, +) from operator import ( attrgetter, ) from typing import ( - TYPE_CHECKING, AsyncIterator, Optional, ) @@ -20,32 +25,29 @@ NotProvidedException, ) -from ..events import ( +from ...events import ( EventEntry, EventRepository, ) -from ..exceptions import ( +from ...exceptions import ( AlreadyDeletedException, - NotFoundException, ) -from ..queries import ( +from ...queries import ( _Condition, _Ordering, ) -from ..transactions import ( +from ...transactions import ( TransactionEntry, TransactionRepository, TransactionStatus, ) +from ..entries import ( + SnapshotEntry, +) from .abc import ( SnapshotRepository, ) -if TYPE_CHECKING: - from ..entities import ( - RootEntity, - ) - class InMemorySnapshotRepository(SnapshotRepository): """InMemory Snapshot class. @@ -73,46 +75,66 @@ def __init__( self._event_repository = event_repository self._transaction_repository = transaction_repository - async def _find( + async def _find_entries( self, name: str, condition: _Condition, - ordering: Optional[_Ordering] = None, - limit: Optional[int] = None, + ordering: Optional[_Ordering], + limit: Optional[int], + exclude_deleted: bool, **kwargs, - ) -> AsyncIterator[RootEntity]: + ) -> AsyncIterator[SnapshotEntry]: uuids = {v.uuid async for v in self._event_repository.select(name=name)} - instances = list() + entries = list() for uuid in uuids: + entry = await self._get(name, uuid, **kwargs) + try: - instance = await self.get(name, uuid, **kwargs) + instance = entry.build() + if condition.evaluate(instance): + entries.append(entry) except AlreadyDeletedException: - continue - - if condition.evaluate(instance): - instances.append(instance) + # noinspection PyTypeChecker + if not exclude_deleted and condition.evaluate(entry): + entries.append(entry) if ordering is not None: - instances.sort(key=attrgetter(ordering.by), reverse=ordering.reverse) + + def _cmp(a: SnapshotEntry, b: SnapshotEntry) -> int: + with suppress(AlreadyDeletedException): + with suppress(AlreadyDeletedException): + try: + aa = attrgetter(ordering.by)(a.build()) + except AlreadyDeletedException: + aa = attrgetter(ordering.by)(a) + with suppress(AlreadyDeletedException): + try: + bb = attrgetter(ordering.by)(b.build()) + except AlreadyDeletedException: + bb = attrgetter(ordering.by)(b) + + if aa > bb: + return 1 + elif aa < bb: + return -1 + + return 0 + + entries.sort(key=cmp_to_key(_cmp), reverse=ordering.reverse) if limit is not None: - instances = instances[:limit] + entries = entries[:limit] - for instance in instances: - yield instance + for entry in entries: + yield entry # noinspection PyMethodOverriding - async def _get(self, name: str, uuid: UUID, transaction: Optional[TransactionEntry] = None, **kwargs) -> RootEntity: + async def _get( + self, name: str, uuid: UUID, transaction: Optional[TransactionEntry] = None, **kwargs + ) -> SnapshotEntry: transaction_uuids = await self._get_transaction_uuids(transaction) entries = await self._get_event_entries(name, uuid, transaction_uuids) - - if not len(entries): - raise NotFoundException(f"Not found any entries for the {uuid!r} id.") - - if entries[-1].action.is_delete: - raise AlreadyDeletedException(f"The {uuid!r} identifier belongs to an already deleted instance.") - return self._build_instance(entries, **kwargs) async def _get_transaction_uuids(self, transaction: Optional[TransactionEntry]) -> tuple[UUID, ...]: @@ -147,12 +169,18 @@ async def _get_event_entries(self, name: str, uuid: UUID, transaction_uuids: tup return entries @staticmethod - def _build_instance(entries: list[EventEntry], **kwargs) -> RootEntity: + def _build_instance(entries: list[EventEntry], **kwargs) -> SnapshotEntry: + if entries[-1].action.is_delete: + return SnapshotEntry.from_event_entry(entries[-1]) + cls = entries[0].type_ instance = cls.from_diff(entries[0].event, **kwargs) for entry in entries[1:]: instance.apply_diff(entry.event) - return instance + + snapshot = SnapshotEntry.from_root_entity(instance) + + return snapshot async def _synchronize(self, **kwargs) -> None: pass diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/services.py b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/services.py index cd27c022e..b77ab3f4c 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/services.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/services.py @@ -30,7 +30,7 @@ enroute, ) -from .abc import ( +from .repositories import ( SnapshotRepository, ) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/testing/__init__.py b/packages/core/minos-microservice-aggregate/minos/aggregate/testing/__init__.py new file mode 100644 index 000000000..9d205beed --- /dev/null +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/testing/__init__.py @@ -0,0 +1,12 @@ +from .events import ( + EventRepositoryTestCase, + MockedEventDatabaseOperationFactory, +) +from .snapshots import ( + MockedSnapshotDatabaseOperationFactory, + SnapshotRepositoryTestCase, +) +from .transactions import ( + MockedTransactionDatabaseOperationFactory, + TransactionRepositoryTestCase, +) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/testing/events/__init__.py b/packages/core/minos-microservice-aggregate/minos/aggregate/testing/events/__init__.py new file mode 100644 index 000000000..33ee0ba5f --- /dev/null +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/testing/events/__init__.py @@ -0,0 +1,4 @@ +from .repositories import ( + EventRepositoryTestCase, + MockedEventDatabaseOperationFactory, +) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/testing/events/repositories/__init__.py b/packages/core/minos-microservice-aggregate/minos/aggregate/testing/events/repositories/__init__.py new file mode 100644 index 000000000..f8147fc40 --- /dev/null +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/testing/events/repositories/__init__.py @@ -0,0 +1,6 @@ +from .factories import ( + MockedEventDatabaseOperationFactory, +) +from .testcases import ( + EventRepositoryTestCase, +) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/testing/events/repositories/factories.py b/packages/core/minos-microservice-aggregate/minos/aggregate/testing/events/repositories/factories.py new file mode 100644 index 000000000..8bf90cf35 --- /dev/null +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/testing/events/repositories/factories.py @@ -0,0 +1,77 @@ +from datetime import ( + datetime, +) +from typing import ( + Optional, +) +from uuid import ( + UUID, +) + +from minos.common import ( + DatabaseOperation, +) +from minos.common.testing import ( + MockedDatabaseClient, + MockedDatabaseOperation, +) + +from ....actions import ( + Action, +) +from ....events import ( + EventDatabaseOperationFactory, +) + + +class MockedEventDatabaseOperationFactory(EventDatabaseOperationFactory): + """For testing purposes.""" + + def build_create(self) -> DatabaseOperation: + """For testing purposes.""" + return MockedDatabaseOperation("create") + + def build_submit( + self, + transaction_uuids: tuple[UUID], + uuid: UUID, + action: Action, + name: str, + version: int, + data: bytes, + created_at: datetime, + transaction_uuid: UUID, + lock: Optional[int], + **kwargs, + ) -> DatabaseOperation: + """For testing purposes.""" + return MockedDatabaseOperation("submit") + + def build_query( + self, + uuid: Optional[UUID] = None, + name: Optional[str] = None, + version: Optional[int] = None, + version_lt: Optional[int] = None, + version_gt: Optional[int] = None, + version_le: Optional[int] = None, + version_ge: Optional[int] = None, + id: Optional[int] = None, + id_lt: Optional[int] = None, + id_gt: Optional[int] = None, + id_le: Optional[int] = None, + id_ge: Optional[int] = None, + transaction_uuid: Optional[UUID] = None, + transaction_uuid_ne: Optional[UUID] = None, + transaction_uuid_in: Optional[tuple[UUID, ...]] = None, + **kwargs, + ) -> DatabaseOperation: + """For testing purposes.""" + return MockedDatabaseOperation("select_rows") + + def build_query_offset(self) -> DatabaseOperation: + """For testing purposes.""" + return MockedDatabaseOperation("select_max_id") + + +MockedDatabaseClient.set_factory(EventDatabaseOperationFactory, MockedEventDatabaseOperationFactory) diff --git a/packages/core/minos-microservice-aggregate/tests/testcases/event_repository.py b/packages/core/minos-microservice-aggregate/minos/aggregate/testing/events/repositories/testcases.py similarity index 82% rename from packages/core/minos-microservice-aggregate/tests/testcases/event_repository.py rename to packages/core/minos-microservice-aggregate/minos/aggregate/testing/events/repositories/testcases.py index bbbddc800..e7d8ee72e 100644 --- a/packages/core/minos-microservice-aggregate/tests/testcases/event_repository.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/testing/events/repositories/testcases.py @@ -28,22 +28,126 @@ NULL_UUID, current_datetime, ) -from tests.utils import ( +from minos.common.testing import ( MinosTestCase, ) -class EventRepositoryTestCase(MinosTestCase): +class EventRepositoryTestCase(MinosTestCase, ABC): + __test__ = False + def setUp(self) -> None: super().setUp() - self.uuid = uuid4() - self.event_repository = self.build_event_repository() self.field_diff_container_patcher = patch( "minos.aggregate.FieldDiffContainer.from_avro_bytes", return_value=FieldDiffContainer.empty() ) self.field_diff_container_patcher.start() + self.uuid = uuid4() + self.uuid_1 = uuid4() + self.uuid_2 = uuid4() + self.uuid_4 = uuid4() + + self.first_transaction = uuid4() + self.second_transaction = uuid4() + + self.entries = [ + EventEntry( + self.uuid_1, + "example.Car", + 1, + bytes("foo", "utf-8"), + 1, + Action.CREATE, + current_datetime(), + ), + EventEntry( + self.uuid_1, + "example.Car", + 2, + bytes("bar", "utf-8"), + 2, + Action.UPDATE, + current_datetime(), + ), + EventEntry( + self.uuid_2, + "example.Car", + 1, + bytes("hello", "utf-8"), + 3, + Action.CREATE, + current_datetime(), + ), + EventEntry( + self.uuid_1, + "example.Car", + 3, + bytes("foobar", "utf-8"), + 4, + Action.UPDATE, + current_datetime(), + ), + EventEntry( + self.uuid_1, + "example.Car", + 4, + bytes(), + 5, + Action.DELETE, + current_datetime(), + ), + EventEntry( + self.uuid_2, + "example.Car", + 2, + bytes("bye", "utf-8"), + 6, + Action.UPDATE, + current_datetime(), + ), + EventEntry( + self.uuid_4, + "example.MotorCycle", + 1, + bytes("one", "utf-8"), + 7, + Action.CREATE, + current_datetime(), + ), + EventEntry( + self.uuid_2, + "example.Car", + 3, + bytes("hola", "utf-8"), + 8, + Action.UPDATE, + current_datetime(), + transaction_uuid=self.first_transaction, + ), + EventEntry( + self.uuid_2, + "example.Car", + 3, + bytes("salut", "utf-8"), + 9, + Action.UPDATE, + current_datetime(), + transaction_uuid=self.second_transaction, + ), + EventEntry( + self.uuid_2, + "example.Car", + 4, + bytes("adios", "utf-8"), + 10, + Action.UPDATE, + current_datetime(), + transaction_uuid=self.first_transaction, + ), + ] + async def asyncSetUp(self): await super().asyncSetUp() await self.event_repository.setup() @@ -56,6 +160,27 @@ def tearDown(self): self.field_diff_container_patcher.stop() super().tearDown() + async def populate(self) -> None: + await self.transaction_repository.submit(TransactionEntry(self.first_transaction)) + await self.transaction_repository.submit(TransactionEntry(self.second_transaction)) + + await self.event_repository.create(EventEntry(self.uuid_1, "example.Car", 1, bytes("foo", "utf-8"))) + await self.event_repository.update(EventEntry(self.uuid_1, "example.Car", 2, bytes("bar", "utf-8"))) + await self.event_repository.create(EventEntry(self.uuid_2, "example.Car", 1, bytes("hello", "utf-8"))) + await self.event_repository.update(EventEntry(self.uuid_1, "example.Car", 3, bytes("foobar", "utf-8"))) + await self.event_repository.delete(EventEntry(self.uuid_1, "example.Car", 4)) + await self.event_repository.update(EventEntry(self.uuid_2, "example.Car", 2, bytes("bye", "utf-8"))) + await self.event_repository.create(EventEntry(self.uuid_4, "example.MotorCycle", 1, bytes("one", "utf-8"))) + await self.event_repository.update( + EventEntry(self.uuid_2, "example.Car", 3, bytes("hola", "utf-8"), transaction_uuid=self.first_transaction) + ) + await self.event_repository.update( + EventEntry(self.uuid_2, "example.Car", 3, bytes("salut", "utf-8"), transaction_uuid=self.second_transaction) + ) + await self.event_repository.update( + EventEntry(self.uuid_2, "example.Car", 4, bytes("adios", "utf-8"), transaction_uuid=self.first_transaction) + ) + @abstractmethod def build_event_repository(self) -> EventRepository: """For testing purposes.""" @@ -75,10 +200,6 @@ def assert_equal_repository_entries(self, expected: list[EventEntry], observed: self.assertEqual(e.action, o.action) self.assertAlmostEqual(e.created_at or current_datetime(), o.created_at, delta=timedelta(seconds=5)) - -class EventRepositorySubmitTestCase(EventRepositoryTestCase, ABC): - __test__ = False - async def test_generate_uuid(self): await self.event_repository.create(EventEntry(NULL_UUID, "example.Car", 1, bytes("foo", "utf-8"))) observed = [v async for v in self.event_repository.select()] @@ -124,133 +245,68 @@ async def test_offset(self): await self.event_repository.submit(EventEntry(self.uuid, "example.Car", version=3, action=Action.CREATE)) self.assertEqual(1, await self.event_repository.offset) - -class EventRepositorySelectTestCase(EventRepositoryTestCase, ABC): - __test__ = False - - def setUp(self) -> None: - super().setUp() - - self.uuid_1 = uuid4() - self.uuid_2 = uuid4() - self.uuid_4 = uuid4() - - self.first_transaction = uuid4() - self.second_transaction = uuid4() - - self.entries = [ - EventEntry(self.uuid_1, "example.Car", 1, bytes("foo", "utf-8"), 1, Action.CREATE), - EventEntry(self.uuid_1, "example.Car", 2, bytes("bar", "utf-8"), 2, Action.UPDATE), - EventEntry(self.uuid_2, "example.Car", 1, bytes("hello", "utf-8"), 3, Action.CREATE), - EventEntry(self.uuid_1, "example.Car", 3, bytes("foobar", "utf-8"), 4, Action.UPDATE), - EventEntry(self.uuid_1, "example.Car", 4, bytes(), 5, Action.DELETE), - EventEntry(self.uuid_2, "example.Car", 2, bytes("bye", "utf-8"), 6, Action.UPDATE), - EventEntry(self.uuid_4, "example.MotorCycle", 1, bytes("one", "utf-8"), 7, Action.CREATE), - EventEntry( - self.uuid_2, - "example.Car", - 3, - bytes("hola", "utf-8"), - 8, - Action.UPDATE, - transaction_uuid=self.first_transaction, - ), - EventEntry( - self.uuid_2, - "example.Car", - 3, - bytes("salut", "utf-8"), - 9, - Action.UPDATE, - transaction_uuid=self.second_transaction, - ), - EventEntry( - self.uuid_2, - "example.Car", - 4, - bytes("adios", "utf-8"), - 10, - Action.UPDATE, - transaction_uuid=self.first_transaction, - ), - ] - - async def asyncSetUp(self): - await super().asyncSetUp() - await self._populate() - - async def _populate(self): - await self.transaction_repository.submit(TransactionEntry(self.first_transaction)) - await self.transaction_repository.submit(TransactionEntry(self.second_transaction)) - - await self.event_repository.create(EventEntry(self.uuid_1, "example.Car", 1, bytes("foo", "utf-8"))) - await self.event_repository.update(EventEntry(self.uuid_1, "example.Car", 2, bytes("bar", "utf-8"))) - await self.event_repository.create(EventEntry(self.uuid_2, "example.Car", 1, bytes("hello", "utf-8"))) - await self.event_repository.update(EventEntry(self.uuid_1, "example.Car", 3, bytes("foobar", "utf-8"))) - await self.event_repository.delete(EventEntry(self.uuid_1, "example.Car", 4)) - await self.event_repository.update(EventEntry(self.uuid_2, "example.Car", 2, bytes("bye", "utf-8"))) - await self.event_repository.create(EventEntry(self.uuid_4, "example.MotorCycle", 1, bytes("one", "utf-8"))) - await self.event_repository.update( - EventEntry(self.uuid_2, "example.Car", 3, bytes("hola", "utf-8"), transaction_uuid=self.first_transaction) - ) - await self.event_repository.update( - EventEntry(self.uuid_2, "example.Car", 3, bytes("salut", "utf-8"), transaction_uuid=self.second_transaction) - ) - await self.event_repository.update( - EventEntry(self.uuid_2, "example.Car", 4, bytes("adios", "utf-8"), transaction_uuid=self.first_transaction) - ) - async def test_select(self): + await self.populate() expected = self.entries observed = [v async for v in self.event_repository.select()] self.assert_equal_repository_entries(expected, observed) async def test_select_id(self): + await self.populate() expected = [self.entries[1]] observed = [v async for v in self.event_repository.select(id=2)] self.assert_equal_repository_entries(expected, observed) async def test_select_id_lt(self): + await self.populate() expected = self.entries[:4] observed = [v async for v in self.event_repository.select(id_lt=5)] self.assert_equal_repository_entries(expected, observed) async def test_select_id_gt(self): + await self.populate() expected = self.entries[4:] observed = [v async for v in self.event_repository.select(id_gt=4)] self.assert_equal_repository_entries(expected, observed) async def test_select_id_le(self): + await self.populate() expected = self.entries[:4] observed = [v async for v in self.event_repository.select(id_le=4)] self.assert_equal_repository_entries(expected, observed) async def test_select_id_ge(self): + await self.populate() expected = self.entries[4:] observed = [v async for v in self.event_repository.select(id_ge=5)] self.assert_equal_repository_entries(expected, observed) async def test_select_uuid(self): + await self.populate() expected = [self.entries[2], self.entries[5], self.entries[7], self.entries[8], self.entries[9]] observed = [v async for v in self.event_repository.select(uuid=self.uuid_2)] self.assert_equal_repository_entries(expected, observed) async def test_select_name(self): + await self.populate() expected = [self.entries[6]] observed = [v async for v in self.event_repository.select(name="example.MotorCycle")] self.assert_equal_repository_entries(expected, observed) async def test_select_version(self): + await self.populate() expected = [self.entries[4], self.entries[9]] observed = [v async for v in self.event_repository.select(version=4)] self.assert_equal_repository_entries(expected, observed) async def test_select_version_lt(self): + await self.populate() expected = [self.entries[0], self.entries[2], self.entries[6]] observed = [v async for v in self.event_repository.select(version_lt=2)] self.assert_equal_repository_entries(expected, observed) async def test_select_version_gt(self): + await self.populate() expected = [ self.entries[1], self.entries[3], @@ -264,11 +320,13 @@ async def test_select_version_gt(self): self.assert_equal_repository_entries(expected, observed) async def test_select_version_le(self): + await self.populate() expected = [self.entries[0], self.entries[2], self.entries[6]] observed = [v async for v in self.event_repository.select(version_le=1)] self.assert_equal_repository_entries(expected, observed) async def test_select_version_ge(self): + await self.populate() expected = [ self.entries[1], self.entries[3], @@ -282,21 +340,25 @@ async def test_select_version_ge(self): self.assert_equal_repository_entries(expected, observed) async def test_select_transaction_uuid_null(self): + await self.populate() expected = self.entries[:7] observed = [v async for v in self.event_repository.select(transaction_uuid=NULL_UUID)] self.assert_equal_repository_entries(expected, observed) async def test_select_transaction_uuid(self): + await self.populate() expected = [self.entries[7], self.entries[9]] observed = [v async for v in self.event_repository.select(transaction_uuid=self.first_transaction)] self.assert_equal_repository_entries(expected, observed) async def test_select_transaction_uuid_ne(self): + await self.populate() expected = [self.entries[7], self.entries[8], self.entries[9]] observed = [v async for v in self.event_repository.select(transaction_uuid_ne=NULL_UUID)] self.assert_equal_repository_entries(expected, observed) async def test_select_transaction_uuid_in(self): + await self.populate() expected = [self.entries[7], self.entries[8], self.entries[9]] observed = [ v @@ -307,6 +369,7 @@ async def test_select_transaction_uuid_in(self): self.assert_equal_repository_entries(expected, observed) async def test_select_combined(self): + await self.populate() expected = [self.entries[2], self.entries[5], self.entries[7], self.entries[8], self.entries[9]] observed = [v async for v in self.event_repository.select(name="example.Car", uuid=self.uuid_2)] self.assert_equal_repository_entries(expected, observed) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/testing/snapshots/__init__.py b/packages/core/minos-microservice-aggregate/minos/aggregate/testing/snapshots/__init__.py new file mode 100644 index 000000000..6395db04a --- /dev/null +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/testing/snapshots/__init__.py @@ -0,0 +1,4 @@ +from .repositories import ( + MockedSnapshotDatabaseOperationFactory, + SnapshotRepositoryTestCase, +) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/testing/snapshots/repositories/__init__.py b/packages/core/minos-microservice-aggregate/minos/aggregate/testing/snapshots/repositories/__init__.py new file mode 100644 index 000000000..46b611965 --- /dev/null +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/testing/snapshots/repositories/__init__.py @@ -0,0 +1,6 @@ +from .factories import ( + MockedSnapshotDatabaseOperationFactory, +) +from .testcases import ( + SnapshotRepositoryTestCase, +) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/testing/snapshots/repositories/factories.py b/packages/core/minos-microservice-aggregate/minos/aggregate/testing/snapshots/repositories/factories.py new file mode 100644 index 000000000..183092f8b --- /dev/null +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/testing/snapshots/repositories/factories.py @@ -0,0 +1,78 @@ +from collections.abc import ( + Iterable, +) +from datetime import ( + datetime, +) +from typing import ( + Any, + Optional, +) +from uuid import ( + UUID, +) + +from minos.common import ( + DatabaseOperation, +) +from minos.common.testing import ( + MockedDatabaseClient, + MockedDatabaseOperation, +) + +from ....queries import ( + _Condition, + _Ordering, +) +from ....snapshots import ( + SnapshotDatabaseOperationFactory, +) + + +class MockedSnapshotDatabaseOperationFactory(SnapshotDatabaseOperationFactory): + """For testing purposes.""" + + def build_create(self) -> DatabaseOperation: + """For testing purposes.""" + return MockedDatabaseOperation("create") + + def build_delete(self, transaction_uuids: Iterable[UUID]) -> DatabaseOperation: + """For testing purposes.""" + return MockedDatabaseOperation("delete") + + def build_submit( + self, + uuid: UUID, + name: str, + version: int, + schema: bytes, + data: dict[str, Any], + created_at: datetime, + updated_at: datetime, + transaction_uuid: UUID, + ) -> DatabaseOperation: + """For testing purposes.""" + return MockedDatabaseOperation("insert") + + def build_query( + self, + name: str, + condition: _Condition, + ordering: Optional[_Ordering], + limit: Optional[int], + transaction_uuids: tuple[UUID, ...], + exclude_deleted: bool, + ) -> DatabaseOperation: + """For testing purposes.""" + return MockedDatabaseOperation("query") + + def build_submit_offset(self, value: int) -> DatabaseOperation: + """For testing purposes.""" + return MockedDatabaseOperation("store_offset") + + def build_query_offset(self) -> DatabaseOperation: + """For testing purposes.""" + return MockedDatabaseOperation("get_offset") + + +MockedDatabaseClient.set_factory(SnapshotDatabaseOperationFactory, MockedSnapshotDatabaseOperationFactory) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/testing/snapshots/repositories/testcases.py b/packages/core/minos-microservice-aggregate/minos/aggregate/testing/snapshots/repositories/testcases.py new file mode 100644 index 000000000..edf0dc10b --- /dev/null +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/testing/snapshots/repositories/testcases.py @@ -0,0 +1,623 @@ +from __future__ import ( + annotations, +) + +from abc import ( + ABC, + abstractmethod, +) +from datetime import ( + timedelta, +) +from typing import ( + Optional, +) +from unittest.mock import ( + MagicMock, + call, +) +from uuid import ( + uuid4, +) + +from minos.aggregate import ( + Action, + AlreadyDeletedException, + Condition, + EventEntry, + FieldDiff, + FieldDiffContainer, + NotFoundException, + Ordering, + Ref, + RootEntity, + SnapshotEntry, + SnapshotRepository, + TransactionEntry, + TransactionStatus, +) +from minos.common import ( + classname, + current_datetime, +) +from minos.common.testing import ( + MinosTestCase, +) + + +class SnapshotRepositoryTestCase(MinosTestCase, ABC): + __test__ = False + + snapshot_repository: SnapshotRepository + + class Owner(RootEntity): + """For testing purposes""" + + name: str + surname: str + age: Optional[int] + + class Car(RootEntity): + """For testing purposes""" + + doors: int + color: str + owner: Optional[Ref[SnapshotRepositoryTestCase.Owner]] + + def setUp(self) -> None: + super().setUp() + self.snapshot_repository = self.build_snapshot_repository() + + self.uuid_1 = uuid4() + self.uuid_2 = uuid4() + self.uuid_3 = uuid4() + + self.transaction_1 = uuid4() + self.transaction_2 = uuid4() + self.transaction_3 = uuid4() + self.transaction_4 = uuid4() + + @abstractmethod + def build_snapshot_repository(self) -> SnapshotRepository: + pass + + async def populate(self) -> None: + diff = FieldDiffContainer([FieldDiff("doors", int, 3), FieldDiff("color", str, "blue")]) + name: str = classname(self.Car) + + await self.event_repository.create(EventEntry(self.uuid_1, name, 1, diff.avro_bytes)) + await self.event_repository.update(EventEntry(self.uuid_1, name, 2, diff.avro_bytes)) + await self.event_repository.create(EventEntry(self.uuid_2, name, 1, diff.avro_bytes)) + await self.event_repository.update(EventEntry(self.uuid_1, name, 3, diff.avro_bytes)) + await self.event_repository.delete(EventEntry(self.uuid_1, name, 4)) + await self.event_repository.update(EventEntry(self.uuid_2, name, 2, diff.avro_bytes)) + await self.event_repository.update( + EventEntry(self.uuid_2, name, 3, diff.avro_bytes, transaction_uuid=self.transaction_1) + ) + await self.event_repository.delete( + EventEntry(self.uuid_2, name, 3, bytes(), transaction_uuid=self.transaction_2) + ) + await self.event_repository.update( + EventEntry(self.uuid_2, name, 4, diff.avro_bytes, transaction_uuid=self.transaction_1) + ) + await self.event_repository.create(EventEntry(self.uuid_3, name, 1, diff.avro_bytes)) + await self.event_repository.delete( + EventEntry(self.uuid_2, name, 3, bytes(), transaction_uuid=self.transaction_3) + ) + await self.transaction_repository.submit( + TransactionEntry(self.transaction_1, TransactionStatus.PENDING, await self.event_repository.offset) + ) + await self.transaction_repository.submit( + TransactionEntry(self.transaction_2, TransactionStatus.PENDING, await self.event_repository.offset) + ) + await self.transaction_repository.submit( + TransactionEntry(self.transaction_3, TransactionStatus.REJECTED, await self.event_repository.offset) + ) + await self.transaction_repository.submit( + TransactionEntry( + self.transaction_4, TransactionStatus.REJECTED, await self.event_repository.offset, self.transaction_3 + ) + ) + + async def populate_and_synchronize(self): + await self.populate() + await self.synchronize() + + async def synchronize(self): + await self.snapshot_repository.synchronize() + + async def asyncSetUp(self): + await super().asyncSetUp() + await self.snapshot_repository.setup() + + async def asyncTearDown(self): + await self.snapshot_repository.destroy() + await super().asyncTearDown() + + def assert_equal_snapshot_entries(self, expected: list[SnapshotEntry], observed: list[SnapshotEntry]): + self.assertEqual(len(expected), len(observed)) + for exp, obs in zip(expected, observed): + if exp.data is None: + with self.assertRaises(AlreadyDeletedException): + # noinspection PyStatementEffect + obs.build() + else: + self.assertEqual(exp.build(), obs.build()) + self.assertAlmostEqual(exp.created_at or current_datetime(), obs.created_at, delta=timedelta(seconds=5)) + self.assertAlmostEqual(exp.updated_at or current_datetime(), obs.updated_at, delta=timedelta(seconds=5)) + + def test_type(self): + self.assertTrue(isinstance(self.snapshot_repository, SnapshotRepository)) + + async def test_dispatch(self): + await self.populate_and_synchronize() + + # noinspection PyTypeChecker + iterable = self.snapshot_repository.find_entries( + self.Car.classname, Condition.TRUE, Ordering.ASC("updated_at"), exclude_deleted=False + ) + observed = [v async for v in iterable] + + # noinspection PyTypeChecker + expected = [ + SnapshotEntry(self.uuid_1, self.Car.classname, 4), + SnapshotEntry.from_root_entity( + self.Car( + 3, + "blue", + uuid=self.uuid_2, + version=2, + created_at=observed[1].created_at, + updated_at=observed[1].updated_at, + ) + ), + SnapshotEntry.from_root_entity( + self.Car( + 3, + "blue", + uuid=self.uuid_3, + version=1, + created_at=observed[2].created_at, + updated_at=observed[2].updated_at, + ) + ), + ] + self.assert_equal_snapshot_entries(expected, observed) + + async def test_dispatch_first_transaction(self): + await self.populate_and_synchronize() + + # noinspection PyTypeChecker + iterable = self.snapshot_repository.find_entries( + self.Car.classname, + Condition.TRUE, + Ordering.ASC("updated_at"), + exclude_deleted=False, + transaction=TransactionEntry(self.transaction_1), + ) + observed = [v async for v in iterable] + + # noinspection PyTypeChecker + expected = [ + SnapshotEntry(self.uuid_1, self.Car.classname, 4), + SnapshotEntry.from_root_entity( + self.Car( + 3, + "blue", + uuid=self.uuid_2, + version=4, + created_at=observed[1].created_at, + updated_at=observed[1].updated_at, + ) + ), + SnapshotEntry.from_root_entity( + self.Car( + 3, + "blue", + uuid=self.uuid_3, + version=1, + created_at=observed[2].created_at, + updated_at=observed[2].updated_at, + ) + ), + ] + self.assert_equal_snapshot_entries(expected, observed) + + async def test_dispatch_second_transaction(self): + await self.populate_and_synchronize() + + # noinspection PyTypeChecker + iterable = self.snapshot_repository.find_entries( + self.Car.classname, + Condition.TRUE, + Ordering.ASC("updated_at"), + exclude_deleted=False, + transaction=TransactionEntry(self.transaction_2), + ) + observed = [v async for v in iterable] + + # noinspection PyTypeChecker + expected = [ + SnapshotEntry(self.uuid_1, self.Car.classname, 4), + SnapshotEntry(self.uuid_2, self.Car.classname, 4), + SnapshotEntry.from_root_entity( + self.Car( + 3, + "blue", + uuid=self.uuid_3, + version=1, + created_at=observed[2].created_at, + updated_at=observed[2].updated_at, + ) + ), + ] + self.assert_equal_snapshot_entries(expected, observed) + + async def test_dispatch_third_transaction(self): + await self.populate_and_synchronize() + + # noinspection PyTypeChecker + iterable = self.snapshot_repository.find_entries( + self.Car.classname, + Condition.TRUE, + Ordering.ASC("updated_at"), + exclude_deleted=False, + transaction_uuid=self.transaction_3, + ) + observed = [v async for v in iterable] + + # noinspection PyTypeChecker + expected = [ + SnapshotEntry(self.uuid_1, self.Car.classname, 4), + SnapshotEntry.from_root_entity( + self.Car( + 3, + "blue", + uuid=self.uuid_2, + version=2, + created_at=observed[1].created_at, + updated_at=observed[1].updated_at, + ) + ), + SnapshotEntry.from_root_entity( + self.Car( + 3, + "blue", + uuid=self.uuid_3, + version=1, + created_at=observed[2].created_at, + updated_at=observed[2].updated_at, + ) + ), + ] + self.assert_equal_snapshot_entries(expected, observed) + + async def test_dispatch_ignore_previous_version(self): + await self.populate() + diff = FieldDiffContainer([FieldDiff("doors", int, 3), FieldDiff("color", str, "blue")]) + # noinspection PyTypeChecker + name: str = self.Car.classname + condition = Condition.EQUAL("uuid", self.uuid_1) + + async def _fn(*args, id_gt: Optional[int] = None, **kwargs): + if id_gt is not None and id_gt > 0: + return + yield EventEntry(self.uuid_1, name, 1, diff.avro_bytes, 1, Action.CREATE, current_datetime()) + yield EventEntry(self.uuid_1, name, 3, diff.avro_bytes, 2, Action.CREATE, current_datetime()) + yield EventEntry(self.uuid_1, name, 2, diff.avro_bytes, 3, Action.CREATE, current_datetime()) + + self.event_repository.select = MagicMock(side_effect=_fn) + await self.snapshot_repository.synchronize() + + observed = [v async for v in self.snapshot_repository.find_entries(name, condition)] + + # noinspection PyTypeChecker + expected = [ + SnapshotEntry( + uuid=self.uuid_1, + name=name, + version=3, + schema=self.Car.avro_schema, + data=self.Car(3, "blue", uuid=self.uuid_1, version=1).avro_data, + created_at=observed[0].created_at, + updated_at=observed[0].updated_at, + ) + ] + self.assert_equal_snapshot_entries(expected, observed) + + async def test_dispatch_with_offset(self): + await self.populate() + + mock = MagicMock(side_effect=self.event_repository.select) + self.event_repository.select = mock + + await self.snapshot_repository.synchronize() + self.assertEqual(1, mock.call_count) + self.assertEqual(call(id_gt=0, synchronize=False), mock.call_args) + mock.reset_mock() + + # noinspection PyTypeChecker + entry = EventEntry( + uuid=self.uuid_3, + name=self.Car.classname, + data=FieldDiffContainer([FieldDiff("doors", int, 3), FieldDiff("color", str, "blue")]).avro_bytes, + ) + await self.event_repository.create(entry) + + await self.snapshot_repository.synchronize() + self.assertEqual(1, mock.call_count) + self.assertEqual(call(id_gt=11, synchronize=False), mock.call_args) + mock.reset_mock() + + await self.snapshot_repository.synchronize() + self.assertEqual(1, mock.call_count) + self.assertEqual(call(id_gt=12, synchronize=False), mock.call_args) + mock.reset_mock() + + await self.snapshot_repository.synchronize() + self.assertEqual(1, mock.call_count) + self.assertEqual(call(id_gt=12, synchronize=False), mock.call_args) + mock.reset_mock() + + async def test_find_by_uuid(self): + await self.populate_and_synchronize() + condition = Condition.IN("uuid", [self.uuid_2, self.uuid_3]) + + iterable = self.snapshot_repository.find(self.Car, condition, ordering=Ordering.ASC("updated_at")) + observed = [v async for v in iterable] + + expected = [ + self.Car( + 3, + "blue", + uuid=self.uuid_2, + version=2, + created_at=observed[0].created_at, + updated_at=observed[0].updated_at, + ), + self.Car( + 3, + "blue", + uuid=self.uuid_3, + version=1, + created_at=observed[1].created_at, + updated_at=observed[1].updated_at, + ), + ] + self.assertEqual(expected, observed) + + async def test_find_with_transaction(self): + await self.populate_and_synchronize() + condition = Condition.IN("uuid", [self.uuid_2, self.uuid_3]) + + iterable = self.snapshot_repository.find( + self.Car, + condition, + ordering=Ordering.ASC("updated_at"), + transaction=TransactionEntry(self.transaction_1), + ) + observed = [v async for v in iterable] + + expected = [ + self.Car( + 3, + "blue", + uuid=self.uuid_2, + version=4, + created_at=observed[0].created_at, + updated_at=observed[0].updated_at, + ), + self.Car( + 3, + "blue", + uuid=self.uuid_3, + version=1, + created_at=observed[1].created_at, + updated_at=observed[1].updated_at, + ), + ] + self.assertEqual(expected, observed) + + async def test_find_with_transaction_delete(self): + await self.populate_and_synchronize() + condition = Condition.IN("uuid", [self.uuid_2, self.uuid_3]) + + iterable = self.snapshot_repository.find( + self.Car, + condition, + ordering=Ordering.ASC("updated_at"), + transaction=TransactionEntry(self.transaction_2), + ) + observed = [v async for v in iterable] + + expected = [ + self.Car( + 3, + "blue", + uuid=self.uuid_3, + version=1, + created_at=observed[0].created_at, + updated_at=observed[0].updated_at, + ), + ] + self.assertEqual(expected, observed) + + async def test_find_with_transaction_reverted(self): + await self.populate_and_synchronize() + condition = Condition.IN("uuid", [self.uuid_2, self.uuid_3]) + + iterable = self.snapshot_repository.find( + self.Car, + condition, + ordering=Ordering.ASC("updated_at"), + transaction=TransactionEntry(self.transaction_4), + ) + observed = [v async for v in iterable] + + expected = [ + self.Car( + 3, + "blue", + uuid=self.uuid_2, + version=2, + created_at=observed[0].created_at, + updated_at=observed[0].updated_at, + ), + self.Car( + 3, + "blue", + uuid=self.uuid_3, + version=1, + created_at=observed[1].created_at, + updated_at=observed[1].updated_at, + ), + ] + self.assertEqual(expected, observed) + + async def test_find_streaming_true(self): + await self.populate_and_synchronize() + condition = Condition.IN("uuid", [self.uuid_2, self.uuid_3]) + + iterable = self.snapshot_repository.find( + self.Car, condition, streaming_mode=True, ordering=Ordering.ASC("updated_at") + ) + observed = [v async for v in iterable] + + expected = [ + self.Car( + 3, + "blue", + uuid=self.uuid_2, + version=2, + created_at=observed[0].created_at, + updated_at=observed[0].updated_at, + ), + self.Car( + 3, + "blue", + uuid=self.uuid_3, + version=1, + created_at=observed[1].created_at, + updated_at=observed[1].updated_at, + ), + ] + self.assertEqual(expected, observed) + + async def test_find_with_duplicates(self): + await self.populate_and_synchronize() + uuids = [self.uuid_2, self.uuid_2, self.uuid_3] + condition = Condition.IN("uuid", uuids) + + iterable = self.snapshot_repository.find(self.Car, condition, ordering=Ordering.ASC("updated_at")) + observed = [v async for v in iterable] + + expected = [ + self.Car( + 3, + "blue", + uuid=self.uuid_2, + version=2, + created_at=observed[0].created_at, + updated_at=observed[0].updated_at, + ), + self.Car( + 3, + "blue", + uuid=self.uuid_3, + version=1, + created_at=observed[1].created_at, + updated_at=observed[1].updated_at, + ), + ] + self.assertEqual(expected, observed) + + async def test_find_empty(self): + await self.populate_and_synchronize() + observed = {v async for v in self.snapshot_repository.find(self.Car, Condition.FALSE)} + + expected = set() + self.assertEqual(expected, observed) + + async def test_get(self): + await self.populate_and_synchronize() + observed = await self.snapshot_repository.get(self.Car, self.uuid_2) + + expected = self.Car( + 3, "blue", uuid=self.uuid_2, version=2, created_at=observed.created_at, updated_at=observed.updated_at + ) + self.assertEqual(expected, observed) + + async def test_get_with_transaction(self): + await self.populate_and_synchronize() + + observed = await self.snapshot_repository.get( + self.Car, self.uuid_2, transaction=TransactionEntry(self.transaction_1) + ) + + expected = self.Car( + 3, "blue", uuid=self.uuid_2, version=4, created_at=observed.created_at, updated_at=observed.updated_at + ) + self.assertEqual(expected, observed) + + async def test_get_raises(self): + await self.populate_and_synchronize() + with self.assertRaises(AlreadyDeletedException): + await self.snapshot_repository.get(self.Car, self.uuid_1) + with self.assertRaises(NotFoundException): + await self.snapshot_repository.get(self.Car, uuid4()) + + async def test_get_with_transaction_raises(self): + await self.populate_and_synchronize() + with self.assertRaises(AlreadyDeletedException): + await self.snapshot_repository.get(self.Car, self.uuid_2, transaction=TransactionEntry(self.transaction_2)) + + async def test_find(self): + await self.populate_and_synchronize() + condition = Condition.EQUAL("color", "blue") + iterable = self.snapshot_repository.find(self.Car, condition, ordering=Ordering.ASC("updated_at")) + observed = [v async for v in iterable] + + expected = [ + self.Car( + 3, + "blue", + uuid=self.uuid_2, + version=2, + created_at=observed[0].created_at, + updated_at=observed[0].updated_at, + ), + self.Car( + 3, + "blue", + uuid=self.uuid_3, + version=1, + created_at=observed[1].created_at, + updated_at=observed[1].updated_at, + ), + ] + self.assertEqual(expected, observed) + + async def test_find_all(self): + await self.populate_and_synchronize() + iterable = self.snapshot_repository.find(self.Car, Condition.TRUE, Ordering.ASC("updated_at")) + observed = [v async for v in iterable] + + expected = [ + self.Car( + 3, + "blue", + uuid=self.uuid_2, + version=2, + created_at=observed[0].created_at, + updated_at=observed[0].updated_at, + ), + self.Car( + 3, + "blue", + uuid=self.uuid_3, + version=1, + created_at=observed[1].created_at, + updated_at=observed[1].updated_at, + ), + ] + self.assertEqual(expected, observed) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/testing/transactions/__init__.py b/packages/core/minos-microservice-aggregate/minos/aggregate/testing/transactions/__init__.py new file mode 100644 index 000000000..08cde5249 --- /dev/null +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/testing/transactions/__init__.py @@ -0,0 +1,4 @@ +from .repositories import ( + MockedTransactionDatabaseOperationFactory, + TransactionRepositoryTestCase, +) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/testing/transactions/repositories/__init__.py b/packages/core/minos-microservice-aggregate/minos/aggregate/testing/transactions/repositories/__init__.py new file mode 100644 index 000000000..d1a78141e --- /dev/null +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/testing/transactions/repositories/__init__.py @@ -0,0 +1,6 @@ +from .factories import ( + MockedTransactionDatabaseOperationFactory, +) +from .testcases import ( + TransactionRepositoryTestCase, +) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/testing/transactions/repositories/factories.py b/packages/core/minos-microservice-aggregate/minos/aggregate/testing/transactions/repositories/factories.py new file mode 100644 index 000000000..5be8648d4 --- /dev/null +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/testing/transactions/repositories/factories.py @@ -0,0 +1,62 @@ +from datetime import ( + datetime, +) +from typing import ( + Optional, +) +from uuid import ( + UUID, +) + +from minos.common import ( + DatabaseOperation, +) +from minos.common.testing import ( + MockedDatabaseClient, + MockedDatabaseOperation, +) + +from ....transactions import ( + TransactionDatabaseOperationFactory, + TransactionStatus, +) + + +class MockedTransactionDatabaseOperationFactory(TransactionDatabaseOperationFactory): + """For testing purposes.""" + + def build_create(self) -> DatabaseOperation: + """For testing purposes.""" + return MockedDatabaseOperation("create") + + def build_submit( + self, uuid: UUID, destination_uuid: UUID, status: TransactionStatus, event_offset: int, **kwargs + ) -> DatabaseOperation: + """For testing purposes.""" + return MockedDatabaseOperation("submit") + + def build_query( + self, + uuid: Optional[UUID] = None, + uuid_ne: Optional[UUID] = None, + uuid_in: Optional[tuple[UUID]] = None, + destination_uuid: Optional[UUID] = None, + status: Optional[str] = None, + status_in: Optional[tuple[str]] = None, + event_offset: Optional[int] = None, + event_offset_lt: Optional[int] = None, + event_offset_gt: Optional[int] = None, + event_offset_le: Optional[int] = None, + event_offset_ge: Optional[int] = None, + updated_at: Optional[datetime] = None, + updated_at_lt: Optional[datetime] = None, + updated_at_gt: Optional[datetime] = None, + updated_at_le: Optional[datetime] = None, + updated_at_ge: Optional[datetime] = None, + **kwargs, + ) -> DatabaseOperation: + """For testing purposes.""" + return MockedDatabaseOperation("select") + + +MockedDatabaseClient.set_factory(TransactionDatabaseOperationFactory, MockedTransactionDatabaseOperationFactory) diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_transactions/test_repositories/test_pg.py b/packages/core/minos-microservice-aggregate/minos/aggregate/testing/transactions/repositories/testcases.py similarity index 83% rename from packages/core/minos-microservice-aggregate/tests/test_aggregate/test_transactions/test_repositories/test_pg.py rename to packages/core/minos-microservice-aggregate/minos/aggregate/testing/transactions/repositories/testcases.py index 2bcace111..8276bbf85 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_transactions/test_repositories/test_pg.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/testing/transactions/repositories/testcases.py @@ -1,73 +1,71 @@ -import unittest +from abc import ( + ABC, + abstractmethod, +) from uuid import ( uuid4, ) -import aiopg - from minos.aggregate import ( - PostgreSqlTransactionRepository, TransactionEntry, TransactionRepository, TransactionRepositoryConflictException, TransactionStatus, ) from minos.common.testing import ( - PostgresAsyncTestCase, -) -from tests.utils import ( - CONFIG_FILE_PATH, MinosTestCase, ) -class TestPostgreSqlTransactionRepository(MinosTestCase, PostgresAsyncTestCase): - CONFIG_FILE_PATH = CONFIG_FILE_PATH +class TransactionRepositoryTestCase(MinosTestCase, ABC): + __test__ = False def setUp(self) -> None: super().setUp() - self.transaction_repository = PostgreSqlTransactionRepository(**self.repository_db) + self.transaction_repository = self.build_transaction_repository() self.uuid = uuid4() + self.uuid_1 = uuid4() + self.uuid_2 = uuid4() + self.uuid_3 = uuid4() + self.uuid_4 = uuid4() + self.uuid_5 = uuid4() - async def asyncSetUp(self) -> None: + self.entries = [ + TransactionEntry(self.uuid_1, TransactionStatus.PENDING, 12), + TransactionEntry(self.uuid_2, TransactionStatus.PENDING, 15), + TransactionEntry(self.uuid_3, TransactionStatus.REJECTED, 16), + TransactionEntry(self.uuid_4, TransactionStatus.COMMITTED, 20), + TransactionEntry(self.uuid_5, TransactionStatus.PENDING, 20, self.uuid_1), + ] + + async def populate(self) -> None: + await self.transaction_repository.submit(TransactionEntry(self.uuid_1, TransactionStatus.PENDING, 12)) + await self.transaction_repository.submit(TransactionEntry(self.uuid_2, TransactionStatus.PENDING, 15)) + await self.transaction_repository.submit(TransactionEntry(self.uuid_3, TransactionStatus.REJECTED, 16)) + await self.transaction_repository.submit(TransactionEntry(self.uuid_4, TransactionStatus.COMMITTED, 20)) + await self.transaction_repository.submit( + TransactionEntry(self.uuid_5, TransactionStatus.PENDING, 20, self.uuid_1) + ) + + async def asyncSetUp(self): await super().asyncSetUp() await self.transaction_repository.setup() - async def asyncTearDown(self) -> None: + async def asyncTearDown(self): await self.transaction_repository.destroy() await super().asyncTearDown() + def tearDown(self): + super().tearDown() + + @abstractmethod + def build_transaction_repository(self) -> TransactionRepository: + """For testing purposes.""" + async def test_subclass(self) -> None: - self.assertTrue(issubclass(PostgreSqlTransactionRepository, TransactionRepository)) - - def test_constructor(self): - repository = PostgreSqlTransactionRepository("database", "host", 1234, "user", "password") - self.assertIsInstance(repository, PostgreSqlTransactionRepository) - self.assertEqual("host", repository.host) - self.assertEqual(1234, repository.port) - self.assertEqual("database", repository.database) - self.assertEqual("user", repository.user) - self.assertEqual("password", repository.password) - - def test_from_config(self): - repository = PostgreSqlTransactionRepository.from_config(self.config) - repository_config = self.config.get_database_by_name("event") - self.assertEqual(repository_config["host"], repository.host) - self.assertEqual(repository_config["port"], repository.port) - self.assertEqual(repository_config["database"], repository.database) - self.assertEqual(repository_config["user"], repository.user) - self.assertEqual(repository_config["password"], repository.password) - - async def test_setup(self): - async with aiopg.connect(**self.repository_db) as connection: - async with connection.cursor() as cursor: - await cursor.execute( - "SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'aggregate_transaction');" - ) - response = (await cursor.fetchone())[0] - self.assertTrue(response) + self.assertTrue(isinstance(self.transaction_repository, TransactionRepository)) async def test_submit(self): await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.PENDING, 34)) @@ -75,11 +73,6 @@ async def test_submit(self): observed = [v async for v in self.transaction_repository.select()] self.assertEqual(expected, observed) - async def test_select_empty(self): - expected = [] - observed = [v async for v in self.transaction_repository.select()] - self.assertEqual(expected, observed) - async def test_submit_pending_raises(self): await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.PENDING, 34)) with self.assertRaises(TransactionRepositoryConflictException): @@ -152,77 +145,49 @@ async def test_submit_rejected_raises(self): with self.assertRaises(TransactionRepositoryConflictException): await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.REJECTED, 34)) - -class TestPostgreSqlTransactionRepositorySelect(MinosTestCase, PostgresAsyncTestCase): - CONFIG_FILE_PATH = CONFIG_FILE_PATH - - def setUp(self) -> None: - super().setUp() - self.uuid_1 = uuid4() - self.uuid_2 = uuid4() - self.uuid_3 = uuid4() - self.uuid_4 = uuid4() - self.uuid_5 = uuid4() - - self.transaction_repository = PostgreSqlTransactionRepository(**self.repository_db) - - self.entries = [ - TransactionEntry(self.uuid_1, TransactionStatus.PENDING, 12), - TransactionEntry(self.uuid_2, TransactionStatus.PENDING, 15), - TransactionEntry(self.uuid_3, TransactionStatus.REJECTED, 16), - TransactionEntry(self.uuid_4, TransactionStatus.COMMITTED, 20), - TransactionEntry(self.uuid_5, TransactionStatus.PENDING, 20, self.uuid_1), - ] - - async def asyncSetUp(self): - await super().asyncSetUp() - await self.transaction_repository.setup() - await self._populate() - - async def _populate(self): - await self.transaction_repository.submit(TransactionEntry(self.uuid_1, TransactionStatus.PENDING, 12)) - await self.transaction_repository.submit(TransactionEntry(self.uuid_2, TransactionStatus.PENDING, 15)) - await self.transaction_repository.submit(TransactionEntry(self.uuid_3, TransactionStatus.REJECTED, 16)) - await self.transaction_repository.submit(TransactionEntry(self.uuid_4, TransactionStatus.COMMITTED, 20)) - await self.transaction_repository.submit( - TransactionEntry(self.uuid_5, TransactionStatus.PENDING, 20, self.uuid_1) - ) - - async def asyncTearDown(self): - await self.transaction_repository.destroy() - await super().asyncTearDown() + async def test_select_empty(self): + expected = [] + observed = [v async for v in self.transaction_repository.select()] + self.assertEqual(expected, observed) async def test_select(self): + await self.populate() expected = self.entries observed = [v async for v in self.transaction_repository.select()] self.assertEqual(expected, observed) async def test_select_uuid(self): + await self.populate() expected = [self.entries[1]] observed = [v async for v in self.transaction_repository.select(uuid=self.uuid_2)] self.assertEqual(expected, observed) async def test_select_uuid_ne(self): + await self.populate() expected = [self.entries[0], self.entries[2], self.entries[3], self.entries[4]] observed = [v async for v in self.transaction_repository.select(uuid_ne=self.uuid_2)] self.assertEqual(expected, observed) async def test_select_uuid_in(self): + await self.populate() expected = [self.entries[1], self.entries[2]] observed = [v async for v in self.transaction_repository.select(uuid_in=(self.uuid_2, self.uuid_3))] self.assertEqual(expected, observed) async def test_select_destination_uuid(self): + await self.populate() expected = [self.entries[4]] observed = [v async for v in self.transaction_repository.select(destination_uuid=self.uuid_1)] self.assertEqual(expected, observed) async def test_select_status(self): + await self.populate() expected = [self.entries[0], self.entries[1], self.entries[4]] observed = [v async for v in self.transaction_repository.select(status=TransactionStatus.PENDING)] self.assertEqual(expected, observed) async def test_select_status_in(self): + await self.populate() expected = [self.entries[2], self.entries[3]] observed = [ v @@ -233,31 +198,37 @@ async def test_select_status_in(self): self.assertEqual(expected, observed) async def test_select_event_offset(self): + await self.populate() expected = [self.entries[1]] observed = [v async for v in self.transaction_repository.select(event_offset=15)] self.assertEqual(expected, observed) async def test_select_event_offset_lt(self): + await self.populate() expected = [self.entries[0]] observed = [v async for v in self.transaction_repository.select(event_offset_lt=15)] self.assertEqual(expected, observed) async def test_select_event_offset_gt(self): + await self.populate() expected = [self.entries[2], self.entries[3], self.entries[4]] observed = [v async for v in self.transaction_repository.select(event_offset_gt=15)] self.assertEqual(expected, observed) async def test_select_event_offset_le(self): + await self.populate() expected = [self.entries[0], self.entries[1]] observed = [v async for v in self.transaction_repository.select(event_offset_le=15)] self.assertEqual(expected, observed) async def test_select_event_offset_ge(self): + await self.populate() expected = [self.entries[1], self.entries[2], self.entries[3], self.entries[4]] observed = [v async for v in self.transaction_repository.select(event_offset_ge=15)] self.assertEqual(expected, observed) async def test_select_updated_at(self): + await self.populate() updated_at = (await self.transaction_repository.get(self.uuid_3)).updated_at expected = [self.entries[2]] @@ -265,6 +236,7 @@ async def test_select_updated_at(self): self.assertEqual(expected, observed) async def test_select_updated_at_lt(self): + await self.populate() updated_at = (await self.transaction_repository.get(self.uuid_3)).updated_at expected = [self.entries[0], self.entries[1]] @@ -272,6 +244,7 @@ async def test_select_updated_at_lt(self): self.assertEqual(expected, observed) async def test_select_updated_at_gt(self): + await self.populate() updated_at = (await self.transaction_repository.get(self.uuid_3)).updated_at expected = [self.entries[3], self.entries[4]] @@ -279,6 +252,7 @@ async def test_select_updated_at_gt(self): self.assertEqual(expected, observed) async def test_select_updated_at_le(self): + await self.populate() updated_at = (await self.transaction_repository.get(self.uuid_3)).updated_at expected = [self.entries[0], self.entries[1], self.entries[2]] @@ -286,12 +260,9 @@ async def test_select_updated_at_le(self): self.assertEqual(expected, observed) async def test_select_updated_at_ge(self): + await self.populate() updated_at = (await self.transaction_repository.get(self.uuid_3)).updated_at expected = [self.entries[2], self.entries[3], self.entries[4]] observed = [v async for v in self.transaction_repository.select(updated_at_ge=updated_at)] self.assertEqual(expected, observed) - - -if __name__ == "__main__": - unittest.main() diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/__init__.py b/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/__init__.py index 07c5c8cfb..387f13660 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/__init__.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/__init__.py @@ -6,8 +6,9 @@ TransactionStatus, ) from .repositories import ( + DatabaseTransactionRepository, InMemoryTransactionRepository, - PostgreSqlTransactionRepository, + TransactionDatabaseOperationFactory, TransactionRepository, ) from .services import ( diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/contextvars.py b/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/contextvars.py index f19e82409..473025386 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/contextvars.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/contextvars.py @@ -17,3 +17,4 @@ ) TRANSACTION_CONTEXT_VAR: Final[ContextVar[Optional[TransactionEntry]]] = ContextVar("transaction", default=None) +"""Context Variable that contains the identifier of the currently active transaction, or ``None`` otherwise.""" diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/entries.py b/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/entries.py index 2d7dd7f1f..d883c2410 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/entries.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/entries.py @@ -17,6 +17,7 @@ ) from typing import ( TYPE_CHECKING, + Any, Iterable, Optional, Union, @@ -316,6 +317,19 @@ def __repr__(self): f"destination_uuid={self.destination_uuid!r}, updated_at={self.updated_at!r})" ) + def as_raw(self) -> dict[str, Any]: + """Get a raw representation of the instance. + + :return: A dictionary in which the keys are attribute names and values the attribute contents. + """ + return { + "uuid": self.uuid, + "status": self.status, + "event_offset": self.event_offset, + "destination_uuid": self.destination_uuid, + "updated_at": self.updated_at, + } + class TransactionStatus(str, Enum): """Transaction Status Enum.""" diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/repositories/__init__.py b/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/repositories/__init__.py index 2d69d49fe..efc6c6599 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/repositories/__init__.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/repositories/__init__.py @@ -1,9 +1,10 @@ from .abc import ( TransactionRepository, ) +from .database import ( + DatabaseTransactionRepository, + TransactionDatabaseOperationFactory, +) from .memory import ( InMemoryTransactionRepository, ) -from .pg import ( - PostgreSqlTransactionRepository, -) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/repositories/abc.py b/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/repositories/abc.py index 668baf4e6..6149b96fa 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/repositories/abc.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/repositories/abc.py @@ -1,3 +1,7 @@ +from __future__ import ( + annotations, +) + from abc import ( ABC, abstractmethod, @@ -19,6 +23,7 @@ Lock, LockPool, NotProvidedException, + PoolFactory, SetupMixin, ) @@ -36,9 +41,14 @@ class TransactionRepository(ABC, SetupMixin): """Transaction Repository base class.""" @Inject() - def __init__(self, lock_pool: LockPool, *args, **kwargs): + def __init__( + self, lock_pool: Optional[LockPool] = None, pool_factory: Optional[PoolFactory] = None, *args, **kwargs + ): super().__init__(*args, **kwargs) + if lock_pool is None and pool_factory is not None: + lock_pool = pool_factory.get_pool("lock") + if lock_pool is None: raise NotProvidedException("A lock pool instance is required.") diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/repositories/database/__init__.py b/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/repositories/database/__init__.py new file mode 100644 index 000000000..a418d1f39 --- /dev/null +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/repositories/database/__init__.py @@ -0,0 +1,6 @@ +from .factories import ( + TransactionDatabaseOperationFactory, +) +from .impl import ( + DatabaseTransactionRepository, +) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/repositories/database/factories.py b/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/repositories/database/factories.py new file mode 100644 index 000000000..f5f23579f --- /dev/null +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/repositories/database/factories.py @@ -0,0 +1,96 @@ +from __future__ import ( + annotations, +) + +from abc import ( + ABC, + abstractmethod, +) +from datetime import ( + datetime, +) +from typing import ( + TYPE_CHECKING, + Optional, +) +from uuid import ( + UUID, +) + +from minos.common import ( + DatabaseOperation, + DatabaseOperationFactory, +) + +if TYPE_CHECKING: + from ...entries import ( + TransactionStatus, + ) + + +class TransactionDatabaseOperationFactory(DatabaseOperationFactory, ABC): + """Transaction Database Operation Factory base class.""" + + @abstractmethod + def build_create(self) -> DatabaseOperation: + """Build the database operation to create the snapshot table. + + :return: A ``DatabaseOperation`` instance. + """ + + @abstractmethod + def build_submit( + self, uuid: UUID, destination_uuid: UUID, status: TransactionStatus, event_offset: int, **kwargs + ) -> DatabaseOperation: + """Build the database operation to submit a row. + + :param uuid: The identifier of the transaction. + :param destination_uuid: The identifier of the destination transaction. + :param status: The status of the transaction. + :param event_offset: The event offset of the transaction. + :param kwargs: Additional named arguments. + :return: A ``DatabaseOperation`` instance. + """ + + @abstractmethod + def build_query( + self, + uuid: Optional[UUID] = None, + uuid_ne: Optional[UUID] = None, + uuid_in: Optional[tuple[UUID]] = None, + destination_uuid: Optional[UUID] = None, + status: Optional[str] = None, + status_in: Optional[tuple[str]] = None, + event_offset: Optional[int] = None, + event_offset_lt: Optional[int] = None, + event_offset_gt: Optional[int] = None, + event_offset_le: Optional[int] = None, + event_offset_ge: Optional[int] = None, + updated_at: Optional[datetime] = None, + updated_at_lt: Optional[datetime] = None, + updated_at_gt: Optional[datetime] = None, + updated_at_le: Optional[datetime] = None, + updated_at_ge: Optional[datetime] = None, + **kwargs, + ) -> DatabaseOperation: + """Build the database operation to select rows. + + :param uuid: Transaction identifier equal to the given value. + :param uuid_ne: Transaction identifier not equal to the given value + :param uuid_in: Transaction identifier within the given values. + :param destination_uuid: Destination Transaction identifier equal to the given value. + :param status: Transaction status equal to the given value. + :param status_in: Transaction status within the given values + :param event_offset: Event offset equal to the given value. + :param event_offset_lt: Event Offset lower than the given value + :param event_offset_gt: Event Offset greater than the given value + :param event_offset_le: Event Offset lower or equal to the given value + :param event_offset_ge: Event Offset greater or equal to the given value + :param updated_at: Updated at equal to the given value. + :param updated_at_lt: Updated at lower than the given value. + :param updated_at_gt: Updated at greater than the given value. + :param updated_at_le: Updated at lower or equal to the given value. + :param updated_at_ge: Updated at greater or equal to the given value. + :param kwargs: Additional named arguments. + :return: A ``DatabaseOperation`` instance. + """ diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/repositories/database/impl.py b/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/repositories/database/impl.py new file mode 100644 index 000000000..2b0ac0026 --- /dev/null +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/repositories/database/impl.py @@ -0,0 +1,58 @@ +from __future__ import ( + annotations, +) + +from typing import ( + AsyncIterator, + Optional, +) + +from minos.common import ( + DatabaseMixin, + ProgrammingException, +) + +from ....exceptions import ( + TransactionRepositoryConflictException, +) +from ...entries import ( + TransactionEntry, +) +from ..abc import ( + TransactionRepository, +) +from .factories import ( + TransactionDatabaseOperationFactory, +) + + +class DatabaseTransactionRepository(DatabaseMixin[TransactionDatabaseOperationFactory], TransactionRepository): + """Database Transaction Repository class.""" + + def __init__(self, *args, database_key: Optional[tuple[str]] = None, **kwargs): + if database_key is None: + database_key = ("aggregate", "transaction") + super().__init__(*args, database_key=database_key, **kwargs) + + async def _setup(self): + operation = self.database_operation_factory.build_create() + await self.execute_on_database(operation) + + async def _submit(self, transaction: TransactionEntry) -> TransactionEntry: + operation = self.database_operation_factory.build_submit( + **transaction.as_raw(), + ) + + try: + updated_at = await self.execute_on_database_and_fetch_one(operation) + except ProgrammingException: + raise TransactionRepositoryConflictException( + f"{transaction!r} status is invalid respect to the previous one." + ) + transaction.updated_at = updated_at + return transaction + + async def _select(self, streaming_mode: Optional[bool] = None, **kwargs) -> AsyncIterator[TransactionEntry]: + operation = self.database_operation_factory.build_query(**kwargs) + async for row in self.execute_on_database_and_fetch_all(operation, streaming_mode=streaming_mode): + yield TransactionEntry(*row, transaction_repository=self) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/repositories/pg.py b/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/repositories/pg.py deleted file mode 100644 index 599948eab..000000000 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/repositories/pg.py +++ /dev/null @@ -1,178 +0,0 @@ -from __future__ import ( - annotations, -) - -from datetime import ( - datetime, -) -from typing import ( - AsyncIterator, - Optional, -) -from uuid import ( - UUID, -) - -from minos.common import ( - Config, - PostgreSqlMinosDatabase, -) - -from ...exceptions import ( - TransactionRepositoryConflictException, -) -from ..entries import ( - TransactionEntry, -) -from .abc import ( - TransactionRepository, -) - - -class PostgreSqlTransactionRepository(PostgreSqlMinosDatabase, TransactionRepository): - """PostgreSql Transaction Repository class.""" - - @classmethod - def _from_config(cls, *args, config: Config, **kwargs) -> Optional[PostgreSqlTransactionRepository]: - return cls(*args, **config.get_database_by_name("transaction"), **kwargs) - - async def _setup(self): - await self.submit_query('CREATE EXTENSION IF NOT EXISTS "uuid-ossp";', lock="uuid-ossp") - - await self.submit_query(_CREATE_TRANSACTION_STATUS_ENUM_QUERY, lock=hash("aggregate_transaction_enum")) - await self.submit_query(_CREATE_TRANSACTION_TABLE_QUERY, lock=hash("aggregate_transaction")) - - async def _submit(self, transaction: TransactionEntry) -> TransactionEntry: - params = { - "uuid": transaction.uuid, - "destination_uuid": transaction.destination_uuid, - "status": transaction.status, - "event_offset": transaction.event_offset, - } - try: - updated_at = await self.submit_query_and_fetchone( - _INSERT_TRANSACTIONS_VALUES_QUERY, params, lock=transaction.uuid.int & (1 << 32) - 1 - ) - except StopAsyncIteration: - raise TransactionRepositoryConflictException( - f"{transaction!r} status is invalid respect to the previous one." - ) - transaction.updated_at = updated_at - return transaction - - async def _select(self, **kwargs) -> AsyncIterator[TransactionEntry]: - query = self._build_select_query(**kwargs) - async for row in self.submit_query_and_iter(query, kwargs, **kwargs): - yield TransactionEntry(*row, transaction_repository=self) - - # noinspection PyUnusedLocal - @staticmethod - def _build_select_query( - uuid: Optional[UUID] = None, - uuid_ne: Optional[UUID] = None, - uuid_in: Optional[tuple[UUID]] = None, - destination_uuid: Optional[UUID] = None, - status: Optional[str] = None, - status_in: Optional[tuple[str]] = None, - event_offset: Optional[int] = None, - event_offset_lt: Optional[int] = None, - event_offset_gt: Optional[int] = None, - event_offset_le: Optional[int] = None, - event_offset_ge: Optional[int] = None, - updated_at: Optional[datetime] = None, - updated_at_lt: Optional[datetime] = None, - updated_at_gt: Optional[datetime] = None, - updated_at_le: Optional[datetime] = None, - updated_at_ge: Optional[datetime] = None, - **kwargs, - ) -> str: - conditions = list() - - if uuid is not None: - conditions.append("uuid = %(uuid)s") - if uuid_ne is not None: - conditions.append("uuid <> %(uuid_ne)s") - if uuid_in is not None: - conditions.append("uuid IN %(uuid_in)s") - if destination_uuid is not None: - conditions.append("destination_uuid = %(destination_uuid)s") - if status is not None: - conditions.append("status = %(status)s") - if status_in is not None: - conditions.append("status IN %(status_in)s") - if event_offset is not None: - conditions.append("event_offset = %(event_offset)s") - if event_offset_lt is not None: - conditions.append("event_offset < %(event_offset_lt)s") - if event_offset_gt is not None: - conditions.append("event_offset > %(event_offset_gt)s") - if event_offset_le is not None: - conditions.append("event_offset <= %(event_offset_le)s") - if event_offset_ge is not None: - conditions.append("event_offset >= %(event_offset_ge)s") - if updated_at is not None: - conditions.append("updated_at = %(updated_at)s") - if updated_at_lt is not None: - conditions.append("updated_at < %(updated_at_lt)s") - if updated_at_gt is not None: - conditions.append("updated_at > %(updated_at_gt)s") - if updated_at_le is not None: - conditions.append("updated_at <= %(updated_at_le)s") - if updated_at_ge is not None: - conditions.append("updated_at >= %(updated_at_ge)s") - - if not conditions: - return f"{_SELECT_ALL_TRANSACTIONS_QUERY} ORDER BY event_offset;" - - return f"{_SELECT_ALL_TRANSACTIONS_QUERY} WHERE {' AND '.join(conditions)} ORDER BY event_offset;" - - -_CREATE_TRANSACTION_STATUS_ENUM_QUERY = """ -DO -$$ - BEGIN - IF NOT EXISTS(SELECT * - FROM pg_type typ - INNER JOIN pg_namespace nsp - ON nsp.oid = typ.typnamespace - WHERE nsp.nspname = current_schema() - AND typ.typname = 'transaction_status') THEN - CREATE TYPE transaction_status AS ENUM ( - 'pending', 'reserving', 'reserved', 'committing', 'committed', 'rejected' - ); - END IF; - END; -$$ -LANGUAGE plpgsql; -""".strip() - -_CREATE_TRANSACTION_TABLE_QUERY = """ -CREATE TABLE IF NOT EXISTS aggregate_transaction ( - uuid UUID PRIMARY KEY, - destination_uuid UUID NOT NULL, - status TRANSACTION_STATUS NOT NULL, - event_offset INTEGER, - updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() -); -""".strip() - -_INSERT_TRANSACTIONS_VALUES_QUERY = """ -INSERT INTO aggregate_transaction (uuid, destination_uuid, status, event_offset) -VALUES (%(uuid)s, %(destination_uuid)s, %(status)s, %(event_offset)s) -ON CONFLICT (uuid) -DO - UPDATE SET status = %(status)s, event_offset = %(event_offset)s, updated_at = NOW() -WHERE (aggregate_transaction.destination_uuid = %(destination_uuid)s) - AND (NOT (aggregate_transaction.status = 'pending' AND %(status)s NOT IN ('pending', 'reserving', 'rejected'))) - AND (NOT (aggregate_transaction.status = 'reserving' AND %(status)s NOT IN ('reserved', 'rejected'))) - AND (NOT (aggregate_transaction.status = 'reserved' AND %(status)s NOT IN ('committing', 'rejected'))) - AND (NOT (aggregate_transaction.status = 'committing' AND %(status)s NOT IN ('committed'))) - AND (NOT (aggregate_transaction.status = 'committed')) - AND (NOT (aggregate_transaction.status = 'rejected')) -RETURNING updated_at; -""".strip() - -_SELECT_ALL_TRANSACTIONS_QUERY = """ -SELECT uuid, status, event_offset, destination_uuid, updated_at -FROM aggregate_transaction -""".strip() diff --git a/packages/core/minos-microservice-aggregate/poetry.lock b/packages/core/minos-microservice-aggregate/poetry.lock index 16f003c05..320c8dbb3 100644 --- a/packages/core/minos-microservice-aggregate/poetry.lock +++ b/packages/core/minos-microservice-aggregate/poetry.lock @@ -19,37 +19,6 @@ develop = ["aiocontextvars (==0.2.2)", "aiohttp-asgi", "aiohttp (<4)", "async-ti raven = ["raven-aiohttp"] uvloop = ["uvloop (>=0.14,<1)"] -[[package]] -name = "aiopg" -version = "1.3.3" -description = "Postgres integration with asyncio." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -async-timeout = ">=3.0,<5.0" -psycopg2-binary = ">=2.8.4" - -[package.extras] -sa = ["sqlalchemy[postgresql_psycopg2binary] (>=1.3,<1.5)"] - -[[package]] -name = "alabaster" -version = "0.7.12" -description = "A configurable sidebar-enabled Sphinx theme" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "async-timeout" -version = "4.0.2" -description = "Timeout context manager for asyncio programs" -category = "main" -optional = false -python-versions = ">=3.6" - [[package]] name = "atomicwrites" version = "1.4.0" @@ -72,20 +41,9 @@ docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] -[[package]] -name = "babel" -version = "2.9.1" -description = "Internationalization utilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -pytz = ">=2015.7" - [[package]] name = "black" -version = "22.1.0" +version = "22.3.0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -96,7 +54,7 @@ click = ">=8.0.0" mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = ">=1.1.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] @@ -113,40 +71,13 @@ category = "main" optional = false python-versions = "*" -[[package]] -name = "certifi" -version = "2021.10.8" -description = "Python package for providing Mozilla's CA Bundle." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "cfgv" -version = "3.3.1" -description = "Validate configuration and produce human readable error messages." -category = "dev" -optional = false -python-versions = ">=3.6.1" - -[[package]] -name = "charset-normalizer" -version = "2.0.12" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "dev" -optional = false -python-versions = ">=3.5.0" - -[package.extras] -unicode_backport = ["unicodedata2"] - [[package]] name = "click" -version = "8.0.4" +version = "8.1.3" description = "Composable command line interface toolkit" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -194,7 +125,7 @@ python-versions = "*" [[package]] name = "dependency-injector" -version = "4.39.0" +version = "4.39.1" description = "Dependency injection framework for Python" category = "main" optional = false @@ -209,25 +140,9 @@ flask = ["flask"] pydantic = ["pydantic"] yaml = ["pyyaml"] -[[package]] -name = "distlib" -version = "0.3.4" -description = "Distribution utilities" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "docutils" -version = "0.17.1" -description = "Docutils -- Python Documentation Utilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - [[package]] name = "fastavro" -version = "1.4.10" +version = "1.4.11" description = "Fast read/write of AVRO files" category = "main" optional = false @@ -239,18 +154,6 @@ lz4 = ["lz4"] snappy = ["python-snappy"] zstandard = ["zstandard"] -[[package]] -name = "filelock" -version = "3.6.0" -description = "A platform independent file lock." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"] -testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-cov", "pytest-timeout (>=1.4.2)"] - [[package]] name = "flake8" version = "4.0.1" @@ -264,49 +167,6 @@ mccabe = ">=0.6.0,<0.7.0" pycodestyle = ">=2.8.0,<2.9.0" pyflakes = ">=2.4.0,<2.5.0" -[[package]] -name = "identify" -version = "2.4.12" -description = "File identification library for Python" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -license = ["ukkonen"] - -[[package]] -name = "idna" -version = "3.3" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "dev" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "imagesize" -version = "1.3.0" -description = "Getting image size from png/jpeg/jpeg2000/gif file" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "importlib-metadata" -version = "4.11.3" -description = "Read metadata from Python packages" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] -perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] - [[package]] name = "iniconfig" version = "1.1.1" @@ -329,48 +189,6 @@ requirements_deprecated_finder = ["pipreqs", "pip-api"] colors = ["colorama (>=0.4.3,<0.5.0)"] plugins = ["setuptools"] -[[package]] -name = "jinja2" -version = "3.1.1" -description = "A very fast and expressive template engine." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - -[[package]] -name = "lmdb" -version = "1.3.0" -description = "Universal Python binding for the LMDB 'Lightning' Database" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "m2r2" -version = "0.3.2" -description = "Markdown and reStructuredText in a single file." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -docutils = "*" -mistune = "0.8.4" - -[[package]] -name = "markupsafe" -version = "2.1.1" -description = "Safely add untrusted strings to HTML/XML markup." -category = "dev" -optional = false -python-versions = ">=3.7" - [[package]] name = "mccabe" version = "0.6.1" @@ -381,7 +199,7 @@ python-versions = "*" [[package]] name = "minos-microservice-common" -version = "0.6.0" +version = "0.7.0" description = "The common core of the Minos Framework" category = "main" optional = false @@ -389,12 +207,10 @@ python-versions = "^3.9" develop = true [package.dependencies] -aiomisc = ">=14.0.3,<16.0.0" -aiopg = "^1.2.1" +aiomisc = ">=14.0.3,<15.8.0" cached-property = "^1.5.2" dependency-injector = "^4.32.2" fastavro = "^1.4.0" -lmdb = "^1.2.1" orjson = "^3.5.2" PyYAML = ">=5.4.1,<7.0.0" uvloop = "^0.16.0" @@ -405,7 +221,7 @@ url = "../minos-microservice-common" [[package]] name = "minos-microservice-networks" -version = "0.6.0" +version = "0.7.0" description = "The networks core of the Minos Framework" category = "main" optional = false @@ -413,23 +229,13 @@ python-versions = "^3.9" develop = true [package.dependencies] -aiopg = "^1.2.1" crontab = "^0.23.0" -minos-microservice-common = "^0.6.0" -psycopg2-binary = "^2.9.3" +minos-microservice-common = "^0.7.0*" [package.source] type = "directory" url = "../minos-microservice-networks" -[[package]] -name = "mistune" -version = "0.8.4" -description = "The fastest markdown parser in pure Python" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "mypy-extensions" version = "0.4.3" @@ -438,17 +244,9 @@ category = "dev" optional = false python-versions = "*" -[[package]] -name = "nodeenv" -version = "1.6.0" -description = "Node.js virtual environment builder" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "orjson" -version = "3.6.7" +version = "3.6.8" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" category = "main" optional = false @@ -473,25 +271,17 @@ category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -[[package]] -name = "pbr" -version = "5.8.1" -description = "Python Build Reasonableness" -category = "dev" -optional = false -python-versions = ">=2.6" - [[package]] name = "platformdirs" -version = "2.5.1" +version = "2.5.2" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" [package.extras] -docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] +test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] [[package]] name = "pluggy" @@ -505,30 +295,6 @@ python-versions = ">=3.6" dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] -[[package]] -name = "pre-commit" -version = "2.17.0" -description = "A framework for managing and maintaining multi-language pre-commit hooks." -category = "dev" -optional = false -python-versions = ">=3.6.1" - -[package.dependencies] -cfgv = ">=2.0.0" -identify = ">=1.0.0" -nodeenv = ">=0.11.1" -pyyaml = ">=5.1" -toml = "*" -virtualenv = ">=20.0.8" - -[[package]] -name = "psycopg2-binary" -version = "2.9.3" -description = "psycopg2 - Python-PostgreSQL Database Adapter" -category = "main" -optional = false -python-versions = ">=3.6" - [[package]] name = "py" version = "1.11.0" @@ -553,28 +319,20 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -[[package]] -name = "pygments" -version = "2.11.2" -description = "Pygments is a syntax highlighting package written in Python." -category = "dev" -optional = false -python-versions = ">=3.5" - [[package]] name = "pyparsing" -version = "3.0.7" -description = "Python parsing module" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.6.8" [package.extras] -diagrams = ["jinja2", "railroad-diagrams"] +diagrams = ["railroad-diagrams", "jinja2"] [[package]] name = "pytest" -version = "7.1.1" +version = "7.1.2" description = "pytest: simple powerful testing with Python" category = "dev" optional = false @@ -593,14 +351,6 @@ tomli = ">=1.0.0" [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] -[[package]] -name = "pytz" -version = "2022.1" -description = "World timezone definitions, modern and historical" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "pyyaml" version = "6.0" @@ -609,24 +359,6 @@ category = "main" optional = false python-versions = ">=3.6" -[[package]] -name = "requests" -version = "2.27.1" -description = "Python HTTP for Humans." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} -urllib3 = ">=1.21.1,<1.27" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] - [[package]] name = "six" version = "1.16.0" @@ -635,167 +367,6 @@ category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -[[package]] -name = "snowballstemmer" -version = "2.2.0" -description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "sphinx" -version = "4.5.0" -description = "Python documentation generator" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -alabaster = ">=0.7,<0.8" -babel = ">=1.3" -colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.14,<0.18" -imagesize = "*" -importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} -Jinja2 = ">=2.3" -packaging = "*" -Pygments = ">=2.0" -requests = ">=2.5.0" -snowballstemmer = ">=1.1" -sphinxcontrib-applehelp = "*" -sphinxcontrib-devhelp = "*" -sphinxcontrib-htmlhelp = ">=2.0.0" -sphinxcontrib-jsmath = "*" -sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = ">=1.1.5" - -[package.extras] -docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.931)", "docutils-stubs", "types-typed-ast", "types-requests"] -test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] - -[[package]] -name = "sphinx-autodoc-typehints" -version = "1.17.0" -description = "Type hints (PEP 484) support for the Sphinx autodoc extension" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -Sphinx = ">=4" - -[package.extras] -testing = ["covdefaults (>=2)", "coverage (>=6)", "diff-cover (>=6.4)", "nptyping (>=1)", "pytest (>=6)", "pytest-cov (>=3)", "sphobjinv (>=2)", "typing-extensions (>=3.5)"] -type_comments = ["typed-ast (>=1.4.0)"] - -[[package]] -name = "sphinx-rtd-theme" -version = "1.0.0" -description = "Read the Docs theme for Sphinx" -category = "dev" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" - -[package.dependencies] -docutils = "<0.18" -sphinx = ">=1.6" - -[package.extras] -dev = ["transifex-client", "sphinxcontrib-httpdomain", "bump2version"] - -[[package]] -name = "sphinxcontrib-apidoc" -version = "0.3.0" -description = "A Sphinx extension for running 'sphinx-apidoc' on each build" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -pbr = "*" -Sphinx = ">=1.6.0" - -[[package]] -name = "sphinxcontrib-applehelp" -version = "1.0.2" -description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-devhelp" -version = "1.0.2" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-htmlhelp" -version = "2.0.0" -description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest", "html5lib"] - -[[package]] -name = "sphinxcontrib-jsmath" -version = "1.0.1" -description = "A sphinx extension which renders display math in HTML via JavaScript" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -test = ["pytest", "flake8", "mypy"] - -[[package]] -name = "sphinxcontrib-qthelp" -version = "1.0.3" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-serializinghtml" -version = "1.1.5" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - [[package]] name = "tomli" version = "2.0.1" @@ -806,24 +377,11 @@ python-versions = ">=3.7" [[package]] name = "typing-extensions" -version = "4.1.1" -description = "Backported and Experimental Type Hints for Python 3.6+" +version = "4.2.0" +description = "Backported and Experimental Type Hints for Python 3.7+" category = "dev" optional = false -python-versions = ">=3.6" - -[[package]] -name = "urllib3" -version = "1.26.9" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" - -[package.extras] -brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +python-versions = ">=3.7" [[package]] name = "uvloop" @@ -838,58 +396,16 @@ dev = ["Cython (>=0.29.24,<0.30.0)", "pytest (>=3.6.0)", "Sphinx (>=4.1.2,<4.2.0 docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)"] test = ["aiohttp", "flake8 (>=3.9.2,<3.10.0)", "psutil", "pycodestyle (>=2.7.0,<2.8.0)", "pyOpenSSL (>=19.0.0,<19.1.0)", "mypy (>=0.800)"] -[[package]] -name = "virtualenv" -version = "20.14.0" -description = "Virtual Python Environment builder" -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - -[package.dependencies] -distlib = ">=0.3.1,<1" -filelock = ">=3.2,<4" -platformdirs = ">=2,<3" -six = ">=1.9.0,<2" - -[package.extras] -docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=21.3)"] -testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)"] - -[[package]] -name = "zipp" -version = "3.7.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] - [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "7371da2d5d13ab97d2bd9539bab6c57260134ac0a0859728f2f9a685323002ad" +content-hash = "bb4749d094a965e391cdb0fe9f4047fb174514d533e7c08855238d1e83cce3ed" [metadata.files] aiomisc = [ {file = "aiomisc-15.7.3-py3-none-any.whl", hash = "sha256:0403e83268e98d0f2a125a70d13303fe1a2358e36db3daf02df032c7fa4f1525"}, {file = "aiomisc-15.7.3.tar.gz", hash = "sha256:ba250a34bd4609ced36111cb50580f57c3d52f3955f953a53ecb2986988baedc"}, ] -aiopg = [ - {file = "aiopg-1.3.3-py3-none-any.whl", hash = "sha256:2842dd8741460eeef940032dcb577bfba4d4115205dd82a73ce13b3271f5bf0a"}, - {file = "aiopg-1.3.3.tar.gz", hash = "sha256:547c6ba4ea0d73c2a11a2f44387d7133cc01d3c6f3b8ed976c0ac1eff4f595d7"}, -] -alabaster = [ - {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, - {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, -] -async-timeout = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, -] atomicwrites = [ {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, @@ -898,54 +414,38 @@ attrs = [ {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] -babel = [ - {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"}, - {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, -] black = [ - {file = "black-22.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1297c63b9e1b96a3d0da2d85d11cd9bf8664251fd69ddac068b98dc4f34f73b6"}, - {file = "black-22.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2ff96450d3ad9ea499fc4c60e425a1439c2120cbbc1ab959ff20f7c76ec7e866"}, - {file = "black-22.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e21e1f1efa65a50e3960edd068b6ae6d64ad6235bd8bfea116a03b21836af71"}, - {file = "black-22.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f69158a7d120fd641d1fa9a921d898e20d52e44a74a6fbbcc570a62a6bc8ab"}, - {file = "black-22.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:228b5ae2c8e3d6227e4bde5920d2fc66cc3400fde7bcc74f480cb07ef0b570d5"}, - {file = "black-22.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b1a5ed73ab4c482208d20434f700d514f66ffe2840f63a6252ecc43a9bc77e8a"}, - {file = "black-22.1.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35944b7100af4a985abfcaa860b06af15590deb1f392f06c8683b4381e8eeaf0"}, - {file = "black-22.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7835fee5238fc0a0baf6c9268fb816b5f5cd9b8793423a75e8cd663c48d073ba"}, - {file = "black-22.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dae63f2dbf82882fa3b2a3c49c32bffe144970a573cd68d247af6560fc493ae1"}, - {file = "black-22.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fa1db02410b1924b6749c245ab38d30621564e658297484952f3d8a39fce7e8"}, - {file = "black-22.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c8226f50b8c34a14608b848dc23a46e5d08397d009446353dad45e04af0c8e28"}, - {file = "black-22.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2d6f331c02f0f40aa51a22e479c8209d37fcd520c77721c034517d44eecf5912"}, - {file = "black-22.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:742ce9af3086e5bd07e58c8feb09dbb2b047b7f566eb5f5bc63fd455814979f3"}, - {file = "black-22.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fdb8754b453fb15fad3f72cd9cad3e16776f0964d67cf30ebcbf10327a3777a3"}, - {file = "black-22.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5660feab44c2e3cb24b2419b998846cbb01c23c7fe645fee45087efa3da2d61"}, - {file = "black-22.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:6f2f01381f91c1efb1451998bd65a129b3ed6f64f79663a55fe0e9b74a5f81fd"}, - {file = "black-22.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:efbadd9b52c060a8fc3b9658744091cb33c31f830b3f074422ed27bad2b18e8f"}, - {file = "black-22.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8871fcb4b447206904932b54b567923e5be802b9b19b744fdff092bd2f3118d0"}, - {file = "black-22.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccad888050f5393f0d6029deea2a33e5ae371fd182a697313bdbd835d3edaf9c"}, - {file = "black-22.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07e5c049442d7ca1a2fc273c79d1aecbbf1bc858f62e8184abe1ad175c4f7cc2"}, - {file = "black-22.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:373922fc66676133ddc3e754e4509196a8c392fec3f5ca4486673e685a421321"}, - {file = "black-22.1.0-py3-none-any.whl", hash = "sha256:3524739d76b6b3ed1132422bf9d82123cd1705086723bc3e235ca39fd21c667d"}, - {file = "black-22.1.0.tar.gz", hash = "sha256:a7c0192d35635f6fc1174be575cb7915e92e5dd629ee79fdaf0dcfa41a80afb5"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"}, + {file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"}, + {file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"}, + {file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"}, + {file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"}, + {file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"}, + {file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"}, + {file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"}, + {file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"}, + {file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"}, + {file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"}, + {file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"}, + {file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"}, + {file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"}, + {file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"}, + {file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"}, + {file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"}, + {file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"}, ] cached-property = [ {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, ] -certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, -] -cfgv = [ - {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, - {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, - {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, -] click = [ - {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"}, - {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, ] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, @@ -1002,93 +502,65 @@ crontab = [ {file = "crontab-0.23.0.tar.gz", hash = "sha256:ca79dede9c2f572bb32f38703e8fddcf3427e86edc838f2ffe7ae4b9ee2b0733"}, ] dependency-injector = [ - {file = "dependency-injector-4.39.0.tar.gz", hash = "sha256:35d6c03683f512bcc8b0c950890ac40ce19bdacc7de4d59249dd61ed818f0930"}, - {file = "dependency_injector-4.39.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f046a5dbe7e5764fae9a69423f66241a8fdb62acea5c32b0c41a7da94b7f6da3"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfdd78f7d97c1f6ba4a3926a2e404507a4f77ecbd610d4a1b37dedb5c0b57ad1"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:512c23da829bb8ac2ae13f33aa017acf58ae9408e7796a146e1644e8b8471b5b"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7dc81df7f566bfdacdee448bc71085acd163b935860d2b2504b4f32840b3b692"}, - {file = "dependency_injector-4.39.0-cp310-cp310-win32.whl", hash = "sha256:9ffc5393700f45d740abecc50cdc1251eae69e50516ec9d0a48fba0e875ed083"}, - {file = "dependency_injector-4.39.0-cp310-cp310-win_amd64.whl", hash = "sha256:9118f36a3df1e9819074ccb35734d663812c8f6ef81d45c8e4ec81ce5dccac9c"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:1ff723aaf096fabb05cf8b08ba99888538a2a77e03a5082b70cd54eb9df619f3"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bb913900ceb1766f55dc628052d8e191a9c2b1737a0d775fbc230af90ab2c1e"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:329e801eb46b9933432481d3142e563e28a90d77952edac43126264c36ed2278"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1c1a67c699ae2c0234f07d121736fa44e8fe2d56c14b2fd210c3e04a151620bb"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-win32.whl", hash = "sha256:e1347defd46fe9067f857b1174bdb1b19458232ac1a485507df2ddff084cf31c"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-win_amd64.whl", hash = "sha256:9581c4c90f1aaf85ffb9b06bac7ac592df7076522881145321a9dd0702fee828"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8da8ff05fa17e852aa5831a600177e5bb72bf53b8a184f6922ae715387a460ba"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58a56999cebd8b2ba9c19e514e383924865e5f7d6273f8e5b7d85468d9042059"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4914332d6145fb7cfc5f2236a823a3859b92a7e75566ffca0987dcc0f7f7be53"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00aea40ee2d400a8091947ad97cda34b230628aeeac1774f8fa9a3500b5704b2"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-win32.whl", hash = "sha256:b94a64bc73d86d04b33c698fae4b9dad2536a8534ac6922c8226764da5d62d17"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4f59cc0b0d3beb82875d94b7e725b5097a7a454e8e323625ba6ac3095a29300e"}, - {file = "dependency_injector-4.39.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a8d840348f01d997e32394dba36e09c1ecd312b286befb6b3ca27526002ae94"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92097ffabca89d1539e200f91bfa13ff8ca502c9057391c3b78787d50fe502ed"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4a889e116fe76742ef6ff27d5e93ee9e364cbe7bbc6678df8c5dd54597a6fc"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a31e00961fdc1b3808a9e2adeb1107ec4bba0ad3a90b116af9d116a667e4626a"}, - {file = "dependency_injector-4.39.0-cp38-cp38-win32.whl", hash = "sha256:717720a220eee611ea96c0089246ec2103b168303ca2cd2c8a7cd3856da6f689"}, - {file = "dependency_injector-4.39.0-cp38-cp38-win_amd64.whl", hash = "sha256:05c0bbef90182a0d35d4d3f9ab879109070d204394578b12f0eff9eca51987ef"}, - {file = "dependency_injector-4.39.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f10bf8d146edffbee2ba5c5776395625c98048a31997afd481ce27792afee2af"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30c093b155c01e50723e8ecd2a14230daa4417356c8fb5a27369ae5be24b21d9"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dda8a85c8221e6ee433caa01c1bc4fed610381924780e04470572682569cdb8f"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ff8df47a901218a3257650f3f3a6b402dd58cb4f57b4a34d6e8092112f6e8480"}, - {file = "dependency_injector-4.39.0-cp39-cp39-win32.whl", hash = "sha256:e078c84c19ae73883a57e9b35edd843925b2b44833cd098708139a98abee5a96"}, - {file = "dependency_injector-4.39.0-cp39-cp39-win_amd64.whl", hash = "sha256:c02b6796320d6b9363d566045eeec243fa4a412ad68dcc6b2391307e93d0d401"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:865bf5ceba3e32f00e36bfcbefb1267b10df961fb2aab809f5e205968e1cd59b"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ce8645ffd8cc15a7bbd20c02e6439a61c1566a1db22766893bf79981fb89a4e"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dbdab8b024055865926a78ecbc3a6280345f4615e5c505511bbd7c6c322b1796"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:af996d66350704261382dc4e10f324eba5d23e35c04a9e75c7cb58fbea7f1f1d"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d390c6e97fec13fba832b7e39e07c43760ed3d46af4887005f679c0ab6eb9b2e"}, -] -distlib = [ - {file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"}, - {file = "distlib-0.3.4.zip", hash = "sha256:e4b58818180336dc9c529bfb9a0b58728ffc09ad92027a3f30b7cd91e3458579"}, -] -docutils = [ - {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, - {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, + {file = "dependency-injector-4.39.1.tar.gz", hash = "sha256:9ab76dc5e19b2692aaca49e00f9b41a087138d139b0ec985f92ff0498f038772"}, + {file = "dependency_injector-4.39.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c788a3d5482e63b5fd55e14fc258f1ff0b51b411927ab132ef0f689cb5d1183f"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0832e0457a360725cd1d1037b77b85478aeeaacc60e85ecceeb8020409e7b62"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d51998fff9704fd01d11c3c48f4e88d8506cb6afa1ee41409a881a5a51dae3fc"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea484cd13fc62966bf5582df0816205feee072d18f228aac75f7807b43f223ae"}, + {file = "dependency_injector-4.39.1-cp310-cp310-win32.whl", hash = "sha256:17389e53ec29ca13570319cf2065dcc4c2f6d36db5dd792bb1e8f2c39a9f146b"}, + {file = "dependency_injector-4.39.1-cp310-cp310-win_amd64.whl", hash = "sha256:55b0988489267c5a580f419133770ffe293057f2064da1c9ad6a2cc69666739b"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b297c3e79d3633cc56366386ae1f7dbce1587673cca2f559c368c1e936a1fa94"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2728827c5abb2420c5811e218262ae1b77a48e76cc9eebc6b4f55fee48a1a18d"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:029e42b064ab8cb5b2559be040ff682c7aa81592f1654a82355475956df17803"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:305e3db3f4bf40f64caaa1303e03005174e78d2339d2ae517b34c011ec2300f9"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-win32.whl", hash = "sha256:a661dd23a5e4e2f6bf4a729de7fadbe148c9a4a298dbcadfc5a94584b6930970"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-win_amd64.whl", hash = "sha256:340d6e7af5c4729d20c837d6d1e8a2626c24a05259dff746406cc823e26ba1e7"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a1553dac1c95f0de1f910b0025ee4570ea078a07d576bcdc2168990e719cea50"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c7baaa64d93359ee08c15d68579cc803e11d9becaf961f5a66b94ff627248e1"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7a27bf1951a066cf347b886cc7ab0f37dcbd1ad59bffcfe721c8c12a189a150d"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da6e2d685f7d0c65257f08133b68d9bf74ec319b90a0f21b4f629d168ce5f68f"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-win32.whl", hash = "sha256:a8ddd03ca86e67e9d3cc038793d34fbfccab12e6145df813e72bf14f9371f2ea"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-win_amd64.whl", hash = "sha256:e01a319ea05cd86b520201386dcb53a81a5400cb82fcc2f006bd7e92c0c51a0a"}, + {file = "dependency_injector-4.39.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4704804bde25b694aa65201927937a9d82d8bc055cb3dadc68eb05988bd34fa9"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0935d50b263169e7b0826a2fb6be80d6a4f2a7c59e6dd9876f86da3243bea9eb"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3c34aa5abb1826b6189f47daf6e469d4293c1d01693233da2c1b923816270cc5"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:db64904c9b9a88756cfece3e3ed078a2b57127642711dd08af342dba8abf9667"}, + {file = "dependency_injector-4.39.1-cp38-cp38-win32.whl", hash = "sha256:66ebe728194adc8720dbc4d662edbbfa55659ff23c9c493fb2dae0bfd4df5734"}, + {file = "dependency_injector-4.39.1-cp38-cp38-win_amd64.whl", hash = "sha256:4349974620f630d6726808e1291ec99713b64d449b84eb01581ee807a5a5c224"}, + {file = "dependency_injector-4.39.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d87cad0899b05cd08931bfb68ddf7be77711a67b0649c37f2045d7808977b082"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8efd965e5cfdd9f339ec895e73c119569851adedc175088d34a670f5206fea63"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:27f69485ca6b85c31d162ee86cf6ef71bb71dce9cd2b5d0745425dfc551eefa1"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a25b63de59dff04ec78f5161f00c0222a04a23def5d1f0eda14e389a32baf428"}, + {file = "dependency_injector-4.39.1-cp39-cp39-win32.whl", hash = "sha256:a14274f50d125b4579314c355e22af07def1a96641ca94bd75edcf1400b89477"}, + {file = "dependency_injector-4.39.1-cp39-cp39-win_amd64.whl", hash = "sha256:9950039d00625f9252cd26378a4406342b256886bb61e4db8b65e9f01270f53e"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6d7f39cd54678741e132e13da3a1367ac18058cbda61fe39d61c8583aa6fd757"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2368c7ba3c9ffaf816ea0f2d14c78d481491b805f62ac8496a78a51397d4689"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:84e32407bb16c58aa0d4b5ed8485537bc66ccc14cfffae7022f1204e35ec939a"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f2d80a42c546e1f934d427b071630d86653cd4a60c74b570c4ffb03025c1f1f9"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ca126bbed370b8c002c859ebeb76f6d83eba2d7fb5d66f37f47cfc19661d2889"}, ] fastavro = [ - {file = "fastavro-1.4.10-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:f225c81e869b3cefef6f2b478cd452693181ed7e645be3cea4d82024354ecaa0"}, - {file = "fastavro-1.4.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7669302c9124b7cd6c1bdff80c77116b2290c984814077fb7d01d7389586054"}, - {file = "fastavro-1.4.10-cp310-cp310-win_amd64.whl", hash = "sha256:995525bdfbdfef205ea148b5bc6a9fe5ccf921931123c39d9aad75a2b661681e"}, - {file = "fastavro-1.4.10-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:64244c53f1e4853184c2f7383d0332e1dcb34c38c05e6613530ade0378e8acfc"}, - {file = "fastavro-1.4.10-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c60965da6dc7a91e00ccd84d84797fad746555f44e8a816c4cc460fb231c44fe"}, - {file = "fastavro-1.4.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10eb25378f37dc00c10e83c4c0442c1a6d1b871f74a6dfdfc12b6447962bbdd0"}, - {file = "fastavro-1.4.10-cp37-cp37m-win_amd64.whl", hash = "sha256:d5719adf6045fc743de5fa738d561a81e58dc782c94f1b16cb21b5dd6253e7fd"}, - {file = "fastavro-1.4.10-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:24c4a1a8cc92e135ecfcd9cbd1f6cfa088cbc74d78c18e02a609cb11fa33778d"}, - {file = "fastavro-1.4.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0934490b0c3bcfd6bcbacbcb5144c6b5e4298cda209fbb17c856adf5405127dd"}, - {file = "fastavro-1.4.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a23763d73412c077aee401a0368c64cbc23859e26711dbae78a3cf0227f65165"}, - {file = "fastavro-1.4.10-cp38-cp38-win_amd64.whl", hash = "sha256:09f1dfdd8192ae09e0f477d1f024d8054fccdb099ad495d2a796bcee3cadebd1"}, - {file = "fastavro-1.4.10-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:0c6695753fa3035bbd0fa5cb21bf1b5dad39483c669b32ca0bb55fb07c1ccc87"}, - {file = "fastavro-1.4.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35f960dbba04647d8d6d5616f879622d2a1e8a84eb2d2e02a883a22e0803463a"}, - {file = "fastavro-1.4.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9660878ca01e3dbbee12385c5902a2b6b12ecbb5af4733d1026175a14b1ef67f"}, - {file = "fastavro-1.4.10-cp39-cp39-win_amd64.whl", hash = "sha256:64cbd386e408b3bcb2de53b1f847163073eb0d0d0338db65f76051c6ba9a9bc1"}, - {file = "fastavro-1.4.10.tar.gz", hash = "sha256:a24f9dd803c44bfb599476b000f9bd0088f7ac2401e6c20818f38d8af12785a0"}, -] -filelock = [ - {file = "filelock-3.6.0-py3-none-any.whl", hash = "sha256:f8314284bfffbdcfa0ff3d7992b023d4c628ced6feb957351d4c48d059f56bc0"}, - {file = "filelock-3.6.0.tar.gz", hash = "sha256:9cd540a9352e432c7246a48fe4e8712b10acb1df2ad1f30e8c070b82ae1fed85"}, + {file = "fastavro-1.4.11-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:44f01008f95d685edacc4b10366c755d25612df00924349f7d34a29f08522ce3"}, + {file = "fastavro-1.4.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18f5e736d12e67348f253da8a332d7c3b483ca04f2b6e772befa79d1a46bac9d"}, + {file = "fastavro-1.4.11-cp310-cp310-win_amd64.whl", hash = "sha256:8dca11bc3191cd7de0a3c4b76a70dac493356a219e96ebcde0def1f06faddef7"}, + {file = "fastavro-1.4.11-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:7a2a0bf03686f9d860e8f8476be000f5b3e6cc9af6853dbabab2ef9cfa5dc3a0"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c17e3decfac260e1be4d02d1903d2483eec2f3ce7f92c9b808a0f6a81572c4b"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19ba25c6529f50722a7618cc4ca24c7d265def57fd9f94e4e554e1df8cce38d2"}, + {file = "fastavro-1.4.11-cp37-cp37m-win_amd64.whl", hash = "sha256:ceaba04da9419f40899a670eb62eb373a127b511bb8e3ae4f6f1f23ec49bd0e4"}, + {file = "fastavro-1.4.11-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:732eab3a1ae5d2c3f4b52e747c55bcc41c4df0eb7e8a395038080741a3c0a934"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c03d3c802b71f44e7b3442abae961bba996258244bd222b242ad1e5cb7754e57"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cb7475a9b25b9f8aebe7eb756dafedd0369434571062f3883d894281befd7c"}, + {file = "fastavro-1.4.11-cp38-cp38-win_amd64.whl", hash = "sha256:ce0776f54591aef90bcd02bd919964abe4c2ad2a10a4336c3a1b66cef289b41c"}, + {file = "fastavro-1.4.11-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:621e72cc365c9539d7590e7b43e48a62e6bfb4c2de7c16837fed54d113d7312c"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:842b25782f911ee8c626f9d9fedc2ef01aeac272536fe90ee6d45b2ae7cdb024"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8491bfcba25c9d661289f884688e5a4f56f2ee389a240d0ad02692495a9a087"}, + {file = "fastavro-1.4.11-cp39-cp39-win_amd64.whl", hash = "sha256:c94130a8c8d80073eb0276844915aa5e928ae322024e76dc57943542ccda211c"}, + {file = "fastavro-1.4.11.tar.gz", hash = "sha256:7c64332ad52de0134be9a933ca986514c3ff85c63d54bc5398c31f0498ac1820"}, ] flake8 = [ {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, ] -identify = [ - {file = "identify-2.4.12-py2.py3-none-any.whl", hash = "sha256:5f06b14366bd1facb88b00540a1de05b69b310cbc2654db3c7e07fa3a4339323"}, - {file = "identify-2.4.12.tar.gz", hash = "sha256:3f3244a559290e7d3deb9e9adc7b33594c1bc85a9dd82e0f1be519bf12a1ec17"}, -] -idna = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, -] -imagesize = [ - {file = "imagesize-1.3.0-py2.py3-none-any.whl", hash = "sha256:1db2f82529e53c3e929e8926a1fa9235aa82d0bd0c580359c67ec31b2fddaa8c"}, - {file = "imagesize-1.3.0.tar.gz", hash = "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d"}, -] -importlib-metadata = [ - {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, - {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, -] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, @@ -1097,136 +569,49 @@ isort = [ {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, ] -jinja2 = [ - {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"}, - {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"}, -] -lmdb = [ - {file = "lmdb-1.3.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:63cb73fe7ce9eb93d992d632c85a0476b4332670d9e6a2802b5062f603b7809f"}, - {file = "lmdb-1.3.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:abbc439cd9fe60ffd6197009087ea885ac150017dc85384093b1d376f83f0ec4"}, - {file = "lmdb-1.3.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6260a526e4ad85b1f374a5ba9475bf369fb07e7728ea6ec57226b02c40d1976b"}, - {file = "lmdb-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e568ae0887ae196340947d9800136e90feaed6b86a261ef01f01b2ba65fc8106"}, - {file = "lmdb-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6a816954d212f40fd15007cd81ab7a6bebb77436d949a6a9ae04af57fc127f3"}, - {file = "lmdb-1.3.0-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:fa6439356e591d3249ab0e1778a6f8d8408e993f66dc911914c78208f5310309"}, - {file = "lmdb-1.3.0-cp35-cp35m-win_amd64.whl", hash = "sha256:c6adbd6f7f9048e97f31a069e652eb51020a81e80a0ce92dbb9810d21da2409a"}, - {file = "lmdb-1.3.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:eefb392f6b5cd43aada49258c5a79be11cb2c8cd3fc3e2d9319a1e0b9f906458"}, - {file = "lmdb-1.3.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a14aca2651c3af6f0d0a6b9168200eea0c8f2d27c40b01a442f33329a6e8dff"}, - {file = "lmdb-1.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cfa4aa9c67f8aee89b23005e98d1f3f32490b6b905fd1cb604b207cbd5755ab"}, - {file = "lmdb-1.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7da05d70fcc6561ac6b09e9fb1bf64b7ca294652c64c8a2889273970cee796b9"}, - {file = "lmdb-1.3.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:008243762decf8f6c90430a9bced56290ebbcdb5e877d90e42343bb97033e494"}, - {file = "lmdb-1.3.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:17215a42a4b9814c383deabecb160581e4fb75d00198eef0e3cea54f230ffbea"}, - {file = "lmdb-1.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65334eafa5d430b18d81ebd5362559a41483c362e1931f6e1b15bab2ecb7d75d"}, - {file = "lmdb-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:18c69fabdaf04efaf246587739cc1062b3e57c6ef0743f5c418df89e5e7e7b9b"}, - {file = "lmdb-1.3.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:41318717ab5d15ad2d6d263d34fbf614a045210f64b25e59ce734bb2105e421f"}, - {file = "lmdb-1.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:df2724bad7820114a205472994091097d0fa65a3e5fff5a8e688d123fb8c6326"}, - {file = "lmdb-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ddd590e1c7fcb395931aa3782fb89b9db4550ab2d81d006ecd239e0d462bc41"}, - {file = "lmdb-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:4172fba19417d7b29409beca7d73c067b54e5d8ab1fb9b51d7b4c1445d20a167"}, - {file = "lmdb-1.3.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2df38115dd9428a54d59ae7c712a4c7cce0d6b1d66056de4b1a8c38718066106"}, - {file = "lmdb-1.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d9103aa4908f0bca43c5911ca067d4e3d01f682dff0c0381a1239bd2bd757984"}, - {file = "lmdb-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:394df860c3f93cfd92b6f4caba785f38208cc9614c18b3803f83a2cc1695042f"}, - {file = "lmdb-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:62ab28e3593bdc318ea2f2fa1574e5fca3b6d1f264686d773ba54a637d4f563b"}, - {file = "lmdb-1.3.0-pp27-pypy_73-macosx_10_7_x86_64.whl", hash = "sha256:e6a704b3baced9182836c7f77b769f23856f3a8f62d0282b1bc1feaf81a86712"}, - {file = "lmdb-1.3.0-pp27-pypy_73-win_amd64.whl", hash = "sha256:08f4b5129f4683802569b02581142e415c8dcc0ff07605983ec1b07804cecbad"}, - {file = "lmdb-1.3.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:f291e3f561f58dddf63a92a5a6a4b8af3a0920b6705d35e2f80e52e86ee238a2"}, - {file = "lmdb-1.3.0.tar.gz", hash = "sha256:60a11efc21aaf009d06518996360eed346f6000bfc9de05114374230879f992e"}, -] -m2r2 = [ - {file = "m2r2-0.3.2-py3-none-any.whl", hash = "sha256:d3684086b61b4bebe2307f15189495360f05a123c9bda2a66462649b7ca236aa"}, - {file = "m2r2-0.3.2.tar.gz", hash = "sha256:ccd95b052dcd1ac7442ecb3111262b2001c10e4119b459c34c93ac7a5c2c7868"}, -] -markupsafe = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, -] mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] minos-microservice-common = [] minos-microservice-networks = [] -mistune = [ - {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, - {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, -] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] -nodeenv = [ - {file = "nodeenv-1.6.0-py2.py3-none-any.whl", hash = "sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"}, - {file = "nodeenv-1.6.0.tar.gz", hash = "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b"}, -] orjson = [ - {file = "orjson-3.6.7-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:93188a9d6eb566419ad48befa202dfe7cd7a161756444b99c4ec77faea9352a4"}, - {file = "orjson-3.6.7-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:82515226ecb77689a029061552b5df1802b75d861780c401e96ca6bc8495f775"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3af57ffab7848aaec6ba6b9e9b41331250b57bf696f9d502bacdc71a0ebab0ba"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:a7297504d1142e7efa236ffc53f056d73934a993a08646dbcee89fc4308a8fcf"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:5a50cde0dbbde255ce751fd1bca39d00ecd878ba0903c0480961b31984f2fab7"}, - {file = "orjson-3.6.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d21f9a2d1c30e58070f93988db4cad154b9009fafbde238b52c1c760e3607fbe"}, - {file = "orjson-3.6.7-cp310-none-win_amd64.whl", hash = "sha256:e152464c4606b49398afd911777decebcf9749cc8810c5b4199039e1afb0991e"}, - {file = "orjson-3.6.7-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:0a65f3c403f38b0117c6dd8e76e85a7bd51fcd92f06c5598dfeddbc44697d3e5"}, - {file = "orjson-3.6.7-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:6c47cfca18e41f7f37b08ff3e7abf5ada2d0f27b5ade934f05be5fc5bb956e9d"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:63185af814c243fad7a72441e5f98120c9ecddf2675befa486d669fb65539e9b"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2da6fde42182b80b40df2e6ab855c55090ebfa3fcc21c182b7ad1762b61d55c"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:48c5831ec388b4e2682d4ff56d6bfa4a2ef76c963f5e75f4ff4785f9cf338a80"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:913fac5d594ccabf5e8fbac15b9b3bb9c576d537d49eeec9f664e7a64dde4c4b"}, - {file = "orjson-3.6.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:58f244775f20476e5851e7546df109f75160a5178d44257d437ba6d7e562bfe8"}, - {file = "orjson-3.6.7-cp37-none-win_amd64.whl", hash = "sha256:2d5f45c6b85e5f14646df2d32ecd7ff20fcccc71c0ea1155f4d3df8c5299bbb7"}, - {file = "orjson-3.6.7-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:612d242493afeeb2068bc72ff2544aa3b1e627578fcf92edee9daebb5893ffea"}, - {file = "orjson-3.6.7-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:539cdc5067db38db27985e257772d073cd2eb9462d0a41bde96da4e4e60bd99b"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6d103b721bbc4f5703f62b3882e638c0b65fcdd48622531c7ffd45047ef8e87c"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb10a20f80e95102dd35dfbc3a22531661b44a09b55236b012a446955846b023"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:bb68d0da349cf8a68971a48ad179434f75256159fe8b0715275d9b49fa23b7a3"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:4a2c7d0a236aaeab7f69c17b7ab4c078874e817da1bfbb9827cb8c73058b3050"}, - {file = "orjson-3.6.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3be045ca3b96119f592904cf34b962969ce97bd7843cbfca084009f6c8d2f268"}, - {file = "orjson-3.6.7-cp38-none-win_amd64.whl", hash = "sha256:bd765c06c359d8a814b90f948538f957fa8a1f55ad1aaffcdc5771996aaea061"}, - {file = "orjson-3.6.7-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:7dd9e1e46c0776eee9e0649e3ae9584ea368d96851bcaeba18e217fa5d755283"}, - {file = "orjson-3.6.7-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:c4b4f20a1e3df7e7c83717aff0ef4ab69e42ce2fb1f5234682f618153c458406"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7107a5673fd0b05adbb58bf71c1578fc84d662d29c096eb6d998982c8635c221"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a08b6940dd9a98ccf09785890112a0f81eadb4f35b51b9a80736d1725437e22c"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:f5d1648e5a9d1070f3628a69a7c6c17634dbb0caf22f2085eca6910f7427bf1f"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:e6201494e8dff2ce7fd21da4e3f6dfca1a3fed38f9dcefc972f552f6596a7621"}, - {file = "orjson-3.6.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:70d0386abe02879ebaead2f9632dd2acb71000b4721fd8c1a2fb8c031a38d4d5"}, - {file = "orjson-3.6.7-cp39-none-win_amd64.whl", hash = "sha256:d9a3288861bfd26f3511fb4081561ca768674612bac59513cb9081bb61fcc87f"}, - {file = "orjson-3.6.7.tar.gz", hash = "sha256:a4bb62b11289b7620eead2f25695212e9ac77fcfba76f050fa8a540fb5c32401"}, + {file = "orjson-3.6.8-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:3a287a650458de2211db03681b71c3e5cb2212b62f17a39df8ad99fc54855d0f"}, + {file = "orjson-3.6.8-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:5204e25c12cea58e524fc82f7c27ed0586f592f777b33075a92ab7b3eb3687c2"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77e8386393add64f959c044e0fb682364fd0e611a6f477aa13f0e6a733bd6a28"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:279f2d2af393fdf8601020744cb206b91b54ad60fb8401e0761819c7bda1f4e4"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:c31c9f389be7906f978ed4192eb58a4b74a37ad60556a0b88ddc47c576697770"}, + {file = "orjson-3.6.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0db5c5a0c5b89f092d52f6e5a3701660a9d6ffa9e2968b3ce17c2bc4f5eb0414"}, + {file = "orjson-3.6.8-cp310-none-win_amd64.whl", hash = "sha256:eb22485847b9a0c4bbedc668df860126ac931edbed1d456cf41a59f3cb961ed8"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:1a5fe569310bc819279bd4d5f2c349910b104ed3207936246dd5d5e0b085e74a"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:ccb356a47ab1067cd3549847e9db1d279a63fe0482d315b3ffd6e7abef35ef77"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab29c069c222248ce302a25855b4e1664f9436e8ae5a131fb0859daf31676d2b"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2b5e4cba9e774ac011071d9d27760f97f4b8cd46003e971d122e712f971345"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:c311ec504414d22834d5b972a209619925b48263856a11a14d90230f9682d49c"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:a3dfec7950b90fb8d143743503ee53fa06b32e6068bdea792fc866284da3d71d"}, + {file = "orjson-3.6.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b890dbbada2cbb26eb29bd43a848426f007f094bb0758df10dfe7a438e1cb4b4"}, + {file = "orjson-3.6.8-cp37-none-win_amd64.whl", hash = "sha256:9143ae2c52771525be9ad11a7a8cc8e7fd75391b107e7e644a9e0050496f6b4f"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:33a82199fd42f6436f833e210ae5129c922a5c355629356ca7a8e82964da7285"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:90159ea8b9a5a2a98fa33dc7b421cfac4d2ae91ba5e1058f5909e7f059f6b467"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:656fbe15d9ef0733e740d9def78f4fdb4153102f4836ee774a05123499005931"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7be3be6153843e0f01351b1313a5ad4723595427680dac2dfff22a37e652ce02"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:dd24f66b6697ee7424f7da575ec6cbffc8ede441114d53470949cda4d97c6e56"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:b07c780f7345ecf5901356dc21dee0669defc489c38ce7b9ab0f5e008cc0385c"}, + {file = "orjson-3.6.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ea32015a5d8a4ce00d348a0de5dc7040e0ad58f970a8fcbb5713a1eac129e493"}, + {file = "orjson-3.6.8-cp38-none-win_amd64.whl", hash = "sha256:c5a3e382194c838988ec128a26b08aa92044e5e055491cc4056142af0c1c54d7"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:83a8424e857ae1bf53530e88b4eb2f16ca2b489073b924e655f1575cacd7f52a"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:81e1a6a2d67f15007dadacbf9ba5d3d79237e5e33786c028557fe5a2b72f1c9a"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:137b539881c77866eba86ff6a11df910daf2eb9ab8f1acae62f879e83d7c38af"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cbd358f3b3ad539a27e36900e8e7d172d0e1b72ad9dd7d69544dcbc0f067ee7"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:6ab94701542d40b90903ecfc339333f458884979a01cb9268bc662cc67a5f6d8"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:32b6f26593a9eb606b40775826beb0dac152e3d224ea393688fced036045a821"}, + {file = "orjson-3.6.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:afd9e329ebd3418cac3cd747769b1d52daa25fa672bbf414ab59f0e0881b32b9"}, + {file = "orjson-3.6.8-cp39-none-win_amd64.whl", hash = "sha256:0c89b419914d3d1f65a1b0883f377abe42a6e44f6624ba1c63e8846cbfc2fa60"}, + {file = "orjson-3.6.8.tar.gz", hash = "sha256:e19d23741c5de13689bb316abfccea15a19c264e3ec8eb332a5319a583595ace"}, ] packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, @@ -1236,80 +621,14 @@ pathspec = [ {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, ] -pbr = [ - {file = "pbr-5.8.1-py2.py3-none-any.whl", hash = "sha256:27108648368782d07bbf1cb468ad2e2eeef29086affd14087a6d04b7de8af4ec"}, - {file = "pbr-5.8.1.tar.gz", hash = "sha256:66bc5a34912f408bb3925bf21231cb6f59206267b7f63f3503ef865c1a292e25"}, -] platformdirs = [ - {file = "platformdirs-2.5.1-py3-none-any.whl", hash = "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"}, - {file = "platformdirs-2.5.1.tar.gz", hash = "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d"}, + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, ] pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] -pre-commit = [ - {file = "pre_commit-2.17.0-py2.py3-none-any.whl", hash = "sha256:725fa7459782d7bec5ead072810e47351de01709be838c2ce1726b9591dad616"}, - {file = "pre_commit-2.17.0.tar.gz", hash = "sha256:c1a8040ff15ad3d648c70cc3e55b93e4d2d5b687320955505587fd79bbaed06a"}, -] -psycopg2-binary = [ - {file = "psycopg2-binary-2.9.3.tar.gz", hash = "sha256:761df5313dc15da1502b21453642d7599d26be88bff659382f8f9747c7ebea4e"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:539b28661b71da7c0e428692438efbcd048ca21ea81af618d845e06ebfd29478"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e82d38390a03da28c7985b394ec3f56873174e2c88130e6966cb1c946508e65"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57804fc02ca3ce0dbfbef35c4b3a4a774da66d66ea20f4bda601294ad2ea6092"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:083a55275f09a62b8ca4902dd11f4b33075b743cf0d360419e2051a8a5d5ff76"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_24_ppc64le.whl", hash = "sha256:0a29729145aaaf1ad8bafe663131890e2111f13416b60e460dae0a96af5905c9"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a79d622f5206d695d7824cbf609a4f5b88ea6d6dab5f7c147fc6d333a8787e4"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:090f3348c0ab2cceb6dfbe6bf721ef61262ddf518cd6cc6ecc7d334996d64efa"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a9e1f75f96ea388fbcef36c70640c4efbe4650658f3d6a2967b4cc70e907352e"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c3ae8e75eb7160851e59adc77b3a19a976e50622e44fd4fd47b8b18208189d42"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-win32.whl", hash = "sha256:7b1e9b80afca7b7a386ef087db614faebbf8839b7f4db5eb107d0f1a53225029"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:8b344adbb9a862de0c635f4f0425b7958bf5a4b927c8594e6e8d261775796d53"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:e847774f8ffd5b398a75bc1c18fbb56564cda3d629fe68fd81971fece2d3c67e"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68641a34023d306be959101b345732360fc2ea4938982309b786f7be1b43a4a1"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3303f8807f342641851578ee7ed1f3efc9802d00a6f83c101d21c608cb864460"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_24_aarch64.whl", hash = "sha256:e3699852e22aa68c10de06524a3721ade969abf382da95884e6a10ff798f9281"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_24_ppc64le.whl", hash = "sha256:526ea0378246d9b080148f2d6681229f4b5964543c170dd10bf4faaab6e0d27f"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:b1c8068513f5b158cf7e29c43a77eb34b407db29aca749d3eb9293ee0d3103ca"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:15803fa813ea05bef089fa78835118b5434204f3a17cb9f1e5dbfd0b9deea5af"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:152f09f57417b831418304c7f30d727dc83a12761627bb826951692cc6491e57"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:404224e5fef3b193f892abdbf8961ce20e0b6642886cfe1fe1923f41aaa75c9d"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-win32.whl", hash = "sha256:1f6b813106a3abdf7b03640d36e24669234120c72e91d5cbaeb87c5f7c36c65b"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:2d872e3c9d5d075a2e104540965a1cf898b52274a5923936e5bfddb58c59c7c2"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:10bb90fb4d523a2aa67773d4ff2b833ec00857f5912bafcfd5f5414e45280fb1"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a52ecab70af13e899f7847b3e074eeb16ebac5615665db33bce8a1009cf33"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a29b3ca4ec9defec6d42bf5feb36bb5817ba3c0230dd83b4edf4bf02684cd0ae"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:12b11322ea00ad8db8c46f18b7dfc47ae215e4df55b46c67a94b4effbaec7094"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_24_ppc64le.whl", hash = "sha256:53293533fcbb94c202b7c800a12c873cfe24599656b341f56e71dd2b557be063"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c381bda330ddf2fccbafab789d83ebc6c53db126e4383e73794c74eedce855ef"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9d29409b625a143649d03d0fd7b57e4b92e0ecad9726ba682244b73be91d2fdb"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:183a517a3a63503f70f808b58bfbf962f23d73b6dccddae5aa56152ef2bcb232"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:15c4e4cfa45f5a60599d9cec5f46cd7b1b29d86a6390ec23e8eebaae84e64554"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-win32.whl", hash = "sha256:adf20d9a67e0b6393eac162eb81fb10bc9130a80540f4df7e7355c2dd4af9fba"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2f9ffd643bc7349eeb664eba8864d9e01f057880f510e4681ba40a6532f93c71"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:def68d7c21984b0f8218e8a15d514f714d96904265164f75f8d3a70f9c295667"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dffc08ca91c9ac09008870c9eb77b00a46b3378719584059c034b8945e26b272"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:280b0bb5cbfe8039205c7981cceb006156a675362a00fe29b16fbc264e242834"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:af9813db73395fb1fc211bac696faea4ca9ef53f32dc0cfa27e4e7cf766dcf24"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_24_ppc64le.whl", hash = "sha256:63638d875be8c2784cfc952c9ac34e2b50e43f9f0a0660b65e2a87d656b3116c"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ffb7a888a047696e7f8240d649b43fb3644f14f0ee229077e7f6b9f9081635bd"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0c9d5450c566c80c396b7402895c4369a410cab5a82707b11aee1e624da7d004"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:d1c1b569ecafe3a69380a94e6ae09a4789bbb23666f3d3a08d06bbd2451f5ef1"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8fc53f9af09426a61db9ba357865c77f26076d48669f2e1bb24d85a22fb52307"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-win32.whl", hash = "sha256:6472a178e291b59e7f16ab49ec8b4f3bdada0a879c68d3817ff0963e722a82ce"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:35168209c9d51b145e459e05c31a9eaeffa9a6b0fd61689b48e07464ffd1a83e"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:47133f3f872faf28c1e87d4357220e809dfd3fa7c64295a4a148bcd1e6e34ec9"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91920527dea30175cc02a1099f331aa8c1ba39bf8b7762b7b56cbf54bc5cce42"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:887dd9aac71765ac0d0bac1d0d4b4f2c99d5f5c1382d8b770404f0f3d0ce8a39"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:1f14c8b0942714eb3c74e1e71700cbbcb415acbc311c730370e70c578a44a25c"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_24_ppc64le.whl", hash = "sha256:7af0dd86ddb2f8af5da57a976d27cd2cd15510518d582b478fbb2292428710b4"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:93cd1967a18aa0edd4b95b1dfd554cf15af657cb606280996d393dadc88c3c35"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bda845b664bb6c91446ca9609fc69f7db6c334ec5e4adc87571c34e4f47b7ddb"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:01310cf4cf26db9aea5158c217caa92d291f0500051a6469ac52166e1a16f5b7"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:99485cab9ba0fa9b84f1f9e1fef106f44a46ef6afdeec8885e0b88d0772b49e8"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-win32.whl", hash = "sha256:46f0e0a6b5fa5851bbd9ab1bc805eef362d3a230fbdfbc209f4a236d0a7a990d"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:accfe7e982411da3178ec690baaceaad3c278652998b2c45828aaac66cd8285f"}, -] py = [ {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, @@ -1322,21 +641,13 @@ pyflakes = [ {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, ] -pygments = [ - {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"}, - {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"}, -] pyparsing = [ - {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"}, - {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, ] pytest = [ - {file = "pytest-7.1.1-py3-none-any.whl", hash = "sha256:92f723789a8fdd7180b6b06483874feca4c48a5c76968e03bb3e7f806a1869ea"}, - {file = "pytest-7.1.1.tar.gz", hash = "sha256:841132caef6b1ad17a9afde46dc4f6cfa59a05f9555aae5151f73bdf2820ca63"}, -] -pytz = [ - {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"}, - {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"}, + {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, + {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"}, ] pyyaml = [ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, @@ -1373,73 +684,17 @@ pyyaml = [ {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] -requests = [ - {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, - {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, -] six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] -snowballstemmer = [ - {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, - {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, -] -sphinx = [ - {file = "Sphinx-4.5.0-py3-none-any.whl", hash = "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226"}, - {file = "Sphinx-4.5.0.tar.gz", hash = "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6"}, -] -sphinx-autodoc-typehints = [ - {file = "sphinx_autodoc_typehints-1.17.0-py3-none-any.whl", hash = "sha256:081daf53077b4ae1c28347d6d858e13e63aefe3b4aacef79fd717dd60687b470"}, - {file = "sphinx_autodoc_typehints-1.17.0.tar.gz", hash = "sha256:51c7b3f5cb9ccd15d0b52088c62df3094f1abd9612930340365c26def8629a14"}, -] -sphinx-rtd-theme = [ - {file = "sphinx_rtd_theme-1.0.0-py2.py3-none-any.whl", hash = "sha256:4d35a56f4508cfee4c4fb604373ede6feae2a306731d533f409ef5c3496fdbd8"}, - {file = "sphinx_rtd_theme-1.0.0.tar.gz", hash = "sha256:eec6d497e4c2195fa0e8b2016b337532b8a699a68bcb22a512870e16925c6a5c"}, -] -sphinxcontrib-apidoc = [ - {file = "sphinxcontrib-apidoc-0.3.0.tar.gz", hash = "sha256:729bf592cf7b7dd57c4c05794f732dc026127275d785c2a5494521fdde773fb9"}, - {file = "sphinxcontrib_apidoc-0.3.0-py2.py3-none-any.whl", hash = "sha256:6671a46b2c6c5b0dca3d8a147849d159065e50443df79614f921b42fbd15cb09"}, -] -sphinxcontrib-applehelp = [ - {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, - {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, -] -sphinxcontrib-devhelp = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, -] -sphinxcontrib-htmlhelp = [ - {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, - {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, -] -sphinxcontrib-jsmath = [ - {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, - {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, -] -sphinxcontrib-qthelp = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, -] -sphinxcontrib-serializinghtml = [ - {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, - {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] tomli = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] typing-extensions = [ - {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, - {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, -] -urllib3 = [ - {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, - {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, + {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, + {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, ] uvloop = [ {file = "uvloop-0.16.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6224f1401025b748ffecb7a6e2652b17768f30b1a6a3f7b44660e5b5b690b12d"}, @@ -1459,11 +714,3 @@ uvloop = [ {file = "uvloop-0.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e5f2e2ff51aefe6c19ee98af12b4ae61f5be456cd24396953244a30880ad861"}, {file = "uvloop-0.16.0.tar.gz", hash = "sha256:f74bc20c7b67d1c27c72601c78cf95be99d5c2cdd4514502b4f3eb0933ff1228"}, ] -virtualenv = [ - {file = "virtualenv-20.14.0-py2.py3-none-any.whl", hash = "sha256:1e8588f35e8b42c6ec6841a13c5e88239de1e6e4e4cedfd3916b306dc826ec66"}, - {file = "virtualenv-20.14.0.tar.gz", hash = "sha256:8e5b402037287126e81ccde9432b95a8be5b19d36584f64957060a3488c11ca8"}, -] -zipp = [ - {file = "zipp-3.7.0-py3-none-any.whl", hash = "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375"}, - {file = "zipp-3.7.0.tar.gz", hash = "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d"}, -] diff --git a/packages/core/minos-microservice-aggregate/pyproject.toml b/packages/core/minos-microservice-aggregate/pyproject.toml index bc41cf257..1f789bd55 100644 --- a/packages/core/minos-microservice-aggregate/pyproject.toml +++ b/packages/core/minos-microservice-aggregate/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "minos-microservice-aggregate" -version = "0.6.0" +version = "0.7.0" description = "The Aggregate pattern of the Minos Framework" readme = "README.md" repository = "https://github.com/minos-framework/minos-python" @@ -21,35 +21,28 @@ keywords = [ "saga", ] packages = [ - { include = "minos" } + { include = "minos" }, ] include = [ - "AUTHORS.md", - "HISTORY.md", - "LICENSE", + { path = "AUTHORS.md", format = "sdist" }, + { path = "HISTORY.md", format = "sdist" }, + { path = "LICENSE", format = "sdist" }, ] [tool.poetry.dependencies] python = "^3.9" -minos-microservice-common = "^0.6.0" -minos-microservice-networks = "^0.6.0" +minos-microservice-common = "^0.7.0" +minos-microservice-networks = "^0.7.0" cached-property = "^1.5.2" -psycopg2-binary = "^2.9.3" [tool.poetry.dev-dependencies] minos-microservice-common = { path = "../minos-microservice-common", develop = true } minos-microservice-networks = { path = "../minos-microservice-networks", develop = true } -black = "^22.1" +black = "^22.3" isort = "^5.8.0" -pytest = "^7.0.1" +pytest = "^7.1.2" coverage = "^6.3" flake8 = "^4.0.1" -Sphinx = "^4.0.1" -pre-commit = "^2.12.1" -sphinx-autodoc-typehints = "^1.17.0" -sphinxcontrib-apidoc = "^0.3.0" -sphinx-rtd-theme = "^1.0.0" -m2r2 = "^0.3.2" [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_aggregate.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_aggregate.py index 89e6fd82a..b40b46a90 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_aggregate.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_aggregate.py @@ -11,13 +11,13 @@ ) from tests.utils import ( CONFIG_FILE_PATH, - MinosTestCase, + AggregateTestCase, Order, OrderAggregate, ) -class TestAggregate(MinosTestCase): +class TestAggregate(AggregateTestCase): async def test_root(self): async with OrderAggregate.from_config(CONFIG_FILE_PATH) as aggregate: self.assertEqual(Order, aggregate.root) diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_collections.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_collections.py index 9a655318f..e1acb1035 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_collections.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_collections.py @@ -8,6 +8,7 @@ from minos.aggregate import ( Action, + Entity, EntitySet, IncrementalSetDiff, IncrementalSetDiffEntry, @@ -20,6 +21,10 @@ ) +class _NotHashable(Entity): + foo: set[int] + + class TestEntitySet(unittest.TestCase): def test_data(self): raw = {OrderItem("John"), OrderItem("Michael")} @@ -139,6 +144,10 @@ def test_avro_bytes(self): expected = EntitySet({OrderItem("John"), OrderItem("Michael")}) self.assertEqual(expected, Model.from_avro_bytes(expected.avro_bytes)) + def test_avro_bytes_not_hashable(self): + expected = EntitySet([_NotHashable({1}), _NotHashable({2})]) + self.assertEqual(expected, Model.from_avro_bytes(expected.avro_bytes)) + class TestEntitySetDiff(unittest.TestCase): def setUp(self) -> None: diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_base.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_base.py index 4634fb8f9..455b410d5 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_base.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_base.py @@ -18,12 +18,12 @@ current_datetime, ) from tests.utils import ( + AggregateTestCase, Car, - MinosTestCase, ) -class TestRootEntity(MinosTestCase): +class TestRootEntity(AggregateTestCase): async def test_create(self): observed = await Car.create(doors=3, color="blue") expected = Car( diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_broker.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_broker.py index f94810954..c9143461a 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_broker.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_broker.py @@ -14,13 +14,13 @@ BrokerMessageV1, ) from tests.utils import ( + AggregateTestCase, Car, - MinosTestCase, Owner, ) -class TestRootEntityBroker(MinosTestCase): +class TestRootEntityBroker(AggregateTestCase): async def test_create(self): car = await Car.create(doors=3, color="blue") diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_differences.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_differences.py index 8fb49716e..0e2f5f1bb 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_differences.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_differences.py @@ -13,12 +13,12 @@ current_datetime, ) from tests.utils import ( + AggregateTestCase, Car, - MinosTestCase, ) -class TestRootEntityDifferences(MinosTestCase): +class TestRootEntityDifferences(AggregateTestCase): async def asyncSetUp(self) -> None: self.uuid = uuid4() self.uuid_another = uuid4() diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_not_provided.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_not_provided.py index 1ea55bd1e..bad23aa57 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_not_provided.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_not_provided.py @@ -10,12 +10,12 @@ NotProvidedException, ) from tests.utils import ( + AggregateTestCase, Car, - MinosTestCase, ) -class TestRootEntityNotProvided(MinosTestCase): +class TestRootEntityNotProvided(AggregateTestCase): async def test_create_raises(self): with self.assertRaises(NotProvidedException): await Car.create(doors=3, color="blue", _event_repository=None) diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_with_postgresql.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_with_postgresql.py index 898590f95..923dafd53 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_with_postgresql.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_with_postgresql.py @@ -2,37 +2,34 @@ from minos.aggregate import ( AlreadyDeletedException, + DatabaseEventRepository, + DatabaseSnapshotRepository, + DatabaseTransactionRepository, EntitySet, - PostgreSqlEventRepository, - PostgreSqlSnapshotRepository, - PostgreSqlTransactionRepository, ValueObjectSet, ) from minos.common.testing import ( - PostgresAsyncTestCase, + DatabaseMinosTestCase, ) from tests.utils import ( - CONFIG_FILE_PATH, + AggregateTestCase, Car, - MinosTestCase, Order, OrderItem, Review, ) -class TestExternalEntityWithPostgreSql(MinosTestCase, PostgresAsyncTestCase): - CONFIG_FILE_PATH = CONFIG_FILE_PATH - +class TestExternalEntityWithDatabase(AggregateTestCase, DatabaseMinosTestCase): def setUp(self): super().setUp() - self.transaction_repository = PostgreSqlTransactionRepository.from_config(self.config) + self.transaction_repository = DatabaseTransactionRepository.from_config(self.config) - self.event_repository = PostgreSqlEventRepository.from_config( + self.event_repository = DatabaseEventRepository.from_config( self.config, transaction_repository=self.transaction_repository ) - self.snapshot_repository = PostgreSqlSnapshotRepository.from_config( + self.snapshot_repository = DatabaseSnapshotRepository.from_config( self.config, event_repository=self.event_repository, transaction_repository=self.transaction_repository ) diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_refs/test_injectors.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_refs/test_injectors.py index f88b5d0a7..c1572f1c2 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_refs/test_injectors.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_refs/test_injectors.py @@ -12,12 +12,12 @@ ModelType, ) from tests.utils import ( + AggregateTestCase, Car, - MinosTestCase, ) -class TestRefInjector(MinosTestCase): +class TestRefInjector(AggregateTestCase): async def test_simple(self): model = await Car.create(3, "test") mapper = {model.uuid: model} diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_refs/test_models.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_refs/test_models.py index 073427bcc..c82b06229 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_refs/test_models.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_refs/test_models.py @@ -25,7 +25,7 @@ ModelType, ) from tests.utils import ( - MinosTestCase, + AggregateTestCase, ) FakeMessage = ModelType.build("FakeMessage", {"content": Any}) @@ -34,7 +34,7 @@ Foo = ModelType.build("Foo", {"another": Ref[Bar]}) -class TestRef(MinosTestCase): +class TestRef(AggregateTestCase): def test_subclass(self): # noinspection PyTypeHints self.assertTrue(issubclass(Ref, (DeclarativeModel, UUID, Generic))) diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_refs/test_resolvers.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_refs/test_resolvers.py index 52a173dad..f19bfcc8b 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_refs/test_resolvers.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_refs/test_resolvers.py @@ -11,6 +11,7 @@ ) from minos.common import ( ModelType, + NotProvidedException, ) from minos.networks import ( BrokerMessageV1, @@ -18,14 +19,14 @@ BrokerMessageV1Status, ) from tests.utils import ( - MinosTestCase, + AggregateTestCase, ) Bar = ModelType.build("Bar", {"uuid": UUID, "version": int}) Foo = ModelType.build("Foo", {"uuid": UUID, "version": int, "another": Ref[Bar]}) -class TestRefResolver(MinosTestCase): +class TestRefResolver(AggregateTestCase): def setUp(self) -> None: super().setUp() self.resolver = RefResolver() @@ -34,6 +35,11 @@ def setUp(self) -> None: self.another_uuid = uuid4() self.value = Foo(self.uuid, 1, another=Ref(self.another_uuid)) + def test_broker_pool_not_provided(self): + with self.assertRaises(NotProvidedException): + # noinspection PyArgumentEqualDefault + RefResolver(broker_pool=None, pool_factory=None) + async def test_resolve(self): self.broker_subscriber_builder.with_messages( [BrokerMessageV1("", BrokerMessageV1Payload([Bar(self.value.another.uuid, 1)]))] diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_entries.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_entries.py index a2941bdfc..cf57c6055 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_entries.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_entries.py @@ -39,6 +39,11 @@ def test_constructor(self): self.assertEqual(None, entry.created_at) self.assertEqual(NULL_UUID, entry.transaction_uuid) + # noinspection SpellCheckingInspection + def test_constructor_with_memoryview_data(self): + entry = EventEntry(self.uuid, "example.Car", 0, memoryview(bytes("car", "utf-8"))) + self.assertEqual(bytes("car", "utf-8"), entry.data) + def test_constructor_extended(self): entry = EventEntry( uuid=self.uuid, diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_fields.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_fields.py index 25fbf55d5..333d8705a 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_fields.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_fields.py @@ -25,13 +25,13 @@ ModelType, ) from tests.utils import ( + AggregateTestCase, Car, - MinosTestCase, Owner, ) -class TestFieldDiffContainer(MinosTestCase): +class TestFieldDiffContainer(AggregateTestCase): async def asyncSetUp(self) -> None: await super().asyncSetUp() self.car_one = Car(3, "blue", id=1, version=1) diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_models.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_models.py index d79712314..b1b2de705 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_models.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_models.py @@ -19,13 +19,13 @@ current_datetime, ) from tests.utils import ( + AggregateTestCase, Car, - MinosTestCase, Owner, ) -class TestEvent(MinosTestCase): +class TestEvent(AggregateTestCase): async def asyncSetUp(self) -> None: await super().asyncSetUp() diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_repositories/test_abc.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_repositories/test_abc.py index acc80f29c..90a09c8ee 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_repositories/test_abc.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_repositories/test_abc.py @@ -35,15 +35,17 @@ NULL_UUID, NotProvidedException, SetupMixin, + classname, current_datetime, ) from minos.networks import ( BrokerMessageV1, ) from tests.utils import ( + AggregateTestCase, + Car, FakeAsyncIterator, FakeLock, - MinosTestCase, ) @@ -62,7 +64,7 @@ async def _offset(self) -> int: return 0 -class TestEventRepository(MinosTestCase): +class TestEventRepository(AggregateTestCase): def setUp(self) -> None: super().setUp() self.event_repository = _EventRepository() @@ -78,7 +80,7 @@ def test_constructor(self): repository = _EventRepository() self.assertEqual(self.broker_publisher, repository._broker_publisher) self.assertEqual(self.transaction_repository, repository._transaction_repository) - self.assertEqual(self.lock_pool, repository._lock_pool) + self.assertEqual(self.pool_factory.get_pool("lock"), repository._lock_pool) async def test_constructor_raises(self): with self.assertRaises(NotProvidedException): @@ -88,8 +90,8 @@ async def test_constructor_raises(self): # noinspection PyTypeChecker _EventRepository(transaction_repository=None) with self.assertRaises(NotProvidedException): - # noinspection PyTypeChecker - _EventRepository(lock_pool=None) + # noinspection PyArgumentEqualDefault + _EventRepository(lock_pool=None, pool_factory=None) def test_transaction(self): uuid = uuid4() @@ -455,7 +457,7 @@ def test_write_lock(self): expected = FakeLock() mock = MagicMock(return_value=expected) - self.lock_pool.acquire = mock + self.pool_factory.get_pool("lock").acquire = mock self.assertEqual(expected, self.event_repository.write_lock()) self.assertEqual([call("aggregate_event_write_lock")], mock.call_args_list) @@ -465,17 +467,16 @@ async def test_select(self): self.event_repository._select = mock uuid = uuid4() - name = "path.to.Product" transaction_uuid = uuid4() - iterable = self.event_repository.select(uuid=uuid, name=name, id_gt=56, transaction_uuid=transaction_uuid) + iterable = self.event_repository.select(uuid=uuid, name=Car, id_gt=56, transaction_uuid=transaction_uuid) observed = [a async for a in iterable] self.assertEqual(list(range(5)), observed) self.assertEqual(1, mock.call_count) args = call( uuid=uuid, - name=name, + name=classname(Car), version=None, version_lt=None, version_gt=None, diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_repositories/test_database.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_repositories/test_database.py new file mode 100644 index 000000000..fef33992f --- /dev/null +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_repositories/test_database.py @@ -0,0 +1,392 @@ +import unittest +from datetime import ( + datetime, + timezone, +) +from unittest.mock import ( + patch, +) +from uuid import ( + uuid4, +) + +from minos.aggregate import ( + Action, + DatabaseEventRepository, + EventRepository, +) +from minos.aggregate.testing import ( + EventRepositoryTestCase, +) +from minos.common import ( + DatabaseClient, + IntegrityException, + current_datetime, +) +from tests.utils import ( + AggregateTestCase, + FakeAsyncIterator, +) + + +class TestDatabaseEventRepositorySubmit(AggregateTestCase, EventRepositoryTestCase): + __test__ = True + + def build_event_repository(self) -> EventRepository: + """For testing purposes.""" + return DatabaseEventRepository.from_config(self.config) + + async def test_generate_uuid(self): + fetch_one = [ + (1, self.uuid, 1, current_datetime()), + ] + fetch_all = [(self.uuid, "example.Car", 1, bytes(), 1, Action.CREATE, current_datetime())] + with patch.object(DatabaseClient, "fetch_one", side_effect=fetch_one): + with patch.object(DatabaseClient, "fetch_all", return_value=FakeAsyncIterator(fetch_all)): + await super().test_generate_uuid() + + async def test_submit(self): + fetch_one = [ + (1, self.uuid, 1, current_datetime()), + ] + fetch_all = [(self.uuid, "example.Car", 1, bytes(), 1, Action.CREATE, current_datetime())] + with patch.object(DatabaseClient, "fetch_one", side_effect=fetch_one): + with patch.object(DatabaseClient, "fetch_all", return_value=FakeAsyncIterator(fetch_all)): + await super().test_submit() + + async def test_submit_with_version(self): + fetch_one = [ + (1, self.uuid, 3, current_datetime()), + ] + fetch_all = [(self.uuid, "example.Car", 3, bytes(), 1, Action.CREATE, current_datetime())] + with patch.object(DatabaseClient, "fetch_one", side_effect=fetch_one): + with patch.object(DatabaseClient, "fetch_all", return_value=FakeAsyncIterator(fetch_all)): + await super().test_submit_with_version() + + async def test_submit_with_created_at(self): + created_at = datetime(2021, 10, 25, 8, 30, tzinfo=timezone.utc) + fetch_one = [ + (1, self.uuid, 1, created_at), + ] + fetch_all = [(self.uuid, "example.Car", 1, bytes(), 1, Action.CREATE, created_at)] + with patch.object(DatabaseClient, "fetch_one", side_effect=fetch_one): + with patch.object(DatabaseClient, "fetch_all", return_value=FakeAsyncIterator(fetch_all)): + await super().test_submit_with_created_at() + + async def test_submit_raises_duplicate(self): + fetch_one = [ + (1, uuid4(), 1, current_datetime()), + IntegrityException(""), + (1,), + ] + with patch.object(DatabaseClient, "fetch_one", side_effect=fetch_one): + await super().test_submit_raises_duplicate() + + async def test_offset(self): + fetch_one = [ + (0,), + (1, uuid4(), 1, current_datetime()), + (1,), + ] + with patch.object(DatabaseClient, "fetch_one", side_effect=fetch_one): + await super().test_offset() + + async def populate(self) -> None: + with patch.object( + DatabaseClient, + "fetch_one", + side_effect=[ + (1, uuid4(), 1, current_datetime()), + (2, uuid4(), 2, current_datetime()), + (3, uuid4(), 1, current_datetime()), + (4, uuid4(), 3, current_datetime()), + (5, uuid4(), 4, current_datetime()), + (6, uuid4(), 2, current_datetime()), + (7, uuid4(), 1, current_datetime()), + (8, uuid4(), 3, current_datetime()), + (9, uuid4(), 3, current_datetime()), + (10, uuid4(), 4, current_datetime()), + ], + ): + await super().populate() + + async def test_select(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [ + tuple(self.entries[0].as_raw().values()), + tuple(self.entries[1].as_raw().values()), + tuple(self.entries[2].as_raw().values()), + tuple(self.entries[3].as_raw().values()), + tuple(self.entries[4].as_raw().values()), + tuple(self.entries[5].as_raw().values()), + tuple(self.entries[6].as_raw().values()), + tuple(self.entries[7].as_raw().values()), + tuple(self.entries[8].as_raw().values()), + tuple(self.entries[9].as_raw().values()), + ] + ), + ): + await super().test_select() + + async def test_select_id(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [ + tuple(self.entries[1].as_raw().values()), + ] + ), + ): + await super().test_select_id() + + async def test_select_id_lt(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [ + tuple(self.entries[0].as_raw().values()), + tuple(self.entries[1].as_raw().values()), + tuple(self.entries[2].as_raw().values()), + tuple(self.entries[3].as_raw().values()), + ] + ), + ): + await super().test_select_id_lt() + + async def test_select_id_gt(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [ + tuple(self.entries[4].as_raw().values()), + tuple(self.entries[5].as_raw().values()), + tuple(self.entries[6].as_raw().values()), + tuple(self.entries[7].as_raw().values()), + tuple(self.entries[8].as_raw().values()), + tuple(self.entries[9].as_raw().values()), + ] + ), + ): + await super().test_select_id_gt() + + async def test_select_id_le(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [ + tuple(self.entries[0].as_raw().values()), + tuple(self.entries[1].as_raw().values()), + tuple(self.entries[2].as_raw().values()), + tuple(self.entries[3].as_raw().values()), + ] + ), + ): + await super().test_select_id_le() + + async def test_select_id_ge(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [ + tuple(self.entries[4].as_raw().values()), + tuple(self.entries[5].as_raw().values()), + tuple(self.entries[6].as_raw().values()), + tuple(self.entries[7].as_raw().values()), + tuple(self.entries[8].as_raw().values()), + tuple(self.entries[9].as_raw().values()), + ] + ), + ): + await super().test_select_id_ge() + + async def test_select_uuid(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [ + tuple(self.entries[2].as_raw().values()), + tuple(self.entries[5].as_raw().values()), + tuple(self.entries[7].as_raw().values()), + tuple(self.entries[8].as_raw().values()), + tuple(self.entries[9].as_raw().values()), + ] + ), + ): + await super().test_select_uuid() + + async def test_select_name(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [ + tuple(self.entries[6].as_raw().values()), + ] + ), + ): + await super().test_select_name() + + async def test_select_version(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [ + tuple(self.entries[4].as_raw().values()), + tuple(self.entries[9].as_raw().values()), + ] + ), + ): + await super().test_select_version() + + async def test_select_version_lt(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [ + tuple(self.entries[0].as_raw().values()), + tuple(self.entries[2].as_raw().values()), + tuple(self.entries[6].as_raw().values()), + ] + ), + ): + await super().test_select_version_lt() + + async def test_select_version_gt(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [ + tuple(self.entries[1].as_raw().values()), + tuple(self.entries[3].as_raw().values()), + tuple(self.entries[4].as_raw().values()), + tuple(self.entries[5].as_raw().values()), + tuple(self.entries[7].as_raw().values()), + tuple(self.entries[8].as_raw().values()), + tuple(self.entries[9].as_raw().values()), + ] + ), + ): + await super().test_select_version_gt() + + async def test_select_version_le(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [ + tuple(self.entries[0].as_raw().values()), + tuple(self.entries[2].as_raw().values()), + tuple(self.entries[6].as_raw().values()), + ] + ), + ): + await super().test_select_version_le() + + async def test_select_version_ge(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [ + tuple(self.entries[1].as_raw().values()), + tuple(self.entries[3].as_raw().values()), + tuple(self.entries[4].as_raw().values()), + tuple(self.entries[5].as_raw().values()), + tuple(self.entries[7].as_raw().values()), + tuple(self.entries[8].as_raw().values()), + tuple(self.entries[9].as_raw().values()), + ] + ), + ): + await super().test_select_version_ge() + + async def test_select_transaction_uuid_null(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [ + tuple(self.entries[0].as_raw().values()), + tuple(self.entries[1].as_raw().values()), + tuple(self.entries[2].as_raw().values()), + tuple(self.entries[3].as_raw().values()), + tuple(self.entries[4].as_raw().values()), + tuple(self.entries[5].as_raw().values()), + tuple(self.entries[6].as_raw().values()), + ] + ), + ): + await super().test_select_transaction_uuid_null() + + async def test_select_transaction_uuid(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [ + tuple(self.entries[7].as_raw().values()), + tuple(self.entries[9].as_raw().values()), + ] + ), + ): + await super().test_select_transaction_uuid() + + async def test_select_transaction_uuid_ne(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [ + tuple(self.entries[7].as_raw().values()), + tuple(self.entries[8].as_raw().values()), + tuple(self.entries[9].as_raw().values()), + ] + ), + ): + await super().test_select_transaction_uuid_ne() + + async def test_select_transaction_uuid_in(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [ + tuple(self.entries[7].as_raw().values()), + tuple(self.entries[8].as_raw().values()), + tuple(self.entries[9].as_raw().values()), + ] + ), + ): + await super().test_select_transaction_uuid_in() + + async def test_select_combined(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [ + tuple(self.entries[2].as_raw().values()), + tuple(self.entries[5].as_raw().values()), + tuple(self.entries[7].as_raw().values()), + tuple(self.entries[8].as_raw().values()), + tuple(self.entries[9].as_raw().values()), + ] + ), + ): + await super().test_select_combined() + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_repositories/test_memory.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_repositories/test_memory.py index 02d1a69e3..c1efcdce1 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_repositories/test_memory.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_repositories/test_memory.py @@ -4,21 +4,15 @@ EventRepository, InMemoryEventRepository, ) -from tests.testcases import ( - EventRepositorySelectTestCase, - EventRepositorySubmitTestCase, +from minos.aggregate.testing import ( + EventRepositoryTestCase, +) +from tests.utils import ( + AggregateTestCase, ) -class TestInMemoryEventRepositorySubmit(EventRepositorySubmitTestCase): - __test__ = True - - def build_event_repository(self) -> EventRepository: - """For testing purposes.""" - return InMemoryEventRepository() - - -class TestInMemoryEventRepositorySelect(EventRepositorySelectTestCase): +class TestInMemoryEventRepositorySubmit(AggregateTestCase, EventRepositoryTestCase): __test__ = True def build_event_repository(self) -> EventRepository: diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_repositories/test_pg.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_repositories/test_pg.py deleted file mode 100644 index bb04300c0..000000000 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_repositories/test_pg.py +++ /dev/null @@ -1,101 +0,0 @@ -import unittest - -import aiopg - -from minos.aggregate import ( - EventRepository, - PostgreSqlEventRepository, -) -from minos.common.testing import ( - PostgresAsyncTestCase, -) -from tests.testcases import ( - EventRepositorySelectTestCase, - EventRepositorySubmitTestCase, -) -from tests.utils import ( - CONFIG_FILE_PATH, -) - - -class TestPostgreSqlEventRepositorySubmit(PostgresAsyncTestCase, EventRepositorySubmitTestCase): - __test__ = True - - CONFIG_FILE_PATH = CONFIG_FILE_PATH - - def setUp(self) -> None: - PostgresAsyncTestCase.setUp(self) - EventRepositorySubmitTestCase.setUp(self) - - async def asyncSetUp(self): - await PostgresAsyncTestCase.asyncSetUp(self) - await EventRepositorySubmitTestCase.asyncSetUp(self) - - def tearDown(self): - EventRepositorySubmitTestCase.tearDown(self) - PostgresAsyncTestCase.tearDown(self) - - async def asyncTearDown(self): - await EventRepositorySelectTestCase.asyncTearDown(self) - await PostgresAsyncTestCase.asyncTearDown(self) - - def build_event_repository(self) -> EventRepository: - """Fort testing purposes.""" - return PostgreSqlEventRepository(**self.repository_db) - - def test_constructor(self): - repository = PostgreSqlEventRepository("database", "host", 1234, "user", "password") - self.assertIsInstance(repository, EventRepository) - self.assertEqual("host", repository.host) - self.assertEqual(1234, repository.port) - self.assertEqual("database", repository.database) - self.assertEqual("user", repository.user) - self.assertEqual("password", repository.password) - - def test_from_config(self): - repository = PostgreSqlEventRepository.from_config(self.config) - repository_config = self.config.get_database_by_name("event") - self.assertEqual(repository_config["database"], repository.database) - self.assertEqual(repository_config["user"], repository.user) - self.assertEqual(repository_config["password"], repository.password) - self.assertEqual(repository_config["host"], repository.host) - self.assertEqual(repository_config["port"], repository.port) - - async def test_setup(self): - async with aiopg.connect(**self.repository_db) as connection: - async with connection.cursor() as cursor: - await cursor.execute( - "SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'aggregate_event');" - ) - response = (await cursor.fetchone())[0] - self.assertTrue(response) - - -class TestPostgreSqlRepositorySelect(PostgresAsyncTestCase, EventRepositorySelectTestCase): - __test__ = True - - CONFIG_FILE_PATH = CONFIG_FILE_PATH - - def setUp(self) -> None: - PostgresAsyncTestCase.setUp(self) - EventRepositorySelectTestCase.setUp(self) - - async def asyncSetUp(self): - await PostgresAsyncTestCase.asyncSetUp(self) - await EventRepositorySelectTestCase.asyncSetUp(self) - - def tearDown(self): - EventRepositorySelectTestCase.tearDown(self) - PostgresAsyncTestCase.tearDown(self) - - async def asyncTearDown(self): - await EventRepositorySelectTestCase.asyncTearDown(self) - await PostgresAsyncTestCase.asyncTearDown(self) - - def build_event_repository(self) -> EventRepository: - """Fort testing purposes.""" - return PostgreSqlEventRepository(**self.repository_db) - - -if __name__ == "__main__": - unittest.main() diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_exceptions.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_exceptions.py index d41042910..6f1ca4a4a 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_exceptions.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_exceptions.py @@ -3,31 +3,68 @@ from minos.aggregate import ( AggregateException, AlreadyDeletedException, + Event, + EventRepositoryConflictException, EventRepositoryException, NotFoundException, + SnapshotRepositoryConflictException, SnapshotRepositoryException, + TransactionRepositoryConflictException, + TransactionRepositoryException, ) from minos.common import ( MinosException, ) +from tests.utils import ( + AggregateTestCase, + Car, +) -class TestExceptions(unittest.TestCase): +class TestExceptions(AggregateTestCase): def test_base(self): self.assertTrue(issubclass(AggregateException, MinosException)) - def test_repository(self): + def test_event(self): self.assertTrue(issubclass(EventRepositoryException, AggregateException)) + def test_event_conflict(self): + message = "There was a conflict" + offset = 56 + exception = EventRepositoryConflictException(message, offset) + + self.assertIsInstance(exception, EventRepositoryException) + self.assertEqual(message, str(exception)) + self.assertEqual(offset, exception.offset) + def test_snapshot(self): self.assertTrue(issubclass(SnapshotRepositoryException, AggregateException)) + def test_snapshot_conflict(self): + entity = Car(3, "red") + event = Event.from_root_entity(entity) + exception = SnapshotRepositoryConflictException(entity, event) + + self.assertIsInstance(exception, SnapshotRepositoryException) + self.assertEqual(entity, exception.previous) + self.assertEqual(event, exception.event) + def test_snapshot_not_found(self): self.assertTrue(issubclass(NotFoundException, SnapshotRepositoryException)) def test_snapshot_already_deleted(self): self.assertTrue(issubclass(AlreadyDeletedException, SnapshotRepositoryException)) + def test_transaction(self): + self.assertTrue(issubclass(TransactionRepositoryException, AggregateException)) + + def test_transaction_conflict(self): + message = "There was a conflict" + exception = TransactionRepositoryConflictException(message) + + self.assertIsInstance(exception, TransactionRepositoryException) + self.assertEqual(message, str(exception)) + if __name__ == "__main__": unittest.main() diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_entries.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_entries.py index 58cb2e9fc..6d597c56d 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_entries.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_entries.py @@ -1,3 +1,4 @@ +import json import unittest from datetime import ( datetime, @@ -10,15 +11,21 @@ ) from minos.aggregate import ( + AlreadyDeletedException, + Event, + EventEntry, SnapshotEntry, ) +from minos.common import ( + MinosJsonBinaryProtocol, +) from tests.utils import ( + AggregateTestCase, Car, - MinosTestCase, ) -class TestSnapshotEntry(MinosTestCase): +class TestSnapshotEntry(AggregateTestCase): def setUp(self) -> None: super().setUp() @@ -41,6 +48,17 @@ def test_constructor(self): self.assertEqual(None, entry.created_at) self.assertEqual(None, entry.updated_at) + def test_constructor_with_bytes_schema(self): + raw = MinosJsonBinaryProtocol.encode(self.schema) + entry = SnapshotEntry(self.uuid, "example.Car", 0, raw, self.data) + self.assertEqual(self.schema, entry.schema) + + # noinspection SpellCheckingInspection + def test_constructor_with_memoryview_schema(self): + raw = memoryview(MinosJsonBinaryProtocol.encode(self.schema)) + entry = SnapshotEntry(self.uuid, "example.Car", 0, raw, self.data) + self.assertEqual(self.schema, entry.schema) + def test_constructor_extended(self): entry = SnapshotEntry( self.uuid, @@ -71,6 +89,18 @@ def test_from_root_entity(self): self.assertEqual(car.created_at, entry.created_at) self.assertEqual(car.updated_at, entry.updated_at) + def test_from_event_entry(self): + car = Car(3, "blue", uuid=self.uuid, version=1) + event_entry = EventEntry.from_event(Event.from_root_entity(car), version=1) + with patch("minos.common.AvroSchemaEncoder.generate_random_str", return_value="hello"): + snapshot_entry = SnapshotEntry.from_event_entry(event_entry) + self.assertEqual(event_entry.uuid, snapshot_entry.uuid) + self.assertEqual(event_entry.name, snapshot_entry.name) + self.assertEqual(event_entry.version, snapshot_entry.version) + self.assertEqual(event_entry.created_at, snapshot_entry.created_at) + self.assertEqual(event_entry.created_at, snapshot_entry.updated_at) + self.assertEqual(event_entry.transaction_uuid, snapshot_entry.transaction_uuid) + def test_equals(self): a = SnapshotEntry(self.uuid, "example.Car", 0, self.schema, self.data) b = SnapshotEntry(self.uuid, "example.Car", 0, self.schema, self.data) @@ -86,6 +116,12 @@ def test_build(self): entry = SnapshotEntry.from_root_entity(car) self.assertEqual(car, entry.build()) + def test_build_raises(self): + entry = SnapshotEntry(uuid=self.uuid, name="example.Car", version=0, schema=self.schema) + + with self.assertRaises(AlreadyDeletedException): + entry.build() + def test_repr(self): name = "example.Car" version = 0 @@ -112,6 +148,55 @@ def test_repr(self): self.assertEqual(expected, repr(entry)) + def test_as_raw(self): + name = "example.Car" + version = 0 + created_at = datetime(2020, 1, 10, 4, 23) + updated_at = datetime(2020, 1, 10, 4, 25) + transaction_uuid = uuid4() + + entry = SnapshotEntry( + uuid=self.uuid, + name=name, + version=version, + schema=self.schema, + data=self.data, + created_at=created_at, + updated_at=updated_at, + transaction_uuid=transaction_uuid, + ) + + expected = { + "created_at": created_at, + "data": json.dumps(self.data), + "name": name, + "schema": MinosJsonBinaryProtocol.encode(self.schema), + "transaction_uuid": transaction_uuid, + "updated_at": updated_at, + "uuid": self.uuid, + "version": version, + } + + self.assertEqual(expected, entry.as_raw()) + + def test_encoded_schema(self): + entry = SnapshotEntry(uuid=self.uuid, name="example.Car", version=0, schema=self.schema) + expected = MinosJsonBinaryProtocol.encode(self.schema) + self.assertEqual(expected, entry.encoded_schema) + + def test_encoded_schema_none(self): + entry = SnapshotEntry(uuid=self.uuid, name="example.Car", version=0) + self.assertEqual(None, entry.encoded_schema) + + def test_encoded_data(self): + entry = SnapshotEntry(uuid=self.uuid, name="example.Car", version=0, schema=self.schema, data=self.data) + expected = json.dumps(self.data) + self.assertEqual(expected, entry.encoded_data) + + def test_encoded_none(self): + entry = SnapshotEntry(uuid=self.uuid, name="example.Car", version=0, schema=self.schema) + self.assertEqual(None, entry.encoded_data) + if __name__ == "__main__": unittest.main() diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_memory.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_memory.py deleted file mode 100644 index c37257891..000000000 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_memory.py +++ /dev/null @@ -1,359 +0,0 @@ -import unittest -from datetime import ( - datetime, -) -from uuid import ( - uuid4, -) - -from minos.aggregate import ( - AlreadyDeletedException, - Condition, - EventEntry, - FieldDiff, - FieldDiffContainer, - InMemorySnapshotRepository, - NotFoundException, - Ordering, - SnapshotEntry, - SnapshotRepository, - TransactionEntry, - TransactionStatus, -) -from minos.common import ( - NotProvidedException, -) -from tests.utils import ( - Car, - MinosTestCase, -) - - -class TestInMemorySnapshotRepository(MinosTestCase): - def setUp(self) -> None: - super().setUp() - - self.uuid_1 = uuid4() - self.uuid_2 = uuid4() - self.uuid_3 = uuid4() - - self.transaction_1 = uuid4() - self.transaction_2 = uuid4() - self.transaction_3 = uuid4() - self.transaction_4 = uuid4() - - async def asyncSetUp(self): - await super().asyncSetUp() - await self._populate() - - async def _populate(self): - diff = FieldDiffContainer([FieldDiff("doors", int, 3), FieldDiff("color", str, "blue")]) - # noinspection PyTypeChecker - name: str = Car.classname - await self.event_repository.create(EventEntry(self.uuid_1, name, 1, diff.avro_bytes)) - await self.event_repository.update(EventEntry(self.uuid_1, name, 2, diff.avro_bytes)) - await self.event_repository.create(EventEntry(self.uuid_2, name, 1, diff.avro_bytes)) - await self.event_repository.update(EventEntry(self.uuid_1, name, 3, diff.avro_bytes)) - await self.event_repository.delete(EventEntry(self.uuid_1, name, 4)) - await self.event_repository.update(EventEntry(self.uuid_2, name, 2, diff.avro_bytes)) - await self.event_repository.update( - EventEntry(self.uuid_2, name, 3, diff.avro_bytes, transaction_uuid=self.transaction_1) - ) - await self.event_repository.delete( - EventEntry(self.uuid_2, name, 3, bytes(), transaction_uuid=self.transaction_2) - ) - await self.event_repository.update( - EventEntry(self.uuid_2, name, 4, diff.avro_bytes, transaction_uuid=self.transaction_1) - ) - await self.event_repository.create(EventEntry(self.uuid_3, name, 1, diff.avro_bytes)) - await self.event_repository.delete( - EventEntry(self.uuid_2, name, 3, bytes(), transaction_uuid=self.transaction_3) - ) - await self.transaction_repository.submit( - TransactionEntry(self.transaction_1, TransactionStatus.PENDING, await self.event_repository.offset) - ) - await self.transaction_repository.submit( - TransactionEntry(self.transaction_2, TransactionStatus.PENDING, await self.event_repository.offset) - ) - await self.transaction_repository.submit( - TransactionEntry(self.transaction_3, TransactionStatus.REJECTED, await self.event_repository.offset) - ) - await self.transaction_repository.submit( - TransactionEntry( - self.transaction_4, TransactionStatus.REJECTED, await self.event_repository.offset, self.transaction_3 - ) - ) - - def test_type(self): - self.assertTrue(issubclass(InMemorySnapshotRepository, SnapshotRepository)) - - def test_constructor_raises(self): - with self.assertRaises(NotProvidedException): - # noinspection PyTypeChecker - InMemorySnapshotRepository(event_repository=None) - - with self.assertRaises(NotProvidedException): - # noinspection PyTypeChecker - InMemorySnapshotRepository(transaction_repository=None) - - async def test_find_by_uuid(self): - condition = Condition.IN("uuid", [self.uuid_2, self.uuid_3]) - iterable = self.snapshot_repository.find("tests.utils.Car", condition, ordering=Ordering.ASC("updated_at")) - observed = [v async for v in iterable] - - expected = [ - Car( - 3, - "blue", - uuid=self.uuid_2, - version=2, - created_at=observed[0].created_at, - updated_at=observed[0].updated_at, - ), - Car( - 3, - "blue", - uuid=self.uuid_3, - version=1, - created_at=observed[1].created_at, - updated_at=observed[1].updated_at, - ), - ] - self.assertEqual(expected, observed) - - async def test_find_with_transaction(self): - condition = Condition.IN("uuid", [self.uuid_2, self.uuid_3]) - iterable = self.snapshot_repository.find( - "tests.utils.Car", - condition, - ordering=Ordering.ASC("updated_at"), - transaction=TransactionEntry(self.transaction_1), - ) - observed = [v async for v in iterable] - - expected = [ - Car( - 3, - "blue", - uuid=self.uuid_2, - version=4, - created_at=observed[0].created_at, - updated_at=observed[0].updated_at, - ), - Car( - 3, - "blue", - uuid=self.uuid_3, - version=1, - created_at=observed[1].created_at, - updated_at=observed[1].updated_at, - ), - ] - self.assertEqual(expected, observed) - - async def test_find_with_transaction_delete(self): - condition = Condition.IN("uuid", [self.uuid_2, self.uuid_3]) - iterable = self.snapshot_repository.find( - "tests.utils.Car", - condition, - ordering=Ordering.ASC("updated_at"), - transaction=TransactionEntry(self.transaction_2), - ) - observed = [v async for v in iterable] - - expected = [ - Car( - 3, - "blue", - uuid=self.uuid_3, - version=1, - created_at=observed[0].created_at, - updated_at=observed[0].updated_at, - ), - ] - self.assertEqual(expected, observed) - - async def test_find_with_transaction_reverted(self): - condition = Condition.IN("uuid", [self.uuid_2, self.uuid_3]) - iterable = self.snapshot_repository.find( - "tests.utils.Car", - condition, - ordering=Ordering.ASC("updated_at"), - transaction=TransactionEntry(self.transaction_4), - ) - observed = [v async for v in iterable] - - expected = [ - Car( - 3, - "blue", - uuid=self.uuid_2, - version=2, - created_at=observed[0].created_at, - updated_at=observed[0].updated_at, - ), - Car( - 3, - "blue", - uuid=self.uuid_3, - version=1, - created_at=observed[1].created_at, - updated_at=observed[1].updated_at, - ), - ] - self.assertEqual(expected, observed) - - async def test_find_streaming_true(self): - condition = Condition.IN("uuid", [self.uuid_2, self.uuid_3]) - - iterable = self.snapshot_repository.find( - "tests.utils.Car", condition, streaming_mode=True, ordering=Ordering.ASC("updated_at") - ) - observed = [v async for v in iterable] - - expected = [ - Car( - 3, - "blue", - uuid=self.uuid_2, - version=2, - created_at=observed[0].created_at, - updated_at=observed[0].updated_at, - ), - Car( - 3, - "blue", - uuid=self.uuid_3, - version=1, - created_at=observed[1].created_at, - updated_at=observed[1].updated_at, - ), - ] - self.assertEqual(expected, observed) - - async def test_find_with_duplicates(self): - uuids = [self.uuid_2, self.uuid_2, self.uuid_3] - condition = Condition.IN("uuid", uuids) - iterable = self.snapshot_repository.find("tests.utils.Car", condition, ordering=Ordering.ASC("updated_at")) - observed = [v async for v in iterable] - - expected = [ - Car( - 3, - "blue", - uuid=self.uuid_2, - version=2, - created_at=observed[0].created_at, - updated_at=observed[0].updated_at, - ), - Car( - 3, - "blue", - uuid=self.uuid_3, - version=1, - created_at=observed[1].created_at, - updated_at=observed[1].updated_at, - ), - ] - self.assertEqual(expected, observed) - - async def test_find_empty(self): - observed = {v async for v in self.snapshot_repository.find("tests.utils.Car", Condition.FALSE)} - - expected = set() - self.assertEqual(expected, observed) - - async def test_get(self): - observed = await self.snapshot_repository.get("tests.utils.Car", self.uuid_2) - - expected = Car( - 3, "blue", uuid=self.uuid_2, version=2, created_at=observed.created_at, updated_at=observed.updated_at - ) - self.assertEqual(expected, observed) - - async def test_get_with_transaction(self): - observed = await self.snapshot_repository.get( - "tests.utils.Car", self.uuid_2, transaction=TransactionEntry(self.transaction_1) - ) - - expected = Car( - 3, "blue", uuid=self.uuid_2, version=4, created_at=observed.created_at, updated_at=observed.updated_at - ) - self.assertEqual(expected, observed) - - async def test_get_raises(self): - with self.assertRaises(AlreadyDeletedException): - await self.snapshot_repository.get("tests.utils.Car", self.uuid_1) - with self.assertRaises(NotFoundException): - await self.snapshot_repository.get("tests.utils.Car", uuid4()) - - async def test_get_with_transaction_raises(self): - with self.assertRaises(AlreadyDeletedException): - await self.snapshot_repository.get( - "tests.utils.Car", self.uuid_2, transaction=TransactionEntry(self.transaction_2) - ) - - async def test_find(self): - condition = Condition.EQUAL("color", "blue") - iterable = self.snapshot_repository.find("tests.utils.Car", condition, ordering=Ordering.ASC("updated_at")) - observed = [v async for v in iterable] - - expected = [ - Car( - 3, - "blue", - uuid=self.uuid_2, - version=2, - created_at=observed[0].created_at, - updated_at=observed[0].updated_at, - ), - Car( - 3, - "blue", - uuid=self.uuid_3, - version=1, - created_at=observed[1].created_at, - updated_at=observed[1].updated_at, - ), - ] - self.assertEqual(expected, observed) - - async def test_find_all(self): - iterable = self.snapshot_repository.find("tests.utils.Car", Condition.TRUE, Ordering.ASC("updated_at")) - observed = [v async for v in iterable] - - expected = [ - Car( - 3, - "blue", - uuid=self.uuid_2, - version=2, - created_at=observed[0].created_at, - updated_at=observed[0].updated_at, - ), - Car( - 3, - "blue", - uuid=self.uuid_3, - version=1, - created_at=observed[1].created_at, - updated_at=observed[1].updated_at, - ), - ] - self.assertEqual(expected, observed) - - def _assert_equal_snapshot_entries(self, expected: list[SnapshotEntry], observed: list[SnapshotEntry]): - self.assertEqual(len(expected), len(observed)) - for exp, obs in zip(expected, observed): - if exp.data is None: - with self.assertRaises(AlreadyDeletedException): - # noinspection PyStatementEffect - obs.build() - else: - self.assertEqual(exp.build(), obs.build()) - self.assertIsInstance(obs.created_at, datetime) - self.assertIsInstance(obs.updated_at, datetime) - - -if __name__ == "__main__": - unittest.main() diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_pg/__init__.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_pg/__init__.py deleted file mode 100644 index 8b1378917..000000000 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_pg/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_pg/test_abc.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_pg/test_abc.py deleted file mode 100644 index 68f30c705..000000000 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_pg/test_abc.py +++ /dev/null @@ -1,43 +0,0 @@ -import unittest - -import aiopg - -from minos.aggregate import ( - PostgreSqlSnapshotSetup, -) -from minos.common.testing import ( - PostgresAsyncTestCase, -) -from tests.utils import ( - CONFIG_FILE_PATH, -) - - -class TestPostgreSqlSnapshotSetup(PostgresAsyncTestCase): - CONFIG_FILE_PATH = CONFIG_FILE_PATH - - async def test_setup_snapshot_table(self): - async with PostgreSqlSnapshotSetup.from_config(self.config): - async with aiopg.connect(**self.snapshot_db) as connection: - async with connection.cursor() as cursor: - await cursor.execute( - "SELECT EXISTS (SELECT FROM pg_tables " - "WHERE schemaname = 'public' AND tablename = 'snapshot');" - ) - observed = (await cursor.fetchone())[0] - self.assertEqual(True, observed) - - async def test_setup_snapshot_aux_offset_table(self): - async with PostgreSqlSnapshotSetup.from_config(self.config): - async with aiopg.connect(**self.snapshot_db) as connection: - async with connection.cursor() as cursor: - await cursor.execute( - "SELECT EXISTS (SELECT FROM pg_tables WHERE " - "schemaname = 'public' AND tablename = 'snapshot_aux_offset');" - ) - observed = (await cursor.fetchone())[0] - self.assertEqual(True, observed) - - -if __name__ == "__main__": - unittest.main() diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_pg/test_api.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_pg/test_api.py deleted file mode 100644 index f23f68edf..000000000 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_pg/test_api.py +++ /dev/null @@ -1,101 +0,0 @@ -import unittest -from unittest.mock import ( - AsyncMock, - MagicMock, - call, -) -from uuid import ( - uuid4, -) - -from minos.aggregate import ( - Condition, - Ordering, - PostgreSqlSnapshotReader, - PostgreSqlSnapshotRepository, - PostgreSqlSnapshotWriter, - TransactionEntry, -) -from minos.common.testing import ( - PostgresAsyncTestCase, -) -from tests.utils import ( - CONFIG_FILE_PATH, - FakeAsyncIterator, - MinosTestCase, -) - - -class TestPostgreSqlSnapshotRepository(MinosTestCase, PostgresAsyncTestCase): - CONFIG_FILE_PATH = CONFIG_FILE_PATH - - def setUp(self) -> None: - super().setUp() - - self.snapshot_repository = PostgreSqlSnapshotRepository.from_config(self.config) - - self.dispatch_mock = AsyncMock() - self.get_mock = AsyncMock(return_value=1) - self.find_mock = MagicMock(return_value=FakeAsyncIterator(range(5))) - self.snapshot_repository.reader.get = self.get_mock - self.snapshot_repository.reader.find = self.find_mock - self.snapshot_repository.writer.dispatch = self.dispatch_mock - - self.classname = "path.to.Product" - - async def asyncSetUp(self): - await super().asyncSetUp() - await self.snapshot_repository.setup() - - async def asyncTearDown(self): - await self.snapshot_repository.destroy() - await super().asyncTearDown() - - def test_from_config(self): - self.assertIsInstance(self.snapshot_repository.reader, PostgreSqlSnapshotReader) - self.assertIsInstance(self.snapshot_repository.writer, PostgreSqlSnapshotWriter) - - async def test_get(self): - transaction = TransactionEntry() - uuid = uuid4() - observed = await self.snapshot_repository.get(self.classname, uuid, transaction) - self.assertEqual(1, observed) - - self.assertEqual(1, self.dispatch_mock.call_count) - self.assertEqual(call(), self.dispatch_mock.call_args) - - self.assertEqual(1, self.get_mock.call_count) - args = call(name=self.classname, uuid=uuid, transaction=transaction) - self.assertEqual(args, self.get_mock.call_args) - - async def test_find(self): - transaction = TransactionEntry() - iterable = self.snapshot_repository.find( - self.classname, Condition.TRUE, Ordering.ASC("name"), 10, True, transaction - ) - observed = [a async for a in iterable] - self.assertEqual(list(range(5)), observed) - - self.assertEqual(1, self.dispatch_mock.call_count) - self.assertEqual(call(), self.dispatch_mock.call_args) - - self.assertEqual(1, self.find_mock.call_count) - args = call( - name=self.classname, - condition=Condition.TRUE, - ordering=Ordering.ASC("name"), - limit=10, - streaming_mode=True, - transaction=transaction, - ) - self.assertEqual(args, self.find_mock.call_args) - - async def test_synchronize(self): - await self.snapshot_repository.synchronize() - - self.assertEqual(1, self.dispatch_mock.call_count) - self.assertEqual(call(), self.dispatch_mock.call_args) - - -if __name__ == "__main__": - unittest.main() diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_pg/test_readers.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_pg/test_readers.py deleted file mode 100644 index 6f6db70de..000000000 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_pg/test_readers.py +++ /dev/null @@ -1,373 +0,0 @@ -import unittest -from datetime import ( - datetime, -) -from uuid import ( - uuid4, -) - -from minos.aggregate import ( - AlreadyDeletedException, - Condition, - EventEntry, - FieldDiff, - FieldDiffContainer, - NotFoundException, - Ordering, - PostgreSqlSnapshotReader, - PostgreSqlSnapshotSetup, - PostgreSqlSnapshotWriter, - SnapshotEntry, - TransactionEntry, - TransactionStatus, -) -from minos.common.testing import ( - PostgresAsyncTestCase, -) -from tests.utils import ( - CONFIG_FILE_PATH, - Car, - MinosTestCase, -) - - -class TestPostgreSqlSnapshotReader(MinosTestCase, PostgresAsyncTestCase): - CONFIG_FILE_PATH = CONFIG_FILE_PATH - - def setUp(self) -> None: - super().setUp() - - self.uuid_1 = uuid4() - self.uuid_2 = uuid4() - self.uuid_3 = uuid4() - - self.transaction_1 = uuid4() - self.transaction_2 = uuid4() - self.transaction_3 = uuid4() - - self.reader = PostgreSqlSnapshotReader.from_config(self.config) - - async def asyncSetUp(self): - await super().asyncSetUp() - await self.reader.setup() - await self._populate() - - async def asyncTearDown(self): - await self.reader.destroy() - await super().asyncTearDown() - - async def _populate(self): - diff = FieldDiffContainer([FieldDiff("doors", int, 3), FieldDiff("color", str, "blue")]) - # noinspection PyTypeChecker - name: str = Car.classname - - await self.event_repository.create(EventEntry(self.uuid_1, name, 1, diff.avro_bytes)) - await self.event_repository.update(EventEntry(self.uuid_1, name, 2, diff.avro_bytes)) - await self.event_repository.create(EventEntry(self.uuid_2, name, 1, diff.avro_bytes)) - await self.event_repository.update(EventEntry(self.uuid_1, name, 3, diff.avro_bytes)) - await self.event_repository.delete(EventEntry(self.uuid_1, name, 4)) - await self.event_repository.update(EventEntry(self.uuid_2, name, 2, diff.avro_bytes)) - await self.event_repository.update( - EventEntry(self.uuid_2, name, 3, diff.avro_bytes, transaction_uuid=self.transaction_1) - ) - await self.event_repository.delete( - EventEntry(self.uuid_2, name, 3, bytes(), transaction_uuid=self.transaction_2) - ) - await self.event_repository.update( - EventEntry(self.uuid_2, name, 4, diff.avro_bytes, transaction_uuid=self.transaction_1) - ) - await self.event_repository.create(EventEntry(self.uuid_3, name, 1, diff.avro_bytes)) - await self.event_repository.delete( - EventEntry(self.uuid_2, name, 3, bytes(), transaction_uuid=self.transaction_3) - ) - await self.transaction_repository.submit( - TransactionEntry(self.transaction_1, TransactionStatus.PENDING, await self.event_repository.offset) - ) - await self.transaction_repository.submit( - TransactionEntry(self.transaction_2, TransactionStatus.PENDING, await self.event_repository.offset) - ) - await self.transaction_repository.submit( - TransactionEntry(self.transaction_3, TransactionStatus.REJECTED, await self.event_repository.offset) - ) - async with PostgreSqlSnapshotWriter.from_config(self.config, reader=self.reader) as writer: - await writer.dispatch() - - def test_type(self): - self.assertTrue(issubclass(PostgreSqlSnapshotReader, PostgreSqlSnapshotSetup)) - - def test_from_config(self): - reader = PostgreSqlSnapshotReader.from_config(self.config) - snapshot_config = self.config.get_database_by_name("snapshot") - self.assertEqual(snapshot_config["host"], reader.host) - self.assertEqual(snapshot_config["port"], reader.port) - self.assertEqual(snapshot_config["database"], reader.database) - self.assertEqual(snapshot_config["user"], reader.user) - self.assertEqual(snapshot_config["password"], reader.password) - - async def test_find_by_uuid(self): - condition = Condition.IN("uuid", [self.uuid_2, self.uuid_3]) - - iterable = self.reader.find("tests.utils.Car", condition, ordering=Ordering.ASC("updated_at")) - observed = [v async for v in iterable] - - expected = [ - Car( - 3, - "blue", - uuid=self.uuid_2, - version=2, - created_at=observed[0].created_at, - updated_at=observed[0].updated_at, - ), - Car( - 3, - "blue", - uuid=self.uuid_3, - version=1, - created_at=observed[1].created_at, - updated_at=observed[1].updated_at, - ), - ] - self.assertEqual(expected, observed) - - async def test_find_with_transaction(self): - condition = Condition.IN("uuid", [self.uuid_2, self.uuid_3]) - - iterable = self.reader.find( - "tests.utils.Car", - condition, - ordering=Ordering.ASC("updated_at"), - transaction=TransactionEntry(self.transaction_1), - ) - observed = [v async for v in iterable] - - expected = [ - Car( - 3, - "blue", - uuid=self.uuid_2, - version=4, - created_at=observed[0].created_at, - updated_at=observed[0].updated_at, - ), - Car( - 3, - "blue", - uuid=self.uuid_3, - version=1, - created_at=observed[1].created_at, - updated_at=observed[1].updated_at, - ), - ] - self.assertEqual(expected, observed) - - async def test_find_with_transaction_delete(self): - condition = Condition.IN("uuid", [self.uuid_2, self.uuid_3]) - - iterable = self.reader.find( - "tests.utils.Car", - condition, - ordering=Ordering.ASC("updated_at"), - transaction=TransactionEntry(self.transaction_2), - ) - observed = [v async for v in iterable] - - expected = [ - Car( - 3, - "blue", - uuid=self.uuid_3, - version=1, - created_at=observed[0].created_at, - updated_at=observed[0].updated_at, - ), - ] - self.assertEqual(expected, observed) - - async def test_find_with_transaction_reverted(self): - condition = Condition.IN("uuid", [self.uuid_2, self.uuid_3]) - - iterable = self.reader.find( - "tests.utils.Car", condition, ordering=Ordering.ASC("updated_at"), transaction_uuid=self.transaction_3 - ) - observed = [v async for v in iterable] - - expected = [ - Car( - 3, - "blue", - uuid=self.uuid_2, - version=2, - created_at=observed[0].created_at, - updated_at=observed[0].updated_at, - ), - Car( - 3, - "blue", - uuid=self.uuid_3, - version=1, - created_at=observed[1].created_at, - updated_at=observed[1].updated_at, - ), - ] - self.assertEqual(expected, observed) - - async def test_find_streaming_true(self): - condition = Condition.IN("uuid", [self.uuid_2, self.uuid_3]) - - iterable = self.reader.find( - "tests.utils.Car", condition, streaming_mode=True, ordering=Ordering.ASC("updated_at") - ) - observed = [v async for v in iterable] - - expected = [ - Car( - 3, - "blue", - uuid=self.uuid_2, - version=2, - created_at=observed[0].created_at, - updated_at=observed[0].updated_at, - ), - Car( - 3, - "blue", - uuid=self.uuid_3, - version=1, - created_at=observed[1].created_at, - updated_at=observed[1].updated_at, - ), - ] - self.assertEqual(expected, observed) - - async def test_find_with_duplicates(self): - uuids = [self.uuid_2, self.uuid_2, self.uuid_3] - condition = Condition.IN("uuid", uuids) - - iterable = self.reader.find("tests.utils.Car", condition, ordering=Ordering.ASC("updated_at")) - observed = [v async for v in iterable] - - expected = [ - Car( - 3, - "blue", - uuid=self.uuid_2, - version=2, - created_at=observed[0].created_at, - updated_at=observed[0].updated_at, - ), - Car( - 3, - "blue", - uuid=self.uuid_3, - version=1, - created_at=observed[1].created_at, - updated_at=observed[1].updated_at, - ), - ] - self.assertEqual(expected, observed) - - async def test_find_empty(self): - - observed = {v async for v in self.reader.find("tests.utils.Car", Condition.FALSE)} - - expected = set() - self.assertEqual(expected, observed) - - async def test_get(self): - - observed = await self.reader.get("tests.utils.Car", self.uuid_2) - - expected = Car( - 3, "blue", uuid=self.uuid_2, version=2, created_at=observed.created_at, updated_at=observed.updated_at - ) - self.assertEqual(expected, observed) - - async def test_get_with_transaction(self): - - observed = await self.reader.get( - "tests.utils.Car", self.uuid_2, transaction=TransactionEntry(self.transaction_1) - ) - - expected = Car( - 3, "blue", uuid=self.uuid_2, version=4, created_at=observed.created_at, updated_at=observed.updated_at - ) - self.assertEqual(expected, observed) - - async def test_get_raises(self): - - with self.assertRaises(AlreadyDeletedException): - await self.reader.get("tests.utils.Car", self.uuid_1) - with self.assertRaises(NotFoundException): - await self.reader.get("tests.utils.Car", uuid4()) - - async def test_get_with_transaction_raises(self): - - with self.assertRaises(AlreadyDeletedException): - await self.reader.get("tests.utils.Car", self.uuid_2, transaction=TransactionEntry(self.transaction_2)) - - async def test_find(self): - condition = Condition.EQUAL("color", "blue") - iterable = self.reader.find("tests.utils.Car", condition, ordering=Ordering.ASC("updated_at")) - observed = [v async for v in iterable] - - expected = [ - Car( - 3, - "blue", - uuid=self.uuid_2, - version=2, - created_at=observed[0].created_at, - updated_at=observed[0].updated_at, - ), - Car( - 3, - "blue", - uuid=self.uuid_3, - version=1, - created_at=observed[1].created_at, - updated_at=observed[1].updated_at, - ), - ] - self.assertEqual(expected, observed) - - async def test_find_all(self): - - iterable = self.reader.find("tests.utils.Car", Condition.TRUE, Ordering.ASC("updated_at")) - observed = [v async for v in iterable] - - expected = [ - Car( - 3, - "blue", - uuid=self.uuid_2, - version=2, - created_at=observed[0].created_at, - updated_at=observed[0].updated_at, - ), - Car( - 3, - "blue", - uuid=self.uuid_3, - version=1, - created_at=observed[1].created_at, - updated_at=observed[1].updated_at, - ), - ] - self.assertEqual(expected, observed) - - def _assert_equal_snapshot_entries(self, expected: list[SnapshotEntry], observed: list[SnapshotEntry]): - self.assertEqual(len(expected), len(observed)) - for exp, obs in zip(expected, observed): - if exp.data is None: - with self.assertRaises(AlreadyDeletedException): - # noinspection PyStatementEffect - obs.build() - else: - self.assertEqual(exp.build(), obs.build()) - self.assertIsInstance(obs.created_at, datetime) - self.assertIsInstance(obs.updated_at, datetime) - - -if __name__ == "__main__": - unittest.main() diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_pg/test_writers.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_pg/test_writers.py deleted file mode 100644 index eb8fbab0a..000000000 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_pg/test_writers.py +++ /dev/null @@ -1,345 +0,0 @@ -import unittest -from datetime import ( - datetime, -) -from unittest.mock import ( - MagicMock, - call, -) -from uuid import ( - uuid4, -) - -from minos.aggregate import ( - Action, - AlreadyDeletedException, - Condition, - EventEntry, - FieldDiff, - FieldDiffContainer, - Ordering, - PostgreSqlSnapshotReader, - PostgreSqlSnapshotSetup, - PostgreSqlSnapshotWriter, - SnapshotEntry, - TransactionEntry, - TransactionStatus, -) -from minos.common import ( - NotProvidedException, - current_datetime, -) -from minos.common.testing import ( - PostgresAsyncTestCase, -) -from tests.utils import ( - CONFIG_FILE_PATH, - Car, - MinosTestCase, -) - - -class TestPostgreSqlSnapshotWriter(MinosTestCase, PostgresAsyncTestCase): - CONFIG_FILE_PATH = CONFIG_FILE_PATH - - def setUp(self) -> None: - super().setUp() - self.uuid_1 = uuid4() - self.uuid_2 = uuid4() - self.uuid_3 = uuid4() - - self.transaction_1 = uuid4() - self.transaction_2 = uuid4() - self.transaction_3 = uuid4() - - self.reader = PostgreSqlSnapshotReader.from_config(self.config) - self.writer = PostgreSqlSnapshotWriter.from_config(self.config, reader=self.reader) - - async def asyncSetUp(self): - await super().asyncSetUp() - await self.writer.setup() - await self.reader.setup() - await self._populate() - - async def asyncTearDown(self): - await self.reader.destroy() - await self.writer.destroy() - await super().asyncTearDown() - - async def _populate(self): - diff = FieldDiffContainer([FieldDiff("doors", int, 3), FieldDiff("color", str, "blue")]) - # noinspection PyTypeChecker - name: str = Car.classname - - await self.event_repository.create(EventEntry(self.uuid_1, name, 1, diff.avro_bytes)) - await self.event_repository.update(EventEntry(self.uuid_1, name, 2, diff.avro_bytes)) - await self.event_repository.create(EventEntry(self.uuid_2, name, 1, diff.avro_bytes)) - await self.event_repository.update(EventEntry(self.uuid_1, name, 3, diff.avro_bytes)) - await self.event_repository.delete(EventEntry(self.uuid_1, name, 4)) - await self.event_repository.update(EventEntry(self.uuid_2, name, 2, diff.avro_bytes)) - await self.event_repository.update( - EventEntry(self.uuid_2, name, 3, diff.avro_bytes, transaction_uuid=self.transaction_1) - ) - await self.event_repository.delete( - EventEntry(self.uuid_2, name, 3, bytes(), transaction_uuid=self.transaction_2) - ) - await self.event_repository.update( - EventEntry(self.uuid_2, name, 4, diff.avro_bytes, transaction_uuid=self.transaction_1) - ) - await self.event_repository.create(EventEntry(self.uuid_3, name, 1, diff.avro_bytes)) - await self.event_repository.delete( - EventEntry(self.uuid_2, name, 3, bytes(), transaction_uuid=self.transaction_3) - ) - await self.transaction_repository.submit( - TransactionEntry(self.transaction_1, TransactionStatus.PENDING, await self.event_repository.offset) - ) - await self.transaction_repository.submit( - TransactionEntry(self.transaction_2, TransactionStatus.PENDING, await self.event_repository.offset) - ) - await self.transaction_repository.submit( - TransactionEntry(self.transaction_3, TransactionStatus.REJECTED, await self.event_repository.offset) - ) - - def test_type(self): - self.assertTrue(issubclass(PostgreSqlSnapshotWriter, PostgreSqlSnapshotSetup)) - - def test_from_config(self): - snapshot_config = self.config.get_database_by_name("snapshot") - self.assertEqual(snapshot_config["host"], self.writer.host) - self.assertEqual(snapshot_config["port"], self.writer.port) - self.assertEqual(snapshot_config["database"], self.writer.database) - self.assertEqual(snapshot_config["user"], self.writer.user) - self.assertEqual(snapshot_config["password"], self.writer.password) - - def test_from_config_raises(self): - with self.assertRaises(NotProvidedException): - PostgreSqlSnapshotWriter.from_config(self.config, reader=self.reader, event_repository=None) - - with self.assertRaises(NotProvidedException): - PostgreSqlSnapshotWriter.from_config(self.config, reader=self.reader, transaction_repository=None) - - async def test_dispatch(self): - await self.writer.dispatch() - - # noinspection PyTypeChecker - iterable = self.reader.find_entries( - Car.classname, Condition.TRUE, Ordering.ASC("updated_at"), exclude_deleted=False - ) - observed = [v async for v in iterable] - - # noinspection PyTypeChecker - expected = [ - SnapshotEntry(self.uuid_1, Car.classname, 4), - SnapshotEntry.from_root_entity( - Car( - 3, - "blue", - uuid=self.uuid_2, - version=2, - created_at=observed[1].created_at, - updated_at=observed[1].updated_at, - ) - ), - SnapshotEntry.from_root_entity( - Car( - 3, - "blue", - uuid=self.uuid_3, - version=1, - created_at=observed[2].created_at, - updated_at=observed[2].updated_at, - ) - ), - ] - self._assert_equal_snapshot_entries(expected, observed) - - async def test_dispatch_first_transaction(self): - await self.writer.dispatch() - - # noinspection PyTypeChecker - iterable = self.reader.find_entries( - Car.classname, - Condition.TRUE, - Ordering.ASC("updated_at"), - exclude_deleted=False, - transaction=TransactionEntry(self.transaction_1), - ) - observed = [v async for v in iterable] - - # noinspection PyTypeChecker - expected = [ - SnapshotEntry(self.uuid_1, Car.classname, 4), - SnapshotEntry.from_root_entity( - Car( - 3, - "blue", - uuid=self.uuid_2, - version=4, - created_at=observed[1].created_at, - updated_at=observed[1].updated_at, - ) - ), - SnapshotEntry.from_root_entity( - Car( - 3, - "blue", - uuid=self.uuid_3, - version=1, - created_at=observed[2].created_at, - updated_at=observed[2].updated_at, - ) - ), - ] - self._assert_equal_snapshot_entries(expected, observed) - - async def test_dispatch_second_transaction(self): - await self.writer.dispatch() - - # noinspection PyTypeChecker - iterable = self.reader.find_entries( - Car.classname, - Condition.TRUE, - Ordering.ASC("updated_at"), - exclude_deleted=False, - transaction=TransactionEntry(self.transaction_2), - ) - observed = [v async for v in iterable] - - # noinspection PyTypeChecker - expected = [ - SnapshotEntry(self.uuid_1, Car.classname, 4), - SnapshotEntry(self.uuid_2, Car.classname, 4), - SnapshotEntry.from_root_entity( - Car( - 3, - "blue", - uuid=self.uuid_3, - version=1, - created_at=observed[2].created_at, - updated_at=observed[2].updated_at, - ) - ), - ] - self._assert_equal_snapshot_entries(expected, observed) - - async def test_dispatch_third_transaction(self): - await self.writer.dispatch() - - # noinspection PyTypeChecker - iterable = self.reader.find_entries( - Car.classname, - Condition.TRUE, - Ordering.ASC("updated_at"), - exclude_deleted=False, - transaction_uuid=self.transaction_3, - ) - observed = [v async for v in iterable] - - # noinspection PyTypeChecker - expected = [ - SnapshotEntry(self.uuid_1, Car.classname, 4), - SnapshotEntry.from_root_entity( - Car( - 3, - "blue", - uuid=self.uuid_2, - version=2, - created_at=observed[1].created_at, - updated_at=observed[1].updated_at, - ) - ), - SnapshotEntry.from_root_entity( - Car( - 3, - "blue", - uuid=self.uuid_3, - version=1, - created_at=observed[2].created_at, - updated_at=observed[2].updated_at, - ) - ), - ] - self._assert_equal_snapshot_entries(expected, observed) - - async def test_is_synced(self): - self.assertFalse(await self.writer.is_synced("tests.utils.Car")) - await self.writer.dispatch() - self.assertTrue(await self.writer.is_synced("tests.utils.Car")) - - async def test_dispatch_ignore_previous_version(self): - diff = FieldDiffContainer([FieldDiff("doors", int, 3), FieldDiff("color", str, "blue")]) - # noinspection PyTypeChecker - name: str = Car.classname - condition = Condition.EQUAL("uuid", self.uuid_1) - - async def _fn(*args, **kwargs): - yield EventEntry(self.uuid_1, name, 1, diff.avro_bytes, 1, Action.CREATE, current_datetime()) - yield EventEntry(self.uuid_1, name, 3, diff.avro_bytes, 2, Action.CREATE, current_datetime()) - yield EventEntry(self.uuid_1, name, 2, diff.avro_bytes, 3, Action.CREATE, current_datetime()) - - self.event_repository.select = MagicMock(side_effect=_fn) - await self.writer.dispatch() - - observed = [v async for v in self.reader.find_entries(name, condition)] - - # noinspection PyTypeChecker - expected = [ - SnapshotEntry( - uuid=self.uuid_1, - name=name, - version=3, - schema=Car.avro_schema, - data=Car(3, "blue", uuid=self.uuid_1, version=1).avro_data, - created_at=observed[0].created_at, - updated_at=observed[0].updated_at, - ) - ] - self._assert_equal_snapshot_entries(expected, observed) - - def _assert_equal_snapshot_entries(self, expected: list[SnapshotEntry], observed: list[SnapshotEntry]): - self.assertEqual(len(expected), len(observed)) - for exp, obs in zip(expected, observed): - if exp.data is None: - with self.assertRaises(AlreadyDeletedException): - # noinspection PyStatementEffect - obs.build() - else: - self.assertEqual(exp.build(), obs.build()) - self.assertIsInstance(obs.created_at, datetime) - self.assertIsInstance(obs.updated_at, datetime) - - async def test_dispatch_with_offset(self): - mock = MagicMock(side_effect=self.writer._event_repository.select) - self.writer._event_repository.select = mock - - await self.writer.dispatch() - self.assertEqual(1, mock.call_count) - self.assertEqual(call(id_gt=0), mock.call_args) - mock.reset_mock() - - # noinspection PyTypeChecker - entry = EventEntry( - uuid=self.uuid_3, - name=Car.classname, - data=FieldDiffContainer([FieldDiff("doors", int, 3), FieldDiff("color", str, "blue")]).avro_bytes, - ) - await self.event_repository.create(entry) - - await self.writer.dispatch() - self.assertEqual(1, mock.call_count) - self.assertEqual(call(id_gt=11), mock.call_args) - mock.reset_mock() - - await self.writer.dispatch() - self.assertEqual(1, mock.call_count) - self.assertEqual(call(id_gt=12), mock.call_args) - mock.reset_mock() - - await self.writer.dispatch() - self.assertEqual(1, mock.call_count) - self.assertEqual(call(id_gt=12), mock.call_args) - mock.reset_mock() - - -if __name__ == "__main__": - unittest.main() diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_repositories/__init__.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_repositories/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_abc.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_repositories/test_abc.py similarity index 70% rename from packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_abc.py rename to packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_repositories/test_abc.py index 1f0c979bb..4413415b2 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_abc.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_repositories/test_abc.py @@ -18,14 +18,19 @@ TRANSACTION_CONTEXT_VAR, Condition, Ordering, - RootEntity, + SnapshotEntry, SnapshotRepository, TransactionEntry, ) +from minos.aggregate.queries import ( + _EqualCondition, +) from minos.common import ( SetupMixin, ) from tests.utils import ( + AggregateTestCase, + Car, FakeAsyncIterator, ) @@ -33,28 +38,23 @@ class _SnapshotRepository(SnapshotRepository): """For testing purposes.""" - async def _get(self, *args, **kwargs) -> RootEntity: - """For testing purposes.""" - - def _find(self, *args, **kwargs) -> AsyncIterator[RootEntity]: + def _find_entries(self, *args, **kwargs) -> AsyncIterator[SnapshotEntry]: """For testing purposes.""" async def _synchronize(self, **kwargs) -> None: """For testing purposes.""" -class TestSnapshotRepository(unittest.IsolatedAsyncioTestCase): +class TestSnapshotRepository(AggregateTestCase): def setUp(self) -> None: super().setUp() self.snapshot_repository = _SnapshotRepository() - + self.entries = [SnapshotEntry.from_root_entity(Car(3, "red"))] * 5 self.synchronize_mock = AsyncMock() - self.get_mock = AsyncMock(return_value=1) - self.find_mock = MagicMock(return_value=FakeAsyncIterator(range(5))) + self.find_mock = MagicMock(return_value=FakeAsyncIterator(self.entries)) - self.snapshot_repository._get = self.get_mock - self.snapshot_repository._find = self.find_mock + self.snapshot_repository._find_entries = self.find_mock self.snapshot_repository._synchronize = self.synchronize_mock self.classname = "path.to.Product" @@ -64,41 +64,49 @@ def test_subclass(self): def test_abstract(self): # noinspection PyUnresolvedReferences - self.assertEqual({"_get", "_find", "_synchronize"}, SnapshotRepository.__abstractmethods__) + self.assertEqual({"_find_entries", "_synchronize"}, SnapshotRepository.__abstractmethods__) async def test_get(self): transaction = TransactionEntry() uuid = uuid4() observed = await self.snapshot_repository.get(self.classname, uuid, transaction) - self.assertEqual(1, observed) + self.assertEqual(self.entries[0].build(), observed) self.assertEqual(1, self.synchronize_mock.call_count) - self.assertEqual(call(), self.synchronize_mock.call_args) + self.assertEqual(call(synchronize=False), self.synchronize_mock.call_args) - self.assertEqual(1, self.get_mock.call_count) - args = call(name=self.classname, uuid=uuid, transaction=transaction) - self.assertEqual(args, self.get_mock.call_args) + self.assertEqual(1, self.find_mock.call_count) + args = call( + name=self.classname, + condition=_EqualCondition("uuid", uuid), + ordering=None, + limit=None, + streaming_mode=False, + transaction=transaction, + exclude_deleted=False, + ) + self.assertEqual(args, self.find_mock.call_args) async def test_get_transaction_null(self): await self.snapshot_repository.get(self.classname, uuid4()) - self.assertEqual(1, self.get_mock.call_count) - self.assertEqual(None, self.get_mock.call_args.kwargs["transaction"]) + self.assertEqual(1, self.find_mock.call_count) + self.assertEqual(None, self.find_mock.call_args.kwargs["transaction"]) async def test_get_transaction_context(self): transaction = TransactionEntry() TRANSACTION_CONTEXT_VAR.set(transaction) await self.snapshot_repository.get(self.classname, uuid4()) - self.assertEqual(1, self.get_mock.call_count) - self.assertEqual(transaction, self.get_mock.call_args.kwargs["transaction"]) + self.assertEqual(1, self.find_mock.call_count) + self.assertEqual(transaction, self.find_mock.call_args.kwargs["transaction"]) async def test_get_all(self): transaction = TransactionEntry() iterable = self.snapshot_repository.get_all(self.classname, Ordering.ASC("name"), 10, True, transaction) observed = [a async for a in iterable] - self.assertEqual(list(range(5)), observed) + self.assertEqual([e.build() for e in self.entries], observed) self.assertEqual( [ @@ -109,6 +117,7 @@ async def test_get_all(self): limit=10, streaming_mode=True, transaction=transaction, + exclude_deleted=True, ) ], self.find_mock.call_args_list, @@ -120,10 +129,10 @@ async def test_find(self): self.classname, Condition.TRUE, Ordering.ASC("name"), 10, True, transaction ) observed = [a async for a in iterable] - self.assertEqual(list(range(5)), observed) + self.assertEqual([e.build() for e in self.entries], observed) self.assertEqual(1, self.synchronize_mock.call_count) - self.assertEqual(call(), self.synchronize_mock.call_args) + self.assertEqual(call(synchronize=False), self.synchronize_mock.call_args) self.assertEqual(1, self.find_mock.call_count) args = call( @@ -133,6 +142,7 @@ async def test_find(self): limit=10, streaming_mode=True, transaction=transaction, + exclude_deleted=True, ) self.assertEqual(args, self.find_mock.call_args) @@ -154,7 +164,7 @@ async def test_synchronize(self): await self.snapshot_repository.synchronize() self.assertEqual(1, self.synchronize_mock.call_count) - self.assertEqual(call(), self.synchronize_mock.call_args) + self.assertEqual(call(synchronize=False), self.synchronize_mock.call_args) if __name__ == "__main__": diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_repositories/test_database.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_repositories/test_database.py new file mode 100644 index 000000000..76eadca7f --- /dev/null +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_repositories/test_database.py @@ -0,0 +1,506 @@ +import unittest +from itertools import ( + chain, + cycle, +) +from unittest.mock import ( + MagicMock, + patch, +) + +from minos.aggregate import ( + DatabaseSnapshotRepository, + SnapshotEntry, + SnapshotRepository, +) +from minos.aggregate.testing import ( + SnapshotRepositoryTestCase, +) +from minos.common import ( + DatabaseClient, + NotProvidedException, + ProgrammingException, + classname, + current_datetime, +) +from tests.utils import ( + AggregateTestCase, + FakeAsyncIterator, +) + + +class TestDatabaseSnapshotRepository(AggregateTestCase, SnapshotRepositoryTestCase): + __test__ = True + + def test_constructor_raises(self): + with self.assertRaises(NotProvidedException): + # noinspection PyTypeChecker + DatabaseSnapshotRepository(event_repository=None) + + with self.assertRaises(NotProvidedException): + # noinspection PyTypeChecker + DatabaseSnapshotRepository(transaction_repository=None) + + async def test_is_synced(self): + self.event_repository.select = MagicMock(side_effect=[FakeAsyncIterator([1]), FakeAsyncIterator([])]) + + with patch.object(DatabaseClient, "fetch_one", return_value=(0,)): + self.assertFalse(await self.snapshot_repository.is_synced(SnapshotRepositoryTestCase.Car)) + self.assertTrue(await self.snapshot_repository.is_synced(SnapshotRepositoryTestCase.Car)) + + def build_snapshot_repository(self) -> SnapshotRepository: + return DatabaseSnapshotRepository.from_config(self.config) + + async def synchronize(self): + with patch.object( + DatabaseClient, + "fetch_one", + side_effect=[ + ProgrammingException(""), + (current_datetime(), current_datetime()), + (current_datetime(), current_datetime()), + (current_datetime(), current_datetime()), + (current_datetime(), current_datetime()), + (current_datetime(), current_datetime()), + (current_datetime(), current_datetime()), + (current_datetime(), current_datetime()), + (current_datetime(), current_datetime()), + (current_datetime(), current_datetime()), + (current_datetime(), current_datetime()), + (current_datetime(), current_datetime()), + ], + ): + with patch.object( + DatabaseClient, + "fetch_all", + side_effect=chain( + [ + FakeAsyncIterator([]), + FakeAsyncIterator( + [ + tuple( + SnapshotEntry.from_root_entity( + SnapshotRepositoryTestCase.Car(3, "blue", uuid=self.uuid_1, version=1) + ) + .as_raw() + .values() + ) + ] + ), + ], + cycle( + [ + FakeAsyncIterator([]), + ] + ), + ), + ): + await super().synchronize() + + async def test_dispatch(self): + entries = [ + SnapshotEntry( + self.uuid_1, + classname(SnapshotRepositoryTestCase.Car), + 4, + created_at=current_datetime(), + updated_at=current_datetime(), + ), + SnapshotEntry.from_root_entity( + SnapshotRepositoryTestCase.Car( + 3, + "blue", + uuid=self.uuid_2, + version=2, + created_at=current_datetime(), + updated_at=current_datetime(), + ) + ), + SnapshotEntry.from_root_entity( + SnapshotRepositoryTestCase.Car( + 3, + "blue", + uuid=self.uuid_3, + version=1, + created_at=current_datetime(), + updated_at=current_datetime(), + ) + ), + ] + with patch.object(DatabaseClient, "fetch_one", return_value=(9999,)): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator([tuple(entry.as_raw().values()) for entry in entries]), + ): + await super().test_dispatch() + + async def test_dispatch_first_transaction(self): + entries = [ + SnapshotEntry( + self.uuid_1, + classname(SnapshotRepositoryTestCase.Car), + 4, + created_at=current_datetime(), + updated_at=current_datetime(), + ), + SnapshotEntry.from_root_entity( + SnapshotRepositoryTestCase.Car( + 3, + "blue", + uuid=self.uuid_2, + version=4, + created_at=current_datetime(), + updated_at=current_datetime(), + ) + ), + SnapshotEntry.from_root_entity( + SnapshotRepositoryTestCase.Car( + 3, + "blue", + uuid=self.uuid_3, + version=1, + created_at=current_datetime(), + updated_at=current_datetime(), + ) + ), + ] + with patch.object(DatabaseClient, "fetch_one", return_value=(9999,)): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator([tuple(entry.as_raw().values()) for entry in entries]), + ): + await super().test_dispatch_first_transaction() + + async def test_dispatch_second_transaction(self): + entries = [ + SnapshotEntry( + self.uuid_1, + classname(SnapshotRepositoryTestCase.Car), + 4, + created_at=current_datetime(), + updated_at=current_datetime(), + ), + SnapshotEntry( + self.uuid_2, + classname(SnapshotRepositoryTestCase.Car), + 4, + created_at=current_datetime(), + updated_at=current_datetime(), + ), + SnapshotEntry.from_root_entity( + SnapshotRepositoryTestCase.Car( + 3, + "blue", + uuid=self.uuid_3, + version=1, + created_at=current_datetime(), + updated_at=current_datetime(), + ) + ), + ] + with patch.object(DatabaseClient, "fetch_one", return_value=(9999,)): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator([tuple(entry.as_raw().values()) for entry in entries]), + ): + await super().test_dispatch_second_transaction() + + async def test_dispatch_third_transaction(self): + entries = [ + SnapshotEntry( + self.uuid_1, + classname(SnapshotRepositoryTestCase.Car), + 4, + created_at=current_datetime(), + updated_at=current_datetime(), + ), + SnapshotEntry.from_root_entity( + SnapshotRepositoryTestCase.Car( + 3, + "blue", + uuid=self.uuid_2, + version=2, + created_at=current_datetime(), + updated_at=current_datetime(), + ) + ), + SnapshotEntry.from_root_entity( + SnapshotRepositoryTestCase.Car( + 3, + "blue", + uuid=self.uuid_3, + version=1, + created_at=current_datetime(), + updated_at=current_datetime(), + ) + ), + ] + with patch.object(DatabaseClient, "fetch_one", return_value=(9999,)): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator([tuple(entry.as_raw().values()) for entry in entries]), + ): + await super().test_dispatch_third_transaction() + + async def test_dispatch_ignore_previous_version(self): + entries = [ + SnapshotEntry( + uuid=self.uuid_1, + name=classname(SnapshotRepositoryTestCase.Car), + version=3, + schema=SnapshotRepositoryTestCase.Car.avro_schema, + data=SnapshotRepositoryTestCase.Car(3, "blue", uuid=self.uuid_1, version=1).avro_data, + created_at=current_datetime(), + updated_at=current_datetime(), + ) + ] + with patch.object( + DatabaseClient, + "fetch_one", + side_effect=[ + ProgrammingException(""), + (current_datetime(), current_datetime()), + (current_datetime(), current_datetime()), + (9999,), + ], + ): + with patch.object( + DatabaseClient, + "fetch_all", + side_effect=[ + FakeAsyncIterator([]), + FakeAsyncIterator( + [ + tuple( + SnapshotEntry.from_root_entity( + SnapshotRepositoryTestCase.Car(3, "blue", uuid=self.uuid_1, version=5) + ) + .as_raw() + .values() + ) + ] + ), + FakeAsyncIterator([]), + FakeAsyncIterator([tuple(entry.as_raw().values()) for entry in entries]), + ], + ): + await super().test_dispatch_ignore_previous_version() + + async def test_dispatch_with_offset(self): + with patch.object( + DatabaseClient, + "fetch_one", + side_effect=[ + (0,), + (current_datetime(), current_datetime()), + (current_datetime(), current_datetime()), + (current_datetime(), current_datetime()), + (current_datetime(), current_datetime()), + (current_datetime(), current_datetime()), + (current_datetime(), current_datetime()), + (current_datetime(), current_datetime()), + (current_datetime(), current_datetime()), + (current_datetime(), current_datetime()), + (current_datetime(), current_datetime()), + (current_datetime(), current_datetime()), + (11,), + (current_datetime(), current_datetime()), + (12,), + (12,), + ], + ): + await super().test_dispatch_with_offset() + + async def test_find_by_uuid(self): + entities = [ + SnapshotRepositoryTestCase.Car(3, "blue", uuid=self.uuid_2, version=2), + SnapshotRepositoryTestCase.Car(3, "blue", uuid=self.uuid_3, version=1), + ] + with patch.object(DatabaseClient, "fetch_one", return_value=(9999,)): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [tuple(SnapshotEntry.from_root_entity(entity).as_raw().values()) for entity in entities] + ), + ): + await super().test_find_by_uuid() + + async def test_find_with_transaction(self): + entities = [ + SnapshotRepositoryTestCase.Car(3, "blue", uuid=self.uuid_2, version=4), + SnapshotRepositoryTestCase.Car(3, "blue", uuid=self.uuid_3, version=1), + ] + with patch.object(DatabaseClient, "fetch_one", return_value=(9999,)): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [tuple(SnapshotEntry.from_root_entity(entity).as_raw().values()) for entity in entities] + ), + ): + await super().test_find_with_transaction() + + async def test_find_with_transaction_delete(self): + entities = [SnapshotRepositoryTestCase.Car(3, "blue", uuid=self.uuid_3, version=1)] + with patch.object(DatabaseClient, "fetch_one", return_value=(9999,)): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [tuple(SnapshotEntry.from_root_entity(entity).as_raw().values()) for entity in entities] + ), + ): + await super().test_find_with_transaction_delete() + + async def test_find_with_transaction_reverted(self): + entities = [ + SnapshotRepositoryTestCase.Car(3, "blue", uuid=self.uuid_2, version=2), + SnapshotRepositoryTestCase.Car(3, "blue", uuid=self.uuid_3, version=1), + ] + with patch.object(DatabaseClient, "fetch_one", return_value=(9999,)): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [tuple(SnapshotEntry.from_root_entity(entity).as_raw().values()) for entity in entities] + ), + ): + await super().test_find_with_transaction_reverted() + + async def test_find_streaming_true(self): + entities = [ + SnapshotRepositoryTestCase.Car(3, "blue", uuid=self.uuid_2, version=2), + SnapshotRepositoryTestCase.Car(3, "blue", uuid=self.uuid_3, version=1), + ] + with patch.object(DatabaseClient, "fetch_one", return_value=(9999,)): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [tuple(SnapshotEntry.from_root_entity(entity).as_raw().values()) for entity in entities] + ), + ): + await super().test_find_streaming_true() + + async def test_find_with_duplicates(self): + entities = [ + SnapshotRepositoryTestCase.Car(3, "blue", uuid=self.uuid_2, version=2), + SnapshotRepositoryTestCase.Car(3, "blue", uuid=self.uuid_3, version=1), + ] + with patch.object(DatabaseClient, "fetch_one", return_value=(9999,)): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [tuple(SnapshotEntry.from_root_entity(entity).as_raw().values()) for entity in entities] + ), + ): + await super().test_find_with_duplicates() + + async def test_find_empty(self): + entities = [] + with patch.object(DatabaseClient, "fetch_one", return_value=(9999,)): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [tuple(SnapshotEntry.from_root_entity(entity).as_raw().values()) for entity in entities] + ), + ): + await super().test_find_empty() + + async def test_get(self): + entities = [ + SnapshotRepositoryTestCase.Car(3, "blue", uuid=self.uuid_2, version=2), + ] + with patch.object(DatabaseClient, "fetch_one", return_value=(9999,)): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [tuple(SnapshotEntry.from_root_entity(entity).as_raw().values()) for entity in entities] + ), + ): + await super().test_get() + + async def test_get_with_transaction(self): + entities = [SnapshotRepositoryTestCase.Car(3, "blue", uuid=self.uuid_2, version=4)] + with patch.object(DatabaseClient, "fetch_one", return_value=(9999,)): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [tuple(SnapshotEntry.from_root_entity(entity).as_raw().values()) for entity in entities] + ), + ): + await super().test_get_with_transaction() + + async def test_get_raises(self): + with patch.object(DatabaseClient, "fetch_one", return_value=(9999,)): + with patch.object( + DatabaseClient, + "fetch_all", + side_effect=[ + FakeAsyncIterator( + [ + tuple( + SnapshotEntry(self.uuid_1, classname(SnapshotRepositoryTestCase.Car), 1) + .as_raw() + .values() + ) + ] + ), + FakeAsyncIterator([]), + ], + ): + await super().test_get_raises() + + async def test_get_with_transaction_raises(self): + with patch.object(DatabaseClient, "fetch_one", return_value=(9999,)): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [tuple(SnapshotEntry(self.uuid_1, classname(SnapshotRepositoryTestCase.Car), 1).as_raw().values())] + ), + ): + await super().test_get_with_transaction_raises() + + async def test_find(self): + entities = [ + SnapshotRepositoryTestCase.Car(3, "blue", uuid=self.uuid_2, version=2), + SnapshotRepositoryTestCase.Car(3, "blue", uuid=self.uuid_3, version=1), + ] + with patch.object(DatabaseClient, "fetch_one", return_value=(9999,)): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [tuple(SnapshotEntry.from_root_entity(entity).as_raw().values()) for entity in entities] + ), + ): + await super().test_find() + + async def test_find_all(self): + entities = [ + SnapshotRepositoryTestCase.Car(3, "blue", uuid=self.uuid_2, version=2), + SnapshotRepositoryTestCase.Car(3, "blue", uuid=self.uuid_3, version=1), + ] + with patch.object(DatabaseClient, "fetch_one", return_value=(9999,)): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [tuple(SnapshotEntry.from_root_entity(entity).as_raw().values()) for entity in entities] + ), + ): + await super().test_find_all() + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_repositories/test_memory.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_repositories/test_memory.py new file mode 100644 index 000000000..0fbc1b325 --- /dev/null +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_repositories/test_memory.py @@ -0,0 +1,38 @@ +import unittest + +from minos.aggregate import ( + InMemorySnapshotRepository, + SnapshotRepository, +) +from minos.aggregate.testing import ( + SnapshotRepositoryTestCase, +) +from minos.common import ( + NotProvidedException, +) +from tests.utils import ( + AggregateTestCase, +) + + +class TestInMemorySnapshotRepository(AggregateTestCase, SnapshotRepositoryTestCase): + __test__ = True + + def build_snapshot_repository(self) -> SnapshotRepository: + return InMemorySnapshotRepository() + + def test_constructor_raises(self): + with self.assertRaises(NotProvidedException): + # noinspection PyTypeChecker + InMemorySnapshotRepository(event_repository=None) + + with self.assertRaises(NotProvidedException): + # noinspection PyTypeChecker + InMemorySnapshotRepository(transaction_repository=None) + + async def test_dispatch_with_offset(self): + pass + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_services.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_services.py index 4e36a15b4..e552e9104 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_services.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_services.py @@ -17,7 +17,7 @@ ModelType, ) from minos.common.testing import ( - PostgresAsyncTestCase, + DatabaseMinosTestCase, ) from minos.networks import ( BrokerCommandEnrouteDecorator, @@ -26,17 +26,14 @@ ResponseException, ) from tests.utils import ( - CONFIG_FILE_PATH, - MinosTestCase, + AggregateTestCase, Order, ) Agg = ModelType.build("Agg", {"uuid": UUID}) -class TestSnapshotService(MinosTestCase, PostgresAsyncTestCase): - CONFIG_FILE_PATH = CONFIG_FILE_PATH - +class TestSnapshotService(AggregateTestCase, DatabaseMinosTestCase): def setUp(self) -> None: super().setUp() diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_transactions/test_entries.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_transactions/test_entries.py index e6d387c6f..ef8f2d75b 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_transactions/test_entries.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_transactions/test_entries.py @@ -1,4 +1,7 @@ import unittest +from datetime import ( + datetime, +) from unittest.mock import ( AsyncMock, MagicMock, @@ -23,12 +26,12 @@ NULL_UUID, ) from tests.utils import ( + AggregateTestCase, FakeAsyncIterator, - MinosTestCase, ) -class TestTransactionEntry(MinosTestCase): +class TestTransactionEntry(AggregateTestCase): def test_constructor(self): transaction = TransactionEntry() @@ -523,6 +526,24 @@ def test_repr(self): ) self.assertEqual(expected, repr(transaction)) + def test_as_raw(self): + uuid = uuid4() + status = TransactionStatus.PENDING + event_offset = 56 + updated_at = datetime(2020, 10, 13, 8, 45, 32) + destination_uuid = uuid4() + + entry = TransactionEntry(uuid, status, event_offset, destination_uuid, updated_at) + expected = { + "uuid": uuid, + "status": status, + "event_offset": event_offset, + "destination_uuid": destination_uuid, + "updated_at": updated_at, + } + + self.assertEqual(expected, entry.as_raw()) + class TestTransactionStatus(unittest.TestCase): def test_value_of_created(self): diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_transactions/test_repositories/test_abc.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_transactions/test_repositories/test_abc.py index 84d473cd9..56f4013c5 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_transactions/test_repositories/test_abc.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_transactions/test_repositories/test_abc.py @@ -25,9 +25,9 @@ SetupMixin, ) from tests.utils import ( + AggregateTestCase, FakeAsyncIterator, FakeLock, - MinosTestCase, ) @@ -41,15 +41,15 @@ def _select(self, **kwargs) -> AsyncIterator[TransactionEntry]: """For testing purposes.""" -class TestTransactionRepository(MinosTestCase): +class TestTransactionRepository(AggregateTestCase): def setUp(self) -> None: super().setUp() self.transaction_repository = _TransactionRepository() async def test_constructor_raises(self): with self.assertRaises(NotProvidedException): - # noinspection PyTypeChecker - _TransactionRepository(lock_pool=None) + # noinspection PyArgumentEqualDefault + _TransactionRepository(lock_pool=None, pool_factory=None) def test_abstract(self): self.assertTrue(issubclass(TransactionRepository, (ABC, SetupMixin))) @@ -69,7 +69,7 @@ def test_write_lock(self): expected = FakeLock() mock = MagicMock(return_value=expected) - self.lock_pool.acquire = mock + self.pool_factory.get_pool("lock").acquire = mock self.assertEqual(expected, self.transaction_repository.write_lock()) self.assertEqual(1, mock.call_count) diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_transactions/test_repositories/test_database.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_transactions/test_repositories/test_database.py new file mode 100644 index 000000000..f7900acff --- /dev/null +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_transactions/test_repositories/test_database.py @@ -0,0 +1,326 @@ +import unittest +from unittest.mock import ( + patch, +) + +from minos.aggregate import ( + DatabaseTransactionRepository, + TransactionRepository, + TransactionStatus, +) +from minos.aggregate.testing import ( + TransactionRepositoryTestCase, +) +from minos.common import ( + DatabaseClient, + ProgrammingException, + current_datetime, +) +from tests.utils import ( + AggregateTestCase, + FakeAsyncIterator, +) + + +# noinspection SqlNoDataSourceInspection +class TestDatabaseTransactionRepository(AggregateTestCase, TransactionRepositoryTestCase): + __test__ = True + + def build_transaction_repository(self) -> TransactionRepository: + return DatabaseTransactionRepository.from_config(self.config) + + async def test_submit(self): + with patch.object( + DatabaseClient, + "fetch_one", + return_value=[current_datetime()], + ): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator([(self.uuid, TransactionStatus.PENDING, 34)]), + ): + await super().test_submit() + + async def test_submit_pending_raises(self): + with patch.object( + DatabaseClient, + "fetch_one", + side_effect=[ + (current_datetime(),), + ProgrammingException(""), + ProgrammingException(""), + ProgrammingException(""), + ProgrammingException(""), + ], + ): + await super().test_submit_pending_raises() + + async def test_submit_reserving_raises(self): + with patch.object( + DatabaseClient, + "fetch_one", + side_effect=[ + (current_datetime(),), + ProgrammingException(""), + ProgrammingException(""), + ProgrammingException(""), + ProgrammingException(""), + ], + ): + await super().test_submit_reserving_raises() + + async def test_submit_reserved_raises(self): + with patch.object( + DatabaseClient, + "fetch_one", + side_effect=[ + (current_datetime(),), + ProgrammingException(""), + ProgrammingException(""), + ProgrammingException(""), + ], + ): + await super().test_submit_reserved_raises() + + async def test_submit_committing_raises(self): + with patch.object( + DatabaseClient, + "fetch_one", + side_effect=[ + (current_datetime(),), + ProgrammingException(""), + ProgrammingException(""), + ProgrammingException(""), + ProgrammingException(""), + ProgrammingException(""), + ProgrammingException(""), + ], + ): + await super().test_submit_committing_raises() + + async def test_submit_committed_raises(self): + with patch.object( + DatabaseClient, + "fetch_one", + side_effect=[ + (current_datetime(),), + ProgrammingException(""), + ProgrammingException(""), + ProgrammingException(""), + ProgrammingException(""), + ProgrammingException(""), + ProgrammingException(""), + ], + ): + await super().test_submit_committed_raises() + + async def test_submit_rejected_raises(self): + with patch.object( + DatabaseClient, + "fetch_one", + side_effect=[ + (current_datetime(),), + ProgrammingException(""), + ProgrammingException(""), + ProgrammingException(""), + ProgrammingException(""), + ProgrammingException(""), + ProgrammingException(""), + ], + ): + await super().test_submit_rejected_raises() + + async def populate(self) -> None: + with patch.object( + DatabaseClient, + "fetch_one", + side_effect=[ + (current_datetime(),), + (current_datetime(),), + (current_datetime(),), + (current_datetime(),), + (current_datetime(),), + (current_datetime(),), + ], + ): + await super().populate() + + async def test_select(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator([tuple(entry.as_raw().values()) for entry in self.entries]), + ): + await super().test_select() + + async def test_select_uuid(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator([tuple(entry.as_raw().values()) for entry in [self.entries[1]]]), + ): + await super().test_select_uuid() + + async def test_select_uuid_ne(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [ + tuple(entry.as_raw().values()) + for entry in [self.entries[0], self.entries[2], self.entries[3], self.entries[4]] + ] + ), + ): + await super().test_select_uuid_ne() + + async def test_select_uuid_in(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [tuple(entry.as_raw().values()) for entry in [self.entries[1], self.entries[2]]] + ), + ): + await super().test_select_uuid_in() + + async def test_select_destination_uuid(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator([tuple(entry.as_raw().values()) for entry in [self.entries[4]]]), + ): + await super().test_select_destination_uuid() + + async def test_select_status(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [tuple(entry.as_raw().values()) for entry in [self.entries[0], self.entries[1], self.entries[4]]] + ), + ): + await super().test_select_status() + + async def test_select_status_in(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [tuple(entry.as_raw().values()) for entry in [self.entries[2], self.entries[3]]] + ), + ): + await super().test_select_status_in() + + async def test_select_event_offset(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator([tuple(entry.as_raw().values()) for entry in [self.entries[1]]]), + ): + await super().test_select_event_offset() + + async def test_select_event_offset_lt(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator([tuple(entry.as_raw().values()) for entry in [self.entries[0]]]), + ): + await super().test_select_event_offset_lt() + + async def test_select_event_offset_gt(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [tuple(entry.as_raw().values()) for entry in [self.entries[2], self.entries[3], self.entries[4]]] + ), + ): + await super().test_select_event_offset_gt() + + async def test_select_event_offset_le(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [tuple(entry.as_raw().values()) for entry in [self.entries[0], self.entries[1]]] + ), + ): + await super().test_select_event_offset_le() + + async def test_select_event_offset_ge(self): + with patch.object( + DatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator( + [ + tuple(entry.as_raw().values()) + for entry in [self.entries[1], self.entries[2], self.entries[3], self.entries[4]] + ] + ), + ): + await super().test_select_event_offset_ge() + + async def test_select_updated_at(self): + with patch.object( + DatabaseClient, + "fetch_all", + side_effect=[ + FakeAsyncIterator([tuple(self.entries[2].as_raw().values())]), + FakeAsyncIterator([tuple(entry.as_raw().values()) for entry in [self.entries[2]]]), + ], + ): + await super().test_select_updated_at() + + async def test_select_updated_at_lt(self): + with patch.object( + DatabaseClient, + "fetch_all", + side_effect=[ + FakeAsyncIterator([tuple(self.entries[2].as_raw().values())]), + FakeAsyncIterator([tuple(entry.as_raw().values()) for entry in [self.entries[0], self.entries[1]]]), + ], + ): + await super().test_select_updated_at_lt() + + async def test_select_updated_at_gt(self): + with patch.object( + DatabaseClient, + "fetch_all", + side_effect=[ + FakeAsyncIterator([tuple(self.entries[2].as_raw().values())]), + FakeAsyncIterator([tuple(entry.as_raw().values()) for entry in [self.entries[3], self.entries[4]]]), + ], + ): + await super().test_select_updated_at_gt() + + async def test_select_updated_at_le(self): + with patch.object( + DatabaseClient, + "fetch_all", + side_effect=[ + FakeAsyncIterator([tuple(self.entries[2].as_raw().values())]), + FakeAsyncIterator( + [tuple(entry.as_raw().values()) for entry in [self.entries[0], self.entries[1], self.entries[2]]] + ), + ], + ): + await super().test_select_updated_at_le() + + async def test_select_updated_at_ge(self): + with patch.object( + DatabaseClient, + "fetch_all", + side_effect=[ + FakeAsyncIterator([tuple(self.entries[2].as_raw().values())]), + FakeAsyncIterator( + [tuple(entry.as_raw().values()) for entry in [self.entries[2], self.entries[3], self.entries[4]]] + ), + ], + ): + await super().test_select_updated_at_ge() + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_transactions/test_repositories/test_memory.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_transactions/test_repositories/test_memory.py index b16339df3..95ba70979 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_transactions/test_repositories/test_memory.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_transactions/test_repositories/test_memory.py @@ -1,257 +1,22 @@ import unittest -from uuid import ( - uuid4, -) from minos.aggregate import ( InMemoryTransactionRepository, - TransactionEntry, TransactionRepository, - TransactionRepositoryConflictException, - TransactionStatus, +) +from minos.aggregate.testing import ( + TransactionRepositoryTestCase, ) from tests.utils import ( - MinosTestCase, + AggregateTestCase, ) -class TestInMemoryTransactionRepository(MinosTestCase): - def setUp(self) -> None: - super().setUp() - self.uuid = uuid4() - - async def asyncSetUp(self) -> None: - await super().asyncSetUp() - self.transaction_repository = InMemoryTransactionRepository() - await self.transaction_repository.setup() - - async def asyncTearDown(self) -> None: - await self.transaction_repository.destroy() - await super().asyncTearDown() - - async def test_subclass(self) -> None: - self.assertTrue(issubclass(InMemoryTransactionRepository, TransactionRepository)) - - async def test_submit(self): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.PENDING, 34)) - expected = [TransactionEntry(self.uuid, TransactionStatus.PENDING, 34)] - observed = [v async for v in self.transaction_repository.select()] - self.assertEqual(expected, observed) - - async def test_submit_pending_raises(self): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.PENDING, 34)) - with self.assertRaises(TransactionRepositoryConflictException): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.RESERVED, 34)) - with self.assertRaises(TransactionRepositoryConflictException): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.COMMITTING, 34)) - with self.assertRaises(TransactionRepositoryConflictException): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.COMMITTED, 34)) - - async def test_submit_reserving_raises(self): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.RESERVING, 34)) - with self.assertRaises(TransactionRepositoryConflictException): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.PENDING, 34)) - with self.assertRaises(TransactionRepositoryConflictException): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.RESERVING, 34)) - with self.assertRaises(TransactionRepositoryConflictException): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.COMMITTING, 34)) - with self.assertRaises(TransactionRepositoryConflictException): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.COMMITTED, 34)) - - async def test_submit_reserved_raises(self): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.RESERVED, 34)) - with self.assertRaises(TransactionRepositoryConflictException): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.PENDING, 34)) - with self.assertRaises(TransactionRepositoryConflictException): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.RESERVING, 34)) - with self.assertRaises(TransactionRepositoryConflictException): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.RESERVED, 34)) - - async def test_submit_committing_raises(self): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.COMMITTED, 34)) - with self.assertRaises(TransactionRepositoryConflictException): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.PENDING, 34)) - with self.assertRaises(TransactionRepositoryConflictException): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.RESERVING, 34)) - with self.assertRaises(TransactionRepositoryConflictException): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.RESERVED, 34)) - with self.assertRaises(TransactionRepositoryConflictException): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.COMMITTING, 34)) - with self.assertRaises(TransactionRepositoryConflictException): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.REJECTED, 34)) - - async def test_submit_committed_raises(self): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.COMMITTED, 34)) - with self.assertRaises(TransactionRepositoryConflictException): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.PENDING, 34)) - with self.assertRaises(TransactionRepositoryConflictException): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.RESERVING, 34)) - with self.assertRaises(TransactionRepositoryConflictException): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.RESERVED, 34)) - with self.assertRaises(TransactionRepositoryConflictException): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.COMMITTING, 34)) - with self.assertRaises(TransactionRepositoryConflictException): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.COMMITTED, 34)) - with self.assertRaises(TransactionRepositoryConflictException): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.REJECTED, 34)) - - async def test_submit_rejected_raises(self): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.REJECTED, 34)) - with self.assertRaises(TransactionRepositoryConflictException): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.PENDING, 34)) - with self.assertRaises(TransactionRepositoryConflictException): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.RESERVING, 34)) - with self.assertRaises(TransactionRepositoryConflictException): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.RESERVED, 34)) - with self.assertRaises(TransactionRepositoryConflictException): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.COMMITTING, 34)) - with self.assertRaises(TransactionRepositoryConflictException): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.COMMITTED, 34)) - with self.assertRaises(TransactionRepositoryConflictException): - await self.transaction_repository.submit(TransactionEntry(self.uuid, TransactionStatus.REJECTED, 34)) - - async def test_select_empty(self): - expected = [] - observed = [v async for v in self.transaction_repository.select()] - self.assertEqual(expected, observed) - - -class TestInMemoryTransactionRepositorySelect(MinosTestCase): - def setUp(self) -> None: - super().setUp() - self.uuid_1 = uuid4() - self.uuid_2 = uuid4() - self.uuid_3 = uuid4() - self.uuid_4 = uuid4() - self.uuid_5 = uuid4() - - self.transaction_repository = InMemoryTransactionRepository() - - self.entries = [ - TransactionEntry(self.uuid_1, TransactionStatus.PENDING, 12), - TransactionEntry(self.uuid_2, TransactionStatus.PENDING, 15), - TransactionEntry(self.uuid_3, TransactionStatus.REJECTED, 16), - TransactionEntry(self.uuid_4, TransactionStatus.COMMITTED, 20), - TransactionEntry(self.uuid_5, TransactionStatus.PENDING, 20, self.uuid_1), - ] - - async def asyncSetUp(self): - await super().asyncSetUp() - await self._populate() - - async def _populate(self): - await self.transaction_repository.setup() - await self.transaction_repository.submit(TransactionEntry(self.uuid_1, TransactionStatus.PENDING, 12)) - await self.transaction_repository.submit(TransactionEntry(self.uuid_2, TransactionStatus.PENDING, 15)) - await self.transaction_repository.submit(TransactionEntry(self.uuid_3, TransactionStatus.REJECTED, 16)) - await self.transaction_repository.submit(TransactionEntry(self.uuid_4, TransactionStatus.COMMITTED, 20)) - await self.transaction_repository.submit( - TransactionEntry(self.uuid_5, TransactionStatus.PENDING, 20, self.uuid_1) - ) - - async def asyncTearDown(self): - await self.transaction_repository.destroy() - await super().asyncTearDown() - - async def test_select(self): - expected = self.entries - observed = [v async for v in self.transaction_repository.select()] - self.assertEqual(expected, observed) - - async def test_select_uuid(self): - expected = [self.entries[1]] - observed = [v async for v in self.transaction_repository.select(uuid=self.uuid_2)] - self.assertEqual(expected, observed) - - async def test_select_uuid_ne(self): - expected = [self.entries[0], self.entries[2], self.entries[3], self.entries[4]] - observed = [v async for v in self.transaction_repository.select(uuid_ne=self.uuid_2)] - self.assertEqual(expected, observed) - - async def test_select_uuid_in(self): - expected = [self.entries[1], self.entries[2]] - observed = [v async for v in self.transaction_repository.select(uuid_in=(self.uuid_2, self.uuid_3))] - self.assertEqual(expected, observed) - - async def test_select_destination_uuid(self): - expected = [self.entries[4]] - observed = [v async for v in self.transaction_repository.select(destination_uuid=self.uuid_1)] - self.assertEqual(expected, observed) - - async def test_select_status(self): - expected = [self.entries[0], self.entries[1], self.entries[4]] - observed = [v async for v in self.transaction_repository.select(status=TransactionStatus.PENDING)] - self.assertEqual(expected, observed) - - async def test_select_status_in(self): - expected = [self.entries[2], self.entries[3]] - observed = [ - v - async for v in self.transaction_repository.select( - status_in=(TransactionStatus.COMMITTED, TransactionStatus.REJECTED) - ) - ] - self.assertEqual(expected, observed) - - async def test_select_event_offset(self): - expected = [self.entries[1]] - observed = [v async for v in self.transaction_repository.select(event_offset=15)] - self.assertEqual(expected, observed) - - async def test_select_event_offset_lt(self): - expected = [self.entries[0]] - observed = [v async for v in self.transaction_repository.select(event_offset_lt=15)] - self.assertEqual(expected, observed) - - async def test_select_event_offset_gt(self): - expected = [self.entries[2], self.entries[3], self.entries[4]] - observed = [v async for v in self.transaction_repository.select(event_offset_gt=15)] - self.assertEqual(expected, observed) - - async def test_select_event_offset_le(self): - expected = [self.entries[0], self.entries[1]] - observed = [v async for v in self.transaction_repository.select(event_offset_le=15)] - self.assertEqual(expected, observed) - - async def test_select_event_offset_ge(self): - expected = [self.entries[1], self.entries[2], self.entries[3], self.entries[4]] - observed = [v async for v in self.transaction_repository.select(event_offset_ge=15)] - self.assertEqual(expected, observed) - - async def test_select_updated_at(self): - updated_at = (await self.transaction_repository.get(self.uuid_3)).updated_at - - expected = [self.entries[2]] - observed = [v async for v in self.transaction_repository.select(updated_at=updated_at)] - self.assertEqual(expected, observed) - - async def test_select_updated_at_lt(self): - updated_at = (await self.transaction_repository.get(self.uuid_3)).updated_at - - expected = [self.entries[0], self.entries[1]] - observed = [v async for v in self.transaction_repository.select(updated_at_lt=updated_at)] - self.assertEqual(expected, observed) - - async def test_select_updated_at_gt(self): - updated_at = (await self.transaction_repository.get(self.uuid_3)).updated_at - - expected = [self.entries[3], self.entries[4]] - observed = [v async for v in self.transaction_repository.select(updated_at_gt=updated_at)] - self.assertEqual(expected, observed) - - async def test_select_updated_at_le(self): - updated_at = (await self.transaction_repository.get(self.uuid_3)).updated_at - - expected = [self.entries[0], self.entries[1], self.entries[2]] - observed = [v async for v in self.transaction_repository.select(updated_at_le=updated_at)] - self.assertEqual(expected, observed) - - async def test_select_updated_at_ge(self): - updated_at = (await self.transaction_repository.get(self.uuid_3)).updated_at +class TestInMemoryTransactionRepository(AggregateTestCase, TransactionRepositoryTestCase): + __test__ = True - expected = [self.entries[2], self.entries[3], self.entries[4]] - observed = [v async for v in self.transaction_repository.select(updated_at_ge=updated_at)] - self.assertEqual(expected, observed) + def build_transaction_repository(self) -> TransactionRepository: + return InMemoryTransactionRepository() if __name__ == "__main__": diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_transactions/test_services.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_transactions/test_services.py index 849615a78..1fb1c1a6a 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_transactions/test_services.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_transactions/test_services.py @@ -22,7 +22,7 @@ current_datetime, ) from minos.common.testing import ( - PostgresAsyncTestCase, + DatabaseMinosTestCase, ) from minos.networks import ( BrokerCommandEnrouteDecorator, @@ -31,15 +31,12 @@ ResponseException, ) from tests.utils import ( - CONFIG_FILE_PATH, + AggregateTestCase, FakeAsyncIterator, - MinosTestCase, ) -class TestSnapshotService(MinosTestCase, PostgresAsyncTestCase): - CONFIG_FILE_PATH = CONFIG_FILE_PATH - +class TestSnapshotService(AggregateTestCase, DatabaseMinosTestCase): def setUp(self) -> None: super().setUp() diff --git a/packages/core/minos-microservice-aggregate/tests/test_config.yml b/packages/core/minos-microservice-aggregate/tests/test_config.yml index 2416a4a81..ed9905abd 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_config.yml +++ b/packages/core/minos-microservice-aggregate/tests/test_config.yml @@ -2,12 +2,14 @@ service: name: Order aggregate: tests.utils.Order repository: + client: minos.common.testing.MockedDatabaseClient database: order_db user: minos password: min0s host: localhost port: 5432 snapshot: + client: minos.common.testing.MockedDatabaseClient database: order_db user: minos password: min0s @@ -20,6 +22,7 @@ broker: host: localhost port: 9092 queue: + client: minos.common.testing.MockedDatabaseClient database: order_db user: minos password: min0s diff --git a/packages/core/minos-microservice-aggregate/tests/testcases/__init__.py b/packages/core/minos-microservice-aggregate/tests/testcases/__init__.py deleted file mode 100644 index ed0100614..000000000 --- a/packages/core/minos-microservice-aggregate/tests/testcases/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from .event_repository import ( - EventRepositorySelectTestCase, - EventRepositorySubmitTestCase, - EventRepositoryTestCase, -) diff --git a/packages/core/minos-microservice-aggregate/tests/utils.py b/packages/core/minos-microservice-aggregate/tests/utils.py index 1e327c4f8..aa9333287 100644 --- a/packages/core/minos-microservice-aggregate/tests/utils.py +++ b/packages/core/minos-microservice-aggregate/tests/utils.py @@ -2,7 +2,6 @@ annotations, ) -import unittest from abc import ( ABC, ) @@ -28,11 +27,16 @@ RootEntity, ValueObject, ValueObjectSet, + testing, ) from minos.common import ( - DependencyInjector, + DatabaseClientPool, Lock, LockPool, + PoolFactory, +) +from minos.common.testing import ( + MinosTestCase, ) from minos.networks import ( BrokerClientPool, @@ -44,50 +48,36 @@ CONFIG_FILE_PATH = BASE_PATH / "test_config.yml" -class MinosTestCase(unittest.IsolatedAsyncioTestCase, ABC): - def setUp(self) -> None: - super().setUp() - self.broker_pool = BrokerClientPool.from_config(CONFIG_FILE_PATH) - self.broker_publisher = InMemoryBrokerPublisher() - self.broker_subscriber_builder = InMemoryBrokerSubscriberBuilder() - self.lock_pool = FakeLockPool() - self.transaction_repository = InMemoryTransactionRepository(lock_pool=self.lock_pool) - self.event_repository = InMemoryEventRepository( - broker_publisher=self.broker_publisher, - transaction_repository=self.transaction_repository, - lock_pool=self.lock_pool, +class AggregateTestCase(MinosTestCase, ABC): + testing_module = testing + + def get_config_file_path(self): + return CONFIG_FILE_PATH + + def get_injections(self): + pool_factory = PoolFactory.from_config( + self.config, + default_classes={"broker": BrokerClientPool, "lock": FakeLockPool, "database": DatabaseClientPool}, ) - self.snapshot_repository = InMemorySnapshotRepository( - event_repository=self.event_repository, transaction_repository=self.transaction_repository + broker_publisher = InMemoryBrokerPublisher() + broker_subscriber_builder = InMemoryBrokerSubscriberBuilder() + transaction_repository = InMemoryTransactionRepository(lock_pool=pool_factory.get_pool("lock")) + event_repository = InMemoryEventRepository( + broker_publisher=broker_publisher, + transaction_repository=transaction_repository, + lock_pool=pool_factory.get_pool("lock"), ) - - self.injector = DependencyInjector( - None, - [ - self.broker_pool, - self.broker_publisher, - self.broker_subscriber_builder, - self.lock_pool, - self.transaction_repository, - self.event_repository, - self.snapshot_repository, - ], + snapshot_repository = InMemorySnapshotRepository( + event_repository=event_repository, transaction_repository=transaction_repository ) - self.injector.wire_injections() - - async def asyncSetUp(self): - await super().asyncSetUp() - - await self.injector.setup_injections() - - async def asyncTearDown(self): - await self.injector.destroy_injections() - - await super().asyncTearDown() - - def tearDown(self) -> None: - self.injector.unwire_injections() - super().tearDown() + return [ + pool_factory, + broker_publisher, + broker_subscriber_builder, + transaction_repository, + event_repository, + snapshot_repository, + ] class FakeAsyncIterator: @@ -114,8 +104,11 @@ def __init__(self, key=None, *args, **kwargs): key = "fake" super().__init__(key, *args, **kwargs) - async def __aexit__(self, exc_type, exc_val, exc_tb): - return + async def acquire(self) -> None: + """For testing purposes.""" + + async def release(self): + """For testing purposes.""" class FakeLockPool(LockPool): diff --git a/packages/core/minos-microservice-common/HISTORY.md b/packages/core/minos-microservice-common/HISTORY.md index b33fc6301..6f0baa6c6 100644 --- a/packages/core/minos-microservice-common/HISTORY.md +++ b/packages/core/minos-microservice-common/HISTORY.md @@ -1,79 +1,55 @@ -History -========== +# History -0.0.1.1-alpha (2021-03-28) --------------------------------- +## 0.0.1.1-alpha (2021-03-28) -0.0.1.2-alpha (2021-03-31) ------------------------------ +## 0.0.1.2-alpha (2021-03-31) -0.0.1.3-alpha (2021-03-31) ----------------------------- +## 0.0.1.3-alpha (2021-03-31) -0.0.1.4-alpha (2021-04-02) ------------------------------- +## 0.0.1.4-alpha (2021-04-02) -0.0.1.5-alpha (2021-04-02) ----------------------------- +## 0.0.1.5-alpha (2021-04-02) -0.0.1.6 (2021-04-03) ---------------------- +## 0.0.1.6 (2021-04-03) -0.0.1.7 (2021-04-06) ----------------------- +## 0.0.1.7 (2021-04-06) -0.0.2 (2021-04-19) -------------------- +## 0.0.2 (2021-04-19) -0.0.3 (2021-04-26) --------------------- +## 0.0.3 (2021-04-26) -0.0.4 (2021-04-28) --------------------- +## 0.0.4 (2021-04-28) -0.0.5 (2021-05-03) --------------------- +## 0.0.5 (2021-05-03) -0.0.6 (2021-05-04) --------------------- +## 0.0.6 (2021-05-04) -0.0.7 (2021-05-06) --------------------- +## 0.0.7 (2021-05-06) -0.0.8 (2021-05-07) --------------------- +## 0.0.8 (2021-05-07) -0.0.9 (2021-05-10) -------------------- +## 0.0.9 (2021-05-10) -0.0.10 (2021-05-11) ---------------------- +## 0.0.10 (2021-05-11) -0.0.11 (2021-05-12) ---------------------- +## 0.0.11 (2021-05-12) -0.0.12 (2021-05-17) ---------------------- +## 0.0.12 (2021-05-17) -0.0.13 (2021-05-18) ---------------------- +## 0.0.13 (2021-05-18) -0.0.14 (2021-05-20) --------------------- +## 0.0.14 (2021-05-20) -0.0.15 (2021-05-26) --------------------- +## 0.0.15 (2021-05-26) * Some code refactoring * Test cases coverage optimization * fixed some Sagas functionalities * fixed Sphinx documentation generation process -0.0.16 (2021-05-28) --------------------- +## 0.0.16 (2021-05-28) -0.0.17 (2021-06-02) --------------------- +## 0.0.17 (2021-06-02) * Documentation improvements * Removed DependencyInjector, conflict with minos.microservice package @@ -81,21 +57,18 @@ History * Added abstract classes Response and Request for Microservice Controller * Bugfix -0.1.0 (2021-06-18) --------------------- +## 0.1.0 (2021-06-18) * Enrich exception messages * Classes refactors * Added support for DTO Model class -0.1.1 (2021-07-01) --------------------- +## 0.1.1 (2021-07-01) * Resolved float problem with avro * Bugfixes -0.1.2 (2021-07-06) --------------------- +## 0.1.2 (2021-07-06) * Added Exceptions Traitment * Bugfixes @@ -103,8 +76,7 @@ History * Improved queries for Aggregate ( per id query ) * Added methods for Snapshot ( added check for duplicates ) -0.1.3 (2021-07-12) --------------------- +## 0.1.3 (2021-07-12) * AggregateRef Model * ValueObjects Model @@ -112,37 +84,31 @@ History * Removed ID to UUID for models * Events use AggregateDIff -0.1.4 (2021-07-19) --------------------- +## 0.1.4 (2021-07-19) * Bugfixes -0.1.5 (2021-07-19) --------------------- +## 0.1.5 (2021-07-19) * Bugfixes -0.1.6 (2021-07-21) --------------------- +## 0.1.6 (2021-07-21) * Bugfixes * Added Pool for Kafka -0.1.7 (2021-07-27) --------------------- +## 0.1.7 (2021-07-27) * Simplify configuration file * Bugfixes -0.1.8 (2021-08-03) --------------------- +## 0.1.8 (2021-08-03) * Connection Pool improvement for async * Small inmprovements * Bugfixes -0.1.9 (2021-08-17) --------------------- +## 0.1.9 (2021-08-17) * Add `minos.common.Entity`. * Refactor `minos.common.AggregateDiff.fields_diff`: @@ -152,22 +118,19 @@ History * Add support for `typing.Generic` and `typing.TypeVar`. * Bugfixes -0.1.10 (2021-08-23) --------------------- +## 0.1.10 (2021-08-23) * Add `created_at` and `updated_at` to `Aggregate`. * Improve Fix `AggregateDiff` + `FieldDiffContainer` API. * Fix `Aggregate` bug that stored empty field differences instead of skipping them. * Fix bug from `Model` related with `getitem`, `setitem`, `getattr` and `setattr`. -0.1.11 (2021-08-25) --------------------- +## 0.1.11 (2021-08-25) * Fix bug related with `datetime` serialization in `Field`. * Fix bug related with the `AggregateDiff.__getattr__` implementation. -0.1.12 (2021-09-01) --------------------- +## 0.1.12 (2021-09-01) * Add generics to `MinosSagaManager` interface. * Remove `saga.items` from `MinosConfig`. @@ -176,8 +139,7 @@ History * Fix bug related with `TypeHintBuilder` and `Any`. * Fix bug related with `ModelType` comparisons. -0.1.13 (2021-09-16) --------------------- +## 0.1.13 (2021-09-16) * Add `discovery.client` into `MinosConfig` allowing to setup custom Discovery clients. * Add `minos.common.queries` module, containing `Condition` and `Ordering` classes. @@ -187,37 +149,32 @@ History * Remove file headers. * Stop using `NoReturn` everywhere. -0.1.14 (2021-09-27) --------------------- +## 0.1.14 (2021-09-27) * Add support for `timedelta`. * Fix `Optional[ModelRef[T]]` behaviour. * Remove `events` section from `MinosConfig`. * Fix troubles related with dependency injections. -0.1.15 (2021-10-04) --------------------- +## 0.1.15 (2021-10-04) * Fix bug from `PostgreSqlSnapshotReader` that returned already deleted aggregates when `Condition.TRUE` was passed. -0.1.16 (2021-10-07) --------------------- +## 0.1.16 (2021-10-07) * Improve support for `Model` inheritance inside container classes (`list`, `dict`, `EntitySet`, etc.). * Add support for `set[T]` type. * Fix bug related with complex types and `PostgreSqlSnapshotQueryBuilder`. * Fix bug related with empty `dict` and `minos.saga.SagaContext`. -0.1.17 (2021-10-08) --------------------- +## 0.1.17 (2021-10-08) * Add `IncrementalSet` as the base implementation for incremental sets. * Now `ValueObjectSet` and `EntitySet` inherit from `IncrementalSet`. * Refactor `ValueObjectSet` to be implemented on top of a `set` instead of a `dict`. * Fix bug related with `list`, `set` and `dict` in combination with `Any` and the `avro` schemas. -0.2.0 (2021-11-08) --------------------- +## 0.2.0 (2021-11-08) * Migrate all Aggregate-related stuff to the brand-new `minos.aggregate` package. * Move `Aggregate`, `Entity`, `ValueObject`, etc. model classes and related utility classes (`AggregateDiff`, `FieldDiff`, Action`, `ModelRef`, etc.). @@ -228,73 +185,61 @@ History * Add `PostgreSqlLock` and `PostgreSqlLockPool` * Replace the `MinosPool` instance creation strategy, from "create if possible or get or wait" to "get or create if possible or wait". -0.2.1 (2021-11-09) --------------------- +## 0.2.1 (2021-11-09) * Fix bug related with dependency injections over `minos.*` modules. -0.3.0 (2021-11-15) --------------------- +## 0.3.0 (2021-11-15) * Add `services` and `middleware` sections to `MinosConfig`. * Remove `Command`, `CommandReply`, `CommandStatus` and `Event` (moved to `minos.networks`). * Remove `MinosBroker` and `MinosHandler` (moved to `minos.networks`). * Remove `MinosSagaManager` (moved to `minos.saga`). -0.3.1 (2021-11-24) --------------------- +## 0.3.1 (2021-11-24) * Fix bug related with `enum.Enum` inherited classes that do not recover the original type after being serialized. * Fix bug related with`str` values auto-casting to an iterable of characters. -0.3.2 (2021-11-30) --------------------- +## 0.3.2 (2021-11-30) * Fix bug related with `EntrypointLauncher`'s dependency injection and unloaded `minos.*` modules. -0.3.3 (2022-01-10) --------------------- +## 0.3.3 (2022-01-10) * Big refactor of the `minos.common.model.serializers` module: * Add `encode_schema`, `decode_schema`, `encode_data` and `decode_data` callback-like functions to be able to modify the serialization/deserialization logic. * Add `SchemaEncoder`, `SchemaDecoder`, `DataEncoder` and `DataDecoder` abstract base classes. * Increase serialization/deserialization robustness. -0.3.4 (2022-01-11) --------------------- +## 0.3.4 (2022-01-11) * Add `batch_mode: bool` argument to manage if the `avro` serialization is performed for a single model or a batch of models. -0.4.0 (2022-01-27) ------------------- +## 0.4.0 (2022-01-27) * Add waiting time before destroying the `minos.common.MinosPool` acquired instances. -0.4.1 (2022-01-31) ------------------- +## 0.4.1 (2022-01-31) * Update `README.md`. -0.5.0 (2022-02-03) ------------------- +## 0.5.0 (2022-02-03) * Minor changes. -0.5.2 (2022-02-08) ------------------- +## 0.5.2 (2022-02-08) * Add `query_repository` section to `MinosConfig`. * Minor changes. -0.5.3 (2022-03-04) ------------------- +## 0.5.3 (2022-03-04) * Big performance improvement related with a caching layer over type hint comparisons at `TypeHintComparator`. * Improve attribute and item accessors of `Model`. * Fix bug related with casting from `dict` to `Model` instances on field setters. -0.6.0 (2022-03-28) ------------------- +## 0.6.0 (2022-03-28) * Add `Config` with support for config versioning. * Add `ConfigV1` as the class that supports the V1 config file. @@ -355,7 +300,24 @@ routers: * Update `minos.common.Config` usages according to the new provided API: * Most common issues come from calls like `config.query_repository._asdict()`, that must be transformed to `config.get_database_by_name("query")` -0.6.1 (2022-04-01) ------------------- - -* Fix bug that didn't show the correct exception traceback when microservice failures occurred. \ No newline at end of file +## 0.6.1 (2022-04-01) + +* Fix bug that didn't show the correct exception traceback when microservice failures occurred. + +## 0.7.0 (2022-05-11) + +* Add `DatabaseClient`, `DatabaseClientBuilder` as the base client to execute operation over a database and the builder class. +* Rename `PostgreSqlPool` as `DatabaseClientPool`. +* Add `DatabaseOperation`, `ComposedDatabaseOperation` and `DatabaseOperationFactory` as the classes to build operations to be executed over the database. +* Add `ConnectionException`, `DatabaseClientException`, `IntegrityException`, `ProgrammingException` as the base exceptions to be raised by the `DatabaseClient`. +* Rename `PostgreSqlLock` and `PostgreSqlLockPool` as `DatabaseLock` and `DatabaseLockPool`. +* Rename `PostgreSqlMinosDatabase` as `DatabaseMixin`. +* Add `LockDatabaseOperationFactory` as the base operation factory for locking operations. +* Add `ManagementDatabaseOperationFactory` as the base operation factory for management operations (creation, deletion, etc.). +* Add `TypeHintParser` to unify `ModelType`'s type hints. +* Add `PoolException` as the base exception for pools. +* Add `PoolFactory` as the class with the purpose to build and manage `Pool` instances. +* Remove `MinosStorage` and move `MinosStorageLmdb` to the `minos-database-lmdb` package. +* Unify documentation building pipeline across all `minos-python` packages. +* Fix documentation building warnings. +* Fix bug related with package building and additional files like `AUTHORS.md`, `HISTORY.md`, etc. \ No newline at end of file diff --git a/packages/core/minos-microservice-common/Makefile b/packages/core/minos-microservice-common/Makefile index acc861207..ef814b8bc 100644 --- a/packages/core/minos-microservice-common/Makefile +++ b/packages/core/minos-microservice-common/Makefile @@ -15,10 +15,6 @@ reformat: poetry run black --line-length 120 minos tests poetry run isort minos tests -docs: - rm -rf docs/api - poetry run $(MAKE) --directory=docs html - release: $(MAKE) dist poetry publish @@ -38,5 +34,4 @@ check: $(MAKE) reformat $(MAKE) lint $(MAKE) test - $(MAKE) docs $(MAKE) dist diff --git a/packages/core/minos-microservice-common/RUNTHETESTS.md b/packages/core/minos-microservice-common/RUNTHETESTS.md index 8b5e95b1f..386e2b0e7 100644 --- a/packages/core/minos-microservice-common/RUNTHETESTS.md +++ b/packages/core/minos-microservice-common/RUNTHETESTS.md @@ -1,5 +1,4 @@ -Run the tests -============== +# Run the tests In order to run the tests, please make sure you have the `Docker Engine `_ and `Docker Compose `_ installed. diff --git a/packages/core/minos-microservice-common/SETUP.md b/packages/core/minos-microservice-common/SETUP.md deleted file mode 100644 index 8203965c7..000000000 --- a/packages/core/minos-microservice-common/SETUP.md +++ /dev/null @@ -1,11 +0,0 @@ -Set up a development environment -================================= - -Since we use `poetry` as the default package manager, it must be installed. Please refer to -`https://python-poetry.org/docs/#installation`. - -Run `poetry install` to get the dependencies. - -Run `pre-commit install` to set the git checks before commiting. - -Make yourself sure you are able to run the tests. Refer to the appropriate section in this guide. diff --git a/packages/core/minos-microservice-common/docs/Makefile b/packages/core/minos-microservice-common/docs/Makefile deleted file mode 100644 index f0f022757..000000000 --- a/packages/core/minos-microservice-common/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -SPHINXPROJ = minos-microservice-common -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/packages/core/minos-microservice-common/docs/_static/style.css b/packages/core/minos-microservice-common/docs/_static/style.css deleted file mode 100644 index 8aa6c288f..000000000 --- a/packages/core/minos-microservice-common/docs/_static/style.css +++ /dev/null @@ -1,3 +0,0 @@ -.wy-nav-content { - max-width: 1200px !important; -} diff --git a/packages/core/minos-microservice-common/docs/_templates/layout.html b/packages/core/minos-microservice-common/docs/_templates/layout.html deleted file mode 100644 index b0a448060..000000000 --- a/packages/core/minos-microservice-common/docs/_templates/layout.html +++ /dev/null @@ -1,4 +0,0 @@ -{% extends "!layout.html" %} -{% block extrahead %} - -{% endblock %} \ No newline at end of file diff --git a/packages/core/minos-microservice-common/docs/authors.rst b/packages/core/minos-microservice-common/docs/authors.rst deleted file mode 100644 index cf16fc494..000000000 --- a/packages/core/minos-microservice-common/docs/authors.rst +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../AUTHORS.md diff --git a/packages/core/minos-microservice-common/docs/conf.py b/packages/core/minos-microservice-common/docs/conf.py deleted file mode 100755 index fc7935987..000000000 --- a/packages/core/minos-microservice-common/docs/conf.py +++ /dev/null @@ -1,198 +0,0 @@ -#!/usr/bin/env python -# -# minos documentation build configuration file, created by -# sphinx-quickstart on Fri Jun 9 13:47:02 2017. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -# If extensions (or modules to document with autodoc) are in another -# directory, add these directories to sys.path here. If the directory is -# relative to the documentation root, use os.path.abspath to make it -# absolute, like shown here. -# -import os -import sys - -sys.path.insert(0, os.path.abspath("..")) - -import sphinx_rtd_theme - -from minos import ( - common, -) - -# -- General configuration --------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. - - -extensions = [ - "sphinxcontrib.apidoc", - "sphinx.ext.autodoc", - "sphinx_autodoc_typehints", - "sphinx.ext.viewcode", - "sphinx_rtd_theme", - "m2r2", -] -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -source_suffix = [".rst", ".md"] - -# The master toctree document. -master_doc = "index" - -# General information about the project. -project = "Minos Microservice Common" -copyright = "2021, Clariteia" -author = "Minos Framework Devs" - -# The version info for the project you're documenting, acts as replacement -# for |version| and |release|, also used in various other places throughout -# the built documents. -# -# The short X.Y version. -version = common.__version__ -# The full version, including alpha/beta/rc tags. -release = common.__version__ - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = "sphinx" - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = False - - -# -- Options for HTML output ------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# - -html_theme = "sphinx_rtd_theme" - -# Theme options are theme-specific and customize the look and feel of a -# theme further. For a list of options available for each theme, see the -# documentation. -# - -# html_theme_options = { -# "codecov_button": True, -# "description": "Reactive microservices for an asynchronous world", -# "github_button": True, -# "github_user": "Clariteia", -# "github_repo": "minos_microservice_common", -# "github_type": "star", -# } - -html_sidebars = {"**": ["about.html", "navigation.html", "searchbox.html"]} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] - - -# -- Options for HTMLHelp output --------------------------------------- - -# Output file base name for HTML help builder. -htmlhelp_basename = "minosdoc" - - -# -- Options for LaTeX output ------------------------------------------ - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass -# [howto, manual, or own class]). -latex_documents = [ - (master_doc, "minos.tex", "Minos Microservice Common Documentation", "Minos Framework Devs", "manual"), -] - - -# -- Options for manual page output ------------------------------------ - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [(master_doc, "minos", "Minos Microservice Common Documentation", [author], 1)] - - -# -- Options for Texinfo output ---------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ( - master_doc, - "minos", - "Minos Microservice Common Documentation", - author, - "minos", - "One line description of project.", - "Miscellaneous", - ), -] - -# "apidoc" extension -apidoc_module_dir = "../minos" -apidoc_output_dir = "api" -apidoc_separate_modules = True -autodoc_default_options = { - "inherited-members": True, - "special-members": "__init__", - "undoc-members": True, -} - -apidoc_toc_file = False -apidoc_module_first = True -apidoc_extra_args = [ - "--force", - "--implicit-namespaces", -] -apidoc_excluded_paths = ["../minos/common/testing.py"] -# "autodoc typehints" extension - -set_type_checking_flag = True -typehints_fully_qualified = True diff --git a/packages/core/minos-microservice-common/docs/history.rst b/packages/core/minos-microservice-common/docs/history.rst deleted file mode 100644 index d26e5be83..000000000 --- a/packages/core/minos-microservice-common/docs/history.rst +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../HISTORY.md diff --git a/packages/core/minos-microservice-common/docs/index.rst b/packages/core/minos-microservice-common/docs/index.rst deleted file mode 100644 index 5cdfdb36d..000000000 --- a/packages/core/minos-microservice-common/docs/index.rst +++ /dev/null @@ -1,18 +0,0 @@ -Welcome to Minos Microservice Common's documentation! -======================================================= - -.. toctree:: - :maxdepth: 2 - - readme - runthetests - usage - api/minos - authors - history - -Indices and tables -==================== -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/packages/core/minos-microservice-common/docs/make.bat b/packages/core/minos-microservice-common/docs/make.bat deleted file mode 100644 index 3c73e0ecc..000000000 --- a/packages/core/minos-microservice-common/docs/make.bat +++ /dev/null @@ -1,36 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=python -msphinx -) -set SOURCEDIR=. -set BUILDDIR=_build -set SPHINXPROJ=minos_microservice_common - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The Sphinx module was not found. Make sure you have Sphinx installed, - echo.then set the SPHINXBUILD environment variable to point to the full - echo.path of the 'sphinx-build' executable. Alternatively you may add the - echo.Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% - -:end -popd diff --git a/packages/core/minos-microservice-common/docs/readme.rst b/packages/core/minos-microservice-common/docs/readme.rst deleted file mode 100644 index af09813a4..000000000 --- a/packages/core/minos-microservice-common/docs/readme.rst +++ /dev/null @@ -1,4 +0,0 @@ -Introduction -************** - -.. mdinclude:: ../README.md diff --git a/packages/core/minos-microservice-common/docs/runthetests.rst b/packages/core/minos-microservice-common/docs/runthetests.rst deleted file mode 100644 index 309db1b96..000000000 --- a/packages/core/minos-microservice-common/docs/runthetests.rst +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../RUNTHETESTS.md diff --git a/packages/core/minos-microservice-common/docs/usage.rst b/packages/core/minos-microservice-common/docs/usage.rst deleted file mode 100644 index 6a5226254..000000000 --- a/packages/core/minos-microservice-common/docs/usage.rst +++ /dev/null @@ -1,8 +0,0 @@ -===== -Usage -===== - -To use Minos Microservice Common in a project:: - - from minos import common - diff --git a/packages/core/minos-microservice-common/minos/common/__init__.py b/packages/core/minos-microservice-common/minos/common/__init__.py index 8cf33b005..c0dc48674 100644 --- a/packages/core/minos-microservice-common/minos/common/__init__.py +++ b/packages/core/minos-microservice-common/minos/common/__init__.py @@ -1,6 +1,7 @@ +"""The common core of the Minos Framework.""" __author__ = "Minos Framework Devs" __email__ = "hey@minos.run" -__version__ = "0.6.1" +__version__ = "0.7.0" from .builders import ( BuildableMixin, @@ -13,10 +14,21 @@ MinosConfig, ) from .database import ( - PostgreSqlLock, - PostgreSqlLockPool, - PostgreSqlMinosDatabase, - PostgreSqlPool, + ComposedDatabaseOperation, + ConnectionException, + DatabaseClient, + DatabaseClientBuilder, + DatabaseClientException, + DatabaseClientPool, + DatabaseLock, + DatabaseLockPool, + DatabaseMixin, + DatabaseOperation, + DatabaseOperationFactory, + IntegrityException, + LockDatabaseOperationFactory, + ManagementDatabaseOperationFactory, + ProgrammingException, ) from .datetime import ( NULL_DATETIME, @@ -92,6 +104,7 @@ SchemaEncoder, TypeHintBuilder, TypeHintComparator, + TypeHintParser, is_model_type, ) from .object import ( @@ -100,6 +113,8 @@ from .pools import ( MinosPool, Pool, + PoolException, + PoolFactory, ) from .ports import ( Port, @@ -118,10 +133,6 @@ MinosSetup, SetupMixin, ) -from .storage import ( - MinosStorage, - MinosStorageLmdb, -) from .uuid import ( NULL_UUID, UUID_REGEX, diff --git a/packages/core/minos-microservice-common/minos/common/config/abc.py b/packages/core/minos-microservice-common/minos/common/config/abc.py index 9c4714094..60e38c1d2 100644 --- a/packages/core/minos-microservice-common/minos/common/config/abc.py +++ b/packages/core/minos-microservice-common/minos/common/config/abc.py @@ -145,18 +145,21 @@ def get_default_database(self): :return: A ``dict`` containing the database's config values. """ - return self.get_database_by_name("default") + return self.get_database_by_name(None) - def get_database_by_name(self, name: str) -> dict[str, Any]: + def get_database_by_name(self, name: Optional[str]) -> dict[str, Any]: """Get the database value by name. :param name: The name of the database. If ``None`` is provided then the default database will be used. :return: A ``dict`` containing the database's config values. """ + if name is None: + name = "default" + databases = self.get_databases() if name not in databases: - name = "default" + raise MinosConfigException(f"{name!r} database is not configured") return databases[name] diff --git a/packages/core/minos-microservice-common/minos/common/config/v1.py b/packages/core/minos-microservice-common/minos/common/config/v1.py index fdac15c47..b7aabd9e6 100644 --- a/packages/core/minos-microservice-common/minos/common/config/v1.py +++ b/packages/core/minos-microservice-common/minos/common/config/v1.py @@ -121,6 +121,27 @@ def _get_saga(self) -> dict[str, Any]: return saga def _get_injections(self) -> list[type[InjectableMixin]]: + from ..pools import ( + Pool, + PoolFactory, + ) + + injections = self._get_raw_injections() + injections = [ + injection + for injection in injections + if not (issubclass(injection, Pool) or issubclass(injection, PoolFactory)) + ] + with suppress(MinosConfigException): + pool_factory = self._get_pools().get("factory") + if pool_factory is not None: + # noinspection PyTypeChecker + injections.insert(0, pool_factory) + + # noinspection PyTypeChecker + return injections + + def _get_raw_injections(self) -> list[type[InjectableMixin]]: try: injections = self.get_by_key("service.injections") if isinstance(injections, dict): @@ -217,7 +238,31 @@ def _get_services(self) -> list[type]: return services def _get_pools(self) -> dict[str, type]: - return dict() + from ..pools import ( + Pool, + PoolFactory, + ) + + factory = next( + (injection for injection in self._get_raw_injections() if issubclass(injection, PoolFactory)), PoolFactory + ) + injections = [injection for injection in self._get_raw_injections() if issubclass(injection, Pool)] + if not len(injections): + return dict() + + types = dict() + for injection in injections: + if "lock" in injection.__name__.lower(): + types["lock"] = injection + elif "database" in injection.__name__.lower(): + types["database"] = injection + elif "broker" in injection.__name__.lower(): + types["broker"] = injection + + return { + "factory": factory, + "types": types, + } def _get_routers(self) -> list[type]: try: @@ -266,7 +311,7 @@ def _get_database_broker(self): return self._get_database_by_name("broker.queue") def _get_database_saga(self) -> dict[str, Any]: - raw = self.get_by_key("saga.storage") + raw = self._get_database_by_name("saga.storage") return raw def _get_database_event(self) -> dict[str, Any]: @@ -282,6 +327,8 @@ def _get_database_by_name(self, prefix: str): data = self.get_by_key(prefix) data.pop("records", None) data.pop("retry", None) + if "client" in data: + data["client"] = import_module(data["client"]) return data def _get_discovery(self) -> dict[str, Any]: diff --git a/packages/core/minos-microservice-common/minos/common/config/v2.py b/packages/core/minos-microservice-common/minos/common/config/v2.py index d9a02035b..345829d74 100644 --- a/packages/core/minos-microservice-common/minos/common/config/v2.py +++ b/packages/core/minos-microservice-common/minos/common/config/v2.py @@ -51,7 +51,7 @@ def _get_injections(self) -> list[Union[InjectableMixin, type[InjectableMixin]]] partial_ans = list() with suppress(MinosConfigException): - partial_ans.extend(self._get_pools().values()) + partial_ans.append(self._get_pools().get("factory")) with suppress(MinosConfigException): partial_ans.append(self._get_interfaces().get("http").get("connector")) @@ -99,63 +99,73 @@ def _get_injections(self) -> list[Union[InjectableMixin, type[InjectableMixin]]] def _get_databases(self) -> dict[str, dict[str, Any]]: data = deepcopy(self.get_by_key("databases")) + for database in data.values(): + if database.get("client") is not None: + database["client"] = import_module(database["client"]) return data def _get_interfaces(self) -> dict[str, dict[str, Any]]: data = deepcopy(self.get_by_key("interfaces")) - if "http" in data: + if data.get("http") is not None: data["http"] = self._parse_http_interface(data["http"]) - if "broker" in data: + if data.get("broker") is not None: data["broker"] = self._parse_broker_interface(data["broker"]) - if "periodic" in data: + if data.get("periodic") is not None: data["periodic"] = self._parse_periodic_interface(data["periodic"]) return data @staticmethod def _parse_http_interface(data: dict[str, Any]) -> dict[str, Any]: - if "port" in data: + if data.get("port") is not None: data["port"] = import_module(data["port"]) - if "connector" in data: + if data.get("connector") is not None: data["connector"]["client"] = import_module(data["connector"]["client"]) return data @staticmethod def _parse_broker_interface(data: dict[str, Any]) -> dict[str, Any]: - if "port" in data: + if data.get("port") is not None: data["port"] = import_module(data["port"]) - if "publisher" in data: + if data.get("publisher") is not None: data["publisher"]["client"] = import_module(data["publisher"]["client"]) - if "queue" in data["publisher"]: + if data["publisher"].get("queue") is not None: data["publisher"]["queue"] = import_module(data["publisher"]["queue"]) - if "subscriber" in data: + if data.get("subscriber") is not None: data["subscriber"]["client"] = import_module(data["subscriber"]["client"]) - if "queue" in data["subscriber"]: + if data["subscriber"].get("queue") is not None: data["subscriber"]["queue"] = import_module(data["subscriber"]["queue"]) - if "validator" in data["subscriber"]: + if data["subscriber"].get("validator") is not None: data["subscriber"]["validator"] = import_module(data["subscriber"]["validator"]) return data @staticmethod def _parse_periodic_interface(data: dict[str, Any]) -> dict[str, Any]: - if "port" in data: + if data.get("port") is not None: data["port"] = import_module(data["port"]) return data def _get_pools(self) -> dict[str, type]: try: - data = self.get_by_key("pools") + types = self.get_by_key("pools") except MinosConfigException: - data = dict() + return dict() - data = {name: import_module(classname) for name, classname in data.items()} + types = {name: import_module(classname) for name, classname in types.items()} - return data + from ..pools import ( + PoolFactory, + ) + + return { + "factory": PoolFactory, + "types": types, + } def _get_routers(self) -> list[type]: try: diff --git a/packages/core/minos-microservice-common/minos/common/database/__init__.py b/packages/core/minos-microservice-common/minos/common/database/__init__.py index a68d00810..30f604571 100644 --- a/packages/core/minos-microservice-common/minos/common/database/__init__.py +++ b/packages/core/minos-microservice-common/minos/common/database/__init__.py @@ -1,10 +1,27 @@ -from .abc import ( - PostgreSqlMinosDatabase, +from .clients import ( + ConnectionException, + DatabaseClient, + DatabaseClientBuilder, + DatabaseClientException, + IntegrityException, + ProgrammingException, ) from .locks import ( - PostgreSqlLock, + DatabaseLock, + LockDatabaseOperationFactory, +) +from .managements import ( + ManagementDatabaseOperationFactory, +) +from .mixins import ( + DatabaseMixin, +) +from .operations import ( + ComposedDatabaseOperation, + DatabaseOperation, + DatabaseOperationFactory, ) from .pools import ( - PostgreSqlLockPool, - PostgreSqlPool, + DatabaseClientPool, + DatabaseLockPool, ) diff --git a/packages/core/minos-microservice-common/minos/common/database/abc.py b/packages/core/minos-microservice-common/minos/common/database/abc.py deleted file mode 100644 index 942c863ac..000000000 --- a/packages/core/minos-microservice-common/minos/common/database/abc.py +++ /dev/null @@ -1,232 +0,0 @@ -from collections.abc import ( - Hashable, -) -from typing import ( - Any, - AsyncContextManager, - AsyncIterator, - Optional, -) - -from aiomisc.pool import ( - ContextManager, -) -from aiopg import ( - Cursor, -) - -from ..injections import ( - Inject, -) -from ..setup import ( - SetupMixin, -) -from .locks import ( - PostgreSqlLock, -) -from .pools import ( - PostgreSqlPool, -) - - -class PostgreSqlMinosDatabase(SetupMixin): - """PostgreSql Minos Database base class.""" - - def __init__( - self, - database: str, - host: Optional[str] = None, - port: Optional[int] = None, - user: Optional[str] = None, - password: Optional[str] = None, - *args, - **kwargs, - ): - super().__init__(*args, **kwargs) - self._database = database - self._host = host - self._port = port - self._user = user - self._password = password - - self._pool = None - self._owned_pool = False - - @property - def database(self) -> str: - """Get the database's database. - - :return: A ``str`` value. - """ - return self.pool.database - - @property - def host(self) -> str: - """Get the database's host. - - :return: A ``str`` value. - """ - return self.pool.host - - @property - def port(self) -> int: - """Get the database's port. - - :return: An ``int`` value. - """ - return self.pool.port - - @property - def user(self) -> str: - """Get the database's user. - - :return: A ``str`` value. - """ - return self.pool.user - - @property - def password(self) -> str: - """Get the database's password. - - :return: A ``str`` value. - """ - return self.pool.password - - async def _destroy(self) -> None: - if self._owned_pool: - await self._pool.destroy() - self._pool = None - self._owned_pool = False - - async def submit_query_and_fetchone(self, *args, **kwargs) -> tuple: - """Submit a SQL query and gets the first response. - - :param args: Additional positional arguments. - :param kwargs: Additional named arguments. - :return: This method does not return anything. - """ - return await self.submit_query_and_iter(*args, **kwargs).__anext__() - - # noinspection PyUnusedLocal - async def submit_query_and_iter( - self, - operation: Any, - parameters: Any = None, - *, - timeout: Optional[float] = None, - lock: Optional[int] = None, - streaming_mode: bool = False, - **kwargs, - ) -> AsyncIterator[tuple]: - """Submit a SQL query and return an asynchronous iterator. - - :param operation: Query to be executed. - :param parameters: Parameters to be projected into the query. - :param timeout: An optional timeout. - :param lock: Optional key to perform the query with locking. If not set, the query is performed without any - lock. - :param streaming_mode: If ``True`` the data fetching is performed in streaming mode, that is iterating over the - cursor and yielding once a time (requires an opening connection to do that). Otherwise, all the data is - fetched and keep in memory before yielding it. - :param kwargs: Additional named arguments. - :return: This method does not return anything. - """ - if lock is None: - context_manager = self.cursor() - else: - context_manager = self.locked_cursor(lock) - - async with context_manager as cursor: - await cursor.execute(operation=operation, parameters=parameters, timeout=timeout) - - if streaming_mode: - async for row in cursor: - yield row - return - - rows = await cursor.fetchall() - - for row in rows: - yield row - - # noinspection PyUnusedLocal - async def submit_query( - self, operation: Any, parameters: Any = None, *, timeout: Optional[float] = None, lock: Any = None, **kwargs - ) -> None: - """Submit a SQL query. - - :param operation: Query to be executed. - :param parameters: Parameters to be projected into the query. - :param timeout: An optional timeout. - :param lock: Optional key to perform the query with locking. If not set, the query is performed without any - lock. - :param kwargs: Additional named arguments. - :return: This method does not return anything. - """ - if lock is None: - context_manager = self.cursor() - else: - context_manager = self.locked_cursor(lock) - - async with context_manager as cursor: - await cursor.execute(operation=operation, parameters=parameters, timeout=timeout) - - def locked_cursor(self, key: Hashable, *args, **kwargs) -> AsyncContextManager[Cursor]: - """Get a new locked cursor. - - :param key: The key to be used for locking. - :param args: Additional positional arguments. - :param kwargs: Additional named arguments. - :return: A Cursor wrapped into an asynchronous context manager. - """ - lock = PostgreSqlLock(self.pool.acquire(), key, *args, **kwargs) - - async def _fn_enter(): - await lock.__aenter__() - return lock.cursor - - async def _fn_exit(_): - await lock.__aexit__(None, None, None) - - return ContextManager(_fn_enter, _fn_exit) - - def cursor(self, *args, **kwargs) -> AsyncContextManager[Cursor]: - """Get a new cursor. - - :param args: Additional positional arguments. - :param kwargs: Additional named arguments. - :return: A Cursor wrapped into an asynchronous context manager. - """ - acquired = self.pool.acquire() - - async def _fn_enter(): - connection = await acquired.__aenter__() - cursor = await connection.cursor(*args, **kwargs).__aenter__() - return cursor - - async def _fn_exit(cursor: Cursor): - if not cursor.closed: - cursor.close() - await acquired.__aexit__(None, None, None) - - return ContextManager(_fn_enter, _fn_exit) - - @property - def pool(self) -> PostgreSqlPool: - """Get the connections pool. - - :return: A ``Pool`` object. - """ - if self._pool is None: - self._pool, self._owned_pool = self._build_pool() - return self._pool - - @Inject() - def _build_pool(self, pool: PostgreSqlPool = None) -> tuple[PostgreSqlPool, bool]: - if pool is not None: - return pool, False - - pool = PostgreSqlPool( - host=self._host, port=self._port, database=self._database, user=self._user, password=self._password - ) - return pool, True diff --git a/packages/core/minos-microservice-common/minos/common/database/clients/__init__.py b/packages/core/minos-microservice-common/minos/common/database/clients/__init__.py new file mode 100644 index 000000000..928f11271 --- /dev/null +++ b/packages/core/minos-microservice-common/minos/common/database/clients/__init__.py @@ -0,0 +1,10 @@ +from .abc import ( + DatabaseClient, + DatabaseClientBuilder, +) +from .exceptions import ( + ConnectionException, + DatabaseClientException, + IntegrityException, + ProgrammingException, +) diff --git a/packages/core/minos-microservice-common/minos/common/database/clients/abc.py b/packages/core/minos-microservice-common/minos/common/database/clients/abc.py new file mode 100644 index 000000000..dfa38e273 --- /dev/null +++ b/packages/core/minos-microservice-common/minos/common/database/clients/abc.py @@ -0,0 +1,216 @@ +from __future__ import ( + annotations, +) + +import logging +from abc import ( + ABC, + abstractmethod, +) +from asyncio import ( + wait_for, +) +from collections.abc import ( + AsyncIterator, + Hashable, +) +from typing import ( + TYPE_CHECKING, + Any, + Optional, +) + +from ...builders import ( + BuildableMixin, + Builder, +) +from ...config import ( + Config, +) +from ..operations import ( + ComposedDatabaseOperation, + DatabaseOperation, + DatabaseOperationFactory, +) +from .exceptions import ( + ProgrammingException, +) + +if TYPE_CHECKING: + from ..locks import ( + DatabaseLock, + ) + +logger = logging.getLogger(__name__) + + +class DatabaseClient(ABC, BuildableMixin): + """Database Client base class.""" + + _factories: dict[type[DatabaseOperationFactory], type[DatabaseOperationFactory]] + _lock: Optional[DatabaseLock] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + self._lock = None + + @classmethod + def _from_config(cls, config: Config, name: Optional[str] = None, **kwargs) -> DatabaseClient: + return super()._from_config(config, **config.get_database_by_name(name), **kwargs) + + async def is_valid(self, **kwargs) -> bool: + """Check if the instance is valid. + + :return: ``True`` if it is valid or ``False`` otherwise. + """ + return await self._is_valid(**kwargs) + + async def _is_valid(self, **kwargs) -> bool: + return True + + async def _destroy(self) -> None: + await self.reset() + await super()._destroy() + + async def reset(self, **kwargs) -> None: + """Reset the current instance status. + + :param kwargs: Additional named parameters. + :return: This method does not return anything. + """ + await self._destroy_lock() + return await self._reset(**kwargs) + + @abstractmethod + async def _reset(self, **kwargs) -> None: + raise NotImplementedError + + async def execute(self, operation: DatabaseOperation) -> None: + """Execute an operation. + + :param operation: The operation to be executed. + :return: This method does not return anything. + """ + if not isinstance(operation, DatabaseOperation): + raise ValueError(f"The operation must be a {DatabaseOperation!r} instance. Obtained: {operation!r}") + + if operation.lock is not None: + await self._create_lock(operation.lock) + + if isinstance(operation, ComposedDatabaseOperation): + await wait_for(self._execute_composed(operation), operation.timeout) + else: + await wait_for(self._execute(operation), operation.timeout) + + async def _execute_composed(self, operation: ComposedDatabaseOperation) -> None: + for op in operation.operations: + await self.execute(op) + + @abstractmethod + async def _execute(self, operation: DatabaseOperation) -> None: + raise NotImplementedError + + async def _create_lock(self, lock: Hashable, *args, **kwargs): + if self._lock is not None and self._lock.key == lock: + return + await self._destroy_lock() + + from ..locks import ( + DatabaseLock, + ) + + self._lock = DatabaseLock(self, lock, *args, **kwargs) + await self._lock.acquire() + + async def _destroy_lock(self): + if self._lock is not None: + logger.debug(f"Destroying {self._lock!r}...") + await self._lock.release() + self._lock = None + + @property + def lock(self) -> Optional[DatabaseLock]: + """Get the lock. + + :return: A ``DatabaseLock`` instance. + """ + return self._lock + + async def fetch_one(self) -> Any: + """Fetch one value. + + :return: This method does not return anything. + """ + try: + return await self.fetch_all().__anext__() + except StopAsyncIteration: + raise ProgrammingException("There are not any value to be fetched.") + + def fetch_all(self) -> AsyncIterator[Any]: + """Fetch all values with an asynchronous iterator. + + :return: This method does not return anything. + """ + return self._fetch_all() + + @abstractmethod + def _fetch_all(self, *args, **kwargs) -> AsyncIterator[Any]: + raise NotImplementedError + + @classmethod + def set_factory(cls, base: type[DatabaseOperationFactory], impl: type[DatabaseOperationFactory]) -> None: + """Register an operation factory implementation for an operation factory interface. + + :param base: The operation factory interface. + :param impl: The operation factory implementation. + :return: This method does not return anything. + """ + if not issubclass(base, DatabaseOperationFactory): + raise ValueError(f"{base!r} must be a subclass of {DatabaseOperationFactory!r}") + + if not issubclass(impl, base): + raise ValueError(f"{impl!r} must be a subclass of {base!r}") + + if not hasattr(cls, "_factories"): + cls._factories = dict() + + cls._factories[base] = impl + + @classmethod + def get_factory(cls, base: type[DatabaseOperationFactory]) -> DatabaseOperationFactory: + """Get an operation factory implementation for an operation factory interface. + + :param base: The operation factory interface. + :return: The operation factory implementation. + """ + if not hasattr(cls, "_factories") or base not in cls._factories: + raise ValueError(f"{cls!r} does not contain any registered factory implementation for {base!r}") + + return cls._factories[base]() + + +class DatabaseClientBuilder(Builder[DatabaseClient]): + """Database Client Builder class.""" + + def with_name(self, name: str) -> DatabaseClientBuilder: + """Set name. + + :param name: The name to be added. + :return: This method return the builder instance. + """ + self.kwargs["name"] = name + return self + + def with_config(self, config: Config) -> DatabaseClientBuilder: + """Set config. + + :param config: The config to be set. + :return: This method return the builder instance. + """ + database_config = config.get_database_by_name(self.kwargs.get("name")) + self.kwargs |= database_config + return self + + +DatabaseClient.set_builder(DatabaseClientBuilder) diff --git a/packages/core/minos-microservice-common/minos/common/database/clients/exceptions.py b/packages/core/minos-microservice-common/minos/common/database/clients/exceptions.py new file mode 100644 index 000000000..f135f74bf --- /dev/null +++ b/packages/core/minos-microservice-common/minos/common/database/clients/exceptions.py @@ -0,0 +1,19 @@ +from ...exceptions import ( + MinosException, +) + + +class DatabaseClientException(MinosException): + """Base exception for database client.""" + + +class ConnectionException(DatabaseClientException): + """Exception to be raised when database client is not able to connect to the database.""" + + +class IntegrityException(DatabaseClientException): + """Exception to be raised when an integrity check is not satisfied.""" + + +class ProgrammingException(DatabaseClientException): + """Exception to be raised when an integrity check is not satisfied.""" diff --git a/packages/core/minos-microservice-common/minos/common/database/locks.py b/packages/core/minos-microservice-common/minos/common/database/locks.py deleted file mode 100644 index d97f64809..000000000 --- a/packages/core/minos-microservice-common/minos/common/database/locks.py +++ /dev/null @@ -1,46 +0,0 @@ -from collections.abc import ( - Hashable, -) -from typing import ( - AsyncContextManager, - Optional, -) - -from aiopg import ( - Connection, - Cursor, -) - -from ..locks import ( - Lock, -) - - -class PostgreSqlLock(Lock): - """ "PostgreSql Lock class.""" - - cursor: Optional[Cursor] - - def __init__(self, wrapped_connection: AsyncContextManager[Connection], key: Hashable, *args, **kwargs): - super().__init__(key, *args, **kwargs) - - self.wrapped_connection = wrapped_connection - self.cursor = None - - self._args = args - self._kwargs = kwargs - - async def __aenter__(self): - connection = await self.wrapped_connection.__aenter__() - cursor = await connection.cursor(*self._args, **self._kwargs).__aenter__() - - self.cursor = cursor - await self.cursor.execute("select pg_advisory_lock(%(hashed_key)s)", {"hashed_key": self.hashed_key}) - return self - - async def __aexit__(self, exc_type, exc_val, exc_tb): - await self.cursor.execute("select pg_advisory_unlock(%(hashed_key)s)", {"hashed_key": self.hashed_key}) - if not self.cursor.closed: - self.cursor.close() - self.cursor = None - await self.wrapped_connection.__aexit__(exc_type, exc_val, exc_tb) diff --git a/packages/core/minos-microservice-common/minos/common/database/locks/__init__.py b/packages/core/minos-microservice-common/minos/common/database/locks/__init__.py new file mode 100644 index 000000000..ddf3ddc07 --- /dev/null +++ b/packages/core/minos-microservice-common/minos/common/database/locks/__init__.py @@ -0,0 +1,6 @@ +from .factories import ( + LockDatabaseOperationFactory, +) +from .impl import ( + DatabaseLock, +) diff --git a/packages/core/minos-microservice-common/minos/common/database/locks/factories.py b/packages/core/minos-microservice-common/minos/common/database/locks/factories.py new file mode 100644 index 000000000..b24f1a8fa --- /dev/null +++ b/packages/core/minos-microservice-common/minos/common/database/locks/factories.py @@ -0,0 +1,29 @@ +from abc import ( + ABC, + abstractmethod, +) + +from ..operations import ( + DatabaseOperation, + DatabaseOperationFactory, +) + + +class LockDatabaseOperationFactory(DatabaseOperationFactory, ABC): + """Lock Database Operation Factory class.""" + + @abstractmethod + def build_acquire(self, hashed_key: int) -> DatabaseOperation: + """Build the database operation to acquire the lock. + + :param hashed_key: The hashed key that identifies the lock. + :return: A ``DatabaseOperation`` instance. + """ + + @abstractmethod + def build_release(self, hashed_key: int) -> DatabaseOperation: + """Build the database operation to release the lock. + + :param hashed_key: The hashed key that identifies the lock. + :return: A ``DatabaseOperation`` instance. + """ diff --git a/packages/core/minos-microservice-common/minos/common/database/locks/impl.py b/packages/core/minos-microservice-common/minos/common/database/locks/impl.py new file mode 100644 index 000000000..3fb1a434b --- /dev/null +++ b/packages/core/minos-microservice-common/minos/common/database/locks/impl.py @@ -0,0 +1,55 @@ +from __future__ import ( + annotations, +) + +from collections.abc import ( + Hashable, +) +from typing import ( + Optional, +) + +from ...locks import ( + Lock, +) +from ..clients import ( + DatabaseClient, +) +from .factories import ( + LockDatabaseOperationFactory, +) + + +class DatabaseLock(Lock): + """Database Lock class.""" + + def __init__( + self, + client: DatabaseClient, + key: Hashable, + *args, + operation_factory: Optional[LockDatabaseOperationFactory] = None, + **kwargs, + ): + super().__init__(key, *args, **kwargs) + if operation_factory is None: + operation_factory = client.get_factory(LockDatabaseOperationFactory) + + self.client = client + self.operation_factory = operation_factory + + async def acquire(self) -> None: + """Acquire the lock. + + :return: This method does not return anything. + """ + operation = self.operation_factory.build_acquire(self.hashed_key) + await self.client.execute(operation) + + async def release(self) -> None: + """Release the lock. + + :return: This method does not return anything. + """ + operation = self.operation_factory.build_release(self.hashed_key) + await self.client.execute(operation) diff --git a/packages/core/minos-microservice-common/minos/common/database/managements.py b/packages/core/minos-microservice-common/minos/common/database/managements.py new file mode 100644 index 000000000..729036d44 --- /dev/null +++ b/packages/core/minos-microservice-common/minos/common/database/managements.py @@ -0,0 +1,29 @@ +from abc import ( + ABC, + abstractmethod, +) + +from .operations import ( + DatabaseOperation, + DatabaseOperationFactory, +) + + +class ManagementDatabaseOperationFactory(DatabaseOperationFactory, ABC): + """Management Database Operation Factory base class.""" + + @abstractmethod + def build_create(self, database: str) -> DatabaseOperation: + """Build the database operation to create a database. + + :param database: The new database's name. + :return: A ``DatabaseOperation``. + """ + + @abstractmethod + def build_delete(self, database: str) -> DatabaseOperation: + """Build the database operation to create a database. + + :param database: The name of the database to be deleted. + :return: A ``DatabaseOperation``. + """ diff --git a/packages/core/minos-microservice-common/minos/common/database/mixins.py b/packages/core/minos-microservice-common/minos/common/database/mixins.py new file mode 100644 index 000000000..3042a2650 --- /dev/null +++ b/packages/core/minos-microservice-common/minos/common/database/mixins.py @@ -0,0 +1,168 @@ +from collections.abc import ( + AsyncIterator, +) +from contextlib import ( + suppress, +) +from typing import ( + Any, + Generic, + Optional, + TypeVar, + get_args, + get_origin, +) + +from ..exceptions import ( + NotProvidedException, +) +from ..injections import ( + Inject, +) +from ..pools import ( + PoolException, + PoolFactory, +) +from ..setup import ( + SetupMixin, +) +from .operations import ( + DatabaseOperation, + DatabaseOperationFactory, +) +from .pools import ( + DatabaseClient, + DatabaseClientPool, +) + +GenericDatabaseOperationFactory = TypeVar("GenericDatabaseOperationFactory", bound=DatabaseOperationFactory) + + +class DatabaseMixin(SetupMixin, Generic[GenericDatabaseOperationFactory]): + """Database Mixin class.""" + + @Inject() + def __init__( + self, + database_pool: Optional[DatabaseClientPool] = None, + pool_factory: Optional[PoolFactory] = None, + database_key: Optional[tuple[str]] = None, + operation_factory: Optional[GenericDatabaseOperationFactory] = None, + operation_factory_cls: Optional[type[GenericDatabaseOperationFactory]] = None, + *args, + **kwargs, + ): + super().__init__(*args, **kwargs, pool_factory=pool_factory) + + if database_pool is None and pool_factory is not None: + database_pool = self._get_pool_from_factory(pool_factory, database_key) + + if not isinstance(database_pool, DatabaseClientPool): + raise NotProvidedException(f"A {DatabaseClientPool!r} instance is required. Obtained: {database_pool}") + + self._pool = database_pool + + if operation_factory is None: + if operation_factory_cls is None: + operation_factory_cls = self._get_generic_operation_factory() + if operation_factory_cls is not None: + operation_factory = self.database_client_cls.get_factory(operation_factory_cls) + + self._operation_factory = operation_factory + + @staticmethod + def _get_pool_from_factory(pool_factory: PoolFactory, database_key: Optional[tuple[str]]): + if database_key is None: + database_key = tuple() + + for identifier in database_key: + with suppress(PoolException): + return pool_factory.get_pool(type_="database", identifier=identifier) + + return pool_factory.get_pool(type_="database") + + @property + def database_operation_factory(self) -> Optional[GenericDatabaseOperationFactory]: + """Get the operation factory if any. + + :return: A ``OperationFactory`` if it has been set or ``None`` otherwise. + """ + return self._operation_factory + + def _get_generic_operation_factory(self) -> Optional[type[GenericDatabaseOperationFactory]]: + operation_factory_cls = None + # noinspection PyUnresolvedReferences + for base in self.__orig_bases__: + origin = get_origin(base) + if origin is None or not issubclass(origin, DatabaseMixin): + continue + args = get_args(base) + operation_factory_cls = args[0] + if not isinstance(operation_factory_cls, type) or not issubclass( + operation_factory_cls, DatabaseOperationFactory + ): + raise TypeError(f"{type(self)!r} must contain a {DatabaseOperationFactory!r} as generic value.") + return operation_factory_cls + + async def execute_on_database_and_fetch_one(self, operation: DatabaseOperation) -> Any: + """Submit an Operation and get the first response. + + :param operation: The operation to be executed. + :return: This method does not return anything. + """ + async with self.database_pool.acquire() as client: + await client.execute(operation) + return await client.fetch_one() + + # noinspection PyUnusedLocal + async def execute_on_database_and_fetch_all( + self, operation: DatabaseOperation, streaming_mode: Optional[bool] = None + ) -> AsyncIterator[tuple]: + """Submit an Operation and return an asynchronous iterator. + + :param operation: The operation to be executed. + :param streaming_mode: If ``True`` return the values in streaming directly from the database (keep an open + database connection), otherwise preloads the full set of values on memory and then retrieves them. + :return: This method does not return anything. + """ + if streaming_mode is None: + streaming_mode = False + + async with self.database_pool.acquire() as client: + await client.execute(operation) + async_iterable = client.fetch_all() + if streaming_mode: + async for value in async_iterable: + yield value + return + + iterable = [value async for value in async_iterable] + + for value in iterable: + yield value + + # noinspection PyUnusedLocal + async def execute_on_database(self, operation: DatabaseOperation) -> None: + """Submit an Operation. + + :param operation: The operation to be executed. + :return: This method does not return anything. + """ + async with self.database_pool.acquire() as client: + return await client.execute(operation) + + @property + def database_client_cls(self) -> type[DatabaseClient]: + """Get the client's class. + + :return: A ``type`` instance that is subclass of ``DatabaseClient``. + """ + return self.database_pool.client_cls + + @property + def database_pool(self) -> DatabaseClientPool: + """Get the database pool. + + :return: A ``DatabaseClientPool`` object. + """ + return self._pool diff --git a/packages/core/minos-microservice-common/minos/common/database/operations.py b/packages/core/minos-microservice-common/minos/common/database/operations.py new file mode 100644 index 000000000..72b69d69e --- /dev/null +++ b/packages/core/minos-microservice-common/minos/common/database/operations.py @@ -0,0 +1,34 @@ +from __future__ import ( + annotations, +) + +from abc import ( + ABC, +) +from collections.abc import ( + Hashable, + Iterable, +) +from typing import ( + Optional, +) + + +class DatabaseOperation(ABC): + """Database Operation base class.""" + + def __init__(self, *args, lock: Optional[Hashable] = None, timeout: Optional[float] = None, **kwargs): + self.lock = lock + self.timeout = timeout + + +class ComposedDatabaseOperation(DatabaseOperation): + """Composed Database Operation class.""" + + def __init__(self, operations: Iterable[DatabaseOperation], *args, **kwargs): + super().__init__(*args, **kwargs) + self.operations = tuple(operations) + + +class DatabaseOperationFactory(ABC): + """Database Operation Factory base class.""" diff --git a/packages/core/minos-microservice-common/minos/common/database/pools.py b/packages/core/minos-microservice-common/minos/common/database/pools.py index 7dfcc5138..70b2ff54a 100644 --- a/packages/core/minos-microservice-common/minos/common/database/pools.py +++ b/packages/core/minos-microservice-common/minos/common/database/pools.py @@ -9,19 +9,12 @@ Optional, ) -import aiopg from aiomisc.pool import ( ContextManager, ) -from aiopg import ( - Connection, -) -from psycopg2 import ( - OperationalError, -) -from ..injections import ( - Injectable, +from ..config import ( + Config, ) from ..locks import ( LockPool, @@ -29,86 +22,101 @@ from ..pools import ( Pool, ) +from .clients import ( + ConnectionException, + DatabaseClient, + DatabaseClientBuilder, +) from .locks import ( - PostgreSqlLock, + DatabaseLock, ) logger = logging.getLogger(__name__) -@Injectable("postgresql_pool") -class PostgreSqlPool(Pool[ContextManager]): - """Postgres Pool class.""" - - def __init__( - self, - database: str, - host: Optional[str] = None, - port: Optional[int] = None, - user: Optional[str] = None, - password: Optional[str] = None, - *args, - **kwargs, - ): +class DatabaseClientPool(Pool[DatabaseClient]): + """Database Client Pool class.""" + + def __init__(self, client_builder: DatabaseClientBuilder, *args, **kwargs): super().__init__(*args, **kwargs) - if host is None: - host = "localhost" - if port is None: - port = 5432 - if user is None: - user = "postgres" - if password is None: - password = "" - - self.database = database - self.host = host - self.port = port - self.user = user - self.password = password + self._client_builder = client_builder @classmethod - def _from_config(cls, *args, config, **kwargs): - return cls(*args, **config.get_default_database(), **kwargs) + def _from_config(cls, config: Config, identifier: Optional[str] = None, **kwargs): + base_builder = config.get_database_by_name(identifier).get("client") + if base_builder is None: + raise ValueError(f"{base_builder!r} is not a {DatabaseClientBuilder!r} instance.") + elif issubclass(base_builder, DatabaseClient): + base_builder = base_builder.get_builder() + elif issubclass(base_builder, DatabaseClientBuilder): + base_builder = base_builder() + + client_builder = base_builder.with_name(identifier).with_config(config) + + return cls(client_builder=client_builder, **kwargs) + + async def _create_instance(self) -> Optional[DatabaseClient]: + instance = self._client_builder.build() - async def _create_instance(self) -> Optional[Connection]: try: - connection = await aiopg.connect( - host=self.host, port=self.port, dbname=self.database, user=self.user, password=self.password - ) - except OperationalError as exc: - logger.warning(f"There was an {exc!r} while trying to get a database connection.") - await sleep(1) + await instance.setup() + except ConnectionException: + await sleep(0.1) return None - logger.info(f"Created {self.database!r} database connection identified by {id(connection)}!") - return connection + logger.info(f"Created {instance!r}!") + return instance - async def _destroy_instance(self, instance: Connection): - if not instance.closed: - await instance.close() - logger.info(f"Destroyed {self.database!r} database connection identified by {id(instance)}!") + async def _destroy_instance(self, instance: DatabaseClient): + if instance is None: + return + logger.info(f"Destroyed {instance!r}!") + await instance.destroy() - async def _check_instance(self, instance: Optional[Connection]) -> bool: + async def _check_instance(self, instance: Optional[DatabaseClient]) -> bool: if instance is None: return False + return await instance.is_valid() - try: - # This operation connects to the database and raises an exception if something goes wrong. - instance.isolation_level - except OperationalError: - return False + async def _release_instance(self, instance: DatabaseClient) -> None: + await instance.reset() + + @property + def client_cls(self) -> type[DatabaseClient]: + """Get the instance's class. - return not instance.closed + :return: A ``type`` instance that is subclass of ``DatabaseClient``. + """ + return self.client_builder.instance_cls + @property + def client_builder(self) -> DatabaseClientBuilder: + """Get the client builder class. + + :return: A ``DatabaseClientBuilder`` instance. + """ + return self._client_builder -class PostgreSqlLockPool(LockPool, PostgreSqlPool): - """Postgres Locking Pool class.""" - def acquire(self, key: Hashable, *args, **kwargs) -> PostgreSqlLock: +class DatabaseLockPool(LockPool, DatabaseClientPool): + """Database Lock Pool class.""" + + def acquire(self, key: Hashable, *args, **kwargs) -> DatabaseLock: """Acquire a new lock. :param key: The key to be used for locking. - :return: A ``PostgreSqlLock`` instance. + :return: A ``DatabaseLock`` instance. """ - return PostgreSqlLock(super().acquire(), key, *args, **kwargs) + acquired = super(DatabaseClientPool, self).acquire() + + async def _fn_enter(): + client = await acquired.__aenter__() + return await DatabaseLock(client, key, *args, **kwargs).__aenter__() + + async def _fn_exit(lock: DatabaseLock): + await lock.__aexit__(None, None, None) + await acquired.__aexit__(None, None, None) + + # noinspection PyTypeChecker + return ContextManager(_fn_enter, _fn_exit) diff --git a/packages/core/minos-microservice-common/minos/common/importlib.py b/packages/core/minos-microservice-common/minos/common/importlib.py index f917f2a21..b27aa8908 100644 --- a/packages/core/minos-microservice-common/minos/common/importlib.py +++ b/packages/core/minos-microservice-common/minos/common/importlib.py @@ -1,5 +1,8 @@ import importlib import pkgutil +from contextlib import ( + suppress, +) from functools import ( lru_cache, ) @@ -22,7 +25,7 @@ def import_module(module_name: str) -> Union[type, Callable, ModuleType]: parts = module_name.rsplit(".", 1) try: - kallable = importlib.import_module(parts[0]) + kallable = _import_module(parts[0]) except ImportError: raise MinosImportException(f"Error importing {module_name!r}: the module does not exist") @@ -35,6 +38,16 @@ def import_module(module_name: str) -> Union[type, Callable, ModuleType]: return kallable +def _import_module(module_name: str) -> Union[type, Callable, ModuleType]: + try: + return importlib.import_module(module_name) + except ImportError as exc: + if "." in module_name: + with suppress(MinosImportException): + return import_module(module_name) + raise exc + + def classname(cls: Union[type, Callable]) -> str: """Compute the given class full name. diff --git a/packages/core/minos-microservice-common/minos/common/injections/decorators.py b/packages/core/minos-microservice-common/minos/common/injections/decorators.py index baa15a80d..b052e968f 100644 --- a/packages/core/minos-microservice-common/minos/common/injections/decorators.py +++ b/packages/core/minos-microservice-common/minos/common/injections/decorators.py @@ -73,6 +73,7 @@ def __call__(self, input_type: InputType) -> OutputType: # noinspection PyTypeChecker output_type: OutputType = types.new_class(input_type.__name__, bases, {}) + output_type.__module__ = input_type.__module__ # noinspection PyProtectedMember output_type._set_injectable_name(self._name) @@ -150,8 +151,9 @@ def _is_injectable(self, type_: type) -> bool: if any(self._is_injectable(arg) for arg in get_args(type_)): return True elif origin_type is None: - if issubclass(type_, InjectableMixin): - return True + if is_type_subclass(type_): + if issubclass(type_, InjectableMixin): + return True elif is_type_subclass(origin_type): if issubclass(origin_type, InjectableMixin): return True diff --git a/packages/core/minos-microservice-common/minos/common/locks.py b/packages/core/minos-microservice-common/minos/common/locks.py index d52a602dd..bf21dbf6b 100644 --- a/packages/core/minos-microservice-common/minos/common/locks.py +++ b/packages/core/minos-microservice-common/minos/common/locks.py @@ -4,27 +4,22 @@ from abc import ( ABC, + abstractmethod, ) from collections.abc import ( Hashable, ) -from contextlib import ( - AbstractAsyncContextManager, -) from cached_property import ( cached_property, ) -from .injections import ( - Injectable, -) from .pools import ( Pool, ) -class Lock(AbstractAsyncContextManager): +class Lock(ABC): """Lock base class.""" key: Hashable @@ -35,6 +30,27 @@ def __init__(self, key: Hashable, *args, **kwargs): self.key = key + async def __aenter__(self) -> Lock: + await self.acquire() + return self + + async def __aexit__(self, exc_type, exc_val, exc_tb): + await self.release() + + @abstractmethod + async def acquire(self) -> None: + """Acquire the lock. + + :return: This method does not return anything. + """ + + @abstractmethod + async def release(self): + """Release the lock. + + :return: This method does not return anything. + """ + @cached_property def hashed_key(self) -> int: """Get the hashed key. @@ -46,6 +62,5 @@ def hashed_key(self) -> int: return self.key -@Injectable("lock_pool") class LockPool(Pool[Lock], ABC): - """Postgres Locking Pool class.""" + """Lock Pool class.""" diff --git a/packages/core/minos-microservice-common/minos/common/model/__init__.py b/packages/core/minos-microservice-common/minos/common/model/__init__.py index 6cba174aa..04b4019e5 100644 --- a/packages/core/minos-microservice-common/minos/common/model/__init__.py +++ b/packages/core/minos-microservice-common/minos/common/model/__init__.py @@ -31,5 +31,6 @@ NoneType, TypeHintBuilder, TypeHintComparator, + TypeHintParser, is_model_type, ) diff --git a/packages/core/minos-microservice-common/minos/common/model/abc.py b/packages/core/minos-microservice-common/minos/common/model/abc.py index cb6fa4051..ec16c2551 100644 --- a/packages/core/minos-microservice-common/minos/common/model/abc.py +++ b/packages/core/minos-microservice-common/minos/common/model/abc.py @@ -114,11 +114,11 @@ def from_avro_str(cls: Type[T], raw: str, **kwargs) -> Union[T, list[T]]: # noinspection PyUnusedLocal @classmethod def from_avro_bytes(cls: Type[T], raw: bytes, batch_mode: bool = False, **kwargs) -> Union[T, list[T]]: - """Build a single instance or a sequence of instances from bytes + """Build a single instance or a sequence of instances from bytes. :param raw: A ``bytes`` representation of the model. :param batch_mode: If ``True`` the data is processed as a list of models, otherwise the data is processed as a - single model. + single model. :param kwargs: Additional named arguments. :return: A single instance or a sequence of instances. """ diff --git a/packages/core/minos-microservice-common/minos/common/model/fields.py b/packages/core/minos-microservice-common/minos/common/model/fields.py index 512cc8041..942e7cce4 100644 --- a/packages/core/minos-microservice-common/minos/common/model/fields.py +++ b/packages/core/minos-microservice-common/minos/common/model/fields.py @@ -31,6 +31,7 @@ MissingSentinel, TypeHintBuilder, TypeHintComparator, + TypeHintParser, ) logger = logging.getLogger(__name__) @@ -64,7 +65,7 @@ def name(self) -> str: @property def type(self) -> type: """Type getter.""" - return self._type + return TypeHintParser(self._type).build() @property def real_type(self) -> type: diff --git a/packages/core/minos-microservice-common/minos/common/model/types/__init__.py b/packages/core/minos-microservice-common/minos/common/model/types/__init__.py index 26649a7ca..2a6a407e7 100644 --- a/packages/core/minos-microservice-common/minos/common/model/types/__init__.py +++ b/packages/core/minos-microservice-common/minos/common/model/types/__init__.py @@ -1,5 +1,6 @@ from .builders import ( TypeHintBuilder, + TypeHintParser, build_union, ) from .comparators import ( diff --git a/packages/core/minos-microservice-common/minos/common/model/types/builders.py b/packages/core/minos-microservice-common/minos/common/model/types/builders.py index 9a25d8290..dc84b4a74 100644 --- a/packages/core/minos-microservice-common/minos/common/model/types/builders.py +++ b/packages/core/minos-microservice-common/minos/common/model/types/builders.py @@ -6,6 +6,9 @@ from collections.abc import ( Iterable, ) +from functools import ( + lru_cache, +) from typing import ( Any, Optional, @@ -16,6 +19,7 @@ from .comparators import ( TypeHintComparator, + is_model_subclass, is_model_type, ) from .model_types import ( @@ -87,3 +91,30 @@ def _build_from_iterable(self, values: Iterable, type_: Optional[type]) -> type: @staticmethod def _build_from_dynamic(dynamic: type, static: Optional[type]) -> type: return dynamic if not len(get_args(static)) and TypeHintComparator(dynamic, static).match() else static + + +class TypeHintParser: + """Type Hint Parser class.""" + + def __init__(self, type_: Optional[type] = None): + self.type_ = type_ + + def build(self) -> type: + """Parse type hint. + + :return: A type. + """ + return self._build(self.type_) + + @classmethod + @lru_cache() + def _build(cls, type_: Optional[type]) -> type: + if is_model_subclass(type_): + # noinspection PyTypeChecker + return ModelType.from_model(type_) + + origin = get_origin(type_) + if origin is None: + return type_ + args = get_args(type_) + return cls._build(origin)[tuple(cls._build(arg) for arg in args)] diff --git a/packages/core/minos-microservice-common/minos/common/model/types/model_types.py b/packages/core/minos-microservice-common/minos/common/model/types/model_types.py index 027c89d34..e13812a83 100644 --- a/packages/core/minos-microservice-common/minos/common/model/types/model_types.py +++ b/packages/core/minos-microservice-common/minos/common/model/types/model_types.py @@ -87,8 +87,15 @@ def from_model(model: Union[Model, type[Model]]) -> ModelType: :param model: The model class. :return: A new ``ModelType`` instance. """ + from .builders import ( + TypeHintParser, + ) + + type_hints = GenericTypeProjector.from_model(model).build() + type_hints = {k: TypeHintParser(v).build() for k, v in type_hints.items()} + # noinspection PyTypeChecker - return ModelType.build(name_=model.classname, type_hints_=GenericTypeProjector.from_model(model).build()) + return ModelType.build(name_=model.classname, type_hints_=type_hints) def __call__(cls, *args, **kwargs) -> Model: return cls.model_cls.from_model_type(cls, *args, **kwargs) diff --git a/packages/core/minos-microservice-common/minos/common/pools.py b/packages/core/minos-microservice-common/minos/common/pools.py index 417e9d6ae..3432db575 100644 --- a/packages/core/minos-microservice-common/minos/common/pools.py +++ b/packages/core/minos-microservice-common/minos/common/pools.py @@ -1,13 +1,19 @@ +from __future__ import ( + annotations, +) + import logging import warnings from abc import ( ABC, ) from asyncio import ( + gather, sleep, ) from typing import ( Any, + AsyncContextManager, Generic, Optional, TypeVar, @@ -20,6 +26,16 @@ ContextManager, ) +from .config import ( + Config, +) +from .exceptions import ( + MinosConfigException, + MinosException, +) +from .injections import ( + Injectable, +) from .setup import ( SetupMixin, ) @@ -29,11 +45,82 @@ P = TypeVar("P") -class Pool(SetupMixin, PoolBase, Generic[P], ABC): +@Injectable("pool_factory") +class PoolFactory(SetupMixin): + """Pool Factory class.""" + + _pools: dict[tuple[str, ...], Pool] + + def __init__(self, config: Config, default_classes: dict[str, type[Pool]] = None, *args, **kwargs): + super().__init__(*args, **kwargs) + if default_classes is None: + default_classes = dict() + + self._config = config + self._default_classes = default_classes + self._pools = dict() + + @classmethod + def _from_config(cls, config: Config, **kwargs) -> PoolFactory: + return cls(config, **kwargs) + + async def _destroy(self) -> None: + await self._destroy_pools() + await super()._destroy() + + async def _destroy_pools(self): + logger.debug("Destroying pools...") + futures = (pool.destroy() for pool in self._pools.values()) + await gather(*futures) + logger.debug("Destroyed pools!") + + def get_pool(self, type_: str, identifier: Optional[str] = None, **kwargs) -> Pool: + """Get a pool from the factory. + + :param type_: The type of the pool. + :param identifier: An optional key that identifies the pool. + :param kwargs: Additional named arguments. + :return: A ``Pool`` instance. + """ + key = (type_, identifier) + if key not in self._pools: + logger.debug(f"Creating the {key!r} pool...") + self._pools[key] = self._create_pool(type_, identifier=identifier, **kwargs) + return self._pools[key] + + def _create_pool(self, type_: str, **kwargs) -> Pool: + # noinspection PyTypeChecker + pool_cls = self._get_pool_cls(type_) + try: + pool = pool_cls.from_config(self._config, **kwargs) + except MinosConfigException: + raise PoolException("The pool could not be built.") + return pool + + def _get_pool_cls(self, type_: str) -> type[Pool]: + pool_cls = self._default_classes.get(type_) + + if pool_cls is None: + pool_cls = self._config.get_pools().get("types", dict()).get(type_) + + if pool_cls is None: + raise PoolException( + f"There is not any provided {type!r} to build pools that matches the given type: {type_!r}" + ) + + return pool_cls + + +class _PoolBase(PoolBase, ABC): + def __init__(self, *args, maxsize: int = 10, recycle: Optional[int] = None, **kwargs): + super().__init__(maxsize=maxsize, recycle=recycle) + + +class Pool(SetupMixin, _PoolBase, Generic[P], ABC): """Base class for Pool implementations in minos""" - def __init__(self, *args, maxsize: int = 10, recycle: Optional[int] = 300, already_setup: bool = True, **kwargs): - super().__init__(*args, maxsize=maxsize, recycle=recycle, already_setup=already_setup, **kwargs) + def __init__(self, *args, already_setup: bool = True, **kwargs): + super().__init__(*args, already_setup=already_setup, **kwargs) # noinspection PyUnresolvedReferences async def __acquire(self) -> Any: # pragma: no cover @@ -59,10 +146,11 @@ async def __acquire(self) -> Any: # pragma: no cover # noinspection PyUnresolvedReferences async def __release(self, instance: Any) -> Any: # pragma: no cover + await self._release_instance(instance) await self._PoolBase__release(instance) logger.debug(f"Released instance: {instance!r}") - def acquire(self, *args, **kwargs) -> P: + def acquire(self, *args, **kwargs) -> AsyncContextManager[P]: """Acquire a new instance wrapped on an asynchronous context manager. :param args: Additional positional arguments. @@ -77,12 +165,16 @@ async def _destroy(self) -> None: logger.info("Waiting for instances releasing...") while len(self._used): await sleep(0.1) + logger.info("Released instances!") await self.close() async def _check_instance(self, instance: P) -> bool: return True + async def _release_instance(self, instance: P) -> None: + pass + class MinosPool(Pool, Generic[P], ABC): """MinosPool class.""" @@ -90,3 +182,7 @@ class MinosPool(Pool, Generic[P], ABC): def __init__(self, *args, **kwargs): warnings.warn(f"{MinosPool!r} has been deprecated. Use {Pool} instead.", DeprecationWarning) super().__init__(*args, **kwargs) + + +class PoolException(MinosException): + """Exception to be raised when some problem related with a pool happens.""" diff --git a/packages/core/minos-microservice-common/minos/common/protocol/avro/base.py b/packages/core/minos-microservice-common/minos/common/protocol/avro/base.py index 1fd1154de..617494855 100644 --- a/packages/core/minos-microservice-common/minos/common/protocol/avro/base.py +++ b/packages/core/minos-microservice-common/minos/common/protocol/avro/base.py @@ -31,7 +31,7 @@ def encode(cls, value: Any, schema: Any, *args, batch_mode: bool = False, **kwar :param schema: The schema relative to the data. :param args: Additional positional arguments. :param batch_mode: If ``True`` the data is processed as a list of models, otherwise the data is processed as a - single model. + single model. :param kwargs: Additional named arguments. :return: A bytes object. """ @@ -69,7 +69,7 @@ def decode(cls, data: bytes, *args, batch_mode: bool = False, **kwargs) -> Any: :param data: A bytes object. :param args: Additional positional arguments. :param batch_mode: If ``True`` the data is processed as a list of models, otherwise the data is processed as a - single model. + single model. :param kwargs: Additional named arguments. :return: A dictionary or a list of dictionaries. """ diff --git a/packages/core/minos-microservice-common/minos/common/setup.py b/packages/core/minos-microservice-common/minos/common/setup.py index 0832a3f59..87ae933f0 100644 --- a/packages/core/minos-microservice-common/minos/common/setup.py +++ b/packages/core/minos-microservice-common/minos/common/setup.py @@ -94,7 +94,7 @@ async def setup(self) -> None: :return: This method does not return anything. """ if not self._already_setup: - logger.info(f"Setting up a {type(self).__name__!r} instance...") + logger.debug(f"Setting up a {type(self).__name__!r} instance...") await self._setup() self._already_setup = True @@ -110,7 +110,7 @@ async def destroy(self) -> None: :return: This method does not return anything. """ if self._already_setup: - logger.info(f"Destroying a {type(self).__name__!r} instance...") + logger.debug(f"Destroying a {type(self).__name__!r} instance...") await self._destroy() self._already_setup = False diff --git a/packages/core/minos-microservice-common/minos/common/storage/__init__.py b/packages/core/minos-microservice-common/minos/common/storage/__init__.py deleted file mode 100644 index 18d5870d3..000000000 --- a/packages/core/minos-microservice-common/minos/common/storage/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -from .abc import ( - MinosStorage, -) -from .lmdb import ( - MinosStorageLmdb, -) diff --git a/packages/core/minos-microservice-common/minos/common/storage/abc.py b/packages/core/minos-microservice-common/minos/common/storage/abc.py deleted file mode 100644 index cefc9292f..000000000 --- a/packages/core/minos-microservice-common/minos/common/storage/abc.py +++ /dev/null @@ -1,62 +0,0 @@ -from __future__ import ( - annotations, -) - -from abc import ( - ABC, - abstractmethod, -) -from typing import ( - Any, - Optional, -) - - -class MinosStorage(ABC): - """Minos Storage interface.""" - - @abstractmethod - def add(self, **kwargs) -> None: - """Store a value. - - :param kwargs: Additional named arguments. - :return: This method does not return anything. - """ - raise NotImplementedError - - @abstractmethod - def get(self, **kwargs) -> Optional[Any]: - """Get the stored value.. - - :param kwargs: Additional named arguments. - :return: The stored value. - """ - raise NotImplementedError - - @abstractmethod - def delete(self, **kwargs) -> None: - """Delete the stored value. - - :param kwargs: - :return: This method does not return anything. - """ - raise NotImplementedError - - @abstractmethod - def update(self, **kwargs) -> None: - """Update the stored value. - - :param kwargs: Additional named arguments. - :return: This method does not return anything. - """ - raise NotImplementedError - - @classmethod - @abstractmethod - def build(cls, **kwargs) -> MinosStorage: - """Build a new instance. - - :param kwargs: Additional named arguments. - :return: A new ``MinosStorage`` instance. - """ - raise NotImplementedError diff --git a/packages/core/minos-microservice-common/minos/common/storage/lmdb.py b/packages/core/minos-microservice-common/minos/common/storage/lmdb.py deleted file mode 100644 index 3e1a1ed26..000000000 --- a/packages/core/minos-microservice-common/minos/common/storage/lmdb.py +++ /dev/null @@ -1,115 +0,0 @@ -from __future__ import ( - annotations, -) - -from pathlib import ( - Path, -) -from typing import ( - Any, - Optional, - Type, - Union, -) - -import lmdb - -from ..protocol import ( - MinosAvroDatabaseProtocol, - MinosBinaryProtocol, -) -from .abc import ( - MinosStorage, -) - - -class MinosStorageLmdb(MinosStorage): - """Minos Storage LMDB class""" - - __slots__ = "_env", "_protocol", "_tables" - - # noinspection PyUnusedLocal - def __init__( - self, env: lmdb.Environment, protocol: Type[MinosBinaryProtocol] = MinosAvroDatabaseProtocol, **kwargs - ): - self._env: lmdb.Environment = env - self._protocol = protocol - self._tables = {} - - def add(self, table: str, key: str, value: Any) -> None: - """Store a value. - - :param table: Table in which the data is stored. - :param key: Key that identifies the data. - :param value: Data to be stored. - :return: This method does not return anything. - """ - db_instance = self._get_table(table) - with self._env.begin(write=True) as txn: - value_bytes: bytes = self._protocol.encode(value) - txn.put(key.encode(), value_bytes, db=db_instance) - - def get(self, table: str, key: str) -> Optional[Any]: - """Get the stored value.. - - :param table: Table in which the data is stored. - :param key: Key that identifies the data. - :return: The stored value or ``None`` if it's empty. - """ - db_instance = self._get_table(table) - with self._env.begin(db=db_instance) as txn: - value_binary = txn.get(key.encode()) - if value_binary is not None: - # decode the returned value - return self._protocol.decode(value_binary) - return None - - def delete(self, table: str, key: str) -> None: - """Delete the stored value. - - :param table: Table in which the data is stored. - :param key: Key that identifies the data. - :return: This method does not return anything. - """ - db_instance = self._get_table(table) - with self._env.begin(write=True, db=db_instance) as txn: - txn.delete(key.encode()) - - def update(self, table: str, key: str, value: Any) -> None: - """Update the stored value. - - :param table: Table in which the data is stored. - :param key: Key that identifies the data. - :param value: Data to be stored. - :return: This method does not return anything. - """ - db_instance = self._get_table(table) - with self._env.begin(write=True, db=db_instance) as txn: - value_bytes: bytes = self._protocol.encode(value) - txn.put(key.encode(), value_bytes, db=db_instance, overwrite=True) - - def _get_table(self, table: str): - if table in self._tables: - return self._tables[table] - else: - # create a new table - self._tables[table] = self._env.open_db(table.encode()) - return self._tables[table] - - @classmethod - def build( - cls, path: Optional[Union[str, Path]] = None, max_db: int = 10, map_size: int = int(1e9), **kwargs - ) -> MinosStorageLmdb: - """Build a new instance. - - :param path: Path in which the database is stored. - :param max_db: Maximum number of available databases. - :param map_size: Maximum number of entries to be stored on the database. Default set to 1GB - :param kwargs: Additional named arguments. - :return: A ``MinosStorageLmdb`` instance. - """ - if path is None: - path = ".lmdb" - - env: lmdb.Environment = lmdb.open(str(path), max_dbs=max_db, map_size=map_size) - return cls(env, **kwargs) diff --git a/packages/core/minos-microservice-common/minos/common/testing.py b/packages/core/minos-microservice-common/minos/common/testing.py deleted file mode 100644 index c879b5fbb..000000000 --- a/packages/core/minos-microservice-common/minos/common/testing.py +++ /dev/null @@ -1,101 +0,0 @@ -import unittest -from itertools import ( - starmap, -) -from pathlib import ( - Path, -) -from typing import ( - Any, -) -from uuid import ( - uuid4, -) - -import aiopg - -from .config import ( - Config, -) - - -class PostgresAsyncTestCase(unittest.IsolatedAsyncioTestCase): - CONFIG_FILE_PATH: Path - - def setUp(self) -> None: - self._uuid = uuid4() - self._config = Config(self.CONFIG_FILE_PATH) - - self._meta_repository_db = self._config.get_database_by_name("aggregate") - - self._meta_broker_queue_db = self._config.get_database_by_name("broker") - - self._meta_snapshot_db = self._config.get_database_by_name("aggregate") - - self._test_db = {"database": f"test_db_{self._uuid.hex}", "user": f"test_user_{self._uuid.hex}"} - - self.repository_db = self._meta_repository_db | self._test_db - self.broker_queue_db = self._meta_broker_queue_db | self._test_db - self.snapshot_db = self._meta_snapshot_db | self._test_db - - self.config = Config( - self.CONFIG_FILE_PATH, - repository_database=self.repository_db["database"], - repository_user=self.repository_db["user"], - broker_queue_database=self.broker_queue_db["database"], - broker_queue_user=self.broker_queue_db["user"], - snapshot_database=self.snapshot_db["database"], - snapshot_user=self.snapshot_db["user"], - ) - - async def asyncSetUp(self): - pairs = self._drop_duplicates( - [ - (self._meta_repository_db, self.repository_db), - (self._meta_broker_queue_db, self.broker_queue_db), - (self._meta_snapshot_db, self.snapshot_db), - ] - ) - for meta, test in pairs: - await self._setup_database(dict(meta), dict(test)) - - async def _setup_database(self, meta: dict[str, Any], test: dict[str, Any]) -> None: - await self._teardown_database(meta, test) - - async with aiopg.connect(**meta) as connection: - async with connection.cursor() as cursor: - template = "CREATE ROLE {user} WITH SUPERUSER CREATEDB LOGIN ENCRYPTED PASSWORD {password!r};" - await cursor.execute(template.format(**test)) - - template = "CREATE DATABASE {database} WITH OWNER = {user};" - await cursor.execute(template.format(**test)) - - async def asyncTearDown(self): - pairs = self._drop_duplicates( - [ - (self._meta_repository_db, self.repository_db), - (self._meta_broker_queue_db, self.broker_queue_db), - (self._meta_snapshot_db, self.snapshot_db), - ] - ) - - for meta, test in pairs: - await self._teardown_database(meta, test) - - @staticmethod - def _drop_duplicates(items: list[(dict, dict)]): - items = starmap(lambda a, b: (tuple(a.items()), tuple(b.items())), items) - items = set(items) - items = starmap(lambda a, b: (dict(a), dict(b)), items) - items = list(items) - return items - - @staticmethod - async def _teardown_database(meta: dict[str, Any], test: dict[str, Any]) -> None: - async with aiopg.connect(**meta) as connection: - async with connection.cursor() as cursor: - template = "DROP DATABASE IF EXISTS {database}" - await cursor.execute(template.format(**test)) - - template = "DROP ROLE IF EXISTS {user};" - await cursor.execute(template.format(**test)) diff --git a/packages/core/minos-microservice-common/minos/common/testing/__init__.py b/packages/core/minos-microservice-common/minos/common/testing/__init__.py new file mode 100644 index 000000000..01fd17cc3 --- /dev/null +++ b/packages/core/minos-microservice-common/minos/common/testing/__init__.py @@ -0,0 +1,10 @@ +from .database import ( + MockedDatabaseClient, + MockedDatabaseOperation, + MockedLockDatabaseOperationFactory, + MockedManagementDatabaseOperationFactory, +) +from .testcases import ( + DatabaseMinosTestCase, + MinosTestCase, +) diff --git a/packages/core/minos-microservice-common/minos/common/testing/database/__init__.py b/packages/core/minos-microservice-common/minos/common/testing/database/__init__.py new file mode 100644 index 000000000..03b3ef9a7 --- /dev/null +++ b/packages/core/minos-microservice-common/minos/common/testing/database/__init__.py @@ -0,0 +1,10 @@ +from .clients import ( + MockedDatabaseClient, +) +from .factories import ( + MockedLockDatabaseOperationFactory, + MockedManagementDatabaseOperationFactory, +) +from .operations import ( + MockedDatabaseOperation, +) diff --git a/packages/core/minos-microservice-common/minos/common/testing/database/clients.py b/packages/core/minos-microservice-common/minos/common/testing/database/clients.py new file mode 100644 index 000000000..90b1b4d3a --- /dev/null +++ b/packages/core/minos-microservice-common/minos/common/testing/database/clients.py @@ -0,0 +1,35 @@ +from collections.abc import ( + AsyncIterator, +) +from typing import ( + Any, +) + +from ...database import ( + DatabaseClient, +) +from .operations import ( + MockedDatabaseOperation, +) + + +class MockedDatabaseClient(DatabaseClient): + """For testing purposes""" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.kwargs = kwargs + self._response = tuple() + + async def _reset(self, **kwargs) -> None: + """For testing purposes""" + self._response = tuple() + + async def _execute(self, operation: MockedDatabaseOperation) -> None: + """For testing purposes""" + self._response = operation.response + + async def _fetch_all(self, *args, **kwargs) -> AsyncIterator[Any]: + """For testing purposes""" + for value in self._response: + yield value diff --git a/packages/core/minos-microservice-common/minos/common/testing/database/factories/__init__.py b/packages/core/minos-microservice-common/minos/common/testing/database/factories/__init__.py new file mode 100644 index 000000000..9aadffc99 --- /dev/null +++ b/packages/core/minos-microservice-common/minos/common/testing/database/factories/__init__.py @@ -0,0 +1,6 @@ +from .locks import ( + MockedLockDatabaseOperationFactory, +) +from .managements import ( + MockedManagementDatabaseOperationFactory, +) diff --git a/packages/core/minos-microservice-common/minos/common/testing/database/factories/locks.py b/packages/core/minos-microservice-common/minos/common/testing/database/factories/locks.py new file mode 100644 index 000000000..9cad4761d --- /dev/null +++ b/packages/core/minos-microservice-common/minos/common/testing/database/factories/locks.py @@ -0,0 +1,25 @@ +from ....database import ( + DatabaseOperation, + LockDatabaseOperationFactory, +) +from ..clients import ( + MockedDatabaseClient, +) +from ..operations import ( + MockedDatabaseOperation, +) + + +class MockedLockDatabaseOperationFactory(LockDatabaseOperationFactory): + """For testing purposes""" + + def build_acquire(self, hashed_key: int) -> DatabaseOperation: + """For testing purposes""" + return MockedDatabaseOperation("acquire") + + def build_release(self, hashed_key: int) -> DatabaseOperation: + """For testing purposes""" + return MockedDatabaseOperation("release") + + +MockedDatabaseClient.set_factory(LockDatabaseOperationFactory, MockedLockDatabaseOperationFactory) diff --git a/packages/core/minos-microservice-common/minos/common/testing/database/factories/managements.py b/packages/core/minos-microservice-common/minos/common/testing/database/factories/managements.py new file mode 100644 index 000000000..3819967b6 --- /dev/null +++ b/packages/core/minos-microservice-common/minos/common/testing/database/factories/managements.py @@ -0,0 +1,25 @@ +from ....database import ( + DatabaseOperation, + ManagementDatabaseOperationFactory, +) +from ..clients import ( + MockedDatabaseClient, +) +from ..operations import ( + MockedDatabaseOperation, +) + + +class MockedManagementDatabaseOperationFactory(ManagementDatabaseOperationFactory): + """For testing purposes""" + + def build_create(self, database: str) -> DatabaseOperation: + """For testing purposes""" + return MockedDatabaseOperation("create") + + def build_delete(self, database: str) -> DatabaseOperation: + """For testing purposes""" + return MockedDatabaseOperation("delete") + + +MockedDatabaseClient.set_factory(ManagementDatabaseOperationFactory, MockedManagementDatabaseOperationFactory) diff --git a/packages/core/minos-microservice-common/minos/common/testing/database/operations.py b/packages/core/minos-microservice-common/minos/common/testing/database/operations.py new file mode 100644 index 000000000..ac6d000e2 --- /dev/null +++ b/packages/core/minos-microservice-common/minos/common/testing/database/operations.py @@ -0,0 +1,20 @@ +from collections.abc import ( + Iterable, +) +from typing import ( + Any, + Optional, +) + +from ...database import ( + DatabaseOperation, +) + + +class MockedDatabaseOperation(DatabaseOperation): + """For testing purposes""" + + def __init__(self, content: str, response: Optional[Iterable[Any]] = tuple(), *args, **kwargs): + super().__init__(*args, **kwargs) + self.content = content + self.response = tuple(response) diff --git a/packages/core/minos-microservice-common/minos/common/testing/testcases.py b/packages/core/minos-microservice-common/minos/common/testing/testcases.py new file mode 100644 index 000000000..d9e718ab0 --- /dev/null +++ b/packages/core/minos-microservice-common/minos/common/testing/testcases.py @@ -0,0 +1,122 @@ +from __future__ import ( + annotations, +) + +import unittest +from abc import ( + ABC, +) +from contextlib import ( + suppress, +) +from pathlib import ( + Path, +) +from typing import ( + Any, + Union, +) +from uuid import ( + uuid4, +) + +from ..config import ( + Config, +) +from ..database import ( + DatabaseClient, + DatabaseClientPool, + ManagementDatabaseOperationFactory, +) +from ..injections import ( + DependencyInjector, + InjectableMixin, +) +from ..pools import ( + PoolFactory, +) + + +class MinosTestCase(unittest.IsolatedAsyncioTestCase, ABC): + CONFIG_FILE_PATH: Path + + def setUp(self) -> None: + super().setUp() + + self.config = self.get_config() + self.injector = DependencyInjector(self.config, self.get_injections()) + self.injector.wire_injections() + + def get_config(self) -> Config: + return Config(self.get_config_file_path()) + + def get_config_file_path(self) -> Path: + return self.CONFIG_FILE_PATH + + def get_injections(self) -> list[Union[InjectableMixin, type[InjectableMixin], str]]: + return [] + + async def asyncSetUp(self) -> None: + await super().asyncSetUp() + await self.injector.setup_injections() + + async def asyncTearDown(self) -> None: + await self.injector.destroy_injections() + await super().asyncTearDown() + + def tearDown(self) -> None: + self.injector.unwire_injections() + super().tearDown() + + def __getattr__(self, item: str) -> Any: + if item != "injector": + with suppress(Exception): + return getattr(self.injector, item) + raise AttributeError(f"{type(self).__name__!r} does not contain the {item!r} attribute.") + + +class DatabaseMinosTestCase(MinosTestCase, ABC): + def setUp(self): + self.base_config = Config(self.get_config_file_path()) + self._uuid = uuid4() + self._test_db = {"database": f"test_db_{self._uuid.hex}"} + super().setUp() + + def get_client(self) -> DatabaseClient: + default_config = self.base_config.get_default_database() + client = default_config.get("client") + return client.from_config(self.base_config) + + def get_config(self) -> Config: + config = Config(self.get_config_file_path()) + + base_fn = config.get_databases + + def _fn(): + return {k: (v | self._test_db) for k, v in base_fn().items()} + + config.get_databases = _fn + return config + + def get_injections(self) -> list[Union[InjectableMixin, type[InjectableMixin], str]]: + return [PoolFactory.from_config(self.config, default_classes={"database": DatabaseClientPool})] + + async def asyncSetUp(self): + await self._create_database(self._test_db) + await super().asyncSetUp() + + async def asyncTearDown(self): + await super().asyncTearDown() + await self._drop_database(self._test_db) + + async def _create_database(self, test: dict[str, Any]) -> None: + await self._drop_database(test) + + async with self.get_client() as client: + operation = client.get_factory(ManagementDatabaseOperationFactory).build_create(test["database"]) + await client.execute(operation) + + async def _drop_database(self, test: dict[str, Any]) -> None: + async with self.get_client() as client: + operation = client.get_factory(ManagementDatabaseOperationFactory).build_delete(test["database"]) + await client.execute(operation) diff --git a/packages/core/minos-microservice-common/poetry.lock b/packages/core/minos-microservice-common/poetry.lock index 62682cf99..f9b875d37 100644 --- a/packages/core/minos-microservice-common/poetry.lock +++ b/packages/core/minos-microservice-common/poetry.lock @@ -19,37 +19,6 @@ develop = ["aiocontextvars (==0.2.2)", "aiohttp-asgi", "aiohttp (<4)", "async-ti raven = ["raven-aiohttp"] uvloop = ["uvloop (>=0.14,<1)"] -[[package]] -name = "aiopg" -version = "1.3.3" -description = "Postgres integration with asyncio." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -async-timeout = ">=3.0,<5.0" -psycopg2-binary = ">=2.8.4" - -[package.extras] -sa = ["sqlalchemy[postgresql_psycopg2binary] (>=1.3,<1.5)"] - -[[package]] -name = "alabaster" -version = "0.7.12" -description = "A configurable sidebar-enabled Sphinx theme" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "async-timeout" -version = "4.0.2" -description = "Timeout context manager for asyncio programs" -category = "main" -optional = false -python-versions = ">=3.6" - [[package]] name = "atomicwrites" version = "1.4.0" @@ -72,20 +41,9 @@ docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] -[[package]] -name = "babel" -version = "2.9.1" -description = "Internationalization utilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -pytz = ">=2015.7" - [[package]] name = "black" -version = "22.1.0" +version = "22.3.0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -96,7 +54,7 @@ click = ">=8.0.0" mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = ">=1.1.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] @@ -113,40 +71,13 @@ category = "main" optional = false python-versions = "*" -[[package]] -name = "certifi" -version = "2021.10.8" -description = "Python package for providing Mozilla's CA Bundle." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "cfgv" -version = "3.3.1" -description = "Validate configuration and produce human readable error messages." -category = "dev" -optional = false -python-versions = ">=3.6.1" - -[[package]] -name = "charset-normalizer" -version = "2.0.12" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "dev" -optional = false -python-versions = ">=3.5.0" - -[package.extras] -unicode_backport = ["unicodedata2"] - [[package]] name = "click" -version = "8.0.4" +version = "8.1.3" description = "Composable command line interface toolkit" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -186,7 +117,7 @@ toml = ["tomli"] [[package]] name = "dependency-injector" -version = "4.39.0" +version = "4.39.1" description = "Dependency injection framework for Python" category = "main" optional = false @@ -201,25 +132,9 @@ flask = ["flask"] pydantic = ["pydantic"] yaml = ["pyyaml"] -[[package]] -name = "distlib" -version = "0.3.4" -description = "Distribution utilities" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "docutils" -version = "0.17.1" -description = "Docutils -- Python Documentation Utilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - [[package]] name = "fastavro" -version = "1.4.10" +version = "1.4.11" description = "Fast read/write of AVRO files" category = "main" optional = false @@ -231,18 +146,6 @@ lz4 = ["lz4"] snappy = ["python-snappy"] zstandard = ["zstandard"] -[[package]] -name = "filelock" -version = "3.6.0" -description = "A platform independent file lock." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"] -testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-cov", "pytest-timeout (>=1.4.2)"] - [[package]] name = "flake8" version = "4.0.1" @@ -256,49 +159,6 @@ mccabe = ">=0.6.0,<0.7.0" pycodestyle = ">=2.8.0,<2.9.0" pyflakes = ">=2.4.0,<2.5.0" -[[package]] -name = "identify" -version = "2.4.12" -description = "File identification library for Python" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -license = ["ukkonen"] - -[[package]] -name = "idna" -version = "3.3" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "dev" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "imagesize" -version = "1.3.0" -description = "Getting image size from png/jpeg/jpeg2000/gif file" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "importlib-metadata" -version = "4.11.3" -description = "Read metadata from Python packages" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] -perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] - [[package]] name = "iniconfig" version = "1.1.1" @@ -321,48 +181,6 @@ requirements_deprecated_finder = ["pipreqs", "pip-api"] colors = ["colorama (>=0.4.3,<0.5.0)"] plugins = ["setuptools"] -[[package]] -name = "jinja2" -version = "3.1.1" -description = "A very fast and expressive template engine." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - -[[package]] -name = "lmdb" -version = "1.3.0" -description = "Universal Python binding for the LMDB 'Lightning' Database" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "m2r2" -version = "0.3.2" -description = "Markdown and reStructuredText in a single file." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -docutils = "*" -mistune = "0.8.4" - -[[package]] -name = "markupsafe" -version = "2.1.1" -description = "Safely add untrusted strings to HTML/XML markup." -category = "dev" -optional = false -python-versions = ">=3.7" - [[package]] name = "mccabe" version = "0.6.1" @@ -371,14 +189,6 @@ category = "dev" optional = false python-versions = "*" -[[package]] -name = "mistune" -version = "0.8.4" -description = "The fastest markdown parser in pure Python" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "mypy-extensions" version = "0.4.3" @@ -387,17 +197,9 @@ category = "dev" optional = false python-versions = "*" -[[package]] -name = "nodeenv" -version = "1.6.0" -description = "Node.js virtual environment builder" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "orjson" -version = "3.6.7" +version = "3.6.8" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" category = "main" optional = false @@ -422,25 +224,17 @@ category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -[[package]] -name = "pbr" -version = "5.8.1" -description = "Python Build Reasonableness" -category = "dev" -optional = false -python-versions = ">=2.6" - [[package]] name = "platformdirs" -version = "2.5.1" +version = "2.5.2" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" [package.extras] -docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] +test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] [[package]] name = "pluggy" @@ -454,30 +248,6 @@ python-versions = ">=3.6" dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] -[[package]] -name = "pre-commit" -version = "2.17.0" -description = "A framework for managing and maintaining multi-language pre-commit hooks." -category = "dev" -optional = false -python-versions = ">=3.6.1" - -[package.dependencies] -cfgv = ">=2.0.0" -identify = ">=1.0.0" -nodeenv = ">=0.11.1" -pyyaml = ">=5.1" -toml = "*" -virtualenv = ">=20.0.8" - -[[package]] -name = "psycopg2-binary" -version = "2.9.3" -description = "psycopg2 - Python-PostgreSQL Database Adapter" -category = "main" -optional = false -python-versions = ">=3.6" - [[package]] name = "py" version = "1.11.0" @@ -502,28 +272,20 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -[[package]] -name = "pygments" -version = "2.11.2" -description = "Pygments is a syntax highlighting package written in Python." -category = "dev" -optional = false -python-versions = ">=3.5" - [[package]] name = "pyparsing" -version = "3.0.7" -description = "Python parsing module" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.6.8" [package.extras] -diagrams = ["jinja2", "railroad-diagrams"] +diagrams = ["railroad-diagrams", "jinja2"] [[package]] name = "pytest" -version = "7.1.1" +version = "7.1.2" description = "pytest: simple powerful testing with Python" category = "dev" optional = false @@ -542,14 +304,6 @@ tomli = ">=1.0.0" [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] -[[package]] -name = "pytz" -version = "2022.1" -description = "World timezone definitions, modern and historical" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "pyyaml" version = "6.0" @@ -558,24 +312,6 @@ category = "main" optional = false python-versions = ">=3.6" -[[package]] -name = "requests" -version = "2.27.1" -description = "Python HTTP for Humans." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} -urllib3 = ">=1.21.1,<1.27" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] - [[package]] name = "six" version = "1.16.0" @@ -584,167 +320,6 @@ category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -[[package]] -name = "snowballstemmer" -version = "2.2.0" -description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "sphinx" -version = "4.5.0" -description = "Python documentation generator" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -alabaster = ">=0.7,<0.8" -babel = ">=1.3" -colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.14,<0.18" -imagesize = "*" -importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} -Jinja2 = ">=2.3" -packaging = "*" -Pygments = ">=2.0" -requests = ">=2.5.0" -snowballstemmer = ">=1.1" -sphinxcontrib-applehelp = "*" -sphinxcontrib-devhelp = "*" -sphinxcontrib-htmlhelp = ">=2.0.0" -sphinxcontrib-jsmath = "*" -sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = ">=1.1.5" - -[package.extras] -docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.931)", "docutils-stubs", "types-typed-ast", "types-requests"] -test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] - -[[package]] -name = "sphinx-autodoc-typehints" -version = "1.17.0" -description = "Type hints (PEP 484) support for the Sphinx autodoc extension" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -Sphinx = ">=4" - -[package.extras] -testing = ["covdefaults (>=2)", "coverage (>=6)", "diff-cover (>=6.4)", "nptyping (>=1)", "pytest (>=6)", "pytest-cov (>=3)", "sphobjinv (>=2)", "typing-extensions (>=3.5)"] -type_comments = ["typed-ast (>=1.4.0)"] - -[[package]] -name = "sphinx-rtd-theme" -version = "1.0.0" -description = "Read the Docs theme for Sphinx" -category = "dev" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" - -[package.dependencies] -docutils = "<0.18" -sphinx = ">=1.6" - -[package.extras] -dev = ["transifex-client", "sphinxcontrib-httpdomain", "bump2version"] - -[[package]] -name = "sphinxcontrib-apidoc" -version = "0.3.0" -description = "A Sphinx extension for running 'sphinx-apidoc' on each build" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -pbr = "*" -Sphinx = ">=1.6.0" - -[[package]] -name = "sphinxcontrib-applehelp" -version = "1.0.2" -description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-devhelp" -version = "1.0.2" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-htmlhelp" -version = "2.0.0" -description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest", "html5lib"] - -[[package]] -name = "sphinxcontrib-jsmath" -version = "1.0.1" -description = "A sphinx extension which renders display math in HTML via JavaScript" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -test = ["pytest", "flake8", "mypy"] - -[[package]] -name = "sphinxcontrib-qthelp" -version = "1.0.3" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-serializinghtml" -version = "1.1.5" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - [[package]] name = "tomli" version = "2.0.1" @@ -755,24 +330,11 @@ python-versions = ">=3.7" [[package]] name = "typing-extensions" -version = "4.1.1" -description = "Backported and Experimental Type Hints for Python 3.6+" +version = "4.2.0" +description = "Backported and Experimental Type Hints for Python 3.7+" category = "dev" optional = false -python-versions = ">=3.6" - -[[package]] -name = "urllib3" -version = "1.26.9" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" - -[package.extras] -brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +python-versions = ">=3.7" [[package]] name = "uvloop" @@ -787,58 +349,16 @@ dev = ["Cython (>=0.29.24,<0.30.0)", "pytest (>=3.6.0)", "Sphinx (>=4.1.2,<4.2.0 docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)"] test = ["aiohttp", "flake8 (>=3.9.2,<3.10.0)", "psutil", "pycodestyle (>=2.7.0,<2.8.0)", "pyOpenSSL (>=19.0.0,<19.1.0)", "mypy (>=0.800)"] -[[package]] -name = "virtualenv" -version = "20.14.0" -description = "Virtual Python Environment builder" -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - -[package.dependencies] -distlib = ">=0.3.1,<1" -filelock = ">=3.2,<4" -platformdirs = ">=2,<3" -six = ">=1.9.0,<2" - -[package.extras] -docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=21.3)"] -testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)"] - -[[package]] -name = "zipp" -version = "3.7.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] - [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "fbf86feb57cef7a80f0568f8da50f945ebeb84d401d32fa5a3bde0bac05febda" +content-hash = "a9c5c5ba881792ac49e650321cd77db64874c6c55089b3d7f14a992a272f50f6" [metadata.files] aiomisc = [ {file = "aiomisc-15.7.3-py3-none-any.whl", hash = "sha256:0403e83268e98d0f2a125a70d13303fe1a2358e36db3daf02df032c7fa4f1525"}, {file = "aiomisc-15.7.3.tar.gz", hash = "sha256:ba250a34bd4609ced36111cb50580f57c3d52f3955f953a53ecb2986988baedc"}, ] -aiopg = [ - {file = "aiopg-1.3.3-py3-none-any.whl", hash = "sha256:2842dd8741460eeef940032dcb577bfba4d4115205dd82a73ce13b3271f5bf0a"}, - {file = "aiopg-1.3.3.tar.gz", hash = "sha256:547c6ba4ea0d73c2a11a2f44387d7133cc01d3c6f3b8ed976c0ac1eff4f595d7"}, -] -alabaster = [ - {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, - {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, -] -async-timeout = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, -] atomicwrites = [ {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, @@ -847,54 +367,38 @@ attrs = [ {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] -babel = [ - {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"}, - {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, -] black = [ - {file = "black-22.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1297c63b9e1b96a3d0da2d85d11cd9bf8664251fd69ddac068b98dc4f34f73b6"}, - {file = "black-22.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2ff96450d3ad9ea499fc4c60e425a1439c2120cbbc1ab959ff20f7c76ec7e866"}, - {file = "black-22.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e21e1f1efa65a50e3960edd068b6ae6d64ad6235bd8bfea116a03b21836af71"}, - {file = "black-22.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f69158a7d120fd641d1fa9a921d898e20d52e44a74a6fbbcc570a62a6bc8ab"}, - {file = "black-22.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:228b5ae2c8e3d6227e4bde5920d2fc66cc3400fde7bcc74f480cb07ef0b570d5"}, - {file = "black-22.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b1a5ed73ab4c482208d20434f700d514f66ffe2840f63a6252ecc43a9bc77e8a"}, - {file = "black-22.1.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35944b7100af4a985abfcaa860b06af15590deb1f392f06c8683b4381e8eeaf0"}, - {file = "black-22.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7835fee5238fc0a0baf6c9268fb816b5f5cd9b8793423a75e8cd663c48d073ba"}, - {file = "black-22.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dae63f2dbf82882fa3b2a3c49c32bffe144970a573cd68d247af6560fc493ae1"}, - {file = "black-22.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fa1db02410b1924b6749c245ab38d30621564e658297484952f3d8a39fce7e8"}, - {file = "black-22.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c8226f50b8c34a14608b848dc23a46e5d08397d009446353dad45e04af0c8e28"}, - {file = "black-22.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2d6f331c02f0f40aa51a22e479c8209d37fcd520c77721c034517d44eecf5912"}, - {file = "black-22.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:742ce9af3086e5bd07e58c8feb09dbb2b047b7f566eb5f5bc63fd455814979f3"}, - {file = "black-22.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fdb8754b453fb15fad3f72cd9cad3e16776f0964d67cf30ebcbf10327a3777a3"}, - {file = "black-22.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5660feab44c2e3cb24b2419b998846cbb01c23c7fe645fee45087efa3da2d61"}, - {file = "black-22.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:6f2f01381f91c1efb1451998bd65a129b3ed6f64f79663a55fe0e9b74a5f81fd"}, - {file = "black-22.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:efbadd9b52c060a8fc3b9658744091cb33c31f830b3f074422ed27bad2b18e8f"}, - {file = "black-22.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8871fcb4b447206904932b54b567923e5be802b9b19b744fdff092bd2f3118d0"}, - {file = "black-22.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccad888050f5393f0d6029deea2a33e5ae371fd182a697313bdbd835d3edaf9c"}, - {file = "black-22.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07e5c049442d7ca1a2fc273c79d1aecbbf1bc858f62e8184abe1ad175c4f7cc2"}, - {file = "black-22.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:373922fc66676133ddc3e754e4509196a8c392fec3f5ca4486673e685a421321"}, - {file = "black-22.1.0-py3-none-any.whl", hash = "sha256:3524739d76b6b3ed1132422bf9d82123cd1705086723bc3e235ca39fd21c667d"}, - {file = "black-22.1.0.tar.gz", hash = "sha256:a7c0192d35635f6fc1174be575cb7915e92e5dd629ee79fdaf0dcfa41a80afb5"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"}, + {file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"}, + {file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"}, + {file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"}, + {file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"}, + {file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"}, + {file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"}, + {file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"}, + {file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"}, + {file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"}, + {file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"}, + {file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"}, + {file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"}, + {file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"}, + {file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"}, + {file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"}, + {file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"}, + {file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"}, ] cached-property = [ {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, ] -certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, -] -cfgv = [ - {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, - {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, - {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, -] click = [ - {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"}, - {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, ] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, @@ -948,93 +452,65 @@ coverage = [ {file = "coverage-6.3.2.tar.gz", hash = "sha256:03e2a7826086b91ef345ff18742ee9fc47a6839ccd517061ef8fa1976e652ce9"}, ] dependency-injector = [ - {file = "dependency-injector-4.39.0.tar.gz", hash = "sha256:35d6c03683f512bcc8b0c950890ac40ce19bdacc7de4d59249dd61ed818f0930"}, - {file = "dependency_injector-4.39.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f046a5dbe7e5764fae9a69423f66241a8fdb62acea5c32b0c41a7da94b7f6da3"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfdd78f7d97c1f6ba4a3926a2e404507a4f77ecbd610d4a1b37dedb5c0b57ad1"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:512c23da829bb8ac2ae13f33aa017acf58ae9408e7796a146e1644e8b8471b5b"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7dc81df7f566bfdacdee448bc71085acd163b935860d2b2504b4f32840b3b692"}, - {file = "dependency_injector-4.39.0-cp310-cp310-win32.whl", hash = "sha256:9ffc5393700f45d740abecc50cdc1251eae69e50516ec9d0a48fba0e875ed083"}, - {file = "dependency_injector-4.39.0-cp310-cp310-win_amd64.whl", hash = "sha256:9118f36a3df1e9819074ccb35734d663812c8f6ef81d45c8e4ec81ce5dccac9c"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:1ff723aaf096fabb05cf8b08ba99888538a2a77e03a5082b70cd54eb9df619f3"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bb913900ceb1766f55dc628052d8e191a9c2b1737a0d775fbc230af90ab2c1e"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:329e801eb46b9933432481d3142e563e28a90d77952edac43126264c36ed2278"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1c1a67c699ae2c0234f07d121736fa44e8fe2d56c14b2fd210c3e04a151620bb"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-win32.whl", hash = "sha256:e1347defd46fe9067f857b1174bdb1b19458232ac1a485507df2ddff084cf31c"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-win_amd64.whl", hash = "sha256:9581c4c90f1aaf85ffb9b06bac7ac592df7076522881145321a9dd0702fee828"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8da8ff05fa17e852aa5831a600177e5bb72bf53b8a184f6922ae715387a460ba"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58a56999cebd8b2ba9c19e514e383924865e5f7d6273f8e5b7d85468d9042059"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4914332d6145fb7cfc5f2236a823a3859b92a7e75566ffca0987dcc0f7f7be53"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00aea40ee2d400a8091947ad97cda34b230628aeeac1774f8fa9a3500b5704b2"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-win32.whl", hash = "sha256:b94a64bc73d86d04b33c698fae4b9dad2536a8534ac6922c8226764da5d62d17"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4f59cc0b0d3beb82875d94b7e725b5097a7a454e8e323625ba6ac3095a29300e"}, - {file = "dependency_injector-4.39.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a8d840348f01d997e32394dba36e09c1ecd312b286befb6b3ca27526002ae94"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92097ffabca89d1539e200f91bfa13ff8ca502c9057391c3b78787d50fe502ed"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4a889e116fe76742ef6ff27d5e93ee9e364cbe7bbc6678df8c5dd54597a6fc"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a31e00961fdc1b3808a9e2adeb1107ec4bba0ad3a90b116af9d116a667e4626a"}, - {file = "dependency_injector-4.39.0-cp38-cp38-win32.whl", hash = "sha256:717720a220eee611ea96c0089246ec2103b168303ca2cd2c8a7cd3856da6f689"}, - {file = "dependency_injector-4.39.0-cp38-cp38-win_amd64.whl", hash = "sha256:05c0bbef90182a0d35d4d3f9ab879109070d204394578b12f0eff9eca51987ef"}, - {file = "dependency_injector-4.39.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f10bf8d146edffbee2ba5c5776395625c98048a31997afd481ce27792afee2af"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30c093b155c01e50723e8ecd2a14230daa4417356c8fb5a27369ae5be24b21d9"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dda8a85c8221e6ee433caa01c1bc4fed610381924780e04470572682569cdb8f"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ff8df47a901218a3257650f3f3a6b402dd58cb4f57b4a34d6e8092112f6e8480"}, - {file = "dependency_injector-4.39.0-cp39-cp39-win32.whl", hash = "sha256:e078c84c19ae73883a57e9b35edd843925b2b44833cd098708139a98abee5a96"}, - {file = "dependency_injector-4.39.0-cp39-cp39-win_amd64.whl", hash = "sha256:c02b6796320d6b9363d566045eeec243fa4a412ad68dcc6b2391307e93d0d401"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:865bf5ceba3e32f00e36bfcbefb1267b10df961fb2aab809f5e205968e1cd59b"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ce8645ffd8cc15a7bbd20c02e6439a61c1566a1db22766893bf79981fb89a4e"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dbdab8b024055865926a78ecbc3a6280345f4615e5c505511bbd7c6c322b1796"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:af996d66350704261382dc4e10f324eba5d23e35c04a9e75c7cb58fbea7f1f1d"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d390c6e97fec13fba832b7e39e07c43760ed3d46af4887005f679c0ab6eb9b2e"}, -] -distlib = [ - {file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"}, - {file = "distlib-0.3.4.zip", hash = "sha256:e4b58818180336dc9c529bfb9a0b58728ffc09ad92027a3f30b7cd91e3458579"}, -] -docutils = [ - {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, - {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, + {file = "dependency-injector-4.39.1.tar.gz", hash = "sha256:9ab76dc5e19b2692aaca49e00f9b41a087138d139b0ec985f92ff0498f038772"}, + {file = "dependency_injector-4.39.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c788a3d5482e63b5fd55e14fc258f1ff0b51b411927ab132ef0f689cb5d1183f"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0832e0457a360725cd1d1037b77b85478aeeaacc60e85ecceeb8020409e7b62"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d51998fff9704fd01d11c3c48f4e88d8506cb6afa1ee41409a881a5a51dae3fc"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea484cd13fc62966bf5582df0816205feee072d18f228aac75f7807b43f223ae"}, + {file = "dependency_injector-4.39.1-cp310-cp310-win32.whl", hash = "sha256:17389e53ec29ca13570319cf2065dcc4c2f6d36db5dd792bb1e8f2c39a9f146b"}, + {file = "dependency_injector-4.39.1-cp310-cp310-win_amd64.whl", hash = "sha256:55b0988489267c5a580f419133770ffe293057f2064da1c9ad6a2cc69666739b"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b297c3e79d3633cc56366386ae1f7dbce1587673cca2f559c368c1e936a1fa94"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2728827c5abb2420c5811e218262ae1b77a48e76cc9eebc6b4f55fee48a1a18d"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:029e42b064ab8cb5b2559be040ff682c7aa81592f1654a82355475956df17803"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:305e3db3f4bf40f64caaa1303e03005174e78d2339d2ae517b34c011ec2300f9"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-win32.whl", hash = "sha256:a661dd23a5e4e2f6bf4a729de7fadbe148c9a4a298dbcadfc5a94584b6930970"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-win_amd64.whl", hash = "sha256:340d6e7af5c4729d20c837d6d1e8a2626c24a05259dff746406cc823e26ba1e7"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a1553dac1c95f0de1f910b0025ee4570ea078a07d576bcdc2168990e719cea50"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c7baaa64d93359ee08c15d68579cc803e11d9becaf961f5a66b94ff627248e1"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7a27bf1951a066cf347b886cc7ab0f37dcbd1ad59bffcfe721c8c12a189a150d"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da6e2d685f7d0c65257f08133b68d9bf74ec319b90a0f21b4f629d168ce5f68f"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-win32.whl", hash = "sha256:a8ddd03ca86e67e9d3cc038793d34fbfccab12e6145df813e72bf14f9371f2ea"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-win_amd64.whl", hash = "sha256:e01a319ea05cd86b520201386dcb53a81a5400cb82fcc2f006bd7e92c0c51a0a"}, + {file = "dependency_injector-4.39.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4704804bde25b694aa65201927937a9d82d8bc055cb3dadc68eb05988bd34fa9"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0935d50b263169e7b0826a2fb6be80d6a4f2a7c59e6dd9876f86da3243bea9eb"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3c34aa5abb1826b6189f47daf6e469d4293c1d01693233da2c1b923816270cc5"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:db64904c9b9a88756cfece3e3ed078a2b57127642711dd08af342dba8abf9667"}, + {file = "dependency_injector-4.39.1-cp38-cp38-win32.whl", hash = "sha256:66ebe728194adc8720dbc4d662edbbfa55659ff23c9c493fb2dae0bfd4df5734"}, + {file = "dependency_injector-4.39.1-cp38-cp38-win_amd64.whl", hash = "sha256:4349974620f630d6726808e1291ec99713b64d449b84eb01581ee807a5a5c224"}, + {file = "dependency_injector-4.39.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d87cad0899b05cd08931bfb68ddf7be77711a67b0649c37f2045d7808977b082"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8efd965e5cfdd9f339ec895e73c119569851adedc175088d34a670f5206fea63"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:27f69485ca6b85c31d162ee86cf6ef71bb71dce9cd2b5d0745425dfc551eefa1"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a25b63de59dff04ec78f5161f00c0222a04a23def5d1f0eda14e389a32baf428"}, + {file = "dependency_injector-4.39.1-cp39-cp39-win32.whl", hash = "sha256:a14274f50d125b4579314c355e22af07def1a96641ca94bd75edcf1400b89477"}, + {file = "dependency_injector-4.39.1-cp39-cp39-win_amd64.whl", hash = "sha256:9950039d00625f9252cd26378a4406342b256886bb61e4db8b65e9f01270f53e"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6d7f39cd54678741e132e13da3a1367ac18058cbda61fe39d61c8583aa6fd757"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2368c7ba3c9ffaf816ea0f2d14c78d481491b805f62ac8496a78a51397d4689"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:84e32407bb16c58aa0d4b5ed8485537bc66ccc14cfffae7022f1204e35ec939a"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f2d80a42c546e1f934d427b071630d86653cd4a60c74b570c4ffb03025c1f1f9"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ca126bbed370b8c002c859ebeb76f6d83eba2d7fb5d66f37f47cfc19661d2889"}, ] fastavro = [ - {file = "fastavro-1.4.10-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:f225c81e869b3cefef6f2b478cd452693181ed7e645be3cea4d82024354ecaa0"}, - {file = "fastavro-1.4.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7669302c9124b7cd6c1bdff80c77116b2290c984814077fb7d01d7389586054"}, - {file = "fastavro-1.4.10-cp310-cp310-win_amd64.whl", hash = "sha256:995525bdfbdfef205ea148b5bc6a9fe5ccf921931123c39d9aad75a2b661681e"}, - {file = "fastavro-1.4.10-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:64244c53f1e4853184c2f7383d0332e1dcb34c38c05e6613530ade0378e8acfc"}, - {file = "fastavro-1.4.10-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c60965da6dc7a91e00ccd84d84797fad746555f44e8a816c4cc460fb231c44fe"}, - {file = "fastavro-1.4.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10eb25378f37dc00c10e83c4c0442c1a6d1b871f74a6dfdfc12b6447962bbdd0"}, - {file = "fastavro-1.4.10-cp37-cp37m-win_amd64.whl", hash = "sha256:d5719adf6045fc743de5fa738d561a81e58dc782c94f1b16cb21b5dd6253e7fd"}, - {file = "fastavro-1.4.10-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:24c4a1a8cc92e135ecfcd9cbd1f6cfa088cbc74d78c18e02a609cb11fa33778d"}, - {file = "fastavro-1.4.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0934490b0c3bcfd6bcbacbcb5144c6b5e4298cda209fbb17c856adf5405127dd"}, - {file = "fastavro-1.4.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a23763d73412c077aee401a0368c64cbc23859e26711dbae78a3cf0227f65165"}, - {file = "fastavro-1.4.10-cp38-cp38-win_amd64.whl", hash = "sha256:09f1dfdd8192ae09e0f477d1f024d8054fccdb099ad495d2a796bcee3cadebd1"}, - {file = "fastavro-1.4.10-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:0c6695753fa3035bbd0fa5cb21bf1b5dad39483c669b32ca0bb55fb07c1ccc87"}, - {file = "fastavro-1.4.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35f960dbba04647d8d6d5616f879622d2a1e8a84eb2d2e02a883a22e0803463a"}, - {file = "fastavro-1.4.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9660878ca01e3dbbee12385c5902a2b6b12ecbb5af4733d1026175a14b1ef67f"}, - {file = "fastavro-1.4.10-cp39-cp39-win_amd64.whl", hash = "sha256:64cbd386e408b3bcb2de53b1f847163073eb0d0d0338db65f76051c6ba9a9bc1"}, - {file = "fastavro-1.4.10.tar.gz", hash = "sha256:a24f9dd803c44bfb599476b000f9bd0088f7ac2401e6c20818f38d8af12785a0"}, -] -filelock = [ - {file = "filelock-3.6.0-py3-none-any.whl", hash = "sha256:f8314284bfffbdcfa0ff3d7992b023d4c628ced6feb957351d4c48d059f56bc0"}, - {file = "filelock-3.6.0.tar.gz", hash = "sha256:9cd540a9352e432c7246a48fe4e8712b10acb1df2ad1f30e8c070b82ae1fed85"}, + {file = "fastavro-1.4.11-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:44f01008f95d685edacc4b10366c755d25612df00924349f7d34a29f08522ce3"}, + {file = "fastavro-1.4.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18f5e736d12e67348f253da8a332d7c3b483ca04f2b6e772befa79d1a46bac9d"}, + {file = "fastavro-1.4.11-cp310-cp310-win_amd64.whl", hash = "sha256:8dca11bc3191cd7de0a3c4b76a70dac493356a219e96ebcde0def1f06faddef7"}, + {file = "fastavro-1.4.11-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:7a2a0bf03686f9d860e8f8476be000f5b3e6cc9af6853dbabab2ef9cfa5dc3a0"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c17e3decfac260e1be4d02d1903d2483eec2f3ce7f92c9b808a0f6a81572c4b"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19ba25c6529f50722a7618cc4ca24c7d265def57fd9f94e4e554e1df8cce38d2"}, + {file = "fastavro-1.4.11-cp37-cp37m-win_amd64.whl", hash = "sha256:ceaba04da9419f40899a670eb62eb373a127b511bb8e3ae4f6f1f23ec49bd0e4"}, + {file = "fastavro-1.4.11-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:732eab3a1ae5d2c3f4b52e747c55bcc41c4df0eb7e8a395038080741a3c0a934"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c03d3c802b71f44e7b3442abae961bba996258244bd222b242ad1e5cb7754e57"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cb7475a9b25b9f8aebe7eb756dafedd0369434571062f3883d894281befd7c"}, + {file = "fastavro-1.4.11-cp38-cp38-win_amd64.whl", hash = "sha256:ce0776f54591aef90bcd02bd919964abe4c2ad2a10a4336c3a1b66cef289b41c"}, + {file = "fastavro-1.4.11-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:621e72cc365c9539d7590e7b43e48a62e6bfb4c2de7c16837fed54d113d7312c"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:842b25782f911ee8c626f9d9fedc2ef01aeac272536fe90ee6d45b2ae7cdb024"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8491bfcba25c9d661289f884688e5a4f56f2ee389a240d0ad02692495a9a087"}, + {file = "fastavro-1.4.11-cp39-cp39-win_amd64.whl", hash = "sha256:c94130a8c8d80073eb0276844915aa5e928ae322024e76dc57943542ccda211c"}, + {file = "fastavro-1.4.11.tar.gz", hash = "sha256:7c64332ad52de0134be9a933ca986514c3ff85c63d54bc5398c31f0498ac1820"}, ] flake8 = [ {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, ] -identify = [ - {file = "identify-2.4.12-py2.py3-none-any.whl", hash = "sha256:5f06b14366bd1facb88b00540a1de05b69b310cbc2654db3c7e07fa3a4339323"}, - {file = "identify-2.4.12.tar.gz", hash = "sha256:3f3244a559290e7d3deb9e9adc7b33594c1bc85a9dd82e0f1be519bf12a1ec17"}, -] -idna = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, -] -imagesize = [ - {file = "imagesize-1.3.0-py2.py3-none-any.whl", hash = "sha256:1db2f82529e53c3e929e8926a1fa9235aa82d0bd0c580359c67ec31b2fddaa8c"}, - {file = "imagesize-1.3.0.tar.gz", hash = "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d"}, -] -importlib-metadata = [ - {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, - {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, -] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, @@ -1043,134 +519,47 @@ isort = [ {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, ] -jinja2 = [ - {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"}, - {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"}, -] -lmdb = [ - {file = "lmdb-1.3.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:63cb73fe7ce9eb93d992d632c85a0476b4332670d9e6a2802b5062f603b7809f"}, - {file = "lmdb-1.3.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:abbc439cd9fe60ffd6197009087ea885ac150017dc85384093b1d376f83f0ec4"}, - {file = "lmdb-1.3.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6260a526e4ad85b1f374a5ba9475bf369fb07e7728ea6ec57226b02c40d1976b"}, - {file = "lmdb-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e568ae0887ae196340947d9800136e90feaed6b86a261ef01f01b2ba65fc8106"}, - {file = "lmdb-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6a816954d212f40fd15007cd81ab7a6bebb77436d949a6a9ae04af57fc127f3"}, - {file = "lmdb-1.3.0-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:fa6439356e591d3249ab0e1778a6f8d8408e993f66dc911914c78208f5310309"}, - {file = "lmdb-1.3.0-cp35-cp35m-win_amd64.whl", hash = "sha256:c6adbd6f7f9048e97f31a069e652eb51020a81e80a0ce92dbb9810d21da2409a"}, - {file = "lmdb-1.3.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:eefb392f6b5cd43aada49258c5a79be11cb2c8cd3fc3e2d9319a1e0b9f906458"}, - {file = "lmdb-1.3.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a14aca2651c3af6f0d0a6b9168200eea0c8f2d27c40b01a442f33329a6e8dff"}, - {file = "lmdb-1.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cfa4aa9c67f8aee89b23005e98d1f3f32490b6b905fd1cb604b207cbd5755ab"}, - {file = "lmdb-1.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7da05d70fcc6561ac6b09e9fb1bf64b7ca294652c64c8a2889273970cee796b9"}, - {file = "lmdb-1.3.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:008243762decf8f6c90430a9bced56290ebbcdb5e877d90e42343bb97033e494"}, - {file = "lmdb-1.3.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:17215a42a4b9814c383deabecb160581e4fb75d00198eef0e3cea54f230ffbea"}, - {file = "lmdb-1.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65334eafa5d430b18d81ebd5362559a41483c362e1931f6e1b15bab2ecb7d75d"}, - {file = "lmdb-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:18c69fabdaf04efaf246587739cc1062b3e57c6ef0743f5c418df89e5e7e7b9b"}, - {file = "lmdb-1.3.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:41318717ab5d15ad2d6d263d34fbf614a045210f64b25e59ce734bb2105e421f"}, - {file = "lmdb-1.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:df2724bad7820114a205472994091097d0fa65a3e5fff5a8e688d123fb8c6326"}, - {file = "lmdb-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ddd590e1c7fcb395931aa3782fb89b9db4550ab2d81d006ecd239e0d462bc41"}, - {file = "lmdb-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:4172fba19417d7b29409beca7d73c067b54e5d8ab1fb9b51d7b4c1445d20a167"}, - {file = "lmdb-1.3.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2df38115dd9428a54d59ae7c712a4c7cce0d6b1d66056de4b1a8c38718066106"}, - {file = "lmdb-1.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d9103aa4908f0bca43c5911ca067d4e3d01f682dff0c0381a1239bd2bd757984"}, - {file = "lmdb-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:394df860c3f93cfd92b6f4caba785f38208cc9614c18b3803f83a2cc1695042f"}, - {file = "lmdb-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:62ab28e3593bdc318ea2f2fa1574e5fca3b6d1f264686d773ba54a637d4f563b"}, - {file = "lmdb-1.3.0-pp27-pypy_73-macosx_10_7_x86_64.whl", hash = "sha256:e6a704b3baced9182836c7f77b769f23856f3a8f62d0282b1bc1feaf81a86712"}, - {file = "lmdb-1.3.0-pp27-pypy_73-win_amd64.whl", hash = "sha256:08f4b5129f4683802569b02581142e415c8dcc0ff07605983ec1b07804cecbad"}, - {file = "lmdb-1.3.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:f291e3f561f58dddf63a92a5a6a4b8af3a0920b6705d35e2f80e52e86ee238a2"}, - {file = "lmdb-1.3.0.tar.gz", hash = "sha256:60a11efc21aaf009d06518996360eed346f6000bfc9de05114374230879f992e"}, -] -m2r2 = [ - {file = "m2r2-0.3.2-py3-none-any.whl", hash = "sha256:d3684086b61b4bebe2307f15189495360f05a123c9bda2a66462649b7ca236aa"}, - {file = "m2r2-0.3.2.tar.gz", hash = "sha256:ccd95b052dcd1ac7442ecb3111262b2001c10e4119b459c34c93ac7a5c2c7868"}, -] -markupsafe = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, -] mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] -mistune = [ - {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, - {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, -] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] -nodeenv = [ - {file = "nodeenv-1.6.0-py2.py3-none-any.whl", hash = "sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"}, - {file = "nodeenv-1.6.0.tar.gz", hash = "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b"}, -] orjson = [ - {file = "orjson-3.6.7-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:93188a9d6eb566419ad48befa202dfe7cd7a161756444b99c4ec77faea9352a4"}, - {file = "orjson-3.6.7-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:82515226ecb77689a029061552b5df1802b75d861780c401e96ca6bc8495f775"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3af57ffab7848aaec6ba6b9e9b41331250b57bf696f9d502bacdc71a0ebab0ba"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:a7297504d1142e7efa236ffc53f056d73934a993a08646dbcee89fc4308a8fcf"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:5a50cde0dbbde255ce751fd1bca39d00ecd878ba0903c0480961b31984f2fab7"}, - {file = "orjson-3.6.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d21f9a2d1c30e58070f93988db4cad154b9009fafbde238b52c1c760e3607fbe"}, - {file = "orjson-3.6.7-cp310-none-win_amd64.whl", hash = "sha256:e152464c4606b49398afd911777decebcf9749cc8810c5b4199039e1afb0991e"}, - {file = "orjson-3.6.7-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:0a65f3c403f38b0117c6dd8e76e85a7bd51fcd92f06c5598dfeddbc44697d3e5"}, - {file = "orjson-3.6.7-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:6c47cfca18e41f7f37b08ff3e7abf5ada2d0f27b5ade934f05be5fc5bb956e9d"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:63185af814c243fad7a72441e5f98120c9ecddf2675befa486d669fb65539e9b"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2da6fde42182b80b40df2e6ab855c55090ebfa3fcc21c182b7ad1762b61d55c"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:48c5831ec388b4e2682d4ff56d6bfa4a2ef76c963f5e75f4ff4785f9cf338a80"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:913fac5d594ccabf5e8fbac15b9b3bb9c576d537d49eeec9f664e7a64dde4c4b"}, - {file = "orjson-3.6.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:58f244775f20476e5851e7546df109f75160a5178d44257d437ba6d7e562bfe8"}, - {file = "orjson-3.6.7-cp37-none-win_amd64.whl", hash = "sha256:2d5f45c6b85e5f14646df2d32ecd7ff20fcccc71c0ea1155f4d3df8c5299bbb7"}, - {file = "orjson-3.6.7-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:612d242493afeeb2068bc72ff2544aa3b1e627578fcf92edee9daebb5893ffea"}, - {file = "orjson-3.6.7-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:539cdc5067db38db27985e257772d073cd2eb9462d0a41bde96da4e4e60bd99b"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6d103b721bbc4f5703f62b3882e638c0b65fcdd48622531c7ffd45047ef8e87c"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb10a20f80e95102dd35dfbc3a22531661b44a09b55236b012a446955846b023"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:bb68d0da349cf8a68971a48ad179434f75256159fe8b0715275d9b49fa23b7a3"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:4a2c7d0a236aaeab7f69c17b7ab4c078874e817da1bfbb9827cb8c73058b3050"}, - {file = "orjson-3.6.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3be045ca3b96119f592904cf34b962969ce97bd7843cbfca084009f6c8d2f268"}, - {file = "orjson-3.6.7-cp38-none-win_amd64.whl", hash = "sha256:bd765c06c359d8a814b90f948538f957fa8a1f55ad1aaffcdc5771996aaea061"}, - {file = "orjson-3.6.7-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:7dd9e1e46c0776eee9e0649e3ae9584ea368d96851bcaeba18e217fa5d755283"}, - {file = "orjson-3.6.7-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:c4b4f20a1e3df7e7c83717aff0ef4ab69e42ce2fb1f5234682f618153c458406"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7107a5673fd0b05adbb58bf71c1578fc84d662d29c096eb6d998982c8635c221"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a08b6940dd9a98ccf09785890112a0f81eadb4f35b51b9a80736d1725437e22c"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:f5d1648e5a9d1070f3628a69a7c6c17634dbb0caf22f2085eca6910f7427bf1f"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:e6201494e8dff2ce7fd21da4e3f6dfca1a3fed38f9dcefc972f552f6596a7621"}, - {file = "orjson-3.6.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:70d0386abe02879ebaead2f9632dd2acb71000b4721fd8c1a2fb8c031a38d4d5"}, - {file = "orjson-3.6.7-cp39-none-win_amd64.whl", hash = "sha256:d9a3288861bfd26f3511fb4081561ca768674612bac59513cb9081bb61fcc87f"}, - {file = "orjson-3.6.7.tar.gz", hash = "sha256:a4bb62b11289b7620eead2f25695212e9ac77fcfba76f050fa8a540fb5c32401"}, + {file = "orjson-3.6.8-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:3a287a650458de2211db03681b71c3e5cb2212b62f17a39df8ad99fc54855d0f"}, + {file = "orjson-3.6.8-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:5204e25c12cea58e524fc82f7c27ed0586f592f777b33075a92ab7b3eb3687c2"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77e8386393add64f959c044e0fb682364fd0e611a6f477aa13f0e6a733bd6a28"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:279f2d2af393fdf8601020744cb206b91b54ad60fb8401e0761819c7bda1f4e4"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:c31c9f389be7906f978ed4192eb58a4b74a37ad60556a0b88ddc47c576697770"}, + {file = "orjson-3.6.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0db5c5a0c5b89f092d52f6e5a3701660a9d6ffa9e2968b3ce17c2bc4f5eb0414"}, + {file = "orjson-3.6.8-cp310-none-win_amd64.whl", hash = "sha256:eb22485847b9a0c4bbedc668df860126ac931edbed1d456cf41a59f3cb961ed8"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:1a5fe569310bc819279bd4d5f2c349910b104ed3207936246dd5d5e0b085e74a"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:ccb356a47ab1067cd3549847e9db1d279a63fe0482d315b3ffd6e7abef35ef77"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab29c069c222248ce302a25855b4e1664f9436e8ae5a131fb0859daf31676d2b"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2b5e4cba9e774ac011071d9d27760f97f4b8cd46003e971d122e712f971345"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:c311ec504414d22834d5b972a209619925b48263856a11a14d90230f9682d49c"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:a3dfec7950b90fb8d143743503ee53fa06b32e6068bdea792fc866284da3d71d"}, + {file = "orjson-3.6.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b890dbbada2cbb26eb29bd43a848426f007f094bb0758df10dfe7a438e1cb4b4"}, + {file = "orjson-3.6.8-cp37-none-win_amd64.whl", hash = "sha256:9143ae2c52771525be9ad11a7a8cc8e7fd75391b107e7e644a9e0050496f6b4f"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:33a82199fd42f6436f833e210ae5129c922a5c355629356ca7a8e82964da7285"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:90159ea8b9a5a2a98fa33dc7b421cfac4d2ae91ba5e1058f5909e7f059f6b467"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:656fbe15d9ef0733e740d9def78f4fdb4153102f4836ee774a05123499005931"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7be3be6153843e0f01351b1313a5ad4723595427680dac2dfff22a37e652ce02"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:dd24f66b6697ee7424f7da575ec6cbffc8ede441114d53470949cda4d97c6e56"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:b07c780f7345ecf5901356dc21dee0669defc489c38ce7b9ab0f5e008cc0385c"}, + {file = "orjson-3.6.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ea32015a5d8a4ce00d348a0de5dc7040e0ad58f970a8fcbb5713a1eac129e493"}, + {file = "orjson-3.6.8-cp38-none-win_amd64.whl", hash = "sha256:c5a3e382194c838988ec128a26b08aa92044e5e055491cc4056142af0c1c54d7"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:83a8424e857ae1bf53530e88b4eb2f16ca2b489073b924e655f1575cacd7f52a"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:81e1a6a2d67f15007dadacbf9ba5d3d79237e5e33786c028557fe5a2b72f1c9a"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:137b539881c77866eba86ff6a11df910daf2eb9ab8f1acae62f879e83d7c38af"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cbd358f3b3ad539a27e36900e8e7d172d0e1b72ad9dd7d69544dcbc0f067ee7"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:6ab94701542d40b90903ecfc339333f458884979a01cb9268bc662cc67a5f6d8"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:32b6f26593a9eb606b40775826beb0dac152e3d224ea393688fced036045a821"}, + {file = "orjson-3.6.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:afd9e329ebd3418cac3cd747769b1d52daa25fa672bbf414ab59f0e0881b32b9"}, + {file = "orjson-3.6.8-cp39-none-win_amd64.whl", hash = "sha256:0c89b419914d3d1f65a1b0883f377abe42a6e44f6624ba1c63e8846cbfc2fa60"}, + {file = "orjson-3.6.8.tar.gz", hash = "sha256:e19d23741c5de13689bb316abfccea15a19c264e3ec8eb332a5319a583595ace"}, ] packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, @@ -1180,80 +569,14 @@ pathspec = [ {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, ] -pbr = [ - {file = "pbr-5.8.1-py2.py3-none-any.whl", hash = "sha256:27108648368782d07bbf1cb468ad2e2eeef29086affd14087a6d04b7de8af4ec"}, - {file = "pbr-5.8.1.tar.gz", hash = "sha256:66bc5a34912f408bb3925bf21231cb6f59206267b7f63f3503ef865c1a292e25"}, -] platformdirs = [ - {file = "platformdirs-2.5.1-py3-none-any.whl", hash = "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"}, - {file = "platformdirs-2.5.1.tar.gz", hash = "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d"}, + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, ] pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] -pre-commit = [ - {file = "pre_commit-2.17.0-py2.py3-none-any.whl", hash = "sha256:725fa7459782d7bec5ead072810e47351de01709be838c2ce1726b9591dad616"}, - {file = "pre_commit-2.17.0.tar.gz", hash = "sha256:c1a8040ff15ad3d648c70cc3e55b93e4d2d5b687320955505587fd79bbaed06a"}, -] -psycopg2-binary = [ - {file = "psycopg2-binary-2.9.3.tar.gz", hash = "sha256:761df5313dc15da1502b21453642d7599d26be88bff659382f8f9747c7ebea4e"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:539b28661b71da7c0e428692438efbcd048ca21ea81af618d845e06ebfd29478"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e82d38390a03da28c7985b394ec3f56873174e2c88130e6966cb1c946508e65"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57804fc02ca3ce0dbfbef35c4b3a4a774da66d66ea20f4bda601294ad2ea6092"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:083a55275f09a62b8ca4902dd11f4b33075b743cf0d360419e2051a8a5d5ff76"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_24_ppc64le.whl", hash = "sha256:0a29729145aaaf1ad8bafe663131890e2111f13416b60e460dae0a96af5905c9"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a79d622f5206d695d7824cbf609a4f5b88ea6d6dab5f7c147fc6d333a8787e4"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:090f3348c0ab2cceb6dfbe6bf721ef61262ddf518cd6cc6ecc7d334996d64efa"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a9e1f75f96ea388fbcef36c70640c4efbe4650658f3d6a2967b4cc70e907352e"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c3ae8e75eb7160851e59adc77b3a19a976e50622e44fd4fd47b8b18208189d42"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-win32.whl", hash = "sha256:7b1e9b80afca7b7a386ef087db614faebbf8839b7f4db5eb107d0f1a53225029"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:8b344adbb9a862de0c635f4f0425b7958bf5a4b927c8594e6e8d261775796d53"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:e847774f8ffd5b398a75bc1c18fbb56564cda3d629fe68fd81971fece2d3c67e"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68641a34023d306be959101b345732360fc2ea4938982309b786f7be1b43a4a1"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3303f8807f342641851578ee7ed1f3efc9802d00a6f83c101d21c608cb864460"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_24_aarch64.whl", hash = "sha256:e3699852e22aa68c10de06524a3721ade969abf382da95884e6a10ff798f9281"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_24_ppc64le.whl", hash = "sha256:526ea0378246d9b080148f2d6681229f4b5964543c170dd10bf4faaab6e0d27f"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:b1c8068513f5b158cf7e29c43a77eb34b407db29aca749d3eb9293ee0d3103ca"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:15803fa813ea05bef089fa78835118b5434204f3a17cb9f1e5dbfd0b9deea5af"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:152f09f57417b831418304c7f30d727dc83a12761627bb826951692cc6491e57"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:404224e5fef3b193f892abdbf8961ce20e0b6642886cfe1fe1923f41aaa75c9d"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-win32.whl", hash = "sha256:1f6b813106a3abdf7b03640d36e24669234120c72e91d5cbaeb87c5f7c36c65b"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:2d872e3c9d5d075a2e104540965a1cf898b52274a5923936e5bfddb58c59c7c2"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:10bb90fb4d523a2aa67773d4ff2b833ec00857f5912bafcfd5f5414e45280fb1"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a52ecab70af13e899f7847b3e074eeb16ebac5615665db33bce8a1009cf33"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a29b3ca4ec9defec6d42bf5feb36bb5817ba3c0230dd83b4edf4bf02684cd0ae"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:12b11322ea00ad8db8c46f18b7dfc47ae215e4df55b46c67a94b4effbaec7094"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_24_ppc64le.whl", hash = "sha256:53293533fcbb94c202b7c800a12c873cfe24599656b341f56e71dd2b557be063"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c381bda330ddf2fccbafab789d83ebc6c53db126e4383e73794c74eedce855ef"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9d29409b625a143649d03d0fd7b57e4b92e0ecad9726ba682244b73be91d2fdb"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:183a517a3a63503f70f808b58bfbf962f23d73b6dccddae5aa56152ef2bcb232"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:15c4e4cfa45f5a60599d9cec5f46cd7b1b29d86a6390ec23e8eebaae84e64554"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-win32.whl", hash = "sha256:adf20d9a67e0b6393eac162eb81fb10bc9130a80540f4df7e7355c2dd4af9fba"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2f9ffd643bc7349eeb664eba8864d9e01f057880f510e4681ba40a6532f93c71"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:def68d7c21984b0f8218e8a15d514f714d96904265164f75f8d3a70f9c295667"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dffc08ca91c9ac09008870c9eb77b00a46b3378719584059c034b8945e26b272"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:280b0bb5cbfe8039205c7981cceb006156a675362a00fe29b16fbc264e242834"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:af9813db73395fb1fc211bac696faea4ca9ef53f32dc0cfa27e4e7cf766dcf24"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_24_ppc64le.whl", hash = "sha256:63638d875be8c2784cfc952c9ac34e2b50e43f9f0a0660b65e2a87d656b3116c"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ffb7a888a047696e7f8240d649b43fb3644f14f0ee229077e7f6b9f9081635bd"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0c9d5450c566c80c396b7402895c4369a410cab5a82707b11aee1e624da7d004"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:d1c1b569ecafe3a69380a94e6ae09a4789bbb23666f3d3a08d06bbd2451f5ef1"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8fc53f9af09426a61db9ba357865c77f26076d48669f2e1bb24d85a22fb52307"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-win32.whl", hash = "sha256:6472a178e291b59e7f16ab49ec8b4f3bdada0a879c68d3817ff0963e722a82ce"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:35168209c9d51b145e459e05c31a9eaeffa9a6b0fd61689b48e07464ffd1a83e"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:47133f3f872faf28c1e87d4357220e809dfd3fa7c64295a4a148bcd1e6e34ec9"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91920527dea30175cc02a1099f331aa8c1ba39bf8b7762b7b56cbf54bc5cce42"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:887dd9aac71765ac0d0bac1d0d4b4f2c99d5f5c1382d8b770404f0f3d0ce8a39"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:1f14c8b0942714eb3c74e1e71700cbbcb415acbc311c730370e70c578a44a25c"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_24_ppc64le.whl", hash = "sha256:7af0dd86ddb2f8af5da57a976d27cd2cd15510518d582b478fbb2292428710b4"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:93cd1967a18aa0edd4b95b1dfd554cf15af657cb606280996d393dadc88c3c35"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bda845b664bb6c91446ca9609fc69f7db6c334ec5e4adc87571c34e4f47b7ddb"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:01310cf4cf26db9aea5158c217caa92d291f0500051a6469ac52166e1a16f5b7"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:99485cab9ba0fa9b84f1f9e1fef106f44a46ef6afdeec8885e0b88d0772b49e8"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-win32.whl", hash = "sha256:46f0e0a6b5fa5851bbd9ab1bc805eef362d3a230fbdfbc209f4a236d0a7a990d"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:accfe7e982411da3178ec690baaceaad3c278652998b2c45828aaac66cd8285f"}, -] py = [ {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, @@ -1266,21 +589,13 @@ pyflakes = [ {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, ] -pygments = [ - {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"}, - {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"}, -] pyparsing = [ - {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"}, - {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, ] pytest = [ - {file = "pytest-7.1.1-py3-none-any.whl", hash = "sha256:92f723789a8fdd7180b6b06483874feca4c48a5c76968e03bb3e7f806a1869ea"}, - {file = "pytest-7.1.1.tar.gz", hash = "sha256:841132caef6b1ad17a9afde46dc4f6cfa59a05f9555aae5151f73bdf2820ca63"}, -] -pytz = [ - {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"}, - {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"}, + {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, + {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"}, ] pyyaml = [ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, @@ -1317,73 +632,17 @@ pyyaml = [ {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] -requests = [ - {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, - {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, -] six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] -snowballstemmer = [ - {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, - {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, -] -sphinx = [ - {file = "Sphinx-4.5.0-py3-none-any.whl", hash = "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226"}, - {file = "Sphinx-4.5.0.tar.gz", hash = "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6"}, -] -sphinx-autodoc-typehints = [ - {file = "sphinx_autodoc_typehints-1.17.0-py3-none-any.whl", hash = "sha256:081daf53077b4ae1c28347d6d858e13e63aefe3b4aacef79fd717dd60687b470"}, - {file = "sphinx_autodoc_typehints-1.17.0.tar.gz", hash = "sha256:51c7b3f5cb9ccd15d0b52088c62df3094f1abd9612930340365c26def8629a14"}, -] -sphinx-rtd-theme = [ - {file = "sphinx_rtd_theme-1.0.0-py2.py3-none-any.whl", hash = "sha256:4d35a56f4508cfee4c4fb604373ede6feae2a306731d533f409ef5c3496fdbd8"}, - {file = "sphinx_rtd_theme-1.0.0.tar.gz", hash = "sha256:eec6d497e4c2195fa0e8b2016b337532b8a699a68bcb22a512870e16925c6a5c"}, -] -sphinxcontrib-apidoc = [ - {file = "sphinxcontrib-apidoc-0.3.0.tar.gz", hash = "sha256:729bf592cf7b7dd57c4c05794f732dc026127275d785c2a5494521fdde773fb9"}, - {file = "sphinxcontrib_apidoc-0.3.0-py2.py3-none-any.whl", hash = "sha256:6671a46b2c6c5b0dca3d8a147849d159065e50443df79614f921b42fbd15cb09"}, -] -sphinxcontrib-applehelp = [ - {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, - {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, -] -sphinxcontrib-devhelp = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, -] -sphinxcontrib-htmlhelp = [ - {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, - {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, -] -sphinxcontrib-jsmath = [ - {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, - {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, -] -sphinxcontrib-qthelp = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, -] -sphinxcontrib-serializinghtml = [ - {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, - {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] tomli = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] typing-extensions = [ - {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, - {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, -] -urllib3 = [ - {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, - {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, + {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, + {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, ] uvloop = [ {file = "uvloop-0.16.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6224f1401025b748ffecb7a6e2652b17768f30b1a6a3f7b44660e5b5b690b12d"}, @@ -1403,11 +662,3 @@ uvloop = [ {file = "uvloop-0.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e5f2e2ff51aefe6c19ee98af12b4ae61f5be456cd24396953244a30880ad861"}, {file = "uvloop-0.16.0.tar.gz", hash = "sha256:f74bc20c7b67d1c27c72601c78cf95be99d5c2cdd4514502b4f3eb0933ff1228"}, ] -virtualenv = [ - {file = "virtualenv-20.14.0-py2.py3-none-any.whl", hash = "sha256:1e8588f35e8b42c6ec6841a13c5e88239de1e6e4e4cedfd3916b306dc826ec66"}, - {file = "virtualenv-20.14.0.tar.gz", hash = "sha256:8e5b402037287126e81ccde9432b95a8be5b19d36584f64957060a3488c11ca8"}, -] -zipp = [ - {file = "zipp-3.7.0-py3-none-any.whl", hash = "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375"}, - {file = "zipp-3.7.0.tar.gz", hash = "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d"}, -] diff --git a/packages/core/minos-microservice-common/pyproject.toml b/packages/core/minos-microservice-common/pyproject.toml index d453cf3ef..b98ed8919 100644 --- a/packages/core/minos-microservice-common/pyproject.toml +++ b/packages/core/minos-microservice-common/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "minos-microservice-common" -version = "0.6.1" +version = "0.7.0" description = "The common core of the Minos Framework" readme = "README.md" repository = "https://github.com/minos-framework/minos-python" @@ -21,38 +21,30 @@ keywords = [ "saga", ] packages = [ - { include = "minos" } + { include = "minos" }, ] include = [ - "AUTHORS.md", - "HISTORY.md", - "LICENSE", + { path = "AUTHORS.md", format = "sdist" }, + { path = "HISTORY.md", format = "sdist" }, + { path = "LICENSE", format = "sdist" }, ] [tool.poetry.dependencies] python = "^3.9" -aiomisc = ">=14.0.3,<16.0.0" +aiomisc = ">=14.0.3,<15.8.0" fastavro = "^1.4.0" orjson = "^3.5.2" -lmdb = "^1.2.1" PyYAML = ">=5.4.1,<7.0.0" -aiopg = "^1.2.1" dependency-injector = "^4.32.2" cached-property = "^1.5.2" uvloop = "^0.16.0" [tool.poetry.dev-dependencies] -black = "^22.1" +black = "^22.3" isort = "^5.8.0" pytest = "^7.0.1" coverage = "^6.3" flake8 = "^4.0.1" -Sphinx = "^4.0.1" -pre-commit = "^2.12.1" -sphinx-autodoc-typehints = "^1.17.0" -sphinxcontrib-apidoc = "^0.3.0" -sphinx-rtd-theme = "^1.0.0" -m2r2 = "^0.3.2" [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/packages/core/minos-microservice-common/tests/config/v1.yml b/packages/core/minos-microservice-common/tests/config/v1.yml index cf45e9211..950aaa4e1 100644 --- a/packages/core/minos-microservice-common/tests/config/v1.yml +++ b/packages/core/minos-microservice-common/tests/config/v1.yml @@ -19,6 +19,7 @@ service: - tests.utils.FakeSagaManager - tests.utils.FakeCustomInjection repository: + client: minos.common.testing.MockedDatabaseClient database: order_db user: minos password: min0s diff --git a/packages/core/minos-microservice-common/tests/config/v2.yml b/packages/core/minos-microservice-common/tests/config/v2.yml index 8c7771bd0..5222904d1 100644 --- a/packages/core/minos-microservice-common/tests/config/v2.yml +++ b/packages/core/minos-microservice-common/tests/config/v2.yml @@ -6,6 +6,7 @@ serializer: client: tests.utils.FakeSerializer databases: default: + client: minos.common.testing.MockedDatabaseClient database: order_db user: minos password: min0s @@ -14,6 +15,7 @@ databases: saga: path: "./order.lmdb" query: + client: minos.common.testing.MockedDatabaseClient database: order_query_db user: minos password: min0s diff --git a/packages/core/minos-microservice-common/tests/test_common/test_config/test_abc.py b/packages/core/minos-microservice-common/tests/test_common/test_config/test_abc.py index df62c39e0..1ae4ac008 100644 --- a/packages/core/minos-microservice-common/tests/test_common/test_config/test_abc.py +++ b/packages/core/minos-microservice-common/tests/test_common/test_config/test_abc.py @@ -18,7 +18,7 @@ MinosConfigException, ) from tests.utils import ( - CONFIG_FILE_PATH, + BASE_PATH, ) @@ -69,7 +69,8 @@ def _get_saga(self) -> dict[str, Any]: class TestConfig(unittest.TestCase): def setUp(self) -> None: super().setUp() - self.config = _Config(CONFIG_FILE_PATH) + self.file_path = BASE_PATH / "config" / "v1.yml" + self.config = _Config(self.file_path) def test_is_subclass(self): self.assertTrue(issubclass(Config, InjectableMixin)) @@ -78,10 +79,10 @@ def test_get_injectable_name(self): self.assertTrue("config", _Config.get_injectable_name()) def test_file_path(self): - self.assertEqual(CONFIG_FILE_PATH, self.config.file_path) + self.assertEqual(self.file_path, self.config.file_path) def test_file_path_from_str(self): - self.assertEqual(CONFIG_FILE_PATH, _Config(str(CONFIG_FILE_PATH)).file_path) + self.assertEqual(self.file_path, _Config(str(self.file_path)).file_path) def test_file_raises(self): with self.assertRaises(MinosConfigException): @@ -146,7 +147,8 @@ def test_get_database_unknown(self): mock = MagicMock(return_value={"default": "foo"}) self.config._get_databases = mock - self.assertEqual("foo", self.config.get_database_by_name("unknown")) + with self.assertRaises(MinosConfigException): + self.config.get_database_by_name("unknown") self.assertEqual([call()], mock.call_args_list) @@ -215,7 +217,7 @@ def test_get_saga(self): self.assertEqual([call()], mock.call_args_list) def test_new(self): - config = Config(CONFIG_FILE_PATH) + config = Config(self.file_path) self.assertIsInstance(config, ConfigV1) def test_new_raises(self): @@ -224,13 +226,17 @@ def test_new_raises(self): class TestMinosConfig(unittest.TestCase): + def setUp(self) -> None: + super().setUp() + self.file_path = BASE_PATH / "config" / "v1.yml" + def test_is_subclass(self): self.assertTrue(issubclass(MinosConfig, Config)) def test_warnings(self): with warnings.catch_warnings(): warnings.simplefilter("ignore", DeprecationWarning) - config = MinosConfig(CONFIG_FILE_PATH) + config = MinosConfig(self.file_path) self.assertIsInstance(config, Config) diff --git a/packages/core/minos-microservice-common/tests/test_common/test_config/test_v1/test_base.py b/packages/core/minos-microservice-common/tests/test_common/test_config/test_v1/test_base.py index f73eb24dc..8f9421473 100644 --- a/packages/core/minos-microservice-common/tests/test_common/test_config/test_v1/test_base.py +++ b/packages/core/minos-microservice-common/tests/test_common/test_config/test_v1/test_base.py @@ -7,6 +7,7 @@ Config, ConfigV1, MinosConfigException, + PoolFactory, ) from tests.utils import ( BASE_PATH, @@ -51,9 +52,7 @@ def test_name(self): def test_injections(self): expected = [ - FakeLockPool, - FakeDatabasePool, - FakeBrokerClientPool, + PoolFactory, FakeHttpConnector, FakeBrokerPublisher, FakeBrokerSubscriberBuilder, @@ -185,7 +184,15 @@ def test_interface_unknown(self): config.get_interface_by_name("unknown") def test_pools(self): - self.assertEqual(dict(), self.config.get_pools()) + expected = { + "factory": PoolFactory, + "types": { + "lock": FakeLockPool, + "database": FakeDatabasePool, + "broker": FakeBrokerClientPool, + }, + } + self.assertEqual(expected, self.config.get_pools()) def test_services(self): self.assertEqual([float, int], self.config.get_services()) diff --git a/packages/core/minos-microservice-common/tests/test_common/test_config/test_v2/test_base.py b/packages/core/minos-microservice-common/tests/test_common/test_config/test_v2/test_base.py index 2a565ab84..163d8b6d5 100644 --- a/packages/core/minos-microservice-common/tests/test_common/test_config/test_v2/test_base.py +++ b/packages/core/minos-microservice-common/tests/test_common/test_config/test_v2/test_base.py @@ -1,8 +1,4 @@ import unittest -from itertools import ( - chain, - cycle, -) from unittest.mock import ( patch, ) @@ -11,6 +7,7 @@ Config, ConfigV2, MinosConfigException, + PoolFactory, ) from tests.utils import ( BASE_PATH, @@ -60,9 +57,7 @@ def test_name(self): def test_injections(self): expected = [ - FakeLockPool, - FakeDatabasePool, - FakeBrokerClientPool, + PoolFactory, FakeHttpConnector, FakeBrokerPublisher, FakeBrokerSubscriberBuilder(FakeBrokerSubscriber), @@ -80,8 +75,7 @@ def test_injections_not_defined(self): self.assertEqual(list(), self.config.get_injections()) def test_injections_not_injectable(self): - side_effect = chain([{"client": "builtins.int"}], cycle([MinosConfigException("")])) - with patch.object(ConfigV2, "get_by_key", side_effect=side_effect): + with patch.object(ConfigV2, "_get_pools", return_value={"factory": int}): with self.assertRaises(MinosConfigException): self.config.get_injections() @@ -145,9 +139,12 @@ def test_interface_unknown(self): def test_pools(self): expected = { - "broker": FakeBrokerClientPool, - "database": FakeDatabasePool, - "lock": FakeLockPool, + "factory": PoolFactory, + "types": { + "broker": FakeBrokerClientPool, + "database": FakeDatabasePool, + "lock": FakeLockPool, + }, } self.assertEqual(expected, self.config.get_pools()) @@ -194,15 +191,6 @@ def test_database_default(self): self.assertEqual("localhost", database_config["host"]) self.assertEqual(5432, database_config["port"]) - def test_database_event(self): - config = ConfigV2(self.file_path, with_environment=False) - database_config = config.get_database_by_name("event") - self.assertEqual("order_db", database_config["database"]) - self.assertEqual("minos", database_config["user"]) - self.assertEqual("min0s", database_config["password"]) - self.assertEqual("localhost", database_config["host"]) - self.assertEqual(5432, database_config["port"]) - def test_database_query(self): config = ConfigV2(self.file_path, with_environment=False) query_database = config.get_database_by_name("query") @@ -212,24 +200,6 @@ def test_database_query(self): self.assertEqual("localhost", query_database["host"]) self.assertEqual(5432, query_database["port"]) - def test_database_snapshot(self): - config = ConfigV2(self.file_path, with_environment=False) - snapshot = config.get_database_by_name("snapshot") - self.assertEqual("order_db", snapshot["database"]) - self.assertEqual("minos", snapshot["user"]) - self.assertEqual("min0s", snapshot["password"]) - self.assertEqual("localhost", snapshot["host"]) - self.assertEqual(5432, snapshot["port"]) - - def test_database_broker(self): - config = ConfigV2(self.file_path, with_environment=False) - snapshot = config.get_database_by_name("broker") - self.assertEqual("order_db", snapshot["database"]) - self.assertEqual("minos", snapshot["user"]) - self.assertEqual("min0s", snapshot["password"]) - self.assertEqual("localhost", snapshot["host"]) - self.assertEqual(5432, snapshot["port"]) - def test_database_saga(self): config = ConfigV2(self.file_path, with_environment=False) saga = config.get_database_by_name("saga") diff --git a/packages/core/minos-microservice-common/tests/test_common/test_config/test_v2/test_parameterized.py b/packages/core/minos-microservice-common/tests/test_common/test_config/test_v2/test_parameterized.py index 57a9e24c6..742773958 100644 --- a/packages/core/minos-microservice-common/tests/test_common/test_config/test_v2/test_parameterized.py +++ b/packages/core/minos-microservice-common/tests/test_common/test_config/test_v2/test_parameterized.py @@ -6,18 +6,16 @@ from minos.common import ( ConfigV2, + PoolFactory, ) from tests.utils import ( BASE_PATH, - FakeBrokerClientPool, FakeBrokerPublisher, FakeBrokerSubscriber, FakeBrokerSubscriberBuilder, FakeCustomInjection, - FakeDatabasePool, FakeDiscoveryConnector, FakeEventRepository, - FakeLockPool, FakeSagaManager, FakeSnapshotRepository, FakeTransactionRepository, @@ -37,9 +35,7 @@ def test_injections_nones(self): config = ConfigV2(self.file_path, interfaces_http={"port": "tests.utils.FakeHttpPort"}) expected = [ - FakeLockPool, - FakeDatabasePool, - FakeBrokerClientPool, + PoolFactory, FakeBrokerPublisher, FakeBrokerSubscriberBuilder(FakeBrokerSubscriber), FakeEventRepository, diff --git a/packages/core/minos-microservice-common/tests/test_common/test_database/test_abc.py b/packages/core/minos-microservice-common/tests/test_common/test_database/test_abc.py deleted file mode 100644 index ff3629df0..000000000 --- a/packages/core/minos-microservice-common/tests/test_common/test_database/test_abc.py +++ /dev/null @@ -1,107 +0,0 @@ -import sys -import unittest - -import aiopg - -from minos.common import ( - DependencyInjector, - PostgreSqlMinosDatabase, - PostgreSqlPool, -) -from minos.common.testing import ( - PostgresAsyncTestCase, -) -from tests.utils import ( - CONFIG_FILE_PATH, -) - - -class TestPostgreSqlMinosDatabase(PostgresAsyncTestCase): - CONFIG_FILE_PATH = CONFIG_FILE_PATH - - def test_constructor(self): - pool = PostgreSqlMinosDatabase("foo") - self.assertEqual("foo", pool.database) - self.assertEqual("postgres", pool.user) - self.assertEqual("", pool.password) - self.assertEqual("localhost", pool.host) - self.assertEqual(5432, pool.port) - - def test_constructor_extended(self): - database = PostgreSqlMinosDatabase(**self.repository_db) - self.assertEqual(self.repository_db["host"], database.host) - self.assertEqual(self.repository_db["port"], database.port) - self.assertEqual(self.repository_db["database"], database.database) - self.assertEqual(self.repository_db["user"], database.user) - self.assertEqual(self.repository_db["password"], database.password) - - async def test_pool(self): - async with PostgreSqlMinosDatabase(**self.repository_db) as database: - self.assertIsInstance(database.pool, PostgreSqlPool) - - async def test_pool_with_dependency_injections(self): - injector = DependencyInjector(self.config, [PostgreSqlPool]) - await injector.wire_and_setup_injections(modules=[sys.modules[__name__]]) - - async with PostgreSqlMinosDatabase(**self.repository_db) as database: - self.assertEqual(injector.postgresql_pool, database.pool) - - await injector.unwire_and_destroy_injections() - - async def test_submit_query(self): - async with PostgreSqlMinosDatabase(**self.repository_db) as database: - await database.submit_query("CREATE TABLE foo (id INT NOT NULL);") - - async with aiopg.connect(**self.repository_db) as connection: - async with connection.cursor() as cursor: - await cursor.execute("SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'foo');") - self.assertTrue((await cursor.fetchone())[0]) - - async def test_submit_query_locked(self): - async with PostgreSqlMinosDatabase(**self.repository_db) as database: - await database.submit_query("CREATE TABLE foo (id INT NOT NULL);", lock=1234) - - async with aiopg.connect(**self.repository_db) as connection: - async with connection.cursor() as cursor: - await cursor.execute("SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'foo');") - self.assertTrue((await cursor.fetchone())[0]) - - async def test_submit_query_and_fetchone(self): - async with PostgreSqlMinosDatabase(**self.repository_db) as database: - await database.submit_query("CREATE TABLE foo (id INT NOT NULL);") - await database.submit_query("INSERT INTO foo (id) VALUES (3), (4), (5);") - - observed = await database.submit_query_and_fetchone("SELECT * FROM foo;") - - self.assertEqual((3,), observed) - - async def test_submit_query_and_iter(self): - async with PostgreSqlMinosDatabase(**self.repository_db) as database: - await database.submit_query("CREATE TABLE foo (id INT NOT NULL);") - await database.submit_query("INSERT INTO foo (id) VALUES (3), (4), (5);") - - observed = [v async for v in database.submit_query_and_iter("SELECT * FROM foo;")] - - self.assertEqual([(3,), (4,), (5,)], observed) - - async def test_submit_query_and_iter_streaming_mode_true(self): - async with PostgreSqlMinosDatabase(**self.repository_db) as database: - await database.submit_query("CREATE TABLE foo (id INT NOT NULL);") - await database.submit_query("INSERT INTO foo (id) VALUES (3), (4), (5);") - - observed = [v async for v in database.submit_query_and_iter("SELECT * FROM foo;", streaming_mode=True)] - - self.assertEqual([(3,), (4,), (5,)], observed) - - async def test_submit_query_and_iter_locked(self): - async with PostgreSqlMinosDatabase(**self.repository_db) as database: - await database.submit_query("CREATE TABLE foo (id INT NOT NULL);") - await database.submit_query("INSERT INTO foo (id) VALUES (3), (4), (5);") - - observed = [v async for v in database.submit_query_and_iter("SELECT * FROM foo;", lock=1234)] - - self.assertEqual([(3,), (4,), (5,)], observed) - - -if __name__ == "__main__": - unittest.main() diff --git a/packages/core/minos-microservice-common/tests/test_common/test_database/test_clients/__init__.py b/packages/core/minos-microservice-common/tests/test_common/test_database/test_clients/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/core/minos-microservice-common/tests/test_common/test_database/test_clients/test_abc.py b/packages/core/minos-microservice-common/tests/test_common/test_database/test_clients/test_abc.py new file mode 100644 index 000000000..70dc2207a --- /dev/null +++ b/packages/core/minos-microservice-common/tests/test_common/test_database/test_clients/test_abc.py @@ -0,0 +1,250 @@ +import unittest +from abc import ( + ABC, +) +from typing import ( + Any, + AsyncIterator, +) +from unittest.mock import ( + AsyncMock, + MagicMock, + call, + patch, +) + +from minos.common import ( + BuildableMixin, + ComposedDatabaseOperation, + DatabaseClient, + DatabaseClientBuilder, + DatabaseLock, + DatabaseOperation, + DatabaseOperationFactory, + LockDatabaseOperationFactory, + ProgrammingException, +) +from tests.utils import ( + CommonTestCase, + FakeAsyncIterator, +) + + +class _DatabaseClient(DatabaseClient): + """For testing purposes.""" + + async def _reset(self, **kwargs) -> None: + """For testing purposes.""" + + async def _execute(self, *args, **kwargs) -> None: + """For testing purposes.""" + + def _fetch_all(self, *args, **kwargs) -> AsyncIterator[Any]: + """For testing purposes.""" + + +class _DatabaseOperation(DatabaseOperation): + """For testing purposes.""" + + +class _DatabaseOperationFactory(DatabaseOperationFactory): + """For testing purposes.""" + + +class _DatabaseOperationFactoryImpl(_DatabaseOperationFactory): + """For testing purposes.""" + + +class _LockDatabaseOperationFactory(LockDatabaseOperationFactory): + """For testing purposes.""" + + def build_acquire(self, hashed_key: int) -> DatabaseOperation: + """For testing purposes.""" + return _DatabaseOperation() + + def build_release(self, hashed_key: int) -> DatabaseOperation: + """For testing purposes.""" + return _DatabaseOperation() + + +_DatabaseClient.set_factory(LockDatabaseOperationFactory, _LockDatabaseOperationFactory) + + +class TestDatabaseClient(CommonTestCase): + def test_abstract(self): + self.assertTrue(issubclass(DatabaseClient, (ABC, BuildableMixin))) + expected = {"_execute", "_fetch_all", "_reset"} + # noinspection PyUnresolvedReferences + self.assertEqual(expected, DatabaseClient.__abstractmethods__) + + def test_get_builder(self): + self.assertIsInstance(DatabaseClient.get_builder(), DatabaseClientBuilder) + + def test_from_config(self): + client = _DatabaseClient.from_config(self.config) + self.assertIsInstance(client, DatabaseClient) + + async def test_is_valid(self): + mock = AsyncMock(side_effect=[True, False]) + client = _DatabaseClient() + client._is_valid = mock + + self.assertEqual(True, await client.is_valid()) + self.assertEqual(False, await client.is_valid()) + + self.assertEqual([call(), call()], mock.call_args_list) + + async def test_lock(self): + _DatabaseClient.set_factory(LockDatabaseOperationFactory, _LockDatabaseOperationFactory) + op1 = _DatabaseOperation(lock="foo") + client = _DatabaseClient() + self.assertIsNone(client.lock) + async with client: + self.assertIsNone(client.lock) + await client.execute(op1) + self.assertIsInstance(client.lock, DatabaseLock) + + self.assertIsNone(client.lock) + + async def test_lock_reset(self): + op1 = _DatabaseOperation(lock="foo") + async with _DatabaseClient() as client: + await client.execute(op1) + self.assertIsInstance(client.lock, DatabaseLock) + await client.reset() + self.assertIsNone(client.lock) + + async def test_reset(self): + mock = AsyncMock() + client = _DatabaseClient() + client._reset = mock + + await client.reset() + + self.assertEqual([call()], mock.call_args_list) + + async def test_execute(self): + mock = AsyncMock() + client = _DatabaseClient() + client._execute = mock + operation = _DatabaseOperation() + await client.execute(operation) + + self.assertEqual([call(operation)], mock.call_args_list) + + async def test_execute_composed(self): + client = _DatabaseClient() + mock = AsyncMock(side_effect=client.execute) + client.execute = mock + composed = ComposedDatabaseOperation([_DatabaseOperation(), _DatabaseOperation()]) + await client.execute(composed) + + self.assertEqual( + [call(composed), call(composed.operations[0]), call(composed.operations[1])], mock.call_args_list + ) + + async def test_execute_with_lock(self): + op1 = _DatabaseOperation(lock="foo") + with patch.object(DatabaseLock, "acquire") as enter_lock_mock: + with patch.object(DatabaseLock, "release") as exit_lock_mock: + async with _DatabaseClient() as client: + await client.execute(op1) + self.assertEqual(1, enter_lock_mock.call_count) + self.assertEqual(0, exit_lock_mock.call_count) + enter_lock_mock.reset_mock() + exit_lock_mock.reset_mock() + self.assertEqual(0, enter_lock_mock.call_count) + self.assertEqual(1, exit_lock_mock.call_count) + + async def test_execute_with_lock_multiple(self): + op1 = _DatabaseOperation(lock="foo") + op2 = _DatabaseOperation(lock="bar") + async with _DatabaseClient() as client: + self.assertIsNone(client.lock) + + await client.execute(op1) + foo_lock = client.lock + self.assertIsInstance(foo_lock, DatabaseLock) + + await client.execute(op1) + self.assertEqual(foo_lock, client.lock) + + await client.execute(op2) + self.assertNotEqual(foo_lock, client.lock) + self.assertIsInstance(client.lock, DatabaseLock) + + async def test_execute_raises_unsupported(self): + client = _DatabaseClient() + with self.assertRaises(ValueError): + # noinspection PyTypeChecker + await client.execute("wrong!") + + async def test_fetch_all(self): + mock = MagicMock(return_value=FakeAsyncIterator(["one", "two"])) + client = _DatabaseClient() + client._fetch_all = mock + + self.assertEqual(["one", "two"], [v async for v in client.fetch_all()]) + + self.assertEqual([call()], mock.call_args_list) + + async def test_fetch_one(self): + mock = MagicMock(return_value=FakeAsyncIterator(["one", "two"])) + client = _DatabaseClient() + client._fetch_all = mock + + self.assertEqual("one", await client.fetch_one()) + + self.assertEqual([call()], mock.call_args_list) + + async def test_fetch_one_raises(self): + mock = MagicMock(return_value=FakeAsyncIterator([])) + client = _DatabaseClient() + client._fetch_all = mock + + with self.assertRaises(ProgrammingException): + await client.fetch_one() + + def test_set_factory(self): + expected = { + LockDatabaseOperationFactory: _LockDatabaseOperationFactory, + _DatabaseOperationFactory: _DatabaseOperationFactoryImpl, + } + try: + _DatabaseClient.set_factory(_DatabaseOperationFactory, _DatabaseOperationFactoryImpl) + + self.assertEqual(expected, _DatabaseClient._factories) + finally: + _DatabaseClient._factories.pop(_DatabaseOperationFactory) + + def test_set_factory_raises(self): + with self.assertRaises(ValueError): + # noinspection PyTypeChecker + _DatabaseClient.set_factory(object, DatabaseOperationFactory) + + with self.assertRaises(ValueError): + _DatabaseClient.set_factory(_DatabaseOperationFactoryImpl, _DatabaseOperationFactory) + + def test_get_factory(self): + self.assertIsInstance( + _DatabaseClient.get_factory(LockDatabaseOperationFactory), + _LockDatabaseOperationFactory, + ) + + def test_get_factory_raises(self): + with self.assertRaises(ValueError): + _DatabaseClient.get_factory(_DatabaseOperationFactory), + + +class TestDatabaseClientBuilder(CommonTestCase): + def test_with_name(self): + builder = DatabaseClientBuilder(_DatabaseClient).with_name("query") + self.assertEqual({"name": "query"}, builder.kwargs) + + def test_with_config(self): + builder = DatabaseClientBuilder(_DatabaseClient).with_name("query").with_config(self.config) + self.assertEqual({"name": "query"} | self.config.get_database_by_name("query"), builder.kwargs) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/minos-microservice-common/tests/test_common/test_database/test_locks.py b/packages/core/minos-microservice-common/tests/test_common/test_database/test_locks.py index d6a777a2f..f18159339 100644 --- a/packages/core/minos-microservice-common/tests/test_common/test_database/test_locks.py +++ b/packages/core/minos-microservice-common/tests/test_common/test_database/test_locks.py @@ -1,53 +1,38 @@ import unittest -import aiopg -from aiopg import ( - Cursor, -) - from minos.common import ( + DatabaseLock, Lock, - PostgreSqlLock, ) from minos.common.testing import ( - PostgresAsyncTestCase, -) -from tests.utils import ( - CONFIG_FILE_PATH, + MockedDatabaseClient, ) -class TestPostgreSqlLock(PostgresAsyncTestCase): - CONFIG_FILE_PATH = CONFIG_FILE_PATH - +class TestDatabaseLock(unittest.IsolatedAsyncioTestCase): def test_base(self): - self.assertTrue(issubclass(PostgreSqlLock, Lock)) + self.assertTrue(issubclass(DatabaseLock, Lock)) - async def test_wrapped_connection(self): - wrapped_connection = aiopg.connect(**self.repository_db) - lock = PostgreSqlLock(wrapped_connection, "foo") - self.assertEqual(wrapped_connection, lock.wrapped_connection) + async def test_client(self): + client = MockedDatabaseClient() + lock = DatabaseLock(client, "foo") + self.assertEqual(client, lock.client) async def test_key(self): - wrapped_connection = aiopg.connect(**self.repository_db) - lock = PostgreSqlLock(wrapped_connection, "foo") + client = MockedDatabaseClient() + lock = DatabaseLock(client, "foo") self.assertEqual("foo", lock.key) async def test_key_raises(self): - wrapped_connection = aiopg.connect(**self.repository_db) + client = MockedDatabaseClient() with self.assertRaises(ValueError): - PostgreSqlLock(wrapped_connection, []) + DatabaseLock(client, []) async def test_hashed_key(self): - wrapped_connection = aiopg.connect(**self.repository_db) - lock = PostgreSqlLock(wrapped_connection, "foo") + client = MockedDatabaseClient() + lock = DatabaseLock(client, "foo") self.assertEqual(hash("foo"), lock.hashed_key) - async def test_cursor(self): - wrapped_connection = aiopg.connect(**self.repository_db) - async with PostgreSqlLock(wrapped_connection, "foo") as lock: - self.assertIsInstance(lock.cursor, Cursor) - if __name__ == "__main__": unittest.main() diff --git a/packages/core/minos-microservice-common/tests/test_common/test_database/test_mixins.py b/packages/core/minos-microservice-common/tests/test_common/test_database/test_mixins.py new file mode 100644 index 000000000..a0433e187 --- /dev/null +++ b/packages/core/minos-microservice-common/tests/test_common/test_database/test_mixins.py @@ -0,0 +1,154 @@ +import unittest + +from minos.common import ( + DatabaseClientPool, + DatabaseMixin, + LockDatabaseOperationFactory, + NotProvidedException, + PoolFactory, +) +from minos.common.testing import ( + DatabaseMinosTestCase, + MockedDatabaseClient, + MockedDatabaseOperation, + MockedLockDatabaseOperationFactory, +) +from tests.utils import ( + CommonTestCase, +) + + +# noinspection SqlNoDataSourceInspection,SqlResolve +class TestDatabaseMixin(CommonTestCase, DatabaseMinosTestCase): + def test_constructor(self): + pool = DatabaseClientPool.from_config(self.config) + # noinspection PyTypeChecker + database = DatabaseMixin(pool) + self.assertEqual(pool, database.database_pool) + + async def test_constructor_with_pool_factory(self): + pool_factory = PoolFactory(self.config, {"database": DatabaseClientPool}) + # noinspection PyTypeChecker + database = DatabaseMixin(pool_factory=pool_factory) + # noinspection PyUnresolvedReferences + self.assertEqual(pool_factory.get_pool("database"), database.database_pool) + + async def test_constructor_with_pool_factory_and_database_key(self): + pool_factory = PoolFactory(self.config, {"database": DatabaseClientPool}) + # noinspection PyTypeChecker + database = DatabaseMixin(pool_factory=pool_factory, database_key=("query", "unknown")) + # noinspection PyUnresolvedReferences + self.assertEqual(pool_factory.get_pool("database", "query"), database.database_pool) + + async def test_constructor_raises(self): + with self.assertRaises(NotProvidedException): + # noinspection PyArgumentEqualDefault + DatabaseMixin(database_pool=None, pool_factory=None) + + async def test_pool(self): + async with DatabaseMixin() as database: + self.assertIsInstance(database.database_pool, DatabaseClientPool) + + async def test_operation_factory(self): + operation_factory = MockedLockDatabaseOperationFactory() + mixin = DatabaseMixin(operation_factory=operation_factory) + self.assertEqual(operation_factory, mixin.database_operation_factory) + + async def test_operation_factory_from_cls_init(self): + mixin = DatabaseMixin(operation_factory_cls=LockDatabaseOperationFactory) + self.assertIsInstance(mixin.database_operation_factory, MockedLockDatabaseOperationFactory) + + async def test_operation_factory_from_cls_generic(self): + class _DatabaseMixin(DatabaseMixin[LockDatabaseOperationFactory]): + """For testing purposes.""" + + mixin = _DatabaseMixin() + self.assertIsInstance(mixin.database_operation_factory, MockedLockDatabaseOperationFactory) + + async def test_operation_factory_none(self): + mixin = DatabaseMixin() + self.assertEqual(None, mixin.database_operation_factory) + + async def test_operation_factory_from_cls_generic_raises(self): + class _DatabaseMixin(DatabaseMixin[int]): + """For testing purposes.""" + + with self.assertRaises(TypeError): + _DatabaseMixin() + + async def test_execute_on_database(self): + op1 = MockedDatabaseOperation("create_table") + op2 = MockedDatabaseOperation("check_exist", [(True,)]) + + async with DatabaseMixin() as database: + await database.execute_on_database(op1) + + async with MockedDatabaseClient(**self.config.get_default_database()) as client: + await client.execute(op2) + self.assertTrue((await client.fetch_one())[0]) + + async def test_execute_on_database_locked(self): + op1 = MockedDatabaseOperation("create_table", lock=1234) + op2 = MockedDatabaseOperation("check_exist", [(True,)]) + + async with DatabaseMixin() as database: + await database.execute_on_database(op1) + + async with MockedDatabaseClient(**self.config.get_default_database()) as client: + await client.execute(op2) + self.assertTrue((await client.fetch_one())[0]) + + async def test_execute_on_database_and_fetch_one(self): + op1 = MockedDatabaseOperation("create_table") + op2 = MockedDatabaseOperation("insert") + op3 = MockedDatabaseOperation("select", [(3,), (4,), (5,)]) + + async with DatabaseMixin() as database: + await database.execute_on_database(op1) + await database.execute_on_database(op2) + + observed = await database.execute_on_database_and_fetch_one(op3) + + self.assertEqual((3,), observed) + + async def test_execute_on_database_and_fetch_all(self): + op1 = MockedDatabaseOperation("create_table") + op2 = MockedDatabaseOperation("insert") + op3 = MockedDatabaseOperation("select", [(3,), (4,), (5,)]) + + async with DatabaseMixin() as database: + await database.execute_on_database(op1) + await database.execute_on_database(op2) + observed = [v async for v in database.execute_on_database_and_fetch_all(op3)] + + self.assertEqual([(3,), (4,), (5,)], observed) + + async def test_execute_on_database_and_fetch_all_streaming_mode_true(self): + op1 = MockedDatabaseOperation("create_table") + op2 = MockedDatabaseOperation("insert") + op3 = MockedDatabaseOperation("select", [(3,), (4,), (5,)]) + + async with DatabaseMixin() as database: + await database.execute_on_database(op1) + await database.execute_on_database(op2) + + observed = [v async for v in database.execute_on_database_and_fetch_all(op3, streaming_mode=True)] + + self.assertEqual([(3,), (4,), (5,)], observed) + + async def test_execute_on_database_and_fetch_all_locked(self): + op1 = MockedDatabaseOperation("create_table", lock=1234) + op2 = MockedDatabaseOperation("insert") + op3 = MockedDatabaseOperation("select", [(3,), (4,), (5,)]) + + async with DatabaseMixin() as database: + await database.execute_on_database(op1) + await database.execute_on_database(op2) + + observed = [v async for v in database.execute_on_database_and_fetch_all(op3)] + + self.assertEqual([(3,), (4,), (5,)], observed) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/minos-microservice-common/tests/test_common/test_database/test_operations.py b/packages/core/minos-microservice-common/tests/test_common/test_database/test_operations.py new file mode 100644 index 000000000..78c1aef5f --- /dev/null +++ b/packages/core/minos-microservice-common/tests/test_common/test_database/test_operations.py @@ -0,0 +1,48 @@ +import unittest +from abc import ( + ABC, +) + +from minos.common import ( + ComposedDatabaseOperation, + DatabaseOperation, + DatabaseOperationFactory, +) + + +class _DatabaseOperation(DatabaseOperation): + """For testing purposes.""" + + +class TestDatabaseOperation(unittest.TestCase): + def test_abstract(self): + self.assertTrue(issubclass(DatabaseOperation, ABC)) + + def test_constructor(self): + operation = _DatabaseOperation() + self.assertEqual(None, operation.timeout) + self.assertEqual(None, operation.lock) + + def test_constructor_extended(self): + operation = _DatabaseOperation(timeout=3, lock="foo") + self.assertEqual(3, operation.timeout) + self.assertEqual("foo", operation.lock) + + +class TestComposedDatabaseOperation(unittest.TestCase): + def test_subclass(self) -> None: + self.assertTrue(issubclass(ComposedDatabaseOperation, DatabaseOperation)) + + def test_constructor(self): + operations = [_DatabaseOperation(), _DatabaseOperation()] + composed = ComposedDatabaseOperation(operations) + self.assertEqual(tuple(operations), composed.operations) + + +class TestDatabaseOperationFactory(unittest.TestCase): + def test_abstract(self): + self.assertTrue(issubclass(DatabaseOperationFactory, ABC)) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/minos-microservice-common/tests/test_common/test_database/test_pools.py b/packages/core/minos-microservice-common/tests/test_common/test_database/test_pools.py index 15e26fb64..bfe2d53b8 100644 --- a/packages/core/minos-microservice-common/tests/test_common/test_database/test_pools.py +++ b/packages/core/minos-microservice-common/tests/test_common/test_database/test_pools.py @@ -1,44 +1,37 @@ import unittest from unittest.mock import ( - PropertyMock, patch, ) -import aiopg -from aiopg import ( - Connection, -) -from psycopg2 import ( - OperationalError, -) - from minos.common import ( - PostgreSqlLock, - PostgreSqlLockPool, - PostgreSqlPool, + Config, + ConnectionException, + DatabaseClient, + DatabaseClientBuilder, + DatabaseClientPool, + DatabaseLock, + DatabaseLockPool, + classname, ) from minos.common.testing import ( - PostgresAsyncTestCase, + DatabaseMinosTestCase, + MockedDatabaseClient, ) from tests.utils import ( CONFIG_FILE_PATH, + CommonTestCase, ) -class TestPostgreSqlPool(PostgresAsyncTestCase): - CONFIG_FILE_PATH = CONFIG_FILE_PATH - +class TestDatabaseClientPool(CommonTestCase, DatabaseMinosTestCase): def setUp(self) -> None: super().setUp() - self.pool = PostgreSqlPool.from_config(self.config) + self.pool = DatabaseClientPool.from_config(self.config) def test_constructor(self): - pool = PostgreSqlPool("foo") - self.assertEqual("foo", pool.database) - self.assertEqual("postgres", pool.user) - self.assertEqual("", pool.password) - self.assertEqual("localhost", pool.host) - self.assertEqual(5432, pool.port) + builder = DatabaseClientBuilder() + pool = DatabaseClientPool(builder) + self.assertEqual(builder, pool.client_builder) async def asyncSetUp(self): await super().asyncSetUp() @@ -49,45 +42,51 @@ async def asyncTearDown(self): await super().asyncTearDown() def test_from_config(self): - repository_config = self.config.get_database_by_name("event") - self.assertEqual(repository_config["database"], self.pool.database) - self.assertEqual(repository_config["user"], self.pool.user) - self.assertEqual(repository_config["password"], self.pool.password) - self.assertEqual(repository_config["host"], self.pool.host) - self.assertEqual(repository_config["port"], self.pool.port) + pool = DatabaseClientPool.from_config(self.config, key="event") + self.assertIsInstance(pool.client_builder, DatabaseClientBuilder) + self.assertEqual(MockedDatabaseClient, pool.client_builder.instance_cls) - async def test_acquire(self): + def test_from_config_client_builder(self): + config = Config(CONFIG_FILE_PATH, databases_default_client=classname(DatabaseClientBuilder)) + pool = DatabaseClientPool.from_config(config) + self.assertIsInstance(pool.client_builder, DatabaseClientBuilder) + + def test_from_config_client_none(self): + config = Config(CONFIG_FILE_PATH, databases_default_client=None) + with self.assertRaises(ValueError): + DatabaseClientPool.from_config(config) + + async def test_acquire_once(self): + async with self.pool.acquire() as c1: + self.assertIsInstance(c1, DatabaseClient) + + async def test_acquire_multiple_recycle(self): async with self.pool.acquire() as c1: - self.assertIsInstance(c1, Connection) + pass async with self.pool.acquire() as c2: self.assertEqual(c1, c2) - async def test_acquire_with_error(self): - with patch("aiopg.Connection.isolation_level", new_callable=PropertyMock, side_effect=(OperationalError, None)): - async with self.pool.acquire() as connection: - self.assertIsInstance(connection, Connection) - - async def test_acquire_with_connection_error(self): - executed = [False] - original = aiopg.connect - - def _side_effect(*args, **kwargs): - if not executed[0]: - executed[0] = True - raise OperationalError - return original(*args, **kwargs) + async def test_acquire_multiple_same_time(self): + async with self.pool.acquire() as c1: + async with self.pool.acquire() as c2: + self.assertNotEqual(c1, c2) - with patch("aiopg.connect", side_effect=_side_effect): - async with self.pool.acquire() as connection: - self.assertIsInstance(connection, Connection) + async def test_acquire_with_reset(self): + with patch.object(MockedDatabaseClient, "reset") as reset_mock: + async with self.pool.acquire(): + self.assertEqual(0, reset_mock.call_count) + self.assertEqual(1, reset_mock.call_count) + async def test_acquire_with_raises(self): + with patch.object(MockedDatabaseClient, "setup", side_effect=[ConnectionException(""), None]): + async with self.pool.acquire() as client: + self.assertIsInstance(client, MockedDatabaseClient) -class TestPostgreSqlLockPool(PostgresAsyncTestCase): - CONFIG_FILE_PATH = CONFIG_FILE_PATH +class TestDatabaseLockPool(CommonTestCase, DatabaseMinosTestCase): def setUp(self) -> None: super().setUp() - self.pool = PostgreSqlLockPool.from_config(self.config) + self.pool = DatabaseLockPool.from_config(self.config) async def asyncSetUp(self): await super().asyncSetUp() @@ -99,7 +98,7 @@ async def asyncTearDown(self): async def test_acquire(self): async with self.pool.acquire("foo") as lock: - self.assertIsInstance(lock, PostgreSqlLock) + self.assertIsInstance(lock, DatabaseLock) self.assertEqual("foo", lock.key) diff --git a/packages/core/minos-microservice-common/tests/test_common/test_injections/test_injectors.py b/packages/core/minos-microservice-common/tests/test_common/test_injections/test_injectors.py index 9d8f9464a..c8db7de00 100644 --- a/packages/core/minos-microservice-common/tests/test_common/test_injections/test_injectors.py +++ b/packages/core/minos-microservice-common/tests/test_common/test_injections/test_injectors.py @@ -12,11 +12,11 @@ from minos.common import ( Config, DependencyInjector, + PoolFactory, classname, ) from tests.utils import ( CONFIG_FILE_PATH, - FakeLockPool, ) @@ -25,17 +25,17 @@ def setUp(self) -> None: self.config = Config(CONFIG_FILE_PATH) def test_from_str(self): - injector = DependencyInjector(self.config, [classname(FakeLockPool)]) - self.assertIsInstance(injector.lock_pool, FakeLockPool) + injector = DependencyInjector(self.config, [classname(PoolFactory)]) + self.assertIsInstance(injector.pool_factory, PoolFactory) def test_from_type(self): - injector = DependencyInjector(self.config, [FakeLockPool]) - self.assertIsInstance(injector.lock_pool, FakeLockPool) + injector = DependencyInjector(self.config, [PoolFactory]) + self.assertIsInstance(injector.pool_factory, PoolFactory) def test_from_instance(self): - instance = FakeLockPool() + instance = PoolFactory.from_config(self.config) injector = DependencyInjector(self.config, [instance]) - self.assertEqual(instance, injector.lock_pool) + self.assertEqual(instance, injector.pool_factory) def test_raises_building(self): injector = DependencyInjector(self.config, ["path.to.LockPool"]) @@ -52,16 +52,16 @@ def test_container(self): self.assertIsInstance(injector.container, Container) self.assertEqual(self.config, injector.container.config()) - def test_container_lock_pool(self): - injector = DependencyInjector(self.config, [FakeLockPool]) - self.assertEqual(injector.lock_pool, injector.container.lock_pool()) + def test_container_pool_factory(self): + injector = DependencyInjector(self.config, [PoolFactory]) + self.assertEqual(injector.pool_factory, injector.container.pool_factory()) async def test_wire_unwire(self): from minos.common.injections import ( decorators, ) - injector = DependencyInjector(self.config, [FakeLockPool]) + injector = DependencyInjector(self.config, [PoolFactory]) mock = MagicMock() injector.container.wire = mock @@ -79,7 +79,7 @@ async def test_wire_unwire_with_modules(self): decorators, ) - injector = DependencyInjector(self.config, [FakeLockPool]) + injector = DependencyInjector(self.config, [PoolFactory]) mock = MagicMock() injector.container.wire = mock diff --git a/packages/core/minos-microservice-common/tests/test_common/test_launchers.py b/packages/core/minos-microservice-common/tests/test_common/test_launchers.py index 14a42a639..365647151 100644 --- a/packages/core/minos-microservice-common/tests/test_common/test_launchers.py +++ b/packages/core/minos-microservice-common/tests/test_common/test_launchers.py @@ -16,10 +16,11 @@ classname, ) from minos.common.testing import ( - PostgresAsyncTestCase, + DatabaseMinosTestCase, ) from tests.utils import ( CONFIG_FILE_PATH, + CommonTestCase, FakeEntrypoint, FakeLoop, ) @@ -39,9 +40,7 @@ async def _stop(self, err: Exception = None) -> None: """For testing purposes.""" -class TestEntrypointLauncher(PostgresAsyncTestCase): - CONFIG_FILE_PATH = CONFIG_FILE_PATH - +class TestEntrypointLauncher(CommonTestCase, DatabaseMinosTestCase): def setUp(self): super().setUp() self.injections = list() @@ -60,7 +59,7 @@ def test_from_config(self): launcher = EntrypointLauncher.from_config(self.config) self.assertIsInstance(launcher, EntrypointLauncher) self.assertEqual(self.config, launcher.config) - self.assertEqual(12, len(launcher.injections)) + self.assertEqual(len(self.config.get_injections()), len(launcher.injections)) for injection in launcher.injections.values(): self.assertIsInstance(injection, InjectableMixin) diff --git a/packages/core/minos-microservice-common/tests/test_common/test_model/test_declarative/test_avro.py b/packages/core/minos-microservice-common/tests/test_common/test_model/test_declarative/test_avro.py index bc2927c80..2e851c368 100644 --- a/packages/core/minos-microservice-common/tests/test_common/test_model/test_declarative/test_avro.py +++ b/packages/core/minos-microservice-common/tests/test_common/test_model/test_declarative/test_avro.py @@ -73,14 +73,12 @@ def test_avro_schema_generics_nested(self): "fields": [ { "name": "user", - "type": [ - { - "fields": [{"name": "username", "type": "string"}], - "name": "GenericUser", - "namespace": "tests.model_classes.goodbye", - "type": "record", - } - ], + "type": { + "fields": [{"name": "username", "type": "string"}], + "name": "GenericUser", + "namespace": "tests.model_classes.goodbye", + "type": "record", + }, } ], "name": "Auth", diff --git a/packages/core/minos-microservice-common/tests/test_common/test_model/test_types/test_builders.py b/packages/core/minos-microservice-common/tests/test_common/test_model/test_types/test_builders.py index 103cc4c66..24a849f60 100644 --- a/packages/core/minos-microservice-common/tests/test_common/test_model/test_types/test_builders.py +++ b/packages/core/minos-microservice-common/tests/test_common/test_model/test_types/test_builders.py @@ -1,12 +1,14 @@ import unittest from typing import ( Any, + Optional, Union, ) from minos.common import ( ModelType, TypeHintBuilder, + TypeHintParser, ) from tests.model_classes import ( Foo, @@ -46,5 +48,35 @@ def test_union_any(self): self.assertEqual(expected, observed) +class TestTypeHintParser(unittest.TestCase): + def test_immutable(self): + self.assertEqual(int, TypeHintParser(int).build()) + + def test_optional(self): + self.assertEqual(Optional[int], TypeHintParser(Optional[int]).build()) + + def test_model(self): + # noinspection PyPep8Naming + FooMt = ModelType.build("tests.model_classes.Foo", {"text": str}) + self.assertEqual(FooMt, TypeHintParser(Foo).build()) + + def test_nested_model(self): + # noinspection PyPep8Naming + FooMt = ModelType.build("tests.model_classes.Foo", {"text": str}) + self.assertEqual(Optional[FooMt], TypeHintParser(Optional[Foo]).build()) + + def test_model_type(self): + # noinspection PyPep8Naming + FooMt = ModelType.build("tests.model_classes.Foo", {"text": str}) + self.assertEqual(FooMt, TypeHintParser(FooMt).build()) + + # noinspection PyPep8Naming + def test_model_type_nested(self): + Base = ModelType.build("Base", {"another": Foo}) + FooMt = ModelType.build("tests.model_classes.Foo", {"text": str}) + Expected = ModelType.build("Base", {"another": FooMt}) + self.assertEqual(Expected, TypeHintParser(Base).build()) + + if __name__ == "__main__": unittest.main() diff --git a/packages/core/minos-microservice-common/tests/test_common/test_pools.py b/packages/core/minos-microservice-common/tests/test_common/test_pools.py index a31df2f72..f0607679f 100644 --- a/packages/core/minos-microservice-common/tests/test_common/test_pools.py +++ b/packages/core/minos-microservice-common/tests/test_common/test_pools.py @@ -10,6 +10,7 @@ ) from unittest.mock import ( MagicMock, + patch, ) from aiomisc import ( @@ -17,24 +18,54 @@ ) from minos.common import ( + MinosConfigException, MinosPool, Pool, + PoolException, + PoolFactory, SetupMixin, ) +from tests.utils import ( + CommonTestCase, + FakeLockPool, +) -class _Pool(Pool): - def __init__(self): - super().__init__() - self.create_instance_call_count = 0 - self.destroy_instance_call_count = 0 +class TestPoolFactory(CommonTestCase): + def setUp(self): + super().setUp() + self.factory = PoolFactory(self.config, {"lock": FakeLockPool}) - async def _create_instance(self): - self.create_instance_call_count += 1 - return "foo" + def test_from_config(self): + self.assertIsInstance(PoolFactory.from_config(self.config), PoolFactory) - async def _destroy_instance(self, instance: t.Any) -> None: - self.destroy_instance_call_count += 1 + async def asyncTearDown(self): + await self.factory.destroy() + await super().asyncTearDown() + + def test_get_pool(self): + lock = self.factory.get_pool("lock") + self.assertIsInstance(lock, FakeLockPool) + self.assertEqual(lock, self.factory.get_pool("lock")) + + def test_get_pool_with_key(self): + lock_a = self.factory.get_pool("lock", "a") + lock_b = self.factory.get_pool("lock", "b") + self.assertIsInstance(lock_a, FakeLockPool) + self.assertIsInstance(lock_b, FakeLockPool) + + self.assertNotEqual(lock_a, lock_b) + self.assertEqual(lock_a, self.factory.get_pool("lock", "a")) + self.assertEqual(lock_b, self.factory.get_pool("lock", "b")) + + def test_get_pool_cls_raises(self): + with self.assertRaises(PoolException): + self.factory.get_pool("something") + + def test_get_pool_identifier_raises(self): + with patch.object(SetupMixin, "from_config", side_effect=MinosConfigException("")): + with self.assertRaises(PoolException): + self.factory.get_pool("database") class TestPool(unittest.IsolatedAsyncioTestCase): @@ -70,6 +101,20 @@ async def _fn2(p): self.assertEqual(1, pool_mock.call_count) +class _Pool(Pool): + def __init__(self): + super().__init__() + self.create_instance_call_count = 0 + self.destroy_instance_call_count = 0 + + async def _create_instance(self): + self.create_instance_call_count += 1 + return "foo" + + async def _destroy_instance(self, instance: t.Any) -> None: + self.destroy_instance_call_count += 1 + + class TestMinosPool(unittest.IsolatedAsyncioTestCase): def test_is_subclass(self): self.assertTrue(issubclass(MinosPool, SetupMixin)) diff --git a/packages/core/minos-microservice-common/tests/test_common/test_storage/__init__.py b/packages/core/minos-microservice-common/tests/test_common/test_storage/__init__.py deleted file mode 100644 index 8b1378917..000000000 --- a/packages/core/minos-microservice-common/tests/test_common/test_storage/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/packages/core/minos-microservice-common/tests/test_common/test_storage/test_lmdb.py b/packages/core/minos-microservice-common/tests/test_common/test_storage/test_lmdb.py deleted file mode 100644 index 7245670b5..000000000 --- a/packages/core/minos-microservice-common/tests/test_common/test_storage/test_lmdb.py +++ /dev/null @@ -1,105 +0,0 @@ -import shutil -import unittest -from pathlib import ( - Path, -) - -from minos.common import ( - MinosStorageLmdb, -) -from tests.utils import ( - BASE_PATH, -) - - -class TestMinosStorageLmdb(unittest.TestCase): - def setUp(self) -> None: - self.path = BASE_PATH / "order.lmdb" - - def tearDown(self) -> None: - shutil.rmtree(self.path, ignore_errors=True) - shutil.rmtree(".lmdb", ignore_errors=True) - - def test_constructor_default_path(self): - MinosStorageLmdb.build() - self.assertTrue(Path(".lmdb").exists()) - - def test_storage_add_text(self): - storage = MinosStorageLmdb.build(self.path) - storage.add("TestOne", "first", "Text Value") - - value_returned = storage.get("TestOne", "first") - assert value_returned == "Text Value" - - def test_storage_add_int(self): - storage = MinosStorageLmdb.build(self.path) - storage.add("TestOne", "first", 123) - - value_returned = storage.get("TestOne", "first") - assert value_returned == 123 - - def test_storage_add_dict(self): - storage = MinosStorageLmdb.build(self.path) - storage.add("TestOne", "first", {"key_one": "hello", "key_two": "minos"}) - - value_returned = storage.get("TestOne", "first") - assert value_returned["key_one"] == "hello" - assert value_returned["key_two"] == "minos" - - def test_storage_add_multi_dict(self): - storage = MinosStorageLmdb.build(self.path) - storage.add("TestOne", "first", {"key_one": "hello", "key_two": {"sub_key": "this is a sub text"}}) - - value_returned = storage.get("TestOne", "first") - assert value_returned["key_one"] == "hello" - assert value_returned["key_two"]["sub_key"] == "this is a sub text" - - def test_storage_add_list(self): - storage = MinosStorageLmdb.build(self.path) - storage.add("TestOne", "first", ["hello", "minos"]) - - value_returned = storage.get("TestOne", "first") - assert value_returned[0] == "hello" - assert value_returned[1] == "minos" - - def test_storage_add_multi_table(self): - storage = MinosStorageLmdb.build(self.path) - storage.add("TestOne", "first", "Text Value") - storage.add("TestTwo", "first_double", "Text Double Value") - storage.add("TestTwo", "first", "Text Value Diff") - - value_returned = storage.get("TestOne", "first") - assert value_returned == "Text Value" - - value_returned = storage.get("TestTwo", "first_double") - assert value_returned == "Text Double Value" - - value_returned = storage.get("TestTwo", "first") - assert value_returned == "Text Value Diff" - - def test_storage_delete(self): - storage = MinosStorageLmdb.build(self.path) - storage.add("TestOne", "first", "Text Value") - storage.add("TestOne", "second", "Text Second Value") - - storage.delete("TestOne", "first") - value_returned = storage.get("TestOne", "second") - assert value_returned == "Text Second Value" - - exception_value = storage.get("TestOne", "first") - assert exception_value is None - - def test_storage_update(self): - storage = MinosStorageLmdb.build(self.path) - storage.add("TestOne", "first", "Text Value") - - value_returned = storage.get("TestOne", "first") - assert value_returned == "Text Value" - - storage.update("TestOne", "first", "Updated Text Value") - updated_value = storage.get("TestOne", "first") - assert updated_value == "Updated Text Value" - - -if __name__ == "__main__": - unittest.main() diff --git a/packages/core/minos-microservice-common/tests/test_common/test_testing.py b/packages/core/minos-microservice-common/tests/test_common/test_testing.py new file mode 100644 index 000000000..a56ca5514 --- /dev/null +++ b/packages/core/minos-microservice-common/tests/test_common/test_testing.py @@ -0,0 +1,41 @@ +import unittest + +from minos.common import ( + Config, + DependencyInjector, +) +from minos.common.testing import ( + DatabaseMinosTestCase, + MinosTestCase, +) +from tests.utils import ( + CONFIG_FILE_PATH, +) + + +class TestMinosTestCase(unittest.IsolatedAsyncioTestCase): + def test_config(self): + test_case = MyMinosTestCase() + test_case.setUp() + self.assertIsInstance(test_case.config, Config) + + def test_injector(self): + test_case = MyMinosTestCase() + test_case.setUp() + self.assertIsInstance(test_case.injector, DependencyInjector) + + +class MyMinosTestCase(MinosTestCase): + CONFIG_FILE_PATH = CONFIG_FILE_PATH + + +class TestMyDatabaseMinosTestCase(unittest.IsolatedAsyncioTestCase): + pass + + +class MyDatabaseMinosTestCase(DatabaseMinosTestCase): + CONFIG_FILE_PATH = CONFIG_FILE_PATH + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/minos-microservice-common/tests/utils.py b/packages/core/minos-microservice-common/tests/utils.py index e7b4ea6fe..5180a96c9 100644 --- a/packages/core/minos-microservice-common/tests/utils.py +++ b/packages/core/minos-microservice-common/tests/utils.py @@ -1,3 +1,7 @@ +from __future__ import ( + annotations, +) + from pathlib import ( Path, ) @@ -8,11 +12,20 @@ Injectable, Lock, LockPool, + Pool, Port, + testing, ) BASE_PATH = Path(__file__).parent -CONFIG_FILE_PATH = BASE_PATH / "config" / "v1.yml" +CONFIG_FILE_PATH = BASE_PATH / "config" / "v2.yml" + + +class CommonTestCase(testing.MinosTestCase): + testing_module = testing + + def get_config_file_path(self) -> Path: + return CONFIG_FILE_PATH class FakeEntrypoint: @@ -65,8 +78,11 @@ def __init__(self, key=None, *args, **kwargs): key = "fake" super().__init__(key, *args, **kwargs) - async def __aexit__(self, exc_type, exc_val, exc_tb): - return + async def acquire(self) -> None: + """For testing purposes.""" + + async def release(self): + """For testing purposes.""" class FakeLockPool(LockPool): @@ -148,13 +164,11 @@ class FakeBrokerSubscriberBuilder(Builder[FakeBrokerSubscriber]): FakeBrokerSubscriber.set_builder(FakeBrokerSubscriberBuilder) -@Injectable("database_pool") -class FakeDatabasePool: +class FakeDatabasePool(Pool): """For testing purposes.""" -@Injectable("broker_pool") -class FakeBrokerClientPool: +class FakeBrokerClientPool(Pool): """For testing purposes.""" diff --git a/packages/core/minos-microservice-cqrs/HISTORY.md b/packages/core/minos-microservice-cqrs/HISTORY.md index 87647e2d5..59240e9a1 100644 --- a/packages/core/minos-microservice-cqrs/HISTORY.md +++ b/packages/core/minos-microservice-cqrs/HISTORY.md @@ -78,3 +78,10 @@ * Replace `dependency-injector`'s injection classes by the ones provided by the `minos.common.injections` module. * Be compatible with latest `minos.common.Config` API. + +## 0.7.0 (2022-05-11) + +* Minor improvements. +* Unify documentation building pipeline across all `minos-python` packages. +* Fix documentation building warnings. +* Fix bug related with package building and additional files like `AUTHORS.md`, `HISTORY.md`, etc. \ No newline at end of file diff --git a/packages/core/minos-microservice-cqrs/Makefile b/packages/core/minos-microservice-cqrs/Makefile index acc861207..ef814b8bc 100644 --- a/packages/core/minos-microservice-cqrs/Makefile +++ b/packages/core/minos-microservice-cqrs/Makefile @@ -15,10 +15,6 @@ reformat: poetry run black --line-length 120 minos tests poetry run isort minos tests -docs: - rm -rf docs/api - poetry run $(MAKE) --directory=docs html - release: $(MAKE) dist poetry publish @@ -38,5 +34,4 @@ check: $(MAKE) reformat $(MAKE) lint $(MAKE) test - $(MAKE) docs $(MAKE) dist diff --git a/packages/core/minos-microservice-cqrs/RUNTHETESTS.md b/packages/core/minos-microservice-cqrs/RUNTHETESTS.md index 8b5e95b1f..386e2b0e7 100644 --- a/packages/core/minos-microservice-cqrs/RUNTHETESTS.md +++ b/packages/core/minos-microservice-cqrs/RUNTHETESTS.md @@ -1,5 +1,4 @@ -Run the tests -============== +# Run the tests In order to run the tests, please make sure you have the `Docker Engine `_ and `Docker Compose `_ installed. diff --git a/packages/core/minos-microservice-cqrs/SETUP.md b/packages/core/minos-microservice-cqrs/SETUP.md deleted file mode 100644 index 8203965c7..000000000 --- a/packages/core/minos-microservice-cqrs/SETUP.md +++ /dev/null @@ -1,11 +0,0 @@ -Set up a development environment -================================= - -Since we use `poetry` as the default package manager, it must be installed. Please refer to -`https://python-poetry.org/docs/#installation`. - -Run `poetry install` to get the dependencies. - -Run `pre-commit install` to set the git checks before commiting. - -Make yourself sure you are able to run the tests. Refer to the appropriate section in this guide. diff --git a/packages/core/minos-microservice-cqrs/docs/Makefile b/packages/core/minos-microservice-cqrs/docs/Makefile deleted file mode 100644 index 6a53257fb..000000000 --- a/packages/core/minos-microservice-cqrs/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -SPHINXPROJ = minos-microservice-cqrs -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/packages/core/minos-microservice-cqrs/docs/_static/style.css b/packages/core/minos-microservice-cqrs/docs/_static/style.css deleted file mode 100644 index 8aa6c288f..000000000 --- a/packages/core/minos-microservice-cqrs/docs/_static/style.css +++ /dev/null @@ -1,3 +0,0 @@ -.wy-nav-content { - max-width: 1200px !important; -} diff --git a/packages/core/minos-microservice-cqrs/docs/_templates/layout.html b/packages/core/minos-microservice-cqrs/docs/_templates/layout.html deleted file mode 100644 index b0a448060..000000000 --- a/packages/core/minos-microservice-cqrs/docs/_templates/layout.html +++ /dev/null @@ -1,4 +0,0 @@ -{% extends "!layout.html" %} -{% block extrahead %} - -{% endblock %} \ No newline at end of file diff --git a/packages/core/minos-microservice-cqrs/docs/authors.rst b/packages/core/minos-microservice-cqrs/docs/authors.rst deleted file mode 100644 index cf16fc494..000000000 --- a/packages/core/minos-microservice-cqrs/docs/authors.rst +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../AUTHORS.md diff --git a/packages/core/minos-microservice-cqrs/docs/conf.py b/packages/core/minos-microservice-cqrs/docs/conf.py deleted file mode 100755 index 2a67a8be1..000000000 --- a/packages/core/minos-microservice-cqrs/docs/conf.py +++ /dev/null @@ -1,197 +0,0 @@ -#!/usr/bin/env python -# -# minos documentation build configuration file, created by -# sphinx-quickstart on Fri Jun 9 13:47:02 2017. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -# If extensions (or modules to document with autodoc) are in another -# directory, add these directories to sys.path here. If the directory is -# relative to the documentation root, use os.path.abspath to make it -# absolute, like shown here. -# -import os -import sys - -sys.path.insert(0, os.path.abspath("..")) - -import sphinx_rtd_theme - -from minos import ( - cqrs, -) - -# -- General configuration --------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. - - -extensions = [ - "sphinxcontrib.apidoc", - "sphinx.ext.autodoc", - "sphinx_autodoc_typehints", - "sphinx.ext.viewcode", - "sphinx_rtd_theme", - "m2r2", -] -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -source_suffix = [".rst", ".md"] - -# The master toctree document. -master_doc = "index" - -# General information about the project. -project = "Minos Microservice CQRS" -copyright = "2021, Clariteia" -author = "Minos Framework Devs" - -# The version info for the project you're documenting, acts as replacement -# for |version| and |release|, also used in various other places throughout -# the built documents. -# -# The short X.Y version. -version = cqrs.__version__ -# The full version, including alpha/beta/rc tags. -release = cqrs.__version__ - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = "sphinx" - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = False - - -# -- Options for HTML output ------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# - -html_theme = "sphinx_rtd_theme" - -# Theme options are theme-specific and customize the look and feel of a -# theme further. For a list of options available for each theme, see the -# documentation. -# - -# html_theme_options = { -# "codecov_button": True, -# "description": "Reactive microservices for an asynchronous world", -# "github_button": True, -# "github_user": "Clariteia", -# "github_repo": "cqrs", -# "github_type": "star", -# } - -html_sidebars = {"**": ["about.html", "navigation.html", "searchbox.html"]} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] - - -# -- Options for HTMLHelp output --------------------------------------- - -# Output file base name for HTML help builder. -htmlhelp_basename = "minosdoc" - - -# -- Options for LaTeX output ------------------------------------------ - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass -# [howto, manual, or own class]). -latex_documents = [ - (master_doc, "minos.tex", "Minos Microservice CQRS Documentation", "Minos Framework Devs", "manual"), -] - - -# -- Options for manual page output ------------------------------------ - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [(master_doc, "minos", "Minos Microservice CQRS Documentation", [author], 1)] - - -# -- Options for Texinfo output ---------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ( - master_doc, - "minos", - "Minos Microservice CQRS Documentation", - author, - "minos", - "One line description of project.", - "Miscellaneous", - ), -] - -# "apidoc" extension -apidoc_module_dir = "../minos" -apidoc_output_dir = "api" -apidoc_separate_modules = True -autodoc_default_options = { - "inherited-members": True, - "special-members": "__init__", - "undoc-members": True, -} - -apidoc_toc_file = False -apidoc_module_first = True -apidoc_extra_args = [ - "--force", - "--implicit-namespaces", -] -# "autodoc typehints" extension - -set_type_checking_flag = True -typehints_fully_qualified = True diff --git a/packages/core/minos-microservice-cqrs/docs/history.rst b/packages/core/minos-microservice-cqrs/docs/history.rst deleted file mode 100644 index d26e5be83..000000000 --- a/packages/core/minos-microservice-cqrs/docs/history.rst +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../HISTORY.md diff --git a/packages/core/minos-microservice-cqrs/docs/index.rst b/packages/core/minos-microservice-cqrs/docs/index.rst deleted file mode 100644 index 2b89d9b5b..000000000 --- a/packages/core/minos-microservice-cqrs/docs/index.rst +++ /dev/null @@ -1,18 +0,0 @@ -Welcome to Minos Microservice CQRS's documentation! -====================================== - -.. toctree:: - :maxdepth: 2 - - readme - runthetests - usage - api/minos - authors - history - -Indices and tables -==================== -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/packages/core/minos-microservice-cqrs/docs/make.bat b/packages/core/minos-microservice-cqrs/docs/make.bat deleted file mode 100644 index 49883f1e7..000000000 --- a/packages/core/minos-microservice-cqrs/docs/make.bat +++ /dev/null @@ -1,36 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=python -msphinx -) -set SOURCEDIR=. -set BUILDDIR=_build -set SPHINXPROJ=minos_microservice_cqrs - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The Sphinx module was not found. Make sure you have Sphinx installed, - echo.then set the SPHINXBUILD environment variable to point to the full - echo.path of the 'sphinx-build' executable. Alternatively you may add the - echo.Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% - -:end -popd diff --git a/packages/core/minos-microservice-cqrs/docs/readme.rst b/packages/core/minos-microservice-cqrs/docs/readme.rst deleted file mode 100644 index af09813a4..000000000 --- a/packages/core/minos-microservice-cqrs/docs/readme.rst +++ /dev/null @@ -1,4 +0,0 @@ -Introduction -************** - -.. mdinclude:: ../README.md diff --git a/packages/core/minos-microservice-cqrs/docs/runthetests.rst b/packages/core/minos-microservice-cqrs/docs/runthetests.rst deleted file mode 100644 index 309db1b96..000000000 --- a/packages/core/minos-microservice-cqrs/docs/runthetests.rst +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../RUNTHETESTS.md diff --git a/packages/core/minos-microservice-cqrs/docs/usage.rst b/packages/core/minos-microservice-cqrs/docs/usage.rst deleted file mode 100644 index 617674dc1..000000000 --- a/packages/core/minos-microservice-cqrs/docs/usage.rst +++ /dev/null @@ -1,7 +0,0 @@ -===== -Usage -===== - -To use Minos Microservice CQRS in a project:: - - import minos_microservice_cqrs diff --git a/packages/core/minos-microservice-cqrs/minos/cqrs/__init__.py b/packages/core/minos-microservice-cqrs/minos/cqrs/__init__.py index e45462e8d..131612889 100644 --- a/packages/core/minos-microservice-cqrs/minos/cqrs/__init__.py +++ b/packages/core/minos-microservice-cqrs/minos/cqrs/__init__.py @@ -1,6 +1,8 @@ +"""The CQRS pattern of the Minos Framework.""" + __author__ = "Minos Framework Devs" __email__ = "hey@minos.run" -__version__ = "0.6.0" +__version__ = "0.7.0" from .exceptions import ( MinosCqrsException, diff --git a/packages/core/minos-microservice-cqrs/poetry.lock b/packages/core/minos-microservice-cqrs/poetry.lock index 270a6d262..cb9f296e0 100644 --- a/packages/core/minos-microservice-cqrs/poetry.lock +++ b/packages/core/minos-microservice-cqrs/poetry.lock @@ -19,37 +19,6 @@ develop = ["aiocontextvars (==0.2.2)", "aiohttp-asgi", "aiohttp (<4)", "async-ti raven = ["raven-aiohttp"] uvloop = ["uvloop (>=0.14,<1)"] -[[package]] -name = "aiopg" -version = "1.3.3" -description = "Postgres integration with asyncio." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -async-timeout = ">=3.0,<5.0" -psycopg2-binary = ">=2.8.4" - -[package.extras] -sa = ["sqlalchemy[postgresql_psycopg2binary] (>=1.3,<1.5)"] - -[[package]] -name = "alabaster" -version = "0.7.12" -description = "A configurable sidebar-enabled Sphinx theme" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "async-timeout" -version = "4.0.2" -description = "Timeout context manager for asyncio programs" -category = "main" -optional = false -python-versions = ">=3.6" - [[package]] name = "atomicwrites" version = "1.4.0" @@ -72,20 +41,9 @@ docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] -[[package]] -name = "babel" -version = "2.9.1" -description = "Internationalization utilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -pytz = ">=2015.7" - [[package]] name = "black" -version = "22.1.0" +version = "22.3.0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -96,7 +54,7 @@ click = ">=8.0.0" mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = ">=1.1.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] @@ -113,40 +71,13 @@ category = "main" optional = false python-versions = "*" -[[package]] -name = "certifi" -version = "2021.10.8" -description = "Python package for providing Mozilla's CA Bundle." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "cfgv" -version = "3.3.1" -description = "Validate configuration and produce human readable error messages." -category = "dev" -optional = false -python-versions = ">=3.6.1" - -[[package]] -name = "charset-normalizer" -version = "2.0.12" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "dev" -optional = false -python-versions = ">=3.5.0" - -[package.extras] -unicode_backport = ["unicodedata2"] - [[package]] name = "click" -version = "8.0.4" +version = "8.1.3" description = "Composable command line interface toolkit" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -194,7 +125,7 @@ python-versions = "*" [[package]] name = "dependency-injector" -version = "4.39.0" +version = "4.39.1" description = "Dependency injection framework for Python" category = "main" optional = false @@ -209,25 +140,9 @@ flask = ["flask"] pydantic = ["pydantic"] yaml = ["pyyaml"] -[[package]] -name = "distlib" -version = "0.3.4" -description = "Distribution utilities" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "docutils" -version = "0.17.1" -description = "Docutils -- Python Documentation Utilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - [[package]] name = "fastavro" -version = "1.4.10" +version = "1.4.11" description = "Fast read/write of AVRO files" category = "main" optional = false @@ -239,18 +154,6 @@ lz4 = ["lz4"] snappy = ["python-snappy"] zstandard = ["zstandard"] -[[package]] -name = "filelock" -version = "3.6.0" -description = "A platform independent file lock." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"] -testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-cov", "pytest-timeout (>=1.4.2)"] - [[package]] name = "flake8" version = "4.0.1" @@ -264,49 +167,6 @@ mccabe = ">=0.6.0,<0.7.0" pycodestyle = ">=2.8.0,<2.9.0" pyflakes = ">=2.4.0,<2.5.0" -[[package]] -name = "identify" -version = "2.4.12" -description = "File identification library for Python" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -license = ["ukkonen"] - -[[package]] -name = "idna" -version = "3.3" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "dev" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "imagesize" -version = "1.3.0" -description = "Getting image size from png/jpeg/jpeg2000/gif file" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "importlib-metadata" -version = "4.11.3" -description = "Read metadata from Python packages" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] -perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] - [[package]] name = "iniconfig" version = "1.1.1" @@ -329,48 +189,6 @@ requirements_deprecated_finder = ["pipreqs", "pip-api"] colors = ["colorama (>=0.4.3,<0.5.0)"] plugins = ["setuptools"] -[[package]] -name = "jinja2" -version = "3.1.1" -description = "A very fast and expressive template engine." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - -[[package]] -name = "lmdb" -version = "1.3.0" -description = "Universal Python binding for the LMDB 'Lightning' Database" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "m2r2" -version = "0.3.2" -description = "Markdown and reStructuredText in a single file." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -docutils = "*" -mistune = "0.8.4" - -[[package]] -name = "markupsafe" -version = "2.1.1" -description = "Safely add untrusted strings to HTML/XML markup." -category = "dev" -optional = false -python-versions = ">=3.7" - [[package]] name = "mccabe" version = "0.6.1" @@ -381,7 +199,7 @@ python-versions = "*" [[package]] name = "minos-microservice-aggregate" -version = "0.6.0" +version = "0.7.0" description = "The Aggregate pattern of the Minos Framework" category = "main" optional = false @@ -390,9 +208,8 @@ develop = true [package.dependencies] cached-property = "^1.5.2" -minos-microservice-common = "^0.6.0" -minos-microservice-networks = "^0.6.0" -psycopg2-binary = "^2.9.3" +minos-microservice-common = "^0.7.0*" +minos-microservice-networks = "^0.7.0*" [package.source] type = "directory" @@ -400,7 +217,7 @@ url = "../minos-microservice-aggregate" [[package]] name = "minos-microservice-common" -version = "0.6.0" +version = "0.7.0" description = "The common core of the Minos Framework" category = "main" optional = false @@ -408,12 +225,10 @@ python-versions = "^3.9" develop = true [package.dependencies] -aiomisc = ">=14.0.3,<16.0.0" -aiopg = "^1.2.1" +aiomisc = ">=14.0.3,<15.8.0" cached-property = "^1.5.2" dependency-injector = "^4.32.2" fastavro = "^1.4.0" -lmdb = "^1.2.1" orjson = "^3.5.2" PyYAML = ">=5.4.1,<7.0.0" uvloop = "^0.16.0" @@ -424,7 +239,7 @@ url = "../minos-microservice-common" [[package]] name = "minos-microservice-networks" -version = "0.6.0" +version = "0.7.0" description = "The networks core of the Minos Framework" category = "main" optional = false @@ -432,23 +247,13 @@ python-versions = "^3.9" develop = true [package.dependencies] -aiopg = "^1.2.1" crontab = "^0.23.0" -minos-microservice-common = "^0.6.0" -psycopg2-binary = "^2.9.3" +minos-microservice-common = "^0.7.0*" [package.source] type = "directory" url = "../minos-microservice-networks" -[[package]] -name = "mistune" -version = "0.8.4" -description = "The fastest markdown parser in pure Python" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "mypy-extensions" version = "0.4.3" @@ -457,17 +262,9 @@ category = "dev" optional = false python-versions = "*" -[[package]] -name = "nodeenv" -version = "1.6.0" -description = "Node.js virtual environment builder" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "orjson" -version = "3.6.7" +version = "3.6.8" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" category = "main" optional = false @@ -492,25 +289,17 @@ category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -[[package]] -name = "pbr" -version = "5.8.1" -description = "Python Build Reasonableness" -category = "dev" -optional = false -python-versions = ">=2.6" - [[package]] name = "platformdirs" -version = "2.5.1" +version = "2.5.2" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" [package.extras] -docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] +test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] [[package]] name = "pluggy" @@ -524,30 +313,6 @@ python-versions = ">=3.6" dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] -[[package]] -name = "pre-commit" -version = "2.17.0" -description = "A framework for managing and maintaining multi-language pre-commit hooks." -category = "dev" -optional = false -python-versions = ">=3.6.1" - -[package.dependencies] -cfgv = ">=2.0.0" -identify = ">=1.0.0" -nodeenv = ">=0.11.1" -pyyaml = ">=5.1" -toml = "*" -virtualenv = ">=20.0.8" - -[[package]] -name = "psycopg2-binary" -version = "2.9.3" -description = "psycopg2 - Python-PostgreSQL Database Adapter" -category = "main" -optional = false -python-versions = ">=3.6" - [[package]] name = "py" version = "1.11.0" @@ -572,28 +337,20 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -[[package]] -name = "pygments" -version = "2.11.2" -description = "Pygments is a syntax highlighting package written in Python." -category = "dev" -optional = false -python-versions = ">=3.5" - [[package]] name = "pyparsing" -version = "3.0.7" -description = "Python parsing module" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.6.8" [package.extras] -diagrams = ["jinja2", "railroad-diagrams"] +diagrams = ["railroad-diagrams", "jinja2"] [[package]] name = "pytest" -version = "7.1.1" +version = "7.1.2" description = "pytest: simple powerful testing with Python" category = "dev" optional = false @@ -612,14 +369,6 @@ tomli = ">=1.0.0" [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] -[[package]] -name = "pytz" -version = "2022.1" -description = "World timezone definitions, modern and historical" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "pyyaml" version = "6.0" @@ -628,24 +377,6 @@ category = "main" optional = false python-versions = ">=3.6" -[[package]] -name = "requests" -version = "2.27.1" -description = "Python HTTP for Humans." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} -urllib3 = ">=1.21.1,<1.27" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] - [[package]] name = "six" version = "1.16.0" @@ -654,167 +385,6 @@ category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -[[package]] -name = "snowballstemmer" -version = "2.2.0" -description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "sphinx" -version = "4.5.0" -description = "Python documentation generator" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -alabaster = ">=0.7,<0.8" -babel = ">=1.3" -colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.14,<0.18" -imagesize = "*" -importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} -Jinja2 = ">=2.3" -packaging = "*" -Pygments = ">=2.0" -requests = ">=2.5.0" -snowballstemmer = ">=1.1" -sphinxcontrib-applehelp = "*" -sphinxcontrib-devhelp = "*" -sphinxcontrib-htmlhelp = ">=2.0.0" -sphinxcontrib-jsmath = "*" -sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = ">=1.1.5" - -[package.extras] -docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.931)", "docutils-stubs", "types-typed-ast", "types-requests"] -test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] - -[[package]] -name = "sphinx-autodoc-typehints" -version = "1.17.0" -description = "Type hints (PEP 484) support for the Sphinx autodoc extension" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -Sphinx = ">=4" - -[package.extras] -testing = ["covdefaults (>=2)", "coverage (>=6)", "diff-cover (>=6.4)", "nptyping (>=1)", "pytest (>=6)", "pytest-cov (>=3)", "sphobjinv (>=2)", "typing-extensions (>=3.5)"] -type_comments = ["typed-ast (>=1.4.0)"] - -[[package]] -name = "sphinx-rtd-theme" -version = "1.0.0" -description = "Read the Docs theme for Sphinx" -category = "dev" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" - -[package.dependencies] -docutils = "<0.18" -sphinx = ">=1.6" - -[package.extras] -dev = ["transifex-client", "sphinxcontrib-httpdomain", "bump2version"] - -[[package]] -name = "sphinxcontrib-apidoc" -version = "0.3.0" -description = "A Sphinx extension for running 'sphinx-apidoc' on each build" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -pbr = "*" -Sphinx = ">=1.6.0" - -[[package]] -name = "sphinxcontrib-applehelp" -version = "1.0.2" -description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-devhelp" -version = "1.0.2" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-htmlhelp" -version = "2.0.0" -description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest", "html5lib"] - -[[package]] -name = "sphinxcontrib-jsmath" -version = "1.0.1" -description = "A sphinx extension which renders display math in HTML via JavaScript" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -test = ["pytest", "flake8", "mypy"] - -[[package]] -name = "sphinxcontrib-qthelp" -version = "1.0.3" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-serializinghtml" -version = "1.1.5" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - [[package]] name = "tomli" version = "2.0.1" @@ -825,24 +395,11 @@ python-versions = ">=3.7" [[package]] name = "typing-extensions" -version = "4.1.1" -description = "Backported and Experimental Type Hints for Python 3.6+" +version = "4.2.0" +description = "Backported and Experimental Type Hints for Python 3.7+" category = "dev" optional = false -python-versions = ">=3.6" - -[[package]] -name = "urllib3" -version = "1.26.9" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" - -[package.extras] -brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +python-versions = ">=3.7" [[package]] name = "uvloop" @@ -857,58 +414,16 @@ dev = ["Cython (>=0.29.24,<0.30.0)", "pytest (>=3.6.0)", "Sphinx (>=4.1.2,<4.2.0 docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)"] test = ["aiohttp", "flake8 (>=3.9.2,<3.10.0)", "psutil", "pycodestyle (>=2.7.0,<2.8.0)", "pyOpenSSL (>=19.0.0,<19.1.0)", "mypy (>=0.800)"] -[[package]] -name = "virtualenv" -version = "20.14.0" -description = "Virtual Python Environment builder" -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - -[package.dependencies] -distlib = ">=0.3.1,<1" -filelock = ">=3.2,<4" -platformdirs = ">=2,<3" -six = ">=1.9.0,<2" - -[package.extras] -docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=21.3)"] -testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)"] - -[[package]] -name = "zipp" -version = "3.7.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] - [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "23501a6766a4dd4ee55a8b51c4860646b8408e31948d63ad9517a99f1b6d4894" +content-hash = "31fcebfdf02fa9e5d6d2d8ff3eaaf63f44de9684b7b2c994b2ea889c78b2d733" [metadata.files] aiomisc = [ {file = "aiomisc-15.7.3-py3-none-any.whl", hash = "sha256:0403e83268e98d0f2a125a70d13303fe1a2358e36db3daf02df032c7fa4f1525"}, {file = "aiomisc-15.7.3.tar.gz", hash = "sha256:ba250a34bd4609ced36111cb50580f57c3d52f3955f953a53ecb2986988baedc"}, ] -aiopg = [ - {file = "aiopg-1.3.3-py3-none-any.whl", hash = "sha256:2842dd8741460eeef940032dcb577bfba4d4115205dd82a73ce13b3271f5bf0a"}, - {file = "aiopg-1.3.3.tar.gz", hash = "sha256:547c6ba4ea0d73c2a11a2f44387d7133cc01d3c6f3b8ed976c0ac1eff4f595d7"}, -] -alabaster = [ - {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, - {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, -] -async-timeout = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, -] atomicwrites = [ {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, @@ -917,54 +432,38 @@ attrs = [ {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] -babel = [ - {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"}, - {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, -] black = [ - {file = "black-22.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1297c63b9e1b96a3d0da2d85d11cd9bf8664251fd69ddac068b98dc4f34f73b6"}, - {file = "black-22.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2ff96450d3ad9ea499fc4c60e425a1439c2120cbbc1ab959ff20f7c76ec7e866"}, - {file = "black-22.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e21e1f1efa65a50e3960edd068b6ae6d64ad6235bd8bfea116a03b21836af71"}, - {file = "black-22.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f69158a7d120fd641d1fa9a921d898e20d52e44a74a6fbbcc570a62a6bc8ab"}, - {file = "black-22.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:228b5ae2c8e3d6227e4bde5920d2fc66cc3400fde7bcc74f480cb07ef0b570d5"}, - {file = "black-22.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b1a5ed73ab4c482208d20434f700d514f66ffe2840f63a6252ecc43a9bc77e8a"}, - {file = "black-22.1.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35944b7100af4a985abfcaa860b06af15590deb1f392f06c8683b4381e8eeaf0"}, - {file = "black-22.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7835fee5238fc0a0baf6c9268fb816b5f5cd9b8793423a75e8cd663c48d073ba"}, - {file = "black-22.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dae63f2dbf82882fa3b2a3c49c32bffe144970a573cd68d247af6560fc493ae1"}, - {file = "black-22.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fa1db02410b1924b6749c245ab38d30621564e658297484952f3d8a39fce7e8"}, - {file = "black-22.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c8226f50b8c34a14608b848dc23a46e5d08397d009446353dad45e04af0c8e28"}, - {file = "black-22.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2d6f331c02f0f40aa51a22e479c8209d37fcd520c77721c034517d44eecf5912"}, - {file = "black-22.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:742ce9af3086e5bd07e58c8feb09dbb2b047b7f566eb5f5bc63fd455814979f3"}, - {file = "black-22.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fdb8754b453fb15fad3f72cd9cad3e16776f0964d67cf30ebcbf10327a3777a3"}, - {file = "black-22.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5660feab44c2e3cb24b2419b998846cbb01c23c7fe645fee45087efa3da2d61"}, - {file = "black-22.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:6f2f01381f91c1efb1451998bd65a129b3ed6f64f79663a55fe0e9b74a5f81fd"}, - {file = "black-22.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:efbadd9b52c060a8fc3b9658744091cb33c31f830b3f074422ed27bad2b18e8f"}, - {file = "black-22.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8871fcb4b447206904932b54b567923e5be802b9b19b744fdff092bd2f3118d0"}, - {file = "black-22.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccad888050f5393f0d6029deea2a33e5ae371fd182a697313bdbd835d3edaf9c"}, - {file = "black-22.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07e5c049442d7ca1a2fc273c79d1aecbbf1bc858f62e8184abe1ad175c4f7cc2"}, - {file = "black-22.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:373922fc66676133ddc3e754e4509196a8c392fec3f5ca4486673e685a421321"}, - {file = "black-22.1.0-py3-none-any.whl", hash = "sha256:3524739d76b6b3ed1132422bf9d82123cd1705086723bc3e235ca39fd21c667d"}, - {file = "black-22.1.0.tar.gz", hash = "sha256:a7c0192d35635f6fc1174be575cb7915e92e5dd629ee79fdaf0dcfa41a80afb5"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"}, + {file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"}, + {file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"}, + {file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"}, + {file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"}, + {file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"}, + {file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"}, + {file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"}, + {file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"}, + {file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"}, + {file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"}, + {file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"}, + {file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"}, + {file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"}, + {file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"}, + {file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"}, + {file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"}, + {file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"}, ] cached-property = [ {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, ] -certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, -] -cfgv = [ - {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, - {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, - {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, -] click = [ - {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"}, - {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, ] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, @@ -1021,93 +520,65 @@ crontab = [ {file = "crontab-0.23.0.tar.gz", hash = "sha256:ca79dede9c2f572bb32f38703e8fddcf3427e86edc838f2ffe7ae4b9ee2b0733"}, ] dependency-injector = [ - {file = "dependency-injector-4.39.0.tar.gz", hash = "sha256:35d6c03683f512bcc8b0c950890ac40ce19bdacc7de4d59249dd61ed818f0930"}, - {file = "dependency_injector-4.39.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f046a5dbe7e5764fae9a69423f66241a8fdb62acea5c32b0c41a7da94b7f6da3"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfdd78f7d97c1f6ba4a3926a2e404507a4f77ecbd610d4a1b37dedb5c0b57ad1"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:512c23da829bb8ac2ae13f33aa017acf58ae9408e7796a146e1644e8b8471b5b"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7dc81df7f566bfdacdee448bc71085acd163b935860d2b2504b4f32840b3b692"}, - {file = "dependency_injector-4.39.0-cp310-cp310-win32.whl", hash = "sha256:9ffc5393700f45d740abecc50cdc1251eae69e50516ec9d0a48fba0e875ed083"}, - {file = "dependency_injector-4.39.0-cp310-cp310-win_amd64.whl", hash = "sha256:9118f36a3df1e9819074ccb35734d663812c8f6ef81d45c8e4ec81ce5dccac9c"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:1ff723aaf096fabb05cf8b08ba99888538a2a77e03a5082b70cd54eb9df619f3"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bb913900ceb1766f55dc628052d8e191a9c2b1737a0d775fbc230af90ab2c1e"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:329e801eb46b9933432481d3142e563e28a90d77952edac43126264c36ed2278"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1c1a67c699ae2c0234f07d121736fa44e8fe2d56c14b2fd210c3e04a151620bb"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-win32.whl", hash = "sha256:e1347defd46fe9067f857b1174bdb1b19458232ac1a485507df2ddff084cf31c"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-win_amd64.whl", hash = "sha256:9581c4c90f1aaf85ffb9b06bac7ac592df7076522881145321a9dd0702fee828"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8da8ff05fa17e852aa5831a600177e5bb72bf53b8a184f6922ae715387a460ba"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58a56999cebd8b2ba9c19e514e383924865e5f7d6273f8e5b7d85468d9042059"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4914332d6145fb7cfc5f2236a823a3859b92a7e75566ffca0987dcc0f7f7be53"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00aea40ee2d400a8091947ad97cda34b230628aeeac1774f8fa9a3500b5704b2"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-win32.whl", hash = "sha256:b94a64bc73d86d04b33c698fae4b9dad2536a8534ac6922c8226764da5d62d17"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4f59cc0b0d3beb82875d94b7e725b5097a7a454e8e323625ba6ac3095a29300e"}, - {file = "dependency_injector-4.39.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a8d840348f01d997e32394dba36e09c1ecd312b286befb6b3ca27526002ae94"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92097ffabca89d1539e200f91bfa13ff8ca502c9057391c3b78787d50fe502ed"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4a889e116fe76742ef6ff27d5e93ee9e364cbe7bbc6678df8c5dd54597a6fc"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a31e00961fdc1b3808a9e2adeb1107ec4bba0ad3a90b116af9d116a667e4626a"}, - {file = "dependency_injector-4.39.0-cp38-cp38-win32.whl", hash = "sha256:717720a220eee611ea96c0089246ec2103b168303ca2cd2c8a7cd3856da6f689"}, - {file = "dependency_injector-4.39.0-cp38-cp38-win_amd64.whl", hash = "sha256:05c0bbef90182a0d35d4d3f9ab879109070d204394578b12f0eff9eca51987ef"}, - {file = "dependency_injector-4.39.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f10bf8d146edffbee2ba5c5776395625c98048a31997afd481ce27792afee2af"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30c093b155c01e50723e8ecd2a14230daa4417356c8fb5a27369ae5be24b21d9"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dda8a85c8221e6ee433caa01c1bc4fed610381924780e04470572682569cdb8f"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ff8df47a901218a3257650f3f3a6b402dd58cb4f57b4a34d6e8092112f6e8480"}, - {file = "dependency_injector-4.39.0-cp39-cp39-win32.whl", hash = "sha256:e078c84c19ae73883a57e9b35edd843925b2b44833cd098708139a98abee5a96"}, - {file = "dependency_injector-4.39.0-cp39-cp39-win_amd64.whl", hash = "sha256:c02b6796320d6b9363d566045eeec243fa4a412ad68dcc6b2391307e93d0d401"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:865bf5ceba3e32f00e36bfcbefb1267b10df961fb2aab809f5e205968e1cd59b"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ce8645ffd8cc15a7bbd20c02e6439a61c1566a1db22766893bf79981fb89a4e"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dbdab8b024055865926a78ecbc3a6280345f4615e5c505511bbd7c6c322b1796"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:af996d66350704261382dc4e10f324eba5d23e35c04a9e75c7cb58fbea7f1f1d"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d390c6e97fec13fba832b7e39e07c43760ed3d46af4887005f679c0ab6eb9b2e"}, -] -distlib = [ - {file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"}, - {file = "distlib-0.3.4.zip", hash = "sha256:e4b58818180336dc9c529bfb9a0b58728ffc09ad92027a3f30b7cd91e3458579"}, -] -docutils = [ - {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, - {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, + {file = "dependency-injector-4.39.1.tar.gz", hash = "sha256:9ab76dc5e19b2692aaca49e00f9b41a087138d139b0ec985f92ff0498f038772"}, + {file = "dependency_injector-4.39.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c788a3d5482e63b5fd55e14fc258f1ff0b51b411927ab132ef0f689cb5d1183f"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0832e0457a360725cd1d1037b77b85478aeeaacc60e85ecceeb8020409e7b62"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d51998fff9704fd01d11c3c48f4e88d8506cb6afa1ee41409a881a5a51dae3fc"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea484cd13fc62966bf5582df0816205feee072d18f228aac75f7807b43f223ae"}, + {file = "dependency_injector-4.39.1-cp310-cp310-win32.whl", hash = "sha256:17389e53ec29ca13570319cf2065dcc4c2f6d36db5dd792bb1e8f2c39a9f146b"}, + {file = "dependency_injector-4.39.1-cp310-cp310-win_amd64.whl", hash = "sha256:55b0988489267c5a580f419133770ffe293057f2064da1c9ad6a2cc69666739b"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b297c3e79d3633cc56366386ae1f7dbce1587673cca2f559c368c1e936a1fa94"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2728827c5abb2420c5811e218262ae1b77a48e76cc9eebc6b4f55fee48a1a18d"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:029e42b064ab8cb5b2559be040ff682c7aa81592f1654a82355475956df17803"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:305e3db3f4bf40f64caaa1303e03005174e78d2339d2ae517b34c011ec2300f9"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-win32.whl", hash = "sha256:a661dd23a5e4e2f6bf4a729de7fadbe148c9a4a298dbcadfc5a94584b6930970"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-win_amd64.whl", hash = "sha256:340d6e7af5c4729d20c837d6d1e8a2626c24a05259dff746406cc823e26ba1e7"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a1553dac1c95f0de1f910b0025ee4570ea078a07d576bcdc2168990e719cea50"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c7baaa64d93359ee08c15d68579cc803e11d9becaf961f5a66b94ff627248e1"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7a27bf1951a066cf347b886cc7ab0f37dcbd1ad59bffcfe721c8c12a189a150d"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da6e2d685f7d0c65257f08133b68d9bf74ec319b90a0f21b4f629d168ce5f68f"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-win32.whl", hash = "sha256:a8ddd03ca86e67e9d3cc038793d34fbfccab12e6145df813e72bf14f9371f2ea"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-win_amd64.whl", hash = "sha256:e01a319ea05cd86b520201386dcb53a81a5400cb82fcc2f006bd7e92c0c51a0a"}, + {file = "dependency_injector-4.39.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4704804bde25b694aa65201927937a9d82d8bc055cb3dadc68eb05988bd34fa9"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0935d50b263169e7b0826a2fb6be80d6a4f2a7c59e6dd9876f86da3243bea9eb"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3c34aa5abb1826b6189f47daf6e469d4293c1d01693233da2c1b923816270cc5"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:db64904c9b9a88756cfece3e3ed078a2b57127642711dd08af342dba8abf9667"}, + {file = "dependency_injector-4.39.1-cp38-cp38-win32.whl", hash = "sha256:66ebe728194adc8720dbc4d662edbbfa55659ff23c9c493fb2dae0bfd4df5734"}, + {file = "dependency_injector-4.39.1-cp38-cp38-win_amd64.whl", hash = "sha256:4349974620f630d6726808e1291ec99713b64d449b84eb01581ee807a5a5c224"}, + {file = "dependency_injector-4.39.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d87cad0899b05cd08931bfb68ddf7be77711a67b0649c37f2045d7808977b082"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8efd965e5cfdd9f339ec895e73c119569851adedc175088d34a670f5206fea63"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:27f69485ca6b85c31d162ee86cf6ef71bb71dce9cd2b5d0745425dfc551eefa1"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a25b63de59dff04ec78f5161f00c0222a04a23def5d1f0eda14e389a32baf428"}, + {file = "dependency_injector-4.39.1-cp39-cp39-win32.whl", hash = "sha256:a14274f50d125b4579314c355e22af07def1a96641ca94bd75edcf1400b89477"}, + {file = "dependency_injector-4.39.1-cp39-cp39-win_amd64.whl", hash = "sha256:9950039d00625f9252cd26378a4406342b256886bb61e4db8b65e9f01270f53e"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6d7f39cd54678741e132e13da3a1367ac18058cbda61fe39d61c8583aa6fd757"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2368c7ba3c9ffaf816ea0f2d14c78d481491b805f62ac8496a78a51397d4689"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:84e32407bb16c58aa0d4b5ed8485537bc66ccc14cfffae7022f1204e35ec939a"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f2d80a42c546e1f934d427b071630d86653cd4a60c74b570c4ffb03025c1f1f9"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ca126bbed370b8c002c859ebeb76f6d83eba2d7fb5d66f37f47cfc19661d2889"}, ] fastavro = [ - {file = "fastavro-1.4.10-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:f225c81e869b3cefef6f2b478cd452693181ed7e645be3cea4d82024354ecaa0"}, - {file = "fastavro-1.4.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7669302c9124b7cd6c1bdff80c77116b2290c984814077fb7d01d7389586054"}, - {file = "fastavro-1.4.10-cp310-cp310-win_amd64.whl", hash = "sha256:995525bdfbdfef205ea148b5bc6a9fe5ccf921931123c39d9aad75a2b661681e"}, - {file = "fastavro-1.4.10-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:64244c53f1e4853184c2f7383d0332e1dcb34c38c05e6613530ade0378e8acfc"}, - {file = "fastavro-1.4.10-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c60965da6dc7a91e00ccd84d84797fad746555f44e8a816c4cc460fb231c44fe"}, - {file = "fastavro-1.4.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10eb25378f37dc00c10e83c4c0442c1a6d1b871f74a6dfdfc12b6447962bbdd0"}, - {file = "fastavro-1.4.10-cp37-cp37m-win_amd64.whl", hash = "sha256:d5719adf6045fc743de5fa738d561a81e58dc782c94f1b16cb21b5dd6253e7fd"}, - {file = "fastavro-1.4.10-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:24c4a1a8cc92e135ecfcd9cbd1f6cfa088cbc74d78c18e02a609cb11fa33778d"}, - {file = "fastavro-1.4.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0934490b0c3bcfd6bcbacbcb5144c6b5e4298cda209fbb17c856adf5405127dd"}, - {file = "fastavro-1.4.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a23763d73412c077aee401a0368c64cbc23859e26711dbae78a3cf0227f65165"}, - {file = "fastavro-1.4.10-cp38-cp38-win_amd64.whl", hash = "sha256:09f1dfdd8192ae09e0f477d1f024d8054fccdb099ad495d2a796bcee3cadebd1"}, - {file = "fastavro-1.4.10-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:0c6695753fa3035bbd0fa5cb21bf1b5dad39483c669b32ca0bb55fb07c1ccc87"}, - {file = "fastavro-1.4.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35f960dbba04647d8d6d5616f879622d2a1e8a84eb2d2e02a883a22e0803463a"}, - {file = "fastavro-1.4.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9660878ca01e3dbbee12385c5902a2b6b12ecbb5af4733d1026175a14b1ef67f"}, - {file = "fastavro-1.4.10-cp39-cp39-win_amd64.whl", hash = "sha256:64cbd386e408b3bcb2de53b1f847163073eb0d0d0338db65f76051c6ba9a9bc1"}, - {file = "fastavro-1.4.10.tar.gz", hash = "sha256:a24f9dd803c44bfb599476b000f9bd0088f7ac2401e6c20818f38d8af12785a0"}, -] -filelock = [ - {file = "filelock-3.6.0-py3-none-any.whl", hash = "sha256:f8314284bfffbdcfa0ff3d7992b023d4c628ced6feb957351d4c48d059f56bc0"}, - {file = "filelock-3.6.0.tar.gz", hash = "sha256:9cd540a9352e432c7246a48fe4e8712b10acb1df2ad1f30e8c070b82ae1fed85"}, + {file = "fastavro-1.4.11-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:44f01008f95d685edacc4b10366c755d25612df00924349f7d34a29f08522ce3"}, + {file = "fastavro-1.4.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18f5e736d12e67348f253da8a332d7c3b483ca04f2b6e772befa79d1a46bac9d"}, + {file = "fastavro-1.4.11-cp310-cp310-win_amd64.whl", hash = "sha256:8dca11bc3191cd7de0a3c4b76a70dac493356a219e96ebcde0def1f06faddef7"}, + {file = "fastavro-1.4.11-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:7a2a0bf03686f9d860e8f8476be000f5b3e6cc9af6853dbabab2ef9cfa5dc3a0"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c17e3decfac260e1be4d02d1903d2483eec2f3ce7f92c9b808a0f6a81572c4b"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19ba25c6529f50722a7618cc4ca24c7d265def57fd9f94e4e554e1df8cce38d2"}, + {file = "fastavro-1.4.11-cp37-cp37m-win_amd64.whl", hash = "sha256:ceaba04da9419f40899a670eb62eb373a127b511bb8e3ae4f6f1f23ec49bd0e4"}, + {file = "fastavro-1.4.11-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:732eab3a1ae5d2c3f4b52e747c55bcc41c4df0eb7e8a395038080741a3c0a934"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c03d3c802b71f44e7b3442abae961bba996258244bd222b242ad1e5cb7754e57"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cb7475a9b25b9f8aebe7eb756dafedd0369434571062f3883d894281befd7c"}, + {file = "fastavro-1.4.11-cp38-cp38-win_amd64.whl", hash = "sha256:ce0776f54591aef90bcd02bd919964abe4c2ad2a10a4336c3a1b66cef289b41c"}, + {file = "fastavro-1.4.11-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:621e72cc365c9539d7590e7b43e48a62e6bfb4c2de7c16837fed54d113d7312c"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:842b25782f911ee8c626f9d9fedc2ef01aeac272536fe90ee6d45b2ae7cdb024"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8491bfcba25c9d661289f884688e5a4f56f2ee389a240d0ad02692495a9a087"}, + {file = "fastavro-1.4.11-cp39-cp39-win_amd64.whl", hash = "sha256:c94130a8c8d80073eb0276844915aa5e928ae322024e76dc57943542ccda211c"}, + {file = "fastavro-1.4.11.tar.gz", hash = "sha256:7c64332ad52de0134be9a933ca986514c3ff85c63d54bc5398c31f0498ac1820"}, ] flake8 = [ {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, ] -identify = [ - {file = "identify-2.4.12-py2.py3-none-any.whl", hash = "sha256:5f06b14366bd1facb88b00540a1de05b69b310cbc2654db3c7e07fa3a4339323"}, - {file = "identify-2.4.12.tar.gz", hash = "sha256:3f3244a559290e7d3deb9e9adc7b33594c1bc85a9dd82e0f1be519bf12a1ec17"}, -] -idna = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, -] -imagesize = [ - {file = "imagesize-1.3.0-py2.py3-none-any.whl", hash = "sha256:1db2f82529e53c3e929e8926a1fa9235aa82d0bd0c580359c67ec31b2fddaa8c"}, - {file = "imagesize-1.3.0.tar.gz", hash = "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d"}, -] -importlib-metadata = [ - {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, - {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, -] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, @@ -1116,85 +587,6 @@ isort = [ {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, ] -jinja2 = [ - {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"}, - {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"}, -] -lmdb = [ - {file = "lmdb-1.3.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:63cb73fe7ce9eb93d992d632c85a0476b4332670d9e6a2802b5062f603b7809f"}, - {file = "lmdb-1.3.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:abbc439cd9fe60ffd6197009087ea885ac150017dc85384093b1d376f83f0ec4"}, - {file = "lmdb-1.3.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6260a526e4ad85b1f374a5ba9475bf369fb07e7728ea6ec57226b02c40d1976b"}, - {file = "lmdb-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e568ae0887ae196340947d9800136e90feaed6b86a261ef01f01b2ba65fc8106"}, - {file = "lmdb-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6a816954d212f40fd15007cd81ab7a6bebb77436d949a6a9ae04af57fc127f3"}, - {file = "lmdb-1.3.0-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:fa6439356e591d3249ab0e1778a6f8d8408e993f66dc911914c78208f5310309"}, - {file = "lmdb-1.3.0-cp35-cp35m-win_amd64.whl", hash = "sha256:c6adbd6f7f9048e97f31a069e652eb51020a81e80a0ce92dbb9810d21da2409a"}, - {file = "lmdb-1.3.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:eefb392f6b5cd43aada49258c5a79be11cb2c8cd3fc3e2d9319a1e0b9f906458"}, - {file = "lmdb-1.3.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a14aca2651c3af6f0d0a6b9168200eea0c8f2d27c40b01a442f33329a6e8dff"}, - {file = "lmdb-1.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cfa4aa9c67f8aee89b23005e98d1f3f32490b6b905fd1cb604b207cbd5755ab"}, - {file = "lmdb-1.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7da05d70fcc6561ac6b09e9fb1bf64b7ca294652c64c8a2889273970cee796b9"}, - {file = "lmdb-1.3.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:008243762decf8f6c90430a9bced56290ebbcdb5e877d90e42343bb97033e494"}, - {file = "lmdb-1.3.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:17215a42a4b9814c383deabecb160581e4fb75d00198eef0e3cea54f230ffbea"}, - {file = "lmdb-1.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65334eafa5d430b18d81ebd5362559a41483c362e1931f6e1b15bab2ecb7d75d"}, - {file = "lmdb-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:18c69fabdaf04efaf246587739cc1062b3e57c6ef0743f5c418df89e5e7e7b9b"}, - {file = "lmdb-1.3.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:41318717ab5d15ad2d6d263d34fbf614a045210f64b25e59ce734bb2105e421f"}, - {file = "lmdb-1.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:df2724bad7820114a205472994091097d0fa65a3e5fff5a8e688d123fb8c6326"}, - {file = "lmdb-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ddd590e1c7fcb395931aa3782fb89b9db4550ab2d81d006ecd239e0d462bc41"}, - {file = "lmdb-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:4172fba19417d7b29409beca7d73c067b54e5d8ab1fb9b51d7b4c1445d20a167"}, - {file = "lmdb-1.3.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2df38115dd9428a54d59ae7c712a4c7cce0d6b1d66056de4b1a8c38718066106"}, - {file = "lmdb-1.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d9103aa4908f0bca43c5911ca067d4e3d01f682dff0c0381a1239bd2bd757984"}, - {file = "lmdb-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:394df860c3f93cfd92b6f4caba785f38208cc9614c18b3803f83a2cc1695042f"}, - {file = "lmdb-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:62ab28e3593bdc318ea2f2fa1574e5fca3b6d1f264686d773ba54a637d4f563b"}, - {file = "lmdb-1.3.0-pp27-pypy_73-macosx_10_7_x86_64.whl", hash = "sha256:e6a704b3baced9182836c7f77b769f23856f3a8f62d0282b1bc1feaf81a86712"}, - {file = "lmdb-1.3.0-pp27-pypy_73-win_amd64.whl", hash = "sha256:08f4b5129f4683802569b02581142e415c8dcc0ff07605983ec1b07804cecbad"}, - {file = "lmdb-1.3.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:f291e3f561f58dddf63a92a5a6a4b8af3a0920b6705d35e2f80e52e86ee238a2"}, - {file = "lmdb-1.3.0.tar.gz", hash = "sha256:60a11efc21aaf009d06518996360eed346f6000bfc9de05114374230879f992e"}, -] -m2r2 = [ - {file = "m2r2-0.3.2-py3-none-any.whl", hash = "sha256:d3684086b61b4bebe2307f15189495360f05a123c9bda2a66462649b7ca236aa"}, - {file = "m2r2-0.3.2.tar.gz", hash = "sha256:ccd95b052dcd1ac7442ecb3111262b2001c10e4119b459c34c93ac7a5c2c7868"}, -] -markupsafe = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, -] mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, @@ -1202,51 +594,43 @@ mccabe = [ minos-microservice-aggregate = [] minos-microservice-common = [] minos-microservice-networks = [] -mistune = [ - {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, - {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, -] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] -nodeenv = [ - {file = "nodeenv-1.6.0-py2.py3-none-any.whl", hash = "sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"}, - {file = "nodeenv-1.6.0.tar.gz", hash = "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b"}, -] orjson = [ - {file = "orjson-3.6.7-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:93188a9d6eb566419ad48befa202dfe7cd7a161756444b99c4ec77faea9352a4"}, - {file = "orjson-3.6.7-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:82515226ecb77689a029061552b5df1802b75d861780c401e96ca6bc8495f775"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3af57ffab7848aaec6ba6b9e9b41331250b57bf696f9d502bacdc71a0ebab0ba"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:a7297504d1142e7efa236ffc53f056d73934a993a08646dbcee89fc4308a8fcf"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:5a50cde0dbbde255ce751fd1bca39d00ecd878ba0903c0480961b31984f2fab7"}, - {file = "orjson-3.6.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d21f9a2d1c30e58070f93988db4cad154b9009fafbde238b52c1c760e3607fbe"}, - {file = "orjson-3.6.7-cp310-none-win_amd64.whl", hash = "sha256:e152464c4606b49398afd911777decebcf9749cc8810c5b4199039e1afb0991e"}, - {file = "orjson-3.6.7-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:0a65f3c403f38b0117c6dd8e76e85a7bd51fcd92f06c5598dfeddbc44697d3e5"}, - {file = "orjson-3.6.7-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:6c47cfca18e41f7f37b08ff3e7abf5ada2d0f27b5ade934f05be5fc5bb956e9d"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:63185af814c243fad7a72441e5f98120c9ecddf2675befa486d669fb65539e9b"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2da6fde42182b80b40df2e6ab855c55090ebfa3fcc21c182b7ad1762b61d55c"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:48c5831ec388b4e2682d4ff56d6bfa4a2ef76c963f5e75f4ff4785f9cf338a80"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:913fac5d594ccabf5e8fbac15b9b3bb9c576d537d49eeec9f664e7a64dde4c4b"}, - {file = "orjson-3.6.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:58f244775f20476e5851e7546df109f75160a5178d44257d437ba6d7e562bfe8"}, - {file = "orjson-3.6.7-cp37-none-win_amd64.whl", hash = "sha256:2d5f45c6b85e5f14646df2d32ecd7ff20fcccc71c0ea1155f4d3df8c5299bbb7"}, - {file = "orjson-3.6.7-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:612d242493afeeb2068bc72ff2544aa3b1e627578fcf92edee9daebb5893ffea"}, - {file = "orjson-3.6.7-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:539cdc5067db38db27985e257772d073cd2eb9462d0a41bde96da4e4e60bd99b"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6d103b721bbc4f5703f62b3882e638c0b65fcdd48622531c7ffd45047ef8e87c"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb10a20f80e95102dd35dfbc3a22531661b44a09b55236b012a446955846b023"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:bb68d0da349cf8a68971a48ad179434f75256159fe8b0715275d9b49fa23b7a3"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:4a2c7d0a236aaeab7f69c17b7ab4c078874e817da1bfbb9827cb8c73058b3050"}, - {file = "orjson-3.6.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3be045ca3b96119f592904cf34b962969ce97bd7843cbfca084009f6c8d2f268"}, - {file = "orjson-3.6.7-cp38-none-win_amd64.whl", hash = "sha256:bd765c06c359d8a814b90f948538f957fa8a1f55ad1aaffcdc5771996aaea061"}, - {file = "orjson-3.6.7-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:7dd9e1e46c0776eee9e0649e3ae9584ea368d96851bcaeba18e217fa5d755283"}, - {file = "orjson-3.6.7-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:c4b4f20a1e3df7e7c83717aff0ef4ab69e42ce2fb1f5234682f618153c458406"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7107a5673fd0b05adbb58bf71c1578fc84d662d29c096eb6d998982c8635c221"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a08b6940dd9a98ccf09785890112a0f81eadb4f35b51b9a80736d1725437e22c"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:f5d1648e5a9d1070f3628a69a7c6c17634dbb0caf22f2085eca6910f7427bf1f"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:e6201494e8dff2ce7fd21da4e3f6dfca1a3fed38f9dcefc972f552f6596a7621"}, - {file = "orjson-3.6.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:70d0386abe02879ebaead2f9632dd2acb71000b4721fd8c1a2fb8c031a38d4d5"}, - {file = "orjson-3.6.7-cp39-none-win_amd64.whl", hash = "sha256:d9a3288861bfd26f3511fb4081561ca768674612bac59513cb9081bb61fcc87f"}, - {file = "orjson-3.6.7.tar.gz", hash = "sha256:a4bb62b11289b7620eead2f25695212e9ac77fcfba76f050fa8a540fb5c32401"}, + {file = "orjson-3.6.8-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:3a287a650458de2211db03681b71c3e5cb2212b62f17a39df8ad99fc54855d0f"}, + {file = "orjson-3.6.8-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:5204e25c12cea58e524fc82f7c27ed0586f592f777b33075a92ab7b3eb3687c2"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77e8386393add64f959c044e0fb682364fd0e611a6f477aa13f0e6a733bd6a28"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:279f2d2af393fdf8601020744cb206b91b54ad60fb8401e0761819c7bda1f4e4"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:c31c9f389be7906f978ed4192eb58a4b74a37ad60556a0b88ddc47c576697770"}, + {file = "orjson-3.6.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0db5c5a0c5b89f092d52f6e5a3701660a9d6ffa9e2968b3ce17c2bc4f5eb0414"}, + {file = "orjson-3.6.8-cp310-none-win_amd64.whl", hash = "sha256:eb22485847b9a0c4bbedc668df860126ac931edbed1d456cf41a59f3cb961ed8"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:1a5fe569310bc819279bd4d5f2c349910b104ed3207936246dd5d5e0b085e74a"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:ccb356a47ab1067cd3549847e9db1d279a63fe0482d315b3ffd6e7abef35ef77"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab29c069c222248ce302a25855b4e1664f9436e8ae5a131fb0859daf31676d2b"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2b5e4cba9e774ac011071d9d27760f97f4b8cd46003e971d122e712f971345"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:c311ec504414d22834d5b972a209619925b48263856a11a14d90230f9682d49c"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:a3dfec7950b90fb8d143743503ee53fa06b32e6068bdea792fc866284da3d71d"}, + {file = "orjson-3.6.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b890dbbada2cbb26eb29bd43a848426f007f094bb0758df10dfe7a438e1cb4b4"}, + {file = "orjson-3.6.8-cp37-none-win_amd64.whl", hash = "sha256:9143ae2c52771525be9ad11a7a8cc8e7fd75391b107e7e644a9e0050496f6b4f"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:33a82199fd42f6436f833e210ae5129c922a5c355629356ca7a8e82964da7285"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:90159ea8b9a5a2a98fa33dc7b421cfac4d2ae91ba5e1058f5909e7f059f6b467"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:656fbe15d9ef0733e740d9def78f4fdb4153102f4836ee774a05123499005931"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7be3be6153843e0f01351b1313a5ad4723595427680dac2dfff22a37e652ce02"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:dd24f66b6697ee7424f7da575ec6cbffc8ede441114d53470949cda4d97c6e56"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:b07c780f7345ecf5901356dc21dee0669defc489c38ce7b9ab0f5e008cc0385c"}, + {file = "orjson-3.6.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ea32015a5d8a4ce00d348a0de5dc7040e0ad58f970a8fcbb5713a1eac129e493"}, + {file = "orjson-3.6.8-cp38-none-win_amd64.whl", hash = "sha256:c5a3e382194c838988ec128a26b08aa92044e5e055491cc4056142af0c1c54d7"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:83a8424e857ae1bf53530e88b4eb2f16ca2b489073b924e655f1575cacd7f52a"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:81e1a6a2d67f15007dadacbf9ba5d3d79237e5e33786c028557fe5a2b72f1c9a"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:137b539881c77866eba86ff6a11df910daf2eb9ab8f1acae62f879e83d7c38af"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cbd358f3b3ad539a27e36900e8e7d172d0e1b72ad9dd7d69544dcbc0f067ee7"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:6ab94701542d40b90903ecfc339333f458884979a01cb9268bc662cc67a5f6d8"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:32b6f26593a9eb606b40775826beb0dac152e3d224ea393688fced036045a821"}, + {file = "orjson-3.6.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:afd9e329ebd3418cac3cd747769b1d52daa25fa672bbf414ab59f0e0881b32b9"}, + {file = "orjson-3.6.8-cp39-none-win_amd64.whl", hash = "sha256:0c89b419914d3d1f65a1b0883f377abe42a6e44f6624ba1c63e8846cbfc2fa60"}, + {file = "orjson-3.6.8.tar.gz", hash = "sha256:e19d23741c5de13689bb316abfccea15a19c264e3ec8eb332a5319a583595ace"}, ] packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, @@ -1256,80 +640,14 @@ pathspec = [ {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, ] -pbr = [ - {file = "pbr-5.8.1-py2.py3-none-any.whl", hash = "sha256:27108648368782d07bbf1cb468ad2e2eeef29086affd14087a6d04b7de8af4ec"}, - {file = "pbr-5.8.1.tar.gz", hash = "sha256:66bc5a34912f408bb3925bf21231cb6f59206267b7f63f3503ef865c1a292e25"}, -] platformdirs = [ - {file = "platformdirs-2.5.1-py3-none-any.whl", hash = "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"}, - {file = "platformdirs-2.5.1.tar.gz", hash = "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d"}, + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, ] pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] -pre-commit = [ - {file = "pre_commit-2.17.0-py2.py3-none-any.whl", hash = "sha256:725fa7459782d7bec5ead072810e47351de01709be838c2ce1726b9591dad616"}, - {file = "pre_commit-2.17.0.tar.gz", hash = "sha256:c1a8040ff15ad3d648c70cc3e55b93e4d2d5b687320955505587fd79bbaed06a"}, -] -psycopg2-binary = [ - {file = "psycopg2-binary-2.9.3.tar.gz", hash = "sha256:761df5313dc15da1502b21453642d7599d26be88bff659382f8f9747c7ebea4e"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:539b28661b71da7c0e428692438efbcd048ca21ea81af618d845e06ebfd29478"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e82d38390a03da28c7985b394ec3f56873174e2c88130e6966cb1c946508e65"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57804fc02ca3ce0dbfbef35c4b3a4a774da66d66ea20f4bda601294ad2ea6092"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:083a55275f09a62b8ca4902dd11f4b33075b743cf0d360419e2051a8a5d5ff76"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_24_ppc64le.whl", hash = "sha256:0a29729145aaaf1ad8bafe663131890e2111f13416b60e460dae0a96af5905c9"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a79d622f5206d695d7824cbf609a4f5b88ea6d6dab5f7c147fc6d333a8787e4"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:090f3348c0ab2cceb6dfbe6bf721ef61262ddf518cd6cc6ecc7d334996d64efa"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a9e1f75f96ea388fbcef36c70640c4efbe4650658f3d6a2967b4cc70e907352e"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c3ae8e75eb7160851e59adc77b3a19a976e50622e44fd4fd47b8b18208189d42"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-win32.whl", hash = "sha256:7b1e9b80afca7b7a386ef087db614faebbf8839b7f4db5eb107d0f1a53225029"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:8b344adbb9a862de0c635f4f0425b7958bf5a4b927c8594e6e8d261775796d53"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:e847774f8ffd5b398a75bc1c18fbb56564cda3d629fe68fd81971fece2d3c67e"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68641a34023d306be959101b345732360fc2ea4938982309b786f7be1b43a4a1"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3303f8807f342641851578ee7ed1f3efc9802d00a6f83c101d21c608cb864460"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_24_aarch64.whl", hash = "sha256:e3699852e22aa68c10de06524a3721ade969abf382da95884e6a10ff798f9281"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_24_ppc64le.whl", hash = "sha256:526ea0378246d9b080148f2d6681229f4b5964543c170dd10bf4faaab6e0d27f"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:b1c8068513f5b158cf7e29c43a77eb34b407db29aca749d3eb9293ee0d3103ca"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:15803fa813ea05bef089fa78835118b5434204f3a17cb9f1e5dbfd0b9deea5af"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:152f09f57417b831418304c7f30d727dc83a12761627bb826951692cc6491e57"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:404224e5fef3b193f892abdbf8961ce20e0b6642886cfe1fe1923f41aaa75c9d"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-win32.whl", hash = "sha256:1f6b813106a3abdf7b03640d36e24669234120c72e91d5cbaeb87c5f7c36c65b"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:2d872e3c9d5d075a2e104540965a1cf898b52274a5923936e5bfddb58c59c7c2"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:10bb90fb4d523a2aa67773d4ff2b833ec00857f5912bafcfd5f5414e45280fb1"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a52ecab70af13e899f7847b3e074eeb16ebac5615665db33bce8a1009cf33"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a29b3ca4ec9defec6d42bf5feb36bb5817ba3c0230dd83b4edf4bf02684cd0ae"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:12b11322ea00ad8db8c46f18b7dfc47ae215e4df55b46c67a94b4effbaec7094"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_24_ppc64le.whl", hash = "sha256:53293533fcbb94c202b7c800a12c873cfe24599656b341f56e71dd2b557be063"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c381bda330ddf2fccbafab789d83ebc6c53db126e4383e73794c74eedce855ef"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9d29409b625a143649d03d0fd7b57e4b92e0ecad9726ba682244b73be91d2fdb"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:183a517a3a63503f70f808b58bfbf962f23d73b6dccddae5aa56152ef2bcb232"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:15c4e4cfa45f5a60599d9cec5f46cd7b1b29d86a6390ec23e8eebaae84e64554"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-win32.whl", hash = "sha256:adf20d9a67e0b6393eac162eb81fb10bc9130a80540f4df7e7355c2dd4af9fba"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2f9ffd643bc7349eeb664eba8864d9e01f057880f510e4681ba40a6532f93c71"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:def68d7c21984b0f8218e8a15d514f714d96904265164f75f8d3a70f9c295667"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dffc08ca91c9ac09008870c9eb77b00a46b3378719584059c034b8945e26b272"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:280b0bb5cbfe8039205c7981cceb006156a675362a00fe29b16fbc264e242834"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:af9813db73395fb1fc211bac696faea4ca9ef53f32dc0cfa27e4e7cf766dcf24"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_24_ppc64le.whl", hash = "sha256:63638d875be8c2784cfc952c9ac34e2b50e43f9f0a0660b65e2a87d656b3116c"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ffb7a888a047696e7f8240d649b43fb3644f14f0ee229077e7f6b9f9081635bd"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0c9d5450c566c80c396b7402895c4369a410cab5a82707b11aee1e624da7d004"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:d1c1b569ecafe3a69380a94e6ae09a4789bbb23666f3d3a08d06bbd2451f5ef1"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8fc53f9af09426a61db9ba357865c77f26076d48669f2e1bb24d85a22fb52307"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-win32.whl", hash = "sha256:6472a178e291b59e7f16ab49ec8b4f3bdada0a879c68d3817ff0963e722a82ce"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:35168209c9d51b145e459e05c31a9eaeffa9a6b0fd61689b48e07464ffd1a83e"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:47133f3f872faf28c1e87d4357220e809dfd3fa7c64295a4a148bcd1e6e34ec9"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91920527dea30175cc02a1099f331aa8c1ba39bf8b7762b7b56cbf54bc5cce42"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:887dd9aac71765ac0d0bac1d0d4b4f2c99d5f5c1382d8b770404f0f3d0ce8a39"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:1f14c8b0942714eb3c74e1e71700cbbcb415acbc311c730370e70c578a44a25c"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_24_ppc64le.whl", hash = "sha256:7af0dd86ddb2f8af5da57a976d27cd2cd15510518d582b478fbb2292428710b4"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:93cd1967a18aa0edd4b95b1dfd554cf15af657cb606280996d393dadc88c3c35"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bda845b664bb6c91446ca9609fc69f7db6c334ec5e4adc87571c34e4f47b7ddb"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:01310cf4cf26db9aea5158c217caa92d291f0500051a6469ac52166e1a16f5b7"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:99485cab9ba0fa9b84f1f9e1fef106f44a46ef6afdeec8885e0b88d0772b49e8"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-win32.whl", hash = "sha256:46f0e0a6b5fa5851bbd9ab1bc805eef362d3a230fbdfbc209f4a236d0a7a990d"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:accfe7e982411da3178ec690baaceaad3c278652998b2c45828aaac66cd8285f"}, -] py = [ {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, @@ -1342,21 +660,13 @@ pyflakes = [ {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, ] -pygments = [ - {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"}, - {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"}, -] pyparsing = [ - {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"}, - {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, ] pytest = [ - {file = "pytest-7.1.1-py3-none-any.whl", hash = "sha256:92f723789a8fdd7180b6b06483874feca4c48a5c76968e03bb3e7f806a1869ea"}, - {file = "pytest-7.1.1.tar.gz", hash = "sha256:841132caef6b1ad17a9afde46dc4f6cfa59a05f9555aae5151f73bdf2820ca63"}, -] -pytz = [ - {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"}, - {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"}, + {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, + {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"}, ] pyyaml = [ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, @@ -1393,73 +703,17 @@ pyyaml = [ {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] -requests = [ - {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, - {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, -] six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] -snowballstemmer = [ - {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, - {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, -] -sphinx = [ - {file = "Sphinx-4.5.0-py3-none-any.whl", hash = "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226"}, - {file = "Sphinx-4.5.0.tar.gz", hash = "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6"}, -] -sphinx-autodoc-typehints = [ - {file = "sphinx_autodoc_typehints-1.17.0-py3-none-any.whl", hash = "sha256:081daf53077b4ae1c28347d6d858e13e63aefe3b4aacef79fd717dd60687b470"}, - {file = "sphinx_autodoc_typehints-1.17.0.tar.gz", hash = "sha256:51c7b3f5cb9ccd15d0b52088c62df3094f1abd9612930340365c26def8629a14"}, -] -sphinx-rtd-theme = [ - {file = "sphinx_rtd_theme-1.0.0-py2.py3-none-any.whl", hash = "sha256:4d35a56f4508cfee4c4fb604373ede6feae2a306731d533f409ef5c3496fdbd8"}, - {file = "sphinx_rtd_theme-1.0.0.tar.gz", hash = "sha256:eec6d497e4c2195fa0e8b2016b337532b8a699a68bcb22a512870e16925c6a5c"}, -] -sphinxcontrib-apidoc = [ - {file = "sphinxcontrib-apidoc-0.3.0.tar.gz", hash = "sha256:729bf592cf7b7dd57c4c05794f732dc026127275d785c2a5494521fdde773fb9"}, - {file = "sphinxcontrib_apidoc-0.3.0-py2.py3-none-any.whl", hash = "sha256:6671a46b2c6c5b0dca3d8a147849d159065e50443df79614f921b42fbd15cb09"}, -] -sphinxcontrib-applehelp = [ - {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, - {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, -] -sphinxcontrib-devhelp = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, -] -sphinxcontrib-htmlhelp = [ - {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, - {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, -] -sphinxcontrib-jsmath = [ - {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, - {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, -] -sphinxcontrib-qthelp = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, -] -sphinxcontrib-serializinghtml = [ - {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, - {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] tomli = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] typing-extensions = [ - {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, - {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, -] -urllib3 = [ - {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, - {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, + {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, + {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, ] uvloop = [ {file = "uvloop-0.16.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6224f1401025b748ffecb7a6e2652b17768f30b1a6a3f7b44660e5b5b690b12d"}, @@ -1479,11 +733,3 @@ uvloop = [ {file = "uvloop-0.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e5f2e2ff51aefe6c19ee98af12b4ae61f5be456cd24396953244a30880ad861"}, {file = "uvloop-0.16.0.tar.gz", hash = "sha256:f74bc20c7b67d1c27c72601c78cf95be99d5c2cdd4514502b4f3eb0933ff1228"}, ] -virtualenv = [ - {file = "virtualenv-20.14.0-py2.py3-none-any.whl", hash = "sha256:1e8588f35e8b42c6ec6841a13c5e88239de1e6e4e4cedfd3916b306dc826ec66"}, - {file = "virtualenv-20.14.0.tar.gz", hash = "sha256:8e5b402037287126e81ccde9432b95a8be5b19d36584f64957060a3488c11ca8"}, -] -zipp = [ - {file = "zipp-3.7.0-py3-none-any.whl", hash = "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375"}, - {file = "zipp-3.7.0.tar.gz", hash = "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d"}, -] diff --git a/packages/core/minos-microservice-cqrs/pyproject.toml b/packages/core/minos-microservice-cqrs/pyproject.toml index 29c04e203..722535d61 100644 --- a/packages/core/minos-microservice-cqrs/pyproject.toml +++ b/packages/core/minos-microservice-cqrs/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "minos-microservice-cqrs" -version = "0.6.0" +version = "0.7.0" description = "The CQRS pattern of the Minos Framework" readme = "README.md" repository = "https://github.com/minos-framework/minos-python" @@ -21,35 +21,29 @@ keywords = [ "saga", ] packages = [ - { include = "minos" } + { include = "minos" }, ] include = [ - "AUTHORS.md", - "HISTORY.md", - "LICENSE", + { path = "AUTHORS.md", format = "sdist" }, + { path = "HISTORY.md", format = "sdist" }, + { path = "LICENSE", format = "sdist" }, ] [tool.poetry.dependencies] python = "^3.9" -minos-microservice-aggregate = "^0.6.0" -minos-microservice-common = "^0.6.0" -minos-microservice-networks = "^0.6.0" +minos-microservice-aggregate = "^0.7.0" +minos-microservice-common = "^0.7.0" +minos-microservice-networks = "^0.7.0" [tool.poetry.dev-dependencies] minos-microservice-common = { path = "../minos-microservice-common", develop = true } minos-microservice-networks = { path = "../minos-microservice-networks", develop = true } minos-microservice-aggregate = { path = "../minos-microservice-aggregate", develop = true } -black = "^22.1" +black = "^22.3" isort = "^5.8.0" -pytest = "^7.0.1" +pytest = "^7.1.2" coverage = "^6.3" flake8 = "^4.0.1" -Sphinx = "^4.0.1" -pre-commit = "^2.12.1" -sphinx-autodoc-typehints = "^1.17.0" -sphinxcontrib-apidoc = "^0.3.0" -sphinx-rtd-theme = "^1.0.0" -m2r2 = "^0.3.2" [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/packages/core/minos-microservice-cqrs/tests/test_config.yml b/packages/core/minos-microservice-cqrs/tests/test_config.yml index 195e14244..ee1e9270b 100644 --- a/packages/core/minos-microservice-cqrs/tests/test_config.yml +++ b/packages/core/minos-microservice-cqrs/tests/test_config.yml @@ -8,6 +8,7 @@ broker: host: localhost port: 9092 queue: + client: minos.common.testing.MockedDatabaseClient database: order_db user: minos password: min0s @@ -16,12 +17,14 @@ broker: records: 10 retry: 2 repository: + client: minos.common.testing.MockedDatabaseClient database: order_db user: minos password: min0s host: localhost port: 5432 snapshot: + client: minos.common.testing.MockedDatabaseClient database: order_db user: minos password: min0s diff --git a/packages/core/minos-microservice-cqrs/tests/test_cqrs/test_services.py b/packages/core/minos-microservice-cqrs/tests/test_cqrs/test_services.py index 25b6c5635..4ebbe5639 100644 --- a/packages/core/minos-microservice-cqrs/tests/test_cqrs/test_services.py +++ b/packages/core/minos-microservice-cqrs/tests/test_cqrs/test_services.py @@ -7,18 +7,18 @@ ) from minos.common import ( + DatabaseLockPool, DependencyInjector, - PostgreSqlLockPool, + PoolFactory, ) from minos.common.testing import ( - PostgresAsyncTestCase, + DatabaseMinosTestCase, ) from minos.cqrs import ( MinosIllegalHandlingException, Service, ) from minos.networks import ( - BrokerClientPool, BrokerCommandEnrouteDecorator, BrokerQueryEnrouteDecorator, InMemoryRequest, @@ -32,15 +32,15 @@ ) -class TestService(PostgresAsyncTestCase): +class TestService(DatabaseMinosTestCase): CONFIG_FILE_PATH = BASE_PATH / "test_config.yml" def setUp(self) -> None: super().setUp() - self.lock_pool = PostgreSqlLockPool.from_config(self.config) + self.lock_pool = DatabaseLockPool.from_config(self.config) - self.injector = DependencyInjector(self.config, [BrokerClientPool]) + self.injector = DependencyInjector(self.config, [PoolFactory]) self.injector.wire_injections(modules=[sys.modules[__name__]]) self.service = FakeService(config=self.config, lock_pool=self.lock_pool) @@ -51,7 +51,7 @@ def tearDown(self) -> None: async def test_constructor(self): self.assertEqual(self.config, self.service.config) self.assertEqual(self.lock_pool, self.service.lock_pool) - self.assertEqual(self.injector.broker_pool, self.service.broker_pool) + self.assertEqual(self.injector.pool_factory, self.service.pool_factory) with self.assertRaises(AttributeError): self.service.event_repository @@ -67,7 +67,7 @@ async def test_pre_event(self): self.assertEqual(1, mock.call_count) -class TestQueryService(PostgresAsyncTestCase): +class TestQueryService(DatabaseMinosTestCase): CONFIG_FILE_PATH = BASE_PATH / "test_config.yml" def setUp(self) -> None: @@ -94,7 +94,7 @@ def test_get_enroute(self): self.assertEqual(expected, observed) -class TestCommandService(PostgresAsyncTestCase): +class TestCommandService(DatabaseMinosTestCase): CONFIG_FILE_PATH = BASE_PATH / "test_config.yml" def setUp(self) -> None: diff --git a/packages/core/minos-microservice-networks/HISTORY.md b/packages/core/minos-microservice-networks/HISTORY.md index a27f6ed93..25e2d093f 100644 --- a/packages/core/minos-microservice-networks/HISTORY.md +++ b/packages/core/minos-microservice-networks/HISTORY.md @@ -1,32 +1,26 @@ -History -========== +# History -0.0.3 (2021-05-24) ------------------- +## 0.0.3 (2021-05-24) * renamed classes and removed Minos prefix * Integration of Command and CommandReply with Handler -0.0.4 (2021-05-31) ------------------- +## 0.0.4 (2021-05-31) * Documentation improvement * BugFixes -0.0.5 (2021-05-31) ------------------- +## 0.0.5 (2021-05-31) * BugFixes -0.0.6 (2021-06-02) ------------------- +## 0.0.6 (2021-06-02) * Added Retry functionality at Broker * Added Locked status at Broker * Bugfix -0.0.7 (2021-07-06) ------------------- +## 0.0.7 (2021-07-06) * Added basic approach for Circuit Braker ( Broker and Publisher) * SQL queries refactor ( added support for psycopg method for query building ) @@ -36,48 +30,41 @@ History * Added clients for Minos Discovery Service * Added support for Docker and Docker-Compose -0.0.8 (2021-07-12) ------------------- +## 0.0.8 (2021-07-12) * Add new version support for minos-common * BugFix -0.0.9 (2021-07-12) ------------------- +## 0.0.9 (2021-07-12) * BugFix -0.0.10 (2021-07-26) ------------------- +## 0.0.10 (2021-07-26) * Add `enroute` decorator. * Add `ReplyHandlerPool`. * Fix bug related with `DiscoveryConnector`. * Add `WrappedRequest`. -0.0.11 (2021-07-27) ------------------- +## 0.0.11 (2021-07-27) * Be compatible with `minos-microservice-common==0.1.7`. * Fix bug related with `EventConsumerService`, `CommandConsumerService` and `CommandReplyConsumerService` and the `start` method. * Fix bug related with `get_host_ip` function and some DNS systems. -0.0.12 (2021-08-03) ------------------- +## 0.0.12 (2021-08-03) * Small Improvements * Bugfixes -0.0.13 (2021-08-19) ------------------- +## 0.0.13 (2021-08-19) * Update `DiscoveryConnector` to support auto discoverable endpoint. * Increase the concurrency degree of `Handler.dispatch`. * Rename `RestBuilder` as `RestHandler`. * Refactor `HandlerEntry` -0.0.14 (2021-09-01) ------------------- +## 0.0.14 (2021-09-01) * Unify consumer queues into a single one `consumer_queue`. * Replace periodic checking (active waiting) by a `LISTEN/NOTIFY` approach (reactive) on consumer and producer queue. @@ -86,49 +73,41 @@ History * Improve `Producer` performance keeping kafka connection open between publishing calls. * Implement direct message transferring between `Producer` and `Consumer` for messages send to the same microservice. -0.0.15 (2021-09-02) ------------------- +## 0.0.15 (2021-09-02) * Add support for `__get_enroute__` method by `EnrouteAnalyzer`. -0.0.16 (2021-09-20) ------------------- +## 0.0.16 (2021-09-20) * Add support for `Kong` discovery. * Add support for `minos-microservice-common>=0.1.13`. * Fix bug related with database queues and plain dates (without timezones). -0.0.17 (2021-09-27) ------------------- +## 0.0.17 (2021-09-27) * Add support for multiple handling functions for events. * Fix troubles related with dependency injections. -0.0.18 (2021-10-04) ------------------- +## 0.0.18 (2021-10-04) * Add `PeriodicTask`, `PeriodicTaskScheduler` and `PeriodicTaskSchedulerService`. * Add `@enroute.periodic.event` decorator -0.0.19 (2021-11-03) ------------------- +## 0.0.19 (2021-11-03) * Add `"user"` context variable to be accessible during `Request` handling (same as `Request.user`). * Add support for `Request.user` propagation over `CommandBroker`. -0.1.0 (2021-11-08) ------------------- +## 0.1.0 (2021-11-08) * Add `minos-microservice-common>=0.2.0` compatibility. -0.1.1 (2021-11-09) ------------------- +## 0.1.1 (2021-11-09) * Add `REPLY_TOPIC_CONTEXT_VAR` and integrate with `DynamicHandlerPool`. * Add support for `post_fn` callbacks following the same strategy as in `pre_fn` callbacks. -0.2.0 (2021-11-15) ------------------- +## 0.2.0 (2021-11-15) * Remove dependency to `minos-microservice-aggregate` (now `minos.aggregate` package will require `minos.networks`). * Add support for middleware functions. @@ -136,8 +115,7 @@ History * Migrate `Command`, `CommandReply`, `CommandStatus` and `Event` from `minos.common` to `minos.networks`. * Add support for `minos-microservice-common=^0.3.0` -0.3.0 (2021-11-22) ------------------- +## 0.3.0 (2021-11-22) * Improve `BrokerHandler` dispatching strategy to be more concurrent (using `asyncio.PriorityQueue` and multiple consumers). * Add `send(...)` method to `DynamicBroker` in order to simplify the execution of request-response messages. @@ -152,8 +130,7 @@ History * Rename `Producer` and `ProducerService` as `BrokerProducer` and `BrokerProducerService` respectively. * Rename `HandlerRequest`, `HandlerResponse` and `HandlerResponseException` as `BrokerRequest`, `BrokerResponse` and `BrokerResponseException` respectively. -0.3.1 (2021-11-30) ------------------- +## 0.3.1 (2021-11-30) * Add `identifier: UUID` and `headers: dict[str, str]` attributes to `BrokerMessage`. * Remove `saga: Optional[UUID]` and `service_name: str` attributes from `BrokerMessage`. @@ -161,8 +138,7 @@ History * Add `REQUEST_HEADERS_CONTEXT_VAR`. * Rename `USER_CONTEXT_VAR` and `REPLY_TOPIC_CONTEXT_VAR` as `REQUEST_USER_CONTEXT_VAR` and `REQUEST_REPLY_TOPIC_CONTEXT_VAR` respectively. -0.3.2 (2021-12-27) ------------------- +## 0.3.2 (2021-12-27) * Add `CheckDecorator` (accessible from `EnrouteDecorator.check(...): CheckDecorator` attribute) allowing to set check functions with the `(request: Request) -> bool` prototype to the service handling functions. * Add support for more `Content-Type` values. Currently: `application/json`, `application/x-www-form-encoded`, `avro/binary`, `text/plain` and `application/octet-stream`. @@ -171,8 +147,7 @@ History * Add `Request.has_content: bool` and `Request.has_params: bool` to check for the existence of `content` and `params` respectively. * Add `InMemoryRequest` class that allows to create requests for testing or calling service handling functions directly. -0.4.0 (2022-01-27) ------------------- +## 0.4.0 (2022-01-27) * Add `BrokerDispatcher` to break the direct relationship between `BrokerHandler` and `BrokerPublisher`. * Add `content_type` argument to `RestResponse`'s constructor to be able to retrieve the result in a format other than `json`. @@ -192,37 +167,31 @@ History * Implement a builder pattern on `BrokerPublisher` * Be compatible with `minos-microservice-common~=0.4.0`. -0.4.1 (2022-01-31) ------------------- +## 0.4.1 (2022-01-31) * Update `README.md`. -0.5.0 (2022-02-03) ------------------- +## 0.5.0 (2022-02-03) * Extract `kafka` related code to the `minos-broker-kafka` plugin. * Extract `minos-discovery` related code to the `minos-discovery-minos` plugin. * Minor changes. -0.5.1 (2022-02-03) ------------------- +## 0.5.1 (2022-02-03) * Fix bug related with dependency specification. -0.5.2 (2022-02-08) ------------------- +## 0.5.2 (2022-02-08) * Fix bug related with enroute decorator collisions in which the `MinosRedefinedEnrouteDecoratorException` was not raised. * Minor changes. -0.5.3 (2022-03-04) ------------------- +## 0.5.3 (2022-03-04) * Improve error messages of `BrokerDispatcher`, `RestHandler` and `PeriodicTask`. -0.6.0 (2022-03-28) ------------------- +## 0.6.0 (2022-03-28) * Add `BrokerPort` class and deprecate `BrokerHandlerService`. * Add `BrokerPublisherBuilder` to ease the building of `BrokerPublisher` instances. @@ -242,4 +211,21 @@ History * Add `OpenAPIService` and `AsynAPIService` classes as the services that provide `openapi` and `asynciapi` specifications of the microservice. * Add `SystemService` as the service that implements System Health checker. * Replace `dependency-injector`'s injection classes by the ones provided by the `minos.common.injections` module. -* Be compatible with latest `minos.common.Config` API. \ No newline at end of file +* Be compatible with latest `minos.common.Config` API. + +## 0.7.0 (2022-05-11) + +* Rename `PostgreSqlBrokerPublisherQueue` as `DatabaseBrokerPublisherQueue`. +* Rename `PostgreSqlBrokerPublisherQueueQueryFactory` as `BrokerPublisherQueueDatabaseOperationFactory`. +* Rename `PostgreSqlBrokerQueue` as `DatabaseBrokerQueue`. +* Rename `PostgreSqlBrokerQueueBuilder` as `DatabaseBrokerQueueBuilder`. +* Rename `PostgreSqlBrokerSubscriberDuplicateValidator` as `DatabaseBrokerSubscriberDuplicateValidator`. +* Rename `PostgreSqlBrokerSubscriberDuplicateValidatorBuilder` as `DatabaseBrokerSubscriberDuplicateValidatorBuilder`. +* Rename `PostgreSqlBrokerSubscriberDuplicateValidatorQueryFactory` as `BrokerSubscriberDuplicateValidatorDatabaseOperationFactory`. +* Rename `PostgreSqlBrokerSubscriberQueue` as `DatabaseBrokerSubscriberQueue`. +* Rename `PostgreSqlBrokerSubscriberQueueBuilder` as `DatabaseBrokerSubscriberQueueBuilder`. +* Rename `PostgreSqlBrokerSubscriberQueueQueryFactory` as `BrokerSubscriberQueueDatabaseOperationFactory`. +* Move `Builder` to the `minos-microservice-common` package. +* Unify documentation building pipeline across all `minos-python` packages. +* Fix documentation building warnings. +* Fix bug related with package building and additional files like `AUTHORS.md`, `HISTORY.md`, etc. \ No newline at end of file diff --git a/packages/core/minos-microservice-networks/Makefile b/packages/core/minos-microservice-networks/Makefile index acc861207..ef814b8bc 100644 --- a/packages/core/minos-microservice-networks/Makefile +++ b/packages/core/minos-microservice-networks/Makefile @@ -15,10 +15,6 @@ reformat: poetry run black --line-length 120 minos tests poetry run isort minos tests -docs: - rm -rf docs/api - poetry run $(MAKE) --directory=docs html - release: $(MAKE) dist poetry publish @@ -38,5 +34,4 @@ check: $(MAKE) reformat $(MAKE) lint $(MAKE) test - $(MAKE) docs $(MAKE) dist diff --git a/packages/core/minos-microservice-networks/RUNTHETESTS.md b/packages/core/minos-microservice-networks/RUNTHETESTS.md index 8b5e95b1f..386e2b0e7 100644 --- a/packages/core/minos-microservice-networks/RUNTHETESTS.md +++ b/packages/core/minos-microservice-networks/RUNTHETESTS.md @@ -1,5 +1,4 @@ -Run the tests -============== +# Run the tests In order to run the tests, please make sure you have the `Docker Engine `_ and `Docker Compose `_ installed. diff --git a/packages/core/minos-microservice-networks/SETUP.md b/packages/core/minos-microservice-networks/SETUP.md deleted file mode 100644 index 8203965c7..000000000 --- a/packages/core/minos-microservice-networks/SETUP.md +++ /dev/null @@ -1,11 +0,0 @@ -Set up a development environment -================================= - -Since we use `poetry` as the default package manager, it must be installed. Please refer to -`https://python-poetry.org/docs/#installation`. - -Run `poetry install` to get the dependencies. - -Run `pre-commit install` to set the git checks before commiting. - -Make yourself sure you are able to run the tests. Refer to the appropriate section in this guide. diff --git a/packages/core/minos-microservice-networks/docs/Makefile b/packages/core/minos-microservice-networks/docs/Makefile deleted file mode 100644 index befe47ad8..000000000 --- a/packages/core/minos-microservice-networks/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -SPHINXPROJ = minos-microservice-networks -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/packages/core/minos-microservice-networks/docs/_static/style.css b/packages/core/minos-microservice-networks/docs/_static/style.css deleted file mode 100644 index 8aa6c288f..000000000 --- a/packages/core/minos-microservice-networks/docs/_static/style.css +++ /dev/null @@ -1,3 +0,0 @@ -.wy-nav-content { - max-width: 1200px !important; -} diff --git a/packages/core/minos-microservice-networks/docs/_templates/layout.html b/packages/core/minos-microservice-networks/docs/_templates/layout.html deleted file mode 100644 index b0a448060..000000000 --- a/packages/core/minos-microservice-networks/docs/_templates/layout.html +++ /dev/null @@ -1,4 +0,0 @@ -{% extends "!layout.html" %} -{% block extrahead %} - -{% endblock %} \ No newline at end of file diff --git a/packages/core/minos-microservice-networks/docs/authors.rst b/packages/core/minos-microservice-networks/docs/authors.rst deleted file mode 100644 index cf16fc494..000000000 --- a/packages/core/minos-microservice-networks/docs/authors.rst +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../AUTHORS.md diff --git a/packages/core/minos-microservice-networks/docs/conf.py b/packages/core/minos-microservice-networks/docs/conf.py deleted file mode 100755 index f5b306567..000000000 --- a/packages/core/minos-microservice-networks/docs/conf.py +++ /dev/null @@ -1,198 +0,0 @@ -#!/usr/bin/env python -# -# minos documentation build configuration file, created by -# sphinx-quickstart on Fri Jun 9 13:47:02 2017. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -# If extensions (or modules to document with autodoc) are in another -# directory, add these directories to sys.path here. If the directory is -# relative to the documentation root, use os.path.abspath to make it -# absolute, like shown here. -# -import os -import sys - -sys.path.insert(0, os.path.abspath("..")) - -import sphinx_rtd_theme - -from minos import ( - networks, -) - -# -- General configuration --------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. - - -extensions = [ - "sphinxcontrib.apidoc", - "sphinx.ext.autodoc", - "sphinx_autodoc_typehints", - "sphinx.ext.viewcode", - "sphinx_rtd_theme", - "m2r2", -] -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -source_suffix = [".rst", ".md"] -# source_suffix = '.rst' - -# The master toctree document. -master_doc = "index" - -# General information about the project. -project = "Minos Microservice Network" -copyright = "2021, Clariteia" -author = "Minos Framework Devs" - -# The version info for the project you're documenting, acts as replacement -# for |version| and |release|, also used in various other places throughout -# the built documents. -# -# The short X.Y version. -version = networks.__version__ -# The full version, including alpha/beta/rc tags. -release = networks.__version__ - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = "sphinx" - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = False - -# -- Options for HTML output ------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# - -html_theme = "sphinx_rtd_theme" - -# Theme options are theme-specific and customize the look and feel of a -# theme further. For a list of options available for each theme, see the -# documentation. -# - -# html_theme_options = { -# "codecov_button": True, -# "description": "Reactive microservices for an asynchronous world", -# "github_button": True, -# "github_user": "Clariteia", -# "github_repo": "minos_microservice_network", -# "github_type": "star", -# } - -html_sidebars = {"**": ["about.html", "navigation.html", "searchbox.html"]} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] - -# -- Options for HTMLHelp output --------------------------------------- - -# Output file base name for HTML help builder. -htmlhelp_basename = "minosdoc" - -# -- Options for LaTeX output ------------------------------------------ - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass -# [howto, manual, or own class]). -latex_documents = [ - (master_doc, "minos.tex", "Minos Microservice Network Documentation", "Minos Framework Devs", "manual"), -] - -# -- Options for manual page output ------------------------------------ - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [(master_doc, "minos", "Minos Microservice Network Documentation", [author], 1)] - -# -- Options for Texinfo output ---------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ( - master_doc, - "minos", - "Minos Microservice Network Documentation", - author, - "minos", - "One line description of project.", - "Miscellaneous", - ), -] - -# "apidoc" extension -apidoc_module_dir = "../minos" -apidoc_output_dir = "api" -apidoc_separate_modules = True -autodoc_default_options = { - "inherited-members": True, - "special-members": "__init__", - "undoc-members": True, -} - -apidoc_toc_file = False -apidoc_module_first = True -apidoc_extra_args = [ - "--force", - "--implicit-namespaces", -] - -# apidoc_excluded_paths = [ -# '../minos/network/testing.py' -# ] - -# "autodoc typehints" extension - -set_type_checking_flag = True -typehints_fully_qualified = True diff --git a/packages/core/minos-microservice-networks/docs/history.rst b/packages/core/minos-microservice-networks/docs/history.rst deleted file mode 100644 index d26e5be83..000000000 --- a/packages/core/minos-microservice-networks/docs/history.rst +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../HISTORY.md diff --git a/packages/core/minos-microservice-networks/docs/index.rst b/packages/core/minos-microservice-networks/docs/index.rst deleted file mode 100644 index 20c5a78f3..000000000 --- a/packages/core/minos-microservice-networks/docs/index.rst +++ /dev/null @@ -1,18 +0,0 @@ -Welcome to Minos Microservice Network's documentation! -======================================================= - -.. toctree:: - :maxdepth: 2 - - readme - runthetests - usage - api/minos - authors - history - -Indices and tables -==================== -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/packages/core/minos-microservice-networks/docs/make.bat b/packages/core/minos-microservice-networks/docs/make.bat deleted file mode 100644 index 3e4631be9..000000000 --- a/packages/core/minos-microservice-networks/docs/make.bat +++ /dev/null @@ -1,36 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=python -msphinx -) -set SOURCEDIR=. -set BUILDDIR=_build -set SPHINXPROJ=minos_microservice_networks - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The Sphinx module was not found. Make sure you have Sphinx installed, - echo.then set the SPHINXBUILD environment variable to point to the full - echo.path of the 'sphinx-build' executable. Alternatively you may add the - echo.Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% - -:end -popd diff --git a/packages/core/minos-microservice-networks/docs/modules.rst b/packages/core/minos-microservice-networks/docs/modules.rst deleted file mode 100644 index 9201e6d9e..000000000 --- a/packages/core/minos-microservice-networks/docs/modules.rst +++ /dev/null @@ -1,8 +0,0 @@ -======= -Modules -======= - -.. toctree:: - :maxdepth: 2 - - api/minos diff --git a/packages/core/minos-microservice-networks/docs/readme.rst b/packages/core/minos-microservice-networks/docs/readme.rst deleted file mode 100644 index af09813a4..000000000 --- a/packages/core/minos-microservice-networks/docs/readme.rst +++ /dev/null @@ -1,4 +0,0 @@ -Introduction -************** - -.. mdinclude:: ../README.md diff --git a/packages/core/minos-microservice-networks/docs/runthetests.rst b/packages/core/minos-microservice-networks/docs/runthetests.rst deleted file mode 100644 index 309db1b96..000000000 --- a/packages/core/minos-microservice-networks/docs/runthetests.rst +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../RUNTHETESTS.md diff --git a/packages/core/minos-microservice-networks/docs/usage.rst b/packages/core/minos-microservice-networks/docs/usage.rst deleted file mode 100644 index 9a8247b53..000000000 --- a/packages/core/minos-microservice-networks/docs/usage.rst +++ /dev/null @@ -1,9 +0,0 @@ -===== -Usage -===== - -To use Minos Microservice Networks in a project:: - - import minos_microservice_common - - diff --git a/packages/core/minos-microservice-networks/minos/networks/__init__.py b/packages/core/minos-microservice-networks/minos/networks/__init__.py index a985f31d3..93a82ac0c 100644 --- a/packages/core/minos-microservice-networks/minos/networks/__init__.py +++ b/packages/core/minos-microservice-networks/minos/networks/__init__.py @@ -1,6 +1,8 @@ +"""The networks core of the Minos Framework.""" + __author__ = "Minos Framework Devs" __email__ = "hey@minos.run" -__version__ = "0.6.0" +__version__ = "0.7.0" from .brokers import ( REQUEST_HEADERS_CONTEXT_VAR, @@ -19,16 +21,27 @@ BrokerPublisher, BrokerPublisherBuilder, BrokerPublisherQueue, + BrokerPublisherQueueDatabaseOperationFactory, BrokerQueue, + BrokerQueueDatabaseOperationFactory, BrokerRequest, BrokerResponse, BrokerResponseException, BrokerSubscriber, BrokerSubscriberBuilder, BrokerSubscriberDuplicateValidator, + BrokerSubscriberDuplicateValidatorDatabaseOperationFactory, BrokerSubscriberQueue, BrokerSubscriberQueueBuilder, + BrokerSubscriberQueueDatabaseOperationFactory, BrokerSubscriberValidator, + DatabaseBrokerPublisherQueue, + DatabaseBrokerQueue, + DatabaseBrokerQueueBuilder, + DatabaseBrokerSubscriberDuplicateValidator, + DatabaseBrokerSubscriberDuplicateValidatorBuilder, + DatabaseBrokerSubscriberQueue, + DatabaseBrokerSubscriberQueueBuilder, FilteredBrokerSubscriber, InMemoryBrokerPublisher, InMemoryBrokerPublisherQueue, @@ -38,16 +51,6 @@ InMemoryBrokerSubscriberDuplicateValidator, InMemoryBrokerSubscriberQueue, InMemoryBrokerSubscriberQueueBuilder, - PostgreSqlBrokerPublisherQueue, - PostgreSqlBrokerPublisherQueueQueryFactory, - PostgreSqlBrokerQueue, - PostgreSqlBrokerQueueBuilder, - PostgreSqlBrokerSubscriberDuplicateValidator, - PostgreSqlBrokerSubscriberDuplicateValidatorBuilder, - PostgreSqlBrokerSubscriberDuplicateValidatorQueryFactory, - PostgreSqlBrokerSubscriberQueue, - PostgreSqlBrokerSubscriberQueueBuilder, - PostgreSqlBrokerSubscriberQueueQueryFactory, QueuedBrokerPublisher, QueuedBrokerSubscriber, QueuedBrokerSubscriberBuilder, @@ -137,7 +140,6 @@ SystemService, ) from .utils import ( - Builder, consume_queue, get_host_ip, get_host_name, diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/__init__.py b/packages/core/minos-microservice-networks/minos/networks/brokers/__init__.py index 7b87b020f..0ec5e35de 100644 --- a/packages/core/minos-microservice-networks/minos/networks/brokers/__init__.py +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/__init__.py @@ -3,9 +3,10 @@ ) from .collections import ( BrokerQueue, + BrokerQueueDatabaseOperationFactory, + DatabaseBrokerQueue, + DatabaseBrokerQueueBuilder, InMemoryBrokerQueue, - PostgreSqlBrokerQueue, - PostgreSqlBrokerQueueBuilder, ) from .dispatchers import ( BrokerDispatcher, @@ -34,31 +35,31 @@ BrokerPublisher, BrokerPublisherBuilder, BrokerPublisherQueue, + BrokerPublisherQueueDatabaseOperationFactory, + DatabaseBrokerPublisherQueue, InMemoryBrokerPublisher, InMemoryBrokerPublisherQueue, - PostgreSqlBrokerPublisherQueue, - PostgreSqlBrokerPublisherQueueQueryFactory, QueuedBrokerPublisher, ) from .subscribers import ( BrokerSubscriber, BrokerSubscriberBuilder, BrokerSubscriberDuplicateValidator, + BrokerSubscriberDuplicateValidatorDatabaseOperationFactory, BrokerSubscriberQueue, BrokerSubscriberQueueBuilder, + BrokerSubscriberQueueDatabaseOperationFactory, BrokerSubscriberValidator, + DatabaseBrokerSubscriberDuplicateValidator, + DatabaseBrokerSubscriberDuplicateValidatorBuilder, + DatabaseBrokerSubscriberQueue, + DatabaseBrokerSubscriberQueueBuilder, FilteredBrokerSubscriber, InMemoryBrokerSubscriber, InMemoryBrokerSubscriberBuilder, InMemoryBrokerSubscriberDuplicateValidator, InMemoryBrokerSubscriberQueue, InMemoryBrokerSubscriberQueueBuilder, - PostgreSqlBrokerSubscriberDuplicateValidator, - PostgreSqlBrokerSubscriberDuplicateValidatorBuilder, - PostgreSqlBrokerSubscriberDuplicateValidatorQueryFactory, - PostgreSqlBrokerSubscriberQueue, - PostgreSqlBrokerSubscriberQueueBuilder, - PostgreSqlBrokerSubscriberQueueQueryFactory, QueuedBrokerSubscriber, QueuedBrokerSubscriberBuilder, ) diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/collections/__init__.py b/packages/core/minos-microservice-networks/minos/networks/brokers/collections/__init__.py index 924871e4d..38a6846a9 100644 --- a/packages/core/minos-microservice-networks/minos/networks/brokers/collections/__init__.py +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/collections/__init__.py @@ -1,7 +1,7 @@ from .queues import ( BrokerQueue, + BrokerQueueDatabaseOperationFactory, + DatabaseBrokerQueue, + DatabaseBrokerQueueBuilder, InMemoryBrokerQueue, - PostgreSqlBrokerQueue, - PostgreSqlBrokerQueueBuilder, - PostgreSqlBrokerQueueQueryFactory, ) diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/collections/queues/__init__.py b/packages/core/minos-microservice-networks/minos/networks/brokers/collections/queues/__init__.py index 6bba1e258..d31afd683 100644 --- a/packages/core/minos-microservice-networks/minos/networks/brokers/collections/queues/__init__.py +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/collections/queues/__init__.py @@ -1,11 +1,11 @@ from .abc import ( BrokerQueue, ) +from .database import ( + BrokerQueueDatabaseOperationFactory, + DatabaseBrokerQueue, + DatabaseBrokerQueueBuilder, +) from .memory import ( InMemoryBrokerQueue, ) -from .pg import ( - PostgreSqlBrokerQueue, - PostgreSqlBrokerQueueBuilder, - PostgreSqlBrokerQueueQueryFactory, -) diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/collections/queues/database/__init__.py b/packages/core/minos-microservice-networks/minos/networks/brokers/collections/queues/database/__init__.py new file mode 100644 index 000000000..05a61761f --- /dev/null +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/collections/queues/database/__init__.py @@ -0,0 +1,7 @@ +from .factories import ( + BrokerQueueDatabaseOperationFactory, +) +from .impl import ( + DatabaseBrokerQueue, + DatabaseBrokerQueueBuilder, +) diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/collections/queues/database/factories.py b/packages/core/minos-microservice-networks/minos/networks/brokers/collections/queues/database/factories.py new file mode 100644 index 000000000..e7bf53f67 --- /dev/null +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/collections/queues/database/factories.py @@ -0,0 +1,66 @@ +from abc import ( + ABC, + abstractmethod, +) +from collections.abc import ( + Iterable, +) + +from minos.common import ( + DatabaseOperation, + DatabaseOperationFactory, +) + + +# noinspection SqlResolve,SqlNoDataSourceInspection,SqlNoDataSourceInspection,SqlResolve +class BrokerQueueDatabaseOperationFactory(DatabaseOperationFactory, ABC): + """Broker Queue Database Operation Factory class.""" + + @abstractmethod + def build_create(self) -> DatabaseOperation: + """Build the "create table" query. + + :return: A ``SQL`` instance. + """ + + @abstractmethod + def build_mark_processed(self, id_: int) -> DatabaseOperation: + """Build the "update not processed" query. + + :return: A ``SQL`` instance. + """ + + @abstractmethod + def build_delete(self, id_: int) -> DatabaseOperation: + """Build the "delete processed" query. + + :return: A ``SQL`` instance. + """ + + @abstractmethod + def build_mark_processing(self, ids: Iterable[int]) -> DatabaseOperation: + """ + + :return: A ``SQL`` instance. + """ + + @abstractmethod + def build_count(self, retry: int, *args, **kwargs) -> DatabaseOperation: + """Build the "count not processed" query. + + :return: + """ + + @abstractmethod + def build_submit(self, topic: str, data: bytes) -> DatabaseOperation: + """Build the "insert" query. + + :return: A ``SQL`` instance. + """ + + @abstractmethod + def build_query(self, retry: int, records: int, *args, **kwargs) -> DatabaseOperation: + """Build the "select not processed" query. + + :return: A ``SQL`` instance. + """ diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/collections/queues/database/impl.py b/packages/core/minos-microservice-networks/minos/networks/brokers/collections/queues/database/impl.py new file mode 100644 index 000000000..05c876780 --- /dev/null +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/collections/queues/database/impl.py @@ -0,0 +1,260 @@ +from __future__ import ( + annotations, +) + +import logging +from asyncio import ( + CancelledError, + Event, + PriorityQueue, + QueueEmpty, + TimeoutError, + create_task, + wait_for, +) +from contextlib import ( + suppress, +) +from typing import ( + Any, + Generic, + NoReturn, + Optional, + TypeVar, +) + +from cached_property import ( + cached_property, +) + +from minos.common import ( + Builder, + Config, + DatabaseClient, + DatabaseMixin, +) + +from ....messages import ( + BrokerMessage, +) +from ..abc import ( + BrokerQueue, +) +from .factories import ( + BrokerQueueDatabaseOperationFactory, +) + +logger = logging.getLogger(__name__) + +GenericBrokerQueueDatabaseOperationFactory = TypeVar( + "GenericBrokerQueueDatabaseOperationFactory", bound=BrokerQueueDatabaseOperationFactory +) + + +class DatabaseBrokerQueue( + BrokerQueue, + DatabaseMixin[GenericBrokerQueueDatabaseOperationFactory], + Generic[GenericBrokerQueueDatabaseOperationFactory], +): + """Database Broker Queue class.""" + + _queue: PriorityQueue[_Entry] + + def __init__( + self, + *args, + retry: Optional[int] = None, + records: Optional[int] = None, + database_key: Optional[tuple[str]] = None, + **kwargs, + ): + if database_key is None: + database_key = ("broker",) + super().__init__(*args, database_key=database_key, **kwargs) + + if retry is None: + retry = 2 + if records is None: + records = 1000 + + self._retry = retry + self._records = records + + self._queue = PriorityQueue(maxsize=records) + + self._run_task = None + self._enqueued_event = Event() + + @property + def retry(self) -> int: + """Get the retry value. + + :return: A ``int`` value. + """ + return self._retry + + @property + def records(self) -> int: + """Get the records value. + + :return: A ``int`` value. + """ + return self._records + + @classmethod + def _from_config(cls, config: Config, **kwargs) -> DatabaseBrokerQueue: + broker_interface = config.get_interface_by_name("broker") + queue_config = broker_interface.get("common", dict()).get("queue", dict()) + database_config = {"database_key": None} + + return cls(**(kwargs | database_config | queue_config)) + + async def _setup(self) -> None: + await super()._setup() + await self._create_table() + await self._start_run() + + async def _destroy(self) -> None: + await self._stop_run() + await self._flush_queue() + await super()._destroy() + + async def _create_table(self) -> None: + operation = self.database_operation_factory.build_create() + await self.execute_on_database(operation) + + async def _start_run(self) -> None: + if self._run_task is None: + self._run_task = create_task(self._run()) + + async def _stop_run(self) -> None: + if self._run_task is not None: + task = self._run_task + self._run_task = None + + task.cancel() + with suppress(TimeoutError, CancelledError): + await wait_for(task, 0.5) + + async def _flush_queue(self): + while True: + try: + entry = self._queue.get_nowait() + except QueueEmpty: + break + operation = self.database_operation_factory.build_mark_processed(entry.id_) + await self.execute_on_database(operation) + self._queue.task_done() + + async def _enqueue(self, message: BrokerMessage) -> None: + operation = self.database_operation_factory.build_submit(message.topic, message.avro_bytes) + await self.execute_on_database(operation) + await self._notify_enqueued(message) + + # noinspection PyUnusedLocal + async def _notify_enqueued(self, message: BrokerMessage) -> None: + self._enqueued_event.set() + + async def _dequeue(self) -> BrokerMessage: + while True: + entry = await self._queue.get() + try: + # noinspection PyBroadException + try: + message = entry.data + except Exception as exc: + logger.warning( + f"There was a problem while trying to deserialize the entry with {entry.id_!r} id: {exc}" + ) + operation = self.database_operation_factory.build_mark_processed(entry.id_) + await self.execute_on_database(operation) + continue + + operation = self.database_operation_factory.build_delete(entry.id_) + await self.execute_on_database(operation) + return message + finally: + self._queue.task_done() + + async def _run(self, max_wait: Optional[float] = 60.0) -> NoReturn: + while self._run_task is not None: + await self._wait_for_entries(max_wait) + await self._dequeue_batch() + + async def _wait_for_entries(self, max_wait: Optional[float]) -> None: + while True: + if await self._get_count(): + return + + with suppress(TimeoutError): + return await wait_for(self._wait_enqueued(), max_wait) + + async def _wait_enqueued(self) -> None: + await self._enqueued_event.wait() + self._enqueued_event.clear() + + async def _get_count(self) -> int: + # noinspection PyTypeChecker + operation = self.database_operation_factory.build_count(self.retry) + row = await self.execute_on_database_and_fetch_one(operation) + count = row[0] + return count + + async def _dequeue_batch(self) -> None: + async with self.database_pool.acquire() as client: + rows = await self._dequeue_rows(client) + + if not len(rows): + return + + entries = [_Entry(*row) for row in rows] + + ids = tuple(entry.id_ for entry in entries) + operation = self.database_operation_factory.build_mark_processing(ids) + await client.execute(operation) + + for entry in entries: + await self._queue.put(entry) + + async def _dequeue_rows(self, client: DatabaseClient) -> list[Any]: + operation = self.database_operation_factory.build_query(self._retry, self._records) + await client.execute(operation) + return [row async for row in client.fetch_all()] + + +class _Entry: + def __init__(self, id_: int, data_bytes: bytes): + self.id_ = id_ + self.data_bytes = data_bytes + + @cached_property + def data(self) -> BrokerMessage: + """Get the data. + + :return: A ``Model`` inherited instance. + """ + return BrokerMessage.from_avro_bytes(self.data_bytes) + + def __lt__(self, other: Any) -> bool: + # noinspection PyBroadException + try: + return isinstance(other, type(self)) and self.data < other.data + except Exception: + return False + + +class DatabaseBrokerQueueBuilder(Builder): + """Database Broker Queue Builder class.""" + + def with_config(self, config: Config): + """Set config. + + :param config: The config to be set. + :return: This method return the builder instance. + """ + self.kwargs |= {"database_key": None} + self.kwargs |= config.get_interface_by_name("broker").get("common", dict()).get("queue", dict()) + return super().with_config(config) + + +DatabaseBrokerQueue.set_builder(DatabaseBrokerQueueBuilder) diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/collections/queues/pg.py b/packages/core/minos-microservice-networks/minos/networks/brokers/collections/queues/pg.py deleted file mode 100644 index fa3de8baf..000000000 --- a/packages/core/minos-microservice-networks/minos/networks/brokers/collections/queues/pg.py +++ /dev/null @@ -1,371 +0,0 @@ -from __future__ import ( - annotations, -) - -import logging -from abc import ( - ABC, - abstractmethod, -) -from asyncio import ( - CancelledError, - PriorityQueue, - QueueEmpty, - TimeoutError, - create_task, - wait_for, -) -from contextlib import ( - suppress, -) -from typing import ( - Any, - NoReturn, - Optional, -) - -from aiopg import ( - Cursor, -) -from cached_property import ( - cached_property, -) -from psycopg2.sql import ( - SQL, -) - -from minos.common import ( - Config, - PostgreSqlMinosDatabase, -) - -from ....utils import ( - Builder, - consume_queue, -) -from ...messages import ( - BrokerMessage, -) -from .abc import ( - BrokerQueue, -) - -logger = logging.getLogger(__name__) - - -class PostgreSqlBrokerQueue(BrokerQueue, PostgreSqlMinosDatabase): - """PostgreSql Broker Queue class.""" - - _queue: PriorityQueue[_Entry] - - def __init__( - self, - *args, - query_factory: PostgreSqlBrokerQueueQueryFactory, - retry: Optional[int] = None, - records: Optional[int] = None, - **kwargs, - ): - super().__init__(*args, **kwargs) - - if retry is None: - retry = 2 - if records is None: - records = 1000 - - self._query_factory = query_factory - self._retry = retry - self._records = records - - self._queue = PriorityQueue(maxsize=records) - - self._run_task = None - - @property - def retry(self) -> int: - """Get the retry value. - - :return: A ``int`` value. - """ - return self._retry - - @property - def records(self) -> int: - """Get the records value. - - :return: A ``int`` value. - """ - return self._records - - @property - def query_factory(self) -> PostgreSqlBrokerQueueQueryFactory: - """Get the query factory. - - :return: A ``PostgreSqlBrokerQueueQueryFactory`` instance. - """ - return self._query_factory - - @classmethod - def _from_config(cls, config: Config, **kwargs) -> PostgreSqlBrokerQueue: - broker_interface = config.get_interface_by_name("broker") - queue_config = broker_interface.get("common", dict()).get("queue", dict()) - database_config = config.get_database_by_name("broker") - - return cls(**(kwargs | database_config | queue_config)) - - async def _setup(self) -> None: - await super()._setup() - await self._create_table() - await self._start_run() - - async def _destroy(self) -> None: - await self._stop_run() - await self._flush_queue() - await super()._destroy() - - async def _create_table(self) -> None: - await self.submit_query(self._query_factory.build_create_table(), lock=self._query_factory.build_table_name()) - - async def _start_run(self) -> None: - if self._run_task is None: - self._run_task = create_task(self._run()) - - async def _stop_run(self) -> None: - if self._run_task is not None: - task = self._run_task - self._run_task = None - - task.cancel() - with suppress(TimeoutError, CancelledError): - await wait_for(task, 0.5) - - async def _flush_queue(self): - while True: - try: - entry = self._queue.get_nowait() - except QueueEmpty: - break - await self.submit_query(self._query_factory.build_update_not_processed(), (entry.id_,)) - self._queue.task_done() - - async def _enqueue(self, message: BrokerMessage) -> None: - await self.submit_query_and_fetchone(self._query_factory.build_insert(), (message.topic, message.avro_bytes)) - await self._notify_enqueued(message) - - async def _notify_enqueued(self, message: BrokerMessage) -> None: - await self.submit_query(self._query_factory.build_notify()) - - async def _dequeue(self) -> BrokerMessage: - while True: - entry = await self._queue.get() - try: - # noinspection PyBroadException - try: - message = entry.data - except Exception as exc: - logger.warning( - f"There was a problem while trying to deserialize the entry with {entry.id_!r} id: {exc}" - ) - await self.submit_query(self._query_factory.build_update_not_processed(), (entry.id_,)) - continue - - await self.submit_query(self._query_factory.build_delete_processed(), (entry.id_,)) - return message - finally: - self._queue.task_done() - - async def _run(self, max_wait: Optional[float] = 60.0) -> NoReturn: - async with self.cursor() as cursor: - await self._listen_entries(cursor) - try: - while self._run_task is not None: - await self._wait_for_entries(cursor, max_wait) - await self._dequeue_batch(cursor) - finally: - await self._unlisten_entries(cursor) - - async def _listen_entries(self, cursor: Cursor) -> None: - # noinspection PyTypeChecker - await cursor.execute(self._query_factory.build_listen()) - - async def _unlisten_entries(self, cursor: Cursor) -> None: - if not cursor.closed: - # noinspection PyTypeChecker - await cursor.execute(self._query_factory.build_unlisten()) - - async def _wait_for_entries(self, cursor: Cursor, max_wait: Optional[float]) -> None: - while True: - if await self._get_count(cursor): - return - - with suppress(TimeoutError): - return await wait_for(consume_queue(cursor.connection.notifies, self._records), max_wait) - - async def _get_count(self, cursor: Cursor) -> int: - # noinspection PyTypeChecker - await cursor.execute(self._query_factory.build_count_not_processed(), (self._retry,)) - count = (await cursor.fetchone())[0] - return count - - async def _dequeue_batch(self, cursor: Cursor) -> None: - async with cursor.begin(): - rows = await self._dequeue_rows(cursor) - - if not len(rows): - return - - entries = [_Entry(*row) for row in rows] - - # noinspection PyTypeChecker - await cursor.execute(self._query_factory.build_mark_processing(), (tuple(entry.id_ for entry in entries),)) - - for entry in entries: - await self._queue.put(entry) - - async def _dequeue_rows(self, cursor: Cursor) -> list[Any]: - # noinspection PyTypeChecker - await cursor.execute(self._query_factory.build_select_not_processed(), (self._retry, self._records)) - return await cursor.fetchall() - - -class PostgreSqlBrokerQueueQueryFactory(ABC): - """PostgreSql Broker Queue Query Factory class.""" - - @abstractmethod - def build_table_name(self) -> str: - """Get the table name. - - :return: A ``str`` value. - """ - raise NotImplementedError - - def build_create_table(self) -> SQL: - """Build the "create table" query. - - :return: A ``SQL`` instance. - """ - return SQL( - f"CREATE TABLE IF NOT EXISTS {self.build_table_name()} (" - "id BIGSERIAL NOT NULL PRIMARY KEY, " - "topic VARCHAR(255) NOT NULL, " - "data BYTEA NOT NULL, " - "retry INTEGER NOT NULL DEFAULT 0, " - "processing BOOL NOT NULL DEFAULT FALSE, " - "created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), " - "updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW())" - ) - - def build_update_not_processed(self) -> SQL: - """Build the "update not processed" query. - - :return: A ``SQL`` instance. - """ - return SQL( - f"UPDATE {self.build_table_name()} " - "SET processing = FALSE, retry = retry + 1, updated_at = NOW() WHERE id = %s" - ) - - def build_delete_processed(self) -> SQL: - """Build the "delete processed" query. - - :return: A ``SQL`` instance. - """ - return SQL(f"DELETE FROM {self.build_table_name()} WHERE id = %s") - - def build_mark_processing(self) -> SQL: - """ - - :return: A ``SQL`` instance. - """ - return SQL(f"UPDATE {self.build_table_name()} SET processing = TRUE WHERE id IN %s") - - def build_notify(self) -> SQL: - """Build the "notify" query. - - :return: A ``SQL`` instance. - """ - return SQL(f"NOTIFY {self.build_table_name()}") - - def build_listen(self) -> SQL: - """Build the "listen" query. - - :return: A ``SQL`` instance. - """ - return SQL(f"LISTEN {self.build_table_name()}") - - def build_unlisten(self) -> SQL: - """Build the "unlisten" query. - - :return: A ``SQL`` instance. - """ - return SQL(f"UNLISTEN {self.build_table_name()}") - - def build_count_not_processed(self) -> SQL: - """Build the "count not processed" query. - - :return: - """ - return SQL( - f"SELECT COUNT(*) FROM (SELECT id FROM {self.build_table_name()} " - "WHERE NOT processing AND retry < %s FOR UPDATE SKIP LOCKED) s" - ) - - def build_insert(self) -> SQL: - """Build the "insert" query. - - :return: A ``SQL`` instance. - """ - return SQL(f"INSERT INTO {self.build_table_name()} (topic, data) VALUES (%s, %s) RETURNING id") - - def build_select_not_processed(self) -> SQL: - """Build the "select not processed" query. - - :return: A ``SQL`` instance. - """ - return SQL( - "SELECT id, data " - f"FROM {self.build_table_name()} " - "WHERE NOT processing AND retry < %s " - "ORDER BY created_at " - "LIMIT %s " - "FOR UPDATE " - "SKIP LOCKED" - ) - - -class _Entry: - def __init__(self, id_: int, data_bytes: bytes): - self.id_ = id_ - self.data_bytes = data_bytes - - @cached_property - def data(self) -> BrokerMessage: - """Get the data. - - :return: A ``Model`` inherited instance. - """ - return BrokerMessage.from_avro_bytes(self.data_bytes) - - def __lt__(self, other: Any) -> bool: - # noinspection PyBroadException - try: - return isinstance(other, type(self)) and self.data < other.data - except Exception: - return False - - -class PostgreSqlBrokerQueueBuilder(Builder): - """PostgreSql Broker Queue Builder class.""" - - def with_config(self, config: Config): - """Set config. - - :param config: The config to be set. - :return: This method return the builder instance. - """ - self.kwargs |= config.get_database_by_name("broker") - self.kwargs |= config.get_interface_by_name("broker").get("common", dict()).get("queue", dict()) - return super().with_config(config) - - -PostgreSqlBrokerQueue.set_builder(PostgreSqlBrokerQueueBuilder) diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/handlers/impl.py b/packages/core/minos-microservice-networks/minos/networks/brokers/handlers/impl.py index b26cb5831..17340e926 100644 --- a/packages/core/minos-microservice-networks/minos/networks/brokers/handlers/impl.py +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/handlers/impl.py @@ -38,7 +38,7 @@ class BrokerHandler(SetupMixin): """Broker Handler class.""" def __init__( - self, dispatcher: BrokerDispatcher, subscriber: BrokerSubscriber, concurrency: int = 15, *args, **kwargs + self, dispatcher: BrokerDispatcher, subscriber: BrokerSubscriber, concurrency: int = 5, *args, **kwargs ): super().__init__(*args, **kwargs) diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/pools.py b/packages/core/minos-microservice-networks/minos/networks/brokers/pools.py index 66df5475c..fecf1929c 100644 --- a/packages/core/minos-microservice-networks/minos/networks/brokers/pools.py +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/pools.py @@ -14,7 +14,6 @@ from minos.common import ( Config, - Injectable, Pool, ) @@ -28,14 +27,11 @@ logger = logging.getLogger(__name__) -@Injectable("broker_pool") class BrokerClientPool(Pool): """Broker Client Pool class.""" - def __init__( - self, instance_kwargs: dict[str, Any], maxsize: int = 5, recycle: Optional[int] = 3600, *args, **kwargs - ): - super().__init__(maxsize=maxsize, recycle=recycle, *args, **kwargs) + def __init__(self, instance_kwargs: dict[str, Any], maxsize: int = 5, *args, **kwargs): + super().__init__(maxsize=maxsize, *args, **kwargs) self._instance_kwargs = instance_kwargs @classmethod diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/publishers/__init__.py b/packages/core/minos-microservice-networks/minos/networks/brokers/publishers/__init__.py index 7d3037037..d3195a41f 100644 --- a/packages/core/minos-microservice-networks/minos/networks/brokers/publishers/__init__.py +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/publishers/__init__.py @@ -7,8 +7,8 @@ ) from .queued import ( BrokerPublisherQueue, + BrokerPublisherQueueDatabaseOperationFactory, + DatabaseBrokerPublisherQueue, InMemoryBrokerPublisherQueue, - PostgreSqlBrokerPublisherQueue, - PostgreSqlBrokerPublisherQueueQueryFactory, QueuedBrokerPublisher, ) diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/publishers/queued/__init__.py b/packages/core/minos-microservice-networks/minos/networks/brokers/publishers/queued/__init__.py index eaa101250..9f1dfd8b8 100644 --- a/packages/core/minos-microservice-networks/minos/networks/brokers/publishers/queued/__init__.py +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/publishers/queued/__init__.py @@ -3,7 +3,7 @@ ) from .queues import ( BrokerPublisherQueue, + BrokerPublisherQueueDatabaseOperationFactory, + DatabaseBrokerPublisherQueue, InMemoryBrokerPublisherQueue, - PostgreSqlBrokerPublisherQueue, - PostgreSqlBrokerPublisherQueueQueryFactory, ) diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/publishers/queued/queues/__init__.py b/packages/core/minos-microservice-networks/minos/networks/brokers/publishers/queued/queues/__init__.py index 81e0bc8cb..85b9822bc 100644 --- a/packages/core/minos-microservice-networks/minos/networks/brokers/publishers/queued/queues/__init__.py +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/publishers/queued/queues/__init__.py @@ -1,10 +1,10 @@ from .abc import ( BrokerPublisherQueue, ) +from .database import ( + BrokerPublisherQueueDatabaseOperationFactory, + DatabaseBrokerPublisherQueue, +) from .memory import ( InMemoryBrokerPublisherQueue, ) -from .pg import ( - PostgreSqlBrokerPublisherQueue, - PostgreSqlBrokerPublisherQueueQueryFactory, -) diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/publishers/queued/queues/database.py b/packages/core/minos-microservice-networks/minos/networks/brokers/publishers/queued/queues/database.py new file mode 100644 index 000000000..059a5e0d8 --- /dev/null +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/publishers/queued/queues/database.py @@ -0,0 +1,28 @@ +from __future__ import ( + annotations, +) + +import logging +from abc import ( + ABC, +) + +from ....collections import ( + BrokerQueueDatabaseOperationFactory, + DatabaseBrokerQueue, +) +from .abc import ( + BrokerPublisherQueue, +) + +logger = logging.getLogger(__name__) + + +class BrokerPublisherQueueDatabaseOperationFactory(BrokerQueueDatabaseOperationFactory, ABC): + """Broker Publisher Queue Database Operation Factory class.""" + + +class DatabaseBrokerPublisherQueue( + DatabaseBrokerQueue[BrokerPublisherQueueDatabaseOperationFactory], BrokerPublisherQueue +): + """Database Broker Publisher Queue class.""" diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/publishers/queued/queues/pg.py b/packages/core/minos-microservice-networks/minos/networks/brokers/publishers/queued/queues/pg.py deleted file mode 100644 index fef5d0b09..000000000 --- a/packages/core/minos-microservice-networks/minos/networks/brokers/publishers/queued/queues/pg.py +++ /dev/null @@ -1,38 +0,0 @@ -from __future__ import ( - annotations, -) - -import logging -from typing import ( - Optional, -) - -from ....collections import ( - PostgreSqlBrokerQueue, - PostgreSqlBrokerQueueQueryFactory, -) -from .abc import ( - BrokerPublisherQueue, -) - -logger = logging.getLogger(__name__) - - -class PostgreSqlBrokerPublisherQueue(PostgreSqlBrokerQueue, BrokerPublisherQueue): - """PostgreSql Broker Publisher Queue class.""" - - def __init__(self, *args, query_factory: Optional[PostgreSqlBrokerQueueQueryFactory] = None, **kwargs): - if query_factory is None: - query_factory = PostgreSqlBrokerPublisherQueueQueryFactory() - super().__init__(*args, query_factory=query_factory, **kwargs) - - -class PostgreSqlBrokerPublisherQueueQueryFactory(PostgreSqlBrokerQueueQueryFactory): - """PostgreSql Broker Publisher Queue Query Factory class.""" - - def build_table_name(self) -> str: - """Get the table name. - - :return: A ``str`` value. - """ - return "broker_publisher_queue" diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/__init__.py b/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/__init__.py index 0a94221e5..c5932b0ec 100644 --- a/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/__init__.py +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/__init__.py @@ -4,12 +4,12 @@ ) from .filtered import ( BrokerSubscriberDuplicateValidator, + BrokerSubscriberDuplicateValidatorDatabaseOperationFactory, BrokerSubscriberValidator, + DatabaseBrokerSubscriberDuplicateValidator, + DatabaseBrokerSubscriberDuplicateValidatorBuilder, FilteredBrokerSubscriber, InMemoryBrokerSubscriberDuplicateValidator, - PostgreSqlBrokerSubscriberDuplicateValidator, - PostgreSqlBrokerSubscriberDuplicateValidatorBuilder, - PostgreSqlBrokerSubscriberDuplicateValidatorQueryFactory, ) from .memory import ( InMemoryBrokerSubscriber, @@ -18,11 +18,11 @@ from .queued import ( BrokerSubscriberQueue, BrokerSubscriberQueueBuilder, + BrokerSubscriberQueueDatabaseOperationFactory, + DatabaseBrokerSubscriberQueue, + DatabaseBrokerSubscriberQueueBuilder, InMemoryBrokerSubscriberQueue, InMemoryBrokerSubscriberQueueBuilder, - PostgreSqlBrokerSubscriberQueue, - PostgreSqlBrokerSubscriberQueueBuilder, - PostgreSqlBrokerSubscriberQueueQueryFactory, QueuedBrokerSubscriber, QueuedBrokerSubscriberBuilder, ) diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/filtered/__init__.py b/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/filtered/__init__.py index 12e98c065..f9239bd89 100644 --- a/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/filtered/__init__.py +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/filtered/__init__.py @@ -3,9 +3,9 @@ ) from .validators import ( BrokerSubscriberDuplicateValidator, + BrokerSubscriberDuplicateValidatorDatabaseOperationFactory, BrokerSubscriberValidator, + DatabaseBrokerSubscriberDuplicateValidator, + DatabaseBrokerSubscriberDuplicateValidatorBuilder, InMemoryBrokerSubscriberDuplicateValidator, - PostgreSqlBrokerSubscriberDuplicateValidator, - PostgreSqlBrokerSubscriberDuplicateValidatorBuilder, - PostgreSqlBrokerSubscriberDuplicateValidatorQueryFactory, ) diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/filtered/validators/__init__.py b/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/filtered/validators/__init__.py index 1ac774fae..083fb0000 100644 --- a/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/filtered/validators/__init__.py +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/filtered/validators/__init__.py @@ -3,8 +3,8 @@ ) from .duplicates import ( BrokerSubscriberDuplicateValidator, + BrokerSubscriberDuplicateValidatorDatabaseOperationFactory, + DatabaseBrokerSubscriberDuplicateValidator, + DatabaseBrokerSubscriberDuplicateValidatorBuilder, InMemoryBrokerSubscriberDuplicateValidator, - PostgreSqlBrokerSubscriberDuplicateValidator, - PostgreSqlBrokerSubscriberDuplicateValidatorBuilder, - PostgreSqlBrokerSubscriberDuplicateValidatorQueryFactory, ) diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/filtered/validators/duplicates/__init__.py b/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/filtered/validators/duplicates/__init__.py index 114d74268..48612b056 100644 --- a/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/filtered/validators/duplicates/__init__.py +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/filtered/validators/duplicates/__init__.py @@ -1,11 +1,11 @@ from .abc import ( BrokerSubscriberDuplicateValidator, ) +from .database import ( + BrokerSubscriberDuplicateValidatorDatabaseOperationFactory, + DatabaseBrokerSubscriberDuplicateValidator, + DatabaseBrokerSubscriberDuplicateValidatorBuilder, +) from .memory import ( InMemoryBrokerSubscriberDuplicateValidator, ) -from .pg import ( - PostgreSqlBrokerSubscriberDuplicateValidator, - PostgreSqlBrokerSubscriberDuplicateValidatorBuilder, - PostgreSqlBrokerSubscriberDuplicateValidatorQueryFactory, -) diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/filtered/validators/duplicates/database/__init__.py b/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/filtered/validators/duplicates/database/__init__.py new file mode 100644 index 000000000..8cb5ceb47 --- /dev/null +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/filtered/validators/duplicates/database/__init__.py @@ -0,0 +1,7 @@ +from .factories import ( + BrokerSubscriberDuplicateValidatorDatabaseOperationFactory, +) +from .impl import ( + DatabaseBrokerSubscriberDuplicateValidator, + DatabaseBrokerSubscriberDuplicateValidatorBuilder, +) diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/filtered/validators/duplicates/database/factories.py b/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/filtered/validators/duplicates/database/factories.py new file mode 100644 index 000000000..d32234805 --- /dev/null +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/filtered/validators/duplicates/database/factories.py @@ -0,0 +1,31 @@ +from abc import ( + ABC, + abstractmethod, +) +from uuid import ( + UUID, +) + +from minos.common import ( + DatabaseOperation, + DatabaseOperationFactory, +) + + +# noinspection SqlNoDataSourceInspection,SqlResolve +class BrokerSubscriberDuplicateValidatorDatabaseOperationFactory(DatabaseOperationFactory, ABC): + """Broker Subscriber Duplicate Validator Database Operation Factory class.""" + + @abstractmethod + def build_create(self) -> DatabaseOperation: + """Build the "create table" query. + + :return: A ``SQL`` instance. + """ + + @abstractmethod + def build_submit(self, topic: str, uuid: UUID) -> DatabaseOperation: + """Build the "insert row" query. + + :return: A ``SQL`` instance. + """ diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/filtered/validators/duplicates/database/impl.py b/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/filtered/validators/duplicates/database/impl.py new file mode 100644 index 000000000..d802ad567 --- /dev/null +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/filtered/validators/duplicates/database/impl.py @@ -0,0 +1,68 @@ +from __future__ import ( + annotations, +) + +from typing import ( + Optional, +) +from uuid import ( + UUID, +) + +from minos.common import ( + Builder, + Config, + DatabaseMixin, + IntegrityException, +) + +from ..abc import ( + BrokerSubscriberDuplicateValidator, +) +from .factories import ( + BrokerSubscriberDuplicateValidatorDatabaseOperationFactory, +) + + +class DatabaseBrokerSubscriberDuplicateValidator( + BrokerSubscriberDuplicateValidator, + DatabaseMixin[BrokerSubscriberDuplicateValidatorDatabaseOperationFactory], +): + """Database Broker Subscriber Duplicate Detector class.""" + + def __init__(self, *args, database_key: Optional[tuple[str]] = None, **kwargs): + if database_key is None: + database_key = ("broker",) + super().__init__(*args, database_key=database_key, **kwargs) + + async def _setup(self) -> None: + await super()._setup() + await self._create_table() + + async def _create_table(self) -> None: + operation = self.database_operation_factory.build_create() + await self.execute_on_database(operation) + + async def _is_unique(self, topic: str, uuid: UUID) -> bool: + operation = self.database_operation_factory.build_submit(topic, uuid) + try: + await self.execute_on_database(operation) + return True + except IntegrityException: + return False + + +class DatabaseBrokerSubscriberDuplicateValidatorBuilder(Builder[DatabaseBrokerSubscriberDuplicateValidator]): + """Database Broker Subscriber Duplicate Detector Builder class.""" + + def with_config(self, config: Config): + """Set config. + + :param config: The config to be set. + :return: This method return the builder instance. + """ + self.kwargs |= {"database_key": None} + return super().with_config(config) + + +DatabaseBrokerSubscriberDuplicateValidator.set_builder(DatabaseBrokerSubscriberDuplicateValidatorBuilder) diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/filtered/validators/duplicates/pg.py b/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/filtered/validators/duplicates/pg.py deleted file mode 100644 index fb2ee854d..000000000 --- a/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/filtered/validators/duplicates/pg.py +++ /dev/null @@ -1,132 +0,0 @@ -from __future__ import ( - annotations, -) - -from typing import ( - Optional, -) -from uuid import ( - UUID, -) - -from psycopg2 import ( - IntegrityError, -) -from psycopg2.sql import ( - SQL, -) - -from minos.common import ( - Builder, - Config, - PostgreSqlMinosDatabase, -) - -from .abc import ( - BrokerSubscriberDuplicateValidator, -) - - -class PostgreSqlBrokerSubscriberDuplicateValidator(BrokerSubscriberDuplicateValidator, PostgreSqlMinosDatabase): - """PostgreSql Broker Subscriber Duplicate Detector class.""" - - def __init__( - self, query_factory: Optional[PostgreSqlBrokerSubscriberDuplicateValidatorQueryFactory] = None, *args, **kwargs - ): - if query_factory is None: - query_factory = PostgreSqlBrokerSubscriberDuplicateValidatorQueryFactory() - super().__init__(*args, **kwargs) - self._query_factory = query_factory - - async def _setup(self) -> None: - await super()._setup() - await self._create_table() - - async def _create_table(self) -> None: - await self.submit_query( - self._query_factory.build_activate_uuid_extension(), - lock=self._query_factory.build_uuid_extension_name(), - ) - await self.submit_query( - self._query_factory.build_create_table(), - lock=self._query_factory.build_table_name(), - ) - - @property - def query_factory(self) -> PostgreSqlBrokerSubscriberDuplicateValidatorQueryFactory: - """Get the query factory. - - :return: A ``PostgreSqlBrokerSubscriberDuplicateValidatorQueryFactory`` instance. - """ - return self._query_factory - - async def _is_unique(self, topic: str, uuid: UUID) -> bool: - try: - await self.submit_query(self._query_factory.build_insert_row(), {"topic": topic, "uuid": uuid}) - return True - except IntegrityError: - return False - - -class PostgreSqlBrokerSubscriberDuplicateValidatorBuilder(Builder[PostgreSqlBrokerSubscriberDuplicateValidator]): - """PostgreSql Broker Subscriber Duplicate Detector Builder class.""" - - def with_config(self, config: Config): - """Set config. - - :param config: The config to be set. - :return: This method return the builder instance. - """ - self.kwargs |= config.get_database_by_name("broker") - return super().with_config(config) - - -PostgreSqlBrokerSubscriberDuplicateValidator.set_builder(PostgreSqlBrokerSubscriberDuplicateValidatorBuilder) - - -class PostgreSqlBrokerSubscriberDuplicateValidatorQueryFactory: - """PostgreSql Broker Subscriber Duplicate Detector Query Factory class.""" - - @staticmethod - def build_uuid_extension_name() -> str: - """Build the uuid extension name. - - :return: A ``str`` instance. - """ - return "uuid-ossp" - - def build_activate_uuid_extension(self) -> SQL: - """Build activate uuid extension query. - - :return: A ``SQL`` instance. - """ - return SQL(f'CREATE EXTENSION IF NOT EXISTS "{self.build_uuid_extension_name()}";') - - @staticmethod - def build_table_name() -> str: - """Build the table name. - - :return: A ``str`` instance. - """ - return "broker_subscriber_processed_messages" - - def build_create_table(self) -> SQL: - """Build the "create table" query. - - :return: A ``SQL`` instance. - """ - return SQL( - f"CREATE TABLE IF NOT EXISTS {self.build_table_name()} (" - " topic VARCHAR(255) NOT NULL, " - " uuid UUID NOT NULL, " - " created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()," - " PRIMARY KEY (topic, uuid)" - ")" - ) - - def build_insert_row(self) -> SQL: - """Build the "insert row" query. - - :return: A ``SQL`` instance. - """ - return SQL(f"INSERT INTO {self.build_table_name()}(topic, uuid) VALUES(%(topic)s, %(uuid)s)") diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/queued/__init__.py b/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/queued/__init__.py index 1d12f5592..896e77c03 100644 --- a/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/queued/__init__.py +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/queued/__init__.py @@ -5,9 +5,9 @@ from .queues import ( BrokerSubscriberQueue, BrokerSubscriberQueueBuilder, + BrokerSubscriberQueueDatabaseOperationFactory, + DatabaseBrokerSubscriberQueue, + DatabaseBrokerSubscriberQueueBuilder, InMemoryBrokerSubscriberQueue, InMemoryBrokerSubscriberQueueBuilder, - PostgreSqlBrokerSubscriberQueue, - PostgreSqlBrokerSubscriberQueueBuilder, - PostgreSqlBrokerSubscriberQueueQueryFactory, ) diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/queued/queues/__init__.py b/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/queued/queues/__init__.py index b1396e194..6a871e7f3 100644 --- a/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/queued/queues/__init__.py +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/queued/queues/__init__.py @@ -2,12 +2,12 @@ BrokerSubscriberQueue, BrokerSubscriberQueueBuilder, ) +from .database import ( + BrokerSubscriberQueueDatabaseOperationFactory, + DatabaseBrokerSubscriberQueue, + DatabaseBrokerSubscriberQueueBuilder, +) from .memory import ( InMemoryBrokerSubscriberQueue, InMemoryBrokerSubscriberQueueBuilder, ) -from .pg import ( - PostgreSqlBrokerSubscriberQueue, - PostgreSqlBrokerSubscriberQueueBuilder, - PostgreSqlBrokerSubscriberQueueQueryFactory, -) diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/queued/queues/database/__init__.py b/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/queued/queues/database/__init__.py new file mode 100644 index 000000000..d06e7c8dc --- /dev/null +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/queued/queues/database/__init__.py @@ -0,0 +1,7 @@ +from .factories import ( + BrokerSubscriberQueueDatabaseOperationFactory, +) +from .impl import ( + DatabaseBrokerSubscriberQueue, + DatabaseBrokerSubscriberQueueBuilder, +) diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/queued/queues/database/factories.py b/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/queued/queues/database/factories.py new file mode 100644 index 000000000..a9ceacf23 --- /dev/null +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/queued/queues/database/factories.py @@ -0,0 +1,47 @@ +from abc import ( + ABC, + abstractmethod, +) +from collections.abc import ( + Iterable, +) + +from minos.common import ( + DatabaseOperation, +) + +from .....collections import ( + BrokerQueueDatabaseOperationFactory, +) + + +# noinspection SqlNoDataSourceInspection,SqlResolve,PyTypeChecker,PyArgumentList +class BrokerSubscriberQueueDatabaseOperationFactory(BrokerQueueDatabaseOperationFactory, ABC): + """Broker Subscriber Queue Database Operation Factory class.""" + + @abstractmethod + def build_count( + self, + retry: int, + topics: Iterable[str] = tuple(), + *args, + **kwargs, + ) -> DatabaseOperation: + """Build the "count not processed" query. + + :return: + """ + + @abstractmethod + def build_query( + self, + retry: int, + records: int, + topics: Iterable[str] = tuple(), + *args, + **kwargs, + ) -> DatabaseOperation: + """Build the "select not processed" query. + + :return: A ``SQL`` instance. + """ diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/queued/queues/database/impl.py b/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/queued/queues/database/impl.py new file mode 100644 index 000000000..7bbee880c --- /dev/null +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/queued/queues/database/impl.py @@ -0,0 +1,53 @@ +from __future__ import ( + annotations, +) + +import logging +from typing import ( + Any, +) + +from minos.common import ( + DatabaseClient, +) + +from .....collections import ( + DatabaseBrokerQueue, + DatabaseBrokerQueueBuilder, +) +from ..abc import ( + BrokerSubscriberQueue, + BrokerSubscriberQueueBuilder, +) +from .factories import ( + BrokerSubscriberQueueDatabaseOperationFactory, +) + +logger = logging.getLogger(__name__) + + +class DatabaseBrokerSubscriberQueue( + DatabaseBrokerQueue[BrokerSubscriberQueueDatabaseOperationFactory], BrokerSubscriberQueue +): + """Database Broker Subscriber Queue class.""" + + async def _get_count(self) -> int: + # noinspection PyTypeChecker + operation = self.database_operation_factory.build_count(self._retry, self.topics) + row = await self.execute_on_database_and_fetch_one(operation) + count = row[0] + return count + + async def _dequeue_rows(self, client: DatabaseClient) -> list[Any]: + operation = self.database_operation_factory.build_query(self._retry, self._records, self.topics) + await client.execute(operation) + return [row async for row in client.fetch_all()] + + +class DatabaseBrokerSubscriberQueueBuilder( + BrokerSubscriberQueueBuilder[DatabaseBrokerSubscriberQueue], DatabaseBrokerQueueBuilder +): + """Database Broker Subscriber Queue Builder class.""" + + +DatabaseBrokerSubscriberQueue.set_builder(DatabaseBrokerSubscriberQueueBuilder) diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/queued/queues/pg.py b/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/queued/queues/pg.py deleted file mode 100644 index 1cd1cdeec..000000000 --- a/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/queued/queues/pg.py +++ /dev/null @@ -1,133 +0,0 @@ -from __future__ import ( - annotations, -) - -import logging -from typing import ( - Any, - Optional, -) - -from aiopg import ( - Cursor, -) -from psycopg2.sql import ( - SQL, - Identifier, -) - -from ....collections import ( - PostgreSqlBrokerQueue, - PostgreSqlBrokerQueueBuilder, - PostgreSqlBrokerQueueQueryFactory, -) -from ....messages import ( - BrokerMessage, -) -from .abc import ( - BrokerSubscriberQueue, - BrokerSubscriberQueueBuilder, -) - -logger = logging.getLogger(__name__) - - -class PostgreSqlBrokerSubscriberQueue(PostgreSqlBrokerQueue, BrokerSubscriberQueue): - """PostgreSql Broker Subscriber Queue class.""" - - def __init__( - self, topics: set[str], *args, query_factory: Optional[PostgreSqlBrokerQueueQueryFactory] = None, **kwargs - ): - if query_factory is None: - query_factory = PostgreSqlBrokerSubscriberQueueQueryFactory() - super().__init__(topics, *args, query_factory=query_factory, **kwargs) - - async def _notify_enqueued(self, message: BrokerMessage) -> None: - await self.submit_query(self._query_factory.build_notify().format(Identifier(message.topic))) - - async def _listen_entries(self, cursor: Cursor) -> None: - for topic in self.topics: - await cursor.execute(self._query_factory.build_listen().format(Identifier(topic))) - - async def _unlisten_entries(self, cursor: Cursor) -> None: - if not cursor.closed: - for topic in self.topics: - await cursor.execute(self._query_factory.build_unlisten().format(Identifier(topic))) - - async def _get_count(self, cursor: Cursor) -> int: - # noinspection PyTypeChecker - await cursor.execute(self._query_factory.build_count_not_processed(), (self._retry, tuple(self.topics))) - count = (await cursor.fetchone())[0] - return count - - async def _dequeue_rows(self, cursor: Cursor) -> list[Any]: - # noinspection PyTypeChecker - await cursor.execute( - self._query_factory.build_select_not_processed(), (self._retry, tuple(self.topics), self._records) - ) - return await cursor.fetchall() - - -class PostgreSqlBrokerSubscriberQueueQueryFactory(PostgreSqlBrokerQueueQueryFactory): - """PostgreSql Broker Subscriber Queue Query Factory class.""" - - def build_table_name(self) -> str: - """Get the table name. - - :return: A ``str`` value. - """ - return "broker_subscriber_queue" - - def build_notify(self) -> SQL: - """Build the "notify" query. - - :return: A ``SQL`` instance. - """ - return SQL("NOTIFY {}") - - def build_listen(self) -> SQL: - """Build the "listen" query. - - :return: A ``SQL`` instance. - """ - return SQL("LISTEN {}") - - def build_unlisten(self) -> SQL: - """Build the "unlisten" query. - - :return: A ``SQL`` instance. - """ - return SQL("UNLISTEN {}") - - def build_count_not_processed(self) -> SQL: - """Build the "count not processed" query. - - :return: - """ - return SQL( - f"SELECT COUNT(*) FROM (SELECT id FROM {self.build_table_name()} " - "WHERE NOT processing AND retry < %s AND topic IN %s FOR UPDATE SKIP LOCKED) s" - ) - - def build_select_not_processed(self) -> SQL: - """Build the "select not processed" query. - - :return: A ``SQL`` instance. - """ - return SQL( - "SELECT id, data " - f"FROM {self.build_table_name()} " - "WHERE NOT processing AND retry < %s AND topic IN %s " - "ORDER BY created_at " - "LIMIT %s " - "FOR UPDATE SKIP LOCKED" - ) - - -class PostgreSqlBrokerSubscriberQueueBuilder( - BrokerSubscriberQueueBuilder[PostgreSqlBrokerSubscriberQueue], PostgreSqlBrokerQueueBuilder -): - """PostgreSql Broker Subscriber Queue Builder class.""" - - -PostgreSqlBrokerSubscriberQueue.set_builder(PostgreSqlBrokerSubscriberQueueBuilder) diff --git a/packages/core/minos-microservice-networks/minos/networks/decorators/definitions/abc.py b/packages/core/minos-microservice-networks/minos/networks/decorators/definitions/abc.py index be8f8d411..7f43c15ec 100644 --- a/packages/core/minos-microservice-networks/minos/networks/decorators/definitions/abc.py +++ b/packages/core/minos-microservice-networks/minos/networks/decorators/definitions/abc.py @@ -30,6 +30,9 @@ class EnrouteDecorator(ABC): # noinspection PyFinal KIND: Final[EnrouteDecoratorKind] + def __init__(self, **kwargs): + self.kwargs = kwargs + def __call__(self, func: Union[Handler, HandlerWrapper]) -> HandlerWrapper: if isinstance(func, HandlerWrapper): meta = func.meta diff --git a/packages/core/minos-microservice-networks/minos/networks/decorators/definitions/broker.py b/packages/core/minos-microservice-networks/minos/networks/decorators/definitions/broker.py index e51f16ce8..9e158e08e 100644 --- a/packages/core/minos-microservice-networks/minos/networks/decorators/definitions/broker.py +++ b/packages/core/minos-microservice-networks/minos/networks/decorators/definitions/broker.py @@ -17,7 +17,8 @@ class BrokerEnrouteDecorator(EnrouteDecorator, ABC): """Broker Enroute class""" - def __init__(self, topic: str): + def __init__(self, topic: str, **kwargs): + super().__init__(**kwargs) self.topic = topic def __iter__(self) -> Iterable: diff --git a/packages/core/minos-microservice-networks/minos/networks/decorators/definitions/http/abc.py b/packages/core/minos-microservice-networks/minos/networks/decorators/definitions/http/abc.py index c41b164c3..6b13676ce 100644 --- a/packages/core/minos-microservice-networks/minos/networks/decorators/definitions/http/abc.py +++ b/packages/core/minos-microservice-networks/minos/networks/decorators/definitions/http/abc.py @@ -12,7 +12,8 @@ class HttpEnrouteDecorator(EnrouteDecorator): """Http Enroute Decorator class.""" - def __init__(self, path: Optional[str] = None, method: Optional[str] = None, url: Optional[str] = None): + def __init__(self, path: Optional[str] = None, method: Optional[str] = None, url: Optional[str] = None, **kwargs): + super().__init__(**kwargs) if path is None and url is not None: warnings.warn("The 'url' argument has been deprecated. 'path' must be used.", DeprecationWarning) path = url diff --git a/packages/core/minos-microservice-networks/minos/networks/decorators/definitions/periodic.py b/packages/core/minos-microservice-networks/minos/networks/decorators/definitions/periodic.py index eca561757..fc150dd9c 100644 --- a/packages/core/minos-microservice-networks/minos/networks/decorators/definitions/periodic.py +++ b/packages/core/minos-microservice-networks/minos/networks/decorators/definitions/periodic.py @@ -32,7 +32,8 @@ class PeriodicEnrouteDecorator(EnrouteDecorator, ABC): """Periodic Enroute class""" - def __init__(self, crontab: Union[str, CronTab, CronTabImpl]): + def __init__(self, crontab: Union[str, CronTab, CronTabImpl], **kwargs): + super().__init__(**kwargs) from ...scheduling import ( CronTab, ) diff --git a/packages/core/minos-microservice-networks/minos/networks/discovery/clients/abc.py b/packages/core/minos-microservice-networks/minos/networks/discovery/clients/abc.py index a6862ba52..81d80caf3 100644 --- a/packages/core/minos-microservice-networks/minos/networks/discovery/clients/abc.py +++ b/packages/core/minos-microservice-networks/minos/networks/discovery/clients/abc.py @@ -1,3 +1,7 @@ +from __future__ import ( + annotations, +) + import logging from abc import ( ABC, @@ -5,13 +9,14 @@ ) from minos.common import ( - Object, + Config, + SetupMixin, ) logger = logging.getLogger(__name__) -class DiscoveryClient(ABC, Object): +class DiscoveryClient(ABC, SetupMixin): """Discovery Client class.""" def __init__(self, host: str, port: int, **kwargs): @@ -28,6 +33,14 @@ def route(self) -> str: # noinspection HttpUrlsUsage return f"http://{self.host}:{self.port}" + @classmethod + def _from_config(cls, config: Config, **kwargs) -> DiscoveryClient: + discovery_config = config.get_discovery() + + client_host = discovery_config.get("host") + client_port = discovery_config.get("port") + return cls(host=client_host, port=client_port, **kwargs) + @abstractmethod async def subscribe( self, host: str, port: int, name: str, endpoints: list[dict[str, str]], *args, **kwargs diff --git a/packages/core/minos-microservice-networks/minos/networks/discovery/connectors.py b/packages/core/minos-microservice-networks/minos/networks/discovery/connectors.py index 960639e09..7fb956fb0 100644 --- a/packages/core/minos-microservice-networks/minos/networks/discovery/connectors.py +++ b/packages/core/minos-microservice-networks/minos/networks/discovery/connectors.py @@ -79,10 +79,7 @@ def _client_from_config(cls, config: Config) -> DiscoveryClient: discovery_config = config.get_discovery() client_cls = cls._client_cls_from_config(discovery_config) - client_host = discovery_config.get("host") - client_port = discovery_config.get("port") - - return client_cls(host=client_host, port=client_port) + return client_cls.from_config(config) @staticmethod def _client_cls_from_config(discovery_config: dict[str, Any]) -> type[DiscoveryClient]: @@ -104,7 +101,8 @@ def _endpoints_from_config(config: Config) -> list[dict[str, Any]]: for name in config.get_services(): decorators = EnrouteCollector(name, config).get_rest_command_query() endpoints += [ - {"url": decorator.url, "method": decorator.method} for decorator in set(chain(*decorators.values())) + {"url": decorator.url, "method": decorator.method} | decorator.kwargs + for decorator in set(chain(*decorators.values())) ] endpoints.sort(key=itemgetter("url", "method")) diff --git a/packages/core/minos-microservice-networks/minos/networks/http/connectors.py b/packages/core/minos-microservice-networks/minos/networks/http/connectors.py index 5163d1571..fc9bd6f4a 100644 --- a/packages/core/minos-microservice-networks/minos/networks/http/connectors.py +++ b/packages/core/minos-microservice-networks/minos/networks/http/connectors.py @@ -8,6 +8,9 @@ ABC, abstractmethod, ) +from asyncio import ( + Semaphore, +) from collections.abc import ( Callable, ) @@ -56,7 +59,14 @@ class HttpConnector(ABC, SetupMixin, Generic[RawRequest, RawResponse]): """Http Application base class.""" - def __init__(self, adapter: HttpAdapter, host: Optional[str] = None, port: Optional[int] = None, **kwargs): + def __init__( + self, + adapter: HttpAdapter, + host: Optional[str] = None, + port: Optional[int] = None, + max_connections: int = 5, + **kwargs, + ): super().__init__(**kwargs) if host is None: host = "0.0.0.0" @@ -67,6 +77,8 @@ def __init__(self, adapter: HttpAdapter, host: Optional[str] = None, port: Optio self._host = host self._port = port + self._semaphore = Semaphore(max_connections) + @classmethod def _from_config(cls, config: Config, **kwargs) -> HttpConnector: http_config = config.get_interface_by_name("http") @@ -138,29 +150,30 @@ def adapt_callback( @wraps(callback) async def _wrapper(raw: RawRequest) -> RawResponse: - logger.info(f"Dispatching '{raw!s}'...") - - request = await self._build_request(raw) - token = REQUEST_USER_CONTEXT_VAR.set(request.user) - - # noinspection PyBroadException - try: - response = callback(request) - if isawaitable(response): - response = await response - - return await self._build_response(response) - - except ResponseException as exc: - tb = traceback.format_exc() - logger.error(f"Raised an application exception:\n {tb}") - return await self._build_error_response(tb, exc.status) - except Exception: - tb = traceback.format_exc() - logger.exception(f"Raised a system exception:\n {tb}") - return await self._build_error_response(tb, 500) - finally: - REQUEST_USER_CONTEXT_VAR.reset(token) + async with self._semaphore: + logger.info(f"Dispatching '{raw!s}'...") + + request = await self._build_request(raw) + token = REQUEST_USER_CONTEXT_VAR.set(request.user) + + # noinspection PyBroadException + try: + response = callback(request) + if isawaitable(response): + response = await response + + return await self._build_response(response) + + except ResponseException as exc: + tb = traceback.format_exc() + logger.error(f"Raised an application exception:\n {tb}") + return await self._build_error_response(tb, exc.status) + except Exception: + tb = traceback.format_exc() + logger.exception(f"Raised a system exception:\n {tb}") + return await self._build_error_response(tb, 500) + finally: + REQUEST_USER_CONTEXT_VAR.reset(token) return _wrapper diff --git a/packages/core/minos-microservice-networks/minos/networks/testing/__init__.py b/packages/core/minos-microservice-networks/minos/networks/testing/__init__.py new file mode 100644 index 000000000..451f42047 --- /dev/null +++ b/packages/core/minos-microservice-networks/minos/networks/testing/__init__.py @@ -0,0 +1,6 @@ +from .brokers import ( + MockedBrokerPublisherQueueDatabaseOperationFactory, + MockedBrokerQueueDatabaseOperationFactory, + MockedBrokerSubscriberDuplicateValidatorDatabaseOperationFactory, + MockedBrokerSubscriberQueueDatabaseOperationFactory, +) diff --git a/packages/core/minos-microservice-networks/minos/networks/testing/brokers/__init__.py b/packages/core/minos-microservice-networks/minos/networks/testing/brokers/__init__.py new file mode 100644 index 000000000..8d6486131 --- /dev/null +++ b/packages/core/minos-microservice-networks/minos/networks/testing/brokers/__init__.py @@ -0,0 +1,10 @@ +from .collections import ( + MockedBrokerQueueDatabaseOperationFactory, +) +from .publishers import ( + MockedBrokerPublisherQueueDatabaseOperationFactory, +) +from .subscribers import ( + MockedBrokerSubscriberDuplicateValidatorDatabaseOperationFactory, + MockedBrokerSubscriberQueueDatabaseOperationFactory, +) diff --git a/packages/core/minos-microservice-networks/minos/networks/testing/brokers/collections/__init__.py b/packages/core/minos-microservice-networks/minos/networks/testing/brokers/collections/__init__.py new file mode 100644 index 000000000..2f2dbc0d3 --- /dev/null +++ b/packages/core/minos-microservice-networks/minos/networks/testing/brokers/collections/__init__.py @@ -0,0 +1,3 @@ +from .queues import ( + MockedBrokerQueueDatabaseOperationFactory, +) diff --git a/packages/core/minos-microservice-networks/minos/networks/testing/brokers/collections/queues.py b/packages/core/minos-microservice-networks/minos/networks/testing/brokers/collections/queues.py new file mode 100644 index 000000000..2d8f47bac --- /dev/null +++ b/packages/core/minos-microservice-networks/minos/networks/testing/brokers/collections/queues.py @@ -0,0 +1,46 @@ +from collections.abc import ( + Iterable, +) + +from minos.common import ( + DatabaseOperation, +) +from minos.common.testing import ( + MockedDatabaseOperation, +) + +from ....brokers import ( + BrokerQueueDatabaseOperationFactory, +) + + +class MockedBrokerQueueDatabaseOperationFactory(BrokerQueueDatabaseOperationFactory): + """For testing purposes.""" + + def build_create(self) -> DatabaseOperation: + """For testing purposes""" + return MockedDatabaseOperation("create_queue_table") + + def build_mark_processed(self, id_: int) -> DatabaseOperation: + """For testing purposes""" + return MockedDatabaseOperation("update_not_processed") + + def build_delete(self, id_: int) -> DatabaseOperation: + """For testing purposes""" + return MockedDatabaseOperation("delete_processed") + + def build_mark_processing(self, ids: Iterable[int]) -> DatabaseOperation: + """For testing purposes""" + return MockedDatabaseOperation("mark_processing") + + def build_count(self, retry: int, *args, **kwargs) -> DatabaseOperation: + """For testing purposes""" + return MockedDatabaseOperation("count_not_processed") + + def build_submit(self, topic: str, data: bytes) -> DatabaseOperation: + """For testing purposes""" + return MockedDatabaseOperation("insert") + + def build_query(self, retry: int, records: int, *args, **kwargs) -> DatabaseOperation: + """For testing purposes""" + return MockedDatabaseOperation("select_not_processed") diff --git a/packages/core/minos-microservice-networks/minos/networks/testing/brokers/publishers/__init__.py b/packages/core/minos-microservice-networks/minos/networks/testing/brokers/publishers/__init__.py new file mode 100644 index 000000000..3100d864b --- /dev/null +++ b/packages/core/minos-microservice-networks/minos/networks/testing/brokers/publishers/__init__.py @@ -0,0 +1,3 @@ +from .queues import ( + MockedBrokerPublisherQueueDatabaseOperationFactory, +) diff --git a/packages/core/minos-microservice-networks/minos/networks/testing/brokers/publishers/queues.py b/packages/core/minos-microservice-networks/minos/networks/testing/brokers/publishers/queues.py new file mode 100644 index 000000000..8afd22f4e --- /dev/null +++ b/packages/core/minos-microservice-networks/minos/networks/testing/brokers/publishers/queues.py @@ -0,0 +1,21 @@ +from minos.common.testing import ( + MockedDatabaseClient, +) +from minos.networks import ( + BrokerPublisherQueueDatabaseOperationFactory, +) + +from ..collections import ( + MockedBrokerQueueDatabaseOperationFactory, +) + + +class MockedBrokerPublisherQueueDatabaseOperationFactory( + BrokerPublisherQueueDatabaseOperationFactory, MockedBrokerQueueDatabaseOperationFactory +): + """For testing purposes""" + + +MockedDatabaseClient.set_factory( + BrokerPublisherQueueDatabaseOperationFactory, MockedBrokerPublisherQueueDatabaseOperationFactory +) diff --git a/packages/core/minos-microservice-networks/minos/networks/testing/brokers/subscribers/__init__.py b/packages/core/minos-microservice-networks/minos/networks/testing/brokers/subscribers/__init__.py new file mode 100644 index 000000000..c4c2368bc --- /dev/null +++ b/packages/core/minos-microservice-networks/minos/networks/testing/brokers/subscribers/__init__.py @@ -0,0 +1,6 @@ +from .queues import ( + MockedBrokerSubscriberQueueDatabaseOperationFactory, +) +from .validators import ( + MockedBrokerSubscriberDuplicateValidatorDatabaseOperationFactory, +) diff --git a/packages/core/minos-microservice-networks/minos/networks/testing/brokers/subscribers/queues.py b/packages/core/minos-microservice-networks/minos/networks/testing/brokers/subscribers/queues.py new file mode 100644 index 000000000..ff480ee5a --- /dev/null +++ b/packages/core/minos-microservice-networks/minos/networks/testing/brokers/subscribers/queues.py @@ -0,0 +1,39 @@ +from collections.abc import ( + Iterable, +) + +from minos.common import ( + DatabaseOperation, +) +from minos.common.testing import ( + MockedDatabaseClient, + MockedDatabaseOperation, +) + +from ....brokers import ( + BrokerSubscriberQueueDatabaseOperationFactory, +) +from ..collections import ( + MockedBrokerQueueDatabaseOperationFactory, +) + + +class MockedBrokerSubscriberQueueDatabaseOperationFactory( + BrokerSubscriberQueueDatabaseOperationFactory, MockedBrokerQueueDatabaseOperationFactory +): + """For testing purposes""" + + def build_count(self, retry: int, topics: Iterable[str] = tuple(), *args, **kwargs) -> DatabaseOperation: + """For testing purposes""" + return MockedDatabaseOperation("count_not_processed") + + def build_query( + self, retry: int, records: int, topics: Iterable[str] = tuple(), *args, **kwargs + ) -> DatabaseOperation: + """For testing purposes""" + return MockedDatabaseOperation("select_not_processed") + + +MockedDatabaseClient.set_factory( + BrokerSubscriberQueueDatabaseOperationFactory, MockedBrokerSubscriberQueueDatabaseOperationFactory +) diff --git a/packages/core/minos-microservice-networks/minos/networks/testing/brokers/subscribers/validators.py b/packages/core/minos-microservice-networks/minos/networks/testing/brokers/subscribers/validators.py new file mode 100644 index 000000000..cf1230143 --- /dev/null +++ b/packages/core/minos-microservice-networks/minos/networks/testing/brokers/subscribers/validators.py @@ -0,0 +1,35 @@ +from uuid import ( + UUID, +) + +from minos.common import ( + DatabaseOperation, +) +from minos.common.testing import ( + MockedDatabaseClient, + MockedDatabaseOperation, +) + +from ....brokers import ( + BrokerSubscriberDuplicateValidatorDatabaseOperationFactory, +) + + +class MockedBrokerSubscriberDuplicateValidatorDatabaseOperationFactory( + BrokerSubscriberDuplicateValidatorDatabaseOperationFactory +): + """For testing purposes""" + + def build_create(self) -> DatabaseOperation: + """For testing purposes""" + return MockedDatabaseOperation("create_table") + + def build_submit(self, topic: str, uuid: UUID) -> DatabaseOperation: + """For testing purposes""" + return MockedDatabaseOperation("insert_row") + + +MockedDatabaseClient.set_factory( + BrokerSubscriberDuplicateValidatorDatabaseOperationFactory, + MockedBrokerSubscriberDuplicateValidatorDatabaseOperationFactory, +) diff --git a/packages/core/minos-microservice-networks/minos/networks/utils.py b/packages/core/minos-microservice-networks/minos/networks/utils.py index d2984217d..e53442643 100644 --- a/packages/core/minos-microservice-networks/minos/networks/utils.py +++ b/packages/core/minos-microservice-networks/minos/networks/utils.py @@ -4,13 +4,10 @@ import re import socket -import warnings from asyncio import ( QueueEmpty, ) -from minos.common import Builder as CommonBuilder - def get_host_ip() -> str: """Get the host ip. @@ -54,11 +51,3 @@ async def consume_queue(queue, max_count: int) -> None: queue.get_nowait() except QueueEmpty: break - - -class Builder(CommonBuilder): - """Builder class.""" - - def __init__(self, *args, **kwargs): - warnings.warn(f"{Builder!r} has been deprecated. Use {CommonBuilder} instead.", DeprecationWarning) - super().__init__(*args, **kwargs) diff --git a/packages/core/minos-microservice-networks/poetry.lock b/packages/core/minos-microservice-networks/poetry.lock index b0100b80f..69e0ccbdd 100644 --- a/packages/core/minos-microservice-networks/poetry.lock +++ b/packages/core/minos-microservice-networks/poetry.lock @@ -19,37 +19,6 @@ develop = ["aiocontextvars (==0.2.2)", "aiohttp-asgi", "aiohttp (<4)", "async-ti raven = ["raven-aiohttp"] uvloop = ["uvloop (>=0.14,<1)"] -[[package]] -name = "aiopg" -version = "1.3.3" -description = "Postgres integration with asyncio." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -async-timeout = ">=3.0,<5.0" -psycopg2-binary = ">=2.8.4" - -[package.extras] -sa = ["sqlalchemy[postgresql_psycopg2binary] (>=1.3,<1.5)"] - -[[package]] -name = "alabaster" -version = "0.7.12" -description = "A configurable sidebar-enabled Sphinx theme" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "async-timeout" -version = "4.0.2" -description = "Timeout context manager for asyncio programs" -category = "main" -optional = false -python-versions = ">=3.6" - [[package]] name = "atomicwrites" version = "1.4.0" @@ -72,20 +41,9 @@ docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] -[[package]] -name = "babel" -version = "2.9.1" -description = "Internationalization utilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -pytz = ">=2015.7" - [[package]] name = "black" -version = "22.1.0" +version = "22.3.0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -96,7 +54,7 @@ click = ">=8.0.0" mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = ">=1.1.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] @@ -113,40 +71,13 @@ category = "main" optional = false python-versions = "*" -[[package]] -name = "certifi" -version = "2021.10.8" -description = "Python package for providing Mozilla's CA Bundle." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "cfgv" -version = "3.3.1" -description = "Validate configuration and produce human readable error messages." -category = "dev" -optional = false -python-versions = ">=3.6.1" - -[[package]] -name = "charset-normalizer" -version = "2.0.12" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "dev" -optional = false -python-versions = ">=3.5.0" - -[package.extras] -unicode_backport = ["unicodedata2"] - [[package]] name = "click" -version = "8.0.4" +version = "8.1.3" description = "Composable command line interface toolkit" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -194,7 +125,7 @@ python-versions = "*" [[package]] name = "dependency-injector" -version = "4.39.0" +version = "4.39.1" description = "Dependency injection framework for Python" category = "main" optional = false @@ -209,25 +140,9 @@ flask = ["flask"] pydantic = ["pydantic"] yaml = ["pyyaml"] -[[package]] -name = "distlib" -version = "0.3.4" -description = "Distribution utilities" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "docutils" -version = "0.17.1" -description = "Docutils -- Python Documentation Utilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - [[package]] name = "fastavro" -version = "1.4.10" +version = "1.4.11" description = "Fast read/write of AVRO files" category = "main" optional = false @@ -239,18 +154,6 @@ lz4 = ["lz4"] snappy = ["python-snappy"] zstandard = ["zstandard"] -[[package]] -name = "filelock" -version = "3.6.0" -description = "A platform independent file lock." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"] -testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-cov", "pytest-timeout (>=1.4.2)"] - [[package]] name = "flake8" version = "4.0.1" @@ -264,49 +167,6 @@ mccabe = ">=0.6.0,<0.7.0" pycodestyle = ">=2.8.0,<2.9.0" pyflakes = ">=2.4.0,<2.5.0" -[[package]] -name = "identify" -version = "2.4.12" -description = "File identification library for Python" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -license = ["ukkonen"] - -[[package]] -name = "idna" -version = "3.3" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "dev" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "imagesize" -version = "1.3.0" -description = "Getting image size from png/jpeg/jpeg2000/gif file" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "importlib-metadata" -version = "4.11.3" -description = "Read metadata from Python packages" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] -perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] - [[package]] name = "iniconfig" version = "1.1.1" @@ -329,48 +189,6 @@ requirements_deprecated_finder = ["pipreqs", "pip-api"] colors = ["colorama (>=0.4.3,<0.5.0)"] plugins = ["setuptools"] -[[package]] -name = "jinja2" -version = "3.1.1" -description = "A very fast and expressive template engine." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - -[[package]] -name = "lmdb" -version = "1.3.0" -description = "Universal Python binding for the LMDB 'Lightning' Database" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "m2r2" -version = "0.3.2" -description = "Markdown and reStructuredText in a single file." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -docutils = "*" -mistune = "0.8.4" - -[[package]] -name = "markupsafe" -version = "2.1.1" -description = "Safely add untrusted strings to HTML/XML markup." -category = "dev" -optional = false -python-versions = ">=3.7" - [[package]] name = "mccabe" version = "0.6.1" @@ -381,7 +199,7 @@ python-versions = "*" [[package]] name = "minos-microservice-common" -version = "0.6.0" +version = "0.7.0" description = "The common core of the Minos Framework" category = "main" optional = false @@ -389,12 +207,10 @@ python-versions = "^3.9" develop = true [package.dependencies] -aiomisc = ">=14.0.3,<16.0.0" -aiopg = "^1.2.1" +aiomisc = ">=14.0.3,<15.8.0" cached-property = "^1.5.2" dependency-injector = "^4.32.2" fastavro = "^1.4.0" -lmdb = "^1.2.1" orjson = "^3.5.2" PyYAML = ">=5.4.1,<7.0.0" uvloop = "^0.16.0" @@ -403,14 +219,6 @@ uvloop = "^0.16.0" type = "directory" url = "../minos-microservice-common" -[[package]] -name = "mistune" -version = "0.8.4" -description = "The fastest markdown parser in pure Python" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "mypy-extensions" version = "0.4.3" @@ -419,17 +227,9 @@ category = "dev" optional = false python-versions = "*" -[[package]] -name = "nodeenv" -version = "1.6.0" -description = "Node.js virtual environment builder" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "orjson" -version = "3.6.7" +version = "3.6.8" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" category = "main" optional = false @@ -454,25 +254,17 @@ category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -[[package]] -name = "pbr" -version = "5.8.1" -description = "Python Build Reasonableness" -category = "dev" -optional = false -python-versions = ">=2.6" - [[package]] name = "platformdirs" -version = "2.5.1" +version = "2.5.2" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" [package.extras] -docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] +test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] [[package]] name = "pluggy" @@ -486,30 +278,6 @@ python-versions = ">=3.6" dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] -[[package]] -name = "pre-commit" -version = "2.17.0" -description = "A framework for managing and maintaining multi-language pre-commit hooks." -category = "dev" -optional = false -python-versions = ">=3.6.1" - -[package.dependencies] -cfgv = ">=2.0.0" -identify = ">=1.0.0" -nodeenv = ">=0.11.1" -pyyaml = ">=5.1" -toml = "*" -virtualenv = ">=20.0.8" - -[[package]] -name = "psycopg2-binary" -version = "2.9.3" -description = "psycopg2 - Python-PostgreSQL Database Adapter" -category = "main" -optional = false -python-versions = ">=3.6" - [[package]] name = "py" version = "1.11.0" @@ -534,28 +302,20 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -[[package]] -name = "pygments" -version = "2.11.2" -description = "Pygments is a syntax highlighting package written in Python." -category = "dev" -optional = false -python-versions = ">=3.5" - [[package]] name = "pyparsing" -version = "3.0.7" -description = "Python parsing module" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.6.8" [package.extras] -diagrams = ["jinja2", "railroad-diagrams"] +diagrams = ["railroad-diagrams", "jinja2"] [[package]] name = "pytest" -version = "7.1.1" +version = "7.1.2" description = "pytest: simple powerful testing with Python" category = "dev" optional = false @@ -574,14 +334,6 @@ tomli = ">=1.0.0" [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] -[[package]] -name = "pytz" -version = "2022.1" -description = "World timezone definitions, modern and historical" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "pyyaml" version = "6.0" @@ -590,24 +342,6 @@ category = "main" optional = false python-versions = ">=3.6" -[[package]] -name = "requests" -version = "2.27.1" -description = "Python HTTP for Humans." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} -urllib3 = ">=1.21.1,<1.27" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] - [[package]] name = "six" version = "1.16.0" @@ -616,167 +350,6 @@ category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -[[package]] -name = "snowballstemmer" -version = "2.2.0" -description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "sphinx" -version = "4.5.0" -description = "Python documentation generator" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -alabaster = ">=0.7,<0.8" -babel = ">=1.3" -colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.14,<0.18" -imagesize = "*" -importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} -Jinja2 = ">=2.3" -packaging = "*" -Pygments = ">=2.0" -requests = ">=2.5.0" -snowballstemmer = ">=1.1" -sphinxcontrib-applehelp = "*" -sphinxcontrib-devhelp = "*" -sphinxcontrib-htmlhelp = ">=2.0.0" -sphinxcontrib-jsmath = "*" -sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = ">=1.1.5" - -[package.extras] -docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.931)", "docutils-stubs", "types-typed-ast", "types-requests"] -test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] - -[[package]] -name = "sphinx-autodoc-typehints" -version = "1.17.0" -description = "Type hints (PEP 484) support for the Sphinx autodoc extension" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -Sphinx = ">=4" - -[package.extras] -testing = ["covdefaults (>=2)", "coverage (>=6)", "diff-cover (>=6.4)", "nptyping (>=1)", "pytest (>=6)", "pytest-cov (>=3)", "sphobjinv (>=2)", "typing-extensions (>=3.5)"] -type_comments = ["typed-ast (>=1.4.0)"] - -[[package]] -name = "sphinx-rtd-theme" -version = "1.0.0" -description = "Read the Docs theme for Sphinx" -category = "dev" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" - -[package.dependencies] -docutils = "<0.18" -sphinx = ">=1.6" - -[package.extras] -dev = ["transifex-client", "sphinxcontrib-httpdomain", "bump2version"] - -[[package]] -name = "sphinxcontrib-apidoc" -version = "0.3.0" -description = "A Sphinx extension for running 'sphinx-apidoc' on each build" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -pbr = "*" -Sphinx = ">=1.6.0" - -[[package]] -name = "sphinxcontrib-applehelp" -version = "1.0.2" -description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-devhelp" -version = "1.0.2" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-htmlhelp" -version = "2.0.0" -description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest", "html5lib"] - -[[package]] -name = "sphinxcontrib-jsmath" -version = "1.0.1" -description = "A sphinx extension which renders display math in HTML via JavaScript" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -test = ["pytest", "flake8", "mypy"] - -[[package]] -name = "sphinxcontrib-qthelp" -version = "1.0.3" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-serializinghtml" -version = "1.1.5" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - [[package]] name = "tomli" version = "2.0.1" @@ -787,24 +360,11 @@ python-versions = ">=3.7" [[package]] name = "typing-extensions" -version = "4.1.1" -description = "Backported and Experimental Type Hints for Python 3.6+" +version = "4.2.0" +description = "Backported and Experimental Type Hints for Python 3.7+" category = "dev" optional = false -python-versions = ">=3.6" - -[[package]] -name = "urllib3" -version = "1.26.9" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" - -[package.extras] -brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +python-versions = ">=3.7" [[package]] name = "uvloop" @@ -819,58 +379,16 @@ dev = ["Cython (>=0.29.24,<0.30.0)", "pytest (>=3.6.0)", "Sphinx (>=4.1.2,<4.2.0 docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)"] test = ["aiohttp", "flake8 (>=3.9.2,<3.10.0)", "psutil", "pycodestyle (>=2.7.0,<2.8.0)", "pyOpenSSL (>=19.0.0,<19.1.0)", "mypy (>=0.800)"] -[[package]] -name = "virtualenv" -version = "20.14.0" -description = "Virtual Python Environment builder" -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - -[package.dependencies] -distlib = ">=0.3.1,<1" -filelock = ">=3.2,<4" -platformdirs = ">=2,<3" -six = ">=1.9.0,<2" - -[package.extras] -docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=21.3)"] -testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)"] - -[[package]] -name = "zipp" -version = "3.7.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] - [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "ea88425476960ab086eadc6616f36d6cbdc2e2e92e95c4a1cd2f5a4ae7907738" +content-hash = "da7c8e23212bedf0d8263513f83692142646803a85382d956367a823572781eb" [metadata.files] aiomisc = [ {file = "aiomisc-15.7.3-py3-none-any.whl", hash = "sha256:0403e83268e98d0f2a125a70d13303fe1a2358e36db3daf02df032c7fa4f1525"}, {file = "aiomisc-15.7.3.tar.gz", hash = "sha256:ba250a34bd4609ced36111cb50580f57c3d52f3955f953a53ecb2986988baedc"}, ] -aiopg = [ - {file = "aiopg-1.3.3-py3-none-any.whl", hash = "sha256:2842dd8741460eeef940032dcb577bfba4d4115205dd82a73ce13b3271f5bf0a"}, - {file = "aiopg-1.3.3.tar.gz", hash = "sha256:547c6ba4ea0d73c2a11a2f44387d7133cc01d3c6f3b8ed976c0ac1eff4f595d7"}, -] -alabaster = [ - {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, - {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, -] -async-timeout = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, -] atomicwrites = [ {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, @@ -879,54 +397,38 @@ attrs = [ {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] -babel = [ - {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"}, - {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, -] black = [ - {file = "black-22.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1297c63b9e1b96a3d0da2d85d11cd9bf8664251fd69ddac068b98dc4f34f73b6"}, - {file = "black-22.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2ff96450d3ad9ea499fc4c60e425a1439c2120cbbc1ab959ff20f7c76ec7e866"}, - {file = "black-22.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e21e1f1efa65a50e3960edd068b6ae6d64ad6235bd8bfea116a03b21836af71"}, - {file = "black-22.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f69158a7d120fd641d1fa9a921d898e20d52e44a74a6fbbcc570a62a6bc8ab"}, - {file = "black-22.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:228b5ae2c8e3d6227e4bde5920d2fc66cc3400fde7bcc74f480cb07ef0b570d5"}, - {file = "black-22.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b1a5ed73ab4c482208d20434f700d514f66ffe2840f63a6252ecc43a9bc77e8a"}, - {file = "black-22.1.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35944b7100af4a985abfcaa860b06af15590deb1f392f06c8683b4381e8eeaf0"}, - {file = "black-22.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7835fee5238fc0a0baf6c9268fb816b5f5cd9b8793423a75e8cd663c48d073ba"}, - {file = "black-22.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dae63f2dbf82882fa3b2a3c49c32bffe144970a573cd68d247af6560fc493ae1"}, - {file = "black-22.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fa1db02410b1924b6749c245ab38d30621564e658297484952f3d8a39fce7e8"}, - {file = "black-22.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c8226f50b8c34a14608b848dc23a46e5d08397d009446353dad45e04af0c8e28"}, - {file = "black-22.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2d6f331c02f0f40aa51a22e479c8209d37fcd520c77721c034517d44eecf5912"}, - {file = "black-22.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:742ce9af3086e5bd07e58c8feb09dbb2b047b7f566eb5f5bc63fd455814979f3"}, - {file = "black-22.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fdb8754b453fb15fad3f72cd9cad3e16776f0964d67cf30ebcbf10327a3777a3"}, - {file = "black-22.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5660feab44c2e3cb24b2419b998846cbb01c23c7fe645fee45087efa3da2d61"}, - {file = "black-22.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:6f2f01381f91c1efb1451998bd65a129b3ed6f64f79663a55fe0e9b74a5f81fd"}, - {file = "black-22.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:efbadd9b52c060a8fc3b9658744091cb33c31f830b3f074422ed27bad2b18e8f"}, - {file = "black-22.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8871fcb4b447206904932b54b567923e5be802b9b19b744fdff092bd2f3118d0"}, - {file = "black-22.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccad888050f5393f0d6029deea2a33e5ae371fd182a697313bdbd835d3edaf9c"}, - {file = "black-22.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07e5c049442d7ca1a2fc273c79d1aecbbf1bc858f62e8184abe1ad175c4f7cc2"}, - {file = "black-22.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:373922fc66676133ddc3e754e4509196a8c392fec3f5ca4486673e685a421321"}, - {file = "black-22.1.0-py3-none-any.whl", hash = "sha256:3524739d76b6b3ed1132422bf9d82123cd1705086723bc3e235ca39fd21c667d"}, - {file = "black-22.1.0.tar.gz", hash = "sha256:a7c0192d35635f6fc1174be575cb7915e92e5dd629ee79fdaf0dcfa41a80afb5"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"}, + {file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"}, + {file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"}, + {file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"}, + {file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"}, + {file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"}, + {file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"}, + {file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"}, + {file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"}, + {file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"}, + {file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"}, + {file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"}, + {file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"}, + {file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"}, + {file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"}, + {file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"}, + {file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"}, + {file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"}, ] cached-property = [ {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, ] -certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, -] -cfgv = [ - {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, - {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, - {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, -] click = [ - {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"}, - {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, ] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, @@ -983,93 +485,65 @@ crontab = [ {file = "crontab-0.23.0.tar.gz", hash = "sha256:ca79dede9c2f572bb32f38703e8fddcf3427e86edc838f2ffe7ae4b9ee2b0733"}, ] dependency-injector = [ - {file = "dependency-injector-4.39.0.tar.gz", hash = "sha256:35d6c03683f512bcc8b0c950890ac40ce19bdacc7de4d59249dd61ed818f0930"}, - {file = "dependency_injector-4.39.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f046a5dbe7e5764fae9a69423f66241a8fdb62acea5c32b0c41a7da94b7f6da3"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfdd78f7d97c1f6ba4a3926a2e404507a4f77ecbd610d4a1b37dedb5c0b57ad1"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:512c23da829bb8ac2ae13f33aa017acf58ae9408e7796a146e1644e8b8471b5b"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7dc81df7f566bfdacdee448bc71085acd163b935860d2b2504b4f32840b3b692"}, - {file = "dependency_injector-4.39.0-cp310-cp310-win32.whl", hash = "sha256:9ffc5393700f45d740abecc50cdc1251eae69e50516ec9d0a48fba0e875ed083"}, - {file = "dependency_injector-4.39.0-cp310-cp310-win_amd64.whl", hash = "sha256:9118f36a3df1e9819074ccb35734d663812c8f6ef81d45c8e4ec81ce5dccac9c"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:1ff723aaf096fabb05cf8b08ba99888538a2a77e03a5082b70cd54eb9df619f3"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bb913900ceb1766f55dc628052d8e191a9c2b1737a0d775fbc230af90ab2c1e"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:329e801eb46b9933432481d3142e563e28a90d77952edac43126264c36ed2278"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1c1a67c699ae2c0234f07d121736fa44e8fe2d56c14b2fd210c3e04a151620bb"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-win32.whl", hash = "sha256:e1347defd46fe9067f857b1174bdb1b19458232ac1a485507df2ddff084cf31c"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-win_amd64.whl", hash = "sha256:9581c4c90f1aaf85ffb9b06bac7ac592df7076522881145321a9dd0702fee828"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8da8ff05fa17e852aa5831a600177e5bb72bf53b8a184f6922ae715387a460ba"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58a56999cebd8b2ba9c19e514e383924865e5f7d6273f8e5b7d85468d9042059"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4914332d6145fb7cfc5f2236a823a3859b92a7e75566ffca0987dcc0f7f7be53"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00aea40ee2d400a8091947ad97cda34b230628aeeac1774f8fa9a3500b5704b2"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-win32.whl", hash = "sha256:b94a64bc73d86d04b33c698fae4b9dad2536a8534ac6922c8226764da5d62d17"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4f59cc0b0d3beb82875d94b7e725b5097a7a454e8e323625ba6ac3095a29300e"}, - {file = "dependency_injector-4.39.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a8d840348f01d997e32394dba36e09c1ecd312b286befb6b3ca27526002ae94"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92097ffabca89d1539e200f91bfa13ff8ca502c9057391c3b78787d50fe502ed"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4a889e116fe76742ef6ff27d5e93ee9e364cbe7bbc6678df8c5dd54597a6fc"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a31e00961fdc1b3808a9e2adeb1107ec4bba0ad3a90b116af9d116a667e4626a"}, - {file = "dependency_injector-4.39.0-cp38-cp38-win32.whl", hash = "sha256:717720a220eee611ea96c0089246ec2103b168303ca2cd2c8a7cd3856da6f689"}, - {file = "dependency_injector-4.39.0-cp38-cp38-win_amd64.whl", hash = "sha256:05c0bbef90182a0d35d4d3f9ab879109070d204394578b12f0eff9eca51987ef"}, - {file = "dependency_injector-4.39.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f10bf8d146edffbee2ba5c5776395625c98048a31997afd481ce27792afee2af"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30c093b155c01e50723e8ecd2a14230daa4417356c8fb5a27369ae5be24b21d9"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dda8a85c8221e6ee433caa01c1bc4fed610381924780e04470572682569cdb8f"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ff8df47a901218a3257650f3f3a6b402dd58cb4f57b4a34d6e8092112f6e8480"}, - {file = "dependency_injector-4.39.0-cp39-cp39-win32.whl", hash = "sha256:e078c84c19ae73883a57e9b35edd843925b2b44833cd098708139a98abee5a96"}, - {file = "dependency_injector-4.39.0-cp39-cp39-win_amd64.whl", hash = "sha256:c02b6796320d6b9363d566045eeec243fa4a412ad68dcc6b2391307e93d0d401"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:865bf5ceba3e32f00e36bfcbefb1267b10df961fb2aab809f5e205968e1cd59b"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ce8645ffd8cc15a7bbd20c02e6439a61c1566a1db22766893bf79981fb89a4e"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dbdab8b024055865926a78ecbc3a6280345f4615e5c505511bbd7c6c322b1796"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:af996d66350704261382dc4e10f324eba5d23e35c04a9e75c7cb58fbea7f1f1d"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d390c6e97fec13fba832b7e39e07c43760ed3d46af4887005f679c0ab6eb9b2e"}, -] -distlib = [ - {file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"}, - {file = "distlib-0.3.4.zip", hash = "sha256:e4b58818180336dc9c529bfb9a0b58728ffc09ad92027a3f30b7cd91e3458579"}, -] -docutils = [ - {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, - {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, + {file = "dependency-injector-4.39.1.tar.gz", hash = "sha256:9ab76dc5e19b2692aaca49e00f9b41a087138d139b0ec985f92ff0498f038772"}, + {file = "dependency_injector-4.39.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c788a3d5482e63b5fd55e14fc258f1ff0b51b411927ab132ef0f689cb5d1183f"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0832e0457a360725cd1d1037b77b85478aeeaacc60e85ecceeb8020409e7b62"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d51998fff9704fd01d11c3c48f4e88d8506cb6afa1ee41409a881a5a51dae3fc"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea484cd13fc62966bf5582df0816205feee072d18f228aac75f7807b43f223ae"}, + {file = "dependency_injector-4.39.1-cp310-cp310-win32.whl", hash = "sha256:17389e53ec29ca13570319cf2065dcc4c2f6d36db5dd792bb1e8f2c39a9f146b"}, + {file = "dependency_injector-4.39.1-cp310-cp310-win_amd64.whl", hash = "sha256:55b0988489267c5a580f419133770ffe293057f2064da1c9ad6a2cc69666739b"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b297c3e79d3633cc56366386ae1f7dbce1587673cca2f559c368c1e936a1fa94"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2728827c5abb2420c5811e218262ae1b77a48e76cc9eebc6b4f55fee48a1a18d"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:029e42b064ab8cb5b2559be040ff682c7aa81592f1654a82355475956df17803"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:305e3db3f4bf40f64caaa1303e03005174e78d2339d2ae517b34c011ec2300f9"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-win32.whl", hash = "sha256:a661dd23a5e4e2f6bf4a729de7fadbe148c9a4a298dbcadfc5a94584b6930970"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-win_amd64.whl", hash = "sha256:340d6e7af5c4729d20c837d6d1e8a2626c24a05259dff746406cc823e26ba1e7"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a1553dac1c95f0de1f910b0025ee4570ea078a07d576bcdc2168990e719cea50"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c7baaa64d93359ee08c15d68579cc803e11d9becaf961f5a66b94ff627248e1"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7a27bf1951a066cf347b886cc7ab0f37dcbd1ad59bffcfe721c8c12a189a150d"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da6e2d685f7d0c65257f08133b68d9bf74ec319b90a0f21b4f629d168ce5f68f"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-win32.whl", hash = "sha256:a8ddd03ca86e67e9d3cc038793d34fbfccab12e6145df813e72bf14f9371f2ea"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-win_amd64.whl", hash = "sha256:e01a319ea05cd86b520201386dcb53a81a5400cb82fcc2f006bd7e92c0c51a0a"}, + {file = "dependency_injector-4.39.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4704804bde25b694aa65201927937a9d82d8bc055cb3dadc68eb05988bd34fa9"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0935d50b263169e7b0826a2fb6be80d6a4f2a7c59e6dd9876f86da3243bea9eb"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3c34aa5abb1826b6189f47daf6e469d4293c1d01693233da2c1b923816270cc5"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:db64904c9b9a88756cfece3e3ed078a2b57127642711dd08af342dba8abf9667"}, + {file = "dependency_injector-4.39.1-cp38-cp38-win32.whl", hash = "sha256:66ebe728194adc8720dbc4d662edbbfa55659ff23c9c493fb2dae0bfd4df5734"}, + {file = "dependency_injector-4.39.1-cp38-cp38-win_amd64.whl", hash = "sha256:4349974620f630d6726808e1291ec99713b64d449b84eb01581ee807a5a5c224"}, + {file = "dependency_injector-4.39.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d87cad0899b05cd08931bfb68ddf7be77711a67b0649c37f2045d7808977b082"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8efd965e5cfdd9f339ec895e73c119569851adedc175088d34a670f5206fea63"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:27f69485ca6b85c31d162ee86cf6ef71bb71dce9cd2b5d0745425dfc551eefa1"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a25b63de59dff04ec78f5161f00c0222a04a23def5d1f0eda14e389a32baf428"}, + {file = "dependency_injector-4.39.1-cp39-cp39-win32.whl", hash = "sha256:a14274f50d125b4579314c355e22af07def1a96641ca94bd75edcf1400b89477"}, + {file = "dependency_injector-4.39.1-cp39-cp39-win_amd64.whl", hash = "sha256:9950039d00625f9252cd26378a4406342b256886bb61e4db8b65e9f01270f53e"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6d7f39cd54678741e132e13da3a1367ac18058cbda61fe39d61c8583aa6fd757"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2368c7ba3c9ffaf816ea0f2d14c78d481491b805f62ac8496a78a51397d4689"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:84e32407bb16c58aa0d4b5ed8485537bc66ccc14cfffae7022f1204e35ec939a"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f2d80a42c546e1f934d427b071630d86653cd4a60c74b570c4ffb03025c1f1f9"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ca126bbed370b8c002c859ebeb76f6d83eba2d7fb5d66f37f47cfc19661d2889"}, ] fastavro = [ - {file = "fastavro-1.4.10-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:f225c81e869b3cefef6f2b478cd452693181ed7e645be3cea4d82024354ecaa0"}, - {file = "fastavro-1.4.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7669302c9124b7cd6c1bdff80c77116b2290c984814077fb7d01d7389586054"}, - {file = "fastavro-1.4.10-cp310-cp310-win_amd64.whl", hash = "sha256:995525bdfbdfef205ea148b5bc6a9fe5ccf921931123c39d9aad75a2b661681e"}, - {file = "fastavro-1.4.10-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:64244c53f1e4853184c2f7383d0332e1dcb34c38c05e6613530ade0378e8acfc"}, - {file = "fastavro-1.4.10-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c60965da6dc7a91e00ccd84d84797fad746555f44e8a816c4cc460fb231c44fe"}, - {file = "fastavro-1.4.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10eb25378f37dc00c10e83c4c0442c1a6d1b871f74a6dfdfc12b6447962bbdd0"}, - {file = "fastavro-1.4.10-cp37-cp37m-win_amd64.whl", hash = "sha256:d5719adf6045fc743de5fa738d561a81e58dc782c94f1b16cb21b5dd6253e7fd"}, - {file = "fastavro-1.4.10-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:24c4a1a8cc92e135ecfcd9cbd1f6cfa088cbc74d78c18e02a609cb11fa33778d"}, - {file = "fastavro-1.4.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0934490b0c3bcfd6bcbacbcb5144c6b5e4298cda209fbb17c856adf5405127dd"}, - {file = "fastavro-1.4.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a23763d73412c077aee401a0368c64cbc23859e26711dbae78a3cf0227f65165"}, - {file = "fastavro-1.4.10-cp38-cp38-win_amd64.whl", hash = "sha256:09f1dfdd8192ae09e0f477d1f024d8054fccdb099ad495d2a796bcee3cadebd1"}, - {file = "fastavro-1.4.10-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:0c6695753fa3035bbd0fa5cb21bf1b5dad39483c669b32ca0bb55fb07c1ccc87"}, - {file = "fastavro-1.4.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35f960dbba04647d8d6d5616f879622d2a1e8a84eb2d2e02a883a22e0803463a"}, - {file = "fastavro-1.4.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9660878ca01e3dbbee12385c5902a2b6b12ecbb5af4733d1026175a14b1ef67f"}, - {file = "fastavro-1.4.10-cp39-cp39-win_amd64.whl", hash = "sha256:64cbd386e408b3bcb2de53b1f847163073eb0d0d0338db65f76051c6ba9a9bc1"}, - {file = "fastavro-1.4.10.tar.gz", hash = "sha256:a24f9dd803c44bfb599476b000f9bd0088f7ac2401e6c20818f38d8af12785a0"}, -] -filelock = [ - {file = "filelock-3.6.0-py3-none-any.whl", hash = "sha256:f8314284bfffbdcfa0ff3d7992b023d4c628ced6feb957351d4c48d059f56bc0"}, - {file = "filelock-3.6.0.tar.gz", hash = "sha256:9cd540a9352e432c7246a48fe4e8712b10acb1df2ad1f30e8c070b82ae1fed85"}, + {file = "fastavro-1.4.11-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:44f01008f95d685edacc4b10366c755d25612df00924349f7d34a29f08522ce3"}, + {file = "fastavro-1.4.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18f5e736d12e67348f253da8a332d7c3b483ca04f2b6e772befa79d1a46bac9d"}, + {file = "fastavro-1.4.11-cp310-cp310-win_amd64.whl", hash = "sha256:8dca11bc3191cd7de0a3c4b76a70dac493356a219e96ebcde0def1f06faddef7"}, + {file = "fastavro-1.4.11-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:7a2a0bf03686f9d860e8f8476be000f5b3e6cc9af6853dbabab2ef9cfa5dc3a0"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c17e3decfac260e1be4d02d1903d2483eec2f3ce7f92c9b808a0f6a81572c4b"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19ba25c6529f50722a7618cc4ca24c7d265def57fd9f94e4e554e1df8cce38d2"}, + {file = "fastavro-1.4.11-cp37-cp37m-win_amd64.whl", hash = "sha256:ceaba04da9419f40899a670eb62eb373a127b511bb8e3ae4f6f1f23ec49bd0e4"}, + {file = "fastavro-1.4.11-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:732eab3a1ae5d2c3f4b52e747c55bcc41c4df0eb7e8a395038080741a3c0a934"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c03d3c802b71f44e7b3442abae961bba996258244bd222b242ad1e5cb7754e57"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cb7475a9b25b9f8aebe7eb756dafedd0369434571062f3883d894281befd7c"}, + {file = "fastavro-1.4.11-cp38-cp38-win_amd64.whl", hash = "sha256:ce0776f54591aef90bcd02bd919964abe4c2ad2a10a4336c3a1b66cef289b41c"}, + {file = "fastavro-1.4.11-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:621e72cc365c9539d7590e7b43e48a62e6bfb4c2de7c16837fed54d113d7312c"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:842b25782f911ee8c626f9d9fedc2ef01aeac272536fe90ee6d45b2ae7cdb024"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8491bfcba25c9d661289f884688e5a4f56f2ee389a240d0ad02692495a9a087"}, + {file = "fastavro-1.4.11-cp39-cp39-win_amd64.whl", hash = "sha256:c94130a8c8d80073eb0276844915aa5e928ae322024e76dc57943542ccda211c"}, + {file = "fastavro-1.4.11.tar.gz", hash = "sha256:7c64332ad52de0134be9a933ca986514c3ff85c63d54bc5398c31f0498ac1820"}, ] flake8 = [ {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, ] -identify = [ - {file = "identify-2.4.12-py2.py3-none-any.whl", hash = "sha256:5f06b14366bd1facb88b00540a1de05b69b310cbc2654db3c7e07fa3a4339323"}, - {file = "identify-2.4.12.tar.gz", hash = "sha256:3f3244a559290e7d3deb9e9adc7b33594c1bc85a9dd82e0f1be519bf12a1ec17"}, -] -idna = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, -] -imagesize = [ - {file = "imagesize-1.3.0-py2.py3-none-any.whl", hash = "sha256:1db2f82529e53c3e929e8926a1fa9235aa82d0bd0c580359c67ec31b2fddaa8c"}, - {file = "imagesize-1.3.0.tar.gz", hash = "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d"}, -] -importlib-metadata = [ - {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, - {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, -] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, @@ -1078,135 +552,48 @@ isort = [ {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, ] -jinja2 = [ - {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"}, - {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"}, -] -lmdb = [ - {file = "lmdb-1.3.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:63cb73fe7ce9eb93d992d632c85a0476b4332670d9e6a2802b5062f603b7809f"}, - {file = "lmdb-1.3.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:abbc439cd9fe60ffd6197009087ea885ac150017dc85384093b1d376f83f0ec4"}, - {file = "lmdb-1.3.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6260a526e4ad85b1f374a5ba9475bf369fb07e7728ea6ec57226b02c40d1976b"}, - {file = "lmdb-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e568ae0887ae196340947d9800136e90feaed6b86a261ef01f01b2ba65fc8106"}, - {file = "lmdb-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6a816954d212f40fd15007cd81ab7a6bebb77436d949a6a9ae04af57fc127f3"}, - {file = "lmdb-1.3.0-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:fa6439356e591d3249ab0e1778a6f8d8408e993f66dc911914c78208f5310309"}, - {file = "lmdb-1.3.0-cp35-cp35m-win_amd64.whl", hash = "sha256:c6adbd6f7f9048e97f31a069e652eb51020a81e80a0ce92dbb9810d21da2409a"}, - {file = "lmdb-1.3.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:eefb392f6b5cd43aada49258c5a79be11cb2c8cd3fc3e2d9319a1e0b9f906458"}, - {file = "lmdb-1.3.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a14aca2651c3af6f0d0a6b9168200eea0c8f2d27c40b01a442f33329a6e8dff"}, - {file = "lmdb-1.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cfa4aa9c67f8aee89b23005e98d1f3f32490b6b905fd1cb604b207cbd5755ab"}, - {file = "lmdb-1.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7da05d70fcc6561ac6b09e9fb1bf64b7ca294652c64c8a2889273970cee796b9"}, - {file = "lmdb-1.3.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:008243762decf8f6c90430a9bced56290ebbcdb5e877d90e42343bb97033e494"}, - {file = "lmdb-1.3.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:17215a42a4b9814c383deabecb160581e4fb75d00198eef0e3cea54f230ffbea"}, - {file = "lmdb-1.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65334eafa5d430b18d81ebd5362559a41483c362e1931f6e1b15bab2ecb7d75d"}, - {file = "lmdb-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:18c69fabdaf04efaf246587739cc1062b3e57c6ef0743f5c418df89e5e7e7b9b"}, - {file = "lmdb-1.3.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:41318717ab5d15ad2d6d263d34fbf614a045210f64b25e59ce734bb2105e421f"}, - {file = "lmdb-1.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:df2724bad7820114a205472994091097d0fa65a3e5fff5a8e688d123fb8c6326"}, - {file = "lmdb-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ddd590e1c7fcb395931aa3782fb89b9db4550ab2d81d006ecd239e0d462bc41"}, - {file = "lmdb-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:4172fba19417d7b29409beca7d73c067b54e5d8ab1fb9b51d7b4c1445d20a167"}, - {file = "lmdb-1.3.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2df38115dd9428a54d59ae7c712a4c7cce0d6b1d66056de4b1a8c38718066106"}, - {file = "lmdb-1.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d9103aa4908f0bca43c5911ca067d4e3d01f682dff0c0381a1239bd2bd757984"}, - {file = "lmdb-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:394df860c3f93cfd92b6f4caba785f38208cc9614c18b3803f83a2cc1695042f"}, - {file = "lmdb-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:62ab28e3593bdc318ea2f2fa1574e5fca3b6d1f264686d773ba54a637d4f563b"}, - {file = "lmdb-1.3.0-pp27-pypy_73-macosx_10_7_x86_64.whl", hash = "sha256:e6a704b3baced9182836c7f77b769f23856f3a8f62d0282b1bc1feaf81a86712"}, - {file = "lmdb-1.3.0-pp27-pypy_73-win_amd64.whl", hash = "sha256:08f4b5129f4683802569b02581142e415c8dcc0ff07605983ec1b07804cecbad"}, - {file = "lmdb-1.3.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:f291e3f561f58dddf63a92a5a6a4b8af3a0920b6705d35e2f80e52e86ee238a2"}, - {file = "lmdb-1.3.0.tar.gz", hash = "sha256:60a11efc21aaf009d06518996360eed346f6000bfc9de05114374230879f992e"}, -] -m2r2 = [ - {file = "m2r2-0.3.2-py3-none-any.whl", hash = "sha256:d3684086b61b4bebe2307f15189495360f05a123c9bda2a66462649b7ca236aa"}, - {file = "m2r2-0.3.2.tar.gz", hash = "sha256:ccd95b052dcd1ac7442ecb3111262b2001c10e4119b459c34c93ac7a5c2c7868"}, -] -markupsafe = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, -] mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] minos-microservice-common = [] -mistune = [ - {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, - {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, -] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] -nodeenv = [ - {file = "nodeenv-1.6.0-py2.py3-none-any.whl", hash = "sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"}, - {file = "nodeenv-1.6.0.tar.gz", hash = "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b"}, -] orjson = [ - {file = "orjson-3.6.7-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:93188a9d6eb566419ad48befa202dfe7cd7a161756444b99c4ec77faea9352a4"}, - {file = "orjson-3.6.7-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:82515226ecb77689a029061552b5df1802b75d861780c401e96ca6bc8495f775"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3af57ffab7848aaec6ba6b9e9b41331250b57bf696f9d502bacdc71a0ebab0ba"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:a7297504d1142e7efa236ffc53f056d73934a993a08646dbcee89fc4308a8fcf"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:5a50cde0dbbde255ce751fd1bca39d00ecd878ba0903c0480961b31984f2fab7"}, - {file = "orjson-3.6.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d21f9a2d1c30e58070f93988db4cad154b9009fafbde238b52c1c760e3607fbe"}, - {file = "orjson-3.6.7-cp310-none-win_amd64.whl", hash = "sha256:e152464c4606b49398afd911777decebcf9749cc8810c5b4199039e1afb0991e"}, - {file = "orjson-3.6.7-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:0a65f3c403f38b0117c6dd8e76e85a7bd51fcd92f06c5598dfeddbc44697d3e5"}, - {file = "orjson-3.6.7-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:6c47cfca18e41f7f37b08ff3e7abf5ada2d0f27b5ade934f05be5fc5bb956e9d"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:63185af814c243fad7a72441e5f98120c9ecddf2675befa486d669fb65539e9b"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2da6fde42182b80b40df2e6ab855c55090ebfa3fcc21c182b7ad1762b61d55c"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:48c5831ec388b4e2682d4ff56d6bfa4a2ef76c963f5e75f4ff4785f9cf338a80"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:913fac5d594ccabf5e8fbac15b9b3bb9c576d537d49eeec9f664e7a64dde4c4b"}, - {file = "orjson-3.6.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:58f244775f20476e5851e7546df109f75160a5178d44257d437ba6d7e562bfe8"}, - {file = "orjson-3.6.7-cp37-none-win_amd64.whl", hash = "sha256:2d5f45c6b85e5f14646df2d32ecd7ff20fcccc71c0ea1155f4d3df8c5299bbb7"}, - {file = "orjson-3.6.7-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:612d242493afeeb2068bc72ff2544aa3b1e627578fcf92edee9daebb5893ffea"}, - {file = "orjson-3.6.7-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:539cdc5067db38db27985e257772d073cd2eb9462d0a41bde96da4e4e60bd99b"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6d103b721bbc4f5703f62b3882e638c0b65fcdd48622531c7ffd45047ef8e87c"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb10a20f80e95102dd35dfbc3a22531661b44a09b55236b012a446955846b023"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:bb68d0da349cf8a68971a48ad179434f75256159fe8b0715275d9b49fa23b7a3"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:4a2c7d0a236aaeab7f69c17b7ab4c078874e817da1bfbb9827cb8c73058b3050"}, - {file = "orjson-3.6.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3be045ca3b96119f592904cf34b962969ce97bd7843cbfca084009f6c8d2f268"}, - {file = "orjson-3.6.7-cp38-none-win_amd64.whl", hash = "sha256:bd765c06c359d8a814b90f948538f957fa8a1f55ad1aaffcdc5771996aaea061"}, - {file = "orjson-3.6.7-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:7dd9e1e46c0776eee9e0649e3ae9584ea368d96851bcaeba18e217fa5d755283"}, - {file = "orjson-3.6.7-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:c4b4f20a1e3df7e7c83717aff0ef4ab69e42ce2fb1f5234682f618153c458406"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7107a5673fd0b05adbb58bf71c1578fc84d662d29c096eb6d998982c8635c221"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a08b6940dd9a98ccf09785890112a0f81eadb4f35b51b9a80736d1725437e22c"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:f5d1648e5a9d1070f3628a69a7c6c17634dbb0caf22f2085eca6910f7427bf1f"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:e6201494e8dff2ce7fd21da4e3f6dfca1a3fed38f9dcefc972f552f6596a7621"}, - {file = "orjson-3.6.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:70d0386abe02879ebaead2f9632dd2acb71000b4721fd8c1a2fb8c031a38d4d5"}, - {file = "orjson-3.6.7-cp39-none-win_amd64.whl", hash = "sha256:d9a3288861bfd26f3511fb4081561ca768674612bac59513cb9081bb61fcc87f"}, - {file = "orjson-3.6.7.tar.gz", hash = "sha256:a4bb62b11289b7620eead2f25695212e9ac77fcfba76f050fa8a540fb5c32401"}, + {file = "orjson-3.6.8-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:3a287a650458de2211db03681b71c3e5cb2212b62f17a39df8ad99fc54855d0f"}, + {file = "orjson-3.6.8-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:5204e25c12cea58e524fc82f7c27ed0586f592f777b33075a92ab7b3eb3687c2"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77e8386393add64f959c044e0fb682364fd0e611a6f477aa13f0e6a733bd6a28"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:279f2d2af393fdf8601020744cb206b91b54ad60fb8401e0761819c7bda1f4e4"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:c31c9f389be7906f978ed4192eb58a4b74a37ad60556a0b88ddc47c576697770"}, + {file = "orjson-3.6.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0db5c5a0c5b89f092d52f6e5a3701660a9d6ffa9e2968b3ce17c2bc4f5eb0414"}, + {file = "orjson-3.6.8-cp310-none-win_amd64.whl", hash = "sha256:eb22485847b9a0c4bbedc668df860126ac931edbed1d456cf41a59f3cb961ed8"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:1a5fe569310bc819279bd4d5f2c349910b104ed3207936246dd5d5e0b085e74a"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:ccb356a47ab1067cd3549847e9db1d279a63fe0482d315b3ffd6e7abef35ef77"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab29c069c222248ce302a25855b4e1664f9436e8ae5a131fb0859daf31676d2b"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2b5e4cba9e774ac011071d9d27760f97f4b8cd46003e971d122e712f971345"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:c311ec504414d22834d5b972a209619925b48263856a11a14d90230f9682d49c"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:a3dfec7950b90fb8d143743503ee53fa06b32e6068bdea792fc866284da3d71d"}, + {file = "orjson-3.6.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b890dbbada2cbb26eb29bd43a848426f007f094bb0758df10dfe7a438e1cb4b4"}, + {file = "orjson-3.6.8-cp37-none-win_amd64.whl", hash = "sha256:9143ae2c52771525be9ad11a7a8cc8e7fd75391b107e7e644a9e0050496f6b4f"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:33a82199fd42f6436f833e210ae5129c922a5c355629356ca7a8e82964da7285"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:90159ea8b9a5a2a98fa33dc7b421cfac4d2ae91ba5e1058f5909e7f059f6b467"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:656fbe15d9ef0733e740d9def78f4fdb4153102f4836ee774a05123499005931"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7be3be6153843e0f01351b1313a5ad4723595427680dac2dfff22a37e652ce02"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:dd24f66b6697ee7424f7da575ec6cbffc8ede441114d53470949cda4d97c6e56"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:b07c780f7345ecf5901356dc21dee0669defc489c38ce7b9ab0f5e008cc0385c"}, + {file = "orjson-3.6.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ea32015a5d8a4ce00d348a0de5dc7040e0ad58f970a8fcbb5713a1eac129e493"}, + {file = "orjson-3.6.8-cp38-none-win_amd64.whl", hash = "sha256:c5a3e382194c838988ec128a26b08aa92044e5e055491cc4056142af0c1c54d7"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:83a8424e857ae1bf53530e88b4eb2f16ca2b489073b924e655f1575cacd7f52a"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:81e1a6a2d67f15007dadacbf9ba5d3d79237e5e33786c028557fe5a2b72f1c9a"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:137b539881c77866eba86ff6a11df910daf2eb9ab8f1acae62f879e83d7c38af"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cbd358f3b3ad539a27e36900e8e7d172d0e1b72ad9dd7d69544dcbc0f067ee7"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:6ab94701542d40b90903ecfc339333f458884979a01cb9268bc662cc67a5f6d8"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:32b6f26593a9eb606b40775826beb0dac152e3d224ea393688fced036045a821"}, + {file = "orjson-3.6.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:afd9e329ebd3418cac3cd747769b1d52daa25fa672bbf414ab59f0e0881b32b9"}, + {file = "orjson-3.6.8-cp39-none-win_amd64.whl", hash = "sha256:0c89b419914d3d1f65a1b0883f377abe42a6e44f6624ba1c63e8846cbfc2fa60"}, + {file = "orjson-3.6.8.tar.gz", hash = "sha256:e19d23741c5de13689bb316abfccea15a19c264e3ec8eb332a5319a583595ace"}, ] packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, @@ -1216,80 +603,14 @@ pathspec = [ {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, ] -pbr = [ - {file = "pbr-5.8.1-py2.py3-none-any.whl", hash = "sha256:27108648368782d07bbf1cb468ad2e2eeef29086affd14087a6d04b7de8af4ec"}, - {file = "pbr-5.8.1.tar.gz", hash = "sha256:66bc5a34912f408bb3925bf21231cb6f59206267b7f63f3503ef865c1a292e25"}, -] platformdirs = [ - {file = "platformdirs-2.5.1-py3-none-any.whl", hash = "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"}, - {file = "platformdirs-2.5.1.tar.gz", hash = "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d"}, + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, ] pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] -pre-commit = [ - {file = "pre_commit-2.17.0-py2.py3-none-any.whl", hash = "sha256:725fa7459782d7bec5ead072810e47351de01709be838c2ce1726b9591dad616"}, - {file = "pre_commit-2.17.0.tar.gz", hash = "sha256:c1a8040ff15ad3d648c70cc3e55b93e4d2d5b687320955505587fd79bbaed06a"}, -] -psycopg2-binary = [ - {file = "psycopg2-binary-2.9.3.tar.gz", hash = "sha256:761df5313dc15da1502b21453642d7599d26be88bff659382f8f9747c7ebea4e"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:539b28661b71da7c0e428692438efbcd048ca21ea81af618d845e06ebfd29478"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e82d38390a03da28c7985b394ec3f56873174e2c88130e6966cb1c946508e65"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57804fc02ca3ce0dbfbef35c4b3a4a774da66d66ea20f4bda601294ad2ea6092"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:083a55275f09a62b8ca4902dd11f4b33075b743cf0d360419e2051a8a5d5ff76"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_24_ppc64le.whl", hash = "sha256:0a29729145aaaf1ad8bafe663131890e2111f13416b60e460dae0a96af5905c9"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a79d622f5206d695d7824cbf609a4f5b88ea6d6dab5f7c147fc6d333a8787e4"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:090f3348c0ab2cceb6dfbe6bf721ef61262ddf518cd6cc6ecc7d334996d64efa"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a9e1f75f96ea388fbcef36c70640c4efbe4650658f3d6a2967b4cc70e907352e"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c3ae8e75eb7160851e59adc77b3a19a976e50622e44fd4fd47b8b18208189d42"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-win32.whl", hash = "sha256:7b1e9b80afca7b7a386ef087db614faebbf8839b7f4db5eb107d0f1a53225029"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:8b344adbb9a862de0c635f4f0425b7958bf5a4b927c8594e6e8d261775796d53"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:e847774f8ffd5b398a75bc1c18fbb56564cda3d629fe68fd81971fece2d3c67e"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68641a34023d306be959101b345732360fc2ea4938982309b786f7be1b43a4a1"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3303f8807f342641851578ee7ed1f3efc9802d00a6f83c101d21c608cb864460"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_24_aarch64.whl", hash = "sha256:e3699852e22aa68c10de06524a3721ade969abf382da95884e6a10ff798f9281"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_24_ppc64le.whl", hash = "sha256:526ea0378246d9b080148f2d6681229f4b5964543c170dd10bf4faaab6e0d27f"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:b1c8068513f5b158cf7e29c43a77eb34b407db29aca749d3eb9293ee0d3103ca"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:15803fa813ea05bef089fa78835118b5434204f3a17cb9f1e5dbfd0b9deea5af"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:152f09f57417b831418304c7f30d727dc83a12761627bb826951692cc6491e57"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:404224e5fef3b193f892abdbf8961ce20e0b6642886cfe1fe1923f41aaa75c9d"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-win32.whl", hash = "sha256:1f6b813106a3abdf7b03640d36e24669234120c72e91d5cbaeb87c5f7c36c65b"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:2d872e3c9d5d075a2e104540965a1cf898b52274a5923936e5bfddb58c59c7c2"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:10bb90fb4d523a2aa67773d4ff2b833ec00857f5912bafcfd5f5414e45280fb1"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a52ecab70af13e899f7847b3e074eeb16ebac5615665db33bce8a1009cf33"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a29b3ca4ec9defec6d42bf5feb36bb5817ba3c0230dd83b4edf4bf02684cd0ae"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:12b11322ea00ad8db8c46f18b7dfc47ae215e4df55b46c67a94b4effbaec7094"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_24_ppc64le.whl", hash = "sha256:53293533fcbb94c202b7c800a12c873cfe24599656b341f56e71dd2b557be063"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c381bda330ddf2fccbafab789d83ebc6c53db126e4383e73794c74eedce855ef"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9d29409b625a143649d03d0fd7b57e4b92e0ecad9726ba682244b73be91d2fdb"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:183a517a3a63503f70f808b58bfbf962f23d73b6dccddae5aa56152ef2bcb232"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:15c4e4cfa45f5a60599d9cec5f46cd7b1b29d86a6390ec23e8eebaae84e64554"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-win32.whl", hash = "sha256:adf20d9a67e0b6393eac162eb81fb10bc9130a80540f4df7e7355c2dd4af9fba"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2f9ffd643bc7349eeb664eba8864d9e01f057880f510e4681ba40a6532f93c71"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:def68d7c21984b0f8218e8a15d514f714d96904265164f75f8d3a70f9c295667"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dffc08ca91c9ac09008870c9eb77b00a46b3378719584059c034b8945e26b272"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:280b0bb5cbfe8039205c7981cceb006156a675362a00fe29b16fbc264e242834"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:af9813db73395fb1fc211bac696faea4ca9ef53f32dc0cfa27e4e7cf766dcf24"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_24_ppc64le.whl", hash = "sha256:63638d875be8c2784cfc952c9ac34e2b50e43f9f0a0660b65e2a87d656b3116c"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ffb7a888a047696e7f8240d649b43fb3644f14f0ee229077e7f6b9f9081635bd"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0c9d5450c566c80c396b7402895c4369a410cab5a82707b11aee1e624da7d004"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:d1c1b569ecafe3a69380a94e6ae09a4789bbb23666f3d3a08d06bbd2451f5ef1"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8fc53f9af09426a61db9ba357865c77f26076d48669f2e1bb24d85a22fb52307"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-win32.whl", hash = "sha256:6472a178e291b59e7f16ab49ec8b4f3bdada0a879c68d3817ff0963e722a82ce"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:35168209c9d51b145e459e05c31a9eaeffa9a6b0fd61689b48e07464ffd1a83e"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:47133f3f872faf28c1e87d4357220e809dfd3fa7c64295a4a148bcd1e6e34ec9"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91920527dea30175cc02a1099f331aa8c1ba39bf8b7762b7b56cbf54bc5cce42"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:887dd9aac71765ac0d0bac1d0d4b4f2c99d5f5c1382d8b770404f0f3d0ce8a39"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:1f14c8b0942714eb3c74e1e71700cbbcb415acbc311c730370e70c578a44a25c"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_24_ppc64le.whl", hash = "sha256:7af0dd86ddb2f8af5da57a976d27cd2cd15510518d582b478fbb2292428710b4"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:93cd1967a18aa0edd4b95b1dfd554cf15af657cb606280996d393dadc88c3c35"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bda845b664bb6c91446ca9609fc69f7db6c334ec5e4adc87571c34e4f47b7ddb"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:01310cf4cf26db9aea5158c217caa92d291f0500051a6469ac52166e1a16f5b7"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:99485cab9ba0fa9b84f1f9e1fef106f44a46ef6afdeec8885e0b88d0772b49e8"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-win32.whl", hash = "sha256:46f0e0a6b5fa5851bbd9ab1bc805eef362d3a230fbdfbc209f4a236d0a7a990d"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:accfe7e982411da3178ec690baaceaad3c278652998b2c45828aaac66cd8285f"}, -] py = [ {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, @@ -1302,21 +623,13 @@ pyflakes = [ {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, ] -pygments = [ - {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"}, - {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"}, -] pyparsing = [ - {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"}, - {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, ] pytest = [ - {file = "pytest-7.1.1-py3-none-any.whl", hash = "sha256:92f723789a8fdd7180b6b06483874feca4c48a5c76968e03bb3e7f806a1869ea"}, - {file = "pytest-7.1.1.tar.gz", hash = "sha256:841132caef6b1ad17a9afde46dc4f6cfa59a05f9555aae5151f73bdf2820ca63"}, -] -pytz = [ - {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"}, - {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"}, + {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, + {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"}, ] pyyaml = [ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, @@ -1353,73 +666,17 @@ pyyaml = [ {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] -requests = [ - {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, - {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, -] six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] -snowballstemmer = [ - {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, - {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, -] -sphinx = [ - {file = "Sphinx-4.5.0-py3-none-any.whl", hash = "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226"}, - {file = "Sphinx-4.5.0.tar.gz", hash = "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6"}, -] -sphinx-autodoc-typehints = [ - {file = "sphinx_autodoc_typehints-1.17.0-py3-none-any.whl", hash = "sha256:081daf53077b4ae1c28347d6d858e13e63aefe3b4aacef79fd717dd60687b470"}, - {file = "sphinx_autodoc_typehints-1.17.0.tar.gz", hash = "sha256:51c7b3f5cb9ccd15d0b52088c62df3094f1abd9612930340365c26def8629a14"}, -] -sphinx-rtd-theme = [ - {file = "sphinx_rtd_theme-1.0.0-py2.py3-none-any.whl", hash = "sha256:4d35a56f4508cfee4c4fb604373ede6feae2a306731d533f409ef5c3496fdbd8"}, - {file = "sphinx_rtd_theme-1.0.0.tar.gz", hash = "sha256:eec6d497e4c2195fa0e8b2016b337532b8a699a68bcb22a512870e16925c6a5c"}, -] -sphinxcontrib-apidoc = [ - {file = "sphinxcontrib-apidoc-0.3.0.tar.gz", hash = "sha256:729bf592cf7b7dd57c4c05794f732dc026127275d785c2a5494521fdde773fb9"}, - {file = "sphinxcontrib_apidoc-0.3.0-py2.py3-none-any.whl", hash = "sha256:6671a46b2c6c5b0dca3d8a147849d159065e50443df79614f921b42fbd15cb09"}, -] -sphinxcontrib-applehelp = [ - {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, - {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, -] -sphinxcontrib-devhelp = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, -] -sphinxcontrib-htmlhelp = [ - {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, - {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, -] -sphinxcontrib-jsmath = [ - {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, - {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, -] -sphinxcontrib-qthelp = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, -] -sphinxcontrib-serializinghtml = [ - {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, - {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] tomli = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] typing-extensions = [ - {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, - {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, -] -urllib3 = [ - {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, - {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, + {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, + {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, ] uvloop = [ {file = "uvloop-0.16.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6224f1401025b748ffecb7a6e2652b17768f30b1a6a3f7b44660e5b5b690b12d"}, @@ -1439,11 +696,3 @@ uvloop = [ {file = "uvloop-0.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e5f2e2ff51aefe6c19ee98af12b4ae61f5be456cd24396953244a30880ad861"}, {file = "uvloop-0.16.0.tar.gz", hash = "sha256:f74bc20c7b67d1c27c72601c78cf95be99d5c2cdd4514502b4f3eb0933ff1228"}, ] -virtualenv = [ - {file = "virtualenv-20.14.0-py2.py3-none-any.whl", hash = "sha256:1e8588f35e8b42c6ec6841a13c5e88239de1e6e4e4cedfd3916b306dc826ec66"}, - {file = "virtualenv-20.14.0.tar.gz", hash = "sha256:8e5b402037287126e81ccde9432b95a8be5b19d36584f64957060a3488c11ca8"}, -] -zipp = [ - {file = "zipp-3.7.0-py3-none-any.whl", hash = "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375"}, - {file = "zipp-3.7.0.tar.gz", hash = "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d"}, -] diff --git a/packages/core/minos-microservice-networks/pyproject.toml b/packages/core/minos-microservice-networks/pyproject.toml index 0b59df1d1..8fc0e5ae6 100644 --- a/packages/core/minos-microservice-networks/pyproject.toml +++ b/packages/core/minos-microservice-networks/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "minos-microservice-networks" -version = "0.6.0" +version = "0.7.0" description = "The networks core of the Minos Framework" readme = "README.md" repository = "https://github.com/minos-framework/minos-python" @@ -21,34 +21,26 @@ keywords = [ "saga", ] packages = [ - { include = "minos" } + { include = "minos" }, ] include = [ - "AUTHORS.md", - "HISTORY.md", - "LICENSE", + { path = "AUTHORS.md", format = "sdist" }, + { path = "HISTORY.md", format = "sdist" }, + { path = "LICENSE", format = "sdist" }, ] [tool.poetry.dependencies] python = "^3.9" -minos-microservice-common = "^0.6.0" -aiopg = "^1.2.1" +minos-microservice-common = "^0.7.0" crontab = "^0.23.0" -psycopg2-binary = "^2.9.3" [tool.poetry.dev-dependencies] minos-microservice-common = { path = "../minos-microservice-common", develop = true } -black = "^22.1" +black = "^22.3" isort = "^5.8.0" -pytest = "^7.0.1" +pytest = "^7.1.2" coverage = "^6.3" flake8 = "^4.0.1" -Sphinx = "^4.0.1" -pre-commit = "^2.12.1" -sphinx-autodoc-typehints = "^1.17.0" -sphinxcontrib-apidoc = "^0.3.0" -sphinx-rtd-theme = "^1.0.0" -m2r2 = "^0.3.2" [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/packages/core/minos-microservice-networks/tests/services/commands.py b/packages/core/minos-microservice-networks/tests/services/commands.py index fbbc75cd9..408ed58d0 100644 --- a/packages/core/minos-microservice-networks/tests/services/commands.py +++ b/packages/core/minos-microservice-networks/tests/services/commands.py @@ -7,7 +7,7 @@ class CommandService: - @enroute.rest.command(path="/order", method="GET") + @enroute.rest.command(path="/order", method="GET", foo="bar") def get_order_rest(self, request: Request) -> Response: return Response("get_order") diff --git a/packages/core/minos-microservice-networks/tests/services/queries.py b/packages/core/minos-microservice-networks/tests/services/queries.py index 835300277..c48d8cafb 100644 --- a/packages/core/minos-microservice-networks/tests/services/queries.py +++ b/packages/core/minos-microservice-networks/tests/services/queries.py @@ -6,7 +6,7 @@ class QueryService: - @enroute.rest.query(path="/ticket", method="POST") + @enroute.rest.query(path="/ticket", method="POST", foo="bar") def add_ticket(self, request: Request) -> Response: return Response("ticket_added") diff --git a/packages/core/minos-microservice-networks/tests/test_config.yml b/packages/core/minos-microservice-networks/tests/test_config.yml index e267acc3a..15153c1ff 100644 --- a/packages/core/minos-microservice-networks/tests/test_config.yml +++ b/packages/core/minos-microservice-networks/tests/test_config.yml @@ -16,31 +16,12 @@ rest: host: localhost port: 8080 repository: + client: minos.common.testing.MockedDatabaseClient database: order_db user: minos password: min0s host: localhost port: 5432 -snapshot: - database: order_db - user: minos - password: min0s - host: localhost - port: 5432 -broker: - host: localhost - port: 9092 - queue: - database: order_db - user: minos - password: min0s - host: localhost - port: 5432 - records: 10 - retry: 2 -saga: - storage: - path: "./order.lmdb" discovery: client: minos.networks.InMemoryDiscoveryClient host: discovery-service diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_clients.py b/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_clients.py index 21651fdcc..44ba60707 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_clients.py +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_clients.py @@ -13,7 +13,7 @@ SetupMixin, ) from minos.common.testing import ( - PostgresAsyncTestCase, + DatabaseMinosTestCase, ) from minos.networks import ( BrokerClient, @@ -24,14 +24,12 @@ MinosHandlerNotFoundEnoughEntriesException, ) from tests.utils import ( - CONFIG_FILE_PATH, FakeModel, + NetworksTestCase, ) -class TestBrokerClient(PostgresAsyncTestCase): - CONFIG_FILE_PATH = CONFIG_FILE_PATH - +class TestBrokerClient(NetworksTestCase, DatabaseMinosTestCase): def setUp(self) -> None: super().setUp() self.topic = "fooReply" diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_collections/test_queues/test_database.py b/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_collections/test_queues/test_database.py new file mode 100644 index 000000000..7852320ee --- /dev/null +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_collections/test_queues/test_database.py @@ -0,0 +1,188 @@ +import unittest +from asyncio import ( + sleep, +) +from itertools import ( + chain, + cycle, +) +from unittest.mock import ( + AsyncMock, + patch, +) + +from minos.common import ( + DatabaseMixin, +) +from minos.common.testing import ( + DatabaseMinosTestCase, + MockedDatabaseClient, +) +from minos.networks import ( + BrokerMessageV1, + BrokerMessageV1Payload, + BrokerQueue, + DatabaseBrokerQueue, +) +from minos.networks.testing import ( + MockedBrokerQueueDatabaseOperationFactory, +) +from tests.utils import ( + FakeAsyncIterator, + NetworksTestCase, +) + + +class TestDatabaseBrokerQueue(NetworksTestCase, DatabaseMinosTestCase): + def setUp(self) -> None: + super().setUp() + self.operation_factory = MockedBrokerQueueDatabaseOperationFactory() + + def test_is_subclass(self): + self.assertTrue(issubclass(DatabaseBrokerQueue, (BrokerQueue, DatabaseMixin))) + + def test_constructor(self): + queue = DatabaseBrokerQueue(operation_factory=self.operation_factory) + self.assertEqual(self.pool_factory.get_pool("database"), queue.database_pool) + self.assertEqual(self.operation_factory, queue.database_operation_factory) + self.assertEqual(2, queue.retry) + self.assertEqual(1000, queue.records) + + async def test_operation_factory(self): + queue = DatabaseBrokerQueue.from_config(self.config, operation_factory=self.operation_factory) + + self.assertEqual(self.operation_factory, queue.database_operation_factory) + + async def test_enqueue(self): + message = BrokerMessageV1("foo", BrokerMessageV1Payload("bar")) + + with patch.object( + MockedDatabaseClient, + "fetch_all", + side_effect=chain( + [FakeAsyncIterator([(0,)]), FakeAsyncIterator([(1, message.avro_bytes)])], + cycle([FakeAsyncIterator([(0,)])]), + ), + ): + async with DatabaseBrokerQueue.from_config(self.config, operation_factory=self.operation_factory) as queue: + await queue.enqueue(message) + await sleep(0.5) # To give time to consume the message from db. + + async def test_aiter(self): + messages = [ + BrokerMessageV1("foo", BrokerMessageV1Payload("bar")), + BrokerMessageV1("bar", BrokerMessageV1Payload("foo")), + ] + + queue = DatabaseBrokerQueue.from_config(self.config, operation_factory=self.operation_factory) + await queue.setup() + await queue.enqueue(messages[0]) + await queue.enqueue(messages[1]) + + with patch.object( + MockedDatabaseClient, + "fetch_all", + side_effect=chain( + [ + FakeAsyncIterator([(2,)]), + FakeAsyncIterator([(1, messages[0].avro_bytes), (2, messages[1].avro_bytes)]), + ], + cycle([FakeAsyncIterator([(0,)])]), + ), + ): + + observed = list() + async for message in queue: + observed.append(message) + if len(messages) == len(observed): + await queue.destroy() + + self.assertEqual(messages, observed) + + async def test_dequeue_with_count(self): + messages = [ + BrokerMessageV1("foo", BrokerMessageV1Payload("bar")), + BrokerMessageV1("bar", BrokerMessageV1Payload("foo")), + ] + + with patch.object( + MockedDatabaseClient, + "fetch_all", + return_value=FakeAsyncIterator([[1, messages[0].avro_bytes], [2, bytes()], [3, messages[1].avro_bytes]]), + ): + async with DatabaseBrokerQueue.from_config(self.config, operation_factory=self.operation_factory) as queue: + queue._get_count = AsyncMock(side_effect=[3, 0]) + + async with queue: + observed = [await queue.dequeue(), await queue.dequeue()] + + self.assertEqual(messages, observed) + + async def test_dequeue_with_notify(self): + messages = [ + BrokerMessageV1("foo", BrokerMessageV1Payload("bar")), + BrokerMessageV1("bar", BrokerMessageV1Payload("foo")), + ] + + with patch.object( + MockedDatabaseClient, + "fetch_all", + side_effect=chain( + [ + FakeAsyncIterator([(0,)]), + FakeAsyncIterator( + [ + (1, messages[0].avro_bytes), + (2, messages[1].avro_bytes), + ] + ), + ], + cycle([FakeAsyncIterator([(0,)])]), + ), + ): + async with DatabaseBrokerQueue.from_config(self.config, operation_factory=self.operation_factory) as queue: + await queue.enqueue(messages[0]) + await queue.enqueue(messages[1]) + + observed = [await queue.dequeue(), await queue.dequeue()] + + self.assertEqual(messages, observed) + + async def test_dequeue_ordered(self): + unsorted = [ + BrokerMessageV1("foo", BrokerMessageV1Payload(4)), + BrokerMessageV1("foo", BrokerMessageV1Payload(2)), + BrokerMessageV1("foo", BrokerMessageV1Payload(3)), + BrokerMessageV1("foo", BrokerMessageV1Payload(1)), + ] + + with patch.object( + MockedDatabaseClient, + "fetch_all", + side_effect=chain( + [ + FakeAsyncIterator([(2,)]), + FakeAsyncIterator( + [ + (1, unsorted[0].avro_bytes), + (2, unsorted[1].avro_bytes), + (3, unsorted[2].avro_bytes), + (4, unsorted[3].avro_bytes), + ] + ), + ], + cycle([FakeAsyncIterator([(0,)])]), + ), + ): + async with DatabaseBrokerQueue.from_config(self.config, operation_factory=self.operation_factory) as queue: + observed = list() + for _ in range(len(unsorted)): + observed.append(await queue.dequeue()) + + expected = [unsorted[3], unsorted[1], unsorted[2], unsorted[0]] + + self.assertEqual(expected, observed) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_collections/test_queues/test_pg.py b/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_collections/test_queues/test_pg.py deleted file mode 100644 index 8a87f1f6a..000000000 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_collections/test_queues/test_pg.py +++ /dev/null @@ -1,139 +0,0 @@ -import unittest -from asyncio import ( - sleep, -) -from unittest.mock import ( - AsyncMock, - patch, -) - -from minos.common import ( - PostgreSqlMinosDatabase, -) -from minos.common.testing import ( - PostgresAsyncTestCase, -) -from minos.networks import ( - BrokerMessageV1, - BrokerMessageV1Payload, - BrokerQueue, - PostgreSqlBrokerQueue, -) -from minos.networks.brokers.collections import ( - PostgreSqlBrokerQueueQueryFactory, -) -from tests.utils import ( - CONFIG_FILE_PATH, -) - - -class _PostgreSqlBrokerQueueQueryFactory(PostgreSqlBrokerQueueQueryFactory): - def build_table_name(self) -> str: - """For testing purposes.""" - return "test_table" - - -class TestPostgreSqlBrokerQueue(PostgresAsyncTestCase): - CONFIG_FILE_PATH = CONFIG_FILE_PATH - - def setUp(self) -> None: - super().setUp() - self.query_factory = _PostgreSqlBrokerQueueQueryFactory() - - def test_is_subclass(self): - self.assertTrue(issubclass(PostgreSqlBrokerQueue, (BrokerQueue, PostgreSqlMinosDatabase))) - - def test_constructor(self): - queue = PostgreSqlBrokerQueue("foo_db", query_factory=self.query_factory) - self.assertEqual("foo_db", queue.database) - self.assertEqual(self.query_factory, queue.query_factory) - self.assertEqual(2, queue.retry) - self.assertEqual(1000, queue.records) - - async def test_query_factory(self): - queue = PostgreSqlBrokerQueue.from_config(self.config, query_factory=self.query_factory) - - self.assertEqual(self.query_factory, queue.query_factory) - - async def test_enqueue(self): - message = BrokerMessageV1("foo", BrokerMessageV1Payload("bar")) - - async with PostgreSqlBrokerQueue.from_config(self.config, query_factory=self.query_factory) as queue: - await queue.enqueue(message) - await sleep(0.5) # To give time to consume the message from db. - - async def test_aiter(self): - messages = [ - BrokerMessageV1("foo", BrokerMessageV1Payload("bar")), - BrokerMessageV1("bar", BrokerMessageV1Payload("foo")), - ] - - queue = PostgreSqlBrokerQueue.from_config(self.config, query_factory=self.query_factory) - await queue.setup() - await queue.enqueue(messages[0]) - await queue.enqueue(messages[1]) - - observed = list() - async for message in queue: - observed.append(message) - if len(messages) == len(observed): - await queue.destroy() - - self.assertEqual(messages, observed) - - async def test_dequeue_with_count(self): - messages = [ - BrokerMessageV1("foo", BrokerMessageV1Payload("bar")), - BrokerMessageV1("bar", BrokerMessageV1Payload("foo")), - ] - - with patch( - "aiopg.Cursor.fetchall", - return_value=[[1, messages[0].avro_bytes], [2, bytes()], [3, messages[1].avro_bytes]], - ): - async with PostgreSqlBrokerQueue.from_config(self.config, query_factory=self.query_factory) as queue: - queue._get_count = AsyncMock(side_effect=[3, 0]) - - async with queue: - observed = [await queue.dequeue(), await queue.dequeue()] - - self.assertEqual(messages, observed) - - async def test_dequeue_with_notify(self): - messages = [ - BrokerMessageV1("foo", BrokerMessageV1Payload("bar")), - BrokerMessageV1("bar", BrokerMessageV1Payload("foo")), - ] - async with PostgreSqlBrokerQueue.from_config(self.config, query_factory=self.query_factory) as queue: - await queue.enqueue(messages[0]) - await queue.enqueue(messages[1]) - - observed = [await queue.dequeue(), await queue.dequeue()] - - self.assertEqual(messages, observed) - - async def test_dequeue_ordered(self): - unsorted = [ - BrokerMessageV1("foo", BrokerMessageV1Payload(4)), - BrokerMessageV1("foo", BrokerMessageV1Payload(2)), - BrokerMessageV1("foo", BrokerMessageV1Payload(3)), - BrokerMessageV1("foo", BrokerMessageV1Payload(1)), - ] - - async with PostgreSqlBrokerQueue.from_config(self.config, query_factory=self.query_factory) as queue: - - for message in unsorted: - await queue.enqueue(message) - - await sleep(0.5) - observed = list() - for _ in range(len(unsorted)): - observed.append(await queue.dequeue()) - - expected = [unsorted[3], unsorted[1], unsorted[2], unsorted[0]] - - self.assertEqual(expected, observed) - - -if __name__ == "__main__": - unittest.main() diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_dispatchers/test_impl.py b/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_dispatchers/test_impl.py index 9aa6e2ac5..d29d0e14a 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_dispatchers/test_impl.py +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_dispatchers/test_impl.py @@ -12,7 +12,7 @@ NotProvidedException, ) from minos.common.testing import ( - PostgresAsyncTestCase, + DatabaseMinosTestCase, ) from minos.networks import ( REQUEST_HEADERS_CONTEXT_VAR, @@ -31,8 +31,8 @@ Response, ) from tests.utils import ( - CONFIG_FILE_PATH, FakeModel, + NetworksTestCase, ) @@ -58,9 +58,7 @@ async def _fn_raises_exception(request: Request) -> Response: raise ValueError -class TestBrokerDispatcher(PostgresAsyncTestCase): - CONFIG_FILE_PATH = CONFIG_FILE_PATH - +class TestBrokerDispatcher(NetworksTestCase, DatabaseMinosTestCase): def setUp(self) -> None: super().setUp() diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_handlers/test_ports.py b/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_handlers/test_ports.py index 3d64a9b35..cb177981f 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_handlers/test_ports.py +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_handlers/test_ports.py @@ -8,7 +8,7 @@ Port, ) from minos.common.testing import ( - PostgresAsyncTestCase, + DatabaseMinosTestCase, ) from minos.networks import ( BrokerHandler, @@ -18,13 +18,11 @@ InMemoryBrokerSubscriberBuilder, ) from tests.utils import ( - CONFIG_FILE_PATH, + NetworksTestCase, ) -class TestBrokerPort(PostgresAsyncTestCase): - CONFIG_FILE_PATH = CONFIG_FILE_PATH - +class TestBrokerPort(NetworksTestCase, DatabaseMinosTestCase): def setUp(self) -> None: super().setUp() self.publisher = InMemoryBrokerPublisher.from_config(self.config) @@ -66,14 +64,14 @@ async def test_start_stop(self): self.assertEqual(1, destroy_mock.call_count) -class TestBrokerHandlerService(unittest.TestCase): +class TestBrokerHandlerService(NetworksTestCase): def test_is_subclass(self): self.assertTrue(issubclass(BrokerHandlerService, BrokerPort)) def test_warnings(self): with warnings.catch_warnings(): warnings.simplefilter("ignore", DeprecationWarning) - port = BrokerHandlerService(config=CONFIG_FILE_PATH) + port = BrokerHandlerService(config=self.config) self.assertIsInstance(port, BrokerPort) diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_pools.py b/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_pools.py index 08c08da7c..c75638572 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_pools.py +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_pools.py @@ -1,7 +1,7 @@ import unittest from minos.common.testing import ( - PostgresAsyncTestCase, + DatabaseMinosTestCase, ) from minos.networks import ( REQUEST_REPLY_TOPIC_CONTEXT_VAR, @@ -11,13 +11,11 @@ InMemoryBrokerSubscriberBuilder, ) from tests.utils import ( - CONFIG_FILE_PATH, + NetworksTestCase, ) -class TestBrokerClientPool(PostgresAsyncTestCase): - CONFIG_FILE_PATH = CONFIG_FILE_PATH - +class TestBrokerClientPool(NetworksTestCase, DatabaseMinosTestCase): def setUp(self) -> None: super().setUp() self.publisher = InMemoryBrokerPublisher.from_config(self.config) diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_publishers/test_queued/test_queues/test_database.py b/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_publishers/test_queued/test_queues/test_database.py new file mode 100644 index 000000000..4d44c31d6 --- /dev/null +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_publishers/test_queued/test_queues/test_database.py @@ -0,0 +1,28 @@ +import unittest + +from minos.common.testing import ( + DatabaseMinosTestCase, +) +from minos.networks import ( + BrokerPublisherQueue, + BrokerPublisherQueueDatabaseOperationFactory, + DatabaseBrokerPublisherQueue, + DatabaseBrokerQueue, +) +from tests.utils import ( + NetworksTestCase, +) + + +class TestDatabaseBrokerPublisherQueue(NetworksTestCase, DatabaseMinosTestCase): + def test_is_subclass(self): + self.assertTrue(issubclass(DatabaseBrokerPublisherQueue, (DatabaseBrokerQueue, BrokerPublisherQueue))) + + async def test_operation_factory(self): + queue = DatabaseBrokerPublisherQueue.from_config(self.config) + + self.assertIsInstance(queue.database_operation_factory, BrokerPublisherQueueDatabaseOperationFactory) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_publishers/test_queued/test_queues/test_pg.py b/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_publishers/test_queued/test_queues/test_pg.py deleted file mode 100644 index 5f385108b..000000000 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_publishers/test_queued/test_queues/test_pg.py +++ /dev/null @@ -1,38 +0,0 @@ -import unittest - -from minos.common.testing import ( - PostgresAsyncTestCase, -) -from minos.networks import ( - BrokerPublisherQueue, - PostgreSqlBrokerPublisherQueue, - PostgreSqlBrokerPublisherQueueQueryFactory, - PostgreSqlBrokerQueue, -) -from tests.utils import ( - CONFIG_FILE_PATH, -) - - -class TestPostgreSqlBrokerPublisherQueue(PostgresAsyncTestCase): - CONFIG_FILE_PATH = CONFIG_FILE_PATH - - def test_is_subclass(self): - self.assertTrue(issubclass(PostgreSqlBrokerPublisherQueue, (PostgreSqlBrokerQueue, BrokerPublisherQueue))) - - async def test_query_factory(self): - queue = PostgreSqlBrokerPublisherQueue.from_config(self.config) - - self.assertIsInstance(queue.query_factory, PostgreSqlBrokerPublisherQueueQueryFactory) - - -class TestPostgreSqlBrokerPublisherQueueQueryFactory(unittest.TestCase): - def setUp(self) -> None: - self.factory = PostgreSqlBrokerPublisherQueueQueryFactory() - - def test_build_table_name(self): - self.assertEqual("broker_publisher_queue", self.factory.build_table_name()) - - -if __name__ == "__main__": - unittest.main() diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_subscribers/test_filtered/test_validators/test_duplicates/test_database.py b/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_subscribers/test_filtered/test_validators/test_duplicates/test_database.py new file mode 100644 index 000000000..5f4e71c99 --- /dev/null +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_subscribers/test_filtered/test_validators/test_duplicates/test_database.py @@ -0,0 +1,54 @@ +import unittest +from unittest.mock import ( + patch, +) + +from minos.common import ( + IntegrityException, +) +from minos.common.testing import ( + DatabaseMinosTestCase, + MockedDatabaseClient, +) +from minos.networks import ( + BrokerMessageV1, + BrokerMessageV1Payload, + BrokerSubscriberValidator, + DatabaseBrokerSubscriberDuplicateValidator, +) +from minos.networks.testing import ( + MockedBrokerSubscriberDuplicateValidatorDatabaseOperationFactory, +) +from tests.utils import ( + NetworksTestCase, +) + + +class TestDatabaseBrokerSubscriberDuplicateValidator(NetworksTestCase, DatabaseMinosTestCase): + def test_is_subclass(self): + self.assertTrue(issubclass(DatabaseBrokerSubscriberDuplicateValidator, BrokerSubscriberValidator)) + + async def test_operation_factory(self): + validator = DatabaseBrokerSubscriberDuplicateValidator.from_config(self.config) + + self.assertIsInstance( + validator.database_operation_factory, MockedBrokerSubscriberDuplicateValidatorDatabaseOperationFactory + ) + + async def test_is_valid(self): + one = BrokerMessageV1("foo", BrokerMessageV1Payload("bar")) + two = BrokerMessageV1("foo", BrokerMessageV1Payload("bar")) + three = BrokerMessageV1("foo", BrokerMessageV1Payload("bar")) + + with patch.object( + MockedDatabaseClient, "execute", side_effect=[None, None, None, IntegrityException(""), None] + ): + async with DatabaseBrokerSubscriberDuplicateValidator.from_config(self.config) as validator: + self.assertTrue(await validator.is_valid(one)) + self.assertTrue(await validator.is_valid(two)) + self.assertFalse(await validator.is_valid(one)) + self.assertTrue(await validator.is_valid(three)) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_subscribers/test_filtered/test_validators/test_duplicates/test_pg.py b/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_subscribers/test_filtered/test_validators/test_duplicates/test_pg.py deleted file mode 100644 index 7996b8e74..000000000 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_subscribers/test_filtered/test_validators/test_duplicates/test_pg.py +++ /dev/null @@ -1,42 +0,0 @@ -import unittest - -from minos.common.testing import ( - PostgresAsyncTestCase, -) -from minos.networks import ( - BrokerMessageV1, - BrokerMessageV1Payload, - BrokerSubscriberValidator, - PostgreSqlBrokerSubscriberDuplicateValidator, - PostgreSqlBrokerSubscriberDuplicateValidatorQueryFactory, -) -from tests.utils import ( - CONFIG_FILE_PATH, -) - - -class TestPostgreSqlBrokerSubscriberDuplicateValidator(PostgresAsyncTestCase): - CONFIG_FILE_PATH = CONFIG_FILE_PATH - - def test_is_subclass(self): - self.assertTrue(issubclass(PostgreSqlBrokerSubscriberDuplicateValidator, BrokerSubscriberValidator)) - - async def test_query_factory(self): - validator = PostgreSqlBrokerSubscriberDuplicateValidator.from_config(self.config) - - self.assertIsInstance(validator.query_factory, PostgreSqlBrokerSubscriberDuplicateValidatorQueryFactory) - - async def test_is_valid(self): - one = BrokerMessageV1("foo", BrokerMessageV1Payload("bar")) - two = BrokerMessageV1("foo", BrokerMessageV1Payload("bar")) - three = BrokerMessageV1("foo", BrokerMessageV1Payload("bar")) - - async with PostgreSqlBrokerSubscriberDuplicateValidator.from_config(self.config) as validator: - self.assertTrue(await validator.is_valid(one)) - self.assertTrue(await validator.is_valid(two)) - self.assertFalse(await validator.is_valid(one)) - self.assertTrue(await validator.is_valid(three)) - - -if __name__ == "__main__": - unittest.main() diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_subscribers/test_queued/test_queues/test_database.py b/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_subscribers/test_queued/test_queues/test_database.py new file mode 100644 index 000000000..eb42d9f18 --- /dev/null +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_subscribers/test_queued/test_queues/test_database.py @@ -0,0 +1,116 @@ +import unittest +from asyncio import ( + sleep, +) +from itertools import ( + chain, + cycle, +) +from unittest.mock import ( + patch, +) + +from minos.common.testing import ( + DatabaseMinosTestCase, + MockedDatabaseClient, +) +from minos.networks import ( + BrokerMessageV1, + BrokerMessageV1Payload, + BrokerSubscriberQueue, + DatabaseBrokerQueue, + DatabaseBrokerSubscriberQueue, + DatabaseBrokerSubscriberQueueBuilder, +) +from minos.networks.testing import ( + MockedBrokerSubscriberQueueDatabaseOperationFactory, +) +from tests.utils import ( + FakeAsyncIterator, + NetworksTestCase, +) + + +class TestDatabaseBrokerSubscriberQueue(NetworksTestCase, DatabaseMinosTestCase): + def test_is_subclass(self): + self.assertTrue(issubclass(DatabaseBrokerSubscriberQueue, (DatabaseBrokerQueue, BrokerSubscriberQueue))) + + async def test_operation_factory(self): + queue = DatabaseBrokerSubscriberQueue.from_config(self.config, topics={"foo", "bar"}) + + self.assertIsInstance(queue.database_operation_factory, MockedBrokerSubscriberQueueDatabaseOperationFactory) + + async def test_enqueue(self): + message = BrokerMessageV1("foo", BrokerMessageV1Payload("bar")) + + with patch.object( + MockedDatabaseClient, + "fetch_all", + side_effect=chain( + [FakeAsyncIterator([(0,)]), FakeAsyncIterator([(1, message.avro_bytes)])], + cycle([FakeAsyncIterator([(0,)])]), + ), + ): + async with DatabaseBrokerSubscriberQueue.from_config(self.config, topics={"foo", "bar"}) as queue: + await queue.enqueue(message) + await sleep(0.5) # To give time to consume the message from db. + + async def test_dequeue_with_count(self): + messages = [ + BrokerMessageV1("foo", BrokerMessageV1Payload("bar")), + BrokerMessageV1("bar", BrokerMessageV1Payload("foo")), + ] + + with patch.object( + MockedDatabaseClient, + "fetch_all", + side_effect=[ + FakeAsyncIterator( + [ + [2], + ] + ), + FakeAsyncIterator([[1, messages[0].avro_bytes], [2, bytes()], [3, messages[1].avro_bytes]]), + FakeAsyncIterator([(0,)]), + ], + ): + async with DatabaseBrokerSubscriberQueue.from_config(self.config, topics={"foo", "bar"}) as queue: + async with queue: + observed = [await queue.dequeue(), await queue.dequeue()] + + self.assertEqual(messages, observed) + + async def test_dequeue_with_notify(self): + messages = [ + BrokerMessageV1("foo", BrokerMessageV1Payload("bar")), + BrokerMessageV1("bar", BrokerMessageV1Payload("foo")), + ] + with patch.object( + MockedDatabaseClient, + "fetch_all", + side_effect=[ + FakeAsyncIterator([(0,)]), + FakeAsyncIterator([(1, messages[0].avro_bytes), (3, messages[1].avro_bytes)]), + FakeAsyncIterator([(0,)]), + ], + ): + async with DatabaseBrokerSubscriberQueue.from_config(self.config, topics={"foo", "bar"}) as queue: + await queue.enqueue(messages[0]) + await queue.enqueue(messages[1]) + + observed = [await queue.dequeue(), await queue.dequeue()] + + self.assertEqual(messages, observed) + + +class TestDatabaseBrokerSubscriberQueueBuilder(NetworksTestCase, DatabaseMinosTestCase): + def test_build(self): + builder = DatabaseBrokerSubscriberQueueBuilder().with_config(self.config).with_topics({"one", "two"}) + subscriber = builder.build() + + self.assertIsInstance(subscriber, DatabaseBrokerSubscriberQueue) + self.assertEqual({"one", "two"}, subscriber.topics) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_subscribers/test_queued/test_queues/test_pg.py b/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_subscribers/test_queued/test_queues/test_pg.py deleted file mode 100644 index 45e7c9786..000000000 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_subscribers/test_queued/test_queues/test_pg.py +++ /dev/null @@ -1,104 +0,0 @@ -import unittest -import warnings -from asyncio import ( - sleep, -) -from unittest.mock import ( - AsyncMock, - patch, -) - -from minos.common import ( - Config, -) -from minos.common.testing import ( - PostgresAsyncTestCase, -) -from minos.networks import ( - BrokerMessageV1, - BrokerMessageV1Payload, - BrokerSubscriberQueue, - PostgreSqlBrokerQueue, - PostgreSqlBrokerSubscriberQueue, - PostgreSqlBrokerSubscriberQueueBuilder, - PostgreSqlBrokerSubscriberQueueQueryFactory, -) -from tests.utils import ( - CONFIG_FILE_PATH, -) - - -class TestPostgreSqlBrokerSubscriberQueue(PostgresAsyncTestCase): - CONFIG_FILE_PATH = CONFIG_FILE_PATH - - def test_is_subclass(self): - self.assertTrue(issubclass(PostgreSqlBrokerSubscriberQueue, (PostgreSqlBrokerQueue, BrokerSubscriberQueue))) - - async def test_query_factory(self): - queue = PostgreSqlBrokerSubscriberQueue.from_config(self.config, topics={"foo", "bar"}) - - self.assertIsInstance(queue.query_factory, PostgreSqlBrokerSubscriberQueueQueryFactory) - - async def test_enqueue(self): - message = BrokerMessageV1("foo", BrokerMessageV1Payload("bar")) - - async with PostgreSqlBrokerSubscriberQueue.from_config(self.config, topics={"foo", "bar"}) as queue: - await queue.enqueue(message) - await sleep(0.5) # To give time to consume the message from db. - - async def test_dequeue_with_count(self): - messages = [ - BrokerMessageV1("foo", BrokerMessageV1Payload("bar")), - BrokerMessageV1("bar", BrokerMessageV1Payload("foo")), - ] - - with patch( - "aiopg.Cursor.fetchall", - return_value=[[1, messages[0].avro_bytes], [2, bytes()], [3, messages[1].avro_bytes]], - ): - async with PostgreSqlBrokerSubscriberQueue.from_config(self.config, topics={"foo", "bar"}) as queue: - queue._get_count = AsyncMock(side_effect=[3, 0]) - - async with queue: - observed = [await queue.dequeue(), await queue.dequeue()] - - self.assertEqual(messages, observed) - - async def test_dequeue_with_notify(self): - messages = [ - BrokerMessageV1("foo", BrokerMessageV1Payload("bar")), - BrokerMessageV1("bar", BrokerMessageV1Payload("foo")), - ] - async with PostgreSqlBrokerSubscriberQueue.from_config(self.config, topics={"foo", "bar"}) as queue: - await queue.enqueue(messages[0]) - await queue.enqueue(messages[1]) - - observed = [await queue.dequeue(), await queue.dequeue()] - - self.assertEqual(messages, observed) - - -class TestPostgreSqlBrokerSubscriberQueueQueryFactory(unittest.TestCase): - def setUp(self) -> None: - self.factory = PostgreSqlBrokerSubscriberQueueQueryFactory() - - def test_build_table_name(self): - self.assertEqual("broker_subscriber_queue", self.factory.build_table_name()) - - -class TestPostgreSqlBrokerSubscriberQueueBuilder(unittest.TestCase): - def setUp(self) -> None: - self.config = Config(CONFIG_FILE_PATH) - - def test_build(self): - with warnings.catch_warnings(): - warnings.simplefilter("ignore", DeprecationWarning) - builder = PostgreSqlBrokerSubscriberQueueBuilder().with_config(self.config).with_topics({"one", "two"}) - subscriber = builder.build() - - self.assertIsInstance(subscriber, PostgreSqlBrokerSubscriberQueue) - self.assertEqual({"one", "two"}, subscriber.topics) - - -if __name__ == "__main__": - unittest.main() diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_decorators/test_api.py b/packages/core/minos-microservice-networks/tests/test_networks/test_decorators/test_api.py index 075c7c5f3..739baf92b 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_decorators/test_api.py +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_decorators/test_api.py @@ -16,10 +16,26 @@ def test_rest_command(self): decorator = enroute.rest.command(path="tickets/", method="GET") self.assertEqual(RestCommandEnrouteDecorator("tickets/", "GET"), decorator) + def test_rest_command_kwargs(self): + decorator = enroute.rest.command( + path="tickets/", + method="GET", + foo="bar", + ) + self.assertEqual({"foo": "bar"}, decorator.kwargs) + def test_rest_query(self): decorator = enroute.rest.query(path="tickets/", method="GET") self.assertEqual(RestQueryEnrouteDecorator("tickets/", "GET"), decorator) + def test_rest_query_kwargs(self): + decorator = enroute.rest.query( + path="tickets/", + method="GET", + foo="bar", + ) + self.assertEqual({"foo": "bar"}, decorator.kwargs) + def test_rest_event_raises(self): with self.assertRaises(AttributeError): enroute.rest.event("CreateTicket") diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_decorators/test_collectors.py b/packages/core/minos-microservice-networks/tests/test_networks/test_decorators/test_collectors.py index c7e520d16..298d1f71d 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_decorators/test_collectors.py +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_decorators/test_collectors.py @@ -15,10 +15,13 @@ from tests.utils import ( FakeService, FakeServiceWithGetEnroute, + FakeServiceWithKwargs, ) class TestEnrouteCollector(unittest.IsolatedAsyncioTestCase): + ticket_route = "tickets/" + def test_decorated_str(self): analyzer = EnrouteCollector(classname(FakeService)) self.assertEqual(FakeService, analyzer.decorated) @@ -28,7 +31,10 @@ def test_get_all(self): observed = analyzer.get_all() expected = { - "get_tickets": {BrokerQueryEnrouteDecorator("GetTickets"), RestQueryEnrouteDecorator("tickets/", "GET")}, + "get_tickets": { + BrokerQueryEnrouteDecorator("GetTickets"), + RestQueryEnrouteDecorator(self.ticket_route, "GET"), + }, "create_ticket": { BrokerCommandEnrouteDecorator("CreateTicket"), BrokerCommandEnrouteDecorator("AddTicket"), @@ -50,13 +56,23 @@ def test_get_rest_command_query(self): observed = analyzer.get_rest_command_query() expected = { - "get_tickets": {RestQueryEnrouteDecorator("tickets/", "GET")}, + "get_tickets": {RestQueryEnrouteDecorator(self.ticket_route, "GET")}, "create_ticket": {RestCommandEnrouteDecorator("orders/", "GET")}, "delete_ticket": {RestCommandEnrouteDecorator("orders/", "DELETE")}, } self.assertEqual(expected, observed) + def test_get_rest_command_query_kwargs(self): + analyzer = EnrouteCollector(FakeServiceWithKwargs) + + observed = analyzer.get_rest_command_query() + expected = { + "get_tickets": {RestQueryEnrouteDecorator(self.ticket_route, "GET", foo="bar")}, + } + + self.assertEqual(expected, observed) + def test_get_broker_command_query_event(self): analyzer = EnrouteCollector(FakeService) diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_decorators/test_definitions/test_abc.py b/packages/core/minos-microservice-networks/tests/test_networks/test_decorators/test_definitions/test_abc.py index dc228d058..f1130d95e 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_decorators/test_definitions/test_abc.py +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_decorators/test_definitions/test_abc.py @@ -70,6 +70,10 @@ def test_function_call(self): wrapper = self.decorator(_fn) self.assertEqual(Response("Fn"), wrapper(self.request)) + def test_kwargs(self): + self.decorator = _FakeEnrouteDecorator(foo="foo", bar="bar") + self.assertEqual({"foo": "foo", "bar": "bar"}, self.decorator.kwargs) + async def test_async_function_call(self): wrapper = self.decorator(_async_fn) self.assertEqual(Response("Async Fn: test"), await wrapper(self.request)) diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_discovery/test_clients/test_abc.py b/packages/core/minos-microservice-networks/tests/test_networks/test_discovery/test_clients/test_abc.py index c79f93685..887fab994 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_discovery/test_clients/test_abc.py +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_discovery/test_clients/test_abc.py @@ -4,11 +4,15 @@ ) from minos.common import ( + Config, Object, ) from minos.networks import ( DiscoveryClient, ) +from tests.utils import ( + CONFIG_FILE_PATH, +) class _DiscoveryClient(DiscoveryClient): @@ -30,6 +34,8 @@ async def unsubscribe(self, name: str, *args, **kwargs) -> None: class TestDiscoveryClient(unittest.IsolatedAsyncioTestCase): + CONFIG_FILE_PATH = CONFIG_FILE_PATH + def test_abstract(self): self.assertTrue(issubclass(DiscoveryClient, (ABC, Object))) # noinspection PyUnresolvedReferences @@ -39,6 +45,12 @@ def test_route(self): client = _DiscoveryClient("localhost", 9999) self.assertEqual("http://localhost:9999", client.route) + def test_from_config(self): + self.config = Config(self.CONFIG_FILE_PATH) + client = _DiscoveryClient.from_config(config=self.config) + self.assertEqual("discovery-service", client.host) + self.assertEqual(8080, client.port) + if __name__ == "__main__": unittest.main() diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_discovery/test_connectors.py b/packages/core/minos-microservice-networks/tests/test_networks/test_discovery/test_connectors.py index a709f25f5..332d9f57c 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_discovery/test_connectors.py +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_discovery/test_connectors.py @@ -9,21 +9,21 @@ MinosImportException, ) from minos.networks import ( + DiscoveryClient, DiscoveryConnector, InMemoryDiscoveryClient, MinosInvalidDiscoveryClient, get_host_ip, ) from tests.utils import ( - CONFIG_FILE_PATH, + NetworksTestCase, ) -class TestDiscoveryConnector(unittest.IsolatedAsyncioTestCase): - CONFIG_FILE_PATH = CONFIG_FILE_PATH - +class TestDiscoveryConnector(NetworksTestCase): def setUp(self) -> None: - self.config = Config(self.CONFIG_FILE_PATH) + super().setUp() + self.ip = get_host_ip() self.discovery = DiscoveryConnector.from_config(config=self.config) @@ -36,13 +36,24 @@ def test_constructor(self): self.assertEqual("192.168.1.32", connector.host) self.assertEqual(8080, connector.port) + def test_from_config(self): + connector = DiscoveryConnector.from_config(self.config) + expected = [ + {"url": "/order", "method": "DELETE"}, + {"url": "/order", "method": "GET", "foo": "bar"}, + {"url": "/ticket", "method": "POST", "foo": "bar"}, + ] + + self.assertEqual(expected, connector.endpoints) + self.assertIsInstance(connector.client, DiscoveryClient) + def test_config_minos_client_does_not_exist(self): - config = Config(self.CONFIG_FILE_PATH, minos_discovery_client="wrong-client") + config = Config(self.get_config_file_path(), minos_discovery_client="wrong-client") with self.assertRaises(MinosImportException): DiscoveryConnector.from_config(config=config) def test_config_minos_client_not_supported(self): - config = Config(self.CONFIG_FILE_PATH, minos_discovery_client="minos.common.Model") + config = Config(self.get_config_file_path(), minos_discovery_client="minos.common.Model") with self.assertRaises(MinosInvalidDiscoveryClient): DiscoveryConnector.from_config(config) @@ -60,8 +71,8 @@ async def test_subscription(self): "Order", [ {"url": "/order", "method": "DELETE"}, - {"url": "/order", "method": "GET"}, - {"url": "/ticket", "method": "POST"}, + {"url": "/order", "method": "GET", "foo": "bar"}, + {"url": "/ticket", "method": "POST", "foo": "bar"}, ], ) self.assertEqual(expected, mock.call_args) diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_scheduling/test_ports.py b/packages/core/minos-microservice-networks/tests/test_networks/test_scheduling/test_ports.py index 04a9833d5..18ebc5aa2 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_scheduling/test_ports.py +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_scheduling/test_ports.py @@ -8,7 +8,7 @@ Port, ) from minos.common.testing import ( - PostgresAsyncTestCase, + DatabaseMinosTestCase, ) from minos.networks import ( PeriodicPort, @@ -16,13 +16,11 @@ PeriodicTaskSchedulerService, ) from tests.utils import ( - CONFIG_FILE_PATH, + NetworksTestCase, ) -class TestPeriodicPort(PostgresAsyncTestCase): - CONFIG_FILE_PATH = CONFIG_FILE_PATH - +class TestPeriodicPort(NetworksTestCase, DatabaseMinosTestCase): def test_is_instance(self): service = PeriodicPort(config=self.config) self.assertIsInstance(service, Port) @@ -64,14 +62,14 @@ async def test_start_stop(self): self.assertEqual(1, destroy_mock.call_count) -class TestPeriodicTaskSchedulerService(unittest.TestCase): +class TestPeriodicTaskSchedulerService(NetworksTestCase): def test_is_subclass(self): self.assertTrue(issubclass(PeriodicTaskSchedulerService, PeriodicPort)) def test_warnings(self): with warnings.catch_warnings(): warnings.simplefilter("ignore", DeprecationWarning) - port = PeriodicTaskSchedulerService(config=CONFIG_FILE_PATH) + port = PeriodicTaskSchedulerService(config=self.config) self.assertIsInstance(port, PeriodicPort) diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_utils.py b/packages/core/minos-microservice-networks/tests/test_networks/test_utils.py index 5e4cc21fd..fcbe773f8 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_utils.py +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_utils.py @@ -1,12 +1,9 @@ import unittest -import warnings from asyncio import ( Queue, ) -from minos.common import Builder as CommonBuilder from minos.networks import ( - Builder, consume_queue, ) @@ -32,16 +29,5 @@ async def test_consume_queue_full(self): self.assertTrue(queue.empty()) -class TestBuilder(unittest.TestCase): - def test_is_subclass(self): - self.assertTrue(issubclass(Builder, CommonBuilder)) - - def test_warnings(self): - with warnings.catch_warnings(): - warnings.simplefilter("ignore", DeprecationWarning) - builder = Builder() - self.assertIsInstance(builder, CommonBuilder) - - if __name__ == "__main__": unittest.main() diff --git a/packages/core/minos-microservice-networks/tests/utils.py b/packages/core/minos-microservice-networks/tests/utils.py index bf0e2bea9..d357189ee 100644 --- a/packages/core/minos-microservice-networks/tests/utils.py +++ b/packages/core/minos-microservice-networks/tests/utils.py @@ -1,3 +1,10 @@ +from __future__ import ( + annotations, +) + +from abc import ( + ABC, +) from datetime import ( timedelta, ) @@ -16,6 +23,9 @@ from minos.common import ( DeclarativeModel, ) +from minos.common.testing import ( + MinosTestCase, +) from minos.networks import ( EnrouteDecorator, HttpConnector, @@ -23,12 +33,20 @@ Response, WrappedRequest, enroute, + testing, ) BASE_PATH = Path(__file__).parent CONFIG_FILE_PATH = BASE_PATH / "test_config.yml" +class NetworksTestCase(MinosTestCase, ABC): + testing_module = testing + + def get_config_file_path(self): + return CONFIG_FILE_PATH + + @total_ordering class FakeModel(DeclarativeModel): """For testing purposes""" @@ -171,6 +189,24 @@ def bar(self, request: Request): return Response("bar") +class FakeServiceWithKwargs: + """For testing purposes.""" + + @enroute.rest.query( + path="tickets/", + method="GET", + authorized=True, + allowed_groups=[ + "super_admin", + "admin", + ], + ) + @enroute.broker.query(topic="GetTickets") + async def get_tickets(self, request: Request) -> Response: + """For testing purposes.""" + return Response(": ".join(("Get Tickets", await request.content()))) + + class FakeServiceWithGetEnroute: """For testing purposes.""" diff --git a/packages/core/minos-microservice-saga/HISTORY.md b/packages/core/minos-microservice-saga/HISTORY.md index 64aaffbbb..5e2ce4f63 100644 --- a/packages/core/minos-microservice-saga/HISTORY.md +++ b/packages/core/minos-microservice-saga/HISTORY.md @@ -1,86 +1,72 @@ -History -======= +# History -0.0.1 (2021-05-12) ------------------- +## 0.0.1 (2021-05-12) * First Release * added support for Saga Instances * Saga Actions -0.0.2 (2021-05-14) ------------------- +## 0.0.2 (2021-05-14) * Moved to Poetry * Added actions for documentation -0.0.3 (2021-05-20) ------------------- +## 0.0.3 (2021-05-20) * Added Dependency injection Container use * Completed Saga Manager -0.0.4 (2021-05-31) ------------------- +## 0.0.4 (2021-05-31) * Bugfixes -0.0.5 (2021-06-02) ------------------- +## 0.0.5 (2021-06-02) * Created SagaContext class * Documentation improvement * implemented __getitem__ and __setitem__ for SagaContext -0.0.6 (2021-07-06) ------------------- +## 0.0.6 (2021-07-06) * Completed the Saga process workflow implementation * Bugfixes * Completed the Compensation process * Added Reply Command to Saga process -0.0.7 (2021-07-12) ------------------- +## 0.0.7 (2021-07-12) * Added update to common * Bugfixes -0.0.8 (2021-07-23) ------------------- +## 0.0.8 (2021-07-23) * Now Sagas can be paused also on memory in addition to on disk. * Improve SagaManager API. -0.0.9 (2021-07-26) ------------------- +## 0.0.9 (2021-07-26) * Add flag to return SagaExecution instances directly from SagaManager -0.0.10 (2021-08-23) ------------------- +## 0.0.10 (2021-08-23) * Support latest `minos-microservice-common` release (`0.1.10`) * Change default `SagaManager` flags to (`pause_on_disk=False, raise_on_error=True, return_execution=True`) * Enrich failed `CommandReply` instances with exception message. * Add `SagaRequest` and `SagaResponse`. -0.0.11 (2021-09-01) ------------------- +## 0.0.11 (2021-09-01) * Deprecate `SagaManager.run` by `Saga` names (the new approach is to directly pass the `Saga` instance). * Remove `name` from `Saga` class. * Minor improvements. -0.0.12 (2021-09-27) ------------------- +## 0.0.12 (2021-09-27) * Fix troubles related with dependency injections. * Remove file headers. * Stop using `NoReturn` everywhere. -0.1.0 (2021-10-08) ------------------- +## 0.1.0 (2021-10-08) * Add `SagaStep.on_error` method to handle errored responses. * Integrate `SagaRequest` and `SagaResponse` into `SagaOperation` definitions. @@ -90,8 +76,7 @@ History * Rename `LocalExecutor` as `Executor`, `OnReplyExecutor` as `ResponseExecutor` and `PublishExecutor` as `RequestExecutor`. * Simplify `SagaException` and heirs names. -0.1.1 (2021-10-19) ------------------- +## 0.1.1 (2021-10-19) * Add `ConditionalSagaStep` and `ConditionalSagaStepExecution` which allow to define conditional logic for steps within the `SagaExecution`. * Add `LocalSagaStep` and `LocalSagaStepExecution` classes which allow to execute local functions within the `SagaExecution`. @@ -100,13 +85,11 @@ History * Add `user` propagation from `SagaManager` to `RequestExecutor`. * Improve `SagaContext` behaviour, allowing to dynamically change field types and also delete them as in any `dict` instance. -0.2.0 (2021-11-08) ------------------- +## 0.2.0 (2021-11-08) * Add compatibility to `minos-microservice-common>=0.2.0`. -0.3.0 (2021-11-15) ------------------- +## 0.3.0 (2021-11-15) * Add `SagaService` class (containing the reply handling logic). * Add `transactional_command` middleware (to extend the saga transactionality to remote steps). @@ -118,71 +101,68 @@ History * Store `service_name: str` as part of `SagaStepExecution` metadata. * Deprecate callback argument on `Saga.commit` method in favor of `Saga.local_step`. -0.3.1 (2021-11-17) ------------------- +## 0.3.1 (2021-11-17) * Improve integration between `ConditionalSagaStep` and `TransactionCommitter` * Add `SagaExecution.commit(...)` and `SagaExecution.reject(...)` methods and `autocommit: bool` and `autoreject: bool` into `SagaExecution.execute(...)` and `SagaExecution.rollback(...)` methods respectively. * Fix concurrent blocks related with a limited amount of `minos.networks.DynamicHandler` instances on the `minos.networks.DynamicHandlerPool`. -0.3.2 (2021-11-23) ------------------- +## 0.3.2 (2021-11-23) * Take advantage of concurrent remote broker calls to improve the `TransactionCommiter` performance. * Expose `autocommit: bool = True` argument on `SagaManager.run(...)` method. * Add support for `minos-microservice-networks=^0.3.0`. -0.3.3 (2021-11-26) ------------------- +## 0.3.3 (2021-11-26) * Fix bug related with empty `ConditionalSagaStep.from_raw` and empty `else_then`. -0.3.4 (2021-11-26) ------------------- +## 0.3.4 (2021-11-26) * Fix bug related with `TransactionCommitter` and `ConditionalSagaStepExecution`. -0.3.5 (2021-11-30) ------------------- +## 0.3.5 (2021-11-30) * Fix bug related with `Transaction` scopes and sub-`Saga` executions launched from `RemoteStep` calls * Add support for `minos-microservice-network~=0.3.1`. -0.4.0 (2022-01-27) ------------------- +## 0.4.0 (2022-01-27) * Be compatible with `minos-microservice-common~=0.4.0`. * Be compatible with `minos-microservice-aggregate~=0.4.0`. * Be compatible with `minos-microservice-networks~=0.4.0`. -0.4.1 (2022-01-31) ------------------- +## 0.4.1 (2022-01-31) * Update `README.md`. -0.5.0 (2022-02-03) ------------------- +## 0.5.0 (2022-02-03) * Minor changes. -0.5.1 (2022-02-03) ------------------- +## 0.5.1 (2022-02-03) * Fix bug related with dependency specification. -0.5.2 (2022-02-08) ------------------- +## 0.5.2 (2022-02-08) * Add compatibility to `minos-microservice-aggregate~=0.5.2`. * Minor changes. -0.5.3 (2022-03-04) ------------------- +## 0.5.3 (2022-03-04) * Improve attribute and item accessors of `SagaContext`. -0.6.0 (2022-03-28) ------------------- +## 0.6.0 (2022-03-28) * Replace `dependency-injector`'s injection classes by the ones provided by the `minos.common.injections` module. * Be compatible with latest `minos.common.Config` API. + +## 0.7.0 (2022-05-11) + +* Rename `SagaExecutionStorage` as `SagaExecutionRepository`. +* Add `DatabaseSagaExecutionRepository` as the implementation of the `SagaExecutionRepository` over a database. +* Add `SagaExecutionDatabaseOperationFactory` as the base operation factory to store saga executions. +* Unify documentation building pipeline across all `minos-python` packages. +* Fix documentation building warnings. +* Fix bug related with package building and additional files like `AUTHORS.md`, `HISTORY.md`, etc. \ No newline at end of file diff --git a/packages/core/minos-microservice-saga/Makefile b/packages/core/minos-microservice-saga/Makefile index acc861207..ef814b8bc 100644 --- a/packages/core/minos-microservice-saga/Makefile +++ b/packages/core/minos-microservice-saga/Makefile @@ -15,10 +15,6 @@ reformat: poetry run black --line-length 120 minos tests poetry run isort minos tests -docs: - rm -rf docs/api - poetry run $(MAKE) --directory=docs html - release: $(MAKE) dist poetry publish @@ -38,5 +34,4 @@ check: $(MAKE) reformat $(MAKE) lint $(MAKE) test - $(MAKE) docs $(MAKE) dist diff --git a/packages/core/minos-microservice-saga/RUNTHETESTS.md b/packages/core/minos-microservice-saga/RUNTHETESTS.md index 8b5e95b1f..386e2b0e7 100644 --- a/packages/core/minos-microservice-saga/RUNTHETESTS.md +++ b/packages/core/minos-microservice-saga/RUNTHETESTS.md @@ -1,5 +1,4 @@ -Run the tests -============== +# Run the tests In order to run the tests, please make sure you have the `Docker Engine `_ and `Docker Compose `_ installed. diff --git a/packages/core/minos-microservice-saga/SETUP.md b/packages/core/minos-microservice-saga/SETUP.md deleted file mode 100644 index 8203965c7..000000000 --- a/packages/core/minos-microservice-saga/SETUP.md +++ /dev/null @@ -1,11 +0,0 @@ -Set up a development environment -================================= - -Since we use `poetry` as the default package manager, it must be installed. Please refer to -`https://python-poetry.org/docs/#installation`. - -Run `poetry install` to get the dependencies. - -Run `pre-commit install` to set the git checks before commiting. - -Make yourself sure you are able to run the tests. Refer to the appropriate section in this guide. diff --git a/packages/core/minos-microservice-saga/docs/Makefile b/packages/core/minos-microservice-saga/docs/Makefile deleted file mode 100644 index f54fcebf7..000000000 --- a/packages/core/minos-microservice-saga/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -SPHINXPROJ = minos-microservice-saga -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/packages/core/minos-microservice-saga/docs/_static/style.css b/packages/core/minos-microservice-saga/docs/_static/style.css deleted file mode 100644 index 8aa6c288f..000000000 --- a/packages/core/minos-microservice-saga/docs/_static/style.css +++ /dev/null @@ -1,3 +0,0 @@ -.wy-nav-content { - max-width: 1200px !important; -} diff --git a/packages/core/minos-microservice-saga/docs/_templates/layout.html b/packages/core/minos-microservice-saga/docs/_templates/layout.html deleted file mode 100644 index b0a448060..000000000 --- a/packages/core/minos-microservice-saga/docs/_templates/layout.html +++ /dev/null @@ -1,4 +0,0 @@ -{% extends "!layout.html" %} -{% block extrahead %} - -{% endblock %} \ No newline at end of file diff --git a/packages/core/minos-microservice-saga/docs/authors.rst b/packages/core/minos-microservice-saga/docs/authors.rst deleted file mode 100644 index bcfd9cb00..000000000 --- a/packages/core/minos-microservice-saga/docs/authors.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../AUTHORS.md diff --git a/packages/core/minos-microservice-saga/docs/conf.py b/packages/core/minos-microservice-saga/docs/conf.py deleted file mode 100755 index 3d9418dc1..000000000 --- a/packages/core/minos-microservice-saga/docs/conf.py +++ /dev/null @@ -1,197 +0,0 @@ -#!/usr/bin/env python -# -# minos documentation build configuration file, created by -# sphinx-quickstart on Fri Jun 9 13:47:02 2017. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -# If extensions (or modules to document with autodoc) are in another -# directory, add these directories to sys.path here. If the directory is -# relative to the documentation root, use os.path.abspath to make it -# absolute, like shown here. -# -import os -import sys - -sys.path.insert(0, os.path.abspath("..")) - -import sphinx_rtd_theme - -from minos import ( - saga, -) - -# -- General configuration --------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. - - -extensions = [ - "sphinxcontrib.apidoc", - "sphinx.ext.autodoc", - "sphinx_autodoc_typehints", - "sphinx.ext.viewcode", - "sphinx_rtd_theme", - "m2r2", -] -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -source_suffix = [".rst", ".md"] - -# The master toctree document. -master_doc = "index" - -# General information about the project. -project = "Minos Microservice Saga" -copyright = "2021, Clariteia" -author = "Minos Framework Devs" - -# The version info for the project you're documenting, acts as replacement -# for |version| and |release|, also used in various other places throughout -# the built documents. -# -# The short X.Y version. -version = saga.__version__ -# The full version, including alpha/beta/rc tags. -release = saga.__version__ - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = "sphinx" - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = False - - -# -- Options for HTML output ------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# - -html_theme = "sphinx_rtd_theme" - -# Theme options are theme-specific and customize the look and feel of a -# theme further. For a list of options available for each theme, see the -# documentation. -# - -# html_theme_options = { -# "codecov_button": True, -# "description": "Reactive microservices for an asynchronous world", -# "github_button": True, -# "github_user": "Clariteia", -# "github_repo": "minos_microservice_saga", -# "github_type": "star", -# } - -html_sidebars = {"**": ["about.html", "navigation.html", "searchbox.html"]} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] - - -# -- Options for HTMLHelp output --------------------------------------- - -# Output file base name for HTML help builder. -htmlhelp_basename = "minosdoc" - - -# -- Options for LaTeX output ------------------------------------------ - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass -# [howto, manual, or own class]). -latex_documents = [ - (master_doc, "minos.tex", "Minos Microservice Saga Documentation", "Minos Framework Devs", "manual"), -] - - -# -- Options for manual page output ------------------------------------ - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [(master_doc, "minos", "Minos Microservice Saga Documentation", [author], 1)] - - -# -- Options for Texinfo output ---------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ( - master_doc, - "minos", - "Minos Microservice Saga Documentation", - author, - "minos", - "One line description of project.", - "Miscellaneous", - ), -] - -# "apidoc" extension -apidoc_module_dir = "../minos" -apidoc_output_dir = "api" -apidoc_separate_modules = True -autodoc_default_options = { - "inherited-members": True, - "special-members": "__init__", - "undoc-members": True, -} - -apidoc_toc_file = False -apidoc_module_first = True -apidoc_extra_args = [ - "--force", - "--implicit-namespaces", -] -# "autodoc typehints" extension - -set_type_checking_flag = True -typehints_fully_qualified = True diff --git a/packages/core/minos-microservice-saga/docs/history.rst b/packages/core/minos-microservice-saga/docs/history.rst deleted file mode 100644 index d26e5be83..000000000 --- a/packages/core/minos-microservice-saga/docs/history.rst +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../HISTORY.md diff --git a/packages/core/minos-microservice-saga/docs/index.rst b/packages/core/minos-microservice-saga/docs/index.rst deleted file mode 100644 index b1860482b..000000000 --- a/packages/core/minos-microservice-saga/docs/index.rst +++ /dev/null @@ -1,18 +0,0 @@ -Welcome to Minos Microservice Saga's documentation! -======================================================= - -.. toctree:: - :maxdepth: 2 - - readme - runthetests - usage - api/minos - authors - history - -Indices and tables -==================== -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/packages/core/minos-microservice-saga/docs/make.bat b/packages/core/minos-microservice-saga/docs/make.bat deleted file mode 100644 index 0be133d1b..000000000 --- a/packages/core/minos-microservice-saga/docs/make.bat +++ /dev/null @@ -1,36 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=python -msphinx -) -set SOURCEDIR=. -set BUILDDIR=_build -set SPHINXPROJ=minos_microservice_saga - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The Sphinx module was not found. Make sure you have Sphinx installed, - echo.then set the SPHINXBUILD environment variable to point to the full - echo.path of the 'sphinx-build' executable. Alternatively you may add the - echo.Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% - -:end -popd diff --git a/packages/core/minos-microservice-saga/docs/readme.rst b/packages/core/minos-microservice-saga/docs/readme.rst deleted file mode 100644 index af09813a4..000000000 --- a/packages/core/minos-microservice-saga/docs/readme.rst +++ /dev/null @@ -1,4 +0,0 @@ -Introduction -************** - -.. mdinclude:: ../README.md diff --git a/packages/core/minos-microservice-saga/docs/runthetests.rst b/packages/core/minos-microservice-saga/docs/runthetests.rst deleted file mode 100644 index 309db1b96..000000000 --- a/packages/core/minos-microservice-saga/docs/runthetests.rst +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../RUNTHETESTS.md diff --git a/packages/core/minos-microservice-saga/docs/usage.rst b/packages/core/minos-microservice-saga/docs/usage.rst deleted file mode 100644 index f5df84d05..000000000 --- a/packages/core/minos-microservice-saga/docs/usage.rst +++ /dev/null @@ -1,7 +0,0 @@ -===== -Usage -===== - -To use Minos Microservice Saga in a project:: - - from minos import saga diff --git a/packages/core/minos-microservice-saga/minos/saga/__init__.py b/packages/core/minos-microservice-saga/minos/saga/__init__.py index 41a2353e0..eec096ef9 100644 --- a/packages/core/minos-microservice-saga/minos/saga/__init__.py +++ b/packages/core/minos-microservice-saga/minos/saga/__init__.py @@ -1,6 +1,8 @@ +"""The SAGA pattern of the Minos Framework.""" + __author__ = "Minos Framework Devs" __email__ = "hey@minos.run" -__version__ = "0.6.0" +__version__ = "0.7.0" from .context import ( SagaContext, @@ -44,6 +46,7 @@ ) from .executions import ( ConditionalSagaStepExecution, + DatabaseSagaExecutionRepository, Executor, LocalExecutor, LocalSagaStepExecution, @@ -51,7 +54,8 @@ RequestExecutor, ResponseExecutor, SagaExecution, - SagaExecutionStorage, + SagaExecutionDatabaseOperationFactory, + SagaExecutionRepository, SagaStatus, SagaStepExecution, SagaStepStatus, diff --git a/packages/core/minos-microservice-saga/minos/saga/definitions/steps/abc.py b/packages/core/minos-microservice-saga/minos/saga/definitions/steps/abc.py index f01dfd28d..f0b3f03f9 100644 --- a/packages/core/minos-microservice-saga/minos/saga/definitions/steps/abc.py +++ b/packages/core/minos-microservice-saga/minos/saga/definitions/steps/abc.py @@ -55,6 +55,8 @@ def from_raw(cls, raw: Union[dict[str, Any], SagaStep], **kwargs) -> SagaStep: if isinstance(raw, cls): return raw + raw = raw.copy() + if "cls" in raw: # noinspection PyTypeChecker step_cls: type = import_module(raw.pop("cls")) diff --git a/packages/core/minos-microservice-saga/minos/saga/executions/__init__.py b/packages/core/minos-microservice-saga/minos/saga/executions/__init__.py index 2080ae9f9..e4c55b270 100644 --- a/packages/core/minos-microservice-saga/minos/saga/executions/__init__.py +++ b/packages/core/minos-microservice-saga/minos/saga/executions/__init__.py @@ -7,6 +7,11 @@ RequestExecutor, ResponseExecutor, ) +from .repositories import ( + DatabaseSagaExecutionRepository, + SagaExecutionDatabaseOperationFactory, + SagaExecutionRepository, +) from .saga import ( SagaExecution, ) @@ -20,6 +25,3 @@ RemoteSagaStepExecution, SagaStepExecution, ) -from .storage import ( - SagaExecutionStorage, -) diff --git a/packages/core/minos-microservice-saga/minos/saga/executions/commit.py b/packages/core/minos-microservice-saga/minos/saga/executions/commit.py index 2f38a867e..63e36a56f 100644 --- a/packages/core/minos-microservice-saga/minos/saga/executions/commit.py +++ b/packages/core/minos-microservice-saga/minos/saga/executions/commit.py @@ -2,6 +2,9 @@ from asyncio import ( gather, ) +from typing import ( + Optional, +) from uuid import ( UUID, ) @@ -12,6 +15,8 @@ from minos.common import ( Inject, + NotProvidedException, + PoolFactory, ) from minos.networks import ( BrokerClient, @@ -38,10 +43,18 @@ def __init__( self, execution_uuid: UUID, executed_steps: list[SagaStepExecution], - broker_pool: BrokerClientPool, broker_publisher: BrokerPublisher, + broker_pool: Optional[BrokerClientPool] = None, + pool_factory: Optional[PoolFactory] = None, **kwargs, ): + + if broker_pool is None and pool_factory is not None: + broker_pool = pool_factory.get_pool("broker") + + if broker_pool is None: + raise NotProvidedException(f"A {BrokerClientPool!r} instance is required.") + self.executed_steps = executed_steps self.execution_uuid = execution_uuid diff --git a/packages/core/minos-microservice-saga/minos/saga/executions/repositories/__init__.py b/packages/core/minos-microservice-saga/minos/saga/executions/repositories/__init__.py new file mode 100644 index 000000000..bb39208d1 --- /dev/null +++ b/packages/core/minos-microservice-saga/minos/saga/executions/repositories/__init__.py @@ -0,0 +1,7 @@ +from .abc import ( + SagaExecutionRepository, +) +from .database import ( + DatabaseSagaExecutionRepository, + SagaExecutionDatabaseOperationFactory, +) diff --git a/packages/core/minos-microservice-saga/minos/saga/executions/repositories/abc.py b/packages/core/minos-microservice-saga/minos/saga/executions/repositories/abc.py new file mode 100644 index 000000000..b5943b36c --- /dev/null +++ b/packages/core/minos-microservice-saga/minos/saga/executions/repositories/abc.py @@ -0,0 +1,62 @@ +from abc import ( + ABC, + abstractmethod, +) +from typing import ( + Union, +) +from uuid import ( + UUID, +) + +from minos.common import ( + SetupMixin, +) + +from ..saga import ( + SagaExecution, +) + + +class SagaExecutionRepository(SetupMixin, ABC): + """Saga Execution Repository class.""" + + async def store(self, execution: SagaExecution) -> None: + """Store an execution. + + :param execution: Execution to be stored. + :return: This method does not return anything. + """ + return await self._store(execution) + + async def _store(self, execution: SagaExecution) -> None: + raise NotImplementedError + + async def load(self, uuid: Union[str, UUID]) -> SagaExecution: + """Load the saga execution stored on the given key. + + :param uuid: The key to identify the execution. + :return: A ``SagaExecution`` instance. + """ + if not isinstance(uuid, UUID): + uuid = UUID(uuid) + return await self._load(uuid) + + @abstractmethod + async def _load(self, uuid: UUID) -> SagaExecution: + raise NotImplementedError + + async def delete(self, uuid: Union[SagaExecution, str, UUID]) -> None: + """Delete the reference of the given key. + + :param uuid: Execution key to be deleted. + :return: This method does not return anything. + """ + if isinstance(uuid, SagaExecution): + uuid = uuid.uuid + if not isinstance(uuid, UUID): + uuid = UUID(uuid) + return await self._delete(uuid) + + async def _delete(self, key: UUID) -> None: + raise NotImplementedError diff --git a/packages/core/minos-microservice-saga/minos/saga/executions/repositories/database/__init__.py b/packages/core/minos-microservice-saga/minos/saga/executions/repositories/database/__init__.py new file mode 100644 index 000000000..ff16cd986 --- /dev/null +++ b/packages/core/minos-microservice-saga/minos/saga/executions/repositories/database/__init__.py @@ -0,0 +1,6 @@ +from .factories import ( + SagaExecutionDatabaseOperationFactory, +) +from .impl import ( + DatabaseSagaExecutionRepository, +) diff --git a/packages/core/minos-microservice-saga/minos/saga/executions/repositories/database/factories.py b/packages/core/minos-microservice-saga/minos/saga/executions/repositories/database/factories.py new file mode 100644 index 000000000..6ed321b40 --- /dev/null +++ b/packages/core/minos-microservice-saga/minos/saga/executions/repositories/database/factories.py @@ -0,0 +1,44 @@ +from abc import ( + ABC, + abstractmethod, +) +from uuid import ( + UUID, +) + +from minos.common import ( + DatabaseOperation, + DatabaseOperationFactory, +) + + +class SagaExecutionDatabaseOperationFactory(DatabaseOperationFactory, ABC): + """Saga Execution Database Operation Factory class.""" + + @abstractmethod + def build_store(self, uuid: UUID, **kwargs) -> DatabaseOperation: + """Build the database operation to store a saga execution. + + :param uuid: The identifier of the saga execution. + :param kwargs: The attributes of the saga execution. + :return: A ``DatabaseOperation`` instance. + """ + raise NotImplementedError + + @abstractmethod + def build_load(self, uuid: UUID) -> DatabaseOperation: + """Build the database operation to load a saga execution. + + :param uuid: The identifier of the saga execution. + :return: A ``DatabaseOperation`` instance. + """ + raise NotImplementedError + + @abstractmethod + def build_delete(self, uuid: UUID) -> DatabaseOperation: + """Build the database operation to delete a saga execution. + + :param uuid: The identifier of the saga execution. + :return: A ``DatabaseOperation`` instance. + """ + raise NotImplementedError diff --git a/packages/core/minos-microservice-saga/minos/saga/executions/repositories/database/impl.py b/packages/core/minos-microservice-saga/minos/saga/executions/repositories/database/impl.py new file mode 100644 index 000000000..958acad7a --- /dev/null +++ b/packages/core/minos-microservice-saga/minos/saga/executions/repositories/database/impl.py @@ -0,0 +1,55 @@ +from __future__ import ( + annotations, +) + +from typing import ( + Optional, +) +from uuid import ( + UUID, +) + +from minos.common import ( + DatabaseMixin, + ProgrammingException, +) + +from ....exceptions import ( + SagaExecutionNotFoundException, +) +from ...saga import ( + SagaExecution, +) +from ..abc import ( + SagaExecutionRepository, +) +from .factories import ( + SagaExecutionDatabaseOperationFactory, +) + + +class DatabaseSagaExecutionRepository(SagaExecutionRepository, DatabaseMixin[SagaExecutionDatabaseOperationFactory]): + """Saga Execution Storage class.""" + + def __init__(self, *args, database_key: Optional[tuple[str]] = None, **kwargs): + if database_key is None: + database_key = ("saga",) + super().__init__(*args, database_key=database_key, **kwargs) + + async def _store(self, execution: SagaExecution) -> None: + operation = self.database_operation_factory.build_store(**execution.raw) + await self.execute_on_database(operation) + + async def _delete(self, uuid: UUID) -> None: + operation = self.database_operation_factory.build_delete(uuid) + await self.execute_on_database(operation) + + async def _load(self, uuid: UUID) -> SagaExecution: + operation = self.database_operation_factory.build_load(uuid) + + try: + value = await self.execute_on_database_and_fetch_one(operation) + except ProgrammingException: + raise SagaExecutionNotFoundException(f"The execution identified by {uuid} was not found.") + execution = SagaExecution.from_raw(value) + return execution diff --git a/packages/core/minos-microservice-saga/minos/saga/executions/saga.py b/packages/core/minos-microservice-saga/minos/saga/executions/saga.py index fa0bd94a8..d3b38cd05 100644 --- a/packages/core/minos-microservice-saga/minos/saga/executions/saga.py +++ b/packages/core/minos-microservice-saga/minos/saga/executions/saga.py @@ -4,6 +4,9 @@ import logging import warnings +from asyncio import ( + shield, +) from contextlib import ( suppress, ) @@ -90,6 +93,8 @@ def from_raw(cls, raw: Union[dict[str, Any], SagaExecution], **kwargs) -> SagaEx if isinstance(raw, cls): return raw + raw = raw.copy() + current = raw | kwargs current["definition"] = Saga.from_raw(current["definition"]) current["status"] = SagaStatus.from_raw(current["status"]) @@ -165,7 +170,7 @@ async def execute( :param autocommit: If ``True`` the commit process is performed automatically, otherwise must be performed manually. :param kwargs: Additional named arguments. - :return: A ``SagaContext instance. + :return: A ``SagaContext`` instance. """ if self.status == SagaStatus.Finished: raise SagaExecutionAlreadyExecutedException( @@ -262,7 +267,7 @@ async def commit(self, *args, **kwargs) -> None: committer = TransactionCommitter(self.uuid, self.executed_steps, *args, **kwargs) try: - await committer.commit() + await shield(committer.commit()) except Exception as exc: # FIXME: Exception is too broad logger.warning(f"There was an exception on {TransactionCommitter.__name__!r} commit: {exc!r}") with suppress(SagaRollbackExecutionException): @@ -279,7 +284,7 @@ async def reject(self, *args, **kwargs) -> None: """ committer = TransactionCommitter(self.uuid, self.executed_steps, *args, **kwargs) try: - await committer.reject() + await shield(committer.reject()) except Exception as exc: logger.warning(f"There was an exception on {TransactionCommitter.__name__!r} rejection: {exc!r}") raise SagaFailedCommitCallbackException(exc) diff --git a/packages/core/minos-microservice-saga/minos/saga/executions/storage.py b/packages/core/minos-microservice-saga/minos/saga/executions/storage.py deleted file mode 100644 index 3bcf75ef5..000000000 --- a/packages/core/minos-microservice-saga/minos/saga/executions/storage.py +++ /dev/null @@ -1,84 +0,0 @@ -from __future__ import ( - annotations, -) - -from typing import ( - Type, - Union, -) -from uuid import ( - UUID, -) - -from minos.common import ( - Config, - MinosJsonBinaryProtocol, - MinosStorage, - MinosStorageLmdb, -) - -from ..exceptions import ( - SagaExecutionNotFoundException, -) -from .saga import ( - SagaExecution, -) - - -class SagaExecutionStorage: - """Saga Execution Storage class.""" - - def __init__( - self, - storage_cls: Type[MinosStorage] = MinosStorageLmdb, - protocol=MinosJsonBinaryProtocol, - db_name: str = "LocalState", - **kwargs, - ): - self.db_name = db_name - self._storage = storage_cls.build(protocol=protocol, **kwargs) - - @classmethod - def from_config(cls, config: Config, **kwargs) -> SagaExecutionStorage: - """Build an instance from config. - - :param config: Config instance. - :param kwargs: Additional named arguments. - :return: A new ``SagaExecutionStorage`` instance. - """ - return cls(**(config.get_database_by_name("saga") | kwargs)) - - def store(self, execution: SagaExecution) -> None: - """Store an execution. - - :param execution: Execution to be stored. - :return: This method does not return anything. - """ - key = str(execution.uuid) - value = execution.raw - self._storage.update(table=self.db_name, key=key, value=value) - - def load(self, key: Union[str, UUID]) -> SagaExecution: - """Load the saga execution stored on the given key. - - :param key: The key to identify the execution. - :return: A ``SagaExecution`` instance. - """ - key = str(key) - value = self._storage.get(table=self.db_name, key=key) - if value is None: - raise SagaExecutionNotFoundException(f"The execution identified by {key} was not found.") - execution = SagaExecution.from_raw(value) - return execution - - def delete(self, key: Union[SagaExecution, str, UUID]) -> None: - """Delete the reference of the given key. - - :param key: Execution key to be deleted. - :return: This method does not return anything. - """ - if isinstance(key, SagaExecution): - key = key.uuid - - key = str(key) - self._storage.delete(table=self.db_name, key=key) diff --git a/packages/core/minos-microservice-saga/minos/saga/manager.py b/packages/core/minos-microservice-saga/minos/saga/manager.py index 605171737..e927cceaa 100644 --- a/packages/core/minos-microservice-saga/minos/saga/manager.py +++ b/packages/core/minos-microservice-saga/minos/saga/manager.py @@ -23,6 +23,7 @@ Inject, Injectable, NotProvidedException, + PoolFactory, SetupMixin, ) from minos.networks import ( @@ -44,8 +45,9 @@ SagaPausedExecutionStepException, ) from .executions import ( + DatabaseSagaExecutionRepository, SagaExecution, - SagaExecutionStorage, + SagaExecutionRepository, SagaStatus, ) from .messages import ( @@ -63,17 +65,27 @@ class SagaManager(SetupMixin): """ @Inject() - def __init__(self, storage: SagaExecutionStorage, broker_pool: BrokerClientPool, *args, **kwargs): + def __init__( + self, + storage: SagaExecutionRepository, + broker_pool: Optional[BrokerClientPool] = None, + pool_factory: Optional[PoolFactory] = None, + *args, + **kwargs, + ): super().__init__(*args, **kwargs) self.storage = storage + if broker_pool is None and pool_factory is not None: + broker_pool = pool_factory.get_pool("broker") + if broker_pool is None: - raise NotProvidedException("A handler pool instance is required.") + raise NotProvidedException(f"A {BrokerClientPool!r} instance is required.") self.broker_pool = broker_pool @classmethod - def _from_config(cls, *args, config: Config, **kwargs) -> SagaManager: + def _from_config(cls, config: Config, **kwargs) -> SagaManager: """Build an instance from config. :param args: Additional positional arguments. @@ -81,9 +93,17 @@ def _from_config(cls, *args, config: Config, **kwargs) -> SagaManager: :param kwargs: Additional named arguments. :return: A new ``SagaManager`` instance. """ - storage = SagaExecutionStorage.from_config(config, **kwargs) + storage = DatabaseSagaExecutionRepository.from_config(config, **kwargs) return cls(storage=storage, **kwargs) + async def _setup(self) -> None: + await super()._setup() + await self.storage.setup() + + async def _destroy(self) -> None: + await self.storage.destroy() + await super()._destroy() + async def run( self, definition: Optional[Saga] = None, @@ -150,7 +170,7 @@ async def _run_new( return await self._run(execution, **kwargs) async def _load_and_run(self, response: SagaResponse, **kwargs) -> Union[UUID, SagaExecution]: - execution = self.storage.load(response.uuid) + execution = await self.storage.load(response.uuid) return await self._run(execution, response=response, **kwargs) async def _run( @@ -167,10 +187,10 @@ async def _run( else: await self._run_with_pause_on_memory(execution, **kwargs) except SagaFailedExecutionException as exc: - self.storage.store(execution) + await self.storage.store(execution) if raise_on_error: raise exc - logger.warning(f"The execution identified by {execution.uuid!s} failed: {exc.exception!r}") + logger.exception(f"The execution identified by {execution.uuid!s} failed") finally: if (headers := REQUEST_HEADERS_CONTEXT_VAR.get()) is not None: related_services = reduce(or_, (s.related_services for s in execution.executed_steps), set()) @@ -183,7 +203,7 @@ async def _run( headers["related_services"] = ",".join(related_services) if execution.status == SagaStatus.Finished: - self.storage.delete(execution) + await self.storage.delete(execution) if return_execution: return execution @@ -196,7 +216,7 @@ async def _run_with_pause_on_disk(self, execution: SagaExecution, autocommit: bo if autocommit: await execution.commit(**kwargs) except SagaPausedExecutionStepException: - self.storage.store(execution) + await self.storage.store(execution) except SagaFailedExecutionException as exc: if autocommit: await execution.reject(**kwargs) @@ -214,7 +234,7 @@ async def _run_with_pause_on_memory( await execution.execute(response=response, autocommit=False, **kwargs) except SagaPausedExecutionStepException: response = await self._get_response(broker, execution, **kwargs) - self.storage.store(execution) + await self.storage.store(execution) if autocommit: await execution.commit(**kwargs) except SagaFailedExecutionException as exc: diff --git a/packages/core/minos-microservice-saga/minos/saga/testing.py b/packages/core/minos-microservice-saga/minos/saga/testing.py new file mode 100644 index 000000000..e1da76cd0 --- /dev/null +++ b/packages/core/minos-microservice-saga/minos/saga/testing.py @@ -0,0 +1,136 @@ +from abc import ( + ABC, + abstractmethod, +) +from uuid import ( + UUID, +) + +from minos.common import ( + DatabaseOperation, + DeclarativeModel, +) +from minos.common.testing import ( + MinosTestCase, + MockedDatabaseClient, + MockedDatabaseOperation, +) + +from .context import ( + SagaContext, +) +from .definitions import ( + Saga, +) +from .exceptions import ( + SagaExecutionNotFoundException, +) +from .executions import ( + SagaExecution, + SagaExecutionDatabaseOperationFactory, + SagaExecutionRepository, +) + + +class MockedSagaExecutionDatabaseOperationFactory(SagaExecutionDatabaseOperationFactory): + """For testing purposes""" + + def build_store(self, uuid: UUID, **kwargs) -> DatabaseOperation: + """For testing purposes""" + return MockedDatabaseOperation("create_table") + + def build_load(self, uuid: UUID) -> DatabaseOperation: + """For testing purposes""" + return MockedDatabaseOperation("create_table") + + def build_delete(self, uuid: UUID) -> DatabaseOperation: + """For testing purposes""" + return MockedDatabaseOperation("create_table") + + +MockedDatabaseClient.set_factory( + SagaExecutionDatabaseOperationFactory, + MockedSagaExecutionDatabaseOperationFactory, +) + + +class Foo(DeclarativeModel): + """For testing purposes.""" + + foo: str + + +def _fn1(context: SagaContext) -> SagaContext: # pragma: no cover + context["payment"] = "payment" + return context + + +def _fn2(context: SagaContext) -> SagaContext: # pragma: no cover + context["payment"] = None + return context + + +_SAGA = Saga().local_step(_fn1).on_failure(_fn2).commit() + + +class SagaExecutionRepositoryTestCase(MinosTestCase, ABC): + __test__ = False + + def setUp(self) -> None: + super().setUp() + self.saga_execution_repository = self.build_saga_execution_repository() + + async def asyncSetUp(self) -> None: + await super().asyncSetUp() + + await self.saga_execution_repository.setup() + + execution = SagaExecution.from_definition(_SAGA) + await execution.execute(autocommit=False) + + self.execution = execution + + self.another = SagaExecution.from_definition(_SAGA) + + async def asyncTearDown(self): + await self.saga_execution_repository.destroy() + await super().asyncTearDown() + + @abstractmethod + def build_saga_execution_repository(self) -> SagaExecutionRepository: + """For testing purposes.""" + + async def test_store(self): + await self.saga_execution_repository.store(self.execution) + + self.assertEqual(self.execution, await self.saga_execution_repository.load(self.execution.uuid)) + + async def test_store_overwrite(self): + await self.saga_execution_repository.store(self.execution) + self.assertEqual(self.execution, await self.saga_execution_repository.load(self.execution.uuid)) + + self.another.uuid = self.execution.uuid + await self.saga_execution_repository.store(self.another) + + self.assertNotEqual(self.execution, await self.saga_execution_repository.load(self.execution.uuid)) + self.assertEqual(self.another, await self.saga_execution_repository.load(self.execution.uuid)) + + async def test_load_from_str(self): + await self.saga_execution_repository.store(self.execution) + self.assertEqual(self.execution, await self.saga_execution_repository.load(str(self.execution.uuid))) + + async def test_load_raises(self): + with self.assertRaises(SagaExecutionNotFoundException): + await self.saga_execution_repository.load(self.execution.uuid) + + async def test_delete(self): + await self.saga_execution_repository.store(self.execution) + await self.saga_execution_repository.delete(self.execution) + with self.assertRaises(SagaExecutionNotFoundException): + await self.saga_execution_repository.load(self.execution.uuid) + + async def test_delete_from_str(self): + await self.saga_execution_repository.store(self.execution) + await self.saga_execution_repository.delete(str(self.execution.uuid)) + with self.assertRaises(SagaExecutionNotFoundException): + await self.saga_execution_repository.load(self.execution.uuid) diff --git a/packages/core/minos-microservice-saga/poetry.lock b/packages/core/minos-microservice-saga/poetry.lock index 8cf474bb3..b2d776e62 100644 --- a/packages/core/minos-microservice-saga/poetry.lock +++ b/packages/core/minos-microservice-saga/poetry.lock @@ -19,37 +19,6 @@ develop = ["aiocontextvars (==0.2.2)", "aiohttp-asgi", "aiohttp (<4)", "async-ti raven = ["raven-aiohttp"] uvloop = ["uvloop (>=0.14,<1)"] -[[package]] -name = "aiopg" -version = "1.3.3" -description = "Postgres integration with asyncio." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -async-timeout = ">=3.0,<5.0" -psycopg2-binary = ">=2.8.4" - -[package.extras] -sa = ["sqlalchemy[postgresql_psycopg2binary] (>=1.3,<1.5)"] - -[[package]] -name = "alabaster" -version = "0.7.12" -description = "A configurable sidebar-enabled Sphinx theme" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "async-timeout" -version = "4.0.2" -description = "Timeout context manager for asyncio programs" -category = "main" -optional = false -python-versions = ">=3.6" - [[package]] name = "atomicwrites" version = "1.4.0" @@ -72,20 +41,9 @@ docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] -[[package]] -name = "babel" -version = "2.9.1" -description = "Internationalization utilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -pytz = ">=2015.7" - [[package]] name = "black" -version = "22.1.0" +version = "22.3.0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -96,7 +54,7 @@ click = ">=8.0.0" mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = ">=1.1.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] @@ -113,40 +71,13 @@ category = "main" optional = false python-versions = "*" -[[package]] -name = "certifi" -version = "2021.10.8" -description = "Python package for providing Mozilla's CA Bundle." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "cfgv" -version = "3.3.1" -description = "Validate configuration and produce human readable error messages." -category = "dev" -optional = false -python-versions = ">=3.6.1" - -[[package]] -name = "charset-normalizer" -version = "2.0.12" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "dev" -optional = false -python-versions = ">=3.5.0" - -[package.extras] -unicode_backport = ["unicodedata2"] - [[package]] name = "click" -version = "8.0.4" +version = "8.1.3" description = "Composable command line interface toolkit" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -194,7 +125,7 @@ python-versions = "*" [[package]] name = "dependency-injector" -version = "4.39.0" +version = "4.39.1" description = "Dependency injection framework for Python" category = "main" optional = false @@ -209,25 +140,9 @@ flask = ["flask"] pydantic = ["pydantic"] yaml = ["pyyaml"] -[[package]] -name = "distlib" -version = "0.3.4" -description = "Distribution utilities" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "docutils" -version = "0.17.1" -description = "Docutils -- Python Documentation Utilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - [[package]] name = "fastavro" -version = "1.4.10" +version = "1.4.11" description = "Fast read/write of AVRO files" category = "main" optional = false @@ -239,18 +154,6 @@ lz4 = ["lz4"] snappy = ["python-snappy"] zstandard = ["zstandard"] -[[package]] -name = "filelock" -version = "3.6.0" -description = "A platform independent file lock." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"] -testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-cov", "pytest-timeout (>=1.4.2)"] - [[package]] name = "flake8" version = "4.0.1" @@ -264,49 +167,6 @@ mccabe = ">=0.6.0,<0.7.0" pycodestyle = ">=2.8.0,<2.9.0" pyflakes = ">=2.4.0,<2.5.0" -[[package]] -name = "identify" -version = "2.4.12" -description = "File identification library for Python" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -license = ["ukkonen"] - -[[package]] -name = "idna" -version = "3.3" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "dev" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "imagesize" -version = "1.3.0" -description = "Getting image size from png/jpeg/jpeg2000/gif file" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "importlib-metadata" -version = "4.11.3" -description = "Read metadata from Python packages" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] -perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] - [[package]] name = "iniconfig" version = "1.1.1" @@ -329,48 +189,6 @@ requirements_deprecated_finder = ["pipreqs", "pip-api"] colors = ["colorama (>=0.4.3,<0.5.0)"] plugins = ["setuptools"] -[[package]] -name = "jinja2" -version = "3.1.1" -description = "A very fast and expressive template engine." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - -[[package]] -name = "lmdb" -version = "1.3.0" -description = "Universal Python binding for the LMDB 'Lightning' Database" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "m2r2" -version = "0.3.2" -description = "Markdown and reStructuredText in a single file." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -docutils = "*" -mistune = "0.8.4" - -[[package]] -name = "markupsafe" -version = "2.1.1" -description = "Safely add untrusted strings to HTML/XML markup." -category = "dev" -optional = false -python-versions = ">=3.7" - [[package]] name = "mccabe" version = "0.6.1" @@ -381,7 +199,7 @@ python-versions = "*" [[package]] name = "minos-microservice-aggregate" -version = "0.6.0" +version = "0.7.0" description = "The Aggregate pattern of the Minos Framework" category = "main" optional = false @@ -390,9 +208,8 @@ develop = true [package.dependencies] cached-property = "^1.5.2" -minos-microservice-common = "^0.6.0" -minos-microservice-networks = "^0.6.0" -psycopg2-binary = "^2.9.3" +minos-microservice-common = "^0.7.0*" +minos-microservice-networks = "^0.7.0*" [package.source] type = "directory" @@ -400,7 +217,7 @@ url = "../minos-microservice-aggregate" [[package]] name = "minos-microservice-common" -version = "0.6.0" +version = "0.7.0" description = "The common core of the Minos Framework" category = "main" optional = false @@ -408,12 +225,10 @@ python-versions = "^3.9" develop = true [package.dependencies] -aiomisc = ">=14.0.3,<16.0.0" -aiopg = "^1.2.1" +aiomisc = ">=14.0.3,<15.8.0" cached-property = "^1.5.2" dependency-injector = "^4.32.2" fastavro = "^1.4.0" -lmdb = "^1.2.1" orjson = "^3.5.2" PyYAML = ">=5.4.1,<7.0.0" uvloop = "^0.16.0" @@ -424,7 +239,7 @@ url = "../minos-microservice-common" [[package]] name = "minos-microservice-networks" -version = "0.6.0" +version = "0.7.0" description = "The networks core of the Minos Framework" category = "main" optional = false @@ -432,23 +247,13 @@ python-versions = "^3.9" develop = true [package.dependencies] -aiopg = "^1.2.1" crontab = "^0.23.0" -minos-microservice-common = "^0.6.0" -psycopg2-binary = "^2.9.3" +minos-microservice-common = "^0.7.0*" [package.source] type = "directory" url = "../minos-microservice-networks" -[[package]] -name = "mistune" -version = "0.8.4" -description = "The fastest markdown parser in pure Python" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "mypy-extensions" version = "0.4.3" @@ -457,17 +262,9 @@ category = "dev" optional = false python-versions = "*" -[[package]] -name = "nodeenv" -version = "1.6.0" -description = "Node.js virtual environment builder" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "orjson" -version = "3.6.7" +version = "3.6.8" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" category = "main" optional = false @@ -492,25 +289,17 @@ category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -[[package]] -name = "pbr" -version = "5.8.1" -description = "Python Build Reasonableness" -category = "dev" -optional = false -python-versions = ">=2.6" - [[package]] name = "platformdirs" -version = "2.5.1" +version = "2.5.2" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" [package.extras] -docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] +test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] [[package]] name = "pluggy" @@ -524,30 +313,6 @@ python-versions = ">=3.6" dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] -[[package]] -name = "pre-commit" -version = "2.17.0" -description = "A framework for managing and maintaining multi-language pre-commit hooks." -category = "dev" -optional = false -python-versions = ">=3.6.1" - -[package.dependencies] -cfgv = ">=2.0.0" -identify = ">=1.0.0" -nodeenv = ">=0.11.1" -pyyaml = ">=5.1" -toml = "*" -virtualenv = ">=20.0.8" - -[[package]] -name = "psycopg2-binary" -version = "2.9.3" -description = "psycopg2 - Python-PostgreSQL Database Adapter" -category = "main" -optional = false -python-versions = ">=3.6" - [[package]] name = "py" version = "1.11.0" @@ -572,28 +337,20 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -[[package]] -name = "pygments" -version = "2.11.2" -description = "Pygments is a syntax highlighting package written in Python." -category = "dev" -optional = false -python-versions = ">=3.5" - [[package]] name = "pyparsing" -version = "3.0.7" -description = "Python parsing module" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.6.8" [package.extras] -diagrams = ["jinja2", "railroad-diagrams"] +diagrams = ["railroad-diagrams", "jinja2"] [[package]] name = "pytest" -version = "7.1.1" +version = "7.1.2" description = "pytest: simple powerful testing with Python" category = "dev" optional = false @@ -612,14 +369,6 @@ tomli = ">=1.0.0" [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] -[[package]] -name = "pytz" -version = "2022.1" -description = "World timezone definitions, modern and historical" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "pyyaml" version = "6.0" @@ -628,24 +377,6 @@ category = "main" optional = false python-versions = ">=3.6" -[[package]] -name = "requests" -version = "2.27.1" -description = "Python HTTP for Humans." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} -urllib3 = ">=1.21.1,<1.27" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] - [[package]] name = "six" version = "1.16.0" @@ -654,167 +385,6 @@ category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -[[package]] -name = "snowballstemmer" -version = "2.2.0" -description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "sphinx" -version = "4.5.0" -description = "Python documentation generator" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -alabaster = ">=0.7,<0.8" -babel = ">=1.3" -colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.14,<0.18" -imagesize = "*" -importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} -Jinja2 = ">=2.3" -packaging = "*" -Pygments = ">=2.0" -requests = ">=2.5.0" -snowballstemmer = ">=1.1" -sphinxcontrib-applehelp = "*" -sphinxcontrib-devhelp = "*" -sphinxcontrib-htmlhelp = ">=2.0.0" -sphinxcontrib-jsmath = "*" -sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = ">=1.1.5" - -[package.extras] -docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.931)", "docutils-stubs", "types-typed-ast", "types-requests"] -test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] - -[[package]] -name = "sphinx-autodoc-typehints" -version = "1.17.0" -description = "Type hints (PEP 484) support for the Sphinx autodoc extension" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -Sphinx = ">=4" - -[package.extras] -testing = ["covdefaults (>=2)", "coverage (>=6)", "diff-cover (>=6.4)", "nptyping (>=1)", "pytest (>=6)", "pytest-cov (>=3)", "sphobjinv (>=2)", "typing-extensions (>=3.5)"] -type_comments = ["typed-ast (>=1.4.0)"] - -[[package]] -name = "sphinx-rtd-theme" -version = "1.0.0" -description = "Read the Docs theme for Sphinx" -category = "dev" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" - -[package.dependencies] -docutils = "<0.18" -sphinx = ">=1.6" - -[package.extras] -dev = ["transifex-client", "sphinxcontrib-httpdomain", "bump2version"] - -[[package]] -name = "sphinxcontrib-apidoc" -version = "0.3.0" -description = "A Sphinx extension for running 'sphinx-apidoc' on each build" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -pbr = "*" -Sphinx = ">=1.6.0" - -[[package]] -name = "sphinxcontrib-applehelp" -version = "1.0.2" -description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-devhelp" -version = "1.0.2" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-htmlhelp" -version = "2.0.0" -description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest", "html5lib"] - -[[package]] -name = "sphinxcontrib-jsmath" -version = "1.0.1" -description = "A sphinx extension which renders display math in HTML via JavaScript" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -test = ["pytest", "flake8", "mypy"] - -[[package]] -name = "sphinxcontrib-qthelp" -version = "1.0.3" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-serializinghtml" -version = "1.1.5" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - [[package]] name = "tomli" version = "2.0.1" @@ -825,24 +395,11 @@ python-versions = ">=3.7" [[package]] name = "typing-extensions" -version = "4.1.1" -description = "Backported and Experimental Type Hints for Python 3.6+" +version = "4.2.0" +description = "Backported and Experimental Type Hints for Python 3.7+" category = "dev" optional = false -python-versions = ">=3.6" - -[[package]] -name = "urllib3" -version = "1.26.9" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" - -[package.extras] -brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +python-versions = ">=3.7" [[package]] name = "uvloop" @@ -857,58 +414,16 @@ dev = ["Cython (>=0.29.24,<0.30.0)", "pytest (>=3.6.0)", "Sphinx (>=4.1.2,<4.2.0 docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)"] test = ["aiohttp", "flake8 (>=3.9.2,<3.10.0)", "psutil", "pycodestyle (>=2.7.0,<2.8.0)", "pyOpenSSL (>=19.0.0,<19.1.0)", "mypy (>=0.800)"] -[[package]] -name = "virtualenv" -version = "20.14.0" -description = "Virtual Python Environment builder" -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - -[package.dependencies] -distlib = ">=0.3.1,<1" -filelock = ">=3.2,<4" -platformdirs = ">=2,<3" -six = ">=1.9.0,<2" - -[package.extras] -docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=21.3)"] -testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)"] - -[[package]] -name = "zipp" -version = "3.7.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] - [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "f59b3c5c588ce969df14fed260965c6573d9ab3ba6e755966d45736cf3aeb3c7" +content-hash = "9c4e0c0e329efda161e7508ce5f9c895804c0ac5586971be2c10cb2298b07a7a" [metadata.files] aiomisc = [ {file = "aiomisc-15.7.3-py3-none-any.whl", hash = "sha256:0403e83268e98d0f2a125a70d13303fe1a2358e36db3daf02df032c7fa4f1525"}, {file = "aiomisc-15.7.3.tar.gz", hash = "sha256:ba250a34bd4609ced36111cb50580f57c3d52f3955f953a53ecb2986988baedc"}, ] -aiopg = [ - {file = "aiopg-1.3.3-py3-none-any.whl", hash = "sha256:2842dd8741460eeef940032dcb577bfba4d4115205dd82a73ce13b3271f5bf0a"}, - {file = "aiopg-1.3.3.tar.gz", hash = "sha256:547c6ba4ea0d73c2a11a2f44387d7133cc01d3c6f3b8ed976c0ac1eff4f595d7"}, -] -alabaster = [ - {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, - {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, -] -async-timeout = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, -] atomicwrites = [ {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, @@ -917,54 +432,38 @@ attrs = [ {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] -babel = [ - {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"}, - {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, -] black = [ - {file = "black-22.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1297c63b9e1b96a3d0da2d85d11cd9bf8664251fd69ddac068b98dc4f34f73b6"}, - {file = "black-22.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2ff96450d3ad9ea499fc4c60e425a1439c2120cbbc1ab959ff20f7c76ec7e866"}, - {file = "black-22.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e21e1f1efa65a50e3960edd068b6ae6d64ad6235bd8bfea116a03b21836af71"}, - {file = "black-22.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f69158a7d120fd641d1fa9a921d898e20d52e44a74a6fbbcc570a62a6bc8ab"}, - {file = "black-22.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:228b5ae2c8e3d6227e4bde5920d2fc66cc3400fde7bcc74f480cb07ef0b570d5"}, - {file = "black-22.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b1a5ed73ab4c482208d20434f700d514f66ffe2840f63a6252ecc43a9bc77e8a"}, - {file = "black-22.1.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35944b7100af4a985abfcaa860b06af15590deb1f392f06c8683b4381e8eeaf0"}, - {file = "black-22.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7835fee5238fc0a0baf6c9268fb816b5f5cd9b8793423a75e8cd663c48d073ba"}, - {file = "black-22.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dae63f2dbf82882fa3b2a3c49c32bffe144970a573cd68d247af6560fc493ae1"}, - {file = "black-22.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fa1db02410b1924b6749c245ab38d30621564e658297484952f3d8a39fce7e8"}, - {file = "black-22.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c8226f50b8c34a14608b848dc23a46e5d08397d009446353dad45e04af0c8e28"}, - {file = "black-22.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2d6f331c02f0f40aa51a22e479c8209d37fcd520c77721c034517d44eecf5912"}, - {file = "black-22.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:742ce9af3086e5bd07e58c8feb09dbb2b047b7f566eb5f5bc63fd455814979f3"}, - {file = "black-22.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fdb8754b453fb15fad3f72cd9cad3e16776f0964d67cf30ebcbf10327a3777a3"}, - {file = "black-22.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5660feab44c2e3cb24b2419b998846cbb01c23c7fe645fee45087efa3da2d61"}, - {file = "black-22.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:6f2f01381f91c1efb1451998bd65a129b3ed6f64f79663a55fe0e9b74a5f81fd"}, - {file = "black-22.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:efbadd9b52c060a8fc3b9658744091cb33c31f830b3f074422ed27bad2b18e8f"}, - {file = "black-22.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8871fcb4b447206904932b54b567923e5be802b9b19b744fdff092bd2f3118d0"}, - {file = "black-22.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccad888050f5393f0d6029deea2a33e5ae371fd182a697313bdbd835d3edaf9c"}, - {file = "black-22.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07e5c049442d7ca1a2fc273c79d1aecbbf1bc858f62e8184abe1ad175c4f7cc2"}, - {file = "black-22.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:373922fc66676133ddc3e754e4509196a8c392fec3f5ca4486673e685a421321"}, - {file = "black-22.1.0-py3-none-any.whl", hash = "sha256:3524739d76b6b3ed1132422bf9d82123cd1705086723bc3e235ca39fd21c667d"}, - {file = "black-22.1.0.tar.gz", hash = "sha256:a7c0192d35635f6fc1174be575cb7915e92e5dd629ee79fdaf0dcfa41a80afb5"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"}, + {file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"}, + {file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"}, + {file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"}, + {file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"}, + {file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"}, + {file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"}, + {file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"}, + {file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"}, + {file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"}, + {file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"}, + {file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"}, + {file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"}, + {file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"}, + {file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"}, + {file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"}, + {file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"}, + {file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"}, ] cached-property = [ {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, ] -certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, -] -cfgv = [ - {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, - {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, - {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, -] click = [ - {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"}, - {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, ] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, @@ -1021,93 +520,65 @@ crontab = [ {file = "crontab-0.23.0.tar.gz", hash = "sha256:ca79dede9c2f572bb32f38703e8fddcf3427e86edc838f2ffe7ae4b9ee2b0733"}, ] dependency-injector = [ - {file = "dependency-injector-4.39.0.tar.gz", hash = "sha256:35d6c03683f512bcc8b0c950890ac40ce19bdacc7de4d59249dd61ed818f0930"}, - {file = "dependency_injector-4.39.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f046a5dbe7e5764fae9a69423f66241a8fdb62acea5c32b0c41a7da94b7f6da3"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfdd78f7d97c1f6ba4a3926a2e404507a4f77ecbd610d4a1b37dedb5c0b57ad1"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:512c23da829bb8ac2ae13f33aa017acf58ae9408e7796a146e1644e8b8471b5b"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7dc81df7f566bfdacdee448bc71085acd163b935860d2b2504b4f32840b3b692"}, - {file = "dependency_injector-4.39.0-cp310-cp310-win32.whl", hash = "sha256:9ffc5393700f45d740abecc50cdc1251eae69e50516ec9d0a48fba0e875ed083"}, - {file = "dependency_injector-4.39.0-cp310-cp310-win_amd64.whl", hash = "sha256:9118f36a3df1e9819074ccb35734d663812c8f6ef81d45c8e4ec81ce5dccac9c"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:1ff723aaf096fabb05cf8b08ba99888538a2a77e03a5082b70cd54eb9df619f3"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bb913900ceb1766f55dc628052d8e191a9c2b1737a0d775fbc230af90ab2c1e"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:329e801eb46b9933432481d3142e563e28a90d77952edac43126264c36ed2278"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1c1a67c699ae2c0234f07d121736fa44e8fe2d56c14b2fd210c3e04a151620bb"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-win32.whl", hash = "sha256:e1347defd46fe9067f857b1174bdb1b19458232ac1a485507df2ddff084cf31c"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-win_amd64.whl", hash = "sha256:9581c4c90f1aaf85ffb9b06bac7ac592df7076522881145321a9dd0702fee828"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8da8ff05fa17e852aa5831a600177e5bb72bf53b8a184f6922ae715387a460ba"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58a56999cebd8b2ba9c19e514e383924865e5f7d6273f8e5b7d85468d9042059"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4914332d6145fb7cfc5f2236a823a3859b92a7e75566ffca0987dcc0f7f7be53"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00aea40ee2d400a8091947ad97cda34b230628aeeac1774f8fa9a3500b5704b2"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-win32.whl", hash = "sha256:b94a64bc73d86d04b33c698fae4b9dad2536a8534ac6922c8226764da5d62d17"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4f59cc0b0d3beb82875d94b7e725b5097a7a454e8e323625ba6ac3095a29300e"}, - {file = "dependency_injector-4.39.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a8d840348f01d997e32394dba36e09c1ecd312b286befb6b3ca27526002ae94"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92097ffabca89d1539e200f91bfa13ff8ca502c9057391c3b78787d50fe502ed"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4a889e116fe76742ef6ff27d5e93ee9e364cbe7bbc6678df8c5dd54597a6fc"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a31e00961fdc1b3808a9e2adeb1107ec4bba0ad3a90b116af9d116a667e4626a"}, - {file = "dependency_injector-4.39.0-cp38-cp38-win32.whl", hash = "sha256:717720a220eee611ea96c0089246ec2103b168303ca2cd2c8a7cd3856da6f689"}, - {file = "dependency_injector-4.39.0-cp38-cp38-win_amd64.whl", hash = "sha256:05c0bbef90182a0d35d4d3f9ab879109070d204394578b12f0eff9eca51987ef"}, - {file = "dependency_injector-4.39.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f10bf8d146edffbee2ba5c5776395625c98048a31997afd481ce27792afee2af"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30c093b155c01e50723e8ecd2a14230daa4417356c8fb5a27369ae5be24b21d9"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dda8a85c8221e6ee433caa01c1bc4fed610381924780e04470572682569cdb8f"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ff8df47a901218a3257650f3f3a6b402dd58cb4f57b4a34d6e8092112f6e8480"}, - {file = "dependency_injector-4.39.0-cp39-cp39-win32.whl", hash = "sha256:e078c84c19ae73883a57e9b35edd843925b2b44833cd098708139a98abee5a96"}, - {file = "dependency_injector-4.39.0-cp39-cp39-win_amd64.whl", hash = "sha256:c02b6796320d6b9363d566045eeec243fa4a412ad68dcc6b2391307e93d0d401"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:865bf5ceba3e32f00e36bfcbefb1267b10df961fb2aab809f5e205968e1cd59b"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ce8645ffd8cc15a7bbd20c02e6439a61c1566a1db22766893bf79981fb89a4e"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dbdab8b024055865926a78ecbc3a6280345f4615e5c505511bbd7c6c322b1796"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:af996d66350704261382dc4e10f324eba5d23e35c04a9e75c7cb58fbea7f1f1d"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d390c6e97fec13fba832b7e39e07c43760ed3d46af4887005f679c0ab6eb9b2e"}, -] -distlib = [ - {file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"}, - {file = "distlib-0.3.4.zip", hash = "sha256:e4b58818180336dc9c529bfb9a0b58728ffc09ad92027a3f30b7cd91e3458579"}, -] -docutils = [ - {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, - {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, + {file = "dependency-injector-4.39.1.tar.gz", hash = "sha256:9ab76dc5e19b2692aaca49e00f9b41a087138d139b0ec985f92ff0498f038772"}, + {file = "dependency_injector-4.39.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c788a3d5482e63b5fd55e14fc258f1ff0b51b411927ab132ef0f689cb5d1183f"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0832e0457a360725cd1d1037b77b85478aeeaacc60e85ecceeb8020409e7b62"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d51998fff9704fd01d11c3c48f4e88d8506cb6afa1ee41409a881a5a51dae3fc"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea484cd13fc62966bf5582df0816205feee072d18f228aac75f7807b43f223ae"}, + {file = "dependency_injector-4.39.1-cp310-cp310-win32.whl", hash = "sha256:17389e53ec29ca13570319cf2065dcc4c2f6d36db5dd792bb1e8f2c39a9f146b"}, + {file = "dependency_injector-4.39.1-cp310-cp310-win_amd64.whl", hash = "sha256:55b0988489267c5a580f419133770ffe293057f2064da1c9ad6a2cc69666739b"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b297c3e79d3633cc56366386ae1f7dbce1587673cca2f559c368c1e936a1fa94"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2728827c5abb2420c5811e218262ae1b77a48e76cc9eebc6b4f55fee48a1a18d"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:029e42b064ab8cb5b2559be040ff682c7aa81592f1654a82355475956df17803"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:305e3db3f4bf40f64caaa1303e03005174e78d2339d2ae517b34c011ec2300f9"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-win32.whl", hash = "sha256:a661dd23a5e4e2f6bf4a729de7fadbe148c9a4a298dbcadfc5a94584b6930970"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-win_amd64.whl", hash = "sha256:340d6e7af5c4729d20c837d6d1e8a2626c24a05259dff746406cc823e26ba1e7"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a1553dac1c95f0de1f910b0025ee4570ea078a07d576bcdc2168990e719cea50"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c7baaa64d93359ee08c15d68579cc803e11d9becaf961f5a66b94ff627248e1"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7a27bf1951a066cf347b886cc7ab0f37dcbd1ad59bffcfe721c8c12a189a150d"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da6e2d685f7d0c65257f08133b68d9bf74ec319b90a0f21b4f629d168ce5f68f"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-win32.whl", hash = "sha256:a8ddd03ca86e67e9d3cc038793d34fbfccab12e6145df813e72bf14f9371f2ea"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-win_amd64.whl", hash = "sha256:e01a319ea05cd86b520201386dcb53a81a5400cb82fcc2f006bd7e92c0c51a0a"}, + {file = "dependency_injector-4.39.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4704804bde25b694aa65201927937a9d82d8bc055cb3dadc68eb05988bd34fa9"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0935d50b263169e7b0826a2fb6be80d6a4f2a7c59e6dd9876f86da3243bea9eb"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3c34aa5abb1826b6189f47daf6e469d4293c1d01693233da2c1b923816270cc5"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:db64904c9b9a88756cfece3e3ed078a2b57127642711dd08af342dba8abf9667"}, + {file = "dependency_injector-4.39.1-cp38-cp38-win32.whl", hash = "sha256:66ebe728194adc8720dbc4d662edbbfa55659ff23c9c493fb2dae0bfd4df5734"}, + {file = "dependency_injector-4.39.1-cp38-cp38-win_amd64.whl", hash = "sha256:4349974620f630d6726808e1291ec99713b64d449b84eb01581ee807a5a5c224"}, + {file = "dependency_injector-4.39.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d87cad0899b05cd08931bfb68ddf7be77711a67b0649c37f2045d7808977b082"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8efd965e5cfdd9f339ec895e73c119569851adedc175088d34a670f5206fea63"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:27f69485ca6b85c31d162ee86cf6ef71bb71dce9cd2b5d0745425dfc551eefa1"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a25b63de59dff04ec78f5161f00c0222a04a23def5d1f0eda14e389a32baf428"}, + {file = "dependency_injector-4.39.1-cp39-cp39-win32.whl", hash = "sha256:a14274f50d125b4579314c355e22af07def1a96641ca94bd75edcf1400b89477"}, + {file = "dependency_injector-4.39.1-cp39-cp39-win_amd64.whl", hash = "sha256:9950039d00625f9252cd26378a4406342b256886bb61e4db8b65e9f01270f53e"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6d7f39cd54678741e132e13da3a1367ac18058cbda61fe39d61c8583aa6fd757"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2368c7ba3c9ffaf816ea0f2d14c78d481491b805f62ac8496a78a51397d4689"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:84e32407bb16c58aa0d4b5ed8485537bc66ccc14cfffae7022f1204e35ec939a"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f2d80a42c546e1f934d427b071630d86653cd4a60c74b570c4ffb03025c1f1f9"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ca126bbed370b8c002c859ebeb76f6d83eba2d7fb5d66f37f47cfc19661d2889"}, ] fastavro = [ - {file = "fastavro-1.4.10-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:f225c81e869b3cefef6f2b478cd452693181ed7e645be3cea4d82024354ecaa0"}, - {file = "fastavro-1.4.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7669302c9124b7cd6c1bdff80c77116b2290c984814077fb7d01d7389586054"}, - {file = "fastavro-1.4.10-cp310-cp310-win_amd64.whl", hash = "sha256:995525bdfbdfef205ea148b5bc6a9fe5ccf921931123c39d9aad75a2b661681e"}, - {file = "fastavro-1.4.10-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:64244c53f1e4853184c2f7383d0332e1dcb34c38c05e6613530ade0378e8acfc"}, - {file = "fastavro-1.4.10-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c60965da6dc7a91e00ccd84d84797fad746555f44e8a816c4cc460fb231c44fe"}, - {file = "fastavro-1.4.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10eb25378f37dc00c10e83c4c0442c1a6d1b871f74a6dfdfc12b6447962bbdd0"}, - {file = "fastavro-1.4.10-cp37-cp37m-win_amd64.whl", hash = "sha256:d5719adf6045fc743de5fa738d561a81e58dc782c94f1b16cb21b5dd6253e7fd"}, - {file = "fastavro-1.4.10-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:24c4a1a8cc92e135ecfcd9cbd1f6cfa088cbc74d78c18e02a609cb11fa33778d"}, - {file = "fastavro-1.4.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0934490b0c3bcfd6bcbacbcb5144c6b5e4298cda209fbb17c856adf5405127dd"}, - {file = "fastavro-1.4.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a23763d73412c077aee401a0368c64cbc23859e26711dbae78a3cf0227f65165"}, - {file = "fastavro-1.4.10-cp38-cp38-win_amd64.whl", hash = "sha256:09f1dfdd8192ae09e0f477d1f024d8054fccdb099ad495d2a796bcee3cadebd1"}, - {file = "fastavro-1.4.10-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:0c6695753fa3035bbd0fa5cb21bf1b5dad39483c669b32ca0bb55fb07c1ccc87"}, - {file = "fastavro-1.4.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35f960dbba04647d8d6d5616f879622d2a1e8a84eb2d2e02a883a22e0803463a"}, - {file = "fastavro-1.4.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9660878ca01e3dbbee12385c5902a2b6b12ecbb5af4733d1026175a14b1ef67f"}, - {file = "fastavro-1.4.10-cp39-cp39-win_amd64.whl", hash = "sha256:64cbd386e408b3bcb2de53b1f847163073eb0d0d0338db65f76051c6ba9a9bc1"}, - {file = "fastavro-1.4.10.tar.gz", hash = "sha256:a24f9dd803c44bfb599476b000f9bd0088f7ac2401e6c20818f38d8af12785a0"}, -] -filelock = [ - {file = "filelock-3.6.0-py3-none-any.whl", hash = "sha256:f8314284bfffbdcfa0ff3d7992b023d4c628ced6feb957351d4c48d059f56bc0"}, - {file = "filelock-3.6.0.tar.gz", hash = "sha256:9cd540a9352e432c7246a48fe4e8712b10acb1df2ad1f30e8c070b82ae1fed85"}, + {file = "fastavro-1.4.11-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:44f01008f95d685edacc4b10366c755d25612df00924349f7d34a29f08522ce3"}, + {file = "fastavro-1.4.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18f5e736d12e67348f253da8a332d7c3b483ca04f2b6e772befa79d1a46bac9d"}, + {file = "fastavro-1.4.11-cp310-cp310-win_amd64.whl", hash = "sha256:8dca11bc3191cd7de0a3c4b76a70dac493356a219e96ebcde0def1f06faddef7"}, + {file = "fastavro-1.4.11-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:7a2a0bf03686f9d860e8f8476be000f5b3e6cc9af6853dbabab2ef9cfa5dc3a0"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c17e3decfac260e1be4d02d1903d2483eec2f3ce7f92c9b808a0f6a81572c4b"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19ba25c6529f50722a7618cc4ca24c7d265def57fd9f94e4e554e1df8cce38d2"}, + {file = "fastavro-1.4.11-cp37-cp37m-win_amd64.whl", hash = "sha256:ceaba04da9419f40899a670eb62eb373a127b511bb8e3ae4f6f1f23ec49bd0e4"}, + {file = "fastavro-1.4.11-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:732eab3a1ae5d2c3f4b52e747c55bcc41c4df0eb7e8a395038080741a3c0a934"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c03d3c802b71f44e7b3442abae961bba996258244bd222b242ad1e5cb7754e57"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cb7475a9b25b9f8aebe7eb756dafedd0369434571062f3883d894281befd7c"}, + {file = "fastavro-1.4.11-cp38-cp38-win_amd64.whl", hash = "sha256:ce0776f54591aef90bcd02bd919964abe4c2ad2a10a4336c3a1b66cef289b41c"}, + {file = "fastavro-1.4.11-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:621e72cc365c9539d7590e7b43e48a62e6bfb4c2de7c16837fed54d113d7312c"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:842b25782f911ee8c626f9d9fedc2ef01aeac272536fe90ee6d45b2ae7cdb024"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8491bfcba25c9d661289f884688e5a4f56f2ee389a240d0ad02692495a9a087"}, + {file = "fastavro-1.4.11-cp39-cp39-win_amd64.whl", hash = "sha256:c94130a8c8d80073eb0276844915aa5e928ae322024e76dc57943542ccda211c"}, + {file = "fastavro-1.4.11.tar.gz", hash = "sha256:7c64332ad52de0134be9a933ca986514c3ff85c63d54bc5398c31f0498ac1820"}, ] flake8 = [ {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, ] -identify = [ - {file = "identify-2.4.12-py2.py3-none-any.whl", hash = "sha256:5f06b14366bd1facb88b00540a1de05b69b310cbc2654db3c7e07fa3a4339323"}, - {file = "identify-2.4.12.tar.gz", hash = "sha256:3f3244a559290e7d3deb9e9adc7b33594c1bc85a9dd82e0f1be519bf12a1ec17"}, -] -idna = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, -] -imagesize = [ - {file = "imagesize-1.3.0-py2.py3-none-any.whl", hash = "sha256:1db2f82529e53c3e929e8926a1fa9235aa82d0bd0c580359c67ec31b2fddaa8c"}, - {file = "imagesize-1.3.0.tar.gz", hash = "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d"}, -] -importlib-metadata = [ - {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, - {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, -] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, @@ -1116,85 +587,6 @@ isort = [ {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, ] -jinja2 = [ - {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"}, - {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"}, -] -lmdb = [ - {file = "lmdb-1.3.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:63cb73fe7ce9eb93d992d632c85a0476b4332670d9e6a2802b5062f603b7809f"}, - {file = "lmdb-1.3.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:abbc439cd9fe60ffd6197009087ea885ac150017dc85384093b1d376f83f0ec4"}, - {file = "lmdb-1.3.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6260a526e4ad85b1f374a5ba9475bf369fb07e7728ea6ec57226b02c40d1976b"}, - {file = "lmdb-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e568ae0887ae196340947d9800136e90feaed6b86a261ef01f01b2ba65fc8106"}, - {file = "lmdb-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6a816954d212f40fd15007cd81ab7a6bebb77436d949a6a9ae04af57fc127f3"}, - {file = "lmdb-1.3.0-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:fa6439356e591d3249ab0e1778a6f8d8408e993f66dc911914c78208f5310309"}, - {file = "lmdb-1.3.0-cp35-cp35m-win_amd64.whl", hash = "sha256:c6adbd6f7f9048e97f31a069e652eb51020a81e80a0ce92dbb9810d21da2409a"}, - {file = "lmdb-1.3.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:eefb392f6b5cd43aada49258c5a79be11cb2c8cd3fc3e2d9319a1e0b9f906458"}, - {file = "lmdb-1.3.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a14aca2651c3af6f0d0a6b9168200eea0c8f2d27c40b01a442f33329a6e8dff"}, - {file = "lmdb-1.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cfa4aa9c67f8aee89b23005e98d1f3f32490b6b905fd1cb604b207cbd5755ab"}, - {file = "lmdb-1.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7da05d70fcc6561ac6b09e9fb1bf64b7ca294652c64c8a2889273970cee796b9"}, - {file = "lmdb-1.3.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:008243762decf8f6c90430a9bced56290ebbcdb5e877d90e42343bb97033e494"}, - {file = "lmdb-1.3.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:17215a42a4b9814c383deabecb160581e4fb75d00198eef0e3cea54f230ffbea"}, - {file = "lmdb-1.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65334eafa5d430b18d81ebd5362559a41483c362e1931f6e1b15bab2ecb7d75d"}, - {file = "lmdb-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:18c69fabdaf04efaf246587739cc1062b3e57c6ef0743f5c418df89e5e7e7b9b"}, - {file = "lmdb-1.3.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:41318717ab5d15ad2d6d263d34fbf614a045210f64b25e59ce734bb2105e421f"}, - {file = "lmdb-1.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:df2724bad7820114a205472994091097d0fa65a3e5fff5a8e688d123fb8c6326"}, - {file = "lmdb-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ddd590e1c7fcb395931aa3782fb89b9db4550ab2d81d006ecd239e0d462bc41"}, - {file = "lmdb-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:4172fba19417d7b29409beca7d73c067b54e5d8ab1fb9b51d7b4c1445d20a167"}, - {file = "lmdb-1.3.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2df38115dd9428a54d59ae7c712a4c7cce0d6b1d66056de4b1a8c38718066106"}, - {file = "lmdb-1.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d9103aa4908f0bca43c5911ca067d4e3d01f682dff0c0381a1239bd2bd757984"}, - {file = "lmdb-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:394df860c3f93cfd92b6f4caba785f38208cc9614c18b3803f83a2cc1695042f"}, - {file = "lmdb-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:62ab28e3593bdc318ea2f2fa1574e5fca3b6d1f264686d773ba54a637d4f563b"}, - {file = "lmdb-1.3.0-pp27-pypy_73-macosx_10_7_x86_64.whl", hash = "sha256:e6a704b3baced9182836c7f77b769f23856f3a8f62d0282b1bc1feaf81a86712"}, - {file = "lmdb-1.3.0-pp27-pypy_73-win_amd64.whl", hash = "sha256:08f4b5129f4683802569b02581142e415c8dcc0ff07605983ec1b07804cecbad"}, - {file = "lmdb-1.3.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:f291e3f561f58dddf63a92a5a6a4b8af3a0920b6705d35e2f80e52e86ee238a2"}, - {file = "lmdb-1.3.0.tar.gz", hash = "sha256:60a11efc21aaf009d06518996360eed346f6000bfc9de05114374230879f992e"}, -] -m2r2 = [ - {file = "m2r2-0.3.2-py3-none-any.whl", hash = "sha256:d3684086b61b4bebe2307f15189495360f05a123c9bda2a66462649b7ca236aa"}, - {file = "m2r2-0.3.2.tar.gz", hash = "sha256:ccd95b052dcd1ac7442ecb3111262b2001c10e4119b459c34c93ac7a5c2c7868"}, -] -markupsafe = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, -] mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, @@ -1202,51 +594,43 @@ mccabe = [ minos-microservice-aggregate = [] minos-microservice-common = [] minos-microservice-networks = [] -mistune = [ - {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, - {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, -] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] -nodeenv = [ - {file = "nodeenv-1.6.0-py2.py3-none-any.whl", hash = "sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"}, - {file = "nodeenv-1.6.0.tar.gz", hash = "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b"}, -] orjson = [ - {file = "orjson-3.6.7-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:93188a9d6eb566419ad48befa202dfe7cd7a161756444b99c4ec77faea9352a4"}, - {file = "orjson-3.6.7-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:82515226ecb77689a029061552b5df1802b75d861780c401e96ca6bc8495f775"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3af57ffab7848aaec6ba6b9e9b41331250b57bf696f9d502bacdc71a0ebab0ba"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:a7297504d1142e7efa236ffc53f056d73934a993a08646dbcee89fc4308a8fcf"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:5a50cde0dbbde255ce751fd1bca39d00ecd878ba0903c0480961b31984f2fab7"}, - {file = "orjson-3.6.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d21f9a2d1c30e58070f93988db4cad154b9009fafbde238b52c1c760e3607fbe"}, - {file = "orjson-3.6.7-cp310-none-win_amd64.whl", hash = "sha256:e152464c4606b49398afd911777decebcf9749cc8810c5b4199039e1afb0991e"}, - {file = "orjson-3.6.7-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:0a65f3c403f38b0117c6dd8e76e85a7bd51fcd92f06c5598dfeddbc44697d3e5"}, - {file = "orjson-3.6.7-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:6c47cfca18e41f7f37b08ff3e7abf5ada2d0f27b5ade934f05be5fc5bb956e9d"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:63185af814c243fad7a72441e5f98120c9ecddf2675befa486d669fb65539e9b"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2da6fde42182b80b40df2e6ab855c55090ebfa3fcc21c182b7ad1762b61d55c"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:48c5831ec388b4e2682d4ff56d6bfa4a2ef76c963f5e75f4ff4785f9cf338a80"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:913fac5d594ccabf5e8fbac15b9b3bb9c576d537d49eeec9f664e7a64dde4c4b"}, - {file = "orjson-3.6.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:58f244775f20476e5851e7546df109f75160a5178d44257d437ba6d7e562bfe8"}, - {file = "orjson-3.6.7-cp37-none-win_amd64.whl", hash = "sha256:2d5f45c6b85e5f14646df2d32ecd7ff20fcccc71c0ea1155f4d3df8c5299bbb7"}, - {file = "orjson-3.6.7-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:612d242493afeeb2068bc72ff2544aa3b1e627578fcf92edee9daebb5893ffea"}, - {file = "orjson-3.6.7-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:539cdc5067db38db27985e257772d073cd2eb9462d0a41bde96da4e4e60bd99b"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6d103b721bbc4f5703f62b3882e638c0b65fcdd48622531c7ffd45047ef8e87c"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb10a20f80e95102dd35dfbc3a22531661b44a09b55236b012a446955846b023"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:bb68d0da349cf8a68971a48ad179434f75256159fe8b0715275d9b49fa23b7a3"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:4a2c7d0a236aaeab7f69c17b7ab4c078874e817da1bfbb9827cb8c73058b3050"}, - {file = "orjson-3.6.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3be045ca3b96119f592904cf34b962969ce97bd7843cbfca084009f6c8d2f268"}, - {file = "orjson-3.6.7-cp38-none-win_amd64.whl", hash = "sha256:bd765c06c359d8a814b90f948538f957fa8a1f55ad1aaffcdc5771996aaea061"}, - {file = "orjson-3.6.7-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:7dd9e1e46c0776eee9e0649e3ae9584ea368d96851bcaeba18e217fa5d755283"}, - {file = "orjson-3.6.7-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:c4b4f20a1e3df7e7c83717aff0ef4ab69e42ce2fb1f5234682f618153c458406"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7107a5673fd0b05adbb58bf71c1578fc84d662d29c096eb6d998982c8635c221"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a08b6940dd9a98ccf09785890112a0f81eadb4f35b51b9a80736d1725437e22c"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:f5d1648e5a9d1070f3628a69a7c6c17634dbb0caf22f2085eca6910f7427bf1f"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:e6201494e8dff2ce7fd21da4e3f6dfca1a3fed38f9dcefc972f552f6596a7621"}, - {file = "orjson-3.6.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:70d0386abe02879ebaead2f9632dd2acb71000b4721fd8c1a2fb8c031a38d4d5"}, - {file = "orjson-3.6.7-cp39-none-win_amd64.whl", hash = "sha256:d9a3288861bfd26f3511fb4081561ca768674612bac59513cb9081bb61fcc87f"}, - {file = "orjson-3.6.7.tar.gz", hash = "sha256:a4bb62b11289b7620eead2f25695212e9ac77fcfba76f050fa8a540fb5c32401"}, + {file = "orjson-3.6.8-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:3a287a650458de2211db03681b71c3e5cb2212b62f17a39df8ad99fc54855d0f"}, + {file = "orjson-3.6.8-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:5204e25c12cea58e524fc82f7c27ed0586f592f777b33075a92ab7b3eb3687c2"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77e8386393add64f959c044e0fb682364fd0e611a6f477aa13f0e6a733bd6a28"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:279f2d2af393fdf8601020744cb206b91b54ad60fb8401e0761819c7bda1f4e4"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:c31c9f389be7906f978ed4192eb58a4b74a37ad60556a0b88ddc47c576697770"}, + {file = "orjson-3.6.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0db5c5a0c5b89f092d52f6e5a3701660a9d6ffa9e2968b3ce17c2bc4f5eb0414"}, + {file = "orjson-3.6.8-cp310-none-win_amd64.whl", hash = "sha256:eb22485847b9a0c4bbedc668df860126ac931edbed1d456cf41a59f3cb961ed8"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:1a5fe569310bc819279bd4d5f2c349910b104ed3207936246dd5d5e0b085e74a"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:ccb356a47ab1067cd3549847e9db1d279a63fe0482d315b3ffd6e7abef35ef77"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab29c069c222248ce302a25855b4e1664f9436e8ae5a131fb0859daf31676d2b"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2b5e4cba9e774ac011071d9d27760f97f4b8cd46003e971d122e712f971345"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:c311ec504414d22834d5b972a209619925b48263856a11a14d90230f9682d49c"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:a3dfec7950b90fb8d143743503ee53fa06b32e6068bdea792fc866284da3d71d"}, + {file = "orjson-3.6.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b890dbbada2cbb26eb29bd43a848426f007f094bb0758df10dfe7a438e1cb4b4"}, + {file = "orjson-3.6.8-cp37-none-win_amd64.whl", hash = "sha256:9143ae2c52771525be9ad11a7a8cc8e7fd75391b107e7e644a9e0050496f6b4f"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:33a82199fd42f6436f833e210ae5129c922a5c355629356ca7a8e82964da7285"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:90159ea8b9a5a2a98fa33dc7b421cfac4d2ae91ba5e1058f5909e7f059f6b467"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:656fbe15d9ef0733e740d9def78f4fdb4153102f4836ee774a05123499005931"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7be3be6153843e0f01351b1313a5ad4723595427680dac2dfff22a37e652ce02"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:dd24f66b6697ee7424f7da575ec6cbffc8ede441114d53470949cda4d97c6e56"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:b07c780f7345ecf5901356dc21dee0669defc489c38ce7b9ab0f5e008cc0385c"}, + {file = "orjson-3.6.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ea32015a5d8a4ce00d348a0de5dc7040e0ad58f970a8fcbb5713a1eac129e493"}, + {file = "orjson-3.6.8-cp38-none-win_amd64.whl", hash = "sha256:c5a3e382194c838988ec128a26b08aa92044e5e055491cc4056142af0c1c54d7"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:83a8424e857ae1bf53530e88b4eb2f16ca2b489073b924e655f1575cacd7f52a"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:81e1a6a2d67f15007dadacbf9ba5d3d79237e5e33786c028557fe5a2b72f1c9a"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:137b539881c77866eba86ff6a11df910daf2eb9ab8f1acae62f879e83d7c38af"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cbd358f3b3ad539a27e36900e8e7d172d0e1b72ad9dd7d69544dcbc0f067ee7"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:6ab94701542d40b90903ecfc339333f458884979a01cb9268bc662cc67a5f6d8"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:32b6f26593a9eb606b40775826beb0dac152e3d224ea393688fced036045a821"}, + {file = "orjson-3.6.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:afd9e329ebd3418cac3cd747769b1d52daa25fa672bbf414ab59f0e0881b32b9"}, + {file = "orjson-3.6.8-cp39-none-win_amd64.whl", hash = "sha256:0c89b419914d3d1f65a1b0883f377abe42a6e44f6624ba1c63e8846cbfc2fa60"}, + {file = "orjson-3.6.8.tar.gz", hash = "sha256:e19d23741c5de13689bb316abfccea15a19c264e3ec8eb332a5319a583595ace"}, ] packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, @@ -1256,80 +640,14 @@ pathspec = [ {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, ] -pbr = [ - {file = "pbr-5.8.1-py2.py3-none-any.whl", hash = "sha256:27108648368782d07bbf1cb468ad2e2eeef29086affd14087a6d04b7de8af4ec"}, - {file = "pbr-5.8.1.tar.gz", hash = "sha256:66bc5a34912f408bb3925bf21231cb6f59206267b7f63f3503ef865c1a292e25"}, -] platformdirs = [ - {file = "platformdirs-2.5.1-py3-none-any.whl", hash = "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"}, - {file = "platformdirs-2.5.1.tar.gz", hash = "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d"}, + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, ] pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] -pre-commit = [ - {file = "pre_commit-2.17.0-py2.py3-none-any.whl", hash = "sha256:725fa7459782d7bec5ead072810e47351de01709be838c2ce1726b9591dad616"}, - {file = "pre_commit-2.17.0.tar.gz", hash = "sha256:c1a8040ff15ad3d648c70cc3e55b93e4d2d5b687320955505587fd79bbaed06a"}, -] -psycopg2-binary = [ - {file = "psycopg2-binary-2.9.3.tar.gz", hash = "sha256:761df5313dc15da1502b21453642d7599d26be88bff659382f8f9747c7ebea4e"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:539b28661b71da7c0e428692438efbcd048ca21ea81af618d845e06ebfd29478"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e82d38390a03da28c7985b394ec3f56873174e2c88130e6966cb1c946508e65"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57804fc02ca3ce0dbfbef35c4b3a4a774da66d66ea20f4bda601294ad2ea6092"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:083a55275f09a62b8ca4902dd11f4b33075b743cf0d360419e2051a8a5d5ff76"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_24_ppc64le.whl", hash = "sha256:0a29729145aaaf1ad8bafe663131890e2111f13416b60e460dae0a96af5905c9"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a79d622f5206d695d7824cbf609a4f5b88ea6d6dab5f7c147fc6d333a8787e4"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:090f3348c0ab2cceb6dfbe6bf721ef61262ddf518cd6cc6ecc7d334996d64efa"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a9e1f75f96ea388fbcef36c70640c4efbe4650658f3d6a2967b4cc70e907352e"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c3ae8e75eb7160851e59adc77b3a19a976e50622e44fd4fd47b8b18208189d42"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-win32.whl", hash = "sha256:7b1e9b80afca7b7a386ef087db614faebbf8839b7f4db5eb107d0f1a53225029"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:8b344adbb9a862de0c635f4f0425b7958bf5a4b927c8594e6e8d261775796d53"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:e847774f8ffd5b398a75bc1c18fbb56564cda3d629fe68fd81971fece2d3c67e"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68641a34023d306be959101b345732360fc2ea4938982309b786f7be1b43a4a1"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3303f8807f342641851578ee7ed1f3efc9802d00a6f83c101d21c608cb864460"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_24_aarch64.whl", hash = "sha256:e3699852e22aa68c10de06524a3721ade969abf382da95884e6a10ff798f9281"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_24_ppc64le.whl", hash = "sha256:526ea0378246d9b080148f2d6681229f4b5964543c170dd10bf4faaab6e0d27f"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:b1c8068513f5b158cf7e29c43a77eb34b407db29aca749d3eb9293ee0d3103ca"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:15803fa813ea05bef089fa78835118b5434204f3a17cb9f1e5dbfd0b9deea5af"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:152f09f57417b831418304c7f30d727dc83a12761627bb826951692cc6491e57"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:404224e5fef3b193f892abdbf8961ce20e0b6642886cfe1fe1923f41aaa75c9d"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-win32.whl", hash = "sha256:1f6b813106a3abdf7b03640d36e24669234120c72e91d5cbaeb87c5f7c36c65b"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:2d872e3c9d5d075a2e104540965a1cf898b52274a5923936e5bfddb58c59c7c2"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:10bb90fb4d523a2aa67773d4ff2b833ec00857f5912bafcfd5f5414e45280fb1"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a52ecab70af13e899f7847b3e074eeb16ebac5615665db33bce8a1009cf33"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a29b3ca4ec9defec6d42bf5feb36bb5817ba3c0230dd83b4edf4bf02684cd0ae"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:12b11322ea00ad8db8c46f18b7dfc47ae215e4df55b46c67a94b4effbaec7094"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_24_ppc64le.whl", hash = "sha256:53293533fcbb94c202b7c800a12c873cfe24599656b341f56e71dd2b557be063"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c381bda330ddf2fccbafab789d83ebc6c53db126e4383e73794c74eedce855ef"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9d29409b625a143649d03d0fd7b57e4b92e0ecad9726ba682244b73be91d2fdb"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:183a517a3a63503f70f808b58bfbf962f23d73b6dccddae5aa56152ef2bcb232"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:15c4e4cfa45f5a60599d9cec5f46cd7b1b29d86a6390ec23e8eebaae84e64554"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-win32.whl", hash = "sha256:adf20d9a67e0b6393eac162eb81fb10bc9130a80540f4df7e7355c2dd4af9fba"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2f9ffd643bc7349eeb664eba8864d9e01f057880f510e4681ba40a6532f93c71"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:def68d7c21984b0f8218e8a15d514f714d96904265164f75f8d3a70f9c295667"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dffc08ca91c9ac09008870c9eb77b00a46b3378719584059c034b8945e26b272"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:280b0bb5cbfe8039205c7981cceb006156a675362a00fe29b16fbc264e242834"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:af9813db73395fb1fc211bac696faea4ca9ef53f32dc0cfa27e4e7cf766dcf24"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_24_ppc64le.whl", hash = "sha256:63638d875be8c2784cfc952c9ac34e2b50e43f9f0a0660b65e2a87d656b3116c"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ffb7a888a047696e7f8240d649b43fb3644f14f0ee229077e7f6b9f9081635bd"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0c9d5450c566c80c396b7402895c4369a410cab5a82707b11aee1e624da7d004"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:d1c1b569ecafe3a69380a94e6ae09a4789bbb23666f3d3a08d06bbd2451f5ef1"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8fc53f9af09426a61db9ba357865c77f26076d48669f2e1bb24d85a22fb52307"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-win32.whl", hash = "sha256:6472a178e291b59e7f16ab49ec8b4f3bdada0a879c68d3817ff0963e722a82ce"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:35168209c9d51b145e459e05c31a9eaeffa9a6b0fd61689b48e07464ffd1a83e"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:47133f3f872faf28c1e87d4357220e809dfd3fa7c64295a4a148bcd1e6e34ec9"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91920527dea30175cc02a1099f331aa8c1ba39bf8b7762b7b56cbf54bc5cce42"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:887dd9aac71765ac0d0bac1d0d4b4f2c99d5f5c1382d8b770404f0f3d0ce8a39"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:1f14c8b0942714eb3c74e1e71700cbbcb415acbc311c730370e70c578a44a25c"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_24_ppc64le.whl", hash = "sha256:7af0dd86ddb2f8af5da57a976d27cd2cd15510518d582b478fbb2292428710b4"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:93cd1967a18aa0edd4b95b1dfd554cf15af657cb606280996d393dadc88c3c35"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bda845b664bb6c91446ca9609fc69f7db6c334ec5e4adc87571c34e4f47b7ddb"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:01310cf4cf26db9aea5158c217caa92d291f0500051a6469ac52166e1a16f5b7"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:99485cab9ba0fa9b84f1f9e1fef106f44a46ef6afdeec8885e0b88d0772b49e8"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-win32.whl", hash = "sha256:46f0e0a6b5fa5851bbd9ab1bc805eef362d3a230fbdfbc209f4a236d0a7a990d"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:accfe7e982411da3178ec690baaceaad3c278652998b2c45828aaac66cd8285f"}, -] py = [ {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, @@ -1342,21 +660,13 @@ pyflakes = [ {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, ] -pygments = [ - {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"}, - {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"}, -] pyparsing = [ - {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"}, - {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, ] pytest = [ - {file = "pytest-7.1.1-py3-none-any.whl", hash = "sha256:92f723789a8fdd7180b6b06483874feca4c48a5c76968e03bb3e7f806a1869ea"}, - {file = "pytest-7.1.1.tar.gz", hash = "sha256:841132caef6b1ad17a9afde46dc4f6cfa59a05f9555aae5151f73bdf2820ca63"}, -] -pytz = [ - {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"}, - {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"}, + {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, + {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"}, ] pyyaml = [ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, @@ -1393,73 +703,17 @@ pyyaml = [ {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] -requests = [ - {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, - {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, -] six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] -snowballstemmer = [ - {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, - {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, -] -sphinx = [ - {file = "Sphinx-4.5.0-py3-none-any.whl", hash = "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226"}, - {file = "Sphinx-4.5.0.tar.gz", hash = "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6"}, -] -sphinx-autodoc-typehints = [ - {file = "sphinx_autodoc_typehints-1.17.0-py3-none-any.whl", hash = "sha256:081daf53077b4ae1c28347d6d858e13e63aefe3b4aacef79fd717dd60687b470"}, - {file = "sphinx_autodoc_typehints-1.17.0.tar.gz", hash = "sha256:51c7b3f5cb9ccd15d0b52088c62df3094f1abd9612930340365c26def8629a14"}, -] -sphinx-rtd-theme = [ - {file = "sphinx_rtd_theme-1.0.0-py2.py3-none-any.whl", hash = "sha256:4d35a56f4508cfee4c4fb604373ede6feae2a306731d533f409ef5c3496fdbd8"}, - {file = "sphinx_rtd_theme-1.0.0.tar.gz", hash = "sha256:eec6d497e4c2195fa0e8b2016b337532b8a699a68bcb22a512870e16925c6a5c"}, -] -sphinxcontrib-apidoc = [ - {file = "sphinxcontrib-apidoc-0.3.0.tar.gz", hash = "sha256:729bf592cf7b7dd57c4c05794f732dc026127275d785c2a5494521fdde773fb9"}, - {file = "sphinxcontrib_apidoc-0.3.0-py2.py3-none-any.whl", hash = "sha256:6671a46b2c6c5b0dca3d8a147849d159065e50443df79614f921b42fbd15cb09"}, -] -sphinxcontrib-applehelp = [ - {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, - {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, -] -sphinxcontrib-devhelp = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, -] -sphinxcontrib-htmlhelp = [ - {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, - {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, -] -sphinxcontrib-jsmath = [ - {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, - {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, -] -sphinxcontrib-qthelp = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, -] -sphinxcontrib-serializinghtml = [ - {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, - {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] tomli = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] typing-extensions = [ - {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, - {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, -] -urllib3 = [ - {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, - {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, + {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, + {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, ] uvloop = [ {file = "uvloop-0.16.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6224f1401025b748ffecb7a6e2652b17768f30b1a6a3f7b44660e5b5b690b12d"}, @@ -1479,11 +733,3 @@ uvloop = [ {file = "uvloop-0.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e5f2e2ff51aefe6c19ee98af12b4ae61f5be456cd24396953244a30880ad861"}, {file = "uvloop-0.16.0.tar.gz", hash = "sha256:f74bc20c7b67d1c27c72601c78cf95be99d5c2cdd4514502b4f3eb0933ff1228"}, ] -virtualenv = [ - {file = "virtualenv-20.14.0-py2.py3-none-any.whl", hash = "sha256:1e8588f35e8b42c6ec6841a13c5e88239de1e6e4e4cedfd3916b306dc826ec66"}, - {file = "virtualenv-20.14.0.tar.gz", hash = "sha256:8e5b402037287126e81ccde9432b95a8be5b19d36584f64957060a3488c11ca8"}, -] -zipp = [ - {file = "zipp-3.7.0-py3-none-any.whl", hash = "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375"}, - {file = "zipp-3.7.0.tar.gz", hash = "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d"}, -] diff --git a/packages/core/minos-microservice-saga/pyproject.toml b/packages/core/minos-microservice-saga/pyproject.toml index d84cb5294..b3dbdfd01 100644 --- a/packages/core/minos-microservice-saga/pyproject.toml +++ b/packages/core/minos-microservice-saga/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "minos-microservice-saga" -version = "0.6.0" +version = "0.7.0" description = "The SAGA pattern of the Minos Framework" readme = "README.md" repository = "https://github.com/minos-framework/minos-python" @@ -21,36 +21,30 @@ keywords = [ "saga", ] packages = [ - { include = "minos" } + { include = "minos" }, ] include = [ - "AUTHORS.md", - "HISTORY.md", - "LICENSE", + { path = "AUTHORS.md", format = "sdist" }, + { path = "HISTORY.md", format = "sdist" }, + { path = "LICENSE", format = "sdist" }, ] [tool.poetry.dependencies] python = "^3.9" -minos-microservice-aggregate = "^0.6.0" -minos-microservice-common = "^0.6.0" -minos-microservice-networks = "^0.6.0" +minos-microservice-aggregate = "^0.7.0" +minos-microservice-common = "^0.7.0" +minos-microservice-networks = "^0.7.0" cached-property = "^1.5.2" [tool.poetry.dev-dependencies] minos-microservice-common = { path = "../minos-microservice-common", develop = true } minos-microservice-networks = { path = "../minos-microservice-networks", develop = true } minos-microservice-aggregate = { path = "../minos-microservice-aggregate", develop = true } -black = "^22.1" +black = "^22.3" isort = "^5.8.0" -pytest = "^7.0.1" +pytest = "^7.1.2" coverage = "^6.3" flake8 = "^4.0.1" -Sphinx = "^4.0.1" -pre-commit = "^2.12.1" -sphinx-autodoc-typehints = "^1.17.0" -sphinxcontrib-apidoc = "^0.3.0" -sphinx-rtd-theme = "^1.0.0" -m2r2 = "^0.3.2" [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/packages/core/minos-microservice-saga/tests/config.yml b/packages/core/minos-microservice-saga/tests/config.yml index 2c8c0b3a9..15a7dff17 100644 --- a/packages/core/minos-microservice-saga/tests/config.yml +++ b/packages/core/minos-microservice-saga/tests/config.yml @@ -1,6 +1,10 @@ -service: - name: order - aggregate: tests.utils.Order -saga: - storage: - path: "./order.lmdb" +version: 2 +name: order + +databases: + saga: + client: minos.common.testing.MockedDatabaseClient + path: "./order.lmdb" + +pools: + database: minos.common.DatabaseClientPool diff --git a/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_commit.py b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_commit.py index d11e11ae4..efaad6109 100644 --- a/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_commit.py +++ b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_commit.py @@ -3,6 +3,9 @@ uuid4, ) +from minos.common import ( + NotProvidedException, +) from minos.networks import ( BrokerMessage, BrokerMessageV1, @@ -20,11 +23,11 @@ TransactionCommitter, ) from tests.utils import ( - MinosTestCase, + SagaTestCase, ) -class TestTransactionCommitter(MinosTestCase): +class TestTransactionCommitter(SagaTestCase): def setUp(self) -> None: super().setUp() @@ -53,6 +56,10 @@ def setUp(self) -> None: self.committer = TransactionCommitter(self.execution_uuid, self.executed_steps) + def test_constructor_without_broker(self): + with self.assertRaises(NotProvidedException): + TransactionCommitter(self.execution_uuid, self.executed_steps, broker_pool=None, pool_factory=None) + def test_transactions(self): expected = [ (self.execution_uuid, "bar"), diff --git a/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_executors/test_abc.py b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_executors/test_abc.py index aa8532f7f..b6b1dcaf2 100644 --- a/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_executors/test_abc.py +++ b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_executors/test_abc.py @@ -12,11 +12,11 @@ SagaOperation, ) from tests.utils import ( - MinosTestCase, + SagaTestCase, ) -class TestExecutor(MinosTestCase): +class TestExecutor(SagaTestCase): def setUp(self) -> None: super().setUp() diff --git a/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_executors/test_local.py b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_executors/test_local.py index 63cb6bf5d..df43aef6e 100644 --- a/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_executors/test_local.py +++ b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_executors/test_local.py @@ -15,13 +15,13 @@ ) from tests.utils import ( Foo, - MinosTestCase, + SagaTestCase, create_payment, create_payment_raises, ) -class TestLocalExecutor(MinosTestCase): +class TestLocalExecutor(SagaTestCase): def setUp(self) -> None: super().setUp() diff --git a/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_executors/test_request.py b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_executors/test_request.py index 08775242a..e8478f43d 100644 --- a/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_executors/test_request.py +++ b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_executors/test_request.py @@ -24,12 +24,12 @@ ) from tests.utils import ( Foo, - MinosTestCase, + SagaTestCase, send_create_product, ) -class TestRequestExecutor(MinosTestCase): +class TestRequestExecutor(SagaTestCase): def setUp(self) -> None: super().setUp() diff --git a/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_executors/test_response.py b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_executors/test_response.py index 2f7acb4b3..12c6d68c4 100644 --- a/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_executors/test_response.py +++ b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_executors/test_response.py @@ -17,12 +17,12 @@ ) from tests.utils import ( Foo, - MinosTestCase, + SagaTestCase, handle_ticket_success, ) -class TestResponseExecutor(MinosTestCase): +class TestResponseExecutor(SagaTestCase): def setUp(self) -> None: super().setUp() diff --git a/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_repositories/__init__.py b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_repositories/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_repositories/test_abc.py b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_repositories/test_abc.py new file mode 100644 index 000000000..9fc19f32a --- /dev/null +++ b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_repositories/test_abc.py @@ -0,0 +1,96 @@ +import unittest +from unittest.mock import ( + AsyncMock, + call, +) +from uuid import ( + UUID, +) + +from minos.saga import ( + SagaExecution, + SagaExecutionRepository, +) +from tests.utils import ( + ADD_ORDER, + SagaTestCase, +) + + +class _SagaExecutionRepository(SagaExecutionRepository): + async def _store(self, execution: SagaExecution) -> None: + """For testing purposes.""" + + async def _load(self, uuid: UUID) -> SagaExecution: + """For testing purposes.""" + + async def _delete(self, key: UUID) -> None: + """For testing purposes.""" + + +class TestSagaExecutionRepository(SagaTestCase): + async def test_store(self): + mock = AsyncMock() + repository = _SagaExecutionRepository() + repository._store = mock + execution = SagaExecution.from_definition(ADD_ORDER) + + await repository.store(execution) + + self.assertEqual([call(execution)], mock.call_args_list) + + async def test_load(self): + execution = SagaExecution.from_definition(ADD_ORDER) + repository = _SagaExecutionRepository() + mock = AsyncMock(return_value=execution) + repository._load = mock + + observed = await repository.load(execution.uuid) + + self.assertEqual(execution, observed) + self.assertEqual([call(execution.uuid)], mock.call_args_list) + + async def test_load_from_str(self): + execution = SagaExecution.from_definition(ADD_ORDER) + repository = _SagaExecutionRepository() + mock = AsyncMock(return_value=execution) + repository._load = mock + + observed = await repository.load(str(execution.uuid)) + + self.assertEqual(execution, observed) + self.assertEqual([call(execution.uuid)], mock.call_args_list) + + async def test_delete(self): + execution = SagaExecution.from_definition(ADD_ORDER) + repository = _SagaExecutionRepository() + mock = AsyncMock(return_value=execution) + repository._delete = mock + + await repository.delete(execution) + + self.assertEqual([call(execution.uuid)], mock.call_args_list) + + async def test_delete_from_uuid(self): + execution = SagaExecution.from_definition(ADD_ORDER) + repository = _SagaExecutionRepository() + mock = AsyncMock(return_value=execution) + repository._delete = mock + + await repository.delete(execution.uuid) + + self.assertEqual([call(execution.uuid)], mock.call_args_list) + + async def test_delete_from_str(self): + execution = SagaExecution.from_definition(ADD_ORDER) + repository = _SagaExecutionRepository() + mock = AsyncMock(return_value=execution) + repository._delete = mock + + await repository.delete(str(execution.uuid)) + + self.assertEqual([call(execution.uuid)], mock.call_args_list) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_repositories/test_database/__init__.py b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_repositories/test_database/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_repositories/test_database/test_factories.py b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_repositories/test_database/test_factories.py new file mode 100644 index 000000000..b49d2f91c --- /dev/null +++ b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_repositories/test_database/test_factories.py @@ -0,0 +1,24 @@ +import unittest +from abc import ( + ABC, +) + +from minos.common import ( + DatabaseOperationFactory, +) +from minos.saga import ( + SagaExecutionDatabaseOperationFactory, +) + + +class TestSagaExecutionDatabaseOperationFactory(unittest.TestCase): + def test_abstract(self): + self.assertTrue(issubclass(SagaExecutionDatabaseOperationFactory, (DatabaseOperationFactory, ABC))) + # noinspection PyUnresolvedReferences + self.assertEqual( + {"build_store", "build_load", "build_delete"}, SagaExecutionDatabaseOperationFactory.__abstractmethods__ + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_repositories/test_database/test_impl.py b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_repositories/test_database/test_impl.py new file mode 100644 index 000000000..a0f2a74d1 --- /dev/null +++ b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_repositories/test_database/test_impl.py @@ -0,0 +1,56 @@ +import unittest +from unittest.mock import ( + patch, +) + +from minos.common import ( + DatabaseClient, + ProgrammingException, +) +from minos.saga import ( + DatabaseSagaExecutionRepository, + SagaExecutionRepository, +) +from minos.saga.testing import ( + SagaExecutionRepositoryTestCase, +) +from tests.utils import ( + SagaTestCase, +) + + +class TestDatabaseSagaExecutionRepository(SagaTestCase, SagaExecutionRepositoryTestCase): + __test__ = True + + def build_saga_execution_repository(self) -> SagaExecutionRepository: + return DatabaseSagaExecutionRepository.from_config(self.config) + + async def test_store(self): + with patch.object(DatabaseClient, "fetch_one", side_effect=[self.execution.raw]): + await super().test_store() + + async def test_store_overwrite(self): + another_raw = self.another.raw + another_raw["uuid"] = self.execution.uuid + with patch.object(DatabaseClient, "fetch_one", side_effect=[self.execution.raw, another_raw, another_raw]): + await super().test_store_overwrite() + + async def test_load_from_str(self): + with patch.object(DatabaseClient, "fetch_one", side_effect=[self.execution.raw]): + await super().test_load_from_str() + + async def test_load_raises(self): + with patch.object(DatabaseClient, "fetch_one", side_effect=[ProgrammingException("")]): + await super().test_load_raises() + + async def test_delete(self): + with patch.object(DatabaseClient, "fetch_one", side_effect=[ProgrammingException("")]): + await super().test_delete() + + async def test_delete_from_str(self): + with patch.object(DatabaseClient, "fetch_one", side_effect=[ProgrammingException("")]): + await super().test_delete_from_str() + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_saga/test_execute.py b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_saga/test_execute.py index 8252ab940..966ea4c4b 100644 --- a/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_saga/test_execute.py +++ b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_saga/test_execute.py @@ -27,7 +27,7 @@ ) from tests.utils import ( Foo, - MinosTestCase, + SagaTestCase, handle_order_success, handle_ticket_success, handle_ticket_success_raises, @@ -38,7 +38,7 @@ ) -class TestSagaExecution(MinosTestCase): +class TestSagaExecution(SagaTestCase): def setUp(self) -> None: super().setUp() self.saga = ( diff --git a/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_saga/test_raw.py b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_saga/test_raw.py index b23136ffc..aa94efea6 100644 --- a/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_saga/test_raw.py +++ b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_saga/test_raw.py @@ -17,11 +17,11 @@ from tests.utils import ( ADD_ORDER, Foo, - MinosTestCase, + SagaTestCase, ) -class TestSagaExecution(MinosTestCase): +class TestSagaExecution(SagaTestCase): def setUp(self) -> None: super().setUp() self.user = uuid4() diff --git a/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_steps/test_conditional.py b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_steps/test_conditional.py index 907f2d22e..0690cd6e1 100644 --- a/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_steps/test_conditional.py +++ b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_steps/test_conditional.py @@ -25,7 +25,7 @@ ) from tests.utils import ( Foo, - MinosTestCase, + SagaTestCase, handle_order_success, handle_ticket_success_raises, send_create_order, @@ -41,7 +41,7 @@ def _is_two(context): return context["option"] == 2 -class TestConditionalSageStepExecution(MinosTestCase): +class TestConditionalSageStepExecution(SagaTestCase): def setUp(self) -> None: super().setUp() self.execute_kwargs = { diff --git a/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_steps/test_local.py b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_steps/test_local.py index 9b714c2e7..2a0122045 100644 --- a/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_steps/test_local.py +++ b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_steps/test_local.py @@ -15,14 +15,14 @@ SagaStepStatus, ) from tests.utils import ( - MinosTestCase, + SagaTestCase, create_payment, create_payment_raises, delete_payment, ) -class TestLocalSagaStepExecution(MinosTestCase): +class TestLocalSagaStepExecution(SagaTestCase): def setUp(self) -> None: super().setUp() diff --git a/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_steps/test_remote.py b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_steps/test_remote.py index 0bc8c6e6d..b7f7c920f 100644 --- a/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_steps/test_remote.py +++ b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_steps/test_remote.py @@ -19,7 +19,7 @@ ) from tests.utils import ( Foo, - MinosTestCase, + SagaTestCase, handle_ticket_error, handle_ticket_error_raises, handle_ticket_success, @@ -30,7 +30,7 @@ ) -class TestRemoteSagaStepExecution(MinosTestCase): +class TestRemoteSagaStepExecution(SagaTestCase): def setUp(self) -> None: super().setUp() self.execute_kwargs = { diff --git a/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_storage.py b/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_storage.py deleted file mode 100644 index 53673e61a..000000000 --- a/packages/core/minos-microservice-saga/tests/test_saga/test_executions/test_storage.py +++ /dev/null @@ -1,77 +0,0 @@ -import unittest -from shutil import ( - rmtree, -) - -from minos.saga import ( - SagaExecution, - SagaExecutionNotFoundException, - SagaExecutionStorage, - SagaPausedExecutionStepException, - SagaResponse, -) -from tests.utils import ( - ADD_ORDER, - DB_PATH, - Foo, - MinosTestCase, -) - - -class TestSagaExecutionStorage(MinosTestCase): - DB_PATH = DB_PATH - - async def asyncSetUp(self) -> None: - await super().asyncSetUp() - - execution = SagaExecution.from_definition(ADD_ORDER) - with self.assertRaises(SagaPausedExecutionStepException): - await execution.execute() - - response = SagaResponse(Foo("hola"), {"ticket"}) - with self.assertRaises(SagaPausedExecutionStepException): - await execution.execute(response) - - self.execution = execution - - def tearDown(self) -> None: - rmtree(self.DB_PATH, ignore_errors=True) - super().tearDown() - - def test_store(self): - storage = SagaExecutionStorage(path=self.DB_PATH) - - storage.store(self.execution) - - self.assertEqual(self.execution, storage.load(self.execution.uuid)) - - def test_store_overwrite(self): - storage = SagaExecutionStorage(path=self.DB_PATH) - - storage.store(self.execution) - self.assertEqual(self.execution, storage.load(self.execution.uuid)) - - another = SagaExecution.from_definition(ADD_ORDER) - another.uuid = self.execution.uuid - storage.store(another) - - self.assertNotEqual(self.execution, storage.load(self.execution.uuid)) - self.assertEqual(another, storage.load(self.execution.uuid)) - - def test_load_raises(self): - storage = SagaExecutionStorage(path=self.DB_PATH) - - with self.assertRaises(SagaExecutionNotFoundException): - storage.load(self.execution.uuid) - - def test_delete(self): - storage = SagaExecutionStorage(path=self.DB_PATH) - - storage.store(self.execution) - storage.delete(self.execution) - with self.assertRaises(SagaExecutionNotFoundException): - storage.load(self.execution.uuid) - - -if __name__ == "__main__": - unittest.main() diff --git a/packages/core/minos-microservice-saga/tests/test_saga/test_manager.py b/packages/core/minos-microservice-saga/tests/test_saga/test_manager.py index 122f988d8..7f4454941 100644 --- a/packages/core/minos-microservice-saga/tests/test_saga/test_manager.py +++ b/packages/core/minos-microservice-saga/tests/test_saga/test_manager.py @@ -14,7 +14,10 @@ ) from minos.common import ( + DatabaseClient, + DatabaseClientPool, NotProvidedException, + ProgrammingException, ) from minos.networks import ( REQUEST_HEADERS_CONTEXT_VAR, @@ -27,22 +30,25 @@ SagaContext, SagaExecution, SagaExecutionNotFoundException, - SagaExecutionStorage, + SagaExecutionRepository, SagaFailedExecutionException, SagaManager, SagaResponse, SagaStatus, ) +from minos.saga.testing import ( + MockedSagaExecutionDatabaseOperationFactory, +) from tests.utils import ( ADD_ORDER, DB_PATH, DELETE_ORDER, Foo, - MinosTestCase, + SagaTestCase, ) -class TestSagaManager(MinosTestCase): +class TestSagaManager(SagaTestCase): DB_PATH = DB_PATH async def asyncSetUp(self) -> None: @@ -76,12 +82,13 @@ def tearDown(self) -> None: super().tearDown() def test_constructor(self): - self.assertIsInstance(self.manager.storage, SagaExecutionStorage) + self.assertIsInstance(self.manager.storage, SagaExecutionRepository) self.assertIsInstance(self.manager, SagaManager) - def test_constructor_without_handler(self): + def test_constructor_without_broker(self): + database_pool = DatabaseClientPool.from_config(self.config, identifier="saga") with self.assertRaises(NotProvidedException): - SagaManager.from_config(self.config, broker_pool=None) + SagaManager.from_config(self.config, broker_pool=None, pool_factory=None, database_pool=database_pool) async def test_context_manager(self): async with self.manager as saga_manager: @@ -103,7 +110,8 @@ async def test_run_with_pause_on_memory(self): self.assertEqual(SagaStatus.Finished, execution.status) with self.assertRaises(SagaExecutionNotFoundException): - self.manager.storage.load(execution.uuid) + with patch.object(DatabaseClient, "fetch_one", side_effect=[ProgrammingException("")]): + await self.manager.storage.load(execution.uuid) observed = self.broker_publisher.messages expected = self._build_expected_messages(observed) @@ -173,15 +181,18 @@ async def test_run_with_pause_on_disk(self): self.assertEqual(SagaStatus.Paused, execution.status) response = SagaResponse([Foo("foo")], {"foo"}, uuid=execution.uuid) - execution = await self.manager.run(response=response, pause_on_disk=True) + with patch.object(DatabaseClient, "fetch_one", side_effect=[execution.raw]): + execution = await self.manager.run(response=response, pause_on_disk=True) self.assertEqual(SagaStatus.Paused, execution.status) response = SagaResponse([Foo("foo")], {"foo"}, uuid=execution.uuid) - execution = await self.manager.run(response=response, pause_on_disk=True) + with patch.object(DatabaseClient, "fetch_one", side_effect=[execution.raw]): + execution = await self.manager.run(response=response, pause_on_disk=True) self.assertEqual(SagaStatus.Finished, execution.status) with self.assertRaises(SagaExecutionNotFoundException): - self.manager.storage.load(self.uuid) + with patch.object(DatabaseClient, "fetch_one", side_effect=[ProgrammingException("")]): + await self.manager.storage.load(self.uuid) observed = self.broker_publisher.messages expected = self._build_expected_messages(observed) @@ -194,13 +205,15 @@ async def test_run_with_pause_on_disk_without_commit(self): self.assertEqual(SagaStatus.Paused, execution.status) response = SagaResponse([Foo("foo")], {"foo"}, uuid=execution.uuid) - execution = await self.manager.run(response=response, pause_on_disk=True) + with patch.object(DatabaseClient, "fetch_one", side_effect=[execution.raw]): + execution = await self.manager.run(response=response, pause_on_disk=True) self.assertEqual(SagaStatus.Paused, execution.status) response = SagaResponse([Foo("foo")], {"foo"}, uuid=execution.uuid) with patch("minos.saga.SagaExecution.commit") as commit_mock: - execution = await self.manager.run(response=response, pause_on_disk=True, autocommit=False) + with patch.object(DatabaseClient, "fetch_one", side_effect=[execution.raw]): + execution = await self.manager.run(response=response, pause_on_disk=True, autocommit=False) self.assertEqual(SagaStatus.Finished, execution.status) self.assertEqual(0, commit_mock.call_count) @@ -220,19 +233,27 @@ async def test_run_with_pause_on_disk_with_headers(self): request_headers = {"related_services": "one"} REQUEST_HEADERS_CONTEXT_VAR.set(request_headers) response = SagaResponse([Foo("foo")], {"foo"}, uuid=execution.uuid) - execution = await self.manager.run(response=response, pause_on_disk=True) + with patch.object(DatabaseClient, "fetch_one", side_effect=[execution.raw]): + execution = await self.manager.run(response=response, pause_on_disk=True) self.assertEqual(SagaStatus.Paused, execution.status) self.assertEqual({"foo", "one", "order"}, set(request_headers["related_services"].split(","))) request_headers = {"related_services": "one"} REQUEST_HEADERS_CONTEXT_VAR.set(request_headers) response = SagaResponse([Foo("foo")], {"foo", "bar"}, uuid=execution.uuid) - await self.manager.run(response=response, pause_on_disk=True) + with patch.object(DatabaseClient, "fetch_one", side_effect=[execution.raw]): + await self.manager.run(response=response, pause_on_disk=True) self.assertEqual({"foo", "bar", "one", "order"}, set(request_headers["related_services"].split(","))) async def test_run_with_pause_on_disk_returning_uuid(self): - uuid = await self.manager.run(ADD_ORDER, return_execution=False, pause_on_disk=True) - execution = self.manager.storage.load(uuid) + with patch.object( + MockedSagaExecutionDatabaseOperationFactory, + "build_store", + side_effect=MockedSagaExecutionDatabaseOperationFactory().build_store, + ) as mock: + uuid = await self.manager.run(ADD_ORDER, return_execution=False, pause_on_disk=True) + with patch.object(DatabaseClient, "fetch_one", side_effect=[mock.call_args.kwargs]): + execution = await self.manager.storage.load(uuid) self.assertIsInstance(execution, SagaExecution) self.assertEqual(SagaStatus.Paused, execution.status) diff --git a/packages/core/minos-microservice-saga/tests/test_saga/test_middleware.py b/packages/core/minos-microservice-saga/tests/test_saga/test_middleware.py index 45df4d9f7..d18ab3ede 100644 --- a/packages/core/minos-microservice-saga/tests/test_saga/test_middleware.py +++ b/packages/core/minos-microservice-saga/tests/test_saga/test_middleware.py @@ -19,7 +19,7 @@ transactional_command, ) from tests.utils import ( - MinosTestCase, + SagaTestCase, ) @@ -30,7 +30,7 @@ async def _fn(request: Request) -> Response: Raw = namedtuple("Raw", ["headers", "content"]) -class TestMiddleware(MinosTestCase): +class TestMiddleware(SagaTestCase): async def test_transactional_command_unused(self): # noinspection PyTypeChecker request = BrokerRequest(Raw({"transactions": None}, "foo")) diff --git a/packages/core/minos-microservice-saga/tests/test_saga/test_services.py b/packages/core/minos-microservice-saga/tests/test_saga/test_services.py index a646cc52c..98c2f2196 100644 --- a/packages/core/minos-microservice-saga/tests/test_saga/test_services.py +++ b/packages/core/minos-microservice-saga/tests/test_saga/test_services.py @@ -24,11 +24,11 @@ ) from tests.utils import ( CONFIG_FILE_PATH, - MinosTestCase, + SagaTestCase, ) -class TestSagaService(MinosTestCase): +class TestSagaService(SagaTestCase): def setUp(self) -> None: super().setUp() diff --git a/packages/core/minos-microservice-saga/tests/test_saga/test_utils.py b/packages/core/minos-microservice-saga/tests/test_saga/test_utils.py index 9caa61e32..e9d6c04d8 100644 --- a/packages/core/minos-microservice-saga/tests/test_saga/test_utils.py +++ b/packages/core/minos-microservice-saga/tests/test_saga/test_utils.py @@ -7,11 +7,11 @@ get_service_name, ) from tests.utils import ( - MinosTestCase, + SagaTestCase, ) -class TestUtils(MinosTestCase): +class TestUtils(SagaTestCase): def test_get_service_name(self): self.assertEqual("order", get_service_name()) diff --git a/packages/core/minos-microservice-saga/tests/utils.py b/packages/core/minos-microservice-saga/tests/utils.py index 1abb6ebb8..4a4203831 100644 --- a/packages/core/minos-microservice-saga/tests/utils.py +++ b/packages/core/minos-microservice-saga/tests/utils.py @@ -2,7 +2,6 @@ annotations, ) -import unittest from pathlib import ( Path, ) @@ -16,13 +15,15 @@ InMemoryTransactionRepository, ) from minos.common import ( - Config, DeclarativeModel, - DependencyInjector, Lock, LockPool, + PoolFactory, SetupMixin, ) +from minos.common.testing import ( + MinosTestCase, +) from minos.networks import ( BrokerClientPool, InMemoryBrokerPublisher, @@ -33,6 +34,7 @@ SagaContext, SagaRequest, SagaResponse, + testing, ) BASE_PATH = Path(__file__).parent @@ -40,53 +42,35 @@ DB_PATH = BASE_PATH / "test_db.lmdb" -class MinosTestCase(unittest.IsolatedAsyncioTestCase): - def setUp(self) -> None: - super().setUp() +class SagaTestCase(MinosTestCase): + testing_module = testing - self.config = Config(CONFIG_FILE_PATH) + def get_config_file_path(self): + return CONFIG_FILE_PATH - self.broker_pool = BrokerClientPool.from_config(CONFIG_FILE_PATH) - self.broker_publisher = InMemoryBrokerPublisher() - self.broker_subscriber_builder = InMemoryBrokerSubscriberBuilder() - self.lock_pool = FakeLockPool() - self.transaction_repository = InMemoryTransactionRepository(lock_pool=self.lock_pool) - self.event_repository = InMemoryEventRepository( - broker_publisher=self.broker_publisher, - transaction_repository=self.transaction_repository, - lock_pool=self.lock_pool, + def get_injections(self): + pool_factory = PoolFactory.from_config( + self.config, default_classes={"broker": BrokerClientPool, "lock": FakeLockPool} ) - self.snapshot_repository = InMemorySnapshotRepository( - event_repository=self.event_repository, transaction_repository=self.transaction_repository + broker_publisher = InMemoryBrokerPublisher() + broker_subscriber_builder = InMemoryBrokerSubscriberBuilder() + transaction_repository = InMemoryTransactionRepository(lock_pool=pool_factory.get_pool("lock")) + event_repository = InMemoryEventRepository( + broker_publisher=broker_publisher, + transaction_repository=transaction_repository, + lock_pool=pool_factory.get_pool("lock"), ) - - self.injector = DependencyInjector( - self.config, - [ - self.broker_pool, - self.broker_publisher, - self.broker_subscriber_builder, - self.lock_pool, - self.transaction_repository, - self.event_repository, - self.snapshot_repository, - ], + snapshot_repository = InMemorySnapshotRepository( + event_repository=event_repository, transaction_repository=transaction_repository ) - self.injector.wire_injections() - - async def asyncSetUp(self): - await super().asyncSetUp() - - await self.injector.setup_injections() - - async def asyncTearDown(self): - await self.injector.destroy_injections() - - await super().asyncTearDown() - - def tearDown(self) -> None: - self.injector.unwire_injections() - super().tearDown() + return [ + pool_factory, + broker_publisher, + broker_subscriber_builder, + transaction_repository, + event_repository, + snapshot_repository, + ] class FakeBrokerPublisher(SetupMixin): @@ -104,8 +88,11 @@ def __init__(self, key=None, *args, **kwargs): key = "fake" super().__init__(key, *args, **kwargs) - async def __aexit__(self, exc_type, exc_val, exc_tb): - return + async def acquire(self) -> None: + """For testing purposes.""" + + async def release(self): + """For testing purposes.""" class FakeLockPool(LockPool): diff --git a/packages/plugins/minos-broker-kafka/HISTORY.md b/packages/plugins/minos-broker-kafka/HISTORY.md index 3f99566f9..6a930063c 100644 --- a/packages/plugins/minos-broker-kafka/HISTORY.md +++ b/packages/plugins/minos-broker-kafka/HISTORY.md @@ -22,4 +22,11 @@ ## 0.6.1 (2022-04-01) -* Improve `KafkaBrokerSubscriber`'s destroying process. \ No newline at end of file +* Improve `KafkaBrokerSubscriber`'s destroying process. + +## 0.7.0 (2022-05-11) + +* Remove `InMemoryQueuedKafkaBrokerPublisher`, `PostgreSqlQueuedKafkaBrokerPublisher`, `InMemoryQueuedKafkaBrokerSubscriberBuilder` and `PostgreSqlQueuedKafkaBrokerSubscriberBuilder` in favor of the use of `minos.networks.BrokerPublisherBuilder` and `minos.networks.BrokerSubscriberBuilder`. +* Unify documentation building pipeline across all `minos-python` packages. +* Fix documentation building warnings. +* Fix bug related with package building and additional files like `AUTHORS.md`, `HISTORY.md`, etc. \ No newline at end of file diff --git a/packages/plugins/minos-broker-kafka/Makefile b/packages/plugins/minos-broker-kafka/Makefile index acc861207..ef814b8bc 100644 --- a/packages/plugins/minos-broker-kafka/Makefile +++ b/packages/plugins/minos-broker-kafka/Makefile @@ -15,10 +15,6 @@ reformat: poetry run black --line-length 120 minos tests poetry run isort minos tests -docs: - rm -rf docs/api - poetry run $(MAKE) --directory=docs html - release: $(MAKE) dist poetry publish @@ -38,5 +34,4 @@ check: $(MAKE) reformat $(MAKE) lint $(MAKE) test - $(MAKE) docs $(MAKE) dist diff --git a/packages/plugins/minos-broker-kafka/RUNTHETESTS.md b/packages/plugins/minos-broker-kafka/RUNTHETESTS.md index 8b5e95b1f..386e2b0e7 100644 --- a/packages/plugins/minos-broker-kafka/RUNTHETESTS.md +++ b/packages/plugins/minos-broker-kafka/RUNTHETESTS.md @@ -1,5 +1,4 @@ -Run the tests -============== +# Run the tests In order to run the tests, please make sure you have the `Docker Engine `_ and `Docker Compose `_ installed. diff --git a/packages/plugins/minos-broker-kafka/SETUP.md b/packages/plugins/minos-broker-kafka/SETUP.md deleted file mode 100644 index 8203965c7..000000000 --- a/packages/plugins/minos-broker-kafka/SETUP.md +++ /dev/null @@ -1,11 +0,0 @@ -Set up a development environment -================================= - -Since we use `poetry` as the default package manager, it must be installed. Please refer to -`https://python-poetry.org/docs/#installation`. - -Run `poetry install` to get the dependencies. - -Run `pre-commit install` to set the git checks before commiting. - -Make yourself sure you are able to run the tests. Refer to the appropriate section in this guide. diff --git a/packages/plugins/minos-broker-kafka/docs/Makefile b/packages/plugins/minos-broker-kafka/docs/Makefile deleted file mode 100644 index 09dee594d..000000000 --- a/packages/plugins/minos-broker-kafka/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -SPHINXPROJ = minos-broker-kafka -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/packages/plugins/minos-broker-kafka/docs/_static/style.css b/packages/plugins/minos-broker-kafka/docs/_static/style.css deleted file mode 100644 index 8aa6c288f..000000000 --- a/packages/plugins/minos-broker-kafka/docs/_static/style.css +++ /dev/null @@ -1,3 +0,0 @@ -.wy-nav-content { - max-width: 1200px !important; -} diff --git a/packages/plugins/minos-broker-kafka/docs/_templates/layout.html b/packages/plugins/minos-broker-kafka/docs/_templates/layout.html deleted file mode 100644 index b0a448060..000000000 --- a/packages/plugins/minos-broker-kafka/docs/_templates/layout.html +++ /dev/null @@ -1,4 +0,0 @@ -{% extends "!layout.html" %} -{% block extrahead %} - -{% endblock %} \ No newline at end of file diff --git a/packages/plugins/minos-broker-kafka/docs/authors.md b/packages/plugins/minos-broker-kafka/docs/authors.md deleted file mode 100644 index cf16fc494..000000000 --- a/packages/plugins/minos-broker-kafka/docs/authors.md +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../AUTHORS.md diff --git a/packages/plugins/minos-broker-kafka/docs/conf.py b/packages/plugins/minos-broker-kafka/docs/conf.py deleted file mode 100755 index fa8cbc601..000000000 --- a/packages/plugins/minos-broker-kafka/docs/conf.py +++ /dev/null @@ -1,191 +0,0 @@ -#!/usr/bin/env python -# -# minos documentation build configuration file, created by -# sphinx-quickstart on Fri Jun 9 13:47:02 2017. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -# If extensions (or modules to document with autodoc) are in another -# directory, add these directories to sys.path here. If the directory is -# relative to the documentation root, use os.path.abspath to make it -# absolute, like shown here. -# -import os -import sys - -sys.path.insert(0, os.path.abspath("..")) - -import sphinx_rtd_theme # noqa - -from minos.plugins import ( - kafka, -) - -# -- General configuration --------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. - - -extensions = [ - "sphinxcontrib.apidoc", - "sphinx.ext.autodoc", - "sphinx_autodoc_typehints", - "sphinx.ext.viewcode", - "sphinx_rtd_theme", - "m2r2", -] -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -source_suffix = [".rst", ".md"] - -# The master toctree document. -master_doc = "index" - -# General information about the project. -project = "Minos Broker Kafka" -copyright = "2021, Clariteia" -author = "Minos Framework Devs" - -# The version info for the project you're documenting, acts as replacement -# for |version| and |release|, also used in various other places throughout -# the built documents. -# -# The short X.Y version. -version = kafka.__version__ -# The full version, including alpha/beta/rc tags. -release = kafka.__version__ - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = "sphinx" - -todo_include_todos = False - -# -- Options for HTML output ------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# - -html_theme = "sphinx_rtd_theme" - -# Theme options are theme-specific and customize the look and feel of a -# theme further. For a list of options available for each theme, see the -# documentation. -# - -# html_theme_options = { -# "codecov_button": True, -# "description": "Reactive microservices for an asynchronous world", -# "github_button": True, -# "github_user": "Clariteia", -# "github_repo": "cqrs", -# "github_type": "star", -# } - -html_sidebars = {"**": ["about.html", "navigation.html", "searchbox.html"]} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] - -# -- Options for HTMLHelp output --------------------------------------- - -# Output file base name for HTML help builder. -htmlhelp_basename = "minosdoc" - -# -- Options for LaTeX output ------------------------------------------ - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass -# [howto, manual, or own class]). -latex_documents = [ - (master_doc, "minos.tex", "Minos Broker Kafka Documentation", "Minos Framework Devs", "manual"), -] - -# -- Options for manual page output ------------------------------------ - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [(master_doc, "minos", "Minos Broker Kafka Documentation", [author], 1)] - -# -- Options for Texinfo output ---------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ( - master_doc, - "minos", - "Minos Broker Kafka Documentation", - author, - "minos", - "One line description of project.", - "Miscellaneous", - ), -] - -# "apidoc" extension -apidoc_module_dir = "../minos" -apidoc_output_dir = "api" -apidoc_separate_modules = True -autodoc_default_options = { - "inherited-members": True, - "special-members": "__init__", - "undoc-members": True, -} - -apidoc_toc_file = False -apidoc_module_first = True -apidoc_extra_args = [ - "--force", - "--implicit-namespaces", -] -# "autodoc typehints" extension - -set_type_checking_flag = True -typehints_fully_qualified = True diff --git a/packages/plugins/minos-broker-kafka/docs/history.md b/packages/plugins/minos-broker-kafka/docs/history.md deleted file mode 100644 index d26e5be83..000000000 --- a/packages/plugins/minos-broker-kafka/docs/history.md +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../HISTORY.md diff --git a/packages/plugins/minos-broker-kafka/docs/index.md b/packages/plugins/minos-broker-kafka/docs/index.md deleted file mode 100644 index 38de1cc89..000000000 --- a/packages/plugins/minos-broker-kafka/docs/index.md +++ /dev/null @@ -1,16 +0,0 @@ -# Welcome to Minos Broker Kafka's documentation! - -.. toctree:: - :maxdepth: 2 - - readme - runthetests - usage - api/minos.plugins - authors - history - -# Indices and tables -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/packages/plugins/minos-broker-kafka/docs/readme.md b/packages/plugins/minos-broker-kafka/docs/readme.md deleted file mode 100644 index da72dbef1..000000000 --- a/packages/plugins/minos-broker-kafka/docs/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -# Introduction - -.. mdinclude:: ../README.md diff --git a/packages/plugins/minos-broker-kafka/docs/runthetests.md b/packages/plugins/minos-broker-kafka/docs/runthetests.md deleted file mode 100644 index 309db1b96..000000000 --- a/packages/plugins/minos-broker-kafka/docs/runthetests.md +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../RUNTHETESTS.md diff --git a/packages/plugins/minos-broker-kafka/docs/usage.md b/packages/plugins/minos-broker-kafka/docs/usage.md deleted file mode 100644 index 8f04b05ad..000000000 --- a/packages/plugins/minos-broker-kafka/docs/usage.md +++ /dev/null @@ -1 +0,0 @@ -# Usage diff --git a/packages/plugins/minos-broker-kafka/minos/plugins/kafka/__init__.py b/packages/plugins/minos-broker-kafka/minos/plugins/kafka/__init__.py index d9d454e41..d55a2580b 100644 --- a/packages/plugins/minos-broker-kafka/minos/plugins/kafka/__init__.py +++ b/packages/plugins/minos-broker-kafka/minos/plugins/kafka/__init__.py @@ -1,20 +1,18 @@ +"""The kafka plugin of the Minos Framework.""" + __author__ = "Minos Framework Devs" __email__ = "hey@minos.run" -__version__ = "0.6.1" +__version__ = "0.7.0" from .common import ( KafkaBrokerBuilderMixin, KafkaCircuitBreakerMixin, ) from .publisher import ( - InMemoryQueuedKafkaBrokerPublisher, KafkaBrokerPublisher, KafkaBrokerPublisherBuilder, - PostgreSqlQueuedKafkaBrokerPublisher, ) from .subscriber import ( - InMemoryQueuedKafkaBrokerSubscriberBuilder, KafkaBrokerSubscriber, KafkaBrokerSubscriberBuilder, - PostgreSqlQueuedKafkaBrokerSubscriberBuilder, ) diff --git a/packages/plugins/minos-broker-kafka/minos/plugins/kafka/publisher.py b/packages/plugins/minos-broker-kafka/minos/plugins/kafka/publisher.py index e2a1cc760..efd181601 100644 --- a/packages/plugins/minos-broker-kafka/minos/plugins/kafka/publisher.py +++ b/packages/plugins/minos-broker-kafka/minos/plugins/kafka/publisher.py @@ -3,7 +3,6 @@ ) import logging -import warnings from asyncio import ( TimeoutError, wait_for, @@ -22,16 +21,10 @@ AIOKafkaProducer, ) -from minos.common import ( - Config, -) from minos.networks import ( BrokerMessage, BrokerPublisher, BrokerPublisherBuilder, - InMemoryBrokerPublisherQueue, - PostgreSqlBrokerPublisherQueue, - QueuedBrokerPublisher, ) from .common import ( @@ -42,34 +35,6 @@ logger = logging.getLogger(__name__) -class PostgreSqlQueuedKafkaBrokerPublisher(QueuedBrokerPublisher): - """PostgreSql Queued Kafka Broker Publisher class.""" - - def __init__(self, *args, **kwargs): - warnings.warn(f"{PostgreSqlQueuedKafkaBrokerPublisher!r} has been deprecated.", DeprecationWarning) - super().__init__(*args, **kwargs) - - @classmethod - def _from_config(cls, config: Config, **kwargs) -> PostgreSqlQueuedKafkaBrokerPublisher: - impl = KafkaBrokerPublisher.from_config(config, **kwargs) - queue = PostgreSqlBrokerPublisherQueue.from_config(config, **kwargs) - return cls(impl, queue, **kwargs) - - -class InMemoryQueuedKafkaBrokerPublisher(QueuedBrokerPublisher): - """In Memory Queued Kafka Broker Publisher class.""" - - def __init__(self, *args, **kwargs): - warnings.warn(f"{InMemoryQueuedKafkaBrokerPublisher!r} has been deprecated.", DeprecationWarning) - super().__init__(*args, **kwargs) - - @classmethod - def _from_config(cls, config: Config, **kwargs) -> InMemoryQueuedKafkaBrokerPublisher: - impl = KafkaBrokerPublisher.from_config(config, **kwargs) - queue = InMemoryBrokerPublisherQueue.from_config(config, **kwargs) - return cls(impl, queue, **kwargs) - - class KafkaBrokerPublisher(BrokerPublisher, KafkaCircuitBreakerMixin): """Kafka Broker Publisher class.""" diff --git a/packages/plugins/minos-broker-kafka/minos/plugins/kafka/subscriber.py b/packages/plugins/minos-broker-kafka/minos/plugins/kafka/subscriber.py index 6f43045d6..1166d0f41 100644 --- a/packages/plugins/minos-broker-kafka/minos/plugins/kafka/subscriber.py +++ b/packages/plugins/minos-broker-kafka/minos/plugins/kafka/subscriber.py @@ -41,9 +41,6 @@ BrokerMessage, BrokerSubscriber, BrokerSubscriberBuilder, - InMemoryBrokerSubscriberQueueBuilder, - PostgreSqlBrokerSubscriberQueueBuilder, - QueuedBrokerSubscriberBuilder, ) from .common import ( @@ -169,10 +166,9 @@ def admin_client(self): async def _receive(self) -> BrokerMessage: try: record = await self.client.getone() - except ConsumerStoppedError as exc: - if self.already_destroyed: - raise StopAsyncIteration - raise exc + except ConsumerStoppedError: + raise StopAsyncIteration + bytes_ = record.value message = BrokerMessage.from_avro_bytes(bytes_) return message @@ -196,27 +192,3 @@ class KafkaBrokerSubscriberBuilder(BrokerSubscriberBuilder[KafkaBrokerSubscriber KafkaBrokerSubscriber.set_builder(KafkaBrokerSubscriberBuilder) - - -class PostgreSqlQueuedKafkaBrokerSubscriberBuilder(QueuedBrokerSubscriberBuilder): - """PostgreSql Queued Kafka Broker Subscriber Builder class.""" - - def __init__(self, *args, **kwargs): - super().__init__( - *args, - impl_builder=KafkaBrokerSubscriberBuilder.new(), - queue_builder=PostgreSqlBrokerSubscriberQueueBuilder.new(), - **kwargs, - ) - - -class InMemoryQueuedKafkaBrokerSubscriberBuilder(QueuedBrokerSubscriberBuilder): - """In Memory Queued Kafka Broker Subscriber Builder class.""" - - def __init__(self, *args, **kwargs): - super().__init__( - *args, - impl_builder=KafkaBrokerSubscriberBuilder.new(), - queue_builder=InMemoryBrokerSubscriberQueueBuilder.new(), - **kwargs, - ) diff --git a/packages/plugins/minos-broker-kafka/poetry.lock b/packages/plugins/minos-broker-kafka/poetry.lock index eb3bdd087..41d502113 100644 --- a/packages/plugins/minos-broker-kafka/poetry.lock +++ b/packages/plugins/minos-broker-kafka/poetry.lock @@ -33,37 +33,6 @@ develop = ["aiocontextvars (==0.2.2)", "aiohttp-asgi", "aiohttp (<4)", "async-ti raven = ["raven-aiohttp"] uvloop = ["uvloop (>=0.14,<1)"] -[[package]] -name = "aiopg" -version = "1.3.3" -description = "Postgres integration with asyncio." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -async-timeout = ">=3.0,<5.0" -psycopg2-binary = ">=2.8.4" - -[package.extras] -sa = ["sqlalchemy[postgresql_psycopg2binary] (>=1.3,<1.5)"] - -[[package]] -name = "alabaster" -version = "0.7.12" -description = "A configurable sidebar-enabled Sphinx theme" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "async-timeout" -version = "4.0.2" -description = "Timeout context manager for asyncio programs" -category = "main" -optional = false -python-versions = ">=3.6" - [[package]] name = "atomicwrites" version = "1.4.0" @@ -86,20 +55,9 @@ docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] -[[package]] -name = "babel" -version = "2.9.1" -description = "Internationalization utilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -pytz = ">=2015.7" - [[package]] name = "black" -version = "22.1.0" +version = "22.3.0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -110,7 +68,7 @@ click = ">=8.0.0" mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = ">=1.1.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] @@ -127,40 +85,13 @@ category = "main" optional = false python-versions = "*" -[[package]] -name = "certifi" -version = "2021.10.8" -description = "Python package for providing Mozilla's CA Bundle." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "cfgv" -version = "3.3.1" -description = "Validate configuration and produce human readable error messages." -category = "dev" -optional = false -python-versions = ">=3.6.1" - -[[package]] -name = "charset-normalizer" -version = "2.0.12" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "dev" -optional = false -python-versions = ">=3.5.0" - -[package.extras] -unicode_backport = ["unicodedata2"] - [[package]] name = "click" -version = "8.0.4" +version = "8.1.3" description = "Composable command line interface toolkit" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -208,7 +139,7 @@ python-versions = "*" [[package]] name = "dependency-injector" -version = "4.39.0" +version = "4.39.1" description = "Dependency injection framework for Python" category = "main" optional = false @@ -223,25 +154,9 @@ flask = ["flask"] pydantic = ["pydantic"] yaml = ["pyyaml"] -[[package]] -name = "distlib" -version = "0.3.4" -description = "Distribution utilities" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "docutils" -version = "0.17.1" -description = "Docutils -- Python Documentation Utilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - [[package]] name = "fastavro" -version = "1.4.10" +version = "1.4.11" description = "Fast read/write of AVRO files" category = "main" optional = false @@ -253,18 +168,6 @@ lz4 = ["lz4"] snappy = ["python-snappy"] zstandard = ["zstandard"] -[[package]] -name = "filelock" -version = "3.6.0" -description = "A platform independent file lock." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"] -testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-cov", "pytest-timeout (>=1.4.2)"] - [[package]] name = "flake8" version = "4.0.1" @@ -278,49 +181,6 @@ mccabe = ">=0.6.0,<0.7.0" pycodestyle = ">=2.8.0,<2.9.0" pyflakes = ">=2.4.0,<2.5.0" -[[package]] -name = "identify" -version = "2.4.12" -description = "File identification library for Python" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -license = ["ukkonen"] - -[[package]] -name = "idna" -version = "3.3" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "dev" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "imagesize" -version = "1.3.0" -description = "Getting image size from png/jpeg/jpeg2000/gif file" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "importlib-metadata" -version = "4.11.3" -description = "Read metadata from Python packages" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] -perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] - [[package]] name = "iniconfig" version = "1.1.1" @@ -343,20 +203,6 @@ requirements_deprecated_finder = ["pipreqs", "pip-api"] colors = ["colorama (>=0.4.3,<0.5.0)"] plugins = ["setuptools"] -[[package]] -name = "jinja2" -version = "3.1.1" -description = "A very fast and expressive template engine." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - [[package]] name = "kafka-python" version = "2.0.2" @@ -368,34 +214,6 @@ python-versions = "*" [package.extras] crc32c = ["crc32c"] -[[package]] -name = "lmdb" -version = "1.3.0" -description = "Universal Python binding for the LMDB 'Lightning' Database" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "m2r2" -version = "0.3.2" -description = "Markdown and reStructuredText in a single file." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -docutils = "*" -mistune = "0.8.4" - -[[package]] -name = "markupsafe" -version = "2.1.1" -description = "Safely add untrusted strings to HTML/XML markup." -category = "dev" -optional = false -python-versions = ">=3.7" - [[package]] name = "mccabe" version = "0.6.1" @@ -406,7 +224,7 @@ python-versions = "*" [[package]] name = "minos-microservice-common" -version = "0.6.0" +version = "0.7.0" description = "The common core of the Minos Framework" category = "main" optional = false @@ -414,12 +232,10 @@ python-versions = "^3.9" develop = true [package.dependencies] -aiomisc = ">=14.0.3,<16.0.0" -aiopg = "^1.2.1" +aiomisc = ">=14.0.3,<15.8.0" cached-property = "^1.5.2" dependency-injector = "^4.32.2" fastavro = "^1.4.0" -lmdb = "^1.2.1" orjson = "^3.5.2" PyYAML = ">=5.4.1,<7.0.0" uvloop = "^0.16.0" @@ -430,7 +246,7 @@ url = "../../core/minos-microservice-common" [[package]] name = "minos-microservice-networks" -version = "0.6.0" +version = "0.7.0" description = "The networks core of the Minos Framework" category = "main" optional = false @@ -438,23 +254,13 @@ python-versions = "^3.9" develop = true [package.dependencies] -aiopg = "^1.2.1" crontab = "^0.23.0" -minos-microservice-common = "^0.6.0" -psycopg2-binary = "^2.9.3" +minos-microservice-common = "^0.7.0*" [package.source] type = "directory" url = "../../core/minos-microservice-networks" -[[package]] -name = "mistune" -version = "0.8.4" -description = "The fastest markdown parser in pure Python" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "mypy-extensions" version = "0.4.3" @@ -463,17 +269,9 @@ category = "dev" optional = false python-versions = "*" -[[package]] -name = "nodeenv" -version = "1.6.0" -description = "Node.js virtual environment builder" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "orjson" -version = "3.6.7" +version = "3.6.8" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" category = "main" optional = false @@ -498,25 +296,17 @@ category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -[[package]] -name = "pbr" -version = "5.8.1" -description = "Python Build Reasonableness" -category = "dev" -optional = false -python-versions = ">=2.6" - [[package]] name = "platformdirs" -version = "2.5.1" +version = "2.5.2" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" [package.extras] -docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] +test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] [[package]] name = "pluggy" @@ -530,30 +320,6 @@ python-versions = ">=3.6" dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] -[[package]] -name = "pre-commit" -version = "2.17.0" -description = "A framework for managing and maintaining multi-language pre-commit hooks." -category = "dev" -optional = false -python-versions = ">=3.6.1" - -[package.dependencies] -cfgv = ">=2.0.0" -identify = ">=1.0.0" -nodeenv = ">=0.11.1" -pyyaml = ">=5.1" -toml = "*" -virtualenv = ">=20.0.8" - -[[package]] -name = "psycopg2-binary" -version = "2.9.3" -description = "psycopg2 - Python-PostgreSQL Database Adapter" -category = "main" -optional = false -python-versions = ">=3.6" - [[package]] name = "py" version = "1.11.0" @@ -578,24 +344,16 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -[[package]] -name = "pygments" -version = "2.11.2" -description = "Pygments is a syntax highlighting package written in Python." -category = "dev" -optional = false -python-versions = ">=3.5" - [[package]] name = "pyparsing" -version = "3.0.7" -description = "Python parsing module" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.6.8" [package.extras] -diagrams = ["jinja2", "railroad-diagrams"] +diagrams = ["railroad-diagrams", "jinja2"] [[package]] name = "pytest" @@ -618,14 +376,6 @@ toml = "*" [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] -[[package]] -name = "pytz" -version = "2022.1" -description = "World timezone definitions, modern and historical" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "pyyaml" version = "6.0" @@ -634,24 +384,6 @@ category = "main" optional = false python-versions = ">=3.6" -[[package]] -name = "requests" -version = "2.27.1" -description = "Python HTTP for Humans." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} -urllib3 = ">=1.21.1,<1.27" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] - [[package]] name = "six" version = "1.16.0" @@ -660,159 +392,6 @@ category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -[[package]] -name = "snowballstemmer" -version = "2.2.0" -description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "sphinx" -version = "4.5.0" -description = "Python documentation generator" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -alabaster = ">=0.7,<0.8" -babel = ">=1.3" -colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.14,<0.18" -imagesize = "*" -importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} -Jinja2 = ">=2.3" -packaging = "*" -Pygments = ">=2.0" -requests = ">=2.5.0" -snowballstemmer = ">=1.1" -sphinxcontrib-applehelp = "*" -sphinxcontrib-devhelp = "*" -sphinxcontrib-htmlhelp = ">=2.0.0" -sphinxcontrib-jsmath = "*" -sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = ">=1.1.5" - -[package.extras] -docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.931)", "docutils-stubs", "types-typed-ast", "types-requests"] -test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] - -[[package]] -name = "sphinx-autodoc-typehints" -version = "1.17.0" -description = "Type hints (PEP 484) support for the Sphinx autodoc extension" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -Sphinx = ">=4" - -[package.extras] -testing = ["covdefaults (>=2)", "coverage (>=6)", "diff-cover (>=6.4)", "nptyping (>=1)", "pytest (>=6)", "pytest-cov (>=3)", "sphobjinv (>=2)", "typing-extensions (>=3.5)"] -type_comments = ["typed-ast (>=1.4.0)"] - -[[package]] -name = "sphinx-rtd-theme" -version = "1.0.0" -description = "Read the Docs theme for Sphinx" -category = "dev" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" - -[package.dependencies] -docutils = "<0.18" -sphinx = ">=1.6" - -[package.extras] -dev = ["transifex-client", "sphinxcontrib-httpdomain", "bump2version"] - -[[package]] -name = "sphinxcontrib-apidoc" -version = "0.3.0" -description = "A Sphinx extension for running 'sphinx-apidoc' on each build" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -pbr = "*" -Sphinx = ">=1.6.0" - -[[package]] -name = "sphinxcontrib-applehelp" -version = "1.0.2" -description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-devhelp" -version = "1.0.2" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-htmlhelp" -version = "2.0.0" -description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest", "html5lib"] - -[[package]] -name = "sphinxcontrib-jsmath" -version = "1.0.1" -description = "A sphinx extension which renders display math in HTML via JavaScript" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -test = ["pytest", "flake8", "mypy"] - -[[package]] -name = "sphinxcontrib-qthelp" -version = "1.0.3" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-serializinghtml" -version = "1.1.5" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - [[package]] name = "toml" version = "0.10.2" @@ -831,24 +410,11 @@ python-versions = ">=3.7" [[package]] name = "typing-extensions" -version = "4.1.1" -description = "Backported and Experimental Type Hints for Python 3.6+" +version = "4.2.0" +description = "Backported and Experimental Type Hints for Python 3.7+" category = "dev" optional = false -python-versions = ">=3.6" - -[[package]] -name = "urllib3" -version = "1.26.9" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" - -[package.extras] -brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +python-versions = ">=3.7" [[package]] name = "uvloop" @@ -863,40 +429,10 @@ dev = ["Cython (>=0.29.24,<0.30.0)", "pytest (>=3.6.0)", "Sphinx (>=4.1.2,<4.2.0 docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)"] test = ["aiohttp", "flake8 (>=3.9.2,<3.10.0)", "psutil", "pycodestyle (>=2.7.0,<2.8.0)", "pyOpenSSL (>=19.0.0,<19.1.0)", "mypy (>=0.800)"] -[[package]] -name = "virtualenv" -version = "20.14.0" -description = "Virtual Python Environment builder" -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - -[package.dependencies] -distlib = ">=0.3.1,<1" -filelock = ">=3.2,<4" -platformdirs = ">=2,<3" -six = ">=1.9.0,<2" - -[package.extras] -docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=21.3)"] -testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)"] - -[[package]] -name = "zipp" -version = "3.7.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] - [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "6d3a08fa514c8d815566449ac760a49957e02fee20cf991a2a7b21b76d91e529" +content-hash = "f1c1da04f1d4b12cdd5ad94b0e8ca485e81b635c8cf7fb000302a98b94a77b76" [metadata.files] aiokafka = [ @@ -926,18 +462,6 @@ aiomisc = [ {file = "aiomisc-15.7.3-py3-none-any.whl", hash = "sha256:0403e83268e98d0f2a125a70d13303fe1a2358e36db3daf02df032c7fa4f1525"}, {file = "aiomisc-15.7.3.tar.gz", hash = "sha256:ba250a34bd4609ced36111cb50580f57c3d52f3955f953a53ecb2986988baedc"}, ] -aiopg = [ - {file = "aiopg-1.3.3-py3-none-any.whl", hash = "sha256:2842dd8741460eeef940032dcb577bfba4d4115205dd82a73ce13b3271f5bf0a"}, - {file = "aiopg-1.3.3.tar.gz", hash = "sha256:547c6ba4ea0d73c2a11a2f44387d7133cc01d3c6f3b8ed976c0ac1eff4f595d7"}, -] -alabaster = [ - {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, - {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, -] -async-timeout = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, -] atomicwrites = [ {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, @@ -946,54 +470,38 @@ attrs = [ {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] -babel = [ - {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"}, - {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, -] black = [ - {file = "black-22.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1297c63b9e1b96a3d0da2d85d11cd9bf8664251fd69ddac068b98dc4f34f73b6"}, - {file = "black-22.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2ff96450d3ad9ea499fc4c60e425a1439c2120cbbc1ab959ff20f7c76ec7e866"}, - {file = "black-22.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e21e1f1efa65a50e3960edd068b6ae6d64ad6235bd8bfea116a03b21836af71"}, - {file = "black-22.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f69158a7d120fd641d1fa9a921d898e20d52e44a74a6fbbcc570a62a6bc8ab"}, - {file = "black-22.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:228b5ae2c8e3d6227e4bde5920d2fc66cc3400fde7bcc74f480cb07ef0b570d5"}, - {file = "black-22.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b1a5ed73ab4c482208d20434f700d514f66ffe2840f63a6252ecc43a9bc77e8a"}, - {file = "black-22.1.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35944b7100af4a985abfcaa860b06af15590deb1f392f06c8683b4381e8eeaf0"}, - {file = "black-22.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7835fee5238fc0a0baf6c9268fb816b5f5cd9b8793423a75e8cd663c48d073ba"}, - {file = "black-22.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dae63f2dbf82882fa3b2a3c49c32bffe144970a573cd68d247af6560fc493ae1"}, - {file = "black-22.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fa1db02410b1924b6749c245ab38d30621564e658297484952f3d8a39fce7e8"}, - {file = "black-22.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c8226f50b8c34a14608b848dc23a46e5d08397d009446353dad45e04af0c8e28"}, - {file = "black-22.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2d6f331c02f0f40aa51a22e479c8209d37fcd520c77721c034517d44eecf5912"}, - {file = "black-22.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:742ce9af3086e5bd07e58c8feb09dbb2b047b7f566eb5f5bc63fd455814979f3"}, - {file = "black-22.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fdb8754b453fb15fad3f72cd9cad3e16776f0964d67cf30ebcbf10327a3777a3"}, - {file = "black-22.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5660feab44c2e3cb24b2419b998846cbb01c23c7fe645fee45087efa3da2d61"}, - {file = "black-22.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:6f2f01381f91c1efb1451998bd65a129b3ed6f64f79663a55fe0e9b74a5f81fd"}, - {file = "black-22.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:efbadd9b52c060a8fc3b9658744091cb33c31f830b3f074422ed27bad2b18e8f"}, - {file = "black-22.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8871fcb4b447206904932b54b567923e5be802b9b19b744fdff092bd2f3118d0"}, - {file = "black-22.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccad888050f5393f0d6029deea2a33e5ae371fd182a697313bdbd835d3edaf9c"}, - {file = "black-22.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07e5c049442d7ca1a2fc273c79d1aecbbf1bc858f62e8184abe1ad175c4f7cc2"}, - {file = "black-22.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:373922fc66676133ddc3e754e4509196a8c392fec3f5ca4486673e685a421321"}, - {file = "black-22.1.0-py3-none-any.whl", hash = "sha256:3524739d76b6b3ed1132422bf9d82123cd1705086723bc3e235ca39fd21c667d"}, - {file = "black-22.1.0.tar.gz", hash = "sha256:a7c0192d35635f6fc1174be575cb7915e92e5dd629ee79fdaf0dcfa41a80afb5"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"}, + {file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"}, + {file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"}, + {file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"}, + {file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"}, + {file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"}, + {file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"}, + {file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"}, + {file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"}, + {file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"}, + {file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"}, + {file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"}, + {file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"}, + {file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"}, + {file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"}, + {file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"}, + {file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"}, + {file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"}, ] cached-property = [ {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, ] -certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, -] -cfgv = [ - {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, - {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, - {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, -] click = [ - {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"}, - {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, ] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, @@ -1050,93 +558,65 @@ crontab = [ {file = "crontab-0.23.0.tar.gz", hash = "sha256:ca79dede9c2f572bb32f38703e8fddcf3427e86edc838f2ffe7ae4b9ee2b0733"}, ] dependency-injector = [ - {file = "dependency-injector-4.39.0.tar.gz", hash = "sha256:35d6c03683f512bcc8b0c950890ac40ce19bdacc7de4d59249dd61ed818f0930"}, - {file = "dependency_injector-4.39.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f046a5dbe7e5764fae9a69423f66241a8fdb62acea5c32b0c41a7da94b7f6da3"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfdd78f7d97c1f6ba4a3926a2e404507a4f77ecbd610d4a1b37dedb5c0b57ad1"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:512c23da829bb8ac2ae13f33aa017acf58ae9408e7796a146e1644e8b8471b5b"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7dc81df7f566bfdacdee448bc71085acd163b935860d2b2504b4f32840b3b692"}, - {file = "dependency_injector-4.39.0-cp310-cp310-win32.whl", hash = "sha256:9ffc5393700f45d740abecc50cdc1251eae69e50516ec9d0a48fba0e875ed083"}, - {file = "dependency_injector-4.39.0-cp310-cp310-win_amd64.whl", hash = "sha256:9118f36a3df1e9819074ccb35734d663812c8f6ef81d45c8e4ec81ce5dccac9c"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:1ff723aaf096fabb05cf8b08ba99888538a2a77e03a5082b70cd54eb9df619f3"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bb913900ceb1766f55dc628052d8e191a9c2b1737a0d775fbc230af90ab2c1e"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:329e801eb46b9933432481d3142e563e28a90d77952edac43126264c36ed2278"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1c1a67c699ae2c0234f07d121736fa44e8fe2d56c14b2fd210c3e04a151620bb"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-win32.whl", hash = "sha256:e1347defd46fe9067f857b1174bdb1b19458232ac1a485507df2ddff084cf31c"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-win_amd64.whl", hash = "sha256:9581c4c90f1aaf85ffb9b06bac7ac592df7076522881145321a9dd0702fee828"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8da8ff05fa17e852aa5831a600177e5bb72bf53b8a184f6922ae715387a460ba"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58a56999cebd8b2ba9c19e514e383924865e5f7d6273f8e5b7d85468d9042059"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4914332d6145fb7cfc5f2236a823a3859b92a7e75566ffca0987dcc0f7f7be53"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00aea40ee2d400a8091947ad97cda34b230628aeeac1774f8fa9a3500b5704b2"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-win32.whl", hash = "sha256:b94a64bc73d86d04b33c698fae4b9dad2536a8534ac6922c8226764da5d62d17"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4f59cc0b0d3beb82875d94b7e725b5097a7a454e8e323625ba6ac3095a29300e"}, - {file = "dependency_injector-4.39.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a8d840348f01d997e32394dba36e09c1ecd312b286befb6b3ca27526002ae94"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92097ffabca89d1539e200f91bfa13ff8ca502c9057391c3b78787d50fe502ed"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4a889e116fe76742ef6ff27d5e93ee9e364cbe7bbc6678df8c5dd54597a6fc"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a31e00961fdc1b3808a9e2adeb1107ec4bba0ad3a90b116af9d116a667e4626a"}, - {file = "dependency_injector-4.39.0-cp38-cp38-win32.whl", hash = "sha256:717720a220eee611ea96c0089246ec2103b168303ca2cd2c8a7cd3856da6f689"}, - {file = "dependency_injector-4.39.0-cp38-cp38-win_amd64.whl", hash = "sha256:05c0bbef90182a0d35d4d3f9ab879109070d204394578b12f0eff9eca51987ef"}, - {file = "dependency_injector-4.39.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f10bf8d146edffbee2ba5c5776395625c98048a31997afd481ce27792afee2af"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30c093b155c01e50723e8ecd2a14230daa4417356c8fb5a27369ae5be24b21d9"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dda8a85c8221e6ee433caa01c1bc4fed610381924780e04470572682569cdb8f"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ff8df47a901218a3257650f3f3a6b402dd58cb4f57b4a34d6e8092112f6e8480"}, - {file = "dependency_injector-4.39.0-cp39-cp39-win32.whl", hash = "sha256:e078c84c19ae73883a57e9b35edd843925b2b44833cd098708139a98abee5a96"}, - {file = "dependency_injector-4.39.0-cp39-cp39-win_amd64.whl", hash = "sha256:c02b6796320d6b9363d566045eeec243fa4a412ad68dcc6b2391307e93d0d401"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:865bf5ceba3e32f00e36bfcbefb1267b10df961fb2aab809f5e205968e1cd59b"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ce8645ffd8cc15a7bbd20c02e6439a61c1566a1db22766893bf79981fb89a4e"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dbdab8b024055865926a78ecbc3a6280345f4615e5c505511bbd7c6c322b1796"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:af996d66350704261382dc4e10f324eba5d23e35c04a9e75c7cb58fbea7f1f1d"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d390c6e97fec13fba832b7e39e07c43760ed3d46af4887005f679c0ab6eb9b2e"}, -] -distlib = [ - {file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"}, - {file = "distlib-0.3.4.zip", hash = "sha256:e4b58818180336dc9c529bfb9a0b58728ffc09ad92027a3f30b7cd91e3458579"}, -] -docutils = [ - {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, - {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, + {file = "dependency-injector-4.39.1.tar.gz", hash = "sha256:9ab76dc5e19b2692aaca49e00f9b41a087138d139b0ec985f92ff0498f038772"}, + {file = "dependency_injector-4.39.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c788a3d5482e63b5fd55e14fc258f1ff0b51b411927ab132ef0f689cb5d1183f"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0832e0457a360725cd1d1037b77b85478aeeaacc60e85ecceeb8020409e7b62"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d51998fff9704fd01d11c3c48f4e88d8506cb6afa1ee41409a881a5a51dae3fc"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea484cd13fc62966bf5582df0816205feee072d18f228aac75f7807b43f223ae"}, + {file = "dependency_injector-4.39.1-cp310-cp310-win32.whl", hash = "sha256:17389e53ec29ca13570319cf2065dcc4c2f6d36db5dd792bb1e8f2c39a9f146b"}, + {file = "dependency_injector-4.39.1-cp310-cp310-win_amd64.whl", hash = "sha256:55b0988489267c5a580f419133770ffe293057f2064da1c9ad6a2cc69666739b"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b297c3e79d3633cc56366386ae1f7dbce1587673cca2f559c368c1e936a1fa94"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2728827c5abb2420c5811e218262ae1b77a48e76cc9eebc6b4f55fee48a1a18d"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:029e42b064ab8cb5b2559be040ff682c7aa81592f1654a82355475956df17803"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:305e3db3f4bf40f64caaa1303e03005174e78d2339d2ae517b34c011ec2300f9"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-win32.whl", hash = "sha256:a661dd23a5e4e2f6bf4a729de7fadbe148c9a4a298dbcadfc5a94584b6930970"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-win_amd64.whl", hash = "sha256:340d6e7af5c4729d20c837d6d1e8a2626c24a05259dff746406cc823e26ba1e7"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a1553dac1c95f0de1f910b0025ee4570ea078a07d576bcdc2168990e719cea50"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c7baaa64d93359ee08c15d68579cc803e11d9becaf961f5a66b94ff627248e1"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7a27bf1951a066cf347b886cc7ab0f37dcbd1ad59bffcfe721c8c12a189a150d"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da6e2d685f7d0c65257f08133b68d9bf74ec319b90a0f21b4f629d168ce5f68f"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-win32.whl", hash = "sha256:a8ddd03ca86e67e9d3cc038793d34fbfccab12e6145df813e72bf14f9371f2ea"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-win_amd64.whl", hash = "sha256:e01a319ea05cd86b520201386dcb53a81a5400cb82fcc2f006bd7e92c0c51a0a"}, + {file = "dependency_injector-4.39.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4704804bde25b694aa65201927937a9d82d8bc055cb3dadc68eb05988bd34fa9"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0935d50b263169e7b0826a2fb6be80d6a4f2a7c59e6dd9876f86da3243bea9eb"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3c34aa5abb1826b6189f47daf6e469d4293c1d01693233da2c1b923816270cc5"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:db64904c9b9a88756cfece3e3ed078a2b57127642711dd08af342dba8abf9667"}, + {file = "dependency_injector-4.39.1-cp38-cp38-win32.whl", hash = "sha256:66ebe728194adc8720dbc4d662edbbfa55659ff23c9c493fb2dae0bfd4df5734"}, + {file = "dependency_injector-4.39.1-cp38-cp38-win_amd64.whl", hash = "sha256:4349974620f630d6726808e1291ec99713b64d449b84eb01581ee807a5a5c224"}, + {file = "dependency_injector-4.39.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d87cad0899b05cd08931bfb68ddf7be77711a67b0649c37f2045d7808977b082"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8efd965e5cfdd9f339ec895e73c119569851adedc175088d34a670f5206fea63"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:27f69485ca6b85c31d162ee86cf6ef71bb71dce9cd2b5d0745425dfc551eefa1"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a25b63de59dff04ec78f5161f00c0222a04a23def5d1f0eda14e389a32baf428"}, + {file = "dependency_injector-4.39.1-cp39-cp39-win32.whl", hash = "sha256:a14274f50d125b4579314c355e22af07def1a96641ca94bd75edcf1400b89477"}, + {file = "dependency_injector-4.39.1-cp39-cp39-win_amd64.whl", hash = "sha256:9950039d00625f9252cd26378a4406342b256886bb61e4db8b65e9f01270f53e"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6d7f39cd54678741e132e13da3a1367ac18058cbda61fe39d61c8583aa6fd757"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2368c7ba3c9ffaf816ea0f2d14c78d481491b805f62ac8496a78a51397d4689"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:84e32407bb16c58aa0d4b5ed8485537bc66ccc14cfffae7022f1204e35ec939a"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f2d80a42c546e1f934d427b071630d86653cd4a60c74b570c4ffb03025c1f1f9"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ca126bbed370b8c002c859ebeb76f6d83eba2d7fb5d66f37f47cfc19661d2889"}, ] fastavro = [ - {file = "fastavro-1.4.10-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:f225c81e869b3cefef6f2b478cd452693181ed7e645be3cea4d82024354ecaa0"}, - {file = "fastavro-1.4.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7669302c9124b7cd6c1bdff80c77116b2290c984814077fb7d01d7389586054"}, - {file = "fastavro-1.4.10-cp310-cp310-win_amd64.whl", hash = "sha256:995525bdfbdfef205ea148b5bc6a9fe5ccf921931123c39d9aad75a2b661681e"}, - {file = "fastavro-1.4.10-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:64244c53f1e4853184c2f7383d0332e1dcb34c38c05e6613530ade0378e8acfc"}, - {file = "fastavro-1.4.10-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c60965da6dc7a91e00ccd84d84797fad746555f44e8a816c4cc460fb231c44fe"}, - {file = "fastavro-1.4.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10eb25378f37dc00c10e83c4c0442c1a6d1b871f74a6dfdfc12b6447962bbdd0"}, - {file = "fastavro-1.4.10-cp37-cp37m-win_amd64.whl", hash = "sha256:d5719adf6045fc743de5fa738d561a81e58dc782c94f1b16cb21b5dd6253e7fd"}, - {file = "fastavro-1.4.10-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:24c4a1a8cc92e135ecfcd9cbd1f6cfa088cbc74d78c18e02a609cb11fa33778d"}, - {file = "fastavro-1.4.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0934490b0c3bcfd6bcbacbcb5144c6b5e4298cda209fbb17c856adf5405127dd"}, - {file = "fastavro-1.4.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a23763d73412c077aee401a0368c64cbc23859e26711dbae78a3cf0227f65165"}, - {file = "fastavro-1.4.10-cp38-cp38-win_amd64.whl", hash = "sha256:09f1dfdd8192ae09e0f477d1f024d8054fccdb099ad495d2a796bcee3cadebd1"}, - {file = "fastavro-1.4.10-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:0c6695753fa3035bbd0fa5cb21bf1b5dad39483c669b32ca0bb55fb07c1ccc87"}, - {file = "fastavro-1.4.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35f960dbba04647d8d6d5616f879622d2a1e8a84eb2d2e02a883a22e0803463a"}, - {file = "fastavro-1.4.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9660878ca01e3dbbee12385c5902a2b6b12ecbb5af4733d1026175a14b1ef67f"}, - {file = "fastavro-1.4.10-cp39-cp39-win_amd64.whl", hash = "sha256:64cbd386e408b3bcb2de53b1f847163073eb0d0d0338db65f76051c6ba9a9bc1"}, - {file = "fastavro-1.4.10.tar.gz", hash = "sha256:a24f9dd803c44bfb599476b000f9bd0088f7ac2401e6c20818f38d8af12785a0"}, -] -filelock = [ - {file = "filelock-3.6.0-py3-none-any.whl", hash = "sha256:f8314284bfffbdcfa0ff3d7992b023d4c628ced6feb957351d4c48d059f56bc0"}, - {file = "filelock-3.6.0.tar.gz", hash = "sha256:9cd540a9352e432c7246a48fe4e8712b10acb1df2ad1f30e8c070b82ae1fed85"}, + {file = "fastavro-1.4.11-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:44f01008f95d685edacc4b10366c755d25612df00924349f7d34a29f08522ce3"}, + {file = "fastavro-1.4.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18f5e736d12e67348f253da8a332d7c3b483ca04f2b6e772befa79d1a46bac9d"}, + {file = "fastavro-1.4.11-cp310-cp310-win_amd64.whl", hash = "sha256:8dca11bc3191cd7de0a3c4b76a70dac493356a219e96ebcde0def1f06faddef7"}, + {file = "fastavro-1.4.11-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:7a2a0bf03686f9d860e8f8476be000f5b3e6cc9af6853dbabab2ef9cfa5dc3a0"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c17e3decfac260e1be4d02d1903d2483eec2f3ce7f92c9b808a0f6a81572c4b"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19ba25c6529f50722a7618cc4ca24c7d265def57fd9f94e4e554e1df8cce38d2"}, + {file = "fastavro-1.4.11-cp37-cp37m-win_amd64.whl", hash = "sha256:ceaba04da9419f40899a670eb62eb373a127b511bb8e3ae4f6f1f23ec49bd0e4"}, + {file = "fastavro-1.4.11-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:732eab3a1ae5d2c3f4b52e747c55bcc41c4df0eb7e8a395038080741a3c0a934"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c03d3c802b71f44e7b3442abae961bba996258244bd222b242ad1e5cb7754e57"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cb7475a9b25b9f8aebe7eb756dafedd0369434571062f3883d894281befd7c"}, + {file = "fastavro-1.4.11-cp38-cp38-win_amd64.whl", hash = "sha256:ce0776f54591aef90bcd02bd919964abe4c2ad2a10a4336c3a1b66cef289b41c"}, + {file = "fastavro-1.4.11-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:621e72cc365c9539d7590e7b43e48a62e6bfb4c2de7c16837fed54d113d7312c"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:842b25782f911ee8c626f9d9fedc2ef01aeac272536fe90ee6d45b2ae7cdb024"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8491bfcba25c9d661289f884688e5a4f56f2ee389a240d0ad02692495a9a087"}, + {file = "fastavro-1.4.11-cp39-cp39-win_amd64.whl", hash = "sha256:c94130a8c8d80073eb0276844915aa5e928ae322024e76dc57943542ccda211c"}, + {file = "fastavro-1.4.11.tar.gz", hash = "sha256:7c64332ad52de0134be9a933ca986514c3ff85c63d54bc5398c31f0498ac1820"}, ] flake8 = [ {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, ] -identify = [ - {file = "identify-2.4.12-py2.py3-none-any.whl", hash = "sha256:5f06b14366bd1facb88b00540a1de05b69b310cbc2654db3c7e07fa3a4339323"}, - {file = "identify-2.4.12.tar.gz", hash = "sha256:3f3244a559290e7d3deb9e9adc7b33594c1bc85a9dd82e0f1be519bf12a1ec17"}, -] -idna = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, -] -imagesize = [ - {file = "imagesize-1.3.0-py2.py3-none-any.whl", hash = "sha256:1db2f82529e53c3e929e8926a1fa9235aa82d0bd0c580359c67ec31b2fddaa8c"}, - {file = "imagesize-1.3.0.tar.gz", hash = "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d"}, -] -importlib-metadata = [ - {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, - {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, -] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, @@ -1145,140 +625,53 @@ isort = [ {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, ] -jinja2 = [ - {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"}, - {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"}, -] kafka-python = [ {file = "kafka-python-2.0.2.tar.gz", hash = "sha256:04dfe7fea2b63726cd6f3e79a2d86e709d608d74406638c5da33a01d45a9d7e3"}, {file = "kafka_python-2.0.2-py2.py3-none-any.whl", hash = "sha256:2d92418c7cb1c298fa6c7f0fb3519b520d0d7526ac6cb7ae2a4fc65a51a94b6e"}, ] -lmdb = [ - {file = "lmdb-1.3.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:63cb73fe7ce9eb93d992d632c85a0476b4332670d9e6a2802b5062f603b7809f"}, - {file = "lmdb-1.3.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:abbc439cd9fe60ffd6197009087ea885ac150017dc85384093b1d376f83f0ec4"}, - {file = "lmdb-1.3.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6260a526e4ad85b1f374a5ba9475bf369fb07e7728ea6ec57226b02c40d1976b"}, - {file = "lmdb-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e568ae0887ae196340947d9800136e90feaed6b86a261ef01f01b2ba65fc8106"}, - {file = "lmdb-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6a816954d212f40fd15007cd81ab7a6bebb77436d949a6a9ae04af57fc127f3"}, - {file = "lmdb-1.3.0-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:fa6439356e591d3249ab0e1778a6f8d8408e993f66dc911914c78208f5310309"}, - {file = "lmdb-1.3.0-cp35-cp35m-win_amd64.whl", hash = "sha256:c6adbd6f7f9048e97f31a069e652eb51020a81e80a0ce92dbb9810d21da2409a"}, - {file = "lmdb-1.3.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:eefb392f6b5cd43aada49258c5a79be11cb2c8cd3fc3e2d9319a1e0b9f906458"}, - {file = "lmdb-1.3.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a14aca2651c3af6f0d0a6b9168200eea0c8f2d27c40b01a442f33329a6e8dff"}, - {file = "lmdb-1.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cfa4aa9c67f8aee89b23005e98d1f3f32490b6b905fd1cb604b207cbd5755ab"}, - {file = "lmdb-1.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7da05d70fcc6561ac6b09e9fb1bf64b7ca294652c64c8a2889273970cee796b9"}, - {file = "lmdb-1.3.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:008243762decf8f6c90430a9bced56290ebbcdb5e877d90e42343bb97033e494"}, - {file = "lmdb-1.3.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:17215a42a4b9814c383deabecb160581e4fb75d00198eef0e3cea54f230ffbea"}, - {file = "lmdb-1.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65334eafa5d430b18d81ebd5362559a41483c362e1931f6e1b15bab2ecb7d75d"}, - {file = "lmdb-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:18c69fabdaf04efaf246587739cc1062b3e57c6ef0743f5c418df89e5e7e7b9b"}, - {file = "lmdb-1.3.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:41318717ab5d15ad2d6d263d34fbf614a045210f64b25e59ce734bb2105e421f"}, - {file = "lmdb-1.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:df2724bad7820114a205472994091097d0fa65a3e5fff5a8e688d123fb8c6326"}, - {file = "lmdb-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ddd590e1c7fcb395931aa3782fb89b9db4550ab2d81d006ecd239e0d462bc41"}, - {file = "lmdb-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:4172fba19417d7b29409beca7d73c067b54e5d8ab1fb9b51d7b4c1445d20a167"}, - {file = "lmdb-1.3.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2df38115dd9428a54d59ae7c712a4c7cce0d6b1d66056de4b1a8c38718066106"}, - {file = "lmdb-1.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d9103aa4908f0bca43c5911ca067d4e3d01f682dff0c0381a1239bd2bd757984"}, - {file = "lmdb-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:394df860c3f93cfd92b6f4caba785f38208cc9614c18b3803f83a2cc1695042f"}, - {file = "lmdb-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:62ab28e3593bdc318ea2f2fa1574e5fca3b6d1f264686d773ba54a637d4f563b"}, - {file = "lmdb-1.3.0-pp27-pypy_73-macosx_10_7_x86_64.whl", hash = "sha256:e6a704b3baced9182836c7f77b769f23856f3a8f62d0282b1bc1feaf81a86712"}, - {file = "lmdb-1.3.0-pp27-pypy_73-win_amd64.whl", hash = "sha256:08f4b5129f4683802569b02581142e415c8dcc0ff07605983ec1b07804cecbad"}, - {file = "lmdb-1.3.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:f291e3f561f58dddf63a92a5a6a4b8af3a0920b6705d35e2f80e52e86ee238a2"}, - {file = "lmdb-1.3.0.tar.gz", hash = "sha256:60a11efc21aaf009d06518996360eed346f6000bfc9de05114374230879f992e"}, -] -m2r2 = [ - {file = "m2r2-0.3.2-py3-none-any.whl", hash = "sha256:d3684086b61b4bebe2307f15189495360f05a123c9bda2a66462649b7ca236aa"}, - {file = "m2r2-0.3.2.tar.gz", hash = "sha256:ccd95b052dcd1ac7442ecb3111262b2001c10e4119b459c34c93ac7a5c2c7868"}, -] -markupsafe = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, -] mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] minos-microservice-common = [] minos-microservice-networks = [] -mistune = [ - {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, - {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, -] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] -nodeenv = [ - {file = "nodeenv-1.6.0-py2.py3-none-any.whl", hash = "sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"}, - {file = "nodeenv-1.6.0.tar.gz", hash = "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b"}, -] orjson = [ - {file = "orjson-3.6.7-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:93188a9d6eb566419ad48befa202dfe7cd7a161756444b99c4ec77faea9352a4"}, - {file = "orjson-3.6.7-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:82515226ecb77689a029061552b5df1802b75d861780c401e96ca6bc8495f775"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3af57ffab7848aaec6ba6b9e9b41331250b57bf696f9d502bacdc71a0ebab0ba"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:a7297504d1142e7efa236ffc53f056d73934a993a08646dbcee89fc4308a8fcf"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:5a50cde0dbbde255ce751fd1bca39d00ecd878ba0903c0480961b31984f2fab7"}, - {file = "orjson-3.6.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d21f9a2d1c30e58070f93988db4cad154b9009fafbde238b52c1c760e3607fbe"}, - {file = "orjson-3.6.7-cp310-none-win_amd64.whl", hash = "sha256:e152464c4606b49398afd911777decebcf9749cc8810c5b4199039e1afb0991e"}, - {file = "orjson-3.6.7-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:0a65f3c403f38b0117c6dd8e76e85a7bd51fcd92f06c5598dfeddbc44697d3e5"}, - {file = "orjson-3.6.7-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:6c47cfca18e41f7f37b08ff3e7abf5ada2d0f27b5ade934f05be5fc5bb956e9d"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:63185af814c243fad7a72441e5f98120c9ecddf2675befa486d669fb65539e9b"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2da6fde42182b80b40df2e6ab855c55090ebfa3fcc21c182b7ad1762b61d55c"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:48c5831ec388b4e2682d4ff56d6bfa4a2ef76c963f5e75f4ff4785f9cf338a80"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:913fac5d594ccabf5e8fbac15b9b3bb9c576d537d49eeec9f664e7a64dde4c4b"}, - {file = "orjson-3.6.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:58f244775f20476e5851e7546df109f75160a5178d44257d437ba6d7e562bfe8"}, - {file = "orjson-3.6.7-cp37-none-win_amd64.whl", hash = "sha256:2d5f45c6b85e5f14646df2d32ecd7ff20fcccc71c0ea1155f4d3df8c5299bbb7"}, - {file = "orjson-3.6.7-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:612d242493afeeb2068bc72ff2544aa3b1e627578fcf92edee9daebb5893ffea"}, - {file = "orjson-3.6.7-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:539cdc5067db38db27985e257772d073cd2eb9462d0a41bde96da4e4e60bd99b"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6d103b721bbc4f5703f62b3882e638c0b65fcdd48622531c7ffd45047ef8e87c"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb10a20f80e95102dd35dfbc3a22531661b44a09b55236b012a446955846b023"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:bb68d0da349cf8a68971a48ad179434f75256159fe8b0715275d9b49fa23b7a3"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:4a2c7d0a236aaeab7f69c17b7ab4c078874e817da1bfbb9827cb8c73058b3050"}, - {file = "orjson-3.6.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3be045ca3b96119f592904cf34b962969ce97bd7843cbfca084009f6c8d2f268"}, - {file = "orjson-3.6.7-cp38-none-win_amd64.whl", hash = "sha256:bd765c06c359d8a814b90f948538f957fa8a1f55ad1aaffcdc5771996aaea061"}, - {file = "orjson-3.6.7-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:7dd9e1e46c0776eee9e0649e3ae9584ea368d96851bcaeba18e217fa5d755283"}, - {file = "orjson-3.6.7-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:c4b4f20a1e3df7e7c83717aff0ef4ab69e42ce2fb1f5234682f618153c458406"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7107a5673fd0b05adbb58bf71c1578fc84d662d29c096eb6d998982c8635c221"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a08b6940dd9a98ccf09785890112a0f81eadb4f35b51b9a80736d1725437e22c"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:f5d1648e5a9d1070f3628a69a7c6c17634dbb0caf22f2085eca6910f7427bf1f"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:e6201494e8dff2ce7fd21da4e3f6dfca1a3fed38f9dcefc972f552f6596a7621"}, - {file = "orjson-3.6.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:70d0386abe02879ebaead2f9632dd2acb71000b4721fd8c1a2fb8c031a38d4d5"}, - {file = "orjson-3.6.7-cp39-none-win_amd64.whl", hash = "sha256:d9a3288861bfd26f3511fb4081561ca768674612bac59513cb9081bb61fcc87f"}, - {file = "orjson-3.6.7.tar.gz", hash = "sha256:a4bb62b11289b7620eead2f25695212e9ac77fcfba76f050fa8a540fb5c32401"}, + {file = "orjson-3.6.8-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:3a287a650458de2211db03681b71c3e5cb2212b62f17a39df8ad99fc54855d0f"}, + {file = "orjson-3.6.8-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:5204e25c12cea58e524fc82f7c27ed0586f592f777b33075a92ab7b3eb3687c2"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77e8386393add64f959c044e0fb682364fd0e611a6f477aa13f0e6a733bd6a28"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:279f2d2af393fdf8601020744cb206b91b54ad60fb8401e0761819c7bda1f4e4"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:c31c9f389be7906f978ed4192eb58a4b74a37ad60556a0b88ddc47c576697770"}, + {file = "orjson-3.6.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0db5c5a0c5b89f092d52f6e5a3701660a9d6ffa9e2968b3ce17c2bc4f5eb0414"}, + {file = "orjson-3.6.8-cp310-none-win_amd64.whl", hash = "sha256:eb22485847b9a0c4bbedc668df860126ac931edbed1d456cf41a59f3cb961ed8"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:1a5fe569310bc819279bd4d5f2c349910b104ed3207936246dd5d5e0b085e74a"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:ccb356a47ab1067cd3549847e9db1d279a63fe0482d315b3ffd6e7abef35ef77"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab29c069c222248ce302a25855b4e1664f9436e8ae5a131fb0859daf31676d2b"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2b5e4cba9e774ac011071d9d27760f97f4b8cd46003e971d122e712f971345"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:c311ec504414d22834d5b972a209619925b48263856a11a14d90230f9682d49c"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:a3dfec7950b90fb8d143743503ee53fa06b32e6068bdea792fc866284da3d71d"}, + {file = "orjson-3.6.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b890dbbada2cbb26eb29bd43a848426f007f094bb0758df10dfe7a438e1cb4b4"}, + {file = "orjson-3.6.8-cp37-none-win_amd64.whl", hash = "sha256:9143ae2c52771525be9ad11a7a8cc8e7fd75391b107e7e644a9e0050496f6b4f"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:33a82199fd42f6436f833e210ae5129c922a5c355629356ca7a8e82964da7285"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:90159ea8b9a5a2a98fa33dc7b421cfac4d2ae91ba5e1058f5909e7f059f6b467"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:656fbe15d9ef0733e740d9def78f4fdb4153102f4836ee774a05123499005931"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7be3be6153843e0f01351b1313a5ad4723595427680dac2dfff22a37e652ce02"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:dd24f66b6697ee7424f7da575ec6cbffc8ede441114d53470949cda4d97c6e56"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:b07c780f7345ecf5901356dc21dee0669defc489c38ce7b9ab0f5e008cc0385c"}, + {file = "orjson-3.6.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ea32015a5d8a4ce00d348a0de5dc7040e0ad58f970a8fcbb5713a1eac129e493"}, + {file = "orjson-3.6.8-cp38-none-win_amd64.whl", hash = "sha256:c5a3e382194c838988ec128a26b08aa92044e5e055491cc4056142af0c1c54d7"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:83a8424e857ae1bf53530e88b4eb2f16ca2b489073b924e655f1575cacd7f52a"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:81e1a6a2d67f15007dadacbf9ba5d3d79237e5e33786c028557fe5a2b72f1c9a"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:137b539881c77866eba86ff6a11df910daf2eb9ab8f1acae62f879e83d7c38af"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cbd358f3b3ad539a27e36900e8e7d172d0e1b72ad9dd7d69544dcbc0f067ee7"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:6ab94701542d40b90903ecfc339333f458884979a01cb9268bc662cc67a5f6d8"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:32b6f26593a9eb606b40775826beb0dac152e3d224ea393688fced036045a821"}, + {file = "orjson-3.6.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:afd9e329ebd3418cac3cd747769b1d52daa25fa672bbf414ab59f0e0881b32b9"}, + {file = "orjson-3.6.8-cp39-none-win_amd64.whl", hash = "sha256:0c89b419914d3d1f65a1b0883f377abe42a6e44f6624ba1c63e8846cbfc2fa60"}, + {file = "orjson-3.6.8.tar.gz", hash = "sha256:e19d23741c5de13689bb316abfccea15a19c264e3ec8eb332a5319a583595ace"}, ] packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, @@ -1288,80 +681,14 @@ pathspec = [ {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, ] -pbr = [ - {file = "pbr-5.8.1-py2.py3-none-any.whl", hash = "sha256:27108648368782d07bbf1cb468ad2e2eeef29086affd14087a6d04b7de8af4ec"}, - {file = "pbr-5.8.1.tar.gz", hash = "sha256:66bc5a34912f408bb3925bf21231cb6f59206267b7f63f3503ef865c1a292e25"}, -] platformdirs = [ - {file = "platformdirs-2.5.1-py3-none-any.whl", hash = "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"}, - {file = "platformdirs-2.5.1.tar.gz", hash = "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d"}, + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, ] pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] -pre-commit = [ - {file = "pre_commit-2.17.0-py2.py3-none-any.whl", hash = "sha256:725fa7459782d7bec5ead072810e47351de01709be838c2ce1726b9591dad616"}, - {file = "pre_commit-2.17.0.tar.gz", hash = "sha256:c1a8040ff15ad3d648c70cc3e55b93e4d2d5b687320955505587fd79bbaed06a"}, -] -psycopg2-binary = [ - {file = "psycopg2-binary-2.9.3.tar.gz", hash = "sha256:761df5313dc15da1502b21453642d7599d26be88bff659382f8f9747c7ebea4e"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:539b28661b71da7c0e428692438efbcd048ca21ea81af618d845e06ebfd29478"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e82d38390a03da28c7985b394ec3f56873174e2c88130e6966cb1c946508e65"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57804fc02ca3ce0dbfbef35c4b3a4a774da66d66ea20f4bda601294ad2ea6092"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:083a55275f09a62b8ca4902dd11f4b33075b743cf0d360419e2051a8a5d5ff76"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_24_ppc64le.whl", hash = "sha256:0a29729145aaaf1ad8bafe663131890e2111f13416b60e460dae0a96af5905c9"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a79d622f5206d695d7824cbf609a4f5b88ea6d6dab5f7c147fc6d333a8787e4"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:090f3348c0ab2cceb6dfbe6bf721ef61262ddf518cd6cc6ecc7d334996d64efa"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a9e1f75f96ea388fbcef36c70640c4efbe4650658f3d6a2967b4cc70e907352e"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c3ae8e75eb7160851e59adc77b3a19a976e50622e44fd4fd47b8b18208189d42"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-win32.whl", hash = "sha256:7b1e9b80afca7b7a386ef087db614faebbf8839b7f4db5eb107d0f1a53225029"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:8b344adbb9a862de0c635f4f0425b7958bf5a4b927c8594e6e8d261775796d53"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:e847774f8ffd5b398a75bc1c18fbb56564cda3d629fe68fd81971fece2d3c67e"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68641a34023d306be959101b345732360fc2ea4938982309b786f7be1b43a4a1"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3303f8807f342641851578ee7ed1f3efc9802d00a6f83c101d21c608cb864460"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_24_aarch64.whl", hash = "sha256:e3699852e22aa68c10de06524a3721ade969abf382da95884e6a10ff798f9281"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_24_ppc64le.whl", hash = "sha256:526ea0378246d9b080148f2d6681229f4b5964543c170dd10bf4faaab6e0d27f"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:b1c8068513f5b158cf7e29c43a77eb34b407db29aca749d3eb9293ee0d3103ca"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:15803fa813ea05bef089fa78835118b5434204f3a17cb9f1e5dbfd0b9deea5af"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:152f09f57417b831418304c7f30d727dc83a12761627bb826951692cc6491e57"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:404224e5fef3b193f892abdbf8961ce20e0b6642886cfe1fe1923f41aaa75c9d"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-win32.whl", hash = "sha256:1f6b813106a3abdf7b03640d36e24669234120c72e91d5cbaeb87c5f7c36c65b"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:2d872e3c9d5d075a2e104540965a1cf898b52274a5923936e5bfddb58c59c7c2"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:10bb90fb4d523a2aa67773d4ff2b833ec00857f5912bafcfd5f5414e45280fb1"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a52ecab70af13e899f7847b3e074eeb16ebac5615665db33bce8a1009cf33"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a29b3ca4ec9defec6d42bf5feb36bb5817ba3c0230dd83b4edf4bf02684cd0ae"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:12b11322ea00ad8db8c46f18b7dfc47ae215e4df55b46c67a94b4effbaec7094"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_24_ppc64le.whl", hash = "sha256:53293533fcbb94c202b7c800a12c873cfe24599656b341f56e71dd2b557be063"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c381bda330ddf2fccbafab789d83ebc6c53db126e4383e73794c74eedce855ef"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9d29409b625a143649d03d0fd7b57e4b92e0ecad9726ba682244b73be91d2fdb"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:183a517a3a63503f70f808b58bfbf962f23d73b6dccddae5aa56152ef2bcb232"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:15c4e4cfa45f5a60599d9cec5f46cd7b1b29d86a6390ec23e8eebaae84e64554"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-win32.whl", hash = "sha256:adf20d9a67e0b6393eac162eb81fb10bc9130a80540f4df7e7355c2dd4af9fba"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2f9ffd643bc7349eeb664eba8864d9e01f057880f510e4681ba40a6532f93c71"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:def68d7c21984b0f8218e8a15d514f714d96904265164f75f8d3a70f9c295667"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dffc08ca91c9ac09008870c9eb77b00a46b3378719584059c034b8945e26b272"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:280b0bb5cbfe8039205c7981cceb006156a675362a00fe29b16fbc264e242834"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:af9813db73395fb1fc211bac696faea4ca9ef53f32dc0cfa27e4e7cf766dcf24"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_24_ppc64le.whl", hash = "sha256:63638d875be8c2784cfc952c9ac34e2b50e43f9f0a0660b65e2a87d656b3116c"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ffb7a888a047696e7f8240d649b43fb3644f14f0ee229077e7f6b9f9081635bd"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0c9d5450c566c80c396b7402895c4369a410cab5a82707b11aee1e624da7d004"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:d1c1b569ecafe3a69380a94e6ae09a4789bbb23666f3d3a08d06bbd2451f5ef1"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8fc53f9af09426a61db9ba357865c77f26076d48669f2e1bb24d85a22fb52307"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-win32.whl", hash = "sha256:6472a178e291b59e7f16ab49ec8b4f3bdada0a879c68d3817ff0963e722a82ce"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:35168209c9d51b145e459e05c31a9eaeffa9a6b0fd61689b48e07464ffd1a83e"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:47133f3f872faf28c1e87d4357220e809dfd3fa7c64295a4a148bcd1e6e34ec9"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91920527dea30175cc02a1099f331aa8c1ba39bf8b7762b7b56cbf54bc5cce42"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:887dd9aac71765ac0d0bac1d0d4b4f2c99d5f5c1382d8b770404f0f3d0ce8a39"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:1f14c8b0942714eb3c74e1e71700cbbcb415acbc311c730370e70c578a44a25c"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_24_ppc64le.whl", hash = "sha256:7af0dd86ddb2f8af5da57a976d27cd2cd15510518d582b478fbb2292428710b4"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:93cd1967a18aa0edd4b95b1dfd554cf15af657cb606280996d393dadc88c3c35"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bda845b664bb6c91446ca9609fc69f7db6c334ec5e4adc87571c34e4f47b7ddb"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:01310cf4cf26db9aea5158c217caa92d291f0500051a6469ac52166e1a16f5b7"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:99485cab9ba0fa9b84f1f9e1fef106f44a46ef6afdeec8885e0b88d0772b49e8"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-win32.whl", hash = "sha256:46f0e0a6b5fa5851bbd9ab1bc805eef362d3a230fbdfbc209f4a236d0a7a990d"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:accfe7e982411da3178ec690baaceaad3c278652998b2c45828aaac66cd8285f"}, -] py = [ {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, @@ -1374,22 +701,14 @@ pyflakes = [ {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, ] -pygments = [ - {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"}, - {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"}, -] pyparsing = [ - {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"}, - {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, ] pytest = [ {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, ] -pytz = [ - {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"}, - {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"}, -] pyyaml = [ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, @@ -1425,58 +744,10 @@ pyyaml = [ {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] -requests = [ - {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, - {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, -] six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] -snowballstemmer = [ - {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, - {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, -] -sphinx = [ - {file = "Sphinx-4.5.0-py3-none-any.whl", hash = "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226"}, - {file = "Sphinx-4.5.0.tar.gz", hash = "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6"}, -] -sphinx-autodoc-typehints = [ - {file = "sphinx_autodoc_typehints-1.17.0-py3-none-any.whl", hash = "sha256:081daf53077b4ae1c28347d6d858e13e63aefe3b4aacef79fd717dd60687b470"}, - {file = "sphinx_autodoc_typehints-1.17.0.tar.gz", hash = "sha256:51c7b3f5cb9ccd15d0b52088c62df3094f1abd9612930340365c26def8629a14"}, -] -sphinx-rtd-theme = [ - {file = "sphinx_rtd_theme-1.0.0-py2.py3-none-any.whl", hash = "sha256:4d35a56f4508cfee4c4fb604373ede6feae2a306731d533f409ef5c3496fdbd8"}, - {file = "sphinx_rtd_theme-1.0.0.tar.gz", hash = "sha256:eec6d497e4c2195fa0e8b2016b337532b8a699a68bcb22a512870e16925c6a5c"}, -] -sphinxcontrib-apidoc = [ - {file = "sphinxcontrib-apidoc-0.3.0.tar.gz", hash = "sha256:729bf592cf7b7dd57c4c05794f732dc026127275d785c2a5494521fdde773fb9"}, - {file = "sphinxcontrib_apidoc-0.3.0-py2.py3-none-any.whl", hash = "sha256:6671a46b2c6c5b0dca3d8a147849d159065e50443df79614f921b42fbd15cb09"}, -] -sphinxcontrib-applehelp = [ - {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, - {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, -] -sphinxcontrib-devhelp = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, -] -sphinxcontrib-htmlhelp = [ - {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, - {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, -] -sphinxcontrib-jsmath = [ - {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, - {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, -] -sphinxcontrib-qthelp = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, -] -sphinxcontrib-serializinghtml = [ - {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, - {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, -] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, @@ -1486,12 +757,8 @@ tomli = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] typing-extensions = [ - {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, - {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, -] -urllib3 = [ - {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, - {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, + {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, + {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, ] uvloop = [ {file = "uvloop-0.16.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6224f1401025b748ffecb7a6e2652b17768f30b1a6a3f7b44660e5b5b690b12d"}, @@ -1511,11 +778,3 @@ uvloop = [ {file = "uvloop-0.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e5f2e2ff51aefe6c19ee98af12b4ae61f5be456cd24396953244a30880ad861"}, {file = "uvloop-0.16.0.tar.gz", hash = "sha256:f74bc20c7b67d1c27c72601c78cf95be99d5c2cdd4514502b4f3eb0933ff1228"}, ] -virtualenv = [ - {file = "virtualenv-20.14.0-py2.py3-none-any.whl", hash = "sha256:1e8588f35e8b42c6ec6841a13c5e88239de1e6e4e4cedfd3916b306dc826ec66"}, - {file = "virtualenv-20.14.0.tar.gz", hash = "sha256:8e5b402037287126e81ccde9432b95a8be5b19d36584f64957060a3488c11ca8"}, -] -zipp = [ - {file = "zipp-3.7.0-py3-none-any.whl", hash = "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375"}, - {file = "zipp-3.7.0.tar.gz", hash = "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d"}, -] diff --git a/packages/plugins/minos-broker-kafka/pyproject.toml b/packages/plugins/minos-broker-kafka/pyproject.toml index d9ce95801..8c5c0f60a 100644 --- a/packages/plugins/minos-broker-kafka/pyproject.toml +++ b/packages/plugins/minos-broker-kafka/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "minos-broker-kafka" -version = "0.6.1" +version = "0.7.0" description = "The kafka plugin of the Minos Framework" readme = "README.md" repository = "https://github.com/minos-framework/minos-python" @@ -21,18 +21,18 @@ keywords = [ "saga", ] packages = [ - { include = "minos" } + { include = "minos" }, ] include = [ - "AUTHORS.md", - "HISTORY.md", - "LICENSE", + { path = "AUTHORS.md", format = "sdist" }, + { path = "HISTORY.md", format = "sdist" }, + { path = "LICENSE", format = "sdist" }, ] [tool.poetry.dependencies] python = "^3.9" -minos-microservice-common = "^0.6.0" -minos-microservice-networks = "^0.6.0" +minos-microservice-common = "^0.7.0" +minos-microservice-networks = "^0.7.0" aiokafka = "^0.7.0" cached-property = "^1.5.2" kafka-python = "^2.0.2" @@ -45,12 +45,6 @@ isort = "^5.8.0" pytest = "^6.2.4" coverage = "^6.3" flake8 = "^4.0.1" -Sphinx = "^4.0.1" -pre-commit = "^2.12.1" -sphinx-autodoc-typehints = "^1.12.0" -sphinxcontrib-apidoc = "^0.3.0" -sphinx-rtd-theme = "^1.0.0" -m2r2 = "^0.3.2" [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/packages/plugins/minos-broker-kafka/tests/test_config.yml b/packages/plugins/minos-broker-kafka/tests/test_config.yml index 108ab5297..61a8117de 100644 --- a/packages/plugins/minos-broker-kafka/tests/test_config.yml +++ b/packages/plugins/minos-broker-kafka/tests/test_config.yml @@ -10,12 +10,14 @@ rest: host: localhost port: 8080 repository: + client: minos.common.AiopgDatabaseClient database: order_db user: minos password: min0s host: localhost port: 5432 snapshot: + client: minos.common.AiopgDatabaseClient database: order_db user: minos password: min0s @@ -25,6 +27,7 @@ broker: host: localhost port: 9092 queue: + client: minos.common.AiopgDatabaseClient database: order_db user: minos password: min0s diff --git a/packages/plugins/minos-broker-kafka/tests/test_kafka/test_publisher.py b/packages/plugins/minos-broker-kafka/tests/test_kafka/test_publisher.py index c734086da..f2fe188d8 100644 --- a/packages/plugins/minos-broker-kafka/tests/test_kafka/test_publisher.py +++ b/packages/plugins/minos-broker-kafka/tests/test_kafka/test_publisher.py @@ -1,5 +1,4 @@ import unittest -import warnings from unittest.mock import ( AsyncMock, ) @@ -19,14 +18,10 @@ BrokerMessageV1, BrokerMessageV1Payload, BrokerPublisher, - InMemoryBrokerPublisherQueue, - PostgreSqlBrokerPublisherQueue, ) from minos.plugins.kafka import ( - InMemoryQueuedKafkaBrokerPublisher, KafkaBrokerPublisher, KafkaBrokerPublisherBuilder, - PostgreSqlQueuedKafkaBrokerPublisher, ) from tests.utils import ( CONFIG_FILE_PATH, @@ -151,25 +146,5 @@ def test_build(self): self.assertEqual(common_config["port"], publisher.port) -class TestPostgreSqlQueuedKafkaBrokerPublisher(unittest.IsolatedAsyncioTestCase): - def test_from_config(self): - with warnings.catch_warnings(): - warnings.simplefilter("ignore", DeprecationWarning) - publisher = PostgreSqlQueuedKafkaBrokerPublisher.from_config(CONFIG_FILE_PATH) - self.assertIsInstance(publisher, PostgreSqlQueuedKafkaBrokerPublisher) - self.assertIsInstance(publisher.impl, KafkaBrokerPublisher) - self.assertIsInstance(publisher.queue, PostgreSqlBrokerPublisherQueue) - - -class TestInMemoryQueuedKafkaBrokerPublisher(unittest.IsolatedAsyncioTestCase): - def test_from_config(self): - with warnings.catch_warnings(): - warnings.simplefilter("ignore", DeprecationWarning) - publisher = InMemoryQueuedKafkaBrokerPublisher.from_config(CONFIG_FILE_PATH) - self.assertIsInstance(publisher, InMemoryQueuedKafkaBrokerPublisher) - self.assertIsInstance(publisher.impl, KafkaBrokerPublisher) - self.assertIsInstance(publisher.queue, InMemoryBrokerPublisherQueue) - - if __name__ == "__main__": unittest.main() diff --git a/packages/plugins/minos-broker-kafka/tests/test_kafka/test_subscriber.py b/packages/plugins/minos-broker-kafka/tests/test_kafka/test_subscriber.py index edf432502..27b7db855 100644 --- a/packages/plugins/minos-broker-kafka/tests/test_kafka/test_subscriber.py +++ b/packages/plugins/minos-broker-kafka/tests/test_kafka/test_subscriber.py @@ -1,5 +1,4 @@ import unittest -import warnings from collections import ( namedtuple, ) @@ -26,15 +25,10 @@ BrokerMessageV1, BrokerMessageV1Payload, BrokerSubscriber, - InMemoryBrokerSubscriberQueue, - PostgreSqlBrokerSubscriberQueue, - QueuedBrokerSubscriber, ) from minos.plugins.kafka import ( - InMemoryQueuedKafkaBrokerSubscriberBuilder, KafkaBrokerSubscriber, KafkaBrokerSubscriberBuilder, - PostgreSqlQueuedKafkaBrokerSubscriberBuilder, ) from tests.utils import ( CONFIG_FILE_PATH, @@ -207,20 +201,12 @@ async def test_receive(self): self.assertEqual(messages[0], await subscriber.receive()) self.assertEqual(messages[1], await subscriber.receive()) - async def test_receive_already_stopped_raises(self): - subscriber = KafkaBrokerSubscriber.from_config(CONFIG_FILE_PATH, topics={"foo", "bar"}) - get_mock = AsyncMock(side_effect=ConsumerStoppedError) - subscriber.client.getone = get_mock - - with self.assertRaises(StopAsyncIteration): - await subscriber.receive() - async def test_receive_stopped(self): async with KafkaBrokerSubscriber.from_config(CONFIG_FILE_PATH, topics={"foo", "bar"}) as subscriber: get_mock = AsyncMock(side_effect=ConsumerStoppedError) subscriber.client.getone = get_mock - with self.assertRaises(ConsumerStoppedError): + with self.assertRaises(StopAsyncIteration): await subscriber.receive() @@ -250,39 +236,5 @@ def test_build(self): self.assertEqual(common_config["port"], subscriber.port) -class TestPostgreSqlQueuedKafkaBrokerSubscriberBuilder(unittest.TestCase): - def setUp(self) -> None: - self.config = Config(CONFIG_FILE_PATH) - - def test_build(self): - with warnings.catch_warnings(): - warnings.simplefilter("ignore", DeprecationWarning) - builder = ( - PostgreSqlQueuedKafkaBrokerSubscriberBuilder().with_config(self.config).with_topics({"one", "two"}) - ) - - subscriber = builder.build() - - self.assertIsInstance(subscriber, QueuedBrokerSubscriber) - self.assertIsInstance(subscriber.impl, KafkaBrokerSubscriber) - self.assertIsInstance(subscriber.queue, PostgreSqlBrokerSubscriberQueue) - - -class TestInMemoryQueuedKafkaBrokerSubscriberBuilder(unittest.TestCase): - def setUp(self) -> None: - self.config = Config(CONFIG_FILE_PATH) - - def test_build(self): - with warnings.catch_warnings(): - warnings.simplefilter("ignore", DeprecationWarning) - builder = InMemoryQueuedKafkaBrokerSubscriberBuilder().with_config(self.config).with_topics({"one", "two"}) - - subscriber = builder.build() - - self.assertIsInstance(subscriber, QueuedBrokerSubscriber) - self.assertIsInstance(subscriber.impl, KafkaBrokerSubscriber) - self.assertIsInstance(subscriber.queue, InMemoryBrokerSubscriberQueue) - - if __name__ == "__main__": unittest.main() diff --git a/packages/plugins/minos-broker-rabbitmq/HISTORY.md b/packages/plugins/minos-broker-rabbitmq/HISTORY.md index 7641106a6..9bb8cd040 100644 --- a/packages/plugins/minos-broker-rabbitmq/HISTORY.md +++ b/packages/plugins/minos-broker-rabbitmq/HISTORY.md @@ -4,4 +4,11 @@ * Add `RabbitMQBrokerPublisher` as the implementation of the `rabbitmq` publisher. * Add `RabbitMQBrokerSubscriber` as the implementation of the `rabbitmq` subscriber. -* Add `RabbitMQBrokerPublisherBuilder`, `RabbitMQBrokerSubscriberBuilder` and `RabbitMQBrokerBuilderMixin` classes to ease the building proces. \ No newline at end of file +* Add `RabbitMQBrokerPublisherBuilder`, `RabbitMQBrokerSubscriberBuilder` and `RabbitMQBrokerBuilderMixin` classes to ease the building proces. + +## 0.7.0 (2022-05-11) + +* Minor improvements. +* Unify documentation building pipeline across all `minos-python` packages. +* Fix documentation building warnings. +* Fix bug related with package building and additional files like `AUTHORS.md`, `HISTORY.md`, etc. \ No newline at end of file diff --git a/packages/plugins/minos-broker-rabbitmq/Makefile b/packages/plugins/minos-broker-rabbitmq/Makefile index 854bc90bc..2016f9e38 100644 --- a/packages/plugins/minos-broker-rabbitmq/Makefile +++ b/packages/plugins/minos-broker-rabbitmq/Makefile @@ -15,10 +15,6 @@ reformat: poetry run black --line-length 120 minos tests poetry run isort minos tests -docs: - rm -rf docs/api - poetry run $(MAKE) --directory=docs html - release: $(MAKE) dist poetry publish @@ -38,5 +34,4 @@ check: $(MAKE) reformat $(MAKE) lint $(MAKE) test - $(MAKE) docs $(MAKE) dist diff --git a/packages/plugins/minos-broker-rabbitmq/RUNTHETESTS.md b/packages/plugins/minos-broker-rabbitmq/RUNTHETESTS.md index 8b5e95b1f..386e2b0e7 100644 --- a/packages/plugins/minos-broker-rabbitmq/RUNTHETESTS.md +++ b/packages/plugins/minos-broker-rabbitmq/RUNTHETESTS.md @@ -1,5 +1,4 @@ -Run the tests -============== +# Run the tests In order to run the tests, please make sure you have the `Docker Engine `_ and `Docker Compose `_ installed. diff --git a/packages/plugins/minos-broker-rabbitmq/SETUP.md b/packages/plugins/minos-broker-rabbitmq/SETUP.md deleted file mode 100644 index 8203965c7..000000000 --- a/packages/plugins/minos-broker-rabbitmq/SETUP.md +++ /dev/null @@ -1,11 +0,0 @@ -Set up a development environment -================================= - -Since we use `poetry` as the default package manager, it must be installed. Please refer to -`https://python-poetry.org/docs/#installation`. - -Run `poetry install` to get the dependencies. - -Run `pre-commit install` to set the git checks before commiting. - -Make yourself sure you are able to run the tests. Refer to the appropriate section in this guide. diff --git a/packages/plugins/minos-broker-rabbitmq/docs/Makefile b/packages/plugins/minos-broker-rabbitmq/docs/Makefile deleted file mode 100644 index 504a873c8..000000000 --- a/packages/plugins/minos-broker-rabbitmq/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -SPHINXPROJ = minos-broker-rabbitmq -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/packages/plugins/minos-broker-rabbitmq/docs/_static/style.css b/packages/plugins/minos-broker-rabbitmq/docs/_static/style.css deleted file mode 100644 index 8aa6c288f..000000000 --- a/packages/plugins/minos-broker-rabbitmq/docs/_static/style.css +++ /dev/null @@ -1,3 +0,0 @@ -.wy-nav-content { - max-width: 1200px !important; -} diff --git a/packages/plugins/minos-broker-rabbitmq/docs/_templates/layout.html b/packages/plugins/minos-broker-rabbitmq/docs/_templates/layout.html deleted file mode 100644 index b0a448060..000000000 --- a/packages/plugins/minos-broker-rabbitmq/docs/_templates/layout.html +++ /dev/null @@ -1,4 +0,0 @@ -{% extends "!layout.html" %} -{% block extrahead %} - -{% endblock %} \ No newline at end of file diff --git a/packages/plugins/minos-broker-rabbitmq/docs/authors.md b/packages/plugins/minos-broker-rabbitmq/docs/authors.md deleted file mode 100644 index cf16fc494..000000000 --- a/packages/plugins/minos-broker-rabbitmq/docs/authors.md +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../AUTHORS.md diff --git a/packages/plugins/minos-broker-rabbitmq/docs/conf.py b/packages/plugins/minos-broker-rabbitmq/docs/conf.py deleted file mode 100755 index 5f02ccff3..000000000 --- a/packages/plugins/minos-broker-rabbitmq/docs/conf.py +++ /dev/null @@ -1,191 +0,0 @@ -#!/usr/bin/env python -# -# minos documentation build configuration file, created by -# sphinx-quickstart on Fri Jun 9 13:47:02 2017. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -# If extensions (or modules to document with autodoc) are in another -# directory, add these directories to sys.path here. If the directory is -# relative to the documentation root, use os.path.abspath to make it -# absolute, like shown here. -# -import os -import sys - -sys.path.insert(0, os.path.abspath("..")) - -import sphinx_rtd_theme # noqa - -from minos.plugins import ( - rabbitmq, -) - -# -- General configuration --------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. - - -extensions = [ - "sphinxcontrib.apidoc", - "sphinx.ext.autodoc", - "sphinx_autodoc_typehints", - "sphinx.ext.viewcode", - "sphinx_rtd_theme", - "m2r2", -] -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -source_suffix = [".rst", ".md"] - -# The master toctree document. -master_doc = "index" - -# General information about the project. -project = "Minos Broker RabbitMQ" -copyright = "2021, Clariteia" -author = "Minos Framework Devs" - -# The version info for the project you're documenting, acts as replacement -# for |version| and |release|, also used in various other places throughout -# the built documents. -# -# The short X.Y version. -version = rabbitmq.__version__ -# The full version, including alpha/beta/rc tags. -release = rabbitmq.__version__ - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = "sphinx" - -todo_include_todos = False - -# -- Options for HTML output ------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# - -html_theme = "sphinx_rtd_theme" - -# Theme options are theme-specific and customize the look and feel of a -# theme further. For a list of options available for each theme, see the -# documentation. -# - -# html_theme_options = { -# "codecov_button": True, -# "description": "Reactive microservices for an asynchronous world", -# "github_button": True, -# "github_user": "Clariteia", -# "github_repo": "cqrs", -# "github_type": "star", -# } - -html_sidebars = {"**": ["about.html", "navigation.html", "searchbox.html"]} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] - -# -- Options for HTMLHelp output --------------------------------------- - -# Output file base name for HTML help builder. -htmlhelp_basename = "minosdoc" - -# -- Options for LaTeX output ------------------------------------------ - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass -# [howto, manual, or own class]). -latex_documents = [ - (master_doc, "minos.tex", "Minos Broker RabbitMQ Documentation", "Minos Framework Devs", "manual"), -] - -# -- Options for manual page output ------------------------------------ - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [(master_doc, "minos", "Minos Broker RabbitMQ Documentation", [author], 1)] - -# -- Options for Texinfo output ---------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ( - master_doc, - "minos", - "Minos Broker RabbitMQ Documentation", - author, - "minos", - "One line description of project.", - "Miscellaneous", - ), -] - -# "apidoc" extension -apidoc_module_dir = "../minos" -apidoc_output_dir = "api" -apidoc_separate_modules = True -autodoc_default_options = { - "inherited-members": True, - "special-members": "__init__", - "undoc-members": True, -} - -apidoc_toc_file = False -apidoc_module_first = True -apidoc_extra_args = [ - "--force", - "--implicit-namespaces", -] -# "autodoc typehints" extension - -set_type_checking_flag = True -typehints_fully_qualified = True diff --git a/packages/plugins/minos-broker-rabbitmq/docs/history.md b/packages/plugins/minos-broker-rabbitmq/docs/history.md deleted file mode 100644 index d26e5be83..000000000 --- a/packages/plugins/minos-broker-rabbitmq/docs/history.md +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../HISTORY.md diff --git a/packages/plugins/minos-broker-rabbitmq/docs/index.md b/packages/plugins/minos-broker-rabbitmq/docs/index.md deleted file mode 100644 index dcece9b84..000000000 --- a/packages/plugins/minos-broker-rabbitmq/docs/index.md +++ /dev/null @@ -1,16 +0,0 @@ -# Welcome to Minos Broker RabbitMQ's documentation! - -.. toctree:: - :maxdepth: 2 - - readme - runthetests - usage - api/minos - authors - history - -# Indices and tables -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/packages/plugins/minos-broker-rabbitmq/docs/readme.md b/packages/plugins/minos-broker-rabbitmq/docs/readme.md deleted file mode 100644 index da72dbef1..000000000 --- a/packages/plugins/minos-broker-rabbitmq/docs/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -# Introduction - -.. mdinclude:: ../README.md diff --git a/packages/plugins/minos-broker-rabbitmq/docs/runthetests.md b/packages/plugins/minos-broker-rabbitmq/docs/runthetests.md deleted file mode 100644 index 309db1b96..000000000 --- a/packages/plugins/minos-broker-rabbitmq/docs/runthetests.md +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../RUNTHETESTS.md diff --git a/packages/plugins/minos-broker-rabbitmq/docs/usage.md b/packages/plugins/minos-broker-rabbitmq/docs/usage.md deleted file mode 100644 index 8f04b05ad..000000000 --- a/packages/plugins/minos-broker-rabbitmq/docs/usage.md +++ /dev/null @@ -1 +0,0 @@ -# Usage diff --git a/packages/plugins/minos-broker-rabbitmq/minos/plugins/rabbitmq/__init__.py b/packages/plugins/minos-broker-rabbitmq/minos/plugins/rabbitmq/__init__.py index c9fa00b98..6c068bac7 100644 --- a/packages/plugins/minos-broker-rabbitmq/minos/plugins/rabbitmq/__init__.py +++ b/packages/plugins/minos-broker-rabbitmq/minos/plugins/rabbitmq/__init__.py @@ -1,6 +1,8 @@ +"""The rabbitmq plugin of the Minos Framework.""" + __author__ = "Minos Framework Devs" __email__ = "hey@minos.run" -__version__ = "0.6.0" +__version__ = "0.7.0" from .common import ( RabbitMQBrokerBuilderMixin, diff --git a/packages/plugins/minos-broker-rabbitmq/poetry.lock b/packages/plugins/minos-broker-rabbitmq/poetry.lock index 45320a44e..1da551fae 100644 --- a/packages/plugins/minos-broker-rabbitmq/poetry.lock +++ b/packages/plugins/minos-broker-rabbitmq/poetry.lock @@ -1,6 +1,6 @@ [[package]] name = "aio-pika" -version = "7.1.1" +version = "7.2.0" description = "Wrapper for the aiormq for asyncio and humans." category = "main" optional = false @@ -34,21 +34,6 @@ develop = ["aiocontextvars (==0.2.2)", "aiohttp-asgi", "aiohttp (<4)", "async-ti raven = ["raven-aiohttp"] uvloop = ["uvloop (>=0.14,<1)"] -[[package]] -name = "aiopg" -version = "1.3.3" -description = "Postgres integration with asyncio." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -async-timeout = ">=3.0,<5.0" -psycopg2-binary = ">=2.8.4" - -[package.extras] -sa = ["sqlalchemy[postgresql_psycopg2binary] (>=1.3,<1.5)"] - [[package]] name = "aiormq" version = "6.2.3" @@ -64,22 +49,6 @@ yarl = "*" [package.extras] develop = ["aiomisc (>=11.0,<12.0)", "coverage (!=4.3)", "coveralls", "pylava", "pytest", "pytest-cov", "tox (>=2.4)"] -[[package]] -name = "alabaster" -version = "0.7.12" -description = "A configurable sidebar-enabled Sphinx theme" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "async-timeout" -version = "4.0.2" -description = "Timeout context manager for asyncio programs" -category = "main" -optional = false -python-versions = ">=3.6" - [[package]] name = "atomicwrites" version = "1.4.0" @@ -102,20 +71,9 @@ docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] -[[package]] -name = "babel" -version = "2.9.1" -description = "Internationalization utilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -pytz = ">=2015.7" - [[package]] name = "black" -version = "22.1.0" +version = "22.3.0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -126,7 +84,7 @@ click = ">=8.0.0" mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = ">=1.1.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] @@ -143,40 +101,13 @@ category = "main" optional = false python-versions = "*" -[[package]] -name = "certifi" -version = "2021.10.8" -description = "Python package for providing Mozilla's CA Bundle." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "cfgv" -version = "3.3.1" -description = "Validate configuration and produce human readable error messages." -category = "dev" -optional = false -python-versions = ">=3.6.1" - -[[package]] -name = "charset-normalizer" -version = "2.0.12" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "dev" -optional = false -python-versions = ">=3.5.0" - -[package.extras] -unicode_backport = ["unicodedata2"] - [[package]] name = "click" -version = "8.0.4" +version = "8.1.3" description = "Composable command line interface toolkit" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -224,7 +155,7 @@ python-versions = "*" [[package]] name = "dependency-injector" -version = "4.39.0" +version = "4.39.1" description = "Dependency injection framework for Python" category = "main" optional = false @@ -239,25 +170,9 @@ flask = ["flask"] pydantic = ["pydantic"] yaml = ["pyyaml"] -[[package]] -name = "distlib" -version = "0.3.4" -description = "Distribution utilities" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "docutils" -version = "0.17.1" -description = "Docutils -- Python Documentation Utilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - [[package]] name = "fastavro" -version = "1.4.10" +version = "1.4.11" description = "Fast read/write of AVRO files" category = "main" optional = false @@ -269,18 +184,6 @@ lz4 = ["lz4"] snappy = ["python-snappy"] zstandard = ["zstandard"] -[[package]] -name = "filelock" -version = "3.6.0" -description = "A platform independent file lock." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"] -testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-cov", "pytest-timeout (>=1.4.2)"] - [[package]] name = "flake8" version = "4.0.1" @@ -294,17 +197,6 @@ mccabe = ">=0.6.0,<0.7.0" pycodestyle = ">=2.8.0,<2.9.0" pyflakes = ">=2.4.0,<2.5.0" -[[package]] -name = "identify" -version = "2.4.12" -description = "File identification library for Python" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -license = ["ukkonen"] - [[package]] name = "idna" version = "3.3" @@ -313,30 +205,6 @@ category = "main" optional = false python-versions = ">=3.5" -[[package]] -name = "imagesize" -version = "1.3.0" -description = "Getting image size from png/jpeg/jpeg2000/gif file" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "importlib-metadata" -version = "4.11.3" -description = "Read metadata from Python packages" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] -perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] - [[package]] name = "iniconfig" version = "1.1.1" @@ -359,48 +227,6 @@ requirements_deprecated_finder = ["pipreqs", "pip-api"] colors = ["colorama (>=0.4.3,<0.5.0)"] plugins = ["setuptools"] -[[package]] -name = "jinja2" -version = "3.1.1" -description = "A very fast and expressive template engine." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - -[[package]] -name = "lmdb" -version = "1.3.0" -description = "Universal Python binding for the LMDB 'Lightning' Database" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "m2r2" -version = "0.3.2" -description = "Markdown and reStructuredText in a single file." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -docutils = "*" -mistune = "0.8.4" - -[[package]] -name = "markupsafe" -version = "2.1.1" -description = "Safely add untrusted strings to HTML/XML markup." -category = "dev" -optional = false -python-versions = ">=3.7" - [[package]] name = "mccabe" version = "0.6.1" @@ -411,7 +237,7 @@ python-versions = "*" [[package]] name = "minos-microservice-common" -version = "0.6.0" +version = "0.7.0" description = "The common core of the Minos Framework" category = "main" optional = false @@ -419,12 +245,10 @@ python-versions = "^3.9" develop = true [package.dependencies] -aiomisc = ">=14.0.3,<16.0.0" -aiopg = "^1.2.1" +aiomisc = ">=14.0.3,<15.8.0" cached-property = "^1.5.2" dependency-injector = "^4.32.2" fastavro = "^1.4.0" -lmdb = "^1.2.1" orjson = "^3.5.2" PyYAML = ">=5.4.1,<7.0.0" uvloop = "^0.16.0" @@ -435,7 +259,7 @@ url = "../../core/minos-microservice-common" [[package]] name = "minos-microservice-networks" -version = "0.6.0" +version = "0.7.0" description = "The networks core of the Minos Framework" category = "main" optional = false @@ -443,23 +267,13 @@ python-versions = "^3.9" develop = true [package.dependencies] -aiopg = "^1.2.1" crontab = "^0.23.0" -minos-microservice-common = "^0.6.0" -psycopg2-binary = "^2.9.3" +minos-microservice-common = "^0.7.0*" [package.source] type = "directory" url = "../../core/minos-microservice-networks" -[[package]] -name = "mistune" -version = "0.8.4" -description = "The fastest markdown parser in pure Python" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "multidict" version = "6.0.2" @@ -476,17 +290,9 @@ category = "dev" optional = false python-versions = "*" -[[package]] -name = "nodeenv" -version = "1.6.0" -description = "Node.js virtual environment builder" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "orjson" -version = "3.6.7" +version = "3.6.8" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" category = "main" optional = false @@ -523,25 +329,17 @@ category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -[[package]] -name = "pbr" -version = "5.8.1" -description = "Python Build Reasonableness" -category = "dev" -optional = false -python-versions = ">=2.6" - [[package]] name = "platformdirs" -version = "2.5.1" +version = "2.5.2" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" [package.extras] -docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] +test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] [[package]] name = "pluggy" @@ -555,30 +353,6 @@ python-versions = ">=3.6" dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] -[[package]] -name = "pre-commit" -version = "2.17.0" -description = "A framework for managing and maintaining multi-language pre-commit hooks." -category = "dev" -optional = false -python-versions = ">=3.6.1" - -[package.dependencies] -cfgv = ">=2.0.0" -identify = ">=1.0.0" -nodeenv = ">=0.11.1" -pyyaml = ">=5.1" -toml = "*" -virtualenv = ">=20.0.8" - -[[package]] -name = "psycopg2-binary" -version = "2.9.3" -description = "psycopg2 - Python-PostgreSQL Database Adapter" -category = "main" -optional = false -python-versions = ">=3.6" - [[package]] name = "py" version = "1.11.0" @@ -603,24 +377,16 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -[[package]] -name = "pygments" -version = "2.11.2" -description = "Pygments is a syntax highlighting package written in Python." -category = "dev" -optional = false -python-versions = ">=3.5" - [[package]] name = "pyparsing" -version = "3.0.7" -description = "Python parsing module" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.6.8" [package.extras] -diagrams = ["jinja2", "railroad-diagrams"] +diagrams = ["railroad-diagrams", "jinja2"] [[package]] name = "pytest" @@ -643,14 +409,6 @@ toml = "*" [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] -[[package]] -name = "pytz" -version = "2022.1" -description = "World timezone definitions, modern and historical" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "pyyaml" version = "6.0" @@ -659,24 +417,6 @@ category = "main" optional = false python-versions = ">=3.6" -[[package]] -name = "requests" -version = "2.27.1" -description = "Python HTTP for Humans." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} -urllib3 = ">=1.21.1,<1.27" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] - [[package]] name = "six" version = "1.16.0" @@ -685,159 +425,6 @@ category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -[[package]] -name = "snowballstemmer" -version = "2.2.0" -description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "sphinx" -version = "4.5.0" -description = "Python documentation generator" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -alabaster = ">=0.7,<0.8" -babel = ">=1.3" -colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.14,<0.18" -imagesize = "*" -importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} -Jinja2 = ">=2.3" -packaging = "*" -Pygments = ">=2.0" -requests = ">=2.5.0" -snowballstemmer = ">=1.1" -sphinxcontrib-applehelp = "*" -sphinxcontrib-devhelp = "*" -sphinxcontrib-htmlhelp = ">=2.0.0" -sphinxcontrib-jsmath = "*" -sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = ">=1.1.5" - -[package.extras] -docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.931)", "docutils-stubs", "types-typed-ast", "types-requests"] -test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] - -[[package]] -name = "sphinx-autodoc-typehints" -version = "1.17.0" -description = "Type hints (PEP 484) support for the Sphinx autodoc extension" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -Sphinx = ">=4" - -[package.extras] -testing = ["covdefaults (>=2)", "coverage (>=6)", "diff-cover (>=6.4)", "nptyping (>=1)", "pytest (>=6)", "pytest-cov (>=3)", "sphobjinv (>=2)", "typing-extensions (>=3.5)"] -type_comments = ["typed-ast (>=1.4.0)"] - -[[package]] -name = "sphinx-rtd-theme" -version = "1.0.0" -description = "Read the Docs theme for Sphinx" -category = "dev" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" - -[package.dependencies] -docutils = "<0.18" -sphinx = ">=1.6" - -[package.extras] -dev = ["transifex-client", "sphinxcontrib-httpdomain", "bump2version"] - -[[package]] -name = "sphinxcontrib-apidoc" -version = "0.3.0" -description = "A Sphinx extension for running 'sphinx-apidoc' on each build" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -pbr = "*" -Sphinx = ">=1.6.0" - -[[package]] -name = "sphinxcontrib-applehelp" -version = "1.0.2" -description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-devhelp" -version = "1.0.2" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-htmlhelp" -version = "2.0.0" -description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest", "html5lib"] - -[[package]] -name = "sphinxcontrib-jsmath" -version = "1.0.1" -description = "A sphinx extension which renders display math in HTML via JavaScript" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -test = ["pytest", "flake8", "mypy"] - -[[package]] -name = "sphinxcontrib-qthelp" -version = "1.0.3" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-serializinghtml" -version = "1.1.5" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - [[package]] name = "toml" version = "0.10.2" @@ -856,24 +443,11 @@ python-versions = ">=3.7" [[package]] name = "typing-extensions" -version = "4.1.1" -description = "Backported and Experimental Type Hints for Python 3.6+" +version = "4.2.0" +description = "Backported and Experimental Type Hints for Python 3.7+" category = "dev" optional = false -python-versions = ">=3.6" - -[[package]] -name = "urllib3" -version = "1.26.9" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" - -[package.extras] -brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +python-versions = ">=3.7" [[package]] name = "uvloop" @@ -888,24 +462,6 @@ dev = ["Cython (>=0.29.24,<0.30.0)", "pytest (>=3.6.0)", "Sphinx (>=4.1.2,<4.2.0 docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)"] test = ["aiohttp", "flake8 (>=3.9.2,<3.10.0)", "psutil", "pycodestyle (>=2.7.0,<2.8.0)", "pyOpenSSL (>=19.0.0,<19.1.0)", "mypy (>=0.800)"] -[[package]] -name = "virtualenv" -version = "20.14.0" -description = "Virtual Python Environment builder" -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - -[package.dependencies] -distlib = ">=0.3.1,<1" -filelock = ">=3.2,<4" -platformdirs = ">=2,<3" -six = ">=1.9.0,<2" - -[package.extras] -docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=21.3)"] -testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)"] - [[package]] name = "yarl" version = "1.7.2" @@ -918,48 +474,23 @@ python-versions = ">=3.6" idna = ">=2.0" multidict = ">=4.0" -[[package]] -name = "zipp" -version = "3.7.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] - [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "d7bf3ca770190476ab5714fbacc3bf086648828a2be5577fc264b6fb2c414daf" +content-hash = "05401fb78073e6eadaa8742a61ec7a4e51ae167316296622b31a62f34d8a0d75" [metadata.files] aio-pika = [ - {file = "aio-pika-7.1.1.tar.gz", hash = "sha256:8c990642b2906d0ad5af8807855b2b5c400e3b9b3a5bdc64ba98357bd55051f1"}, - {file = "aio_pika-7.1.1-py3-none-any.whl", hash = "sha256:3af44e29fcad19f700d43d17ba2c536bbf763af9b228f6c0d97e5a9fe3c1bbb7"}, + {file = "aio_pika-7.2.0-py3-none-any.whl", hash = "sha256:9b741aa81b3dd3917ec1a4910ab0766e4e568bac498831c6a02f0c96936b2d3c"}, ] aiomisc = [ {file = "aiomisc-15.7.3-py3-none-any.whl", hash = "sha256:0403e83268e98d0f2a125a70d13303fe1a2358e36db3daf02df032c7fa4f1525"}, {file = "aiomisc-15.7.3.tar.gz", hash = "sha256:ba250a34bd4609ced36111cb50580f57c3d52f3955f953a53ecb2986988baedc"}, ] -aiopg = [ - {file = "aiopg-1.3.3-py3-none-any.whl", hash = "sha256:2842dd8741460eeef940032dcb577bfba4d4115205dd82a73ce13b3271f5bf0a"}, - {file = "aiopg-1.3.3.tar.gz", hash = "sha256:547c6ba4ea0d73c2a11a2f44387d7133cc01d3c6f3b8ed976c0ac1eff4f595d7"}, -] aiormq = [ {file = "aiormq-6.2.3-py3-none-any.whl", hash = "sha256:95f0da57edd55f214a2e6c5b7ac98fa58a7c33911acd0d3315e86926b2dd2605"}, {file = "aiormq-6.2.3.tar.gz", hash = "sha256:db6c1e6e384f1d4dafe19f8df70c6dfc994932b40f4e542690016023ff8e952b"}, ] -alabaster = [ - {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, - {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, -] -async-timeout = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, -] atomicwrites = [ {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, @@ -968,54 +499,38 @@ attrs = [ {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] -babel = [ - {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"}, - {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, -] black = [ - {file = "black-22.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1297c63b9e1b96a3d0da2d85d11cd9bf8664251fd69ddac068b98dc4f34f73b6"}, - {file = "black-22.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2ff96450d3ad9ea499fc4c60e425a1439c2120cbbc1ab959ff20f7c76ec7e866"}, - {file = "black-22.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e21e1f1efa65a50e3960edd068b6ae6d64ad6235bd8bfea116a03b21836af71"}, - {file = "black-22.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f69158a7d120fd641d1fa9a921d898e20d52e44a74a6fbbcc570a62a6bc8ab"}, - {file = "black-22.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:228b5ae2c8e3d6227e4bde5920d2fc66cc3400fde7bcc74f480cb07ef0b570d5"}, - {file = "black-22.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b1a5ed73ab4c482208d20434f700d514f66ffe2840f63a6252ecc43a9bc77e8a"}, - {file = "black-22.1.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35944b7100af4a985abfcaa860b06af15590deb1f392f06c8683b4381e8eeaf0"}, - {file = "black-22.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7835fee5238fc0a0baf6c9268fb816b5f5cd9b8793423a75e8cd663c48d073ba"}, - {file = "black-22.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dae63f2dbf82882fa3b2a3c49c32bffe144970a573cd68d247af6560fc493ae1"}, - {file = "black-22.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fa1db02410b1924b6749c245ab38d30621564e658297484952f3d8a39fce7e8"}, - {file = "black-22.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c8226f50b8c34a14608b848dc23a46e5d08397d009446353dad45e04af0c8e28"}, - {file = "black-22.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2d6f331c02f0f40aa51a22e479c8209d37fcd520c77721c034517d44eecf5912"}, - {file = "black-22.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:742ce9af3086e5bd07e58c8feb09dbb2b047b7f566eb5f5bc63fd455814979f3"}, - {file = "black-22.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fdb8754b453fb15fad3f72cd9cad3e16776f0964d67cf30ebcbf10327a3777a3"}, - {file = "black-22.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5660feab44c2e3cb24b2419b998846cbb01c23c7fe645fee45087efa3da2d61"}, - {file = "black-22.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:6f2f01381f91c1efb1451998bd65a129b3ed6f64f79663a55fe0e9b74a5f81fd"}, - {file = "black-22.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:efbadd9b52c060a8fc3b9658744091cb33c31f830b3f074422ed27bad2b18e8f"}, - {file = "black-22.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8871fcb4b447206904932b54b567923e5be802b9b19b744fdff092bd2f3118d0"}, - {file = "black-22.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccad888050f5393f0d6029deea2a33e5ae371fd182a697313bdbd835d3edaf9c"}, - {file = "black-22.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07e5c049442d7ca1a2fc273c79d1aecbbf1bc858f62e8184abe1ad175c4f7cc2"}, - {file = "black-22.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:373922fc66676133ddc3e754e4509196a8c392fec3f5ca4486673e685a421321"}, - {file = "black-22.1.0-py3-none-any.whl", hash = "sha256:3524739d76b6b3ed1132422bf9d82123cd1705086723bc3e235ca39fd21c667d"}, - {file = "black-22.1.0.tar.gz", hash = "sha256:a7c0192d35635f6fc1174be575cb7915e92e5dd629ee79fdaf0dcfa41a80afb5"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"}, + {file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"}, + {file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"}, + {file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"}, + {file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"}, + {file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"}, + {file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"}, + {file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"}, + {file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"}, + {file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"}, + {file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"}, + {file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"}, + {file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"}, + {file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"}, + {file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"}, + {file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"}, + {file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"}, + {file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"}, ] cached-property = [ {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, ] -certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, -] -cfgv = [ - {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, - {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, - {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, -] click = [ - {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"}, - {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, ] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, @@ -1072,93 +587,69 @@ crontab = [ {file = "crontab-0.23.0.tar.gz", hash = "sha256:ca79dede9c2f572bb32f38703e8fddcf3427e86edc838f2ffe7ae4b9ee2b0733"}, ] dependency-injector = [ - {file = "dependency-injector-4.39.0.tar.gz", hash = "sha256:35d6c03683f512bcc8b0c950890ac40ce19bdacc7de4d59249dd61ed818f0930"}, - {file = "dependency_injector-4.39.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f046a5dbe7e5764fae9a69423f66241a8fdb62acea5c32b0c41a7da94b7f6da3"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfdd78f7d97c1f6ba4a3926a2e404507a4f77ecbd610d4a1b37dedb5c0b57ad1"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:512c23da829bb8ac2ae13f33aa017acf58ae9408e7796a146e1644e8b8471b5b"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7dc81df7f566bfdacdee448bc71085acd163b935860d2b2504b4f32840b3b692"}, - {file = "dependency_injector-4.39.0-cp310-cp310-win32.whl", hash = "sha256:9ffc5393700f45d740abecc50cdc1251eae69e50516ec9d0a48fba0e875ed083"}, - {file = "dependency_injector-4.39.0-cp310-cp310-win_amd64.whl", hash = "sha256:9118f36a3df1e9819074ccb35734d663812c8f6ef81d45c8e4ec81ce5dccac9c"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:1ff723aaf096fabb05cf8b08ba99888538a2a77e03a5082b70cd54eb9df619f3"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bb913900ceb1766f55dc628052d8e191a9c2b1737a0d775fbc230af90ab2c1e"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:329e801eb46b9933432481d3142e563e28a90d77952edac43126264c36ed2278"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1c1a67c699ae2c0234f07d121736fa44e8fe2d56c14b2fd210c3e04a151620bb"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-win32.whl", hash = "sha256:e1347defd46fe9067f857b1174bdb1b19458232ac1a485507df2ddff084cf31c"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-win_amd64.whl", hash = "sha256:9581c4c90f1aaf85ffb9b06bac7ac592df7076522881145321a9dd0702fee828"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8da8ff05fa17e852aa5831a600177e5bb72bf53b8a184f6922ae715387a460ba"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58a56999cebd8b2ba9c19e514e383924865e5f7d6273f8e5b7d85468d9042059"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4914332d6145fb7cfc5f2236a823a3859b92a7e75566ffca0987dcc0f7f7be53"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00aea40ee2d400a8091947ad97cda34b230628aeeac1774f8fa9a3500b5704b2"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-win32.whl", hash = "sha256:b94a64bc73d86d04b33c698fae4b9dad2536a8534ac6922c8226764da5d62d17"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4f59cc0b0d3beb82875d94b7e725b5097a7a454e8e323625ba6ac3095a29300e"}, - {file = "dependency_injector-4.39.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a8d840348f01d997e32394dba36e09c1ecd312b286befb6b3ca27526002ae94"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92097ffabca89d1539e200f91bfa13ff8ca502c9057391c3b78787d50fe502ed"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4a889e116fe76742ef6ff27d5e93ee9e364cbe7bbc6678df8c5dd54597a6fc"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a31e00961fdc1b3808a9e2adeb1107ec4bba0ad3a90b116af9d116a667e4626a"}, - {file = "dependency_injector-4.39.0-cp38-cp38-win32.whl", hash = "sha256:717720a220eee611ea96c0089246ec2103b168303ca2cd2c8a7cd3856da6f689"}, - {file = "dependency_injector-4.39.0-cp38-cp38-win_amd64.whl", hash = "sha256:05c0bbef90182a0d35d4d3f9ab879109070d204394578b12f0eff9eca51987ef"}, - {file = "dependency_injector-4.39.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f10bf8d146edffbee2ba5c5776395625c98048a31997afd481ce27792afee2af"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30c093b155c01e50723e8ecd2a14230daa4417356c8fb5a27369ae5be24b21d9"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dda8a85c8221e6ee433caa01c1bc4fed610381924780e04470572682569cdb8f"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ff8df47a901218a3257650f3f3a6b402dd58cb4f57b4a34d6e8092112f6e8480"}, - {file = "dependency_injector-4.39.0-cp39-cp39-win32.whl", hash = "sha256:e078c84c19ae73883a57e9b35edd843925b2b44833cd098708139a98abee5a96"}, - {file = "dependency_injector-4.39.0-cp39-cp39-win_amd64.whl", hash = "sha256:c02b6796320d6b9363d566045eeec243fa4a412ad68dcc6b2391307e93d0d401"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:865bf5ceba3e32f00e36bfcbefb1267b10df961fb2aab809f5e205968e1cd59b"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ce8645ffd8cc15a7bbd20c02e6439a61c1566a1db22766893bf79981fb89a4e"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dbdab8b024055865926a78ecbc3a6280345f4615e5c505511bbd7c6c322b1796"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:af996d66350704261382dc4e10f324eba5d23e35c04a9e75c7cb58fbea7f1f1d"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d390c6e97fec13fba832b7e39e07c43760ed3d46af4887005f679c0ab6eb9b2e"}, -] -distlib = [ - {file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"}, - {file = "distlib-0.3.4.zip", hash = "sha256:e4b58818180336dc9c529bfb9a0b58728ffc09ad92027a3f30b7cd91e3458579"}, -] -docutils = [ - {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, - {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, + {file = "dependency-injector-4.39.1.tar.gz", hash = "sha256:9ab76dc5e19b2692aaca49e00f9b41a087138d139b0ec985f92ff0498f038772"}, + {file = "dependency_injector-4.39.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c788a3d5482e63b5fd55e14fc258f1ff0b51b411927ab132ef0f689cb5d1183f"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0832e0457a360725cd1d1037b77b85478aeeaacc60e85ecceeb8020409e7b62"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d51998fff9704fd01d11c3c48f4e88d8506cb6afa1ee41409a881a5a51dae3fc"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea484cd13fc62966bf5582df0816205feee072d18f228aac75f7807b43f223ae"}, + {file = "dependency_injector-4.39.1-cp310-cp310-win32.whl", hash = "sha256:17389e53ec29ca13570319cf2065dcc4c2f6d36db5dd792bb1e8f2c39a9f146b"}, + {file = "dependency_injector-4.39.1-cp310-cp310-win_amd64.whl", hash = "sha256:55b0988489267c5a580f419133770ffe293057f2064da1c9ad6a2cc69666739b"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b297c3e79d3633cc56366386ae1f7dbce1587673cca2f559c368c1e936a1fa94"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2728827c5abb2420c5811e218262ae1b77a48e76cc9eebc6b4f55fee48a1a18d"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:029e42b064ab8cb5b2559be040ff682c7aa81592f1654a82355475956df17803"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:305e3db3f4bf40f64caaa1303e03005174e78d2339d2ae517b34c011ec2300f9"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-win32.whl", hash = "sha256:a661dd23a5e4e2f6bf4a729de7fadbe148c9a4a298dbcadfc5a94584b6930970"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-win_amd64.whl", hash = "sha256:340d6e7af5c4729d20c837d6d1e8a2626c24a05259dff746406cc823e26ba1e7"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a1553dac1c95f0de1f910b0025ee4570ea078a07d576bcdc2168990e719cea50"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c7baaa64d93359ee08c15d68579cc803e11d9becaf961f5a66b94ff627248e1"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7a27bf1951a066cf347b886cc7ab0f37dcbd1ad59bffcfe721c8c12a189a150d"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da6e2d685f7d0c65257f08133b68d9bf74ec319b90a0f21b4f629d168ce5f68f"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-win32.whl", hash = "sha256:a8ddd03ca86e67e9d3cc038793d34fbfccab12e6145df813e72bf14f9371f2ea"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-win_amd64.whl", hash = "sha256:e01a319ea05cd86b520201386dcb53a81a5400cb82fcc2f006bd7e92c0c51a0a"}, + {file = "dependency_injector-4.39.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4704804bde25b694aa65201927937a9d82d8bc055cb3dadc68eb05988bd34fa9"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0935d50b263169e7b0826a2fb6be80d6a4f2a7c59e6dd9876f86da3243bea9eb"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3c34aa5abb1826b6189f47daf6e469d4293c1d01693233da2c1b923816270cc5"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:db64904c9b9a88756cfece3e3ed078a2b57127642711dd08af342dba8abf9667"}, + {file = "dependency_injector-4.39.1-cp38-cp38-win32.whl", hash = "sha256:66ebe728194adc8720dbc4d662edbbfa55659ff23c9c493fb2dae0bfd4df5734"}, + {file = "dependency_injector-4.39.1-cp38-cp38-win_amd64.whl", hash = "sha256:4349974620f630d6726808e1291ec99713b64d449b84eb01581ee807a5a5c224"}, + {file = "dependency_injector-4.39.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d87cad0899b05cd08931bfb68ddf7be77711a67b0649c37f2045d7808977b082"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8efd965e5cfdd9f339ec895e73c119569851adedc175088d34a670f5206fea63"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:27f69485ca6b85c31d162ee86cf6ef71bb71dce9cd2b5d0745425dfc551eefa1"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a25b63de59dff04ec78f5161f00c0222a04a23def5d1f0eda14e389a32baf428"}, + {file = "dependency_injector-4.39.1-cp39-cp39-win32.whl", hash = "sha256:a14274f50d125b4579314c355e22af07def1a96641ca94bd75edcf1400b89477"}, + {file = "dependency_injector-4.39.1-cp39-cp39-win_amd64.whl", hash = "sha256:9950039d00625f9252cd26378a4406342b256886bb61e4db8b65e9f01270f53e"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6d7f39cd54678741e132e13da3a1367ac18058cbda61fe39d61c8583aa6fd757"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2368c7ba3c9ffaf816ea0f2d14c78d481491b805f62ac8496a78a51397d4689"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:84e32407bb16c58aa0d4b5ed8485537bc66ccc14cfffae7022f1204e35ec939a"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f2d80a42c546e1f934d427b071630d86653cd4a60c74b570c4ffb03025c1f1f9"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ca126bbed370b8c002c859ebeb76f6d83eba2d7fb5d66f37f47cfc19661d2889"}, ] fastavro = [ - {file = "fastavro-1.4.10-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:f225c81e869b3cefef6f2b478cd452693181ed7e645be3cea4d82024354ecaa0"}, - {file = "fastavro-1.4.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7669302c9124b7cd6c1bdff80c77116b2290c984814077fb7d01d7389586054"}, - {file = "fastavro-1.4.10-cp310-cp310-win_amd64.whl", hash = "sha256:995525bdfbdfef205ea148b5bc6a9fe5ccf921931123c39d9aad75a2b661681e"}, - {file = "fastavro-1.4.10-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:64244c53f1e4853184c2f7383d0332e1dcb34c38c05e6613530ade0378e8acfc"}, - {file = "fastavro-1.4.10-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c60965da6dc7a91e00ccd84d84797fad746555f44e8a816c4cc460fb231c44fe"}, - {file = "fastavro-1.4.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10eb25378f37dc00c10e83c4c0442c1a6d1b871f74a6dfdfc12b6447962bbdd0"}, - {file = "fastavro-1.4.10-cp37-cp37m-win_amd64.whl", hash = "sha256:d5719adf6045fc743de5fa738d561a81e58dc782c94f1b16cb21b5dd6253e7fd"}, - {file = "fastavro-1.4.10-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:24c4a1a8cc92e135ecfcd9cbd1f6cfa088cbc74d78c18e02a609cb11fa33778d"}, - {file = "fastavro-1.4.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0934490b0c3bcfd6bcbacbcb5144c6b5e4298cda209fbb17c856adf5405127dd"}, - {file = "fastavro-1.4.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a23763d73412c077aee401a0368c64cbc23859e26711dbae78a3cf0227f65165"}, - {file = "fastavro-1.4.10-cp38-cp38-win_amd64.whl", hash = "sha256:09f1dfdd8192ae09e0f477d1f024d8054fccdb099ad495d2a796bcee3cadebd1"}, - {file = "fastavro-1.4.10-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:0c6695753fa3035bbd0fa5cb21bf1b5dad39483c669b32ca0bb55fb07c1ccc87"}, - {file = "fastavro-1.4.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35f960dbba04647d8d6d5616f879622d2a1e8a84eb2d2e02a883a22e0803463a"}, - {file = "fastavro-1.4.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9660878ca01e3dbbee12385c5902a2b6b12ecbb5af4733d1026175a14b1ef67f"}, - {file = "fastavro-1.4.10-cp39-cp39-win_amd64.whl", hash = "sha256:64cbd386e408b3bcb2de53b1f847163073eb0d0d0338db65f76051c6ba9a9bc1"}, - {file = "fastavro-1.4.10.tar.gz", hash = "sha256:a24f9dd803c44bfb599476b000f9bd0088f7ac2401e6c20818f38d8af12785a0"}, -] -filelock = [ - {file = "filelock-3.6.0-py3-none-any.whl", hash = "sha256:f8314284bfffbdcfa0ff3d7992b023d4c628ced6feb957351d4c48d059f56bc0"}, - {file = "filelock-3.6.0.tar.gz", hash = "sha256:9cd540a9352e432c7246a48fe4e8712b10acb1df2ad1f30e8c070b82ae1fed85"}, + {file = "fastavro-1.4.11-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:44f01008f95d685edacc4b10366c755d25612df00924349f7d34a29f08522ce3"}, + {file = "fastavro-1.4.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18f5e736d12e67348f253da8a332d7c3b483ca04f2b6e772befa79d1a46bac9d"}, + {file = "fastavro-1.4.11-cp310-cp310-win_amd64.whl", hash = "sha256:8dca11bc3191cd7de0a3c4b76a70dac493356a219e96ebcde0def1f06faddef7"}, + {file = "fastavro-1.4.11-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:7a2a0bf03686f9d860e8f8476be000f5b3e6cc9af6853dbabab2ef9cfa5dc3a0"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c17e3decfac260e1be4d02d1903d2483eec2f3ce7f92c9b808a0f6a81572c4b"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19ba25c6529f50722a7618cc4ca24c7d265def57fd9f94e4e554e1df8cce38d2"}, + {file = "fastavro-1.4.11-cp37-cp37m-win_amd64.whl", hash = "sha256:ceaba04da9419f40899a670eb62eb373a127b511bb8e3ae4f6f1f23ec49bd0e4"}, + {file = "fastavro-1.4.11-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:732eab3a1ae5d2c3f4b52e747c55bcc41c4df0eb7e8a395038080741a3c0a934"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c03d3c802b71f44e7b3442abae961bba996258244bd222b242ad1e5cb7754e57"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cb7475a9b25b9f8aebe7eb756dafedd0369434571062f3883d894281befd7c"}, + {file = "fastavro-1.4.11-cp38-cp38-win_amd64.whl", hash = "sha256:ce0776f54591aef90bcd02bd919964abe4c2ad2a10a4336c3a1b66cef289b41c"}, + {file = "fastavro-1.4.11-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:621e72cc365c9539d7590e7b43e48a62e6bfb4c2de7c16837fed54d113d7312c"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:842b25782f911ee8c626f9d9fedc2ef01aeac272536fe90ee6d45b2ae7cdb024"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8491bfcba25c9d661289f884688e5a4f56f2ee389a240d0ad02692495a9a087"}, + {file = "fastavro-1.4.11-cp39-cp39-win_amd64.whl", hash = "sha256:c94130a8c8d80073eb0276844915aa5e928ae322024e76dc57943542ccda211c"}, + {file = "fastavro-1.4.11.tar.gz", hash = "sha256:7c64332ad52de0134be9a933ca986514c3ff85c63d54bc5398c31f0498ac1820"}, ] flake8 = [ {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, ] -identify = [ - {file = "identify-2.4.12-py2.py3-none-any.whl", hash = "sha256:5f06b14366bd1facb88b00540a1de05b69b310cbc2654db3c7e07fa3a4339323"}, - {file = "identify-2.4.12.tar.gz", hash = "sha256:3f3244a559290e7d3deb9e9adc7b33594c1bc85a9dd82e0f1be519bf12a1ec17"}, -] idna = [ {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, ] -imagesize = [ - {file = "imagesize-1.3.0-py2.py3-none-any.whl", hash = "sha256:1db2f82529e53c3e929e8926a1fa9235aa82d0bd0c580359c67ec31b2fddaa8c"}, - {file = "imagesize-1.3.0.tar.gz", hash = "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d"}, -] -importlib-metadata = [ - {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, - {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, -] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, @@ -1167,95 +658,12 @@ isort = [ {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, ] -jinja2 = [ - {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"}, - {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"}, -] -lmdb = [ - {file = "lmdb-1.3.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:63cb73fe7ce9eb93d992d632c85a0476b4332670d9e6a2802b5062f603b7809f"}, - {file = "lmdb-1.3.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:abbc439cd9fe60ffd6197009087ea885ac150017dc85384093b1d376f83f0ec4"}, - {file = "lmdb-1.3.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6260a526e4ad85b1f374a5ba9475bf369fb07e7728ea6ec57226b02c40d1976b"}, - {file = "lmdb-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e568ae0887ae196340947d9800136e90feaed6b86a261ef01f01b2ba65fc8106"}, - {file = "lmdb-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6a816954d212f40fd15007cd81ab7a6bebb77436d949a6a9ae04af57fc127f3"}, - {file = "lmdb-1.3.0-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:fa6439356e591d3249ab0e1778a6f8d8408e993f66dc911914c78208f5310309"}, - {file = "lmdb-1.3.0-cp35-cp35m-win_amd64.whl", hash = "sha256:c6adbd6f7f9048e97f31a069e652eb51020a81e80a0ce92dbb9810d21da2409a"}, - {file = "lmdb-1.3.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:eefb392f6b5cd43aada49258c5a79be11cb2c8cd3fc3e2d9319a1e0b9f906458"}, - {file = "lmdb-1.3.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a14aca2651c3af6f0d0a6b9168200eea0c8f2d27c40b01a442f33329a6e8dff"}, - {file = "lmdb-1.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cfa4aa9c67f8aee89b23005e98d1f3f32490b6b905fd1cb604b207cbd5755ab"}, - {file = "lmdb-1.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7da05d70fcc6561ac6b09e9fb1bf64b7ca294652c64c8a2889273970cee796b9"}, - {file = "lmdb-1.3.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:008243762decf8f6c90430a9bced56290ebbcdb5e877d90e42343bb97033e494"}, - {file = "lmdb-1.3.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:17215a42a4b9814c383deabecb160581e4fb75d00198eef0e3cea54f230ffbea"}, - {file = "lmdb-1.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65334eafa5d430b18d81ebd5362559a41483c362e1931f6e1b15bab2ecb7d75d"}, - {file = "lmdb-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:18c69fabdaf04efaf246587739cc1062b3e57c6ef0743f5c418df89e5e7e7b9b"}, - {file = "lmdb-1.3.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:41318717ab5d15ad2d6d263d34fbf614a045210f64b25e59ce734bb2105e421f"}, - {file = "lmdb-1.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:df2724bad7820114a205472994091097d0fa65a3e5fff5a8e688d123fb8c6326"}, - {file = "lmdb-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ddd590e1c7fcb395931aa3782fb89b9db4550ab2d81d006ecd239e0d462bc41"}, - {file = "lmdb-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:4172fba19417d7b29409beca7d73c067b54e5d8ab1fb9b51d7b4c1445d20a167"}, - {file = "lmdb-1.3.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2df38115dd9428a54d59ae7c712a4c7cce0d6b1d66056de4b1a8c38718066106"}, - {file = "lmdb-1.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d9103aa4908f0bca43c5911ca067d4e3d01f682dff0c0381a1239bd2bd757984"}, - {file = "lmdb-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:394df860c3f93cfd92b6f4caba785f38208cc9614c18b3803f83a2cc1695042f"}, - {file = "lmdb-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:62ab28e3593bdc318ea2f2fa1574e5fca3b6d1f264686d773ba54a637d4f563b"}, - {file = "lmdb-1.3.0-pp27-pypy_73-macosx_10_7_x86_64.whl", hash = "sha256:e6a704b3baced9182836c7f77b769f23856f3a8f62d0282b1bc1feaf81a86712"}, - {file = "lmdb-1.3.0-pp27-pypy_73-win_amd64.whl", hash = "sha256:08f4b5129f4683802569b02581142e415c8dcc0ff07605983ec1b07804cecbad"}, - {file = "lmdb-1.3.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:f291e3f561f58dddf63a92a5a6a4b8af3a0920b6705d35e2f80e52e86ee238a2"}, - {file = "lmdb-1.3.0.tar.gz", hash = "sha256:60a11efc21aaf009d06518996360eed346f6000bfc9de05114374230879f992e"}, -] -m2r2 = [ - {file = "m2r2-0.3.2-py3-none-any.whl", hash = "sha256:d3684086b61b4bebe2307f15189495360f05a123c9bda2a66462649b7ca236aa"}, - {file = "m2r2-0.3.2.tar.gz", hash = "sha256:ccd95b052dcd1ac7442ecb3111262b2001c10e4119b459c34c93ac7a5c2c7868"}, -] -markupsafe = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, -] mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] minos-microservice-common = [] minos-microservice-networks = [] -mistune = [ - {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, - {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, -] multidict = [ {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b9e95a740109c6047602f4db4da9949e6c5945cefbad34a1299775ddc9a62e2"}, {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac0e27844758d7177989ce406acc6a83c16ed4524ebc363c1f748cba184d89d3"}, @@ -1321,43 +729,39 @@ mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] -nodeenv = [ - {file = "nodeenv-1.6.0-py2.py3-none-any.whl", hash = "sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"}, - {file = "nodeenv-1.6.0.tar.gz", hash = "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b"}, -] orjson = [ - {file = "orjson-3.6.7-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:93188a9d6eb566419ad48befa202dfe7cd7a161756444b99c4ec77faea9352a4"}, - {file = "orjson-3.6.7-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:82515226ecb77689a029061552b5df1802b75d861780c401e96ca6bc8495f775"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3af57ffab7848aaec6ba6b9e9b41331250b57bf696f9d502bacdc71a0ebab0ba"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:a7297504d1142e7efa236ffc53f056d73934a993a08646dbcee89fc4308a8fcf"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:5a50cde0dbbde255ce751fd1bca39d00ecd878ba0903c0480961b31984f2fab7"}, - {file = "orjson-3.6.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d21f9a2d1c30e58070f93988db4cad154b9009fafbde238b52c1c760e3607fbe"}, - {file = "orjson-3.6.7-cp310-none-win_amd64.whl", hash = "sha256:e152464c4606b49398afd911777decebcf9749cc8810c5b4199039e1afb0991e"}, - {file = "orjson-3.6.7-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:0a65f3c403f38b0117c6dd8e76e85a7bd51fcd92f06c5598dfeddbc44697d3e5"}, - {file = "orjson-3.6.7-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:6c47cfca18e41f7f37b08ff3e7abf5ada2d0f27b5ade934f05be5fc5bb956e9d"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:63185af814c243fad7a72441e5f98120c9ecddf2675befa486d669fb65539e9b"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2da6fde42182b80b40df2e6ab855c55090ebfa3fcc21c182b7ad1762b61d55c"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:48c5831ec388b4e2682d4ff56d6bfa4a2ef76c963f5e75f4ff4785f9cf338a80"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:913fac5d594ccabf5e8fbac15b9b3bb9c576d537d49eeec9f664e7a64dde4c4b"}, - {file = "orjson-3.6.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:58f244775f20476e5851e7546df109f75160a5178d44257d437ba6d7e562bfe8"}, - {file = "orjson-3.6.7-cp37-none-win_amd64.whl", hash = "sha256:2d5f45c6b85e5f14646df2d32ecd7ff20fcccc71c0ea1155f4d3df8c5299bbb7"}, - {file = "orjson-3.6.7-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:612d242493afeeb2068bc72ff2544aa3b1e627578fcf92edee9daebb5893ffea"}, - {file = "orjson-3.6.7-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:539cdc5067db38db27985e257772d073cd2eb9462d0a41bde96da4e4e60bd99b"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6d103b721bbc4f5703f62b3882e638c0b65fcdd48622531c7ffd45047ef8e87c"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb10a20f80e95102dd35dfbc3a22531661b44a09b55236b012a446955846b023"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:bb68d0da349cf8a68971a48ad179434f75256159fe8b0715275d9b49fa23b7a3"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:4a2c7d0a236aaeab7f69c17b7ab4c078874e817da1bfbb9827cb8c73058b3050"}, - {file = "orjson-3.6.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3be045ca3b96119f592904cf34b962969ce97bd7843cbfca084009f6c8d2f268"}, - {file = "orjson-3.6.7-cp38-none-win_amd64.whl", hash = "sha256:bd765c06c359d8a814b90f948538f957fa8a1f55ad1aaffcdc5771996aaea061"}, - {file = "orjson-3.6.7-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:7dd9e1e46c0776eee9e0649e3ae9584ea368d96851bcaeba18e217fa5d755283"}, - {file = "orjson-3.6.7-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:c4b4f20a1e3df7e7c83717aff0ef4ab69e42ce2fb1f5234682f618153c458406"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7107a5673fd0b05adbb58bf71c1578fc84d662d29c096eb6d998982c8635c221"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a08b6940dd9a98ccf09785890112a0f81eadb4f35b51b9a80736d1725437e22c"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:f5d1648e5a9d1070f3628a69a7c6c17634dbb0caf22f2085eca6910f7427bf1f"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:e6201494e8dff2ce7fd21da4e3f6dfca1a3fed38f9dcefc972f552f6596a7621"}, - {file = "orjson-3.6.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:70d0386abe02879ebaead2f9632dd2acb71000b4721fd8c1a2fb8c031a38d4d5"}, - {file = "orjson-3.6.7-cp39-none-win_amd64.whl", hash = "sha256:d9a3288861bfd26f3511fb4081561ca768674612bac59513cb9081bb61fcc87f"}, - {file = "orjson-3.6.7.tar.gz", hash = "sha256:a4bb62b11289b7620eead2f25695212e9ac77fcfba76f050fa8a540fb5c32401"}, + {file = "orjson-3.6.8-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:3a287a650458de2211db03681b71c3e5cb2212b62f17a39df8ad99fc54855d0f"}, + {file = "orjson-3.6.8-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:5204e25c12cea58e524fc82f7c27ed0586f592f777b33075a92ab7b3eb3687c2"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77e8386393add64f959c044e0fb682364fd0e611a6f477aa13f0e6a733bd6a28"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:279f2d2af393fdf8601020744cb206b91b54ad60fb8401e0761819c7bda1f4e4"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:c31c9f389be7906f978ed4192eb58a4b74a37ad60556a0b88ddc47c576697770"}, + {file = "orjson-3.6.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0db5c5a0c5b89f092d52f6e5a3701660a9d6ffa9e2968b3ce17c2bc4f5eb0414"}, + {file = "orjson-3.6.8-cp310-none-win_amd64.whl", hash = "sha256:eb22485847b9a0c4bbedc668df860126ac931edbed1d456cf41a59f3cb961ed8"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:1a5fe569310bc819279bd4d5f2c349910b104ed3207936246dd5d5e0b085e74a"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:ccb356a47ab1067cd3549847e9db1d279a63fe0482d315b3ffd6e7abef35ef77"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab29c069c222248ce302a25855b4e1664f9436e8ae5a131fb0859daf31676d2b"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2b5e4cba9e774ac011071d9d27760f97f4b8cd46003e971d122e712f971345"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:c311ec504414d22834d5b972a209619925b48263856a11a14d90230f9682d49c"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:a3dfec7950b90fb8d143743503ee53fa06b32e6068bdea792fc866284da3d71d"}, + {file = "orjson-3.6.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b890dbbada2cbb26eb29bd43a848426f007f094bb0758df10dfe7a438e1cb4b4"}, + {file = "orjson-3.6.8-cp37-none-win_amd64.whl", hash = "sha256:9143ae2c52771525be9ad11a7a8cc8e7fd75391b107e7e644a9e0050496f6b4f"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:33a82199fd42f6436f833e210ae5129c922a5c355629356ca7a8e82964da7285"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:90159ea8b9a5a2a98fa33dc7b421cfac4d2ae91ba5e1058f5909e7f059f6b467"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:656fbe15d9ef0733e740d9def78f4fdb4153102f4836ee774a05123499005931"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7be3be6153843e0f01351b1313a5ad4723595427680dac2dfff22a37e652ce02"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:dd24f66b6697ee7424f7da575ec6cbffc8ede441114d53470949cda4d97c6e56"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:b07c780f7345ecf5901356dc21dee0669defc489c38ce7b9ab0f5e008cc0385c"}, + {file = "orjson-3.6.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ea32015a5d8a4ce00d348a0de5dc7040e0ad58f970a8fcbb5713a1eac129e493"}, + {file = "orjson-3.6.8-cp38-none-win_amd64.whl", hash = "sha256:c5a3e382194c838988ec128a26b08aa92044e5e055491cc4056142af0c1c54d7"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:83a8424e857ae1bf53530e88b4eb2f16ca2b489073b924e655f1575cacd7f52a"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:81e1a6a2d67f15007dadacbf9ba5d3d79237e5e33786c028557fe5a2b72f1c9a"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:137b539881c77866eba86ff6a11df910daf2eb9ab8f1acae62f879e83d7c38af"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cbd358f3b3ad539a27e36900e8e7d172d0e1b72ad9dd7d69544dcbc0f067ee7"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:6ab94701542d40b90903ecfc339333f458884979a01cb9268bc662cc67a5f6d8"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:32b6f26593a9eb606b40775826beb0dac152e3d224ea393688fced036045a821"}, + {file = "orjson-3.6.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:afd9e329ebd3418cac3cd747769b1d52daa25fa672bbf414ab59f0e0881b32b9"}, + {file = "orjson-3.6.8-cp39-none-win_amd64.whl", hash = "sha256:0c89b419914d3d1f65a1b0883f377abe42a6e44f6624ba1c63e8846cbfc2fa60"}, + {file = "orjson-3.6.8.tar.gz", hash = "sha256:e19d23741c5de13689bb316abfccea15a19c264e3ec8eb332a5319a583595ace"}, ] packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, @@ -1370,80 +774,14 @@ pathspec = [ {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, ] -pbr = [ - {file = "pbr-5.8.1-py2.py3-none-any.whl", hash = "sha256:27108648368782d07bbf1cb468ad2e2eeef29086affd14087a6d04b7de8af4ec"}, - {file = "pbr-5.8.1.tar.gz", hash = "sha256:66bc5a34912f408bb3925bf21231cb6f59206267b7f63f3503ef865c1a292e25"}, -] platformdirs = [ - {file = "platformdirs-2.5.1-py3-none-any.whl", hash = "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"}, - {file = "platformdirs-2.5.1.tar.gz", hash = "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d"}, + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, ] pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] -pre-commit = [ - {file = "pre_commit-2.17.0-py2.py3-none-any.whl", hash = "sha256:725fa7459782d7bec5ead072810e47351de01709be838c2ce1726b9591dad616"}, - {file = "pre_commit-2.17.0.tar.gz", hash = "sha256:c1a8040ff15ad3d648c70cc3e55b93e4d2d5b687320955505587fd79bbaed06a"}, -] -psycopg2-binary = [ - {file = "psycopg2-binary-2.9.3.tar.gz", hash = "sha256:761df5313dc15da1502b21453642d7599d26be88bff659382f8f9747c7ebea4e"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:539b28661b71da7c0e428692438efbcd048ca21ea81af618d845e06ebfd29478"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e82d38390a03da28c7985b394ec3f56873174e2c88130e6966cb1c946508e65"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57804fc02ca3ce0dbfbef35c4b3a4a774da66d66ea20f4bda601294ad2ea6092"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:083a55275f09a62b8ca4902dd11f4b33075b743cf0d360419e2051a8a5d5ff76"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_24_ppc64le.whl", hash = "sha256:0a29729145aaaf1ad8bafe663131890e2111f13416b60e460dae0a96af5905c9"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a79d622f5206d695d7824cbf609a4f5b88ea6d6dab5f7c147fc6d333a8787e4"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:090f3348c0ab2cceb6dfbe6bf721ef61262ddf518cd6cc6ecc7d334996d64efa"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a9e1f75f96ea388fbcef36c70640c4efbe4650658f3d6a2967b4cc70e907352e"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c3ae8e75eb7160851e59adc77b3a19a976e50622e44fd4fd47b8b18208189d42"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-win32.whl", hash = "sha256:7b1e9b80afca7b7a386ef087db614faebbf8839b7f4db5eb107d0f1a53225029"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:8b344adbb9a862de0c635f4f0425b7958bf5a4b927c8594e6e8d261775796d53"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:e847774f8ffd5b398a75bc1c18fbb56564cda3d629fe68fd81971fece2d3c67e"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68641a34023d306be959101b345732360fc2ea4938982309b786f7be1b43a4a1"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3303f8807f342641851578ee7ed1f3efc9802d00a6f83c101d21c608cb864460"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_24_aarch64.whl", hash = "sha256:e3699852e22aa68c10de06524a3721ade969abf382da95884e6a10ff798f9281"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_24_ppc64le.whl", hash = "sha256:526ea0378246d9b080148f2d6681229f4b5964543c170dd10bf4faaab6e0d27f"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:b1c8068513f5b158cf7e29c43a77eb34b407db29aca749d3eb9293ee0d3103ca"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:15803fa813ea05bef089fa78835118b5434204f3a17cb9f1e5dbfd0b9deea5af"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:152f09f57417b831418304c7f30d727dc83a12761627bb826951692cc6491e57"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:404224e5fef3b193f892abdbf8961ce20e0b6642886cfe1fe1923f41aaa75c9d"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-win32.whl", hash = "sha256:1f6b813106a3abdf7b03640d36e24669234120c72e91d5cbaeb87c5f7c36c65b"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:2d872e3c9d5d075a2e104540965a1cf898b52274a5923936e5bfddb58c59c7c2"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:10bb90fb4d523a2aa67773d4ff2b833ec00857f5912bafcfd5f5414e45280fb1"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a52ecab70af13e899f7847b3e074eeb16ebac5615665db33bce8a1009cf33"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a29b3ca4ec9defec6d42bf5feb36bb5817ba3c0230dd83b4edf4bf02684cd0ae"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:12b11322ea00ad8db8c46f18b7dfc47ae215e4df55b46c67a94b4effbaec7094"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_24_ppc64le.whl", hash = "sha256:53293533fcbb94c202b7c800a12c873cfe24599656b341f56e71dd2b557be063"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c381bda330ddf2fccbafab789d83ebc6c53db126e4383e73794c74eedce855ef"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9d29409b625a143649d03d0fd7b57e4b92e0ecad9726ba682244b73be91d2fdb"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:183a517a3a63503f70f808b58bfbf962f23d73b6dccddae5aa56152ef2bcb232"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:15c4e4cfa45f5a60599d9cec5f46cd7b1b29d86a6390ec23e8eebaae84e64554"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-win32.whl", hash = "sha256:adf20d9a67e0b6393eac162eb81fb10bc9130a80540f4df7e7355c2dd4af9fba"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2f9ffd643bc7349eeb664eba8864d9e01f057880f510e4681ba40a6532f93c71"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:def68d7c21984b0f8218e8a15d514f714d96904265164f75f8d3a70f9c295667"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dffc08ca91c9ac09008870c9eb77b00a46b3378719584059c034b8945e26b272"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:280b0bb5cbfe8039205c7981cceb006156a675362a00fe29b16fbc264e242834"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:af9813db73395fb1fc211bac696faea4ca9ef53f32dc0cfa27e4e7cf766dcf24"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_24_ppc64le.whl", hash = "sha256:63638d875be8c2784cfc952c9ac34e2b50e43f9f0a0660b65e2a87d656b3116c"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ffb7a888a047696e7f8240d649b43fb3644f14f0ee229077e7f6b9f9081635bd"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0c9d5450c566c80c396b7402895c4369a410cab5a82707b11aee1e624da7d004"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:d1c1b569ecafe3a69380a94e6ae09a4789bbb23666f3d3a08d06bbd2451f5ef1"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8fc53f9af09426a61db9ba357865c77f26076d48669f2e1bb24d85a22fb52307"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-win32.whl", hash = "sha256:6472a178e291b59e7f16ab49ec8b4f3bdada0a879c68d3817ff0963e722a82ce"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:35168209c9d51b145e459e05c31a9eaeffa9a6b0fd61689b48e07464ffd1a83e"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:47133f3f872faf28c1e87d4357220e809dfd3fa7c64295a4a148bcd1e6e34ec9"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91920527dea30175cc02a1099f331aa8c1ba39bf8b7762b7b56cbf54bc5cce42"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:887dd9aac71765ac0d0bac1d0d4b4f2c99d5f5c1382d8b770404f0f3d0ce8a39"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:1f14c8b0942714eb3c74e1e71700cbbcb415acbc311c730370e70c578a44a25c"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_24_ppc64le.whl", hash = "sha256:7af0dd86ddb2f8af5da57a976d27cd2cd15510518d582b478fbb2292428710b4"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:93cd1967a18aa0edd4b95b1dfd554cf15af657cb606280996d393dadc88c3c35"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bda845b664bb6c91446ca9609fc69f7db6c334ec5e4adc87571c34e4f47b7ddb"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:01310cf4cf26db9aea5158c217caa92d291f0500051a6469ac52166e1a16f5b7"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:99485cab9ba0fa9b84f1f9e1fef106f44a46ef6afdeec8885e0b88d0772b49e8"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-win32.whl", hash = "sha256:46f0e0a6b5fa5851bbd9ab1bc805eef362d3a230fbdfbc209f4a236d0a7a990d"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:accfe7e982411da3178ec690baaceaad3c278652998b2c45828aaac66cd8285f"}, -] py = [ {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, @@ -1456,22 +794,14 @@ pyflakes = [ {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, ] -pygments = [ - {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"}, - {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"}, -] pyparsing = [ - {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"}, - {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, ] pytest = [ {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, ] -pytz = [ - {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"}, - {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"}, -] pyyaml = [ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, @@ -1507,58 +837,10 @@ pyyaml = [ {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] -requests = [ - {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, - {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, -] six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] -snowballstemmer = [ - {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, - {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, -] -sphinx = [ - {file = "Sphinx-4.5.0-py3-none-any.whl", hash = "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226"}, - {file = "Sphinx-4.5.0.tar.gz", hash = "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6"}, -] -sphinx-autodoc-typehints = [ - {file = "sphinx_autodoc_typehints-1.17.0-py3-none-any.whl", hash = "sha256:081daf53077b4ae1c28347d6d858e13e63aefe3b4aacef79fd717dd60687b470"}, - {file = "sphinx_autodoc_typehints-1.17.0.tar.gz", hash = "sha256:51c7b3f5cb9ccd15d0b52088c62df3094f1abd9612930340365c26def8629a14"}, -] -sphinx-rtd-theme = [ - {file = "sphinx_rtd_theme-1.0.0-py2.py3-none-any.whl", hash = "sha256:4d35a56f4508cfee4c4fb604373ede6feae2a306731d533f409ef5c3496fdbd8"}, - {file = "sphinx_rtd_theme-1.0.0.tar.gz", hash = "sha256:eec6d497e4c2195fa0e8b2016b337532b8a699a68bcb22a512870e16925c6a5c"}, -] -sphinxcontrib-apidoc = [ - {file = "sphinxcontrib-apidoc-0.3.0.tar.gz", hash = "sha256:729bf592cf7b7dd57c4c05794f732dc026127275d785c2a5494521fdde773fb9"}, - {file = "sphinxcontrib_apidoc-0.3.0-py2.py3-none-any.whl", hash = "sha256:6671a46b2c6c5b0dca3d8a147849d159065e50443df79614f921b42fbd15cb09"}, -] -sphinxcontrib-applehelp = [ - {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, - {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, -] -sphinxcontrib-devhelp = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, -] -sphinxcontrib-htmlhelp = [ - {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, - {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, -] -sphinxcontrib-jsmath = [ - {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, - {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, -] -sphinxcontrib-qthelp = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, -] -sphinxcontrib-serializinghtml = [ - {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, - {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, -] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, @@ -1568,12 +850,8 @@ tomli = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] typing-extensions = [ - {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, - {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, -] -urllib3 = [ - {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, - {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, + {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, + {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, ] uvloop = [ {file = "uvloop-0.16.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6224f1401025b748ffecb7a6e2652b17768f30b1a6a3f7b44660e5b5b690b12d"}, @@ -1593,10 +871,6 @@ uvloop = [ {file = "uvloop-0.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e5f2e2ff51aefe6c19ee98af12b4ae61f5be456cd24396953244a30880ad861"}, {file = "uvloop-0.16.0.tar.gz", hash = "sha256:f74bc20c7b67d1c27c72601c78cf95be99d5c2cdd4514502b4f3eb0933ff1228"}, ] -virtualenv = [ - {file = "virtualenv-20.14.0-py2.py3-none-any.whl", hash = "sha256:1e8588f35e8b42c6ec6841a13c5e88239de1e6e4e4cedfd3916b306dc826ec66"}, - {file = "virtualenv-20.14.0.tar.gz", hash = "sha256:8e5b402037287126e81ccde9432b95a8be5b19d36584f64957060a3488c11ca8"}, -] yarl = [ {file = "yarl-1.7.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f2a8508f7350512434e41065684076f640ecce176d262a7d54f0da41d99c5a95"}, {file = "yarl-1.7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da6df107b9ccfe52d3a48165e48d72db0eca3e3029b5b8cb4fe6ee3cb870ba8b"}, @@ -1671,7 +945,3 @@ yarl = [ {file = "yarl-1.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:797c2c412b04403d2da075fb93c123df35239cd7b4cc4e0cd9e5839b73f52c58"}, {file = "yarl-1.7.2.tar.gz", hash = "sha256:45399b46d60c253327a460e99856752009fcee5f5d3c80b2f7c0cae1c38d56dd"}, ] -zipp = [ - {file = "zipp-3.7.0-py3-none-any.whl", hash = "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375"}, - {file = "zipp-3.7.0.tar.gz", hash = "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d"}, -] diff --git a/packages/plugins/minos-broker-rabbitmq/pyproject.toml b/packages/plugins/minos-broker-rabbitmq/pyproject.toml index ef68df5fc..c4176ff49 100644 --- a/packages/plugins/minos-broker-rabbitmq/pyproject.toml +++ b/packages/plugins/minos-broker-rabbitmq/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "minos-broker-rabbitmq" -version = "0.6.0" +version = "0.7.0" description = "The rabbitmq plugin of the Minos Framework" readme = "README.md" repository = "https://github.com/minos-framework/minos-python" @@ -21,18 +21,18 @@ keywords = [ "saga", ] packages = [ - { include = "minos" } + { include = "minos" }, ] include = [ - "AUTHORS.md", - "HISTORY.md", - "LICENSE", + { path = "AUTHORS.md", format = "sdist" }, + { path = "HISTORY.md", format = "sdist" }, + { path = "LICENSE", format = "sdist" }, ] [tool.poetry.dependencies] python = "^3.9" -minos-microservice-common = "^0.6.0" -minos-microservice-networks = "^0.6.0" +minos-microservice-common = "^0.7.0" +minos-microservice-networks = "^0.7.0" aio-pika = "^7.1.0" [tool.poetry.dev-dependencies] @@ -43,12 +43,6 @@ isort = "^5.8.0" pytest = "^6.2.4" coverage = "^6.3" flake8 = "^4.0.1" -Sphinx = "^4.0.1" -pre-commit = "^2.12.1" -sphinx-autodoc-typehints = "^1.12.0" -sphinxcontrib-apidoc = "^0.3.0" -sphinx-rtd-theme = "^1.0.0" -m2r2 = "^0.3.2" [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/packages/plugins/minos-broker-rabbitmq/tests/docker-compose.yml b/packages/plugins/minos-broker-rabbitmq/tests/docker-compose.yml index 2e0f9e21f..bc4158ab3 100644 --- a/packages/plugins/minos-broker-rabbitmq/tests/docker-compose.yml +++ b/packages/plugins/minos-broker-rabbitmq/tests/docker-compose.yml @@ -1,13 +1,5 @@ version: '2' services: - postgres: - image: postgres:alpine - network_mode: host - environment: - POSTGRES_USER: minos - POSTGRES_PASSWORD: min0s - POSTGRES_DB: order_db - rabbitmq: image: rabbitmq:3-management ports: diff --git a/packages/plugins/minos-broker-rabbitmq/tests/test_config.yml b/packages/plugins/minos-broker-rabbitmq/tests/test_config.yml index 2e1a8a779..3e4c40985 100644 --- a/packages/plugins/minos-broker-rabbitmq/tests/test_config.yml +++ b/packages/plugins/minos-broker-rabbitmq/tests/test_config.yml @@ -3,41 +3,8 @@ service: aggregate: tests.utils.Order services: - minos.networks.BrokerPort -services: - - tests.services.commands.CommandService - - tests.services.queries.QueryService -rest: - host: localhost - port: 8080 -repository: - database: order_db - user: minos - password: min0s - host: localhost - port: 5432 -snapshot: - database: order_db - user: minos - password: min0s - host: localhost - port: 5432 broker: host: localhost port: 5672 user: guest - password: guest - queue: - database: order_db - user: minos - password: min0s - host: localhost - port: 5432 - records: 10 - retry: 2 -saga: - storage: - path: "./order.lmdb" -discovery: - client: minos.networks.MinosDiscoveryClient - host: discovery-service - port: 8080 + password: guest \ No newline at end of file diff --git a/packages/plugins/minos-database-aiopg/AUTHORS.md b/packages/plugins/minos-database-aiopg/AUTHORS.md new file mode 100644 index 000000000..30ff94991 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/AUTHORS.md @@ -0,0 +1,15 @@ +# Credits + +## Development Lead + +* Andrea Mucci + +## Core Devs + +* Sergio Garcia Prado +* Vladyslav Fenchak +* Alberto Amigo Alonso + +## Contributors + +None yet. Why not be the first? diff --git a/packages/plugins/minos-database-aiopg/HISTORY.md b/packages/plugins/minos-database-aiopg/HISTORY.md new file mode 100644 index 000000000..69847e31e --- /dev/null +++ b/packages/plugins/minos-database-aiopg/HISTORY.md @@ -0,0 +1,16 @@ +# History + +## 0.7.0 (2022-05-11) + +* Add `AiopgDatabaseClient` as the `minos.common.DatabaseClient` implementation for `postgres`. +* Add `AiopgDatabaseOperation` as the `minos.common.DatabaseOperation` implementation for `postgres`. +* Add `AiopgLockDatabaseOperationFactory` as the `minos.common.LockDatabaseOperationFactory` implementation for `postgres`. +* Add `AiopgManagementDatabaseOperationFactory` as the `minos.common.ManagementDatabaseOperationFactory` implementation for `postgres`. +* Add `AiopgBrokerPublisherQueueDatabaseOperationFactory` as the `minos.networks.BrokerPublisherQueueDatabaseOperationFactory` implementation for `postgres`. +* Add `AiopgBrokerQueueDatabaseOperationFactory` as the `minos.networks.BrokerQueueDatabaseOperationFactory` implementation for `postgres`. +* Add `AiopgBrokerSubscriberDuplicateValidatorDatabaseOperationFactory` as the `minos.networks.BrokerSubscriberDuplicateValidatorDatabaseOperationFactory` implementation for `postgres`. +* Add `AiopgBrokerSubscriberQueueDatabaseOperationFactory` as the `minos.networks.BrokerSubscriberQueueDatabaseOperationFactory` implementation for `postgres`. +* Add `AiopgEventDatabaseOperationFactory` as the `minos.aggregate.EventDatabaseOperationFactory` implementation for `postgres`. +* Add `AiopgSnapshotDatabaseOperationFactory` as the `minos.aggregate.SnapshotDatabaseOperationFactory` implementation for `postgres`. +* Add `AiopgSnapshotQueryDatabaseOperationBuilder` to ease the complex snapshot's query building for `postgres`. +* Add `AiopgTransactionDatabaseOperationFactory` as the `minos.aggregate.TransactionDatabaseOperationFactory` implementation for `postgres`. diff --git a/packages/plugins/minos-database-aiopg/LICENSE b/packages/plugins/minos-database-aiopg/LICENSE new file mode 100644 index 000000000..4daf85bf2 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Clariteia + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/plugins/minos-database-aiopg/Makefile b/packages/plugins/minos-database-aiopg/Makefile new file mode 100644 index 000000000..2016f9e38 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/Makefile @@ -0,0 +1,37 @@ +.PHONY: docs + +lint: + poetry run flake8 + +test: + poetry run pytest + +coverage: + poetry run coverage run -m pytest + poetry run coverage report -m + poetry run coverage xml + +reformat: + poetry run black --line-length 120 minos tests + poetry run isort minos tests + +release: + $(MAKE) dist + poetry publish + +dist: + poetry build + ls -l dist + +install: + poetry install + +update: + poetry update + +check: + $(MAKE) install + $(MAKE) reformat + $(MAKE) lint + $(MAKE) test + $(MAKE) dist diff --git a/packages/plugins/minos-database-aiopg/README.md b/packages/plugins/minos-database-aiopg/README.md new file mode 100644 index 000000000..c05e24ad0 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/README.md @@ -0,0 +1,66 @@ +

+ Minos logo +

+ +## minos-database-aiopg + +[![PyPI Latest Release](https://img.shields.io/pypi/v/minos-database-aiopg.svg)](https://pypi.org/project/minos-database-aiopg/) +[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/minos-framework/minos-python/pages%20build%20and%20deployment?label=docs)](https://minos-framework.github.io/minos-python) +[![License](https://img.shields.io/github/license/minos-framework/minos-python.svg)](https://github.com/minos-framework/minos-python/blob/main/LICENSE) +[![Coverage](https://codecov.io/github/minos-framework/minos-python/coverage.svg?branch=main)](https://codecov.io/gh/minos-framework/minos-python) +[![Stack Overflow](https://img.shields.io/badge/Stack%20Overflow-Ask%20a%20question-green)](https://stackoverflow.com/questions/tagged/minos) + +## Summary + +Minos is a framework which helps you create [reactive](https://www.reactivemanifesto.org/) microservices in Python. Internally, it leverages Event Sourcing, CQRS and a message driven architecture to fulfil the commitments of an asynchronous environment. + +## Installation + +Install the dependency: + +```shell +pip install minos-database-aiopg +``` + +Set the database client on the `config.yml` file: + +```yaml +... +databases: + default: + client: minos.plugins.aiopg.AiopgDatabaseClient + database: order_db + user: minos + password: min0s + host: localhost + port: 5432 + query: + client: minos.plugins.aiopg.AiopgDatabaseClient + database: order_query_db + user: minos + password: min0s + host: localhost + port: 5432 + ... +... +``` + +## Documentation + +The official API Reference is publicly available at the [GitHub Pages](https://minos-framework.github.io/minos-python). + +## Source Code + +The source code of this project is hosted at the [GitHub Repository](https://github.com/minos-framework/minos-python). + +## Getting Help + +For usage questions, the best place to go to is [StackOverflow](https://stackoverflow.com/questions/tagged/minos). + +## Discussion and Development + +Most development discussions take place over the [GitHub Issues](https://github.com/minos-framework/minos-python/issues). In addition, a [Gitter channel](https://gitter.im/minos-framework/community) is available for development-related questions. + +## License + +This project is distributed under the [MIT](https://raw.githubusercontent.com/minos-framework/minos-python/main/LICENSE) license. diff --git a/packages/plugins/minos-database-aiopg/RUNTHETESTS.md b/packages/plugins/minos-database-aiopg/RUNTHETESTS.md new file mode 100644 index 000000000..386e2b0e7 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/RUNTHETESTS.md @@ -0,0 +1,20 @@ +# Run the tests + +In order to run the tests, please make sure you have the `Docker Engine `_ +and `Docker Compose `_ installed. + +Move into tests/ directory + +`cd tests/` + +Run service dependencies: + +`docker-compose up -d` + +Install library dependencies: + +`make install` + +Run tests: + +`make test` diff --git a/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/__init__.py b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/__init__.py new file mode 100644 index 000000000..741adcd86 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/__init__.py @@ -0,0 +1,24 @@ +"""The aiopg plugin of the Minos Framework.""" + +__author__ = "Minos Framework Devs" +__email__ = "hey@minos.run" +__version__ = "0.7.0" + +from .clients import ( + AiopgDatabaseClient, +) +from .factories import ( + AiopgBrokerPublisherQueueDatabaseOperationFactory, + AiopgBrokerQueueDatabaseOperationFactory, + AiopgBrokerSubscriberDuplicateValidatorDatabaseOperationFactory, + AiopgBrokerSubscriberQueueDatabaseOperationFactory, + AiopgEventDatabaseOperationFactory, + AiopgLockDatabaseOperationFactory, + AiopgManagementDatabaseOperationFactory, + AiopgSnapshotDatabaseOperationFactory, + AiopgSnapshotQueryDatabaseOperationBuilder, + AiopgTransactionDatabaseOperationFactory, +) +from .operations import ( + AiopgDatabaseOperation, +) diff --git a/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/clients.py b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/clients.py new file mode 100644 index 000000000..f49610012 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/clients.py @@ -0,0 +1,251 @@ +from __future__ import ( + annotations, +) + +import logging +from asyncio import ( + TimeoutError, +) +from collections.abc import ( + AsyncIterator, + Iterable, +) +from functools import ( + partial, +) +from typing import ( + Optional, +) + +import aiopg +from aiopg import ( + Connection, + Cursor, +) +from psycopg2 import ( + IntegrityError, + OperationalError, + ProgrammingError, +) + +from minos.common import ( + CircuitBreakerMixin, + ConnectionException, + DatabaseClient, + IntegrityException, + ProgrammingException, +) + +from .operations import ( + AiopgDatabaseOperation, +) + +logger = logging.getLogger(__name__) + + +class AiopgDatabaseClient(DatabaseClient, CircuitBreakerMixin): + """Aiopg Database Client class.""" + + _connection: Optional[Connection] + _cursor: Optional[Cursor] + + def __init__( + self, + database: str, + host: Optional[str] = None, + port: Optional[int] = None, + user: Optional[str] = None, + password: Optional[str] = None, + circuit_breaker_exceptions: Iterable[type] = tuple(), + connection_timeout: Optional[float] = None, + cursor_timeout: Optional[float] = None, + *args, + **kwargs, + ): + super().__init__( + *args, + **kwargs, + circuit_breaker_exceptions=(ConnectionException, *circuit_breaker_exceptions), + ) + + if host is None: + host = "localhost" + if port is None: + port = 5432 + if user is None: + user = "postgres" + if password is None: + password = "" + if connection_timeout is None: + connection_timeout = 1 + if cursor_timeout is None: + cursor_timeout = 60 + + self._database = database + self._host = host + self._port = port + self._user = user + self._password = password + + self._connection_timeout = connection_timeout + self._cursor_timeout = cursor_timeout + + self._connection = None + self._cursor = None + + async def _setup(self) -> None: + await super()._setup() + await self.recreate() + + async def _destroy(self) -> None: + await super()._destroy() + await self.close() + + async def recreate(self) -> None: + """Recreate the database connection. + + :return: This method does not return anything. + """ + await self.close() + + self._connection = await self.with_circuit_breaker(self._connect) + logger.debug(f"Created {self.database!r} database connection identified by {id(self._connection)}!") + + async def _connect(self) -> Connection: + try: + return await aiopg.connect( + timeout=self._connection_timeout, + host=self.host, + port=self.port, + dbname=self.database, + user=self.user, + password=self.password, + ) + except (OperationalError, TimeoutError) as exc: + raise ConnectionException(f"There was not possible to connect to the database: {exc!r}") + + async def close(self) -> None: + """Close database connection. + + :return: This method does not return anything. + """ + if await self.is_connected(): + await self._connection.close() + + if self._connection is not None: + logger.debug(f"Destroyed {self.database!r} database connection identified by {id(self._connection)}!") + self._connection = None + + async def is_connected(self) -> bool: + """Check if the client is connected. + + :return: ``True`` if it is connected or ``False`` otherwise. + """ + if self._connection is None: + return False + + try: + # This operation connects to the database and raises an exception if something goes wrong. + self._connection.isolation_level + except OperationalError: + return False + + return not self._connection.closed + + async def _reset(self, **kwargs) -> None: + await self._destroy_cursor(**kwargs) + + # noinspection PyUnusedLocal + async def _fetch_all(self) -> AsyncIterator[tuple]: + if self._cursor is None: + raise ProgrammingException("An operation must be executed before fetching any value.") + + try: + async for row in self._cursor: + yield row + except ProgrammingError as exc: + raise ProgrammingException(str(exc)) + except OperationalError as exc: + raise ConnectionException(f"There was not possible to connect to the database: {exc!r}") + + # noinspection PyUnusedLocal + async def _execute(self, operation: AiopgDatabaseOperation) -> None: + if not isinstance(operation, AiopgDatabaseOperation): + raise ValueError(f"The operation must be a {AiopgDatabaseOperation!r} instance. Obtained: {operation!r}") + + fn = partial(self._execute_cursor, operation=operation.query, parameters=operation.parameters) + await self.with_circuit_breaker(fn) + + async def _execute_cursor(self, operation: str, parameters: dict): + if not await self.is_connected(): + await self.recreate() + + self._cursor = await self._connection.cursor(timeout=self._cursor_timeout) + try: + await self._cursor.execute(operation=operation, parameters=parameters) + except OperationalError as exc: + raise ConnectionException(f"There was not possible to connect to the database: {exc!r}") + except IntegrityError as exc: + raise IntegrityException(f"The requested operation raised a integrity error: {exc!r}") + + async def _destroy_cursor(self, **kwargs): + if self._cursor is not None: + if not self._cursor.closed: + self._cursor.close() + self._cursor = None + + @property + def cursor(self) -> Optional[Cursor]: + """Get the cursor. + + :return: A ``Cursor`` instance. + """ + return self._cursor + + @property + def connection(self) -> Optional[Connection]: + """Get the connection. + + :return: A ``Connection`` instance. + """ + return self._connection + + @property + def database(self) -> str: + """Get the database's database. + + :return: A ``str`` value. + """ + return self._database + + @property + def host(self) -> str: + """Get the database's host. + + :return: A ``str`` value. + """ + return self._host + + @property + def port(self) -> int: + """Get the database's port. + + :return: An ``int`` value. + """ + return self._port + + @property + def user(self) -> str: + """Get the database's user. + + :return: A ``str`` value. + """ + return self._user + + @property + def password(self) -> str: + """Get the database's password. + + :return: A ``str`` value. + """ + return self._password diff --git a/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/__init__.py b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/__init__.py new file mode 100644 index 000000000..0a9416f42 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/__init__.py @@ -0,0 +1,16 @@ +from .aggregate import ( + AiopgEventDatabaseOperationFactory, + AiopgSnapshotDatabaseOperationFactory, + AiopgSnapshotQueryDatabaseOperationBuilder, + AiopgTransactionDatabaseOperationFactory, +) +from .common import ( + AiopgLockDatabaseOperationFactory, + AiopgManagementDatabaseOperationFactory, +) +from .networks import ( + AiopgBrokerPublisherQueueDatabaseOperationFactory, + AiopgBrokerQueueDatabaseOperationFactory, + AiopgBrokerSubscriberDuplicateValidatorDatabaseOperationFactory, + AiopgBrokerSubscriberQueueDatabaseOperationFactory, +) diff --git a/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/aggregate/__init__.py b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/aggregate/__init__.py new file mode 100644 index 000000000..7ab92c103 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/aggregate/__init__.py @@ -0,0 +1,10 @@ +from .events import ( + AiopgEventDatabaseOperationFactory, +) +from .snapshots import ( + AiopgSnapshotDatabaseOperationFactory, + AiopgSnapshotQueryDatabaseOperationBuilder, +) +from .transactions import ( + AiopgTransactionDatabaseOperationFactory, +) diff --git a/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/aggregate/events.py b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/aggregate/events.py new file mode 100644 index 000000000..701578bb2 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/aggregate/events.py @@ -0,0 +1,306 @@ +from collections.abc import ( + Iterable, +) +from datetime import ( + datetime, +) +from typing import ( + Any, + Optional, +) +from uuid import ( + UUID, +) + +from psycopg2.sql import ( + SQL, + Composable, + Identifier, + Literal, + Placeholder, +) + +from minos.aggregate import ( + Action, + EventDatabaseOperationFactory, +) +from minos.common import ( + ComposedDatabaseOperation, + DatabaseOperation, +) + +from ...clients import ( + AiopgDatabaseClient, +) +from ...operations import ( + AiopgDatabaseOperation, +) + + +# noinspection SqlNoDataSourceInspection,SqlResolve,PyMethodMayBeStatic +class AiopgEventDatabaseOperationFactory(EventDatabaseOperationFactory): + """Aiopg Event Database Operation Factory class.""" + + def build_table_name(self) -> str: + """Get the table name. + + :return: A ``str`` value. + """ + return "aggregate_event" + + def build_create(self) -> DatabaseOperation: + """Build the database operation to create the event table. + + :return: A ``DatabaseOperation`` instance.s + """ + return ComposedDatabaseOperation( + [ + AiopgDatabaseOperation( + 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp";', + lock="uuid-ossp", + ), + AiopgDatabaseOperation( + """ + DO + $$ + BEGIN + IF NOT EXISTS(SELECT * + FROM pg_type typ + INNER JOIN pg_namespace nsp + ON nsp.oid = typ.typnamespace + WHERE nsp.nspname = current_schema() + AND typ.typname = 'action_type') THEN + CREATE TYPE action_type AS ENUM ('create', 'update', 'delete'); + END IF; + END; + $$ + LANGUAGE plpgsql; + """, + lock=self.build_table_name(), + ), + AiopgDatabaseOperation( + f""" + CREATE TABLE IF NOT EXISTS {self.build_table_name()} ( + id BIGSERIAL PRIMARY KEY, + action ACTION_TYPE NOT NULL, + uuid UUID NOT NULL, + name TEXT NOT NULL, + version INT NOT NULL, + data BYTEA NOT NULL, + created_at TIMESTAMPTZ NOT NULL, + transaction_uuid UUID NOT NULL DEFAULT uuid_nil(), + UNIQUE (uuid, version, transaction_uuid) + ); + """, + lock=self.build_table_name(), + ), + ] + ) + + def build_submit( + self, + transaction_uuids: Iterable[UUID], + uuid: UUID, + action: Action, + name: str, + version: int, + data: bytes, + created_at: datetime, + transaction_uuid: UUID, + lock: Optional[str], + **kwargs, + ) -> DatabaseOperation: + """Build the database operation to submit a row into the event table. + + :param transaction_uuids: The sequence of nested transaction in on top of the current event's transaction. + :param uuid: The identifier of the entity. + :param action: The action of the event. + :param name: The name of the entity. + :param version: The version of the entity + :param data: The data of the event. + :param created_at: The creation datetime. + :param transaction_uuid: The identifier of the transaction. + :param lock: The lock identifier. + :param kwargs: Additional named arguments. + :return: A ``DatabaseOperation`` instance. + """ + insert_values = SQL( + """ + INSERT INTO {table_name} (id, action, uuid, name, version, data, created_at, transaction_uuid) + VALUES ( + default, + %(action)s, + CASE %(uuid)s WHEN uuid_nil() THEN uuid_generate_v4() ELSE %(uuid)s END, + %(name)s, + ( + SELECT (CASE WHEN %(version)s IS NULL THEN 1 + COALESCE(MAX(t2.version), 0) ELSE %(version)s END) + FROM ( + SELECT DISTINCT ON (t1.uuid) t1.version + FROM ( {from_parts} ) AS t1 + ORDER BY t1.uuid, t1.transaction_index DESC + ) AS t2 + ), + %(data)s, + (CASE WHEN %(created_at)s IS NULL THEN NOW() ELSE %(created_at)s END), + %(transaction_uuid)s + ) + RETURNING id, uuid, version, created_at; + """ + ) + insert_parameters = { + "uuid": uuid, + "action": action, + "name": name, + "version": version, + "data": data, + "created_at": created_at, + "transaction_uuid": transaction_uuid, + } + + from_sql, from_parameters = self._build_submit_from(transaction_uuids) + + query = insert_values.format(from_parts=from_sql, table_name=Identifier(self.build_table_name())) + parameters = from_parameters | insert_parameters + + return AiopgDatabaseOperation(query, parameters, lock) + + def _build_submit_from(self, transaction_uuids: Iterable[UUID]) -> tuple[Composable, dict[str, Any]]: + select_transaction = SQL( + """ + SELECT {index} AS transaction_index, uuid, MAX(version) AS version + FROM {table_name} + WHERE uuid = %(uuid)s AND transaction_uuid = {transaction_uuid} + GROUP BY uuid + """ + ) + from_query_parts = list() + parameters = dict() + for index, transaction_uuid in enumerate(transaction_uuids, start=1): + name = f"transaction_uuid_{index}" + parameters[name] = transaction_uuid + + from_query_parts.append( + select_transaction.format( + index=Literal(index), + transaction_uuid=Placeholder(name), + table_name=Identifier(self.build_table_name()), + ), + ) + + query = SQL(" UNION ALL ").join(from_query_parts) + return query, parameters + + # noinspection PyShadowingBuiltins + def build_query( + self, + uuid: Optional[UUID] = None, + name: Optional[str] = None, + version: Optional[int] = None, + version_lt: Optional[int] = None, + version_gt: Optional[int] = None, + version_le: Optional[int] = None, + version_ge: Optional[int] = None, + id: Optional[int] = None, + id_lt: Optional[int] = None, + id_gt: Optional[int] = None, + id_le: Optional[int] = None, + id_ge: Optional[int] = None, + transaction_uuid: Optional[UUID] = None, + transaction_uuid_ne: Optional[UUID] = None, + transaction_uuid_in: Optional[Iterable[UUID, ...]] = None, + **kwargs, + ) -> DatabaseOperation: + """Build the database operation to select rows. + + :param uuid: The identifier must be equal to the given value. + :param name: The classname must be equal to the given value. + :param version: The version must be equal to the given value. + :param version_lt: The version must be lower than the given value. + :param version_gt: The version must be greater than the given value. + :param version_le: The version must be lower or equal to the given value. + :param version_ge: The version must be greater or equal to the given value. + :param id: The entry identifier must be equal to the given value. + :param id_lt: The entry identifier must be lower than the given value. + :param id_gt: The entry identifier must be greater than the given value. + :param id_le: The entry identifier must be lower or equal to the given value. + :param id_ge: The entry identifier must be greater or equal to the given value. + :param transaction_uuid: The transaction identifier must be equal to the given value. + :param transaction_uuid_ne: The transaction identifier must be distinct of the given value. + :param transaction_uuid_in: The destination transaction identifier must be equal to one of the given values. + + :return: A ``DatabaseOperation`` instance. + """ + if transaction_uuid_in is not None: + transaction_uuid_in = tuple(transaction_uuid_in) + + _select_all = f""" + SELECT uuid, name, version, data, id, action, created_at, transaction_uuid + FROM {self.build_table_name()} + """ + + conditions = list() + + if uuid is not None: + conditions.append("uuid = %(uuid)s") + if name is not None: + conditions.append("name = %(name)s") + if version is not None: + conditions.append("version = %(version)s") + if version_lt is not None: + conditions.append("version < %(version_lt)s") + if version_gt is not None: + conditions.append("version > %(version_gt)s") + if version_le is not None: + conditions.append("version <= %(version_le)s") + if version_ge is not None: + conditions.append("version >= %(version_ge)s") + if id is not None: + conditions.append("id = %(id)s") + if id_lt is not None: + conditions.append("id < %(id_lt)s") + if id_gt is not None: + conditions.append("id > %(id_gt)s") + if id_le is not None: + conditions.append("id <= %(id_le)s") + if id_ge is not None: + conditions.append("id >= %(id_ge)s") + if transaction_uuid is not None: + conditions.append("transaction_uuid = %(transaction_uuid)s") + if transaction_uuid_ne is not None: + conditions.append("transaction_uuid <> %(transaction_uuid_ne)s") + if transaction_uuid_in is not None: + conditions.append("transaction_uuid IN %(transaction_uuid_in)s") + + if not conditions: + return AiopgDatabaseOperation(f"{_select_all} ORDER BY id;") + + return AiopgDatabaseOperation( + f"{_select_all} WHERE {' AND '.join(conditions)} ORDER BY id;", + { + "uuid": uuid, + "name": name, + "version": version, + "version_lt": version_lt, + "version_gt": version_gt, + "version_le": version_le, + "version_ge": version_ge, + "id": id, + "id_lt": id_lt, + "id_gt": id_gt, + "id_le": id_le, + "id_ge": id_ge, + "transaction_uuid": transaction_uuid, + "transaction_uuid_ne": transaction_uuid_ne, + "transaction_uuid_in": transaction_uuid_in, + }, + ) + + def build_query_offset(self) -> DatabaseOperation: + """Build the database operation to get the maximum identifier. + + :return: A ``DatabaseOperation`` instance. + """ + return AiopgDatabaseOperation(f"SELECT MAX(id) FROM {self.build_table_name()};".strip()) + + +AiopgDatabaseClient.set_factory(EventDatabaseOperationFactory, AiopgEventDatabaseOperationFactory) diff --git a/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/aggregate/snapshots/__init__.py b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/aggregate/snapshots/__init__.py new file mode 100644 index 000000000..0edcf80f2 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/aggregate/snapshots/__init__.py @@ -0,0 +1,6 @@ +from .impl import ( + AiopgSnapshotDatabaseOperationFactory, +) +from .queries import ( + AiopgSnapshotQueryDatabaseOperationBuilder, +) diff --git a/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/aggregate/snapshots/impl.py b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/aggregate/snapshots/impl.py new file mode 100644 index 000000000..acc3f9171 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/aggregate/snapshots/impl.py @@ -0,0 +1,237 @@ +from collections.abc import ( + Iterable, +) +from datetime import ( + datetime, +) +from typing import ( + Any, + Optional, +) +from uuid import ( + UUID, +) + +from minos.aggregate import ( + SnapshotDatabaseOperationFactory, +) +from minos.aggregate.queries import ( + _Condition, + _Ordering, +) +from minos.common import ( + ComposedDatabaseOperation, + DatabaseOperation, +) + +from ....clients import ( + AiopgDatabaseClient, +) +from ....operations import ( + AiopgDatabaseOperation, +) +from .queries import ( + AiopgSnapshotQueryDatabaseOperationBuilder, +) + + +# noinspection SqlNoDataSourceInspection,SqlResolve +class AiopgSnapshotDatabaseOperationFactory(SnapshotDatabaseOperationFactory): + """Aiopg Snapshot Database Operation Factory class.""" + + def build_table_name(self) -> str: + """Get the table name. + + :return: A ``str`` value. + """ + return "snapshot" + + def build_offset_table_name(self) -> str: + """Get the offset table name. + + :return: A ``str`` value. + """ + return "snapshot_aux_offset" + + def build_create(self) -> DatabaseOperation: + """Build the database operation to create the snapshot table. + + :return: A ``DatabaseOperation`` instance. + """ + return ComposedDatabaseOperation( + [ + AiopgDatabaseOperation( + 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp";', + lock="uuid-ossp", + ), + AiopgDatabaseOperation( + f""" + CREATE TABLE IF NOT EXISTS {self.build_table_name()} ( + uuid UUID NOT NULL, + name TEXT NOT NULL, + version INT NOT NULL, + schema BYTEA, + data JSONB, + created_at TIMESTAMPTZ NOT NULL, + updated_at TIMESTAMPTZ NOT NULL, + transaction_uuid UUID NOT NULL DEFAULT uuid_nil(), + PRIMARY KEY (uuid, transaction_uuid) + ); + """, + lock=self.build_table_name(), + ), + AiopgDatabaseOperation( + f""" + CREATE TABLE IF NOT EXISTS {self.build_offset_table_name()} ( + id bool PRIMARY KEY DEFAULT TRUE, + value BIGINT NOT NULL, + CONSTRAINT id_uni CHECK (id) + ); + """, + lock=self.build_offset_table_name(), + ), + ] + ) + + def build_delete(self, transaction_uuids: Iterable[UUID]) -> DatabaseOperation: + """Build the database operation to delete rows by transaction identifiers. + + :param transaction_uuids: The transaction identifiers. + :return: A ``DatabaseOperation`` instance. + """ + return AiopgDatabaseOperation( + f""" + DELETE FROM {self.build_table_name()} + WHERE transaction_uuid IN %(transaction_uuids)s; + """, + {"transaction_uuids": tuple(transaction_uuids)}, + ) + + def build_submit( + self, + uuid: UUID, + name: str, + version: int, + schema: bytes, + data: dict[str, Any], + created_at: datetime, + updated_at: datetime, + transaction_uuid: UUID, + ) -> DatabaseOperation: + """Build the insert database operation. + + :param uuid: The identifier of the entity. + :param name: The name of the entity. + :param version: The version of the entity. + :param schema: The schema of the entity. + :param data: The data of the entity. + :param created_at: The creation datetime. + :param updated_at: The last update datetime. + :param transaction_uuid: The transaction identifier. + :return: A ``DatabaseOperation`` instance. + """ + + return AiopgDatabaseOperation( + f""" + INSERT INTO {self.build_table_name()} ( + uuid, name, version, schema, data, created_at, updated_at, transaction_uuid + ) + VALUES ( + %(uuid)s, + %(name)s, + %(version)s, + %(schema)s, + %(data)s, + %(created_at)s, + %(updated_at)s, + %(transaction_uuid)s + ) + ON CONFLICT (uuid, transaction_uuid) + DO + UPDATE SET version = %(version)s, schema = %(schema)s, data = %(data)s, updated_at = %(updated_at)s + RETURNING created_at, updated_at; + """.strip(), + { + "uuid": uuid, + "name": name, + "version": version, + "schema": schema, + "data": data, + "created_at": created_at, + "updated_at": updated_at, + "transaction_uuid": transaction_uuid, + }, + ) + + def build_query( + self, + name: str, + condition: _Condition, + ordering: Optional[_Ordering], + limit: Optional[int], + transaction_uuids: Iterable[UUID], + exclude_deleted: bool, + ) -> DatabaseOperation: + """Build the query database operation. + + :param name: Class name of the ``RootEntity``. + :param condition: The condition that must be satisfied by the ``RootEntity`` instances. + :param ordering: Optional argument to return the instance with specific ordering strategy. The default behaviour + is to retrieve them without any order pattern. + :param limit: Optional argument to return only a subset of instances. The default behaviour is to return all the + instances that meet the given condition. + :param transaction_uuids: The transaction within the operation is performed. If not any value is provided, then + the transaction is extracted from the context var. If not any transaction is being scoped then the query is + performed to the global snapshot. + :param exclude_deleted: If ``True``, deleted ``RootEntity`` entries are included, otherwise deleted + ``RootEntity`` entries are filtered. + :return: A ``DatabaseOperation`` instance. + """ + builder = AiopgSnapshotQueryDatabaseOperationBuilder( + name=name, + condition=condition, + ordering=ordering, + limit=limit, + transaction_uuids=transaction_uuids, + exclude_deleted=exclude_deleted, + table_name=self.build_table_name(), + ) + query, parameters = builder.build() + + return AiopgDatabaseOperation(query, parameters) + + def build_submit_offset(self, value: int) -> DatabaseOperation: + """Build the database operation to store the offset. + + :param value: The value to be stored as the new offset. + :return: A ``DatabaseOperation`` instance. + """ + return AiopgDatabaseOperation( + f""" + INSERT INTO {self.build_offset_table_name()} (id, value) + VALUES (TRUE, %(value)s) + ON CONFLICT (id) + DO UPDATE SET value = GREATEST( + %(value)s, + (SELECT value FROM {self.build_offset_table_name()} WHERE id = TRUE) + ); + """.strip(), + {"value": value}, + lock=f"insert_{self.build_offset_table_name()}", + ) + + def build_query_offset(self) -> DatabaseOperation: + """Build the database operation to get the current offset. + + :return: A ``DatabaseOperation`` instance. + """ + return AiopgDatabaseOperation( + f""" + SELECT value + FROM {self.build_offset_table_name()} + WHERE id = TRUE; + """ + ) + + +AiopgDatabaseClient.set_factory(SnapshotDatabaseOperationFactory, AiopgSnapshotDatabaseOperationFactory) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/queries.py b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/aggregate/snapshots/queries.py similarity index 69% rename from packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/queries.py rename to packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/aggregate/snapshots/queries.py index 5ba0f9a31..ddbd559e9 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/queries.py +++ b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/aggregate/snapshots/queries.py @@ -4,6 +4,7 @@ from typing import ( Any, + Iterable, Optional, ) from uuid import ( @@ -22,15 +23,10 @@ Placeholder, ) -from minos.common import ( - NULL_UUID, - AvroDataEncoder, -) - -from ...contextvars import ( +from minos.aggregate import ( IS_REPOSITORY_SERIALIZATION_CONTEXT_VAR, ) -from ...queries import ( +from minos.aggregate.queries import ( _FALSE_CONDITION, _AndCondition, _ComposedCondition, @@ -50,10 +46,15 @@ _SimpleCondition, _TrueCondition, ) +from minos.common import ( + NULL_UUID, + AvroDataEncoder, +) -class PostgreSqlSnapshotQueryBuilder: - """PostgreSQL Snapshot Query Builder class. +# noinspection SqlResolve,SqlNoDataSourceInspection +class AiopgSnapshotQueryDatabaseOperationBuilder: + """Aiopg Snapshot Query Database Operation Builder class. This class build postgres-compatible database queries over fields based on a condition, ordering, etc. """ @@ -64,15 +65,21 @@ def __init__( condition: _Condition, ordering: Optional[_Ordering] = None, limit: Optional[int] = None, - transaction_uuids: tuple[UUID, ...] = (NULL_UUID,), + transaction_uuids: Iterable[UUID, ...] = (NULL_UUID,), exclude_deleted: bool = False, + table_name: Optional[str] = None, ): + if not isinstance(transaction_uuids, tuple): + transaction_uuids = tuple(transaction_uuids) + if table_name is None: + table_name = "snapshot" self.name = name self.condition = condition self.ordering = ordering self.limit = limit self.transaction_uuids = transaction_uuids self.exclude_deleted = exclude_deleted + self.table_name = table_name self._parameters = None def build(self) -> tuple[Composable, dict[str, Any]]: @@ -99,7 +106,7 @@ def _build(self) -> Composable: query = SQL(" WHERE ").join([self._build_select_from(), self._build_condition(self.condition)]) if self.exclude_deleted: - query = SQL(" AND ").join([query, _EXCLUDE_DELETED_CONDITION]) + query = SQL(" AND ").join([query, self._EXCLUDE_DELETED_CONDITION]) if self.ordering is not None: query = SQL(" ").join([query, self._build_ordering(self.ordering)]) @@ -116,12 +123,14 @@ def _build_select_from(self) -> Composable: self._parameters[name] = transaction_uuid from_query_parts.append( - _SELECT_TRANSACTION_CHUNK.format(index=Literal(index), transaction_uuid=Placeholder(name)) + self._SELECT_TRANSACTION_CHUNK.format( + index=Literal(index), transaction_uuid=Placeholder(name), table_name=Identifier(self.table_name) + ) ) from_query = SQL(" UNION ALL ").join(from_query_parts) - query = _SELECT_ENTRIES_QUERY.format(from_parts=from_query) + query = self._SELECT_ENTRIES_QUERY.format(from_parts=from_query) return query def _build_condition(self, condition: _Condition) -> Composable: @@ -145,14 +154,14 @@ def _build_condition_not(self, condition: _NotCondition) -> Composable: def _build_condition_composed(self, condition: _ComposedCondition) -> Composable: # noinspection PyTypeChecker - operator = _COMPOSED_MAPPER[type(condition)] + operator = self._COMPOSED_MAPPER[type(condition)] parts = (self._build_condition(c) for c in condition) return SQL("({composed})").format(composed=operator.join(parts)) def _build_condition_simple(self, condition: _SimpleCondition) -> Composable: field = condition.field # noinspection PyTypeChecker - operator = _SIMPLE_MAPPER[type(condition)] + operator = self._SIMPLE_MAPPER[type(condition)] parameter = AvroDataEncoder(condition.parameter).build() if isinstance(parameter, list): @@ -160,11 +169,11 @@ def _build_condition_simple(self, condition: _SimpleCondition) -> Composable: return self._build_condition(_FALSE_CONDITION) parameter = tuple(parameter) - if field in _FIXED_FIELDS_MAPPER: + if field in self._FIXED_FIELDS_MAPPER: name = self.generate_random_str() self._parameters[name] = parameter - field = _FIXED_FIELDS_MAPPER[field] + field = self._FIXED_FIELDS_MAPPER[field] name = Placeholder(name) return SQL("({field} {operator} {name})").format(field=field, operator=operator, name=name) else: @@ -180,11 +189,11 @@ def _build_condition_like(self, condition: _SimpleCondition) -> Composable: parameter = AvroDataEncoder(condition.parameter).build() - if field in _FIXED_FIELDS_MAPPER: + if field in self._FIXED_FIELDS_MAPPER: name = self.generate_random_str() self._parameters[name] = parameter - field = _FIXED_FIELDS_MAPPER[field] + field = self._FIXED_FIELDS_MAPPER[field] name = Placeholder(name) return SQL("({field}::text LIKE {name})").format(field=field, name=name) else: @@ -195,12 +204,11 @@ def _build_condition_like(self, condition: _SimpleCondition) -> Composable: name = Placeholder(name) return SQL("(data#>>{field} LIKE {name})").format(field=field, name=name) - @staticmethod - def _build_ordering(ordering: _Ordering) -> Composable: + def _build_ordering(self, ordering: _Ordering) -> Composable: field = ordering.by - direction = _ORDERING_MAPPER[ordering.reverse] + direction = self._ORDERING_MAPPER[ordering.reverse] - if field in _FIXED_FIELDS_MAPPER: + if field in self._FIXED_FIELDS_MAPPER: field = Identifier(field) order_by = SQL("ORDER BY {field} {direction}").format(field=field, direction=direction) else: @@ -222,52 +230,51 @@ def generate_random_str() -> str: """ return str(uuid4()) - -_COMPOSED_MAPPER = {_AndCondition: SQL(" AND "), _OrCondition: SQL(" OR ")} - -_SIMPLE_MAPPER = { - _LowerCondition: SQL("<"), - _LowerEqualCondition: SQL("<="), - _GreaterCondition: SQL(">"), - _GreaterEqualCondition: SQL(">="), - _EqualCondition: SQL("="), - _NotEqualCondition: SQL("<>"), - _InCondition: SQL("IN"), -} - -_FIXED_FIELDS_MAPPER = { - "uuid": Identifier("uuid"), - "version": Identifier("version"), - "created_at": Identifier("created_at"), - "updated_at": Identifier("updated_at"), -} - -_ORDERING_MAPPER = { - True: SQL("DESC"), - False: SQL("ASC"), -} - -_SELECT_ENTRIES_QUERY = SQL( - "SELECT " - " t2.uuid, " - " t2.name, " - " t2.version, " - " t2.schema, " - " t2.data, " - " t2.created_at, " - " t2.updated_at, " - " t2.transaction_uuid " - "FROM (" - " SELECT DISTINCT ON (uuid) t1.* " - " FROM ( {from_parts} ) AS t1 " - " ORDER BY uuid, transaction_index DESC " - ") AS t2" -) - -_SELECT_TRANSACTION_CHUNK = SQL( - "SELECT {index} AS transaction_index, * " - "FROM snapshot " - "WHERE name = %(name)s AND transaction_uuid = {transaction_uuid} " -) - -_EXCLUDE_DELETED_CONDITION = SQL("(data IS NOT NULL)") + _COMPOSED_MAPPER = {_AndCondition: SQL(" AND "), _OrCondition: SQL(" OR ")} + + _SIMPLE_MAPPER = { + _LowerCondition: SQL("<"), + _LowerEqualCondition: SQL("<="), + _GreaterCondition: SQL(">"), + _GreaterEqualCondition: SQL(">="), + _EqualCondition: SQL("="), + _NotEqualCondition: SQL("<>"), + _InCondition: SQL("IN"), + } + + _FIXED_FIELDS_MAPPER = { + "uuid": Identifier("uuid"), + "version": Identifier("version"), + "created_at": Identifier("created_at"), + "updated_at": Identifier("updated_at"), + } + + _ORDERING_MAPPER = { + True: SQL("DESC"), + False: SQL("ASC"), + } + + _SELECT_ENTRIES_QUERY = SQL( + "SELECT " + " t2.uuid, " + " t2.name, " + " t2.version, " + " t2.schema, " + " t2.data, " + " t2.created_at, " + " t2.updated_at, " + " t2.transaction_uuid " + "FROM (" + " SELECT DISTINCT ON (uuid) t1.* " + " FROM ( {from_parts} ) AS t1 " + " ORDER BY uuid, transaction_index DESC " + ") AS t2" + ) + + _SELECT_TRANSACTION_CHUNK = SQL( + "SELECT {index} AS transaction_index, * " + "FROM {table_name} " + "WHERE name = %(name)s AND transaction_uuid = {transaction_uuid} " + ) + + _EXCLUDE_DELETED_CONDITION = SQL("(data IS NOT NULL)") diff --git a/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/aggregate/transactions.py b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/aggregate/transactions.py new file mode 100644 index 000000000..d98ecfe08 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/aggregate/transactions.py @@ -0,0 +1,252 @@ +from __future__ import ( + annotations, +) + +from collections.abc import ( + Iterable, +) +from datetime import ( + datetime, +) +from typing import ( + Optional, +) +from uuid import ( + UUID, +) + +from minos.aggregate import ( + TransactionDatabaseOperationFactory, + TransactionStatus, +) +from minos.common import ( + ComposedDatabaseOperation, + DatabaseOperation, +) + +from ...clients import ( + AiopgDatabaseClient, +) +from ...operations import ( + AiopgDatabaseOperation, +) + + +# noinspection SqlNoDataSourceInspection,SqlResolve,PyMethodMayBeStatic +class AiopgTransactionDatabaseOperationFactory(TransactionDatabaseOperationFactory): + """Aiopg Transaction Database Operation Factory class.""" + + def build_table_name(self) -> str: + """Get the table name. + + :return: A ``str`` value. + """ + return "aggregate_transaction" + + def build_create(self) -> DatabaseOperation: + """Build the database operation to create the snapshot table. + + :return: A ``DatabaseOperation`` instance. + """ + + return ComposedDatabaseOperation( + [ + AiopgDatabaseOperation( + 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp";', + lock="uuid-ossp", + ), + AiopgDatabaseOperation( + """ + DO + $$ + BEGIN + IF NOT EXISTS(SELECT * + FROM pg_type typ + INNER JOIN pg_namespace nsp + ON nsp.oid = typ.typnamespace + WHERE nsp.nspname = current_schema() + AND typ.typname = 'transaction_status') THEN + CREATE TYPE transaction_status AS ENUM ( + 'pending', 'reserving', 'reserved', 'committing', 'committed', 'rejected' + ); + END IF; + END; + $$ + LANGUAGE plpgsql; + """, + lock="transaction_status", + ), + AiopgDatabaseOperation( + f""" + CREATE TABLE IF NOT EXISTS {self.build_table_name()} ( + uuid UUID PRIMARY KEY, + destination_uuid UUID NOT NULL, + status TRANSACTION_STATUS NOT NULL, + event_offset INTEGER, + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() + ); + """, + lock=self.build_table_name(), + ), + ] + ) + + def build_submit( + self, + uuid: UUID, + destination_uuid: UUID, + status: TransactionStatus, + event_offset: int, + **kwargs, + ) -> DatabaseOperation: + """Build the database operation to submit a row. + + :param uuid: The identifier of the transaction. + :param destination_uuid: The identifier of the destination transaction. + :param status: The status of the transaction. + :param event_offset: The event offset of the transaction. + :param kwargs: Additional named arguments. + :return: A ``DatabaseOperation`` instance. + """ + + params = { + "uuid": uuid, + "destination_uuid": destination_uuid, + "status": status, + "event_offset": event_offset, + } + + return AiopgDatabaseOperation( + f""" + INSERT INTO {self.build_table_name()} AS t (uuid, destination_uuid, status, event_offset) + VALUES (%(uuid)s, %(destination_uuid)s, %(status)s, %(event_offset)s) + ON CONFLICT (uuid) + DO + UPDATE SET status = %(status)s, event_offset = %(event_offset)s, updated_at = NOW() + WHERE (t.destination_uuid = %(destination_uuid)s) + AND (NOT (t.status = 'pending' AND %(status)s NOT IN ('pending', 'reserving', 'rejected'))) + AND (NOT (t.status = 'reserving' AND %(status)s NOT IN ('reserved', 'rejected'))) + AND (NOT (t.status = 'reserved' AND %(status)s NOT IN ('committing', 'rejected'))) + AND (NOT (t.status = 'committing' AND %(status)s NOT IN ('committed'))) + AND (NOT (t.status = 'committed')) + AND (NOT (t.status = 'rejected')) + RETURNING updated_at; + """, + params, + lock=uuid.int & (1 << 32) - 1, + ) + + def build_query( + self, + uuid: Optional[UUID] = None, + uuid_ne: Optional[UUID] = None, + uuid_in: Optional[Iterable[UUID]] = None, + destination_uuid: Optional[UUID] = None, + status: Optional[str] = None, + status_in: Optional[Iterable[str]] = None, + event_offset: Optional[int] = None, + event_offset_lt: Optional[int] = None, + event_offset_gt: Optional[int] = None, + event_offset_le: Optional[int] = None, + event_offset_ge: Optional[int] = None, + updated_at: Optional[datetime] = None, + updated_at_lt: Optional[datetime] = None, + updated_at_gt: Optional[datetime] = None, + updated_at_le: Optional[datetime] = None, + updated_at_ge: Optional[datetime] = None, + **kwargs, + ) -> DatabaseOperation: + """Build the database operation to select rows. + + :param uuid: Transaction identifier equal to the given value. + :param uuid_ne: Transaction identifier not equal to the given value + :param uuid_in: Transaction identifier within the given values. + :param destination_uuid: Destination Transaction identifier equal to the given value. + :param status: Transaction status equal to the given value. + :param status_in: Transaction status within the given values + :param event_offset: Event offset equal to the given value. + :param event_offset_lt: Event Offset lower than the given value + :param event_offset_gt: Event Offset greater than the given value + :param event_offset_le: Event Offset lower or equal to the given value + :param event_offset_ge: Event Offset greater or equal to the given value + :param updated_at: Updated at equal to the given value. + :param updated_at_lt: Updated at lower than the given value. + :param updated_at_gt: Updated at greater than the given value. + :param updated_at_le: Updated at lower or equal to the given value. + :param updated_at_ge: Updated at greater or equal to the given value. + :param kwargs: Additional named arguments. + :return: A ``DatabaseOperation`` instance. + """ + if uuid_in is not None: + uuid_in = tuple(uuid_in) + + if status_in is not None: + status_in = tuple(status_in) + + conditions = list() + + if uuid is not None: + conditions.append("uuid = %(uuid)s") + if uuid_ne is not None: + conditions.append("uuid <> %(uuid_ne)s") + if uuid_in is not None: + conditions.append("uuid IN %(uuid_in)s") + if destination_uuid is not None: + conditions.append("destination_uuid = %(destination_uuid)s") + if status is not None: + conditions.append("status = %(status)s") + if status_in is not None: + conditions.append("status IN %(status_in)s") + if event_offset is not None: + conditions.append("event_offset = %(event_offset)s") + if event_offset_lt is not None: + conditions.append("event_offset < %(event_offset_lt)s") + if event_offset_gt is not None: + conditions.append("event_offset > %(event_offset_gt)s") + if event_offset_le is not None: + conditions.append("event_offset <= %(event_offset_le)s") + if event_offset_ge is not None: + conditions.append("event_offset >= %(event_offset_ge)s") + if updated_at is not None: + conditions.append("updated_at = %(updated_at)s") + if updated_at_lt is not None: + conditions.append("updated_at < %(updated_at_lt)s") + if updated_at_gt is not None: + conditions.append("updated_at > %(updated_at_gt)s") + if updated_at_le is not None: + conditions.append("updated_at <= %(updated_at_le)s") + if updated_at_ge is not None: + conditions.append("updated_at >= %(updated_at_ge)s") + + select_all = f""" + SELECT uuid, status, event_offset, destination_uuid, updated_at + FROM {self.build_table_name()} + """.strip() + + if not conditions: + return AiopgDatabaseOperation(f"{select_all} ORDER BY event_offset;") + + return AiopgDatabaseOperation( + f"{select_all} WHERE {' AND '.join(conditions)} ORDER BY event_offset;", + { + "uuid": uuid, + "uuid_ne": uuid_ne, + "uuid_in": uuid_in, + "destination_uuid": destination_uuid, + "status": status, + "status_in": status_in, + "event_offset": event_offset, + "event_offset_lt": event_offset_lt, + "event_offset_gt": event_offset_gt, + "event_offset_le": event_offset_le, + "event_offset_ge": event_offset_ge, + "updated_at": updated_at, + "updated_at_lt": updated_at_lt, + "updated_at_gt": updated_at_gt, + "updated_at_le": updated_at_le, + "updated_at_ge": updated_at_ge, + }, + ) + + +AiopgDatabaseClient.set_factory(TransactionDatabaseOperationFactory, AiopgTransactionDatabaseOperationFactory) diff --git a/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/common/__init__.py b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/common/__init__.py new file mode 100644 index 000000000..bd213d8b7 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/common/__init__.py @@ -0,0 +1,6 @@ +from .locks import ( + AiopgLockDatabaseOperationFactory, +) +from .managemens import ( + AiopgManagementDatabaseOperationFactory, +) diff --git a/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/common/locks.py b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/common/locks.py new file mode 100644 index 000000000..db23a3249 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/common/locks.py @@ -0,0 +1,34 @@ +from minos.common import ( + DatabaseOperation, + LockDatabaseOperationFactory, +) + +from ...clients import ( + AiopgDatabaseClient, +) +from ...operations import ( + AiopgDatabaseOperation, +) + + +class AiopgLockDatabaseOperationFactory(LockDatabaseOperationFactory): + """Aiopg Lock Database Operation Factory class.""" + + def build_acquire(self, hashed_key: int) -> DatabaseOperation: + """Build the database operation to acquire the lock. + + :param hashed_key: The hashed key that identifies the lock. + :return: A ``DatabaseOperation`` instance. + """ + return AiopgDatabaseOperation("select pg_advisory_lock(%(hashed_key)s)", {"hashed_key": hashed_key}) + + def build_release(self, hashed_key: int) -> DatabaseOperation: + """Build the database operation to release the lock. + + :param hashed_key: The hashed key that identifies the lock. + :return: A ``DatabaseOperation`` instance. + """ + return AiopgDatabaseOperation("select pg_advisory_unlock(%(hashed_key)s)", {"hashed_key": hashed_key}) + + +AiopgDatabaseClient.set_factory(LockDatabaseOperationFactory, AiopgLockDatabaseOperationFactory) diff --git a/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/common/managemens.py b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/common/managemens.py new file mode 100644 index 000000000..814dec80f --- /dev/null +++ b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/common/managemens.py @@ -0,0 +1,35 @@ +from minos.common import ( + DatabaseOperation, + ManagementDatabaseOperationFactory, +) + +from ...clients import ( + AiopgDatabaseClient, +) +from ...operations import ( + AiopgDatabaseOperation, +) + + +# noinspection SqlNoDataSourceInspection +class AiopgManagementDatabaseOperationFactory(ManagementDatabaseOperationFactory): + """Aiopg Manage Database Operation Factory class.""" + + def build_create(self, database: str) -> DatabaseOperation: + """Build the database operation to create a database. + + :param database: The new database's name. + :return: A ``DatabaseOperation``. + """ + return AiopgDatabaseOperation(f"CREATE DATABASE {database};") + + def build_delete(self, database: str) -> DatabaseOperation: + """Build the database operation to create a database. + + :param database: The name of the database to be deleted. + :return: A ``DatabaseOperation``. + """ + return AiopgDatabaseOperation(f"DROP DATABASE IF EXISTS {database};") + + +AiopgDatabaseClient.set_factory(ManagementDatabaseOperationFactory, AiopgManagementDatabaseOperationFactory) diff --git a/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/networks/__init__.py b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/networks/__init__.py new file mode 100644 index 000000000..04568ca64 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/networks/__init__.py @@ -0,0 +1,10 @@ +from .collections import ( + AiopgBrokerQueueDatabaseOperationFactory, +) +from .publishers import ( + AiopgBrokerPublisherQueueDatabaseOperationFactory, +) +from .subscribers import ( + AiopgBrokerSubscriberDuplicateValidatorDatabaseOperationFactory, + AiopgBrokerSubscriberQueueDatabaseOperationFactory, +) diff --git a/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/networks/collections/__init__.py b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/networks/collections/__init__.py new file mode 100644 index 000000000..7f6fc30e8 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/networks/collections/__init__.py @@ -0,0 +1,3 @@ +from .queues import ( + AiopgBrokerQueueDatabaseOperationFactory, +) diff --git a/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/networks/collections/queues.py b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/networks/collections/queues.py new file mode 100644 index 000000000..339453e68 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/networks/collections/queues.py @@ -0,0 +1,131 @@ +from abc import ( + ABC, + abstractmethod, +) +from collections.abc import ( + Iterable, +) + +from psycopg2.sql import ( + SQL, +) + +from minos.common import ( + DatabaseOperation, +) +from minos.networks import ( + BrokerQueueDatabaseOperationFactory, +) + +from ....clients import ( + AiopgDatabaseOperation, +) + + +# noinspection SqlResolve,SqlNoDataSourceInspection,SqlNoDataSourceInspection,SqlResolve +class AiopgBrokerQueueDatabaseOperationFactory(BrokerQueueDatabaseOperationFactory, ABC): + """Aiopg Broker Queue Database Operation Factory class.""" + + @abstractmethod + def build_table_name(self) -> str: + """Get the table name. + + :return: A ``str`` value. + """ + raise NotImplementedError + + def build_create(self) -> DatabaseOperation: + """Build the "create table" query. + + :return: A ``SQL`` instance. + """ + return AiopgDatabaseOperation( + SQL( + f"CREATE TABLE IF NOT EXISTS {self.build_table_name()} (" + "id BIGSERIAL NOT NULL PRIMARY KEY, " + "topic VARCHAR(255) NOT NULL, " + "data BYTEA NOT NULL, " + "retry INTEGER NOT NULL DEFAULT 0, " + "processing BOOL NOT NULL DEFAULT FALSE, " + "created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), " + "updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW())" + ), + lock=self.build_table_name(), + ) + + def build_mark_processed(self, id_: int) -> DatabaseOperation: + """Build the "update not processed" query. + + :return: A ``SQL`` instance. + """ + return AiopgDatabaseOperation( + SQL( + f"UPDATE {self.build_table_name()} " + "SET processing = FALSE, retry = retry + 1, updated_at = NOW() WHERE id = %(id)s" + ), + {"id": id_}, + ) + + def build_delete(self, id_: int) -> DatabaseOperation: + """Build the "delete processed" query. + + :return: A ``SQL`` instance. + """ + return AiopgDatabaseOperation( + SQL(f"DELETE FROM {self.build_table_name()} WHERE id = %(id)s"), + {"id": id_}, + ) + + def build_mark_processing(self, ids: Iterable[int]) -> DatabaseOperation: + """ + + :return: A ``SQL`` instance. + """ + return AiopgDatabaseOperation( + SQL(f"UPDATE {self.build_table_name()} SET processing = TRUE WHERE id IN %(ids)s"), + {"ids": tuple(ids)}, + ) + + def build_count(self, retry: int, *args, **kwargs) -> DatabaseOperation: + """Build the "count not processed" query. + + :return: + """ + return AiopgDatabaseOperation( + SQL( + f"SELECT COUNT(*) FROM (SELECT id FROM {self.build_table_name()} " + "WHERE NOT processing AND retry < %(retry)s FOR UPDATE SKIP LOCKED) s" + ), + {"retry": retry}, + ) + + def build_submit(self, topic: str, data: bytes) -> DatabaseOperation: + """Build the "insert" query. + + :return: A ``SQL`` instance. + """ + return AiopgDatabaseOperation( + SQL(f"INSERT INTO {self.build_table_name()} (topic, data) VALUES (%(topic)s, %(data)s) RETURNING id"), + {"topic": topic, "data": data}, + ) + + def build_query(self, retry: int, records: int, *args, **kwargs) -> DatabaseOperation: + """Build the "select not processed" query. + + :return: A ``SQL`` instance. + """ + return AiopgDatabaseOperation( + SQL( + "SELECT id, data " + f"FROM {self.build_table_name()} " + "WHERE NOT processing AND retry < %(retry)s " + "ORDER BY created_at " + "LIMIT %(records)s " + "FOR UPDATE " + "SKIP LOCKED" + ), + { + "retry": retry, + "records": records, + }, + ) diff --git a/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/networks/publishers/__init__.py b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/networks/publishers/__init__.py new file mode 100644 index 000000000..fd07a5ba7 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/networks/publishers/__init__.py @@ -0,0 +1,3 @@ +from .queues import ( + AiopgBrokerPublisherQueueDatabaseOperationFactory, +) diff --git a/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/networks/publishers/queues.py b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/networks/publishers/queues.py new file mode 100644 index 000000000..428ec65fb --- /dev/null +++ b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/networks/publishers/queues.py @@ -0,0 +1,28 @@ +from minos.networks import ( + BrokerPublisherQueueDatabaseOperationFactory, +) + +from ....clients import ( + AiopgDatabaseClient, +) +from ..collections import ( + AiopgBrokerQueueDatabaseOperationFactory, +) + + +class AiopgBrokerPublisherQueueDatabaseOperationFactory( + BrokerPublisherQueueDatabaseOperationFactory, AiopgBrokerQueueDatabaseOperationFactory +): + """Aiopg Broker Publisher Queue Query Factory class.""" + + def build_table_name(self) -> str: + """Get the table name. + + :return: A ``str`` value. + """ + return "broker_publisher_queue" + + +AiopgDatabaseClient.set_factory( + BrokerPublisherQueueDatabaseOperationFactory, AiopgBrokerPublisherQueueDatabaseOperationFactory +) diff --git a/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/networks/subscribers/__init__.py b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/networks/subscribers/__init__.py new file mode 100644 index 000000000..e4eedf459 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/networks/subscribers/__init__.py @@ -0,0 +1,6 @@ +from .queues import ( + AiopgBrokerSubscriberQueueDatabaseOperationFactory, +) +from .validators import ( + AiopgBrokerSubscriberDuplicateValidatorDatabaseOperationFactory, +) diff --git a/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/networks/subscribers/queues.py b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/networks/subscribers/queues.py new file mode 100644 index 000000000..878aa6e70 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/networks/subscribers/queues.py @@ -0,0 +1,76 @@ +from collections.abc import ( + Iterable, +) + +from psycopg2.sql import ( + SQL, +) + +from minos.common import ( + DatabaseOperation, +) +from minos.networks import ( + BrokerSubscriberQueueDatabaseOperationFactory, +) + +from ....clients import ( + AiopgDatabaseClient, +) +from ....operations import ( + AiopgDatabaseOperation, +) +from ..collections import ( + AiopgBrokerQueueDatabaseOperationFactory, +) + + +# noinspection SqlNoDataSourceInspection,SqlResolve,PyTypeChecker,PyArgumentList +class AiopgBrokerSubscriberQueueDatabaseOperationFactory( + BrokerSubscriberQueueDatabaseOperationFactory, AiopgBrokerQueueDatabaseOperationFactory +): + """Aiopg Broker Subscriber Queue Database Operation Factory class.""" + + def build_table_name(self) -> str: + """Get the table name. + + :return: A ``str`` value. + """ + return "broker_subscriber_queue" + + def build_count(self, retry: int, topics: Iterable[str] = tuple(), *args, **kwargs) -> DatabaseOperation: + """Build the "count not processed" query. + + :return: + """ + return AiopgDatabaseOperation( + SQL( + f"SELECT COUNT(*) FROM (SELECT id FROM {self.build_table_name()} " + "WHERE NOT processing AND retry < %(retry)s AND topic IN %(topics)s FOR UPDATE SKIP LOCKED) s" + ), + {"retry": retry, "topics": tuple(topics)}, + ) + + def build_query( + self, retry: int, records: int, topics: Iterable[str] = tuple(), *args, **kwargs + ) -> DatabaseOperation: + """Build the "select not processed" query. + + :return: A ``SQL`` instance. + """ + return AiopgDatabaseOperation( + SQL( + "SELECT id, data " + f"FROM {self.build_table_name()} " + "WHERE NOT processing AND retry < %(retry)s AND topic IN %(topics)s " + "ORDER BY created_at " + "LIMIT %(records)s " + "FOR UPDATE SKIP LOCKED" + ), + {"retry": retry, "topics": tuple(topics), "records": records}, + ) + + +AiopgDatabaseClient.set_factory( + BrokerSubscriberQueueDatabaseOperationFactory, + AiopgBrokerSubscriberQueueDatabaseOperationFactory, +) diff --git a/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/networks/subscribers/validators.py b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/networks/subscribers/validators.py new file mode 100644 index 000000000..350897eea --- /dev/null +++ b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/factories/networks/subscribers/validators.py @@ -0,0 +1,81 @@ +from uuid import ( + UUID, +) + +from psycopg2.sql import ( + SQL, +) + +from minos.common import ( + ComposedDatabaseOperation, + DatabaseOperation, +) +from minos.networks import ( + BrokerSubscriberDuplicateValidatorDatabaseOperationFactory, +) + +from ....clients import ( + AiopgDatabaseClient, +) +from ....operations import ( + AiopgDatabaseOperation, +) + + +# noinspection SqlNoDataSourceInspection,SqlResolve +class AiopgBrokerSubscriberDuplicateValidatorDatabaseOperationFactory( + BrokerSubscriberDuplicateValidatorDatabaseOperationFactory +): + """Aiopg Broker Subscriber Duplicate Detector Database Operation class.""" + + @staticmethod + def build_table_name() -> str: + """Build the table name. + + :return: A ``str`` instance. + """ + return "broker_subscriber_processed_messages" + + def build_create(self) -> DatabaseOperation: + """Build the "create table" query. + + :return: A ``SQL`` instance. + """ + return ComposedDatabaseOperation( + [ + AiopgDatabaseOperation( + SQL('CREATE EXTENSION IF NOT EXISTS "uuid-ossp";'), + lock="uuid-ossp", + ), + AiopgDatabaseOperation( + SQL( + f"CREATE TABLE IF NOT EXISTS {self.build_table_name()} (" + " topic VARCHAR(255) NOT NULL, " + " uuid UUID NOT NULL, " + " created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()," + " PRIMARY KEY (topic, uuid)" + ")" + ), + lock=self.build_table_name(), + ), + ] + ) + + def build_submit(self, topic: str, uuid: UUID) -> DatabaseOperation: + """Build the "insert row" query. + + :return: A ``SQL`` instance. + """ + return AiopgDatabaseOperation( + SQL(f"INSERT INTO {self.build_table_name()}(topic, uuid) VALUES(%(topic)s, %(uuid)s)"), + { + "topic": topic, + "uuid": uuid, + }, + ) + + +AiopgDatabaseClient.set_factory( + BrokerSubscriberDuplicateValidatorDatabaseOperationFactory, + AiopgBrokerSubscriberDuplicateValidatorDatabaseOperationFactory, +) diff --git a/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/operations.py b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/operations.py new file mode 100644 index 000000000..f404578f7 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/minos/plugins/aiopg/operations.py @@ -0,0 +1,23 @@ +from typing import ( + Any, + Union, +) + +from psycopg2.sql import ( + Composable, +) + +from minos.common import ( + DatabaseOperation, +) + + +class AiopgDatabaseOperation(DatabaseOperation): + """Aiopg Database Operation class.""" + + def __init__(self, query: Union[str, Composable], parameters: dict[str, Any] = None, *args, **kwargs): + super().__init__(*args, **kwargs) + if parameters is None: + parameters = dict() + self.query = query + self.parameters = parameters diff --git a/packages/plugins/minos-database-aiopg/poetry.lock b/packages/plugins/minos-database-aiopg/poetry.lock new file mode 100644 index 000000000..253463678 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/poetry.lock @@ -0,0 +1,832 @@ +[[package]] +name = "aiomisc" +version = "15.7.3" +description = "aiomisc - miscellaneous utils for asyncio" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +colorlog = "*" + +[package.extras] +aiohttp = ["aiohttp"] +asgi = ["aiohttp-asgi"] +carbon = ["aiocarbon (>=0.15,<1.0)"] +contextvars = ["contextvars (>=2.4,<3.0)"] +cron = ["croniter (>=0.3.34,<0.4.0)"] +develop = ["aiocontextvars (==0.2.2)", "aiohttp-asgi", "aiohttp (<4)", "async-timeout", "coveralls", "croniter (>=0.3.34,<0.4.0)", "fastapi", "freezegun (<1.1)", "mypy (>=0.782,<1.0)", "pylava", "pytest", "pytest-cov (>=3.0,<4.0)", "pytest-freezegun (>=0.4.2,<0.5.0)", "pytest-rst", "pytest-subtests", "rich", "setproctitle", "sphinx-autobuild", "sphinx-intl", "sphinx (>=3.5.1)", "timeout-decorator", "tox (>=2.4)", "types-croniter"] +raven = ["raven-aiohttp"] +uvloop = ["uvloop (>=0.14,<1)"] + +[[package]] +name = "aiopg" +version = "1.3.3" +description = "Postgres integration with asyncio." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +async-timeout = ">=3.0,<5.0" +psycopg2-binary = ">=2.8.4" + +[package.extras] +sa = ["sqlalchemy[postgresql_psycopg2binary] (>=1.3,<1.5)"] + +[[package]] +name = "async-timeout" +version = "4.0.2" +description = "Timeout context manager for asyncio programs" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "atomicwrites" +version = "1.4.0" +description = "Atomic file writes." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "attrs" +version = "21.4.0" +description = "Classes Without Boilerplate" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.extras] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] +docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] + +[[package]] +name = "black" +version = "22.3.0" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "cached-property" +version = "1.5.2" +description = "A decorator for caching properties in classes." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "click" +version = "8.1.3" +description = "Composable command line interface toolkit" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.4" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "colorlog" +version = "6.6.0" +description = "Add colours to the output of Python's logging module." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} + +[package.extras] +development = ["black", "flake8", "mypy", "pytest", "types-colorama"] + +[[package]] +name = "coverage" +version = "6.3.2" +description = "Code coverage measurement for Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "crontab" +version = "0.23.0" +description = "Parse and use crontab schedules in Python" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "dependency-injector" +version = "4.39.1" +description = "Dependency injection framework for Python" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = ">=1.7.0,<=1.16.0" + +[package.extras] +aiohttp = ["aiohttp"] +flask = ["flask"] +pydantic = ["pydantic"] +yaml = ["pyyaml"] + +[[package]] +name = "fastavro" +version = "1.4.11" +description = "Fast read/write of AVRO files" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +codecs = ["python-snappy", "zstandard", "lz4"] +lz4 = ["lz4"] +snappy = ["python-snappy"] +zstandard = ["zstandard"] + +[[package]] +name = "flake8" +version = "4.0.1" +description = "the modular source code checker: pep8 pyflakes and co" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +mccabe = ">=0.6.0,<0.7.0" +pycodestyle = ">=2.8.0,<2.9.0" +pyflakes = ">=2.4.0,<2.5.0" + +[[package]] +name = "iniconfig" +version = "1.1.1" +description = "iniconfig: brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "isort" +version = "5.10.1" +description = "A Python utility / library to sort Python imports." +category = "dev" +optional = false +python-versions = ">=3.6.1,<4.0" + +[package.extras] +pipfile_deprecated_finder = ["pipreqs", "requirementslib"] +requirements_deprecated_finder = ["pipreqs", "pip-api"] +colors = ["colorama (>=0.4.3,<0.5.0)"] +plugins = ["setuptools"] + +[[package]] +name = "mccabe" +version = "0.6.1" +description = "McCabe checker, plugin for flake8" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "minos-microservice-aggregate" +version = "0.7.0" +description = "The Aggregate pattern of the Minos Framework" +category = "main" +optional = false +python-versions = "^3.9" +develop = true + +[package.dependencies] +cached-property = "^1.5.2" +minos-microservice-common = "^0.7.0*" +minos-microservice-networks = "^0.7.0*" + +[package.source] +type = "directory" +url = "../../core/minos-microservice-aggregate" + +[[package]] +name = "minos-microservice-common" +version = "0.7.0" +description = "The common core of the Minos Framework" +category = "main" +optional = false +python-versions = "^3.9" +develop = true + +[package.dependencies] +aiomisc = ">=14.0.3,<15.8.0" +cached-property = "^1.5.2" +dependency-injector = "^4.32.2" +fastavro = "^1.4.0" +orjson = "^3.5.2" +PyYAML = ">=5.4.1,<7.0.0" +uvloop = "^0.16.0" + +[package.source] +type = "directory" +url = "../../core/minos-microservice-common" + +[[package]] +name = "minos-microservice-networks" +version = "0.7.0" +description = "The networks core of the Minos Framework" +category = "main" +optional = false +python-versions = "^3.9" +develop = true + +[package.dependencies] +crontab = "^0.23.0" +minos-microservice-common = "^0.7.0*" + +[package.source] +type = "directory" +url = "../../core/minos-microservice-networks" + +[[package]] +name = "mypy-extensions" +version = "0.4.3" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "orjson" +version = "3.6.8" +description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "packaging" +version = "21.3" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" + +[[package]] +name = "pathspec" +version = "0.9.0" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[[package]] +name = "platformdirs" +version = "2.5.2" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] +test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "psycopg2-binary" +version = "2.9.3" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pycodestyle" +version = "2.8.0" +description = "Python style guide checker" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pyflakes" +version = "2.4.0" +description = "passive checker of Python programs" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pyparsing" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +category = "dev" +optional = false +python-versions = ">=3.6.8" + +[package.extras] +diagrams = ["railroad-diagrams", "jinja2"] + +[[package]] +name = "pytest" +version = "7.1.2" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +py = ">=1.8.2" +tomli = ">=1.0.0" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "pyyaml" +version = "6.0" +description = "YAML parser and emitter for Python" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "typing-extensions" +version = "4.2.0" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "uvloop" +version = "0.16.0" +description = "Fast implementation of asyncio event loop on top of libuv" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +dev = ["Cython (>=0.29.24,<0.30.0)", "pytest (>=3.6.0)", "Sphinx (>=4.1.2,<4.2.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "psutil", "pycodestyle (>=2.7.0,<2.8.0)", "pyOpenSSL (>=19.0.0,<19.1.0)", "mypy (>=0.800)"] +docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)"] +test = ["aiohttp", "flake8 (>=3.9.2,<3.10.0)", "psutil", "pycodestyle (>=2.7.0,<2.8.0)", "pyOpenSSL (>=19.0.0,<19.1.0)", "mypy (>=0.800)"] + +[metadata] +lock-version = "1.1" +python-versions = "^3.9" +content-hash = "f78d54e68fdc33507bb37390aeea31e5baca08414e07441c8466567d919fbabb" + +[metadata.files] +aiomisc = [ + {file = "aiomisc-15.7.3-py3-none-any.whl", hash = "sha256:0403e83268e98d0f2a125a70d13303fe1a2358e36db3daf02df032c7fa4f1525"}, + {file = "aiomisc-15.7.3.tar.gz", hash = "sha256:ba250a34bd4609ced36111cb50580f57c3d52f3955f953a53ecb2986988baedc"}, +] +aiopg = [ + {file = "aiopg-1.3.3-py3-none-any.whl", hash = "sha256:2842dd8741460eeef940032dcb577bfba4d4115205dd82a73ce13b3271f5bf0a"}, + {file = "aiopg-1.3.3.tar.gz", hash = "sha256:547c6ba4ea0d73c2a11a2f44387d7133cc01d3c6f3b8ed976c0ac1eff4f595d7"}, +] +async-timeout = [ + {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, + {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, +] +atomicwrites = [ + {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, + {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, +] +attrs = [ + {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, + {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, +] +black = [ + {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"}, + {file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"}, + {file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"}, + {file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"}, + {file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"}, + {file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"}, + {file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"}, + {file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"}, + {file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"}, + {file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"}, + {file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"}, + {file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"}, + {file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"}, + {file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"}, + {file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"}, + {file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"}, + {file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"}, + {file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"}, +] +cached-property = [ + {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, + {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, +] +click = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] +colorama = [ + {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, +] +colorlog = [ + {file = "colorlog-6.6.0-py2.py3-none-any.whl", hash = "sha256:351c51e866c86c3217f08e4b067a7974a678be78f07f85fc2d55b8babde6d94e"}, + {file = "colorlog-6.6.0.tar.gz", hash = "sha256:344f73204009e4c83c5b6beb00b3c45dc70fcdae3c80db919e0a4171d006fde8"}, +] +coverage = [ + {file = "coverage-6.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9b27d894748475fa858f9597c0ee1d4829f44683f3813633aaf94b19cb5453cf"}, + {file = "coverage-6.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37d1141ad6b2466a7b53a22e08fe76994c2d35a5b6b469590424a9953155afac"}, + {file = "coverage-6.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9987b0354b06d4df0f4d3e0ec1ae76d7ce7cbca9a2f98c25041eb79eec766f1"}, + {file = "coverage-6.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:26e2deacd414fc2f97dd9f7676ee3eaecd299ca751412d89f40bc01557a6b1b4"}, + {file = "coverage-6.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dd8bafa458b5c7d061540f1ee9f18025a68e2d8471b3e858a9dad47c8d41903"}, + {file = "coverage-6.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:46191097ebc381fbf89bdce207a6c107ac4ec0890d8d20f3360345ff5976155c"}, + {file = "coverage-6.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6f89d05e028d274ce4fa1a86887b071ae1755082ef94a6740238cd7a8178804f"}, + {file = "coverage-6.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:58303469e9a272b4abdb9e302a780072c0633cdcc0165db7eec0f9e32f901e05"}, + {file = "coverage-6.3.2-cp310-cp310-win32.whl", hash = "sha256:2fea046bfb455510e05be95e879f0e768d45c10c11509e20e06d8fcaa31d9e39"}, + {file = "coverage-6.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:a2a8b8bcc399edb4347a5ca8b9b87e7524c0967b335fbb08a83c8421489ddee1"}, + {file = "coverage-6.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f1555ea6d6da108e1999b2463ea1003fe03f29213e459145e70edbaf3e004aaa"}, + {file = "coverage-6.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5f4e1edcf57ce94e5475fe09e5afa3e3145081318e5fd1a43a6b4539a97e518"}, + {file = "coverage-6.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a15dc0a14008f1da3d1ebd44bdda3e357dbabdf5a0b5034d38fcde0b5c234b7"}, + {file = "coverage-6.3.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21b7745788866028adeb1e0eca3bf1101109e2dc58456cb49d2d9b99a8c516e6"}, + {file = "coverage-6.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8ce257cac556cb03be4a248d92ed36904a59a4a5ff55a994e92214cde15c5bad"}, + {file = "coverage-6.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b0be84e5a6209858a1d3e8d1806c46214e867ce1b0fd32e4ea03f4bd8b2e3359"}, + {file = "coverage-6.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:acf53bc2cf7282ab9b8ba346746afe703474004d9e566ad164c91a7a59f188a4"}, + {file = "coverage-6.3.2-cp37-cp37m-win32.whl", hash = "sha256:8bdde1177f2311ee552f47ae6e5aa7750c0e3291ca6b75f71f7ffe1f1dab3dca"}, + {file = "coverage-6.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b31651d018b23ec463e95cf10070d0b2c548aa950a03d0b559eaa11c7e5a6fa3"}, + {file = "coverage-6.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:07e6db90cd9686c767dcc593dff16c8c09f9814f5e9c51034066cad3373b914d"}, + {file = "coverage-6.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2c6dbb42f3ad25760010c45191e9757e7dce981cbfb90e42feef301d71540059"}, + {file = "coverage-6.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c76aeef1b95aff3905fb2ae2d96e319caca5b76fa41d3470b19d4e4a3a313512"}, + {file = "coverage-6.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cf5cfcb1521dc3255d845d9dca3ff204b3229401994ef8d1984b32746bb45ca"}, + {file = "coverage-6.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fbbdc8d55990eac1b0919ca69eb5a988a802b854488c34b8f37f3e2025fa90d"}, + {file = "coverage-6.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ec6bc7fe73a938933d4178c9b23c4e0568e43e220aef9472c4f6044bfc6dd0f0"}, + {file = "coverage-6.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9baff2a45ae1f17c8078452e9e5962e518eab705e50a0aa8083733ea7d45f3a6"}, + {file = "coverage-6.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd9e830e9d8d89b20ab1e5af09b32d33e1a08ef4c4e14411e559556fd788e6b2"}, + {file = "coverage-6.3.2-cp38-cp38-win32.whl", hash = "sha256:f7331dbf301b7289013175087636bbaf5b2405e57259dd2c42fdcc9fcc47325e"}, + {file = "coverage-6.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:68353fe7cdf91f109fc7d474461b46e7f1f14e533e911a2a2cbb8b0fc8613cf1"}, + {file = "coverage-6.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b78e5afb39941572209f71866aa0b206c12f0109835aa0d601e41552f9b3e620"}, + {file = "coverage-6.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4e21876082ed887baed0146fe222f861b5815455ada3b33b890f4105d806128d"}, + {file = "coverage-6.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34626a7eee2a3da12af0507780bb51eb52dca0e1751fd1471d0810539cefb536"}, + {file = "coverage-6.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ebf730d2381158ecf3dfd4453fbca0613e16eaa547b4170e2450c9707665ce7"}, + {file = "coverage-6.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd6fe30bd519694b356cbfcaca9bd5c1737cddd20778c6a581ae20dc8c04def2"}, + {file = "coverage-6.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:96f8a1cb43ca1422f36492bebe63312d396491a9165ed3b9231e778d43a7fca4"}, + {file = "coverage-6.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:dd035edafefee4d573140a76fdc785dc38829fe5a455c4bb12bac8c20cfc3d69"}, + {file = "coverage-6.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5ca5aeb4344b30d0bec47481536b8ba1181d50dbe783b0e4ad03c95dc1296684"}, + {file = "coverage-6.3.2-cp39-cp39-win32.whl", hash = "sha256:f5fa5803f47e095d7ad8443d28b01d48c0359484fec1b9d8606d0e3282084bc4"}, + {file = "coverage-6.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:9548f10d8be799551eb3a9c74bbf2b4934ddb330e08a73320123c07f95cc2d92"}, + {file = "coverage-6.3.2-pp36.pp37.pp38-none-any.whl", hash = "sha256:18d520c6860515a771708937d2f78f63cc47ab3b80cb78e86573b0a760161faf"}, + {file = "coverage-6.3.2.tar.gz", hash = "sha256:03e2a7826086b91ef345ff18742ee9fc47a6839ccd517061ef8fa1976e652ce9"}, +] +crontab = [ + {file = "crontab-0.23.0.tar.gz", hash = "sha256:ca79dede9c2f572bb32f38703e8fddcf3427e86edc838f2ffe7ae4b9ee2b0733"}, +] +dependency-injector = [ + {file = "dependency-injector-4.39.1.tar.gz", hash = "sha256:9ab76dc5e19b2692aaca49e00f9b41a087138d139b0ec985f92ff0498f038772"}, + {file = "dependency_injector-4.39.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c788a3d5482e63b5fd55e14fc258f1ff0b51b411927ab132ef0f689cb5d1183f"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0832e0457a360725cd1d1037b77b85478aeeaacc60e85ecceeb8020409e7b62"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d51998fff9704fd01d11c3c48f4e88d8506cb6afa1ee41409a881a5a51dae3fc"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea484cd13fc62966bf5582df0816205feee072d18f228aac75f7807b43f223ae"}, + {file = "dependency_injector-4.39.1-cp310-cp310-win32.whl", hash = "sha256:17389e53ec29ca13570319cf2065dcc4c2f6d36db5dd792bb1e8f2c39a9f146b"}, + {file = "dependency_injector-4.39.1-cp310-cp310-win_amd64.whl", hash = "sha256:55b0988489267c5a580f419133770ffe293057f2064da1c9ad6a2cc69666739b"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b297c3e79d3633cc56366386ae1f7dbce1587673cca2f559c368c1e936a1fa94"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2728827c5abb2420c5811e218262ae1b77a48e76cc9eebc6b4f55fee48a1a18d"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:029e42b064ab8cb5b2559be040ff682c7aa81592f1654a82355475956df17803"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:305e3db3f4bf40f64caaa1303e03005174e78d2339d2ae517b34c011ec2300f9"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-win32.whl", hash = "sha256:a661dd23a5e4e2f6bf4a729de7fadbe148c9a4a298dbcadfc5a94584b6930970"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-win_amd64.whl", hash = "sha256:340d6e7af5c4729d20c837d6d1e8a2626c24a05259dff746406cc823e26ba1e7"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a1553dac1c95f0de1f910b0025ee4570ea078a07d576bcdc2168990e719cea50"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c7baaa64d93359ee08c15d68579cc803e11d9becaf961f5a66b94ff627248e1"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7a27bf1951a066cf347b886cc7ab0f37dcbd1ad59bffcfe721c8c12a189a150d"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da6e2d685f7d0c65257f08133b68d9bf74ec319b90a0f21b4f629d168ce5f68f"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-win32.whl", hash = "sha256:a8ddd03ca86e67e9d3cc038793d34fbfccab12e6145df813e72bf14f9371f2ea"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-win_amd64.whl", hash = "sha256:e01a319ea05cd86b520201386dcb53a81a5400cb82fcc2f006bd7e92c0c51a0a"}, + {file = "dependency_injector-4.39.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4704804bde25b694aa65201927937a9d82d8bc055cb3dadc68eb05988bd34fa9"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0935d50b263169e7b0826a2fb6be80d6a4f2a7c59e6dd9876f86da3243bea9eb"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3c34aa5abb1826b6189f47daf6e469d4293c1d01693233da2c1b923816270cc5"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:db64904c9b9a88756cfece3e3ed078a2b57127642711dd08af342dba8abf9667"}, + {file = "dependency_injector-4.39.1-cp38-cp38-win32.whl", hash = "sha256:66ebe728194adc8720dbc4d662edbbfa55659ff23c9c493fb2dae0bfd4df5734"}, + {file = "dependency_injector-4.39.1-cp38-cp38-win_amd64.whl", hash = "sha256:4349974620f630d6726808e1291ec99713b64d449b84eb01581ee807a5a5c224"}, + {file = "dependency_injector-4.39.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d87cad0899b05cd08931bfb68ddf7be77711a67b0649c37f2045d7808977b082"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8efd965e5cfdd9f339ec895e73c119569851adedc175088d34a670f5206fea63"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:27f69485ca6b85c31d162ee86cf6ef71bb71dce9cd2b5d0745425dfc551eefa1"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a25b63de59dff04ec78f5161f00c0222a04a23def5d1f0eda14e389a32baf428"}, + {file = "dependency_injector-4.39.1-cp39-cp39-win32.whl", hash = "sha256:a14274f50d125b4579314c355e22af07def1a96641ca94bd75edcf1400b89477"}, + {file = "dependency_injector-4.39.1-cp39-cp39-win_amd64.whl", hash = "sha256:9950039d00625f9252cd26378a4406342b256886bb61e4db8b65e9f01270f53e"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6d7f39cd54678741e132e13da3a1367ac18058cbda61fe39d61c8583aa6fd757"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2368c7ba3c9ffaf816ea0f2d14c78d481491b805f62ac8496a78a51397d4689"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:84e32407bb16c58aa0d4b5ed8485537bc66ccc14cfffae7022f1204e35ec939a"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f2d80a42c546e1f934d427b071630d86653cd4a60c74b570c4ffb03025c1f1f9"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ca126bbed370b8c002c859ebeb76f6d83eba2d7fb5d66f37f47cfc19661d2889"}, +] +fastavro = [ + {file = "fastavro-1.4.11-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:44f01008f95d685edacc4b10366c755d25612df00924349f7d34a29f08522ce3"}, + {file = "fastavro-1.4.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18f5e736d12e67348f253da8a332d7c3b483ca04f2b6e772befa79d1a46bac9d"}, + {file = "fastavro-1.4.11-cp310-cp310-win_amd64.whl", hash = "sha256:8dca11bc3191cd7de0a3c4b76a70dac493356a219e96ebcde0def1f06faddef7"}, + {file = "fastavro-1.4.11-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:7a2a0bf03686f9d860e8f8476be000f5b3e6cc9af6853dbabab2ef9cfa5dc3a0"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c17e3decfac260e1be4d02d1903d2483eec2f3ce7f92c9b808a0f6a81572c4b"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19ba25c6529f50722a7618cc4ca24c7d265def57fd9f94e4e554e1df8cce38d2"}, + {file = "fastavro-1.4.11-cp37-cp37m-win_amd64.whl", hash = "sha256:ceaba04da9419f40899a670eb62eb373a127b511bb8e3ae4f6f1f23ec49bd0e4"}, + {file = "fastavro-1.4.11-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:732eab3a1ae5d2c3f4b52e747c55bcc41c4df0eb7e8a395038080741a3c0a934"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c03d3c802b71f44e7b3442abae961bba996258244bd222b242ad1e5cb7754e57"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cb7475a9b25b9f8aebe7eb756dafedd0369434571062f3883d894281befd7c"}, + {file = "fastavro-1.4.11-cp38-cp38-win_amd64.whl", hash = "sha256:ce0776f54591aef90bcd02bd919964abe4c2ad2a10a4336c3a1b66cef289b41c"}, + {file = "fastavro-1.4.11-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:621e72cc365c9539d7590e7b43e48a62e6bfb4c2de7c16837fed54d113d7312c"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:842b25782f911ee8c626f9d9fedc2ef01aeac272536fe90ee6d45b2ae7cdb024"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8491bfcba25c9d661289f884688e5a4f56f2ee389a240d0ad02692495a9a087"}, + {file = "fastavro-1.4.11-cp39-cp39-win_amd64.whl", hash = "sha256:c94130a8c8d80073eb0276844915aa5e928ae322024e76dc57943542ccda211c"}, + {file = "fastavro-1.4.11.tar.gz", hash = "sha256:7c64332ad52de0134be9a933ca986514c3ff85c63d54bc5398c31f0498ac1820"}, +] +flake8 = [ + {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, + {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, +] +iniconfig = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] +isort = [ + {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, + {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, +] +mccabe = [ + {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, + {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, +] +minos-microservice-aggregate = [] +minos-microservice-common = [] +minos-microservice-networks = [] +mypy-extensions = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] +orjson = [ + {file = "orjson-3.6.8-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:3a287a650458de2211db03681b71c3e5cb2212b62f17a39df8ad99fc54855d0f"}, + {file = "orjson-3.6.8-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:5204e25c12cea58e524fc82f7c27ed0586f592f777b33075a92ab7b3eb3687c2"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77e8386393add64f959c044e0fb682364fd0e611a6f477aa13f0e6a733bd6a28"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:279f2d2af393fdf8601020744cb206b91b54ad60fb8401e0761819c7bda1f4e4"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:c31c9f389be7906f978ed4192eb58a4b74a37ad60556a0b88ddc47c576697770"}, + {file = "orjson-3.6.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0db5c5a0c5b89f092d52f6e5a3701660a9d6ffa9e2968b3ce17c2bc4f5eb0414"}, + {file = "orjson-3.6.8-cp310-none-win_amd64.whl", hash = "sha256:eb22485847b9a0c4bbedc668df860126ac931edbed1d456cf41a59f3cb961ed8"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:1a5fe569310bc819279bd4d5f2c349910b104ed3207936246dd5d5e0b085e74a"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:ccb356a47ab1067cd3549847e9db1d279a63fe0482d315b3ffd6e7abef35ef77"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab29c069c222248ce302a25855b4e1664f9436e8ae5a131fb0859daf31676d2b"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2b5e4cba9e774ac011071d9d27760f97f4b8cd46003e971d122e712f971345"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:c311ec504414d22834d5b972a209619925b48263856a11a14d90230f9682d49c"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:a3dfec7950b90fb8d143743503ee53fa06b32e6068bdea792fc866284da3d71d"}, + {file = "orjson-3.6.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b890dbbada2cbb26eb29bd43a848426f007f094bb0758df10dfe7a438e1cb4b4"}, + {file = "orjson-3.6.8-cp37-none-win_amd64.whl", hash = "sha256:9143ae2c52771525be9ad11a7a8cc8e7fd75391b107e7e644a9e0050496f6b4f"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:33a82199fd42f6436f833e210ae5129c922a5c355629356ca7a8e82964da7285"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:90159ea8b9a5a2a98fa33dc7b421cfac4d2ae91ba5e1058f5909e7f059f6b467"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:656fbe15d9ef0733e740d9def78f4fdb4153102f4836ee774a05123499005931"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7be3be6153843e0f01351b1313a5ad4723595427680dac2dfff22a37e652ce02"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:dd24f66b6697ee7424f7da575ec6cbffc8ede441114d53470949cda4d97c6e56"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:b07c780f7345ecf5901356dc21dee0669defc489c38ce7b9ab0f5e008cc0385c"}, + {file = "orjson-3.6.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ea32015a5d8a4ce00d348a0de5dc7040e0ad58f970a8fcbb5713a1eac129e493"}, + {file = "orjson-3.6.8-cp38-none-win_amd64.whl", hash = "sha256:c5a3e382194c838988ec128a26b08aa92044e5e055491cc4056142af0c1c54d7"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:83a8424e857ae1bf53530e88b4eb2f16ca2b489073b924e655f1575cacd7f52a"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:81e1a6a2d67f15007dadacbf9ba5d3d79237e5e33786c028557fe5a2b72f1c9a"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:137b539881c77866eba86ff6a11df910daf2eb9ab8f1acae62f879e83d7c38af"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cbd358f3b3ad539a27e36900e8e7d172d0e1b72ad9dd7d69544dcbc0f067ee7"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:6ab94701542d40b90903ecfc339333f458884979a01cb9268bc662cc67a5f6d8"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:32b6f26593a9eb606b40775826beb0dac152e3d224ea393688fced036045a821"}, + {file = "orjson-3.6.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:afd9e329ebd3418cac3cd747769b1d52daa25fa672bbf414ab59f0e0881b32b9"}, + {file = "orjson-3.6.8-cp39-none-win_amd64.whl", hash = "sha256:0c89b419914d3d1f65a1b0883f377abe42a6e44f6624ba1c63e8846cbfc2fa60"}, + {file = "orjson-3.6.8.tar.gz", hash = "sha256:e19d23741c5de13689bb316abfccea15a19c264e3ec8eb332a5319a583595ace"}, +] +packaging = [ + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, +] +pathspec = [ + {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, + {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, +] +platformdirs = [ + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, +] +pluggy = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] +psycopg2-binary = [ + {file = "psycopg2-binary-2.9.3.tar.gz", hash = "sha256:761df5313dc15da1502b21453642d7599d26be88bff659382f8f9747c7ebea4e"}, + {file = "psycopg2_binary-2.9.3-cp310-cp310-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:539b28661b71da7c0e428692438efbcd048ca21ea81af618d845e06ebfd29478"}, + {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e82d38390a03da28c7985b394ec3f56873174e2c88130e6966cb1c946508e65"}, + {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57804fc02ca3ce0dbfbef35c4b3a4a774da66d66ea20f4bda601294ad2ea6092"}, + {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:083a55275f09a62b8ca4902dd11f4b33075b743cf0d360419e2051a8a5d5ff76"}, + {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_24_ppc64le.whl", hash = "sha256:0a29729145aaaf1ad8bafe663131890e2111f13416b60e460dae0a96af5905c9"}, + {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a79d622f5206d695d7824cbf609a4f5b88ea6d6dab5f7c147fc6d333a8787e4"}, + {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:090f3348c0ab2cceb6dfbe6bf721ef61262ddf518cd6cc6ecc7d334996d64efa"}, + {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a9e1f75f96ea388fbcef36c70640c4efbe4650658f3d6a2967b4cc70e907352e"}, + {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c3ae8e75eb7160851e59adc77b3a19a976e50622e44fd4fd47b8b18208189d42"}, + {file = "psycopg2_binary-2.9.3-cp310-cp310-win32.whl", hash = "sha256:7b1e9b80afca7b7a386ef087db614faebbf8839b7f4db5eb107d0f1a53225029"}, + {file = "psycopg2_binary-2.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:8b344adbb9a862de0c635f4f0425b7958bf5a4b927c8594e6e8d261775796d53"}, + {file = "psycopg2_binary-2.9.3-cp36-cp36m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:e847774f8ffd5b398a75bc1c18fbb56564cda3d629fe68fd81971fece2d3c67e"}, + {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68641a34023d306be959101b345732360fc2ea4938982309b786f7be1b43a4a1"}, + {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3303f8807f342641851578ee7ed1f3efc9802d00a6f83c101d21c608cb864460"}, + {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_24_aarch64.whl", hash = "sha256:e3699852e22aa68c10de06524a3721ade969abf382da95884e6a10ff798f9281"}, + {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_24_ppc64le.whl", hash = "sha256:526ea0378246d9b080148f2d6681229f4b5964543c170dd10bf4faaab6e0d27f"}, + {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:b1c8068513f5b158cf7e29c43a77eb34b407db29aca749d3eb9293ee0d3103ca"}, + {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:15803fa813ea05bef089fa78835118b5434204f3a17cb9f1e5dbfd0b9deea5af"}, + {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:152f09f57417b831418304c7f30d727dc83a12761627bb826951692cc6491e57"}, + {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:404224e5fef3b193f892abdbf8961ce20e0b6642886cfe1fe1923f41aaa75c9d"}, + {file = "psycopg2_binary-2.9.3-cp36-cp36m-win32.whl", hash = "sha256:1f6b813106a3abdf7b03640d36e24669234120c72e91d5cbaeb87c5f7c36c65b"}, + {file = "psycopg2_binary-2.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:2d872e3c9d5d075a2e104540965a1cf898b52274a5923936e5bfddb58c59c7c2"}, + {file = "psycopg2_binary-2.9.3-cp37-cp37m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:10bb90fb4d523a2aa67773d4ff2b833ec00857f5912bafcfd5f5414e45280fb1"}, + {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a52ecab70af13e899f7847b3e074eeb16ebac5615665db33bce8a1009cf33"}, + {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a29b3ca4ec9defec6d42bf5feb36bb5817ba3c0230dd83b4edf4bf02684cd0ae"}, + {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:12b11322ea00ad8db8c46f18b7dfc47ae215e4df55b46c67a94b4effbaec7094"}, + {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_24_ppc64le.whl", hash = "sha256:53293533fcbb94c202b7c800a12c873cfe24599656b341f56e71dd2b557be063"}, + {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c381bda330ddf2fccbafab789d83ebc6c53db126e4383e73794c74eedce855ef"}, + {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9d29409b625a143649d03d0fd7b57e4b92e0ecad9726ba682244b73be91d2fdb"}, + {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:183a517a3a63503f70f808b58bfbf962f23d73b6dccddae5aa56152ef2bcb232"}, + {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:15c4e4cfa45f5a60599d9cec5f46cd7b1b29d86a6390ec23e8eebaae84e64554"}, + {file = "psycopg2_binary-2.9.3-cp37-cp37m-win32.whl", hash = "sha256:adf20d9a67e0b6393eac162eb81fb10bc9130a80540f4df7e7355c2dd4af9fba"}, + {file = "psycopg2_binary-2.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2f9ffd643bc7349eeb664eba8864d9e01f057880f510e4681ba40a6532f93c71"}, + {file = "psycopg2_binary-2.9.3-cp38-cp38-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:def68d7c21984b0f8218e8a15d514f714d96904265164f75f8d3a70f9c295667"}, + {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dffc08ca91c9ac09008870c9eb77b00a46b3378719584059c034b8945e26b272"}, + {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:280b0bb5cbfe8039205c7981cceb006156a675362a00fe29b16fbc264e242834"}, + {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:af9813db73395fb1fc211bac696faea4ca9ef53f32dc0cfa27e4e7cf766dcf24"}, + {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_24_ppc64le.whl", hash = "sha256:63638d875be8c2784cfc952c9ac34e2b50e43f9f0a0660b65e2a87d656b3116c"}, + {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ffb7a888a047696e7f8240d649b43fb3644f14f0ee229077e7f6b9f9081635bd"}, + {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0c9d5450c566c80c396b7402895c4369a410cab5a82707b11aee1e624da7d004"}, + {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:d1c1b569ecafe3a69380a94e6ae09a4789bbb23666f3d3a08d06bbd2451f5ef1"}, + {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8fc53f9af09426a61db9ba357865c77f26076d48669f2e1bb24d85a22fb52307"}, + {file = "psycopg2_binary-2.9.3-cp38-cp38-win32.whl", hash = "sha256:6472a178e291b59e7f16ab49ec8b4f3bdada0a879c68d3817ff0963e722a82ce"}, + {file = "psycopg2_binary-2.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:35168209c9d51b145e459e05c31a9eaeffa9a6b0fd61689b48e07464ffd1a83e"}, + {file = "psycopg2_binary-2.9.3-cp39-cp39-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:47133f3f872faf28c1e87d4357220e809dfd3fa7c64295a4a148bcd1e6e34ec9"}, + {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91920527dea30175cc02a1099f331aa8c1ba39bf8b7762b7b56cbf54bc5cce42"}, + {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:887dd9aac71765ac0d0bac1d0d4b4f2c99d5f5c1382d8b770404f0f3d0ce8a39"}, + {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:1f14c8b0942714eb3c74e1e71700cbbcb415acbc311c730370e70c578a44a25c"}, + {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_24_ppc64le.whl", hash = "sha256:7af0dd86ddb2f8af5da57a976d27cd2cd15510518d582b478fbb2292428710b4"}, + {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:93cd1967a18aa0edd4b95b1dfd554cf15af657cb606280996d393dadc88c3c35"}, + {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bda845b664bb6c91446ca9609fc69f7db6c334ec5e4adc87571c34e4f47b7ddb"}, + {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:01310cf4cf26db9aea5158c217caa92d291f0500051a6469ac52166e1a16f5b7"}, + {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:99485cab9ba0fa9b84f1f9e1fef106f44a46ef6afdeec8885e0b88d0772b49e8"}, + {file = "psycopg2_binary-2.9.3-cp39-cp39-win32.whl", hash = "sha256:46f0e0a6b5fa5851bbd9ab1bc805eef362d3a230fbdfbc209f4a236d0a7a990d"}, + {file = "psycopg2_binary-2.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:accfe7e982411da3178ec690baaceaad3c278652998b2c45828aaac66cd8285f"}, +] +py = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] +pycodestyle = [ + {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"}, + {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"}, +] +pyflakes = [ + {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, + {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, +] +pyparsing = [ + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, +] +pytest = [ + {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, + {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"}, +] +pyyaml = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] +six = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] +tomli = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] +typing-extensions = [ + {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, + {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, +] +uvloop = [ + {file = "uvloop-0.16.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6224f1401025b748ffecb7a6e2652b17768f30b1a6a3f7b44660e5b5b690b12d"}, + {file = "uvloop-0.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:30ba9dcbd0965f5c812b7c2112a1ddf60cf904c1c160f398e7eed3a6b82dcd9c"}, + {file = "uvloop-0.16.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bd53f7f5db562f37cd64a3af5012df8cac2c464c97e732ed556800129505bd64"}, + {file = "uvloop-0.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:772206116b9b57cd625c8a88f2413df2fcfd0b496eb188b82a43bed7af2c2ec9"}, + {file = "uvloop-0.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b572256409f194521a9895aef274cea88731d14732343da3ecdb175228881638"}, + {file = "uvloop-0.16.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:04ff57aa137230d8cc968f03481176041ae789308b4d5079118331ab01112450"}, + {file = "uvloop-0.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a19828c4f15687675ea912cc28bbcb48e9bb907c801873bd1519b96b04fb805"}, + {file = "uvloop-0.16.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e814ac2c6f9daf4c36eb8e85266859f42174a4ff0d71b99405ed559257750382"}, + {file = "uvloop-0.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bd8f42ea1ea8f4e84d265769089964ddda95eb2bb38b5cbe26712b0616c3edee"}, + {file = "uvloop-0.16.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:647e481940379eebd314c00440314c81ea547aa636056f554d491e40503c8464"}, + {file = "uvloop-0.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e0d26fa5875d43ddbb0d9d79a447d2ace4180d9e3239788208527c4784f7cab"}, + {file = "uvloop-0.16.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6ccd57ae8db17d677e9e06192e9c9ec4bd2066b77790f9aa7dede2cc4008ee8f"}, + {file = "uvloop-0.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:089b4834fd299d82d83a25e3335372f12117a7d38525217c2258e9b9f4578897"}, + {file = "uvloop-0.16.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98d117332cc9e5ea8dfdc2b28b0a23f60370d02e1395f88f40d1effd2cb86c4f"}, + {file = "uvloop-0.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e5f2e2ff51aefe6c19ee98af12b4ae61f5be456cd24396953244a30880ad861"}, + {file = "uvloop-0.16.0.tar.gz", hash = "sha256:f74bc20c7b67d1c27c72601c78cf95be99d5c2cdd4514502b4f3eb0933ff1228"}, +] diff --git a/packages/plugins/minos-database-aiopg/poetry.toml b/packages/plugins/minos-database-aiopg/poetry.toml new file mode 100644 index 000000000..ab1033bd3 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/poetry.toml @@ -0,0 +1,2 @@ +[virtualenvs] +in-project = true diff --git a/packages/plugins/minos-database-aiopg/pyproject.toml b/packages/plugins/minos-database-aiopg/pyproject.toml new file mode 100644 index 000000000..6b370da46 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/pyproject.toml @@ -0,0 +1,52 @@ +[tool.poetry] +name = "minos-database-aiopg" +version = "0.7.0" +description = "The aiopg plugin of the Minos Framework" +readme = "README.md" +repository = "https://github.com/minos-framework/minos-python" +homepage = "https://www.minos.run/" +authors = ["Minos Framework Devs "] +license = "MIT" +classifiers = [ + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "Natural Language :: English", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.9", +] +keywords = [ + "clariteia", + "minos", + "microservice", + "saga", +] +packages = [ + { include = "minos" }, +] +include = [ + { path = "AUTHORS.md", format = "sdist" }, + { path = "HISTORY.md", format = "sdist" }, + { path = "LICENSE", format = "sdist" }, +] + +[tool.poetry.dependencies] +python = "^3.9" +minos-microservice-common = "^0.7.0" +minos-microservice-networks = "^0.7.0" +minos-microservice-aggregate = "^0.7.0" +aiopg = "^1.2.1" +psycopg2-binary = "^2.9.3" + +[tool.poetry.dev-dependencies] +minos-microservice-common = { path = "../../core/minos-microservice-common", develop = true } +minos-microservice-networks = { path = "../../core/minos-microservice-networks", develop = true } +minos-microservice-aggregate = { path = "../../core/minos-microservice-aggregate", develop = true } +black = "^22.3" +isort = "^5.8.0" +pytest = "^7.0.1" +coverage = "^6.3" +flake8 = "^4.0.1" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/packages/plugins/minos-database-aiopg/setup.cfg b/packages/plugins/minos-database-aiopg/setup.cfg new file mode 100644 index 000000000..dbb9ac849 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/setup.cfg @@ -0,0 +1,28 @@ +[coverage:run] +source = + minos + +[coverage:report] +exclude_lines = + pragma: no cover + raise NotImplementedError + if TYPE_CHECKING: + pass +precision = 2 + +[flake8] +filename = + ./minos/**/*.py, + ./tests/**/*.py, + ./examples/**/*.py +max-line-length = 120 +per-file-ignores = + ./**/__init__.py:F401,W391 + +[isort] +known_first_party=minos +multi_line_output = 3 +include_trailing_comma = True +force_grid_wrap = 1 +use_parentheses = True +line_length = 120 diff --git a/packages/plugins/minos-database-aiopg/tests/__init__.py b/packages/plugins/minos-database-aiopg/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/plugins/minos-database-aiopg/tests/test_aiopg/__init__.py b/packages/plugins/minos-database-aiopg/tests/test_aiopg/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_clients.py b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_clients.py new file mode 100644 index 000000000..8c1d935cc --- /dev/null +++ b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_clients.py @@ -0,0 +1,206 @@ +import unittest +from unittest.mock import ( + PropertyMock, + call, + patch, +) + +import aiopg +from aiopg import ( + Connection, + Cursor, +) +from psycopg2 import ( + IntegrityError, + OperationalError, + ProgrammingError, +) + +from minos.common import ( + ConnectionException, + DatabaseOperation, + IntegrityException, + ProgrammingException, +) +from minos.plugins.aiopg import ( + AiopgDatabaseClient, + AiopgDatabaseOperation, +) +from tests.utils import ( + AiopgTestCase, +) + + +# noinspection SqlNoDataSourceInspection,SqlDialectInspection +class TestAiopgDatabaseClient(AiopgTestCase): + def setUp(self): + super().setUp() + self.operation = AiopgDatabaseOperation("SELECT * FROM information_schema.tables") + + def test_constructor(self): + client = AiopgDatabaseClient("foo") + self.assertEqual("foo", client.database) + self.assertEqual("postgres", client.user) + self.assertEqual("", client.password) + self.assertEqual("localhost", client.host) + self.assertEqual(5432, client.port) + + def test_from_config(self): + default_database = self.config.get_default_database() + client = AiopgDatabaseClient.from_config(self.config) + self.assertEqual(default_database["database"], client.database) + self.assertEqual(default_database["user"], client.user) + self.assertEqual(default_database["password"], client.password) + self.assertEqual(default_database["host"], client.host) + self.assertEqual(default_database["port"], client.port) + + async def test_is_valid(self): + async with AiopgDatabaseClient.from_config(self.config) as client: + self.assertTrue(await client.is_valid()) + + async def test_is_connected_true(self): + async with AiopgDatabaseClient.from_config(self.config) as client: + self.assertTrue(await client.is_connected()) + + async def test_is_connected_false_not_setup(self): + client = AiopgDatabaseClient.from_config(self.config) + self.assertFalse(await client.is_connected()) + + async def test_is_connected_false_operational_error(self): + async with AiopgDatabaseClient.from_config(self.config) as client: + with patch.object(Connection, "isolation_level", new_callable=PropertyMock, side_effect=OperationalError): + self.assertFalse(await client.is_connected()) + + async def test_is_connected_false_closed(self): + async with AiopgDatabaseClient.from_config(self.config) as client: + with patch.object(Connection, "closed", new_callable=PropertyMock, return_valud=False): + self.assertFalse(await client.is_connected()) + + async def test_connection(self): + client = AiopgDatabaseClient.from_config(self.config) + self.assertIsNone(client.connection) + async with client: + self.assertIsInstance(client.connection, Connection) + self.assertIsNone(client.connection) + + async def test_connection_with_circuit_breaker(self): + async with AiopgDatabaseClient.from_config(self.config) as c1: + + async def _fn(): + return c1.connection + + with patch.object(aiopg, "connect", new_callable=PropertyMock, side_effect=(OperationalError, _fn())): + async with AiopgDatabaseClient.from_config(self.config) as c2: + self.assertEqual(c1.connection, c2.connection) + + async def test_connection_recreate(self): + async with AiopgDatabaseClient.from_config(self.config) as client: + c1 = client.connection + self.assertIsInstance(c1, Connection) + + await client.recreate() + + c2 = client.connection + self.assertIsInstance(c2, Connection) + + self.assertNotEqual(c1, c2) + + async def test_cursor(self): + client = AiopgDatabaseClient.from_config(self.config) + self.assertIsNone(client.cursor) + async with client: + self.assertIsNone(client.cursor) + await client.execute(self.operation) + self.assertIsInstance(client.cursor, Cursor) + + self.assertIsNone(client.cursor) + + async def test_cursor_reset(self): + client = AiopgDatabaseClient.from_config(self.config) + async with client: + await client.execute(self.operation) + self.assertIsInstance(client.cursor, Cursor) + await client.reset() + self.assertIsNone(client.cursor) + + async def test_execute(self): + async with AiopgDatabaseClient.from_config(self.config) as client: + with patch.object(Cursor, "execute") as execute_mock: + await client.execute(self.operation) + self.assertEqual( + [call(operation=self.operation.query, parameters=self.operation.parameters)], + execute_mock.call_args_list, + ) + + async def test_execute_disconnected(self): + async with AiopgDatabaseClient.from_config(self.config) as client: + await client.close() + self.assertFalse(await client.is_connected()) + + await client.execute(self.operation) + self.assertTrue(await client.is_connected()) + + async def test_execute_raises_unsupported(self): + class _DatabaseOperation(DatabaseOperation): + """For testing purposes.""" + + async with AiopgDatabaseClient.from_config(self.config) as client: + with self.assertRaises(ValueError): + await client.execute(_DatabaseOperation()) + + async def test_execute_raises_integrity(self): + async with AiopgDatabaseClient.from_config(self.config) as client: + with patch.object(Cursor, "execute", side_effect=IntegrityError): + with self.assertRaises(IntegrityException): + await client.execute(self.operation) + + async def test_execute_raises_operational(self): + async with AiopgDatabaseClient.from_config(self.config) as client: + with patch.object(Cursor, "execute", side_effect=(OperationalError, None)) as mock: + await client.execute(self.operation) + + self.assertEqual( + [ + call(operation=self.operation.query, parameters=self.operation.parameters), + call(operation=self.operation.query, parameters=self.operation.parameters), + ], + mock.call_args_list, + ) + + async def test_fetch_one(self): + async with AiopgDatabaseClient.from_config(self.config) as client: + await client.execute(self.operation) + observed = await client.fetch_one() + self.assertIsInstance(observed, tuple) + + async def test_fetch_one_raises_programming_empty(self): + async with AiopgDatabaseClient.from_config(self.config) as client: + with self.assertRaises(ProgrammingException): + await client.fetch_one() + + async def test_fetch_one_raises_programming(self): + async with AiopgDatabaseClient.from_config(self.config) as client: + await client.execute(self.operation) + with patch.object(Cursor, "fetchone", side_effect=ProgrammingError): + with self.assertRaises(ProgrammingException): + await client.fetch_one() + + async def test_fetch_one_raises_operational(self): + async with AiopgDatabaseClient.from_config(self.config) as client: + await client.execute(self.operation) + with patch.object(Cursor, "fetchone", side_effect=OperationalError): + with self.assertRaises(ConnectionException): + await client.fetch_one() + + async def test_fetch_all(self): + async with AiopgDatabaseClient.from_config(self.config) as client: + await client.execute(self.operation) + observed = [value async for value in client.fetch_all()] + + self.assertGreater(len(observed), 0) + for obs in observed: + self.assertIsInstance(obs, tuple) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/__init__.py b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/__init__.py b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/test_events/__init__.py b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/test_events/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/test_events/test_factory.py b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/test_events/test_factory.py new file mode 100644 index 000000000..9c33d3906 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/test_events/test_factory.py @@ -0,0 +1,76 @@ +import unittest +from uuid import ( + uuid4, +) + +from minos.aggregate import ( + Action, + EventDatabaseOperationFactory, +) +from minos.common import ( + ComposedDatabaseOperation, + current_datetime, +) +from minos.plugins.aiopg import ( + AiopgDatabaseOperation, + AiopgEventDatabaseOperationFactory, +) + + +class TestAiopgEventDatabaseOperationFactory(unittest.TestCase): + def setUp(self) -> None: + self.factory = AiopgEventDatabaseOperationFactory() + + def test_is_subclass(self): + self.assertTrue(issubclass(AiopgEventDatabaseOperationFactory, EventDatabaseOperationFactory)) + + def test_build_table_name(self): + self.assertEqual("aggregate_event", self.factory.build_table_name()) + + def test_build_create(self): + operation = self.factory.build_create() + self.assertIsInstance(operation, ComposedDatabaseOperation) + self.assertEqual(3, len(operation.operations)) + for sub in operation.operations: + self.assertIsInstance(sub, AiopgDatabaseOperation) + + def test_build_submit(self): + operation = self.factory.build_submit( + transaction_uuids=[uuid4(), uuid4()], + uuid=uuid4(), + action=Action.CREATE, + name="Foo", + version=3, + data=bytes(), + created_at=current_datetime(), + transaction_uuid=uuid4(), + lock="foo", + ) + self.assertIsInstance(operation, AiopgDatabaseOperation) + + def test_build_query(self): + operation = self.factory.build_query( + uuid=uuid4(), + name="Foo", + version=423453, + version_lt=234, + version_gt=342, + version_le=5433, + version_ge=897, + id=234, + id_lt=34, + id_gt=543, + id_ge=123, + transaction_uuid=uuid4(), + transaction_uuid_ne=uuid4(), + transaction_uuid_in=[uuid4(), uuid4(), uuid4()], + ) + self.assertIsInstance(operation, AiopgDatabaseOperation) + + def test_build_query_offset(self): + operation = self.factory.build_query_offset() + self.assertIsInstance(operation, AiopgDatabaseOperation) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/test_events/test_repositories.py b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/test_events/test_repositories.py new file mode 100644 index 000000000..bf57368d0 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/test_events/test_repositories.py @@ -0,0 +1,51 @@ +import unittest + +from minos.aggregate import ( + DatabaseEventRepository, + EventRepository, +) +from minos.aggregate.testing import ( + EventRepositoryTestCase, +) +from minos.common import ( + DatabaseClientPool, +) +from minos.plugins.aiopg import ( + AiopgDatabaseClient, + AiopgDatabaseOperation, +) +from tests.utils import ( + AiopgTestCase, +) + + +# noinspection SqlNoDataSourceInspection +class TestDatabaseEventRepositorySubmit(AiopgTestCase, EventRepositoryTestCase): + __test__ = True + + def build_event_repository(self) -> EventRepository: + """Fort testing purposes.""" + return DatabaseEventRepository.from_config(self.config) + + def test_constructor(self): + pool = DatabaseClientPool.from_config(self.config) + repository = DatabaseEventRepository(pool) + self.assertIsInstance(repository, DatabaseEventRepository) + self.assertIsInstance(repository.database_pool, DatabaseClientPool) + + def test_from_config(self): + repository = DatabaseEventRepository.from_config(self.config) + self.assertIsInstance(repository.database_pool, DatabaseClientPool) + + async def test_setup(self): + async with AiopgDatabaseClient.from_config(self.config) as client: + operation = AiopgDatabaseOperation( + "SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'aggregate_event');" + ) + await client.execute(operation) + response = (await client.fetch_one())[0] + self.assertTrue(response) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/test_snapshots/__init__.py b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/test_snapshots/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/test_snapshots/test_factory.py b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/test_snapshots/test_factory.py new file mode 100644 index 000000000..eccd8d2f1 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/test_snapshots/test_factory.py @@ -0,0 +1,79 @@ +import unittest +from uuid import ( + uuid4, +) + +from minos.aggregate import ( + Condition, + Ordering, + SnapshotDatabaseOperationFactory, +) +from minos.common import ( + ComposedDatabaseOperation, + current_datetime, +) +from minos.plugins.aiopg import ( + AiopgDatabaseOperation, + AiopgSnapshotDatabaseOperationFactory, +) + + +class TestAiopgSnapshotDatabaseOperationFactory(unittest.TestCase): + def setUp(self) -> None: + self.factory = AiopgSnapshotDatabaseOperationFactory() + + def test_is_subclass(self): + self.assertTrue(issubclass(AiopgSnapshotDatabaseOperationFactory, SnapshotDatabaseOperationFactory)) + + def test_build_table_name(self): + self.assertEqual("snapshot", self.factory.build_table_name()) + + def test_build_offset_table_name(self): + self.assertEqual("snapshot_aux_offset", self.factory.build_offset_table_name()) + + def test_build_create(self): + operation = self.factory.build_create() + self.assertIsInstance(operation, ComposedDatabaseOperation) + self.assertEqual(3, len(operation.operations)) + for sub in operation.operations: + self.assertIsInstance(sub, AiopgDatabaseOperation) + + def test_build_build_delete(self): + operation = self.factory.build_delete({uuid4(), uuid4()}) + self.assertIsInstance(operation, AiopgDatabaseOperation) + + def test_build_submit(self): + operation = self.factory.build_submit( + uuid=uuid4(), + name="Foo", + version=34243, + schema=bytes(), + data={"foo": "bar"}, + created_at=current_datetime(), + updated_at=current_datetime(), + transaction_uuid=uuid4(), + ) + self.assertIsInstance(operation, AiopgDatabaseOperation) + + def test_build_query(self): + operation = self.factory.build_query( + name="Foo", + condition=Condition.EQUAL("foo", "bar"), + ordering=Ordering.ASC("foobar"), + limit=2342, + transaction_uuids=[uuid4(), uuid4()], + exclude_deleted=True, + ) + self.assertIsInstance(operation, AiopgDatabaseOperation) + + def test_build_submit_offset(self): + operation = self.factory.build_submit_offset(56) + self.assertIsInstance(operation, AiopgDatabaseOperation) + + def test_build_query_offset(self): + operation = self.factory.build_query_offset() + self.assertIsInstance(operation, AiopgDatabaseOperation) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_pg/test_queries.py b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/test_snapshots/test_queries.py similarity index 71% rename from packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_pg/test_queries.py rename to packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/test_snapshots/test_queries.py index 6c60efd9c..4f5a9f351 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_pg/test_queries.py +++ b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/test_snapshots/test_queries.py @@ -7,12 +7,12 @@ uuid4, ) -import aiopg from psycopg2.extras import ( Json, ) from psycopg2.sql import ( SQL, + Identifier, Literal, Placeholder, ) @@ -21,26 +21,20 @@ IS_REPOSITORY_SERIALIZATION_CONTEXT_VAR, Condition, Ordering, - PostgreSqlSnapshotQueryBuilder, -) -from minos.aggregate.snapshots.pg.queries import ( - _SELECT_ENTRIES_QUERY, - _SELECT_TRANSACTION_CHUNK, ) from minos.common import ( NULL_UUID, ) -from minos.common.testing import ( - PostgresAsyncTestCase, +from minos.plugins.aiopg import ( + AiopgDatabaseClient, + AiopgSnapshotQueryDatabaseOperationBuilder, ) from tests.utils import ( - CONFIG_FILE_PATH, + AiopgTestCase, ) -class TestPostgreSqlSnapshotQueryBuilder(PostgresAsyncTestCase): - CONFIG_FILE_PATH = CONFIG_FILE_PATH - +class TestAiopgSnapshotQueryDatabaseOperationBuilder(AiopgTestCase): def setUp(self) -> None: super().setUp() self.classname = "path.to.Product" @@ -48,14 +42,14 @@ def setUp(self) -> None: "name": self.classname, "transaction_uuid_1": NULL_UUID, } - self.base_select = _SELECT_ENTRIES_QUERY.format( - from_parts=_SELECT_TRANSACTION_CHUNK.format( - index=Literal(1), transaction_uuid=Placeholder("transaction_uuid_1") + self.base_select = AiopgSnapshotQueryDatabaseOperationBuilder._SELECT_ENTRIES_QUERY.format( + from_parts=AiopgSnapshotQueryDatabaseOperationBuilder._SELECT_TRANSACTION_CHUNK.format( + index=Literal(1), transaction_uuid=Placeholder("transaction_uuid_1"), table_name=Identifier("snapshot") ) ) def test_constructor(self): - qb = PostgreSqlSnapshotQueryBuilder(self.classname, Condition.TRUE) + qb = AiopgSnapshotQueryDatabaseOperationBuilder(self.classname, Condition.TRUE) self.assertEqual(self.classname, qb.name) self.assertEqual(Condition.TRUE, qb.condition) self.assertEqual(None, qb.ordering) @@ -64,7 +58,7 @@ def test_constructor(self): def test_constructor_full(self): transaction_uuids = (NULL_UUID, uuid4()) - qb = PostgreSqlSnapshotQueryBuilder( + qb = AiopgSnapshotQueryDatabaseOperationBuilder( self.classname, Condition.TRUE, Ordering.ASC("name"), 10, transaction_uuids, True ) self.assertEqual(self.classname, qb.name) @@ -75,7 +69,7 @@ def test_constructor_full(self): self.assertTrue(qb.exclude_deleted) def test_build_submitting_context_var(self): - builder = PostgreSqlSnapshotQueryBuilder(self.classname, Condition.TRUE) + builder = AiopgSnapshotQueryDatabaseOperationBuilder(self.classname, Condition.TRUE) def _fn(): self.assertEqual(True, IS_REPOSITORY_SERIALIZATION_CONTEXT_VAR.get()) @@ -92,24 +86,28 @@ def _fn(): def test_build_raises(self): with self.assertRaises(ValueError): # noinspection PyTypeChecker - PostgreSqlSnapshotQueryBuilder(self.classname, True).build() + AiopgSnapshotQueryDatabaseOperationBuilder(self.classname, True).build() async def test_build_with_transactions(self): transaction_uuids = (NULL_UUID, uuid4()) - observed = PostgreSqlSnapshotQueryBuilder( + observed = AiopgSnapshotQueryDatabaseOperationBuilder( self.classname, Condition.TRUE, transaction_uuids=transaction_uuids ).build() expected_query = SQL(" WHERE ").join( [ - _SELECT_ENTRIES_QUERY.format( + AiopgSnapshotQueryDatabaseOperationBuilder._SELECT_ENTRIES_QUERY.format( from_parts=SQL(" UNION ALL ").join( [ - _SELECT_TRANSACTION_CHUNK.format( - index=Literal(1), transaction_uuid=Placeholder("transaction_uuid_1") + AiopgSnapshotQueryDatabaseOperationBuilder._SELECT_TRANSACTION_CHUNK.format( + index=Literal(1), + transaction_uuid=Placeholder("transaction_uuid_1"), + table_name=Identifier("snapshot"), ), - _SELECT_TRANSACTION_CHUNK.format( - index=Literal(2), transaction_uuid=Placeholder("transaction_uuid_2") + AiopgSnapshotQueryDatabaseOperationBuilder._SELECT_TRANSACTION_CHUNK.format( + index=Literal(2), + transaction_uuid=Placeholder("transaction_uuid_2"), + table_name=Identifier("snapshot"), ), ] ) @@ -124,7 +122,7 @@ async def test_build_with_transactions(self): async def test_build_true(self): condition = Condition.TRUE - observed = PostgreSqlSnapshotQueryBuilder(self.classname, condition).build() + observed = AiopgSnapshotQueryDatabaseOperationBuilder(self.classname, condition).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL("TRUE")]) expected_parameters = self.base_parameters @@ -134,7 +132,7 @@ async def test_build_true(self): async def test_build_false(self): condition = Condition.FALSE - observed = PostgreSqlSnapshotQueryBuilder(self.classname, condition).build() + observed = AiopgSnapshotQueryDatabaseOperationBuilder(self.classname, condition).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL("FALSE")]) expected_parameters = self.base_parameters self.assertEqual(await self._flatten_query(expected_query), await self._flatten_query(observed[0])) @@ -143,8 +141,8 @@ async def test_build_false(self): async def test_build_fixed_uuid(self): uuid = uuid4() condition = Condition.EQUAL("uuid", uuid) - with patch("minos.aggregate.PostgreSqlSnapshotQueryBuilder.generate_random_str", side_effect=["hello"]): - observed = PostgreSqlSnapshotQueryBuilder(self.classname, condition).build() + with patch.object(AiopgSnapshotQueryDatabaseOperationBuilder, "generate_random_str", side_effect=["hello"]): + observed = AiopgSnapshotQueryDatabaseOperationBuilder(self.classname, condition).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL('("uuid" = %(hello)s)')]) expected_parameters = {"hello": str(uuid)} | self.base_parameters @@ -154,8 +152,8 @@ async def test_build_fixed_uuid(self): async def test_build_fixed_version(self): condition = Condition.EQUAL("version", 1) - with patch("minos.aggregate.PostgreSqlSnapshotQueryBuilder.generate_random_str", side_effect=["hello"]): - observed = PostgreSqlSnapshotQueryBuilder(self.classname, condition).build() + with patch.object(AiopgSnapshotQueryDatabaseOperationBuilder, "generate_random_str", side_effect=["hello"]): + observed = AiopgSnapshotQueryDatabaseOperationBuilder(self.classname, condition).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL('("version" = %(hello)s)')]) expected_parameters = {"hello": 1} | self.base_parameters @@ -165,8 +163,8 @@ async def test_build_fixed_version(self): async def test_build_fixed_created_at(self): condition = Condition.EQUAL("created_at", 1) - with patch("minos.aggregate.PostgreSqlSnapshotQueryBuilder.generate_random_str", side_effect=["hello"]): - observed = PostgreSqlSnapshotQueryBuilder(self.classname, condition).build() + with patch.object(AiopgSnapshotQueryDatabaseOperationBuilder, "generate_random_str", side_effect=["hello"]): + observed = AiopgSnapshotQueryDatabaseOperationBuilder(self.classname, condition).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL('("created_at" = %(hello)s)')]) expected_parameters = {"hello": 1} | self.base_parameters @@ -176,8 +174,8 @@ async def test_build_fixed_created_at(self): async def test_build_fixed_updated_at(self): condition = Condition.EQUAL("updated_at", 1) - with patch("minos.aggregate.PostgreSqlSnapshotQueryBuilder.generate_random_str", side_effect=["hello"]): - observed = PostgreSqlSnapshotQueryBuilder(self.classname, condition).build() + with patch.object(AiopgSnapshotQueryDatabaseOperationBuilder, "generate_random_str", side_effect=["hello"]): + observed = AiopgSnapshotQueryDatabaseOperationBuilder(self.classname, condition).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL('("updated_at" = %(hello)s)')]) expected_parameters = {"hello": 1} | self.base_parameters @@ -187,8 +185,8 @@ async def test_build_fixed_updated_at(self): async def test_build_fixed_with_like(self): condition = Condition.LIKE("uuid", "a%") - with patch("minos.aggregate.PostgreSqlSnapshotQueryBuilder.generate_random_str", side_effect=["hello"]): - observed = PostgreSqlSnapshotQueryBuilder(self.classname, condition).build() + with patch.object(AiopgSnapshotQueryDatabaseOperationBuilder, "generate_random_str", side_effect=["hello"]): + observed = AiopgSnapshotQueryDatabaseOperationBuilder(self.classname, condition).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL('("uuid"::text LIKE %(hello)s)')]) expected_parameters = {"hello": "a%"} | self.base_parameters @@ -198,8 +196,8 @@ async def test_build_fixed_with_like(self): async def test_build_lower(self): condition = Condition.LOWER("age", 1) - with patch("minos.aggregate.PostgreSqlSnapshotQueryBuilder.generate_random_str", side_effect=["hello"]): - observed = PostgreSqlSnapshotQueryBuilder(self.classname, condition).build() + with patch.object(AiopgSnapshotQueryDatabaseOperationBuilder, "generate_random_str", side_effect=["hello"]): + observed = AiopgSnapshotQueryDatabaseOperationBuilder(self.classname, condition).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL("(data#>'{age}' < %(hello)s::jsonb)")]) expected_parameters = {"hello": 1} | self.base_parameters @@ -209,8 +207,8 @@ async def test_build_lower(self): async def test_build_lower_equal(self): condition = Condition.LOWER_EQUAL("age", 1) - with patch("minos.aggregate.PostgreSqlSnapshotQueryBuilder.generate_random_str", side_effect=["hello"]): - observed = PostgreSqlSnapshotQueryBuilder(self.classname, condition).build() + with patch.object(AiopgSnapshotQueryDatabaseOperationBuilder, "generate_random_str", side_effect=["hello"]): + observed = AiopgSnapshotQueryDatabaseOperationBuilder(self.classname, condition).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL("(data#>'{age}' <= %(hello)s::jsonb)")]) expected_parameters = {"hello": 1} | self.base_parameters @@ -220,8 +218,8 @@ async def test_build_lower_equal(self): async def test_build_greater(self): condition = Condition.GREATER("age", 1) - with patch("minos.aggregate.PostgreSqlSnapshotQueryBuilder.generate_random_str", side_effect=["hello"]): - observed = PostgreSqlSnapshotQueryBuilder(self.classname, condition).build() + with patch.object(AiopgSnapshotQueryDatabaseOperationBuilder, "generate_random_str", side_effect=["hello"]): + observed = AiopgSnapshotQueryDatabaseOperationBuilder(self.classname, condition).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL("(data#>'{age}' > %(hello)s::jsonb)")]) expected_parameters = {"hello": 1} | self.base_parameters @@ -231,8 +229,8 @@ async def test_build_greater(self): async def test_build_greater_equal(self): condition = Condition.GREATER_EQUAL("age", 1) - with patch("minos.aggregate.PostgreSqlSnapshotQueryBuilder.generate_random_str", side_effect=["hello"]): - observed = PostgreSqlSnapshotQueryBuilder(self.classname, condition).build() + with patch.object(AiopgSnapshotQueryDatabaseOperationBuilder, "generate_random_str", side_effect=["hello"]): + observed = AiopgSnapshotQueryDatabaseOperationBuilder(self.classname, condition).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL("(data#>'{age}' >= %(hello)s::jsonb)")]) expected_parameters = {"hello": 1} | self.base_parameters @@ -242,8 +240,8 @@ async def test_build_greater_equal(self): async def test_build_equal(self): condition = Condition.EQUAL("age", 1) - with patch("minos.aggregate.PostgreSqlSnapshotQueryBuilder.generate_random_str", side_effect=["hello"]): - observed = PostgreSqlSnapshotQueryBuilder(self.classname, condition).build() + with patch.object(AiopgSnapshotQueryDatabaseOperationBuilder, "generate_random_str", side_effect=["hello"]): + observed = AiopgSnapshotQueryDatabaseOperationBuilder(self.classname, condition).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL("(data#>'{age}' = %(hello)s::jsonb)")]) expected_parameters = {"hello": 1} | self.base_parameters @@ -253,8 +251,8 @@ async def test_build_equal(self): async def test_build_not_equal(self): condition = Condition.NOT_EQUAL("age", 1) - with patch("minos.aggregate.PostgreSqlSnapshotQueryBuilder.generate_random_str", side_effect=["hello"]): - observed = PostgreSqlSnapshotQueryBuilder(self.classname, condition).build() + with patch.object(AiopgSnapshotQueryDatabaseOperationBuilder, "generate_random_str", side_effect=["hello"]): + observed = AiopgSnapshotQueryDatabaseOperationBuilder(self.classname, condition).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL("(data#>'{age}' <> %(hello)s::jsonb)")]) expected_parameters = {"hello": 1} | self.base_parameters @@ -264,8 +262,8 @@ async def test_build_not_equal(self): async def test_build_in(self): condition = Condition.IN("age", [1, 2, 3]) - with patch("minos.aggregate.PostgreSqlSnapshotQueryBuilder.generate_random_str", side_effect=["hello"]): - observed = PostgreSqlSnapshotQueryBuilder(self.classname, condition).build() + with patch.object(AiopgSnapshotQueryDatabaseOperationBuilder, "generate_random_str", side_effect=["hello"]): + observed = AiopgSnapshotQueryDatabaseOperationBuilder(self.classname, condition).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL("(data#>'{age}' IN %(hello)s::jsonb)")]) expected_parameters = {"hello": (1, 2, 3)} | self.base_parameters @@ -275,8 +273,8 @@ async def test_build_in(self): async def test_build_in_empty(self): condition = Condition.IN("age", []) - with patch("minos.aggregate.PostgreSqlSnapshotQueryBuilder.generate_random_str", side_effect=["hello"]): - observed = PostgreSqlSnapshotQueryBuilder(self.classname, condition).build() + with patch.object(AiopgSnapshotQueryDatabaseOperationBuilder, "generate_random_str", side_effect=["hello"]): + observed = AiopgSnapshotQueryDatabaseOperationBuilder(self.classname, condition).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL("FALSE")]) expected_parameters = self.base_parameters @@ -286,8 +284,8 @@ async def test_build_in_empty(self): async def test_build_like(self): condition = Condition.LIKE("name", "a%") - with patch("minos.aggregate.PostgreSqlSnapshotQueryBuilder.generate_random_str", side_effect=["hello"]): - observed = PostgreSqlSnapshotQueryBuilder(self.classname, condition).build() + with patch.object(AiopgSnapshotQueryDatabaseOperationBuilder, "generate_random_str", side_effect=["hello"]): + observed = AiopgSnapshotQueryDatabaseOperationBuilder(self.classname, condition).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL("(data#>>'{name}' LIKE %(hello)s)")]) expected_parameters = {"hello": "a%"} | self.base_parameters @@ -297,8 +295,8 @@ async def test_build_like(self): async def test_build_not(self): condition = Condition.NOT(Condition.LOWER("age", 1)) - with patch("minos.aggregate.PostgreSqlSnapshotQueryBuilder.generate_random_str", side_effect=["hello"]): - observed = PostgreSqlSnapshotQueryBuilder(self.classname, condition).build() + with patch.object(AiopgSnapshotQueryDatabaseOperationBuilder, "generate_random_str", side_effect=["hello"]): + observed = AiopgSnapshotQueryDatabaseOperationBuilder(self.classname, condition).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL("(NOT (data#>'{age}' < %(hello)s::jsonb))")]) expected_parameters = {"hello": 1} | self.base_parameters @@ -308,10 +306,10 @@ async def test_build_not(self): async def test_build_and(self): condition = Condition.AND(Condition.LOWER("age", 1), Condition.LOWER("level", 3)) - with patch( - "minos.aggregate.PostgreSqlSnapshotQueryBuilder.generate_random_str", side_effect=["hello", "goodbye"] + with patch.object( + AiopgSnapshotQueryDatabaseOperationBuilder, "generate_random_str", side_effect=["hello", "goodbye"] ): - observed = PostgreSqlSnapshotQueryBuilder(self.classname, condition).build() + observed = AiopgSnapshotQueryDatabaseOperationBuilder(self.classname, condition).build() expected_query = SQL(" WHERE ").join( [self.base_select, SQL("((data#>'{age}' < %(hello)s::jsonb) AND (data#>'{level}' < %(goodbye)s::jsonb))")] @@ -323,10 +321,10 @@ async def test_build_and(self): async def test_build_or(self): condition = Condition.OR(Condition.LOWER("age", 1), Condition.LOWER("level", 3)) - with patch( - "minos.aggregate.PostgreSqlSnapshotQueryBuilder.generate_random_str", side_effect=["hello", "goodbye"] + with patch.object( + AiopgSnapshotQueryDatabaseOperationBuilder, "generate_random_str", side_effect=["hello", "goodbye"] ): - observed = PostgreSqlSnapshotQueryBuilder(self.classname, condition).build() + observed = AiopgSnapshotQueryDatabaseOperationBuilder(self.classname, condition).build() expected_query = SQL(" WHERE ").join( [self.base_select, SQL("((data#>'{age}' < %(hello)s::jsonb) OR (data#>'{level}' < %(goodbye)s::jsonb))")] @@ -337,7 +335,9 @@ async def test_build_or(self): self.assertEqual(self._flatten_parameters(expected_parameters), self._flatten_parameters(observed[1])) async def test_build_exclude_deleted(self): - observed = PostgreSqlSnapshotQueryBuilder(self.classname, Condition.TRUE, exclude_deleted=True).build() + observed = AiopgSnapshotQueryDatabaseOperationBuilder( + self.classname, Condition.TRUE, exclude_deleted=True + ).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL("TRUE AND (data IS NOT NULL)")]) expected_parameters = self.base_parameters @@ -347,7 +347,7 @@ async def test_build_exclude_deleted(self): async def test_build_fixed_ordering_asc(self): ordering = Ordering.ASC("created_at") - observed = PostgreSqlSnapshotQueryBuilder(self.classname, Condition.TRUE, ordering).build() + observed = AiopgSnapshotQueryDatabaseOperationBuilder(self.classname, Condition.TRUE, ordering).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL('TRUE ORDER BY "created_at" ASC')]) @@ -358,7 +358,7 @@ async def test_build_fixed_ordering_asc(self): async def test_build_fixed_ordering_desc(self): ordering = Ordering.DESC("created_at") - observed = PostgreSqlSnapshotQueryBuilder(self.classname, Condition.TRUE, ordering).build() + observed = AiopgSnapshotQueryDatabaseOperationBuilder(self.classname, Condition.TRUE, ordering).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL('TRUE ORDER BY "created_at" DESC')]) expected_parameters = self.base_parameters @@ -368,7 +368,7 @@ async def test_build_fixed_ordering_desc(self): async def test_build_ordering_asc(self): ordering = Ordering.ASC("name") - observed = PostgreSqlSnapshotQueryBuilder(self.classname, Condition.TRUE, ordering).build() + observed = AiopgSnapshotQueryDatabaseOperationBuilder(self.classname, Condition.TRUE, ordering).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL("TRUE ORDER BY data#>'{name}' ASC")]) expected_parameters = self.base_parameters @@ -378,7 +378,7 @@ async def test_build_ordering_asc(self): async def test_build_ordering_desc(self): ordering = Ordering.DESC("name") - observed = PostgreSqlSnapshotQueryBuilder(self.classname, Condition.TRUE, ordering).build() + observed = AiopgSnapshotQueryDatabaseOperationBuilder(self.classname, Condition.TRUE, ordering).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL("TRUE ORDER BY data#>'{name}' DESC")]) @@ -388,7 +388,7 @@ async def test_build_ordering_desc(self): self.assertEqual(self._flatten_parameters(expected_parameters), self._flatten_parameters(observed[1])) async def test_build_limit(self): - observed = PostgreSqlSnapshotQueryBuilder(self.classname, Condition.TRUE, limit=10).build() + observed = AiopgSnapshotQueryDatabaseOperationBuilder(self.classname, Condition.TRUE, limit=10).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL("TRUE LIMIT 10")]) @@ -405,10 +405,10 @@ async def test_build_complex(self): ordering = Ordering.DESC("updated_at") limit = 100 - with patch( - "minos.aggregate.PostgreSqlSnapshotQueryBuilder.generate_random_str", side_effect=["one", "two", "three"] + with patch.object( + AiopgSnapshotQueryDatabaseOperationBuilder, "generate_random_str", side_effect=["one", "two", "three"] ): - observed = PostgreSqlSnapshotQueryBuilder(self.classname, condition, ordering, limit).build() + observed = AiopgSnapshotQueryDatabaseOperationBuilder(self.classname, condition, ordering, limit).build() expected_query = SQL(" WHERE ").join( [ @@ -428,8 +428,8 @@ async def test_build_complex(self): self.assertEqual(self._flatten_parameters(expected_parameters), self._flatten_parameters(observed[1])) async def _flatten_query(self, query) -> str: - async with aiopg.connect(**self.snapshot_db) as connection: - return query.as_string(connection.raw) + async with AiopgDatabaseClient(**self.config.get_default_database()) as client: + return query.as_string(client.connection.raw) @staticmethod def _flatten_parameters(parameters) -> dict: diff --git a/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/test_snapshots/test_repository.py b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/test_snapshots/test_repository.py new file mode 100644 index 000000000..791e82b7c --- /dev/null +++ b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/test_snapshots/test_repository.py @@ -0,0 +1,52 @@ +import unittest + +from minos.aggregate import ( + DatabaseSnapshotRepository, +) +from minos.aggregate.testing import ( + SnapshotRepositoryTestCase, +) +from minos.plugins.aiopg import ( + AiopgDatabaseClient, + AiopgDatabaseOperation, +) +from tests.utils import ( + AiopgTestCase, +) + + +# noinspection SqlNoDataSourceInspection +class TestDatabaseSnapshotRepository(AiopgTestCase, SnapshotRepositoryTestCase): + __test__ = True + + def build_snapshot_repository(self): + return DatabaseSnapshotRepository.from_config(self.config) + + async def test_setup_snapshot_table(self): + async with AiopgDatabaseClient.from_config(self.config) as client: + operation = AiopgDatabaseOperation( + "SELECT EXISTS (SELECT FROM pg_tables WHERE schemaname = 'public' AND tablename = 'snapshot');" + ) + await client.execute(operation) + observed = (await client.fetch_one())[0] + self.assertEqual(True, observed) + + async def test_setup_snapshot_aux_offset_table(self): + async with AiopgDatabaseClient.from_config(self.config) as client: + operation = AiopgDatabaseOperation( + "SELECT EXISTS (SELECT FROM pg_tables WHERE " + "schemaname = 'public' AND tablename = 'snapshot_aux_offset');" + ) + await client.execute(operation) + observed = (await client.fetch_one())[0] + self.assertEqual(True, observed) + + async def test_is_synced(self): + await self.populate() + self.assertFalse(await self.snapshot_repository.is_synced(SnapshotRepositoryTestCase.Car)) + await self.snapshot_repository.synchronize() + self.assertTrue(await self.snapshot_repository.is_synced(SnapshotRepositoryTestCase.Car)) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/test_transactions/__init__.py b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/test_transactions/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/test_transactions/test_factory.py b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/test_transactions/test_factory.py new file mode 100644 index 000000000..d6559ae1d --- /dev/null +++ b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/test_transactions/test_factory.py @@ -0,0 +1,69 @@ +import unittest +from uuid import ( + uuid4, +) + +from minos.aggregate import ( + TransactionDatabaseOperationFactory, + TransactionStatus, +) +from minos.common import ( + ComposedDatabaseOperation, + current_datetime, +) +from minos.plugins.aiopg import ( + AiopgDatabaseOperation, + AiopgTransactionDatabaseOperationFactory, +) + + +class TestAiopgTransactionDatabaseOperationFactory(unittest.TestCase): + def setUp(self) -> None: + self.factory = AiopgTransactionDatabaseOperationFactory() + + def test_is_subclass(self): + self.assertTrue(issubclass(AiopgTransactionDatabaseOperationFactory, TransactionDatabaseOperationFactory)) + + def test_build_table_name(self): + self.assertEqual("aggregate_transaction", self.factory.build_table_name()) + + def test_build_create(self): + operation = self.factory.build_create() + self.assertIsInstance(operation, ComposedDatabaseOperation) + self.assertEqual(3, len(operation.operations)) + for sub in operation.operations: + self.assertIsInstance(sub, AiopgDatabaseOperation) + + def test_build_submit(self): + operation = self.factory.build_submit( + uuid=uuid4(), + destination_uuid=uuid4(), + status=TransactionStatus.COMMITTED, + event_offset=234234, + ) + self.assertIsInstance(operation, AiopgDatabaseOperation) + + def test_build_query(self): + operation = self.factory.build_query( + uuid=uuid4(), + uuid_ne=uuid4(), + uuid_in={uuid4(), uuid4()}, + destination_uuid=uuid4(), + status=TransactionStatus.COMMITTED, + status_in={TransactionStatus.REJECTED, TransactionStatus.RESERVED}, + event_offset=234, + event_offset_lt=24342, + event_offset_gt=3424, + event_offset_le=2342, + event_offset_ge=234342, + updated_at=current_datetime(), + updated_at_lt=current_datetime(), + updated_at_gt=current_datetime(), + updated_at_le=current_datetime(), + updated_at_ge=current_datetime(), + ) + self.assertIsInstance(operation, AiopgDatabaseOperation) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/test_transactions/test_repository.py b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/test_transactions/test_repository.py new file mode 100644 index 000000000..c86eab02a --- /dev/null +++ b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_aggregate/test_transactions/test_repository.py @@ -0,0 +1,50 @@ +import unittest + +from minos.aggregate import ( + DatabaseTransactionRepository, + TransactionRepository, +) +from minos.aggregate.testing import ( + TransactionRepositoryTestCase, +) +from minos.common import ( + DatabaseClientPool, +) +from minos.plugins.aiopg import ( + AiopgDatabaseClient, + AiopgDatabaseOperation, +) +from tests.utils import ( + AiopgTestCase, +) + + +# noinspection SqlNoDataSourceInspection +class TestDatabaseTransactionRepository(AiopgTestCase, TransactionRepositoryTestCase): + __test__ = True + + def build_transaction_repository(self) -> TransactionRepository: + return DatabaseTransactionRepository.from_config(self.config) + + def test_constructor(self): + pool = DatabaseClientPool.from_config(self.config) + repository = DatabaseTransactionRepository(pool) + self.assertIsInstance(repository, DatabaseTransactionRepository) + self.assertEqual(pool, repository.database_pool) + + def test_from_config(self): + repository = DatabaseTransactionRepository.from_config(self.config) + self.assertIsInstance(repository.database_pool, DatabaseClientPool) + + async def test_setup(self): + async with AiopgDatabaseClient.from_config(self.config) as client: + operation = AiopgDatabaseOperation( + "SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'aggregate_transaction');" + ) + await client.execute(operation) + response = (await client.fetch_one())[0] + self.assertTrue(response) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_common/__init__.py b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_common/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_common/test_locks.py b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_common/test_locks.py new file mode 100644 index 000000000..6f518a290 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_common/test_locks.py @@ -0,0 +1,29 @@ +import unittest + +from minos.common import ( + LockDatabaseOperationFactory, +) +from minos.plugins.aiopg import ( + AiopgDatabaseOperation, + AiopgLockDatabaseOperationFactory, +) + + +class TestAiopgLockDatabaseOperationFactory(unittest.TestCase): + def setUp(self) -> None: + self.factory = AiopgLockDatabaseOperationFactory() + + def test_is_subclass(self): + self.assertTrue(issubclass(AiopgLockDatabaseOperationFactory, LockDatabaseOperationFactory)) + + def test_build_acquire(self): + operation = self.factory.build_acquire(56) + self.assertIsInstance(operation, AiopgDatabaseOperation) + + def test_build_release(self): + operation = self.factory.build_release(56) + self.assertIsInstance(operation, AiopgDatabaseOperation) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_common/test_managements.py b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_common/test_managements.py new file mode 100644 index 000000000..fe0996797 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_common/test_managements.py @@ -0,0 +1,29 @@ +import unittest + +from minos.common import ( + ManagementDatabaseOperationFactory, +) +from minos.plugins.aiopg import ( + AiopgDatabaseOperation, + AiopgManagementDatabaseOperationFactory, +) + + +class TestAiopgManagementDatabaseOperationFactory(unittest.TestCase): + def setUp(self) -> None: + self.factory = AiopgManagementDatabaseOperationFactory() + + def test_is_subclass(self): + self.assertTrue(issubclass(AiopgManagementDatabaseOperationFactory, ManagementDatabaseOperationFactory)) + + def test_build_create(self): + operation = self.factory.build_create("foo") + self.assertIsInstance(operation, AiopgDatabaseOperation) + + def test_build_delete(self): + operation = self.factory.build_delete("foo") + self.assertIsInstance(operation, AiopgDatabaseOperation) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_networks/__init__.py b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_networks/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_networks/test_collections/__init__.py b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_networks/test_collections/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_networks/test_collections/test_queues.py b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_networks/test_collections/test_queues.py new file mode 100644 index 000000000..c90a12de5 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_networks/test_collections/test_queues.py @@ -0,0 +1,60 @@ +import unittest + +from minos.networks import ( + BrokerQueueDatabaseOperationFactory, +) +from minos.plugins.aiopg import ( + AiopgBrokerQueueDatabaseOperationFactory, + AiopgDatabaseOperation, +) + + +class _BrokerQueueDatabaseOperationFactory(AiopgBrokerQueueDatabaseOperationFactory): + """For testing purposes.""" + + def build_table_name(self) -> str: + """For testing purposes.""" + return "foo" + + +class TestAiopgBrokerQueueDatabaseOperationFactory(unittest.TestCase): + def setUp(self) -> None: + self.factory = _BrokerQueueDatabaseOperationFactory() + + def test_is_subclass(self): + self.assertTrue(AiopgBrokerQueueDatabaseOperationFactory, BrokerQueueDatabaseOperationFactory) + + def test_build_table_name(self): + self.assertEqual("foo", self.factory.build_table_name()) + + def test_build_create(self): + operation = self.factory.build_create() + self.assertIsInstance(operation, AiopgDatabaseOperation) + + def test_build_mark_processed(self): + operation = self.factory.build_mark_processed(id_=56) + self.assertIsInstance(operation, AiopgDatabaseOperation) + + def test_build_delete(self): + operation = self.factory.build_delete(id_=56) + self.assertIsInstance(operation, AiopgDatabaseOperation) + + def test_build_mark_processing(self): + operation = self.factory.build_mark_processing(ids={56, 78}) + self.assertIsInstance(operation, AiopgDatabaseOperation) + + def test_build_count(self): + operation = self.factory.build_count(retry=3) + self.assertIsInstance(operation, AiopgDatabaseOperation) + + def test_build_submit(self): + operation = self.factory.build_submit(topic="foo", data=bytes()) + self.assertIsInstance(operation, AiopgDatabaseOperation) + + def test_build_query(self): + operation = self.factory.build_query(retry=3, records=1000) + self.assertIsInstance(operation, AiopgDatabaseOperation) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_networks/test_publishers/__init__.py b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_networks/test_publishers/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_networks/test_publishers/test_queues.py b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_networks/test_publishers/test_queues.py new file mode 100644 index 000000000..b0f90fe21 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_networks/test_publishers/test_queues.py @@ -0,0 +1,27 @@ +import unittest + +from minos.networks import ( + BrokerPublisherQueueDatabaseOperationFactory, +) +from minos.plugins.aiopg import ( + AiopgBrokerPublisherQueueDatabaseOperationFactory, + AiopgBrokerQueueDatabaseOperationFactory, +) + + +class TestAiopgBrokerPublisherQueueDatabaseOperationFactory(unittest.TestCase): + def setUp(self) -> None: + self.factory = AiopgBrokerPublisherQueueDatabaseOperationFactory() + + def test_is_subclass(self): + self.assertTrue( + AiopgBrokerPublisherQueueDatabaseOperationFactory, + (BrokerPublisherQueueDatabaseOperationFactory, AiopgBrokerQueueDatabaseOperationFactory), + ) + + def test_build_table_name(self): + self.assertEqual("broker_publisher_queue", self.factory.build_table_name()) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_networks/test_subscribers/__init__.py b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_networks/test_subscribers/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_networks/test_subscribers/test_queues.py b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_networks/test_subscribers/test_queues.py new file mode 100644 index 000000000..4367230ca --- /dev/null +++ b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_networks/test_subscribers/test_queues.py @@ -0,0 +1,38 @@ +import unittest + +from minos.networks import ( + BrokerSubscriberQueueDatabaseOperationFactory, +) +from minos.plugins.aiopg import ( + AiopgBrokerQueueDatabaseOperationFactory, + AiopgBrokerSubscriberQueueDatabaseOperationFactory, + AiopgDatabaseOperation, +) + + +class TestAiopgBrokerSubscriberQueueDatabaseOperationFactory(unittest.TestCase): + def setUp(self) -> None: + self.factory = AiopgBrokerSubscriberQueueDatabaseOperationFactory() + + def test_is_subclass(self): + self.assertTrue( + issubclass( + AiopgBrokerSubscriberQueueDatabaseOperationFactory, + (BrokerSubscriberQueueDatabaseOperationFactory, AiopgBrokerQueueDatabaseOperationFactory), + ) + ) + + def test_build_table_name(self): + self.assertEqual("broker_subscriber_queue", self.factory.build_table_name()) + + def test_build_build_count(self): + operation = self.factory.build_count(retry=3, topics={"foo", "bar"}) + self.assertIsInstance(operation, AiopgDatabaseOperation) + + def test_build_build_query(self): + operation = self.factory.build_query(retry=3, records=100, topics={"foo", "bar"}) + self.assertIsInstance(operation, AiopgDatabaseOperation) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_networks/test_subscribers/test_validators.py b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_networks/test_subscribers/test_validators.py new file mode 100644 index 000000000..f3d20a54f --- /dev/null +++ b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_factories/test_networks/test_subscribers/test_validators.py @@ -0,0 +1,46 @@ +import unittest +from uuid import ( + uuid4, +) + +from minos.common import ( + ComposedDatabaseOperation, +) +from minos.networks import ( + BrokerSubscriberDuplicateValidatorDatabaseOperationFactory, +) +from minos.plugins.aiopg import ( + AiopgBrokerSubscriberDuplicateValidatorDatabaseOperationFactory, + AiopgDatabaseOperation, +) + + +class TestAiopgBrokerSubscriberDuplicateValidatorDatabaseOperationFactory(unittest.TestCase): + def setUp(self) -> None: + self.factory = AiopgBrokerSubscriberDuplicateValidatorDatabaseOperationFactory() + + def test_is_subclass(self): + self.assertTrue( + issubclass( + AiopgBrokerSubscriberDuplicateValidatorDatabaseOperationFactory, + BrokerSubscriberDuplicateValidatorDatabaseOperationFactory, + ) + ) + + def test_build_table_name(self): + self.assertEqual("broker_subscriber_processed_messages", self.factory.build_table_name()) + + def test_build_create(self): + operation = self.factory.build_create() + self.assertIsInstance(operation, ComposedDatabaseOperation) + self.assertEqual(2, len(operation.operations)) + for sub in operation.operations: + self.assertIsInstance(sub, AiopgDatabaseOperation) + + def test_build_submit(self): + operation = self.factory.build_submit("foo", uuid4()) + self.assertIsInstance(operation, AiopgDatabaseOperation) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_operations.py b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_operations.py new file mode 100644 index 000000000..531fc4d52 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/tests/test_aiopg/test_operations.py @@ -0,0 +1,24 @@ +import unittest + +from minos.common import ( + DatabaseOperation, +) +from minos.plugins.aiopg import ( + AiopgDatabaseOperation, +) + + +class TestAiopgDatabaseOperation(unittest.TestCase): + def test_subclass(self) -> None: + self.assertTrue(issubclass(AiopgDatabaseOperation, DatabaseOperation)) + + def test_constructor(self): + operation = AiopgDatabaseOperation("query", {"foo": "bar"}) + self.assertEqual("query", operation.query) + self.assertEqual({"foo": "bar"}, operation.parameters) + self.assertEqual(None, operation.timeout) + self.assertEqual(None, operation.lock) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/plugins/minos-database-aiopg/tests/test_config.yml b/packages/plugins/minos-database-aiopg/tests/test_config.yml new file mode 100644 index 000000000..3f2398a08 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/tests/test_config.yml @@ -0,0 +1,9 @@ +version: 2 +databases: + default: + client: minos.plugins.aiopg.AiopgDatabaseClient + database: order_db + user: minos + password: min0s + host: localhost + port: 5432 \ No newline at end of file diff --git a/packages/plugins/minos-database-aiopg/tests/utils.py b/packages/plugins/minos-database-aiopg/tests/utils.py new file mode 100644 index 000000000..f3670c839 --- /dev/null +++ b/packages/plugins/minos-database-aiopg/tests/utils.py @@ -0,0 +1,88 @@ +from pathlib import ( + Path, +) + +from minos.aggregate import ( + InMemoryEventRepository, + InMemorySnapshotRepository, + InMemoryTransactionRepository, +) +from minos.common import ( + DatabaseClientPool, + Lock, + LockPool, + PoolFactory, +) +from minos.common.testing import ( + DatabaseMinosTestCase, +) +from minos.networks import ( + BrokerClientPool, + InMemoryBrokerPublisher, + InMemoryBrokerSubscriberBuilder, +) + +BASE_PATH = Path(__file__).parent +CONFIG_FILE_PATH = BASE_PATH / "test_config.yml" + + +class AiopgTestCase(DatabaseMinosTestCase): + def get_config_file_path(self) -> Path: + return CONFIG_FILE_PATH + + def get_injections(self): + pool_factory = PoolFactory.from_config( + self.config, + default_classes={ + "broker": BrokerClientPool, + "lock": FakeLockPool, + "database": DatabaseClientPool, + }, + ) + broker_publisher = InMemoryBrokerPublisher() + broker_subscriber_builder = InMemoryBrokerSubscriberBuilder() + transaction_repository = InMemoryTransactionRepository( + lock_pool=pool_factory.get_pool("lock"), + ) + event_repository = InMemoryEventRepository( + broker_publisher=broker_publisher, + transaction_repository=transaction_repository, + lock_pool=pool_factory.get_pool("lock"), + ) + snapshot_repository = InMemorySnapshotRepository( + event_repository=event_repository, + transaction_repository=transaction_repository, + ) + return [ + pool_factory, + broker_publisher, + broker_subscriber_builder, + transaction_repository, + event_repository, + snapshot_repository, + ] + + +class FakeLock(Lock): + """For testing purposes.""" + + def __init__(self, key=None, *args, **kwargs): + if key is None: + key = "fake" + super().__init__(key, *args, **kwargs) + + async def acquire(self) -> None: + """For testing purposes.""" + + async def release(self): + """For testing purposes.""" + + +class FakeLockPool(LockPool): + """For testing purposes.""" + + async def _create_instance(self): + return FakeLock() + + async def _destroy_instance(self, instance) -> None: + """For testing purposes.""" diff --git a/packages/plugins/minos-database-lmdb/AUTHORS.md b/packages/plugins/minos-database-lmdb/AUTHORS.md new file mode 100644 index 000000000..30ff94991 --- /dev/null +++ b/packages/plugins/minos-database-lmdb/AUTHORS.md @@ -0,0 +1,15 @@ +# Credits + +## Development Lead + +* Andrea Mucci + +## Core Devs + +* Sergio Garcia Prado +* Vladyslav Fenchak +* Alberto Amigo Alonso + +## Contributors + +None yet. Why not be the first? diff --git a/packages/plugins/minos-database-lmdb/HISTORY.md b/packages/plugins/minos-database-lmdb/HISTORY.md new file mode 100644 index 000000000..28596c46d --- /dev/null +++ b/packages/plugins/minos-database-lmdb/HISTORY.md @@ -0,0 +1,7 @@ +# History + +## 0.7.0 (2022-05-11) + +* Add `LmdbDatabaseClient` as the `minos.common.DatabaseClient` implementation for `lmdb`. +* Add `LmdbDatabaseOperation` and `LmdbDatabaseOperationType` classes to define `minos.common.DatabaseOperation`s compatible with the `lmdb` database. +* Add `LmdbSagaExecutionDatabaseOperationFactory` as the `minos.saga.SagaExecutionDatabaseOperationFactory` implementation for `lmdb`. diff --git a/packages/plugins/minos-database-lmdb/LICENSE b/packages/plugins/minos-database-lmdb/LICENSE new file mode 100644 index 000000000..4daf85bf2 --- /dev/null +++ b/packages/plugins/minos-database-lmdb/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Clariteia + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/plugins/minos-database-lmdb/Makefile b/packages/plugins/minos-database-lmdb/Makefile new file mode 100644 index 000000000..2016f9e38 --- /dev/null +++ b/packages/plugins/minos-database-lmdb/Makefile @@ -0,0 +1,37 @@ +.PHONY: docs + +lint: + poetry run flake8 + +test: + poetry run pytest + +coverage: + poetry run coverage run -m pytest + poetry run coverage report -m + poetry run coverage xml + +reformat: + poetry run black --line-length 120 minos tests + poetry run isort minos tests + +release: + $(MAKE) dist + poetry publish + +dist: + poetry build + ls -l dist + +install: + poetry install + +update: + poetry update + +check: + $(MAKE) install + $(MAKE) reformat + $(MAKE) lint + $(MAKE) test + $(MAKE) dist diff --git a/packages/plugins/minos-database-lmdb/README.md b/packages/plugins/minos-database-lmdb/README.md new file mode 100644 index 000000000..caf05926b --- /dev/null +++ b/packages/plugins/minos-database-lmdb/README.md @@ -0,0 +1,55 @@ +

+ Minos logo +

+ +## minos-database-lmdb + +[![PyPI Latest Release](https://img.shields.io/pypi/v/minos-database-lmdb.svg)](https://pypi.org/project/minos-database-lmdb/) +[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/minos-framework/minos-python/pages%20build%20and%20deployment?label=docs)](https://minos-framework.github.io/minos-python) +[![License](https://img.shields.io/github/license/minos-framework/minos-python.svg)](https://github.com/minos-framework/minos-python/blob/main/LICENSE) +[![Coverage](https://codecov.io/github/minos-framework/minos-python/coverage.svg?branch=main)](https://codecov.io/gh/minos-framework/minos-python) +[![Stack Overflow](https://img.shields.io/badge/Stack%20Overflow-Ask%20a%20question-green)](https://stackoverflow.com/questions/tagged/minos) + +## Summary + +Minos is a framework which helps you create [reactive](https://www.reactivemanifesto.org/) microservices in Python. Internally, it leverages Event Sourcing, CQRS and a message driven architecture to fulfil the commitments of an asynchronous environment. + +## Installation + +Install the dependency: + +```shell +pip install minos-database-lmdb +``` + +Set the database client on the `config.yml` file: + +```yaml +... +databases: + saga: + client: minos.plugins.lmdb.LmdbDatabaseClient + path: "./saga.lmdb" + ... +... +``` + +## Documentation + +The official API Reference is publicly available at the [GitHub Pages](https://minos-framework.github.io/minos-python). + +## Source Code + +The source code of this project is hosted at the [GitHub Repository](https://github.com/minos-framework/minos-python). + +## Getting Help + +For usage questions, the best place to go to is [StackOverflow](https://stackoverflow.com/questions/tagged/minos). + +## Discussion and Development + +Most development discussions take place over the [GitHub Issues](https://github.com/minos-framework/minos-python/issues). In addition, a [Gitter channel](https://gitter.im/minos-framework/community) is available for development-related questions. + +## License + +This project is distributed under the [MIT](https://raw.githubusercontent.com/minos-framework/minos-python/main/LICENSE) license. diff --git a/packages/plugins/minos-database-lmdb/RUNTHETESTS.md b/packages/plugins/minos-database-lmdb/RUNTHETESTS.md new file mode 100644 index 000000000..386e2b0e7 --- /dev/null +++ b/packages/plugins/minos-database-lmdb/RUNTHETESTS.md @@ -0,0 +1,20 @@ +# Run the tests + +In order to run the tests, please make sure you have the `Docker Engine `_ +and `Docker Compose `_ installed. + +Move into tests/ directory + +`cd tests/` + +Run service dependencies: + +`docker-compose up -d` + +Install library dependencies: + +`make install` + +Run tests: + +`make test` diff --git a/packages/plugins/minos-database-lmdb/minos/plugins/lmdb/__init__.py b/packages/plugins/minos-database-lmdb/minos/plugins/lmdb/__init__.py new file mode 100644 index 000000000..9995ff1b2 --- /dev/null +++ b/packages/plugins/minos-database-lmdb/minos/plugins/lmdb/__init__.py @@ -0,0 +1,16 @@ +"""The lmdb plugin of the Minos Framework.""" + +__author__ = "Minos Framework Devs" +__email__ = "hey@minos.run" +__version__ = "0.7.0" + +from .clients import ( + LmdbDatabaseClient, +) +from .factories import ( + LmdbSagaExecutionDatabaseOperationFactory, +) +from .operations import ( + LmdbDatabaseOperation, + LmdbDatabaseOperationType, +) diff --git a/packages/plugins/minos-database-lmdb/minos/plugins/lmdb/clients.py b/packages/plugins/minos-database-lmdb/minos/plugins/lmdb/clients.py new file mode 100644 index 000000000..91b116f4b --- /dev/null +++ b/packages/plugins/minos-database-lmdb/minos/plugins/lmdb/clients.py @@ -0,0 +1,137 @@ +"""This module contains the implementation of the lmdb client.""" + +from __future__ import ( + annotations, +) + +from pathlib import ( + Path, +) +from typing import ( + Any, + Optional, + Union, +) + +from lmdb import ( + Environment, +) + +from minos.common import ( + DatabaseClient, + DatabaseOperation, + MinosBinaryProtocol, + MinosJsonBinaryProtocol, +) + +from .operations import ( + LmdbDatabaseOperation, + LmdbDatabaseOperationType, +) + +not_found_sentinel = object() + + +class LmdbDatabaseClient(DatabaseClient): + """Lmdb Database Client class.""" + + _environment: Optional[Environment] + + def __init__( + self, + path: Optional[Union[str, Path]] = None, + max_tables: int = 100, + map_size: int = int(1e9), + protocol: type[MinosBinaryProtocol] = MinosJsonBinaryProtocol, + *args, + **kwargs, + ): + super().__init__(*args, **kwargs) + if path is None: + path = ".lmdb" + + self._path = path + self._max_tables = max_tables + self._map_size = map_size + self._protocol = protocol + self._tables = {} + + self._prefetched = not_found_sentinel + + self._environment = None + + async def _setup(self) -> None: + await super()._setup() + self._create_environment() + + async def _destroy(self) -> None: + await super()._destroy() + self._close_environment() + + def _create_environment(self) -> None: + self._environment = Environment(str(self._path), max_dbs=self._max_tables, map_size=self._map_size) + + def _close_environment(self) -> None: + if self._environment is not None: + self._environment.close() + + async def _reset(self, **kwargs) -> None: + self._prefetched = None + self._environment.sync() + + async def _fetch_all(self, *args, **kwargs) -> Any: + if self._prefetched is not_found_sentinel: + return + prefetched = self._prefetched + self._prefetched = not_found_sentinel + yield prefetched + + async def _execute(self, operation: DatabaseOperation) -> None: + if not isinstance(operation, LmdbDatabaseOperation): + raise ValueError(f"The operation must be a {LmdbDatabaseOperation!r} instance. Obtained: {operation!r}") + + mapper = { + LmdbDatabaseOperationType.CREATE: self._create, + LmdbDatabaseOperationType.READ: self._read, + LmdbDatabaseOperationType.UPDATE: self._update, + LmdbDatabaseOperationType.DELETE: self._delete, + } + + fn = mapper[operation.type_] + + fn(table=operation.table, key=operation.key, value=operation.value) + + # noinspection PyUnusedLocal + def _create(self, table: str, key: str, value: Any, **kwargs) -> None: + table = self._get_table(table) + with self._environment.begin(write=True) as transaction: + encoded = self._protocol.encode(value) + transaction.put(key.encode(), encoded, db=table) + + # noinspection PyUnusedLocal + def _read(self, table: str, key: str, **kwargs): + table = self._get_table(table) + with self._environment.begin(db=table) as transaction: + value = transaction.get(key.encode(), default=not_found_sentinel) + if value is not not_found_sentinel: + value = self._protocol.decode(value) + + self._prefetched = value + + # noinspection PyUnusedLocal + def _delete(self, table: str, key: str, **kwargs) -> None: + table = self._get_table(table) + with self._environment.begin(write=True, db=table) as transaction: + transaction.delete(key.encode()) + + # noinspection PyUnusedLocal + def _update(self, table: str, key: str, value: Any, **kwargs) -> None: + table = self._get_table(table) + with self._environment.begin(write=True, db=table) as transaction: + encoded = self._protocol.encode(value) + transaction.put(key.encode(), encoded, db=table, overwrite=True) + + def _get_table(self, table: str) -> Any: + if table not in self._tables: + self._tables[table] = self._environment.open_db(table.encode()) + return self._tables[table] diff --git a/packages/plugins/minos-database-lmdb/minos/plugins/lmdb/factories/__init__.py b/packages/plugins/minos-database-lmdb/minos/plugins/lmdb/factories/__init__.py new file mode 100644 index 000000000..c4229a23b --- /dev/null +++ b/packages/plugins/minos-database-lmdb/minos/plugins/lmdb/factories/__init__.py @@ -0,0 +1,3 @@ +from .saga import ( + LmdbSagaExecutionDatabaseOperationFactory, +) diff --git a/packages/plugins/minos-database-lmdb/minos/plugins/lmdb/factories/saga/__init__.py b/packages/plugins/minos-database-lmdb/minos/plugins/lmdb/factories/saga/__init__.py new file mode 100644 index 000000000..b81951056 --- /dev/null +++ b/packages/plugins/minos-database-lmdb/minos/plugins/lmdb/factories/saga/__init__.py @@ -0,0 +1,3 @@ +from .executions import ( + LmdbSagaExecutionDatabaseOperationFactory, +) diff --git a/packages/plugins/minos-database-lmdb/minos/plugins/lmdb/factories/saga/executions.py b/packages/plugins/minos-database-lmdb/minos/plugins/lmdb/factories/saga/executions.py new file mode 100644 index 000000000..a3919f478 --- /dev/null +++ b/packages/plugins/minos-database-lmdb/minos/plugins/lmdb/factories/saga/executions.py @@ -0,0 +1,63 @@ +from uuid import ( + UUID, +) + +from minos.common import ( + DatabaseOperation, +) +from minos.saga import ( + SagaExecutionDatabaseOperationFactory, +) + +from ...clients import ( + LmdbDatabaseClient, +) +from ...operations import ( + LmdbDatabaseOperation, + LmdbDatabaseOperationType, +) + + +class LmdbSagaExecutionDatabaseOperationFactory(SagaExecutionDatabaseOperationFactory): + """Lmdb Saga Execution Database Operation Factory class.""" + + # noinspection PyMethodMayBeStatic + def build_table_name(self) -> str: + """Get the table name. + + :return: A ``str`` value. + """ + return "LocalState" + + def build_store(self, uuid: UUID, **kwargs) -> DatabaseOperation: + """Build the database operation to store a saga execution. + + :param uuid: The identifier of the saga execution. + :param kwargs: The attributes of the saga execution. + :return: A ``DatabaseOperation`` instance. + """ + key = str(uuid) + value = kwargs | {"uuid": str(uuid)} + + return LmdbDatabaseOperation(LmdbDatabaseOperationType.CREATE, self.build_table_name(), key, value) + + def build_load(self, uuid: UUID) -> DatabaseOperation: + """Build the database operation to load a saga execution. + + :param uuid: The identifier of the saga execution. + :return: A ``DatabaseOperation`` instance. + """ + key = str(uuid) + return LmdbDatabaseOperation(LmdbDatabaseOperationType.READ, self.build_table_name(), key) + + def build_delete(self, uuid: UUID) -> DatabaseOperation: + """Build the database operation to delete a saga execution. + + :param uuid: The identifier of the saga execution. + :return: A ``DatabaseOperation`` instance. + """ + key = str(uuid) + return LmdbDatabaseOperation(LmdbDatabaseOperationType.DELETE, self.build_table_name(), key) + + +LmdbDatabaseClient.set_factory(SagaExecutionDatabaseOperationFactory, LmdbSagaExecutionDatabaseOperationFactory) diff --git a/packages/plugins/minos-database-lmdb/minos/plugins/lmdb/operations.py b/packages/plugins/minos-database-lmdb/minos/plugins/lmdb/operations.py new file mode 100644 index 000000000..908a4abd7 --- /dev/null +++ b/packages/plugins/minos-database-lmdb/minos/plugins/lmdb/operations.py @@ -0,0 +1,33 @@ +from enum import ( + Enum, +) +from typing import ( + Any, + Optional, +) + +from minos.common import ( + DatabaseOperation, +) + + +class LmdbDatabaseOperationType(str, Enum): + """Lmdb Database Operation Type class.""" + + CREATE = "create" + READ = "read" + UPDATE = "update" + DELETE = "delete" + + +class LmdbDatabaseOperation(DatabaseOperation): + """Lmdb Database Operation class.""" + + def __init__( + self, type_: LmdbDatabaseOperationType, table: str, key: str, value: Optional[Any] = None, *args, **kwargs + ): + super().__init__(*args, **kwargs) + self.type_ = type_ + self.table = table + self.key = key + self.value = value diff --git a/packages/plugins/minos-database-lmdb/poetry.lock b/packages/plugins/minos-database-lmdb/poetry.lock new file mode 100644 index 000000000..ed23b8b18 --- /dev/null +++ b/packages/plugins/minos-database-lmdb/poetry.lock @@ -0,0 +1,792 @@ +[[package]] +name = "aiomisc" +version = "15.7.3" +description = "aiomisc - miscellaneous utils for asyncio" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +colorlog = "*" + +[package.extras] +aiohttp = ["aiohttp"] +asgi = ["aiohttp-asgi"] +carbon = ["aiocarbon (>=0.15,<1.0)"] +contextvars = ["contextvars (>=2.4,<3.0)"] +cron = ["croniter (>=0.3.34,<0.4.0)"] +develop = ["aiocontextvars (==0.2.2)", "aiohttp-asgi", "aiohttp (<4)", "async-timeout", "coveralls", "croniter (>=0.3.34,<0.4.0)", "fastapi", "freezegun (<1.1)", "mypy (>=0.782,<1.0)", "pylava", "pytest", "pytest-cov (>=3.0,<4.0)", "pytest-freezegun (>=0.4.2,<0.5.0)", "pytest-rst", "pytest-subtests", "rich", "setproctitle", "sphinx-autobuild", "sphinx-intl", "sphinx (>=3.5.1)", "timeout-decorator", "tox (>=2.4)", "types-croniter"] +raven = ["raven-aiohttp"] +uvloop = ["uvloop (>=0.14,<1)"] + +[[package]] +name = "atomicwrites" +version = "1.4.0" +description = "Atomic file writes." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "attrs" +version = "21.4.0" +description = "Classes Without Boilerplate" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.extras] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] +docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] + +[[package]] +name = "black" +version = "22.3.0" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "cached-property" +version = "1.5.2" +description = "A decorator for caching properties in classes." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "click" +version = "8.1.3" +description = "Composable command line interface toolkit" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.4" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "colorlog" +version = "6.6.0" +description = "Add colours to the output of Python's logging module." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} + +[package.extras] +development = ["black", "flake8", "mypy", "pytest", "types-colorama"] + +[[package]] +name = "coverage" +version = "6.3.2" +description = "Code coverage measurement for Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "crontab" +version = "0.23.0" +description = "Parse and use crontab schedules in Python" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "dependency-injector" +version = "4.39.1" +description = "Dependency injection framework for Python" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = ">=1.7.0,<=1.16.0" + +[package.extras] +aiohttp = ["aiohttp"] +flask = ["flask"] +pydantic = ["pydantic"] +yaml = ["pyyaml"] + +[[package]] +name = "fastavro" +version = "1.4.11" +description = "Fast read/write of AVRO files" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +codecs = ["python-snappy", "zstandard", "lz4"] +lz4 = ["lz4"] +snappy = ["python-snappy"] +zstandard = ["zstandard"] + +[[package]] +name = "flake8" +version = "4.0.1" +description = "the modular source code checker: pep8 pyflakes and co" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +mccabe = ">=0.6.0,<0.7.0" +pycodestyle = ">=2.8.0,<2.9.0" +pyflakes = ">=2.4.0,<2.5.0" + +[[package]] +name = "iniconfig" +version = "1.1.1" +description = "iniconfig: brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "isort" +version = "5.10.1" +description = "A Python utility / library to sort Python imports." +category = "dev" +optional = false +python-versions = ">=3.6.1,<4.0" + +[package.extras] +pipfile_deprecated_finder = ["pipreqs", "requirementslib"] +requirements_deprecated_finder = ["pipreqs", "pip-api"] +colors = ["colorama (>=0.4.3,<0.5.0)"] +plugins = ["setuptools"] + +[[package]] +name = "lmdb" +version = "1.3.0" +description = "Universal Python binding for the LMDB 'Lightning' Database" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "mccabe" +version = "0.6.1" +description = "McCabe checker, plugin for flake8" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "minos-microservice-aggregate" +version = "0.7.0" +description = "The Aggregate pattern of the Minos Framework" +category = "main" +optional = false +python-versions = "^3.9" +develop = true + +[package.dependencies] +cached-property = "^1.5.2" +minos-microservice-common = "^0.7.0*" +minos-microservice-networks = "^0.7.0*" + +[package.source] +type = "directory" +url = "../../core/minos-microservice-aggregate" + +[[package]] +name = "minos-microservice-common" +version = "0.7.0" +description = "The common core of the Minos Framework" +category = "main" +optional = false +python-versions = "^3.9" +develop = true + +[package.dependencies] +aiomisc = ">=14.0.3,<15.8.0" +cached-property = "^1.5.2" +dependency-injector = "^4.32.2" +fastavro = "^1.4.0" +orjson = "^3.5.2" +PyYAML = ">=5.4.1,<7.0.0" +uvloop = "^0.16.0" + +[package.source] +type = "directory" +url = "../../core/minos-microservice-common" + +[[package]] +name = "minos-microservice-networks" +version = "0.7.0" +description = "The networks core of the Minos Framework" +category = "main" +optional = false +python-versions = "^3.9" +develop = true + +[package.dependencies] +crontab = "^0.23.0" +minos-microservice-common = "^0.7.0*" + +[package.source] +type = "directory" +url = "../../core/minos-microservice-networks" + +[[package]] +name = "minos-microservice-saga" +version = "0.7.0" +description = "The SAGA pattern of the Minos Framework" +category = "main" +optional = false +python-versions = "^3.9" +develop = true + +[package.dependencies] +cached-property = "^1.5.2" +minos-microservice-aggregate = "^0.7.0*" +minos-microservice-common = "^0.7.0*" +minos-microservice-networks = "^0.7.0*" + +[package.source] +type = "directory" +url = "../../core/minos-microservice-saga" + +[[package]] +name = "mypy-extensions" +version = "0.4.3" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "orjson" +version = "3.6.8" +description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "packaging" +version = "21.3" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" + +[[package]] +name = "pathspec" +version = "0.9.0" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[[package]] +name = "platformdirs" +version = "2.5.2" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] +test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pycodestyle" +version = "2.8.0" +description = "Python style guide checker" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pyflakes" +version = "2.4.0" +description = "passive checker of Python programs" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pyparsing" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +category = "dev" +optional = false +python-versions = ">=3.6.8" + +[package.extras] +diagrams = ["railroad-diagrams", "jinja2"] + +[[package]] +name = "pytest" +version = "7.1.2" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +py = ">=1.8.2" +tomli = ">=1.0.0" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "pyyaml" +version = "6.0" +description = "YAML parser and emitter for Python" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "typing-extensions" +version = "4.2.0" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "uvloop" +version = "0.16.0" +description = "Fast implementation of asyncio event loop on top of libuv" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +dev = ["Cython (>=0.29.24,<0.30.0)", "pytest (>=3.6.0)", "Sphinx (>=4.1.2,<4.2.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "psutil", "pycodestyle (>=2.7.0,<2.8.0)", "pyOpenSSL (>=19.0.0,<19.1.0)", "mypy (>=0.800)"] +docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)"] +test = ["aiohttp", "flake8 (>=3.9.2,<3.10.0)", "psutil", "pycodestyle (>=2.7.0,<2.8.0)", "pyOpenSSL (>=19.0.0,<19.1.0)", "mypy (>=0.800)"] + +[metadata] +lock-version = "1.1" +python-versions = "^3.9" +content-hash = "a5014ce6fcb07d6f9f1f2437093513fa25d2f20ba4463197773ff28b96a5ef35" + +[metadata.files] +aiomisc = [ + {file = "aiomisc-15.7.3-py3-none-any.whl", hash = "sha256:0403e83268e98d0f2a125a70d13303fe1a2358e36db3daf02df032c7fa4f1525"}, + {file = "aiomisc-15.7.3.tar.gz", hash = "sha256:ba250a34bd4609ced36111cb50580f57c3d52f3955f953a53ecb2986988baedc"}, +] +atomicwrites = [ + {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, + {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, +] +attrs = [ + {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, + {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, +] +black = [ + {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"}, + {file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"}, + {file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"}, + {file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"}, + {file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"}, + {file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"}, + {file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"}, + {file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"}, + {file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"}, + {file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"}, + {file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"}, + {file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"}, + {file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"}, + {file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"}, + {file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"}, + {file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"}, + {file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"}, + {file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"}, +] +cached-property = [ + {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, + {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, +] +click = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] +colorama = [ + {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, +] +colorlog = [ + {file = "colorlog-6.6.0-py2.py3-none-any.whl", hash = "sha256:351c51e866c86c3217f08e4b067a7974a678be78f07f85fc2d55b8babde6d94e"}, + {file = "colorlog-6.6.0.tar.gz", hash = "sha256:344f73204009e4c83c5b6beb00b3c45dc70fcdae3c80db919e0a4171d006fde8"}, +] +coverage = [ + {file = "coverage-6.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9b27d894748475fa858f9597c0ee1d4829f44683f3813633aaf94b19cb5453cf"}, + {file = "coverage-6.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37d1141ad6b2466a7b53a22e08fe76994c2d35a5b6b469590424a9953155afac"}, + {file = "coverage-6.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9987b0354b06d4df0f4d3e0ec1ae76d7ce7cbca9a2f98c25041eb79eec766f1"}, + {file = "coverage-6.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:26e2deacd414fc2f97dd9f7676ee3eaecd299ca751412d89f40bc01557a6b1b4"}, + {file = "coverage-6.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dd8bafa458b5c7d061540f1ee9f18025a68e2d8471b3e858a9dad47c8d41903"}, + {file = "coverage-6.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:46191097ebc381fbf89bdce207a6c107ac4ec0890d8d20f3360345ff5976155c"}, + {file = "coverage-6.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6f89d05e028d274ce4fa1a86887b071ae1755082ef94a6740238cd7a8178804f"}, + {file = "coverage-6.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:58303469e9a272b4abdb9e302a780072c0633cdcc0165db7eec0f9e32f901e05"}, + {file = "coverage-6.3.2-cp310-cp310-win32.whl", hash = "sha256:2fea046bfb455510e05be95e879f0e768d45c10c11509e20e06d8fcaa31d9e39"}, + {file = "coverage-6.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:a2a8b8bcc399edb4347a5ca8b9b87e7524c0967b335fbb08a83c8421489ddee1"}, + {file = "coverage-6.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f1555ea6d6da108e1999b2463ea1003fe03f29213e459145e70edbaf3e004aaa"}, + {file = "coverage-6.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5f4e1edcf57ce94e5475fe09e5afa3e3145081318e5fd1a43a6b4539a97e518"}, + {file = "coverage-6.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a15dc0a14008f1da3d1ebd44bdda3e357dbabdf5a0b5034d38fcde0b5c234b7"}, + {file = "coverage-6.3.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21b7745788866028adeb1e0eca3bf1101109e2dc58456cb49d2d9b99a8c516e6"}, + {file = "coverage-6.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8ce257cac556cb03be4a248d92ed36904a59a4a5ff55a994e92214cde15c5bad"}, + {file = "coverage-6.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b0be84e5a6209858a1d3e8d1806c46214e867ce1b0fd32e4ea03f4bd8b2e3359"}, + {file = "coverage-6.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:acf53bc2cf7282ab9b8ba346746afe703474004d9e566ad164c91a7a59f188a4"}, + {file = "coverage-6.3.2-cp37-cp37m-win32.whl", hash = "sha256:8bdde1177f2311ee552f47ae6e5aa7750c0e3291ca6b75f71f7ffe1f1dab3dca"}, + {file = "coverage-6.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b31651d018b23ec463e95cf10070d0b2c548aa950a03d0b559eaa11c7e5a6fa3"}, + {file = "coverage-6.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:07e6db90cd9686c767dcc593dff16c8c09f9814f5e9c51034066cad3373b914d"}, + {file = "coverage-6.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2c6dbb42f3ad25760010c45191e9757e7dce981cbfb90e42feef301d71540059"}, + {file = "coverage-6.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c76aeef1b95aff3905fb2ae2d96e319caca5b76fa41d3470b19d4e4a3a313512"}, + {file = "coverage-6.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cf5cfcb1521dc3255d845d9dca3ff204b3229401994ef8d1984b32746bb45ca"}, + {file = "coverage-6.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fbbdc8d55990eac1b0919ca69eb5a988a802b854488c34b8f37f3e2025fa90d"}, + {file = "coverage-6.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ec6bc7fe73a938933d4178c9b23c4e0568e43e220aef9472c4f6044bfc6dd0f0"}, + {file = "coverage-6.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9baff2a45ae1f17c8078452e9e5962e518eab705e50a0aa8083733ea7d45f3a6"}, + {file = "coverage-6.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd9e830e9d8d89b20ab1e5af09b32d33e1a08ef4c4e14411e559556fd788e6b2"}, + {file = "coverage-6.3.2-cp38-cp38-win32.whl", hash = "sha256:f7331dbf301b7289013175087636bbaf5b2405e57259dd2c42fdcc9fcc47325e"}, + {file = "coverage-6.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:68353fe7cdf91f109fc7d474461b46e7f1f14e533e911a2a2cbb8b0fc8613cf1"}, + {file = "coverage-6.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b78e5afb39941572209f71866aa0b206c12f0109835aa0d601e41552f9b3e620"}, + {file = "coverage-6.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4e21876082ed887baed0146fe222f861b5815455ada3b33b890f4105d806128d"}, + {file = "coverage-6.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34626a7eee2a3da12af0507780bb51eb52dca0e1751fd1471d0810539cefb536"}, + {file = "coverage-6.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ebf730d2381158ecf3dfd4453fbca0613e16eaa547b4170e2450c9707665ce7"}, + {file = "coverage-6.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd6fe30bd519694b356cbfcaca9bd5c1737cddd20778c6a581ae20dc8c04def2"}, + {file = "coverage-6.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:96f8a1cb43ca1422f36492bebe63312d396491a9165ed3b9231e778d43a7fca4"}, + {file = "coverage-6.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:dd035edafefee4d573140a76fdc785dc38829fe5a455c4bb12bac8c20cfc3d69"}, + {file = "coverage-6.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5ca5aeb4344b30d0bec47481536b8ba1181d50dbe783b0e4ad03c95dc1296684"}, + {file = "coverage-6.3.2-cp39-cp39-win32.whl", hash = "sha256:f5fa5803f47e095d7ad8443d28b01d48c0359484fec1b9d8606d0e3282084bc4"}, + {file = "coverage-6.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:9548f10d8be799551eb3a9c74bbf2b4934ddb330e08a73320123c07f95cc2d92"}, + {file = "coverage-6.3.2-pp36.pp37.pp38-none-any.whl", hash = "sha256:18d520c6860515a771708937d2f78f63cc47ab3b80cb78e86573b0a760161faf"}, + {file = "coverage-6.3.2.tar.gz", hash = "sha256:03e2a7826086b91ef345ff18742ee9fc47a6839ccd517061ef8fa1976e652ce9"}, +] +crontab = [ + {file = "crontab-0.23.0.tar.gz", hash = "sha256:ca79dede9c2f572bb32f38703e8fddcf3427e86edc838f2ffe7ae4b9ee2b0733"}, +] +dependency-injector = [ + {file = "dependency-injector-4.39.1.tar.gz", hash = "sha256:9ab76dc5e19b2692aaca49e00f9b41a087138d139b0ec985f92ff0498f038772"}, + {file = "dependency_injector-4.39.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c788a3d5482e63b5fd55e14fc258f1ff0b51b411927ab132ef0f689cb5d1183f"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0832e0457a360725cd1d1037b77b85478aeeaacc60e85ecceeb8020409e7b62"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d51998fff9704fd01d11c3c48f4e88d8506cb6afa1ee41409a881a5a51dae3fc"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea484cd13fc62966bf5582df0816205feee072d18f228aac75f7807b43f223ae"}, + {file = "dependency_injector-4.39.1-cp310-cp310-win32.whl", hash = "sha256:17389e53ec29ca13570319cf2065dcc4c2f6d36db5dd792bb1e8f2c39a9f146b"}, + {file = "dependency_injector-4.39.1-cp310-cp310-win_amd64.whl", hash = "sha256:55b0988489267c5a580f419133770ffe293057f2064da1c9ad6a2cc69666739b"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b297c3e79d3633cc56366386ae1f7dbce1587673cca2f559c368c1e936a1fa94"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2728827c5abb2420c5811e218262ae1b77a48e76cc9eebc6b4f55fee48a1a18d"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:029e42b064ab8cb5b2559be040ff682c7aa81592f1654a82355475956df17803"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:305e3db3f4bf40f64caaa1303e03005174e78d2339d2ae517b34c011ec2300f9"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-win32.whl", hash = "sha256:a661dd23a5e4e2f6bf4a729de7fadbe148c9a4a298dbcadfc5a94584b6930970"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-win_amd64.whl", hash = "sha256:340d6e7af5c4729d20c837d6d1e8a2626c24a05259dff746406cc823e26ba1e7"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a1553dac1c95f0de1f910b0025ee4570ea078a07d576bcdc2168990e719cea50"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c7baaa64d93359ee08c15d68579cc803e11d9becaf961f5a66b94ff627248e1"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7a27bf1951a066cf347b886cc7ab0f37dcbd1ad59bffcfe721c8c12a189a150d"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da6e2d685f7d0c65257f08133b68d9bf74ec319b90a0f21b4f629d168ce5f68f"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-win32.whl", hash = "sha256:a8ddd03ca86e67e9d3cc038793d34fbfccab12e6145df813e72bf14f9371f2ea"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-win_amd64.whl", hash = "sha256:e01a319ea05cd86b520201386dcb53a81a5400cb82fcc2f006bd7e92c0c51a0a"}, + {file = "dependency_injector-4.39.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4704804bde25b694aa65201927937a9d82d8bc055cb3dadc68eb05988bd34fa9"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0935d50b263169e7b0826a2fb6be80d6a4f2a7c59e6dd9876f86da3243bea9eb"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3c34aa5abb1826b6189f47daf6e469d4293c1d01693233da2c1b923816270cc5"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:db64904c9b9a88756cfece3e3ed078a2b57127642711dd08af342dba8abf9667"}, + {file = "dependency_injector-4.39.1-cp38-cp38-win32.whl", hash = "sha256:66ebe728194adc8720dbc4d662edbbfa55659ff23c9c493fb2dae0bfd4df5734"}, + {file = "dependency_injector-4.39.1-cp38-cp38-win_amd64.whl", hash = "sha256:4349974620f630d6726808e1291ec99713b64d449b84eb01581ee807a5a5c224"}, + {file = "dependency_injector-4.39.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d87cad0899b05cd08931bfb68ddf7be77711a67b0649c37f2045d7808977b082"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8efd965e5cfdd9f339ec895e73c119569851adedc175088d34a670f5206fea63"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:27f69485ca6b85c31d162ee86cf6ef71bb71dce9cd2b5d0745425dfc551eefa1"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a25b63de59dff04ec78f5161f00c0222a04a23def5d1f0eda14e389a32baf428"}, + {file = "dependency_injector-4.39.1-cp39-cp39-win32.whl", hash = "sha256:a14274f50d125b4579314c355e22af07def1a96641ca94bd75edcf1400b89477"}, + {file = "dependency_injector-4.39.1-cp39-cp39-win_amd64.whl", hash = "sha256:9950039d00625f9252cd26378a4406342b256886bb61e4db8b65e9f01270f53e"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6d7f39cd54678741e132e13da3a1367ac18058cbda61fe39d61c8583aa6fd757"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2368c7ba3c9ffaf816ea0f2d14c78d481491b805f62ac8496a78a51397d4689"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:84e32407bb16c58aa0d4b5ed8485537bc66ccc14cfffae7022f1204e35ec939a"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f2d80a42c546e1f934d427b071630d86653cd4a60c74b570c4ffb03025c1f1f9"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ca126bbed370b8c002c859ebeb76f6d83eba2d7fb5d66f37f47cfc19661d2889"}, +] +fastavro = [ + {file = "fastavro-1.4.11-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:44f01008f95d685edacc4b10366c755d25612df00924349f7d34a29f08522ce3"}, + {file = "fastavro-1.4.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18f5e736d12e67348f253da8a332d7c3b483ca04f2b6e772befa79d1a46bac9d"}, + {file = "fastavro-1.4.11-cp310-cp310-win_amd64.whl", hash = "sha256:8dca11bc3191cd7de0a3c4b76a70dac493356a219e96ebcde0def1f06faddef7"}, + {file = "fastavro-1.4.11-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:7a2a0bf03686f9d860e8f8476be000f5b3e6cc9af6853dbabab2ef9cfa5dc3a0"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c17e3decfac260e1be4d02d1903d2483eec2f3ce7f92c9b808a0f6a81572c4b"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19ba25c6529f50722a7618cc4ca24c7d265def57fd9f94e4e554e1df8cce38d2"}, + {file = "fastavro-1.4.11-cp37-cp37m-win_amd64.whl", hash = "sha256:ceaba04da9419f40899a670eb62eb373a127b511bb8e3ae4f6f1f23ec49bd0e4"}, + {file = "fastavro-1.4.11-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:732eab3a1ae5d2c3f4b52e747c55bcc41c4df0eb7e8a395038080741a3c0a934"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c03d3c802b71f44e7b3442abae961bba996258244bd222b242ad1e5cb7754e57"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cb7475a9b25b9f8aebe7eb756dafedd0369434571062f3883d894281befd7c"}, + {file = "fastavro-1.4.11-cp38-cp38-win_amd64.whl", hash = "sha256:ce0776f54591aef90bcd02bd919964abe4c2ad2a10a4336c3a1b66cef289b41c"}, + {file = "fastavro-1.4.11-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:621e72cc365c9539d7590e7b43e48a62e6bfb4c2de7c16837fed54d113d7312c"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:842b25782f911ee8c626f9d9fedc2ef01aeac272536fe90ee6d45b2ae7cdb024"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8491bfcba25c9d661289f884688e5a4f56f2ee389a240d0ad02692495a9a087"}, + {file = "fastavro-1.4.11-cp39-cp39-win_amd64.whl", hash = "sha256:c94130a8c8d80073eb0276844915aa5e928ae322024e76dc57943542ccda211c"}, + {file = "fastavro-1.4.11.tar.gz", hash = "sha256:7c64332ad52de0134be9a933ca986514c3ff85c63d54bc5398c31f0498ac1820"}, +] +flake8 = [ + {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, + {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, +] +iniconfig = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] +isort = [ + {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, + {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, +] +lmdb = [ + {file = "lmdb-1.3.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:63cb73fe7ce9eb93d992d632c85a0476b4332670d9e6a2802b5062f603b7809f"}, + {file = "lmdb-1.3.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:abbc439cd9fe60ffd6197009087ea885ac150017dc85384093b1d376f83f0ec4"}, + {file = "lmdb-1.3.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6260a526e4ad85b1f374a5ba9475bf369fb07e7728ea6ec57226b02c40d1976b"}, + {file = "lmdb-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e568ae0887ae196340947d9800136e90feaed6b86a261ef01f01b2ba65fc8106"}, + {file = "lmdb-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6a816954d212f40fd15007cd81ab7a6bebb77436d949a6a9ae04af57fc127f3"}, + {file = "lmdb-1.3.0-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:fa6439356e591d3249ab0e1778a6f8d8408e993f66dc911914c78208f5310309"}, + {file = "lmdb-1.3.0-cp35-cp35m-win_amd64.whl", hash = "sha256:c6adbd6f7f9048e97f31a069e652eb51020a81e80a0ce92dbb9810d21da2409a"}, + {file = "lmdb-1.3.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:eefb392f6b5cd43aada49258c5a79be11cb2c8cd3fc3e2d9319a1e0b9f906458"}, + {file = "lmdb-1.3.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a14aca2651c3af6f0d0a6b9168200eea0c8f2d27c40b01a442f33329a6e8dff"}, + {file = "lmdb-1.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cfa4aa9c67f8aee89b23005e98d1f3f32490b6b905fd1cb604b207cbd5755ab"}, + {file = "lmdb-1.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7da05d70fcc6561ac6b09e9fb1bf64b7ca294652c64c8a2889273970cee796b9"}, + {file = "lmdb-1.3.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:008243762decf8f6c90430a9bced56290ebbcdb5e877d90e42343bb97033e494"}, + {file = "lmdb-1.3.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:17215a42a4b9814c383deabecb160581e4fb75d00198eef0e3cea54f230ffbea"}, + {file = "lmdb-1.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65334eafa5d430b18d81ebd5362559a41483c362e1931f6e1b15bab2ecb7d75d"}, + {file = "lmdb-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:18c69fabdaf04efaf246587739cc1062b3e57c6ef0743f5c418df89e5e7e7b9b"}, + {file = "lmdb-1.3.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:41318717ab5d15ad2d6d263d34fbf614a045210f64b25e59ce734bb2105e421f"}, + {file = "lmdb-1.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:df2724bad7820114a205472994091097d0fa65a3e5fff5a8e688d123fb8c6326"}, + {file = "lmdb-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ddd590e1c7fcb395931aa3782fb89b9db4550ab2d81d006ecd239e0d462bc41"}, + {file = "lmdb-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:4172fba19417d7b29409beca7d73c067b54e5d8ab1fb9b51d7b4c1445d20a167"}, + {file = "lmdb-1.3.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2df38115dd9428a54d59ae7c712a4c7cce0d6b1d66056de4b1a8c38718066106"}, + {file = "lmdb-1.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d9103aa4908f0bca43c5911ca067d4e3d01f682dff0c0381a1239bd2bd757984"}, + {file = "lmdb-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:394df860c3f93cfd92b6f4caba785f38208cc9614c18b3803f83a2cc1695042f"}, + {file = "lmdb-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:62ab28e3593bdc318ea2f2fa1574e5fca3b6d1f264686d773ba54a637d4f563b"}, + {file = "lmdb-1.3.0-pp27-pypy_73-macosx_10_7_x86_64.whl", hash = "sha256:e6a704b3baced9182836c7f77b769f23856f3a8f62d0282b1bc1feaf81a86712"}, + {file = "lmdb-1.3.0-pp27-pypy_73-win_amd64.whl", hash = "sha256:08f4b5129f4683802569b02581142e415c8dcc0ff07605983ec1b07804cecbad"}, + {file = "lmdb-1.3.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:f291e3f561f58dddf63a92a5a6a4b8af3a0920b6705d35e2f80e52e86ee238a2"}, + {file = "lmdb-1.3.0.tar.gz", hash = "sha256:60a11efc21aaf009d06518996360eed346f6000bfc9de05114374230879f992e"}, +] +mccabe = [ + {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, + {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, +] +minos-microservice-aggregate = [] +minos-microservice-common = [] +minos-microservice-networks = [] +minos-microservice-saga = [] +mypy-extensions = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] +orjson = [ + {file = "orjson-3.6.8-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:3a287a650458de2211db03681b71c3e5cb2212b62f17a39df8ad99fc54855d0f"}, + {file = "orjson-3.6.8-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:5204e25c12cea58e524fc82f7c27ed0586f592f777b33075a92ab7b3eb3687c2"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77e8386393add64f959c044e0fb682364fd0e611a6f477aa13f0e6a733bd6a28"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:279f2d2af393fdf8601020744cb206b91b54ad60fb8401e0761819c7bda1f4e4"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:c31c9f389be7906f978ed4192eb58a4b74a37ad60556a0b88ddc47c576697770"}, + {file = "orjson-3.6.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0db5c5a0c5b89f092d52f6e5a3701660a9d6ffa9e2968b3ce17c2bc4f5eb0414"}, + {file = "orjson-3.6.8-cp310-none-win_amd64.whl", hash = "sha256:eb22485847b9a0c4bbedc668df860126ac931edbed1d456cf41a59f3cb961ed8"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:1a5fe569310bc819279bd4d5f2c349910b104ed3207936246dd5d5e0b085e74a"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:ccb356a47ab1067cd3549847e9db1d279a63fe0482d315b3ffd6e7abef35ef77"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab29c069c222248ce302a25855b4e1664f9436e8ae5a131fb0859daf31676d2b"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2b5e4cba9e774ac011071d9d27760f97f4b8cd46003e971d122e712f971345"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:c311ec504414d22834d5b972a209619925b48263856a11a14d90230f9682d49c"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:a3dfec7950b90fb8d143743503ee53fa06b32e6068bdea792fc866284da3d71d"}, + {file = "orjson-3.6.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b890dbbada2cbb26eb29bd43a848426f007f094bb0758df10dfe7a438e1cb4b4"}, + {file = "orjson-3.6.8-cp37-none-win_amd64.whl", hash = "sha256:9143ae2c52771525be9ad11a7a8cc8e7fd75391b107e7e644a9e0050496f6b4f"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:33a82199fd42f6436f833e210ae5129c922a5c355629356ca7a8e82964da7285"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:90159ea8b9a5a2a98fa33dc7b421cfac4d2ae91ba5e1058f5909e7f059f6b467"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:656fbe15d9ef0733e740d9def78f4fdb4153102f4836ee774a05123499005931"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7be3be6153843e0f01351b1313a5ad4723595427680dac2dfff22a37e652ce02"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:dd24f66b6697ee7424f7da575ec6cbffc8ede441114d53470949cda4d97c6e56"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:b07c780f7345ecf5901356dc21dee0669defc489c38ce7b9ab0f5e008cc0385c"}, + {file = "orjson-3.6.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ea32015a5d8a4ce00d348a0de5dc7040e0ad58f970a8fcbb5713a1eac129e493"}, + {file = "orjson-3.6.8-cp38-none-win_amd64.whl", hash = "sha256:c5a3e382194c838988ec128a26b08aa92044e5e055491cc4056142af0c1c54d7"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:83a8424e857ae1bf53530e88b4eb2f16ca2b489073b924e655f1575cacd7f52a"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:81e1a6a2d67f15007dadacbf9ba5d3d79237e5e33786c028557fe5a2b72f1c9a"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:137b539881c77866eba86ff6a11df910daf2eb9ab8f1acae62f879e83d7c38af"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cbd358f3b3ad539a27e36900e8e7d172d0e1b72ad9dd7d69544dcbc0f067ee7"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:6ab94701542d40b90903ecfc339333f458884979a01cb9268bc662cc67a5f6d8"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:32b6f26593a9eb606b40775826beb0dac152e3d224ea393688fced036045a821"}, + {file = "orjson-3.6.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:afd9e329ebd3418cac3cd747769b1d52daa25fa672bbf414ab59f0e0881b32b9"}, + {file = "orjson-3.6.8-cp39-none-win_amd64.whl", hash = "sha256:0c89b419914d3d1f65a1b0883f377abe42a6e44f6624ba1c63e8846cbfc2fa60"}, + {file = "orjson-3.6.8.tar.gz", hash = "sha256:e19d23741c5de13689bb316abfccea15a19c264e3ec8eb332a5319a583595ace"}, +] +packaging = [ + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, +] +pathspec = [ + {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, + {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, +] +platformdirs = [ + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, +] +pluggy = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] +py = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] +pycodestyle = [ + {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"}, + {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"}, +] +pyflakes = [ + {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, + {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, +] +pyparsing = [ + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, +] +pytest = [ + {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, + {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"}, +] +pyyaml = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] +six = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] +tomli = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] +typing-extensions = [ + {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, + {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, +] +uvloop = [ + {file = "uvloop-0.16.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6224f1401025b748ffecb7a6e2652b17768f30b1a6a3f7b44660e5b5b690b12d"}, + {file = "uvloop-0.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:30ba9dcbd0965f5c812b7c2112a1ddf60cf904c1c160f398e7eed3a6b82dcd9c"}, + {file = "uvloop-0.16.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bd53f7f5db562f37cd64a3af5012df8cac2c464c97e732ed556800129505bd64"}, + {file = "uvloop-0.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:772206116b9b57cd625c8a88f2413df2fcfd0b496eb188b82a43bed7af2c2ec9"}, + {file = "uvloop-0.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b572256409f194521a9895aef274cea88731d14732343da3ecdb175228881638"}, + {file = "uvloop-0.16.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:04ff57aa137230d8cc968f03481176041ae789308b4d5079118331ab01112450"}, + {file = "uvloop-0.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a19828c4f15687675ea912cc28bbcb48e9bb907c801873bd1519b96b04fb805"}, + {file = "uvloop-0.16.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e814ac2c6f9daf4c36eb8e85266859f42174a4ff0d71b99405ed559257750382"}, + {file = "uvloop-0.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bd8f42ea1ea8f4e84d265769089964ddda95eb2bb38b5cbe26712b0616c3edee"}, + {file = "uvloop-0.16.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:647e481940379eebd314c00440314c81ea547aa636056f554d491e40503c8464"}, + {file = "uvloop-0.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e0d26fa5875d43ddbb0d9d79a447d2ace4180d9e3239788208527c4784f7cab"}, + {file = "uvloop-0.16.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6ccd57ae8db17d677e9e06192e9c9ec4bd2066b77790f9aa7dede2cc4008ee8f"}, + {file = "uvloop-0.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:089b4834fd299d82d83a25e3335372f12117a7d38525217c2258e9b9f4578897"}, + {file = "uvloop-0.16.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98d117332cc9e5ea8dfdc2b28b0a23f60370d02e1395f88f40d1effd2cb86c4f"}, + {file = "uvloop-0.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e5f2e2ff51aefe6c19ee98af12b4ae61f5be456cd24396953244a30880ad861"}, + {file = "uvloop-0.16.0.tar.gz", hash = "sha256:f74bc20c7b67d1c27c72601c78cf95be99d5c2cdd4514502b4f3eb0933ff1228"}, +] diff --git a/packages/plugins/minos-database-lmdb/poetry.toml b/packages/plugins/minos-database-lmdb/poetry.toml new file mode 100644 index 000000000..ab1033bd3 --- /dev/null +++ b/packages/plugins/minos-database-lmdb/poetry.toml @@ -0,0 +1,2 @@ +[virtualenvs] +in-project = true diff --git a/packages/plugins/minos-database-lmdb/pyproject.toml b/packages/plugins/minos-database-lmdb/pyproject.toml new file mode 100644 index 000000000..45f6b469f --- /dev/null +++ b/packages/plugins/minos-database-lmdb/pyproject.toml @@ -0,0 +1,51 @@ +[tool.poetry] +name = "minos-database-lmdb" +version = "0.7.0" +description = "The lmdb plugin of the Minos Framework" +readme = "README.md" +repository = "https://github.com/minos-framework/minos-python" +homepage = "https://www.minos.run/" +authors = ["Minos Framework Devs "] +license = "MIT" +classifiers = [ + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "Natural Language :: English", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.9", +] +keywords = [ + "clariteia", + "minos", + "microservice", + "saga", +] +packages = [ + { include = "minos" }, +] +include = [ + { path = "AUTHORS.md", format = "sdist" }, + { path = "HISTORY.md", format = "sdist" }, + { path = "LICENSE", format = "sdist" }, +] + +[tool.poetry.dependencies] +python = "^3.9" +minos-microservice-common = "^0.7.0" +minos-microservice-saga = "^0.7.0" +lmdb = "^1.2.1" + +[tool.poetry.dev-dependencies] +minos-microservice-common = { path = "../../core/minos-microservice-common", develop = true } +minos-microservice-saga = { path = "../../core/minos-microservice-saga", develop = true } +minos-microservice-networks = { path = "../../core/minos-microservice-networks", develop = true } +minos-microservice-aggregate = { path = "../../core/minos-microservice-aggregate", develop = true } +black = "^22.3" +isort = "^5.8.0" +pytest = "^7.0.1" +coverage = "^6.3" +flake8 = "^4.0.1" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/packages/plugins/minos-database-lmdb/setup.cfg b/packages/plugins/minos-database-lmdb/setup.cfg new file mode 100644 index 000000000..dbb9ac849 --- /dev/null +++ b/packages/plugins/minos-database-lmdb/setup.cfg @@ -0,0 +1,28 @@ +[coverage:run] +source = + minos + +[coverage:report] +exclude_lines = + pragma: no cover + raise NotImplementedError + if TYPE_CHECKING: + pass +precision = 2 + +[flake8] +filename = + ./minos/**/*.py, + ./tests/**/*.py, + ./examples/**/*.py +max-line-length = 120 +per-file-ignores = + ./**/__init__.py:F401,W391 + +[isort] +known_first_party=minos +multi_line_output = 3 +include_trailing_comma = True +force_grid_wrap = 1 +use_parentheses = True +line_length = 120 diff --git a/packages/plugins/minos-database-lmdb/tests/__init__.py b/packages/plugins/minos-database-lmdb/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/plugins/minos-database-lmdb/tests/test_config.yml b/packages/plugins/minos-database-lmdb/tests/test_config.yml new file mode 100644 index 000000000..1e7658440 --- /dev/null +++ b/packages/plugins/minos-database-lmdb/tests/test_config.yml @@ -0,0 +1,10 @@ +version: 2 +name: order +databases: + default: + client: minos.common.testing.MockedDatabaseClient + saga: + client: minos.plugins.lmdb.LmdbDatabaseClient + path: "./saga.lmdb" +pools: + database: minos.common.DatabaseClientPool \ No newline at end of file diff --git a/packages/plugins/minos-database-lmdb/tests/test_lmdb/__init__.py b/packages/plugins/minos-database-lmdb/tests/test_lmdb/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/plugins/minos-database-lmdb/tests/test_lmdb/test_clients.py b/packages/plugins/minos-database-lmdb/tests/test_lmdb/test_clients.py new file mode 100644 index 000000000..5c772f2ff --- /dev/null +++ b/packages/plugins/minos-database-lmdb/tests/test_lmdb/test_clients.py @@ -0,0 +1,171 @@ +import shutil +import unittest +from pathlib import ( + Path, +) + +from minos.common import ( + DatabaseClient, + DatabaseOperation, + ProgrammingException, +) +from minos.plugins.lmdb import ( + LmdbDatabaseClient, + LmdbDatabaseOperation, + LmdbDatabaseOperationType, +) +from tests.utils import ( + BASE_PATH, +) + + +class TestLmdbDatabaseClient(unittest.IsolatedAsyncioTestCase): + def setUp(self) -> None: + super().setUp() + self.path = BASE_PATH / "order.lmdb" + + def test_subclass(self) -> None: + self.assertTrue(issubclass(LmdbDatabaseClient, DatabaseClient)) + + def tearDown(self) -> None: + shutil.rmtree(self.path, ignore_errors=True) + shutil.rmtree(".lmdb", ignore_errors=True) + + async def test_constructor_default_path(self): + async with LmdbDatabaseClient(): + self.assertTrue(Path(".lmdb").exists()) + + async def test_is_valid(self): + async with LmdbDatabaseClient(self.path) as client: + self.assertTrue(await client.is_valid()) + + async def test_execute_raises_unsupported(self): + class _DatabaseOperation(DatabaseOperation): + """For testing purposes.""" + + async with LmdbDatabaseClient(self.path) as client: + with self.assertRaises(ValueError): + await client.execute(_DatabaseOperation()) + + async def test_execute_create_text(self): + create_op = LmdbDatabaseOperation(LmdbDatabaseOperationType.CREATE, "TestOne", "first", "Text Value") + read_op = LmdbDatabaseOperation(LmdbDatabaseOperationType.READ, "TestOne", "first") + + async with LmdbDatabaseClient(self.path) as client: + await client.execute(create_op) + await client.execute(read_op) + + self.assertEqual("Text Value", await client.fetch_one()) + + async def test_execute_create_int(self): + create_op = LmdbDatabaseOperation(LmdbDatabaseOperationType.CREATE, "TestOne", "first", 123) + read_op = LmdbDatabaseOperation(LmdbDatabaseOperationType.READ, "TestOne", "first") + + async with LmdbDatabaseClient(self.path) as client: + await client.execute(create_op) + await client.execute(read_op) + + self.assertEqual(123, await client.fetch_one()) + + async def test_execute_create_dict(self): + create_op = LmdbDatabaseOperation( + LmdbDatabaseOperationType.CREATE, "TestOne", "first", {"key_one": "hello", "key_two": "minos"} + ) + read_op = LmdbDatabaseOperation(LmdbDatabaseOperationType.READ, "TestOne", "first") + + async with LmdbDatabaseClient(self.path) as client: + await client.execute(create_op) + await client.execute(read_op) + + self.assertEqual({"key_one": "hello", "key_two": "minos"}, await client.fetch_one()) + + async def test_execute_create_multi_dict(self): + create_op = LmdbDatabaseOperation( + LmdbDatabaseOperationType.CREATE, + "TestOne", + "first", + {"key_one": "hello", "key_two": {"sub_key": "this is a sub text"}}, + ) + read_op = LmdbDatabaseOperation(LmdbDatabaseOperationType.READ, "TestOne", "first") + + async with LmdbDatabaseClient(self.path) as client: + await client.execute(create_op) + await client.execute(read_op) + + self.assertEqual( + {"key_one": "hello", "key_two": {"sub_key": "this is a sub text"}}, await client.fetch_one() + ) + + async def test_execute_create_list(self): + create_op = LmdbDatabaseOperation(LmdbDatabaseOperationType.CREATE, "TestOne", "first", ["hello", "minos"]) + read_op = LmdbDatabaseOperation(LmdbDatabaseOperationType.READ, "TestOne", "first") + + async with LmdbDatabaseClient(self.path) as client: + await client.execute(create_op) + await client.execute(read_op) + + self.assertEqual(["hello", "minos"], await client.fetch_one()) + + async def test_execute_create_multi_table(self): + create_op_1 = LmdbDatabaseOperation(LmdbDatabaseOperationType.CREATE, "TestOne", "first", "Text Value") + create_op_2 = LmdbDatabaseOperation( + LmdbDatabaseOperationType.CREATE, "TestTwo", "first_double", "Text Double Value" + ) + create_op_3 = LmdbDatabaseOperation(LmdbDatabaseOperationType.CREATE, "TestTwo", "first", "Text Value Diff") + + read_op_1 = LmdbDatabaseOperation(LmdbDatabaseOperationType.READ, "TestOne", "first") + read_op_2 = LmdbDatabaseOperation(LmdbDatabaseOperationType.READ, "TestTwo", "first_double") + read_op_3 = LmdbDatabaseOperation(LmdbDatabaseOperationType.READ, "TestTwo", "first") + + async with LmdbDatabaseClient(self.path) as client: + await client.execute(create_op_1) + await client.execute(create_op_2) + await client.execute(create_op_3) + + await client.execute(read_op_1) + self.assertEqual("Text Value", await client.fetch_one()) + + await client.execute(read_op_2) + self.assertEqual("Text Double Value", await client.fetch_one()) + + await client.execute(read_op_3) + self.assertEqual("Text Value Diff", await client.fetch_one()) + + async def test_execute_delete(self): + create_op_1 = LmdbDatabaseOperation(LmdbDatabaseOperationType.CREATE, "TestOne", "first", "Text Value") + create_op_2 = LmdbDatabaseOperation(LmdbDatabaseOperationType.CREATE, "TestOne", "second", "Text Second Value") + delete_op_1 = LmdbDatabaseOperation(LmdbDatabaseOperationType.DELETE, "TestOne", "first") + read_op_1 = LmdbDatabaseOperation(LmdbDatabaseOperationType.READ, "TestOne", "second") + read_op_2 = LmdbDatabaseOperation(LmdbDatabaseOperationType.READ, "TestOne", "first") + + async with LmdbDatabaseClient(self.path) as client: + await client.execute(create_op_1) + await client.execute(create_op_2) + await client.execute(delete_op_1) + + await client.execute(read_op_1) + self.assertEqual("Text Second Value", await client.fetch_one()) + + await client.execute(read_op_2) + with self.assertRaises(ProgrammingException): + self.assertEqual(None, await client.fetch_one()) + + async def test_execute_update(self): + create_op = LmdbDatabaseOperation(LmdbDatabaseOperationType.CREATE, "TestOne", "first", "Text Value") + update_op = LmdbDatabaseOperation(LmdbDatabaseOperationType.UPDATE, "TestOne", "first", "Updated Text Value") + read_op = LmdbDatabaseOperation(LmdbDatabaseOperationType.READ, "TestOne", "first") + + async with LmdbDatabaseClient(self.path) as client: + await client.execute(create_op) + await client.execute(read_op) + + self.assertEqual("Text Value", await client.fetch_one()) + + await client.execute(update_op) + await client.execute(read_op) + + self.assertEqual("Updated Text Value", await client.fetch_one()) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/plugins/minos-database-lmdb/tests/test_lmdb/test_factories/__init__.py b/packages/plugins/minos-database-lmdb/tests/test_lmdb/test_factories/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/plugins/minos-database-lmdb/tests/test_lmdb/test_factories/test_saga/__init__.py b/packages/plugins/minos-database-lmdb/tests/test_lmdb/test_factories/test_saga/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/plugins/minos-database-lmdb/tests/test_lmdb/test_factories/test_saga/test_factories.py b/packages/plugins/minos-database-lmdb/tests/test_lmdb/test_factories/test_saga/test_factories.py new file mode 100644 index 000000000..e1e3fd274 --- /dev/null +++ b/packages/plugins/minos-database-lmdb/tests/test_lmdb/test_factories/test_saga/test_factories.py @@ -0,0 +1,43 @@ +import unittest +from uuid import ( + uuid4, +) + +from minos.plugins.lmdb import ( + LmdbDatabaseOperation, + LmdbDatabaseOperationType, + LmdbSagaExecutionDatabaseOperationFactory, +) +from minos.saga import ( + SagaExecutionDatabaseOperationFactory, +) + + +class TestLmdbSagaExecutionDatabaseOperationFactory(unittest.TestCase): + def test_is_subclass(self): + self.assertTrue(issubclass(LmdbSagaExecutionDatabaseOperationFactory, SagaExecutionDatabaseOperationFactory)) + + def test_build_store(self): + factory = LmdbSagaExecutionDatabaseOperationFactory() + + operation = factory.build_store(uuid4(), foo="bar") + self.assertIsInstance(operation, LmdbDatabaseOperation) + self.assertEqual(LmdbDatabaseOperationType.CREATE, operation.type_) + + def test_build_load(self): + factory = LmdbSagaExecutionDatabaseOperationFactory() + + operation = factory.build_load(uuid4()) + self.assertIsInstance(operation, LmdbDatabaseOperation) + self.assertEqual(LmdbDatabaseOperationType.READ, operation.type_) + + def test_build_delete(self): + factory = LmdbSagaExecutionDatabaseOperationFactory() + + operation = factory.build_delete(uuid4()) + self.assertIsInstance(operation, LmdbDatabaseOperation) + self.assertEqual(LmdbDatabaseOperationType.DELETE, operation.type_) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/plugins/minos-database-lmdb/tests/test_lmdb/test_factories/test_saga/test_repositories.py b/packages/plugins/minos-database-lmdb/tests/test_lmdb/test_factories/test_saga/test_repositories.py new file mode 100644 index 000000000..33ed57080 --- /dev/null +++ b/packages/plugins/minos-database-lmdb/tests/test_lmdb/test_factories/test_saga/test_repositories.py @@ -0,0 +1,31 @@ +import unittest +from shutil import ( + rmtree, +) + +from minos.saga import ( + DatabaseSagaExecutionRepository, + SagaExecutionRepository, +) +from minos.saga.testing import ( + SagaExecutionRepositoryTestCase, +) +from tests.utils import ( + LmdbTestCase, +) + + +class TestDatabaseSagaExecutionRepository(LmdbTestCase, SagaExecutionRepositoryTestCase): + __test__ = True + + def build_saga_execution_repository(self) -> SagaExecutionRepository: + return DatabaseSagaExecutionRepository.from_config(self.config) + + def tearDown(self) -> None: + path = self.config.get_database_by_name("saga")["path"] + rmtree(path, ignore_errors=True) + super().tearDown() + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/plugins/minos-database-lmdb/tests/utils.py b/packages/plugins/minos-database-lmdb/tests/utils.py new file mode 100644 index 000000000..b2b080c94 --- /dev/null +++ b/packages/plugins/minos-database-lmdb/tests/utils.py @@ -0,0 +1,88 @@ +from pathlib import ( + Path, +) + +from minos.aggregate import ( + InMemoryEventRepository, + InMemorySnapshotRepository, + InMemoryTransactionRepository, +) +from minos.common import ( + DatabaseClientPool, + Lock, + LockPool, + PoolFactory, +) +from minos.common.testing import ( + DatabaseMinosTestCase, +) +from minos.networks import ( + BrokerClientPool, + InMemoryBrokerPublisher, + InMemoryBrokerSubscriberBuilder, +) + +BASE_PATH = Path(__file__).parent +CONFIG_FILE_PATH = BASE_PATH / "test_config.yml" + + +class LmdbTestCase(DatabaseMinosTestCase): + def get_config_file_path(self) -> Path: + return CONFIG_FILE_PATH + + def get_injections(self): + pool_factory = PoolFactory.from_config( + self.config, + default_classes={ + "broker": BrokerClientPool, + "lock": FakeLockPool, + "database": DatabaseClientPool, + }, + ) + broker_publisher = InMemoryBrokerPublisher() + broker_subscriber_builder = InMemoryBrokerSubscriberBuilder() + transaction_repository = InMemoryTransactionRepository( + lock_pool=pool_factory.get_pool("lock"), + ) + event_repository = InMemoryEventRepository( + broker_publisher=broker_publisher, + transaction_repository=transaction_repository, + lock_pool=pool_factory.get_pool("lock"), + ) + snapshot_repository = InMemorySnapshotRepository( + event_repository=event_repository, + transaction_repository=transaction_repository, + ) + return [ + pool_factory, + broker_publisher, + broker_subscriber_builder, + transaction_repository, + event_repository, + snapshot_repository, + ] + + +class FakeLock(Lock): + """For testing purposes.""" + + def __init__(self, key=None, *args, **kwargs): + if key is None: + key = "fake" + super().__init__(key, *args, **kwargs) + + async def acquire(self) -> None: + """For testing purposes.""" + + async def release(self): + """For testing purposes.""" + + +class FakeLockPool(LockPool): + """For testing purposes.""" + + async def _create_instance(self): + return FakeLock() + + async def _destroy_instance(self, instance) -> None: + """For testing purposes.""" diff --git a/packages/plugins/minos-discovery-kong/AUTHORS.md b/packages/plugins/minos-discovery-kong/AUTHORS.md new file mode 100644 index 000000000..30ff94991 --- /dev/null +++ b/packages/plugins/minos-discovery-kong/AUTHORS.md @@ -0,0 +1,15 @@ +# Credits + +## Development Lead + +* Andrea Mucci + +## Core Devs + +* Sergio Garcia Prado +* Vladyslav Fenchak +* Alberto Amigo Alonso + +## Contributors + +None yet. Why not be the first? diff --git a/packages/plugins/minos-discovery-kong/HISTORY.md b/packages/plugins/minos-discovery-kong/HISTORY.md new file mode 100644 index 000000000..7cbf44ec0 --- /dev/null +++ b/packages/plugins/minos-discovery-kong/HISTORY.md @@ -0,0 +1,7 @@ +# History + +## 0.7.0 (2022-05-11) + +* Add `KongClient` as a class to interact with the `kong` API Gateway. +* Add `KongDiscoveryClient` as the `minos.networks.DiscoveryClient` implementation for the `kong` API Gateway. +* Add `middleware` function to automatically extract the user identifier from request's header variable set by the `kong` API Gateway. \ No newline at end of file diff --git a/packages/plugins/minos-discovery-kong/LICENSE b/packages/plugins/minos-discovery-kong/LICENSE new file mode 100644 index 000000000..4daf85bf2 --- /dev/null +++ b/packages/plugins/minos-discovery-kong/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Clariteia + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/plugins/minos-discovery-kong/Makefile b/packages/plugins/minos-discovery-kong/Makefile new file mode 100644 index 000000000..c029df39d --- /dev/null +++ b/packages/plugins/minos-discovery-kong/Makefile @@ -0,0 +1,37 @@ +.PHONY: dist + +lint: + poetry run flake8 + +test: + poetry run pytest + +coverage: + poetry run coverage run -m pytest + poetry run coverage report -m + poetry run coverage xml + +reformat: + poetry run black --line-length 120 minos tests + poetry run isort minos tests + +release: + $(MAKE) dist + poetry publish + +dist: + poetry build + ls -l dist + +install: + poetry install + +update: + poetry update + +check: + $(MAKE) install + $(MAKE) reformat + $(MAKE) lint + $(MAKE) test + $(MAKE) dist diff --git a/packages/plugins/minos-discovery-kong/README.md b/packages/plugins/minos-discovery-kong/README.md new file mode 100644 index 000000000..d5b931a25 --- /dev/null +++ b/packages/plugins/minos-discovery-kong/README.md @@ -0,0 +1,358 @@ +

+ Minos logo +

+ +## minos-kong + +[![PyPI Latest Release](https://img.shields.io/pypi/v/minos-kong.svg)](https://pypi.org/project/minos-kong/) +[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/minos-framework/minos-python/pages%20build%20and%20deployment?label=docs)](https://minos-framework.github.io/minos-python) +[![License](https://img.shields.io/github/license/minos-framework/minos-python.svg)](https://github.com/minos-framework/minos-python/blob/main/LICENSE) +[![Coverage](https://codecov.io/github/minos-framework/minos-python/coverage.svg?branch=main)](https://codecov.io/gh/minos-framework/minos-python) +[![Stack Overflow](https://img.shields.io/badge/Stack%20Overflow-Ask%20a%20question-green)](https://stackoverflow.com/questions/tagged/minos) + +## Summary +Pre-Alpha release, use at your own risk +Minos Kong is a plugin that integrate minos micorservices with Kong API Gateway + +## Installation + +Install the dependency: + +```shell +pip install minos-discovery-kong +``` + +Modify `config.yml` file: + +```yaml +... +discovery: + client: minos.plugins.kong.KongDiscoveryClient + host: localhost + port: 8001 +... +``` + +## How to +The above configuration is sufficient for the microservice to subscribe on startup and unsubscribe on shutdown. +Therefore, all you would have to do would be to make your requests against: + +`http://localhost:8000/your_endpoint` + +## Kong official documentation +### Official docs +You can get read the official docs [here](https://docs.konghq.com/gateway/2.8.x/admin-api/). + +### Postman + +You can get the official postman collection for postman [here](https://documenter.getpostman.com/view/10587735/SzS7QS2c#intro). + +## Konga - Administrative interface +For development purposes you can add open-source administrative section by using next docker service: +```yaml +services: + ... + konga: + image: pantsel/konga + ports: + - 1337:1337 + links: + - kong:kong + container_name: konga + environment: + - NODE_ENV=production +``` + +## Decorators +Decorator `@enroute` can support next params: + - `path` - route url path. + - `method` - HTTP method. + - `authenticated` (Optional) - True if route need authentication. + - `authorized_groups` (Optional) - Groups which can access to specified route (they must exist in Kong). + - `regex_priority` (Optional) - A number used to choose which route resolves a given request when several routes match it using regexes simultaneously. When two routes match the path and have the same regex_priority, the older one (lowest created_at) is used. Note that the priority for non-regex routes is different (longer non-regex routes are matched before shorter ones). Defaults to 0. + +Example: +```python + @enroute.rest.command(f"/users/{{uuid:{UUID_REGEX.pattern}}}/jwt", "POST", authenticated=True, authorized_groups=["admin"], regex_priority=2) + @enroute.broker.command("GetUserJWT") + async def foo(self, request: Request) -> Response: + ... +``` +## Route path +It is important to know that it is best to define routes with a regular expression when it is an id, uuid or similar. This is to avoid collisions with similar routes. +Instead of using: +```python +@enroute.rest.command("/users/{uuid}", "POST") +``` +Use: +```python +import re +UUID_REGEX = re.compile(r"\w{8}-\w{4}-\w{4}-\w{4}-\w{12}") +@enroute.rest.command(f"/users/{{uuid:{UUID_REGEX.pattern}}}", "POST") +``` + +## Authentication + +Modify `config.yml` file. Add new middleware and modify discovery section: +```yaml +... +middleware: + ... + - minos.plugins.kong.middleware + +discovery: + connector: minos.networks.DiscoveryConnector + client: minos.plugins.kong.KongDiscoveryClient + host: localhost + auth-type: basic-auth + port: 8001 +... +``` + +Currently, there are 2 possible types of authentication: +- `basic-auth` +- `jwt` + +For jwt auth type you can specify default token expiration. Example: +```yaml +... +middleware: + ... + - minos.plugins.kong.middleware + +discovery: + connector: minos.networks.DiscoveryConnector + client: minos.plugins.kong.KongDiscoveryClient + host: localhost + auth-type: jwt + token-exp: 60 # seconds + port: 8001 +... +``` + +### JWT Token creation & refresh +Example on how to create and refresh token. You need to store in database or similar the secret and key returned form kong in order to refresh existing token. +```python +from minos.common import ( + UUID_REGEX, + NotProvidedException, + Config, + Inject, +) +from minos.cqrs import ( + CommandService, +) +from minos.networks import ( + Request, + Response, + enroute, +) + +from ..aggregates import ( + User, +) +from minos.plugins.kong import KongClient + +class UserCommandService(CommandService): + """UserCommandService class.""" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.kong = self._get_kong_client() + + @staticmethod + @Inject() + def _get_kong_client(config: Config) -> KongClient: + """Get the service name.""" + if config is None: + raise NotProvidedException("The config object must be provided.") + return KongClient.from_config(config) + + @enroute.rest.command(f"/users/{{uuid:{UUID_REGEX.pattern}}}/jwt", "POST", authenticated=True, + authorized_groups=["admin"], regex_priority=3) + @enroute.broker.command("GetUserJWT") + async def create_user_jwt(self, request: Request) -> Response: + params = await request.params() + uuid = params["uuid"] + user = await User.get(uuid) + + if user.uuid == request.user: + token = await self.add_jwt_to_consumer(request.headers.get("X-Consumer-ID")) + return Response({"token": token}) + else: + return Response(status=404) + + async def add_jwt_to_consumer(self, consumer: str): + resp = await self.kong.add_jwt_to_consumer(consumer=consumer) + res = resp.json() + self.key = res['key'] + self.secret = res['secret'] + token = await self.kong.generate_jwt_token(key=self.key, secret=self.secret) + return token + + @enroute.rest.command(f"/users/{{uuid:{UUID_REGEX.pattern}}}/refresh-jwt", "POST", authenticated=True, + authorized_groups=["admin"], regex_priority=3) + @enroute.broker.command("RefreshJWT") + async def refresh_jwt(self, request: Request) -> Response: + token = await self.kong.generate_jwt_token(key=self.key, secret=self.secret) + return Response({"token": token}) +``` + +For the route to be authenticated with the method specified above, a parameter called `authenticated` must be passed: +```python +class CategoryCommandService(CommandService): + @enroute.rest.command("/categories", "POST", authenticated=True, authorized_groups=["super_admin", "admin"]) + @enroute.broker.command("CreateCategory") + async def create_category(self, request: Request) -> Response: + try: + content = await request.content() + category = await Category.create(**content) + return Response(category) + except Exception: + raise ResponseException("An error occurred during category creation.") +``` + +If `authorized_groups` is also specified, this means that ACL will be enabled for that path and only users in the specified group will be allowed access. + +Example of how to create a user and add them to a group: + +```python +from minos.common import ( + NotProvidedException, + Config, + Inject, +) +from minos.cqrs import ( + CommandService, +) +from minos.networks import ( + Request, + Response, + enroute, +) +from ..aggregates import ( + Role, + User, +) +from minos.plugins.kong import KongClient + + +class UserCommandService(CommandService): + """UserCommandService class.""" + + + @enroute.rest.command("/users", "POST") + @enroute.broker.command("CreateUser") + async def create_user(self, request: Request) -> Response: + """Create a new ``User`` instance. + + :param request: The ``Request`` instance. + :return: A ``Response`` instance. + """ + content = await request.content() + + active = True + if "active" in content: + active = content["active"] + + user = User( + name=content["name"], + surname=content["surname"], + email=content["email"], + telephone=content["telephone"], + role=content["role"], + active=active, + ) + await user.save() + + kong = KongClient(self._get_kong_url()) + + consumer_raw = await kong.create_consumer(username=f"{user.name} {user.surname}", user=user.uuid, tags=[]) + consumer = consumer_raw.json() + + basic_auth = await kong.add_basic_auth_to_consumer(username=f"{user.name.lower()}_{user.surname.lower()}", + password=content["password"], consumer=consumer["id"]) + + acl = await kong.add_acl_to_consumer(role=user.role.name.lower(), consumer=consumer["id"]) + + return Response(user) + + @staticmethod + @Inject() + def _get_kong_url(config: Config) -> str: + """Get the service name.""" + if config is None: + raise NotProvidedException("The config object must be provided.") + return f"http://{config.get_by_key('discovery.host')}:{config.get_by_key('discovery.port')}" +``` + +Generate JWT example: +```python +from minos.common import ( + UUID_REGEX, + NotProvidedException, + Config, + Inject, +) +from minos.cqrs import ( + CommandService, +) +from minos.networks import ( + Request, + Response, + enroute, +) +from ..aggregates import ( + Role, + User, +) +from minos.plugins.kong import KongClient + +class UserCommandService(CommandService): + """UserCommandService class.""" + + @enroute.rest.command(f"/users/{{uuid:{UUID_REGEX.pattern}}}/jwt", "POST", authenticated=True, authorized_groups=["admin"]) + @enroute.broker.command("GetUserJWT") + async def create_user_jwt(self, request: Request) -> Response: + params = await request.params() + uuid = params["uuid"] + user = await User.get(uuid) + + if user.uuid == request.user: + kong = KongClient(self._get_kong_url()) + jwt = await kong.add_jwt_to_consumer(request.headers.get("X-Consumer-ID")) + return Response(jwt.json()) + else: + return Response(status=404) + + @staticmethod + @Inject() + def _get_kong_url(config: Config) -> str: + """Get the service name.""" + if config is None: + raise NotProvidedException("The config object must be provided.") + return f"http://{config.get_by_key('discovery.host')}:{config.get_by_key('discovery.port')}" +``` + +You can get read the official docs [here](https://pantsel.github.io/konga/). + + +## Documentation + +The official API Reference is publicly available at the [GitHub Pages](https://minos-framework.github.io/minos-python). + +## Source Code + +The source code of this project is hosted at the [GitHub Repository](https://github.com/minos-framework/minos-python). + +## Getting Help + +For usage questions, the best place to go to is [StackOverflow](https://stackoverflow.com/questions/tagged/minos). + +## Discussion and Development + +Most development discussions take place over the [GitHub Issues](https://github.com/minos-framework/minos-python/issues). In addition, a [Gitter channel](https://gitter.im/minos-framework/community) is available for development-related questions. + +## License + +This project is distributed under the [MIT](https://raw.githubusercontent.com/minos-framework/minos-python/main/LICENSE) license. diff --git a/packages/plugins/minos-discovery-kong/RUNTHETESTS.md b/packages/plugins/minos-discovery-kong/RUNTHETESTS.md new file mode 100644 index 000000000..386e2b0e7 --- /dev/null +++ b/packages/plugins/minos-discovery-kong/RUNTHETESTS.md @@ -0,0 +1,20 @@ +# Run the tests + +In order to run the tests, please make sure you have the `Docker Engine `_ +and `Docker Compose `_ installed. + +Move into tests/ directory + +`cd tests/` + +Run service dependencies: + +`docker-compose up -d` + +Install library dependencies: + +`make install` + +Run tests: + +`make test` diff --git a/packages/plugins/minos-discovery-kong/minos/plugins/kong/__init__.py b/packages/plugins/minos-discovery-kong/minos/plugins/kong/__init__.py new file mode 100644 index 000000000..3bbf4686d --- /dev/null +++ b/packages/plugins/minos-discovery-kong/minos/plugins/kong/__init__.py @@ -0,0 +1,15 @@ +"""The kong plugin of the Minos Framework.""" + +__author__ = "Minos Framework Devs" +__email__ = "hey@minos.run" +__version__ = "0.7.0" + +from .client import ( + KongClient, +) +from .discovery import ( + KongDiscoveryClient, +) +from .middleware import ( + middleware, +) diff --git a/packages/plugins/minos-discovery-kong/minos/plugins/kong/client.py b/packages/plugins/minos-discovery-kong/minos/plugins/kong/client.py new file mode 100644 index 000000000..af99ad784 --- /dev/null +++ b/packages/plugins/minos-discovery-kong/minos/plugins/kong/client.py @@ -0,0 +1,210 @@ +from __future__ import ( + annotations, +) + +from datetime import ( + datetime, + timedelta, +) +from uuid import ( + UUID, +) + +import httpx as httpx +import jwt + +from minos.common import ( + Config, + SetupMixin, + current_datetime, +) + + +class KongClient(SetupMixin): + """Kong Client class.""" + + def __init__( + self, protocol: str = None, host: str = None, port: int = None, token_expiration_sec: int = None, **kwargs + ): + super().__init__(**kwargs) + if host is None: + host = "localhost" + if port is None: + port = 8001 + if protocol is None: + protocol = "http" + if token_expiration_sec is None: + token_expiration_sec = 60 * 5 + + self.route = f"{protocol}://{host}:{port}" + self.token_expiration_sec = token_expiration_sec + + @classmethod + def _from_config(cls, config: Config, **kwargs) -> KongClient: + discovery_config = config.get_discovery() + + token_expiration_sec = discovery_config.get("token-exp") + protocol = discovery_config.get("protocol") + host = discovery_config.get("host") + port = discovery_config.get("port") + + return cls(protocol=protocol, host=host, port=port, token_expiration_sec=token_expiration_sec, **kwargs) + + @staticmethod + async def register_service( + discovery_route: str, service_name: str, microservice_host: str, microservice_port: int + ) -> httpx.Response: + url = f"{discovery_route}/services" # kong url for service POST or add + data = {"name": service_name, "protocol": "http", "host": microservice_host, "port": microservice_port} + async with httpx.AsyncClient() as client: + response = await client.post(url, json=data) + return response + + @staticmethod + async def delete_service(discovery_route: str, service_name) -> httpx.Response: + """ + the delete of a service must be checking before if the service already have the routes + if yes the DELETE routes must be called + :param discovery_route: + :param service_name: + :return: + """ + async with httpx.AsyncClient() as client: + url_get_route = f"{discovery_route}/services/{service_name}/routes" # url to get the routes + response_routes = await client.get(url_get_route) + json_routes_response = response_routes.json() + if len(json_routes_response["data"]) > 0: # service already have route, routes must be deleted + for route in json_routes_response["data"]: + url_delete_route = f"{discovery_route}/routes/{route['id']}" # url for routes delete + await client.delete(url_delete_route) + url_delete_service = f"{discovery_route}/services/{service_name}" # url for service delete + response_delete_service = await client.delete(url_delete_service) + return response_delete_service + + @staticmethod + async def create_route( + endpoint: str, + protocols: list[str], + methods: list[str], + paths: list[str], + service: str, + regex_priority: int, + strip_path: bool = False, + ): + url = f"{endpoint}/routes" + payload = { + "protocols": protocols, + "methods": methods, + "paths": paths, + "service": {"id": service}, + "regex_priority": regex_priority, + "strip_path": strip_path, + } + + async with httpx.AsyncClient() as client: + resp = await client.post(url, json=payload) + + return resp + + async def create_consumer(self, username: str, user: UUID, tags: list[str]): + payload = {"username": username, "custom_id": str(user), "tags": tags} + + async with httpx.AsyncClient() as client: + resp = await client.post(f"{self.route}/consumers", json=payload) + return resp + + async def add_basic_auth_to_consumer(self, username: str, password: str, consumer: str): + payload = { + "username": username, + "password": password, + } + + async with httpx.AsyncClient() as client: + resp = await client.post(f"{self.route}/consumers/{consumer}/basic-auth", json=payload) + + return resp + + async def add_jwt_to_consumer(self, consumer: str): + async with httpx.AsyncClient() as client: + resp = await client.post( + f"{self.route}/consumers/{consumer}/jwt", + headers={"content-type": "application/x-www-form-urlencoded"}, + ) + + return resp + + async def add_acl_to_consumer(self, role: str, consumer: str): + payload = { + "group": role, + } + + async with httpx.AsyncClient() as client: + resp = await client.post(f"{self.route}/consumers/{consumer}/acls", json=payload) + return resp + + async def activate_acl_plugin_on_service(self, service_name: str, allow: list[str]): + payload = {"name": "acl", "config": {"allow": allow}} + + async with httpx.AsyncClient() as client: + resp = await client.post(f"{self.route}/services/{service_name}/plugins", json=payload) + return resp + + async def activate_acl_plugin_on_route(self, route_id: str, allow: list[str]): + payload = {"name": "acl", "config": {"allow": allow}} + + async with httpx.AsyncClient() as client: + resp = await client.post(f"{self.route}/routes/{route_id}/plugins", json=payload) + return resp + + async def activate_basic_auth_plugin_on_service(self, service_name: str): + payload = {"name": "basic-auth", "config": {"hide_credentials": False}} + + async with httpx.AsyncClient() as client: + resp = await client.post(f"{self.route}/services/{service_name}/plugins", json=payload) + return resp + + async def activate_basic_auth_plugin_on_route(self, route_id: str): + payload = {"name": "basic-auth", "config": {"hide_credentials": False}} + + async with httpx.AsyncClient() as client: + resp = await client.post(f"{self.route}/routes/{route_id}/plugins", json=payload) + return resp + + async def activate_jwt_plugin_on_route(self, route_id: str): + payload = { + "name": "jwt", + "config": {"secret_is_base64": False, "run_on_preflight": True, "claims_to_verify": ["exp", "nbf"]}, + } + + async with httpx.AsyncClient() as client: + resp = await client.post(f"{self.route}/routes/{route_id}/plugins", json=payload) + return resp + + async def generate_jwt_token( + self, key: str, secret: str, algorithm: str = "HS256", exp: datetime = None, nbf: datetime = None + ) -> str: + payload = {"iss": key, "exp": exp, "nbf": nbf} + + current = current_datetime() + + if not exp: + payload["exp"] = current + timedelta(seconds=self.token_expiration_sec) + + if not nbf: + payload["nbf"] = current + + return jwt.encode(payload, secret, algorithm=algorithm) + + @staticmethod + async def decode_token(token: str, algorithm: str = "HS256"): + return jwt.decode(token, options={"verify_signature": False}, algorithms=[algorithm]) + + async def get_jwt_by_id(self, id: str): + async with httpx.AsyncClient() as client: + resp = await client.get(f"{self.route}/jwts/{id}") + return resp + + async def get_consumer_jwts(self, consumer: str): + async with httpx.AsyncClient() as client: + resp = await client.get(f"{self.route}/consumers/{consumer}/jwt") + return resp diff --git a/packages/plugins/minos-discovery-kong/minos/plugins/kong/discovery.py b/packages/plugins/minos-discovery-kong/minos/plugins/kong/discovery.py new file mode 100644 index 000000000..b64a06677 --- /dev/null +++ b/packages/plugins/minos-discovery-kong/minos/plugins/kong/discovery.py @@ -0,0 +1,149 @@ +from __future__ import ( + annotations, +) + +import logging +from collections.abc import ( + Iterable, +) +from functools import ( + partial, +) +from typing import ( + Optional, +) + +import httpx as httpx + +from minos.common import ( + CircuitBreakerMixin, + Config, +) +from minos.networks import ( + DiscoveryClient, +) + +from .client import ( + KongClient, +) +from .utils import ( + Endpoint, +) + +logger = logging.getLogger(__name__) + + +class KongDiscoveryClient(DiscoveryClient, CircuitBreakerMixin): + """Kong Discovery Client class.""" + + def __init__( + self, + host: Optional[str] = None, + port: Optional[int] = None, + circuit_breaker_exceptions: Iterable[type] = tuple(), + client: KongClient = None, + **kwargs, + ): + if host is None: + host = "localhost" + if port is None: + port = 5567 + super().__init__( + host, port, circuit_breaker_exceptions=(httpx.HTTPStatusError, *circuit_breaker_exceptions), **kwargs + ) + + if client is None: + client = KongClient(host=host, port=port) + + self.client = client + + self.auth_type = None + if "auth_type" in kwargs: + self.auth_type = kwargs["auth_type"] + + @classmethod + def _from_config(cls, config: Config, **kwargs) -> KongDiscoveryClient: + if "auth_type" in kwargs: + auth_type = kwargs["auth_type"] + kwargs.pop("auth_type") + else: + try: + auth_type = config.get_by_key("discovery.auth-type") + except Exception: + auth_type = None + client = KongClient.from_config(config) + + return super()._from_config(config, auth_type=auth_type, client=client, **kwargs) + + async def subscribe( + self, host: str, port: int, name: str, endpoints: list[dict[str, str]], *args, **kwargs + ) -> httpx.Response: + """Perform the subscription query. + + :param host: The ip of the microservice to be subscribed. + :param port: The port of the microservice to be subscribed. + :param name: The name of the microservice to be subscribed. + :param endpoints: List of endpoints exposed by the microservice. + :param args: Additional positional arguments. + :param kwargs: Additional named arguments. + :return: This method does not return anything. + """ + + fnsr = partial(self.client.register_service, self.route, name, host, port) + response_service = await self.with_circuit_breaker(fnsr) # register a service + if response_service.status_code == 409: # service already exist + # if service already exist, delete and add again + fn_delete = partial(self.client.delete_service, self.route, name) + await self.with_circuit_breaker(fn_delete) # delete the service + fnsr = partial(self.client.register_service, self.route, name, host, port) + response_service = await self.with_circuit_breaker(fnsr) # send the servie subscription again + + content_service = response_service.json() # get the servie information like the id + + for endpoint in endpoints: + endpointClass = Endpoint(endpoint["url"]) + + regex_priority = 0 + if "regex_priority" in endpoint: + regex_priority = endpoint["regex_priority"] + + fn = partial( + self.client.create_route, + self.route, + ["http"], + [endpoint["method"]], + [endpointClass.path_as_regex], + content_service["id"], + regex_priority, + False, + ) + response = await self.with_circuit_breaker(fn) # send the route request + resp = response.json() + + if "authenticated" in endpoint and self.auth_type: + if self.auth_type == "basic-auth": + fn = partial(self.client.activate_basic_auth_plugin_on_route, route_id=resp["id"]) + await self.with_circuit_breaker(fn) + elif self.auth_type == "jwt": + fn = partial(self.client.activate_jwt_plugin_on_route, route_id=resp["id"]) + await self.with_circuit_breaker(fn) + + if "authorized_groups" in endpoint: + fn = partial( + self.client.activate_acl_plugin_on_route, route_id=resp["id"], allow=endpoint["authorized_groups"] + ) + await self.with_circuit_breaker(fn) + + return response + + async def unsubscribe(self, name: str, *args, **kwargs) -> httpx.Response: + """Perform the unsubscription query. + + :param name: The name of the microservice to be unsubscribed. + :param args: Additional positional arguments. + :param kwargs: Additional named arguments. + :return: This method does not return anything. + """ + fn = partial(self.client.delete_service, self.route, name) + response = await self.with_circuit_breaker(fn) + return response diff --git a/packages/plugins/minos-discovery-kong/minos/plugins/kong/middleware.py b/packages/plugins/minos-discovery-kong/minos/plugins/kong/middleware.py new file mode 100644 index 000000000..8d39005b0 --- /dev/null +++ b/packages/plugins/minos-discovery-kong/minos/plugins/kong/middleware.py @@ -0,0 +1,35 @@ +from collections.abc import ( + Awaitable, + Callable, +) +from typing import ( + Optional, +) + +from minos.networks import ( + REQUEST_USER_CONTEXT_VAR, + HttpRequest, + Request, + Response, +) + + +async def middleware(request: Request, inner: Callable[[Request], Awaitable[Optional[Response]]]) -> Optional[Response]: + """Parse headers for http request and set Minos user from Kong headers. + + :param request: The request containing the data. + :param inner: The inner handling function to be executed. + :return: The response generated by the inner handling function. + """ + token = None + try: + if isinstance(request, HttpRequest): + if (user_uuid := request.headers.get("X-Consumer-Custom-ID")) is not None: + request.headers["user"] = user_uuid + token = REQUEST_USER_CONTEXT_VAR.set(user_uuid) + response = await inner(request) + finally: + if token: + REQUEST_USER_CONTEXT_VAR.reset(token) + + return response diff --git a/packages/plugins/minos-discovery-kong/minos/plugins/kong/utils.py b/packages/plugins/minos-discovery-kong/minos/plugins/kong/utils.py new file mode 100644 index 000000000..5874e12af --- /dev/null +++ b/packages/plugins/minos-discovery-kong/minos/plugins/kong/utils.py @@ -0,0 +1,38 @@ +import re + + +class PathPart: + def __init__(self, name: str): + self.name = name + self.is_generic: bool = True if self.name.startswith("{") and self.name.endswith("}") else False + + +class Endpoint: + part_path_pattern = r"\{\S+:.+\}" + + def __init__(self, path: str): + self.path: tuple[PathPart] = tuple(PathPart(path_part) for path_part in path.split("/")) + + @property + def path_as_str(self) -> str: + list_parts = [] + for part in self.path: + if part.is_generic: + part.name = ".*" + list_parts.append(str(part.name)) + return "/".join(list_parts) + + @property + def path_as_regex(self) -> str: + list_parts = [] + for part in self.path: + if part.is_generic: + if re.match(self.part_path_pattern, part.name): + regex = part.name.split(":")[1] + regex = regex[:-1] + list_parts.append(regex) + else: + list_parts.append(".*") + else: + list_parts.append(part.name) + return "/".join(list_parts) diff --git a/packages/plugins/minos-discovery-kong/poetry.lock b/packages/plugins/minos-discovery-kong/poetry.lock new file mode 100644 index 000000000..a75ae5ebf --- /dev/null +++ b/packages/plugins/minos-discovery-kong/poetry.lock @@ -0,0 +1,907 @@ +[[package]] +name = "aiomisc" +version = "15.7.3" +description = "aiomisc - miscellaneous utils for asyncio" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +colorlog = "*" + +[package.extras] +aiohttp = ["aiohttp"] +asgi = ["aiohttp-asgi"] +carbon = ["aiocarbon (>=0.15,<1.0)"] +contextvars = ["contextvars (>=2.4,<3.0)"] +cron = ["croniter (>=0.3.34,<0.4.0)"] +develop = ["aiocontextvars (==0.2.2)", "aiohttp-asgi", "aiohttp (<4)", "async-timeout", "coveralls", "croniter (>=0.3.34,<0.4.0)", "fastapi", "freezegun (<1.1)", "mypy (>=0.782,<1.0)", "pylava", "pytest", "pytest-cov (>=3.0,<4.0)", "pytest-freezegun (>=0.4.2,<0.5.0)", "pytest-rst", "pytest-subtests", "rich", "setproctitle", "sphinx-autobuild", "sphinx-intl", "sphinx (>=3.5.1)", "timeout-decorator", "tox (>=2.4)", "types-croniter"] +raven = ["raven-aiohttp"] +uvloop = ["uvloop (>=0.14,<1)"] + +[[package]] +name = "anyio" +version = "3.5.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +category = "main" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["packaging", "sphinx-rtd-theme", "sphinx-autodoc-typehints (>=1.2.0)"] +test = ["coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "pytest (>=6.0)", "pytest-mock (>=3.6.1)", "trustme", "contextlib2", "uvloop (<0.15)", "mock (>=4)", "uvloop (>=0.15)"] +trio = ["trio (>=0.16)"] + +[[package]] +name = "atomicwrites" +version = "1.4.0" +description = "Atomic file writes." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "attrs" +version = "21.4.0" +description = "Classes Without Boilerplate" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.extras] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] +docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] + +[[package]] +name = "black" +version = "22.3.0" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "cached-property" +version = "1.5.2" +description = "A decorator for caching properties in classes." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "certifi" +version = "2021.10.8" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "charset-normalizer" +version = "2.0.12" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.5.0" + +[package.extras] +unicode_backport = ["unicodedata2"] + +[[package]] +name = "click" +version = "8.1.3" +description = "Composable command line interface toolkit" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.4" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "colorlog" +version = "6.6.0" +description = "Add colours to the output of Python's logging module." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} + +[package.extras] +development = ["black", "flake8", "mypy", "pytest", "types-colorama"] + +[[package]] +name = "coverage" +version = "6.3.2" +description = "Code coverage measurement for Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "crontab" +version = "0.23.0" +description = "Parse and use crontab schedules in Python" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "dependency-injector" +version = "4.39.1" +description = "Dependency injection framework for Python" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = ">=1.7.0,<=1.16.0" + +[package.extras] +aiohttp = ["aiohttp"] +flask = ["flask"] +pydantic = ["pydantic"] +yaml = ["pyyaml"] + +[[package]] +name = "fastavro" +version = "1.4.11" +description = "Fast read/write of AVRO files" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +codecs = ["python-snappy", "zstandard", "lz4"] +lz4 = ["lz4"] +snappy = ["python-snappy"] +zstandard = ["zstandard"] + +[[package]] +name = "flake8" +version = "4.0.1" +description = "the modular source code checker: pep8 pyflakes and co" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +mccabe = ">=0.6.0,<0.7.0" +pycodestyle = ">=2.8.0,<2.9.0" +pyflakes = ">=2.4.0,<2.5.0" + +[[package]] +name = "h11" +version = "0.12.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "httpcore" +version = "0.14.7" +description = "A minimal low-level HTTP client." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +anyio = ">=3.0.0,<4.0.0" +certifi = "*" +h11 = ">=0.11,<0.13" +sniffio = ">=1.0.0,<2.0.0" + +[package.extras] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] + +[[package]] +name = "httpx" +version = "0.22.0" +description = "The next generation HTTP client." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +certifi = "*" +charset-normalizer = "*" +httpcore = ">=0.14.5,<0.15.0" +rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]} +sniffio = "*" + +[package.extras] +brotli = ["brotlicffi", "brotli"] +cli = ["click (>=8.0.0,<9.0.0)", "rich (>=10.0.0,<11.0.0)", "pygments (>=2.0.0,<3.0.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] + +[[package]] +name = "idna" +version = "3.3" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "iniconfig" +version = "1.1.1" +description = "iniconfig: brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "isort" +version = "5.10.1" +description = "A Python utility / library to sort Python imports." +category = "dev" +optional = false +python-versions = ">=3.6.1,<4.0" + +[package.extras] +pipfile_deprecated_finder = ["pipreqs", "requirementslib"] +requirements_deprecated_finder = ["pipreqs", "pip-api"] +colors = ["colorama (>=0.4.3,<0.5.0)"] +plugins = ["setuptools"] + +[[package]] +name = "mccabe" +version = "0.6.1" +description = "McCabe checker, plugin for flake8" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "minos-microservice-common" +version = "0.7.0" +description = "The common core of the Minos Framework" +category = "main" +optional = false +python-versions = "^3.9" +develop = true + +[package.dependencies] +aiomisc = ">=14.0.3,<15.8.0" +cached-property = "^1.5.2" +dependency-injector = "^4.32.2" +fastavro = "^1.4.0" +orjson = "^3.5.2" +PyYAML = ">=5.4.1,<7.0.0" +uvloop = "^0.16.0" + +[package.source] +type = "directory" +url = "../../core/minos-microservice-common" + +[[package]] +name = "minos-microservice-networks" +version = "0.7.0" +description = "The networks core of the Minos Framework" +category = "main" +optional = false +python-versions = "^3.9" +develop = true + +[package.dependencies] +crontab = "^0.23.0" +minos-microservice-common = "^0.7.0*" + +[package.source] +type = "directory" +url = "../../core/minos-microservice-networks" + +[[package]] +name = "mypy-extensions" +version = "0.4.3" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "orjson" +version = "3.6.8" +description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "packaging" +version = "21.3" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" + +[[package]] +name = "pathspec" +version = "0.9.0" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[[package]] +name = "platformdirs" +version = "2.5.2" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] +test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pycodestyle" +version = "2.8.0" +description = "Python style guide checker" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pyflakes" +version = "2.4.0" +description = "passive checker of Python programs" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pyjwt" +version = "2.3.0" +description = "JSON Web Token implementation in Python" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +crypto = ["cryptography (>=3.3.1)"] +dev = ["sphinx", "sphinx-rtd-theme", "zope.interface", "cryptography (>=3.3.1)", "pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)", "mypy", "pre-commit"] +docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] +tests = ["pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)"] + +[[package]] +name = "pyparsing" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +category = "dev" +optional = false +python-versions = ">=3.6.8" + +[package.extras] +diagrams = ["railroad-diagrams", "jinja2"] + +[[package]] +name = "pytest" +version = "6.2.5" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +py = ">=1.8.2" +toml = "*" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] + +[[package]] +name = "pytz" +version = "2022.1" +description = "World timezone definitions, modern and historical" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "pyyaml" +version = "6.0" +description = "YAML parser and emitter for Python" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "rfc3986" +version = "1.5.0" +description = "Validating URI References per RFC 3986" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +idna = {version = "*", optional = true, markers = "extra == \"idna2008\""} + +[package.extras] +idna2008 = ["idna"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "sniffio" +version = "1.2.0" +description = "Sniff out which async library your code is running under" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "typing-extensions" +version = "4.2.0" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "uvloop" +version = "0.16.0" +description = "Fast implementation of asyncio event loop on top of libuv" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +dev = ["Cython (>=0.29.24,<0.30.0)", "pytest (>=3.6.0)", "Sphinx (>=4.1.2,<4.2.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "psutil", "pycodestyle (>=2.7.0,<2.8.0)", "pyOpenSSL (>=19.0.0,<19.1.0)", "mypy (>=0.800)"] +docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)"] +test = ["aiohttp", "flake8 (>=3.9.2,<3.10.0)", "psutil", "pycodestyle (>=2.7.0,<2.8.0)", "pyOpenSSL (>=19.0.0,<19.1.0)", "mypy (>=0.800)"] + +[metadata] +lock-version = "1.1" +python-versions = "^3.9" +content-hash = "333b3e74778377251713c2011a0b1bd6630a1e082e5b7a3b8700ccf195626cd3" + +[metadata.files] +aiomisc = [ + {file = "aiomisc-15.7.3-py3-none-any.whl", hash = "sha256:0403e83268e98d0f2a125a70d13303fe1a2358e36db3daf02df032c7fa4f1525"}, + {file = "aiomisc-15.7.3.tar.gz", hash = "sha256:ba250a34bd4609ced36111cb50580f57c3d52f3955f953a53ecb2986988baedc"}, +] +anyio = [ + {file = "anyio-3.5.0-py3-none-any.whl", hash = "sha256:b5fa16c5ff93fa1046f2eeb5bbff2dad4d3514d6cda61d02816dba34fa8c3c2e"}, + {file = "anyio-3.5.0.tar.gz", hash = "sha256:a0aeffe2fb1fdf374a8e4b471444f0f3ac4fb9f5a5b542b48824475e0042a5a6"}, +] +atomicwrites = [ + {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, + {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, +] +attrs = [ + {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, + {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, +] +black = [ + {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"}, + {file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"}, + {file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"}, + {file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"}, + {file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"}, + {file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"}, + {file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"}, + {file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"}, + {file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"}, + {file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"}, + {file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"}, + {file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"}, + {file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"}, + {file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"}, + {file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"}, + {file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"}, + {file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"}, + {file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"}, +] +cached-property = [ + {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, + {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, +] +certifi = [ + {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, + {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, +] +charset-normalizer = [ + {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, + {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, +] +click = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] +colorama = [ + {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, +] +colorlog = [ + {file = "colorlog-6.6.0-py2.py3-none-any.whl", hash = "sha256:351c51e866c86c3217f08e4b067a7974a678be78f07f85fc2d55b8babde6d94e"}, + {file = "colorlog-6.6.0.tar.gz", hash = "sha256:344f73204009e4c83c5b6beb00b3c45dc70fcdae3c80db919e0a4171d006fde8"}, +] +coverage = [ + {file = "coverage-6.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9b27d894748475fa858f9597c0ee1d4829f44683f3813633aaf94b19cb5453cf"}, + {file = "coverage-6.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37d1141ad6b2466a7b53a22e08fe76994c2d35a5b6b469590424a9953155afac"}, + {file = "coverage-6.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9987b0354b06d4df0f4d3e0ec1ae76d7ce7cbca9a2f98c25041eb79eec766f1"}, + {file = "coverage-6.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:26e2deacd414fc2f97dd9f7676ee3eaecd299ca751412d89f40bc01557a6b1b4"}, + {file = "coverage-6.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dd8bafa458b5c7d061540f1ee9f18025a68e2d8471b3e858a9dad47c8d41903"}, + {file = "coverage-6.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:46191097ebc381fbf89bdce207a6c107ac4ec0890d8d20f3360345ff5976155c"}, + {file = "coverage-6.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6f89d05e028d274ce4fa1a86887b071ae1755082ef94a6740238cd7a8178804f"}, + {file = "coverage-6.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:58303469e9a272b4abdb9e302a780072c0633cdcc0165db7eec0f9e32f901e05"}, + {file = "coverage-6.3.2-cp310-cp310-win32.whl", hash = "sha256:2fea046bfb455510e05be95e879f0e768d45c10c11509e20e06d8fcaa31d9e39"}, + {file = "coverage-6.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:a2a8b8bcc399edb4347a5ca8b9b87e7524c0967b335fbb08a83c8421489ddee1"}, + {file = "coverage-6.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f1555ea6d6da108e1999b2463ea1003fe03f29213e459145e70edbaf3e004aaa"}, + {file = "coverage-6.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5f4e1edcf57ce94e5475fe09e5afa3e3145081318e5fd1a43a6b4539a97e518"}, + {file = "coverage-6.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a15dc0a14008f1da3d1ebd44bdda3e357dbabdf5a0b5034d38fcde0b5c234b7"}, + {file = "coverage-6.3.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21b7745788866028adeb1e0eca3bf1101109e2dc58456cb49d2d9b99a8c516e6"}, + {file = "coverage-6.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8ce257cac556cb03be4a248d92ed36904a59a4a5ff55a994e92214cde15c5bad"}, + {file = "coverage-6.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b0be84e5a6209858a1d3e8d1806c46214e867ce1b0fd32e4ea03f4bd8b2e3359"}, + {file = "coverage-6.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:acf53bc2cf7282ab9b8ba346746afe703474004d9e566ad164c91a7a59f188a4"}, + {file = "coverage-6.3.2-cp37-cp37m-win32.whl", hash = "sha256:8bdde1177f2311ee552f47ae6e5aa7750c0e3291ca6b75f71f7ffe1f1dab3dca"}, + {file = "coverage-6.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b31651d018b23ec463e95cf10070d0b2c548aa950a03d0b559eaa11c7e5a6fa3"}, + {file = "coverage-6.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:07e6db90cd9686c767dcc593dff16c8c09f9814f5e9c51034066cad3373b914d"}, + {file = "coverage-6.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2c6dbb42f3ad25760010c45191e9757e7dce981cbfb90e42feef301d71540059"}, + {file = "coverage-6.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c76aeef1b95aff3905fb2ae2d96e319caca5b76fa41d3470b19d4e4a3a313512"}, + {file = "coverage-6.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cf5cfcb1521dc3255d845d9dca3ff204b3229401994ef8d1984b32746bb45ca"}, + {file = "coverage-6.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fbbdc8d55990eac1b0919ca69eb5a988a802b854488c34b8f37f3e2025fa90d"}, + {file = "coverage-6.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ec6bc7fe73a938933d4178c9b23c4e0568e43e220aef9472c4f6044bfc6dd0f0"}, + {file = "coverage-6.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9baff2a45ae1f17c8078452e9e5962e518eab705e50a0aa8083733ea7d45f3a6"}, + {file = "coverage-6.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd9e830e9d8d89b20ab1e5af09b32d33e1a08ef4c4e14411e559556fd788e6b2"}, + {file = "coverage-6.3.2-cp38-cp38-win32.whl", hash = "sha256:f7331dbf301b7289013175087636bbaf5b2405e57259dd2c42fdcc9fcc47325e"}, + {file = "coverage-6.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:68353fe7cdf91f109fc7d474461b46e7f1f14e533e911a2a2cbb8b0fc8613cf1"}, + {file = "coverage-6.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b78e5afb39941572209f71866aa0b206c12f0109835aa0d601e41552f9b3e620"}, + {file = "coverage-6.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4e21876082ed887baed0146fe222f861b5815455ada3b33b890f4105d806128d"}, + {file = "coverage-6.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34626a7eee2a3da12af0507780bb51eb52dca0e1751fd1471d0810539cefb536"}, + {file = "coverage-6.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ebf730d2381158ecf3dfd4453fbca0613e16eaa547b4170e2450c9707665ce7"}, + {file = "coverage-6.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd6fe30bd519694b356cbfcaca9bd5c1737cddd20778c6a581ae20dc8c04def2"}, + {file = "coverage-6.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:96f8a1cb43ca1422f36492bebe63312d396491a9165ed3b9231e778d43a7fca4"}, + {file = "coverage-6.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:dd035edafefee4d573140a76fdc785dc38829fe5a455c4bb12bac8c20cfc3d69"}, + {file = "coverage-6.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5ca5aeb4344b30d0bec47481536b8ba1181d50dbe783b0e4ad03c95dc1296684"}, + {file = "coverage-6.3.2-cp39-cp39-win32.whl", hash = "sha256:f5fa5803f47e095d7ad8443d28b01d48c0359484fec1b9d8606d0e3282084bc4"}, + {file = "coverage-6.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:9548f10d8be799551eb3a9c74bbf2b4934ddb330e08a73320123c07f95cc2d92"}, + {file = "coverage-6.3.2-pp36.pp37.pp38-none-any.whl", hash = "sha256:18d520c6860515a771708937d2f78f63cc47ab3b80cb78e86573b0a760161faf"}, + {file = "coverage-6.3.2.tar.gz", hash = "sha256:03e2a7826086b91ef345ff18742ee9fc47a6839ccd517061ef8fa1976e652ce9"}, +] +crontab = [ + {file = "crontab-0.23.0.tar.gz", hash = "sha256:ca79dede9c2f572bb32f38703e8fddcf3427e86edc838f2ffe7ae4b9ee2b0733"}, +] +dependency-injector = [ + {file = "dependency-injector-4.39.1.tar.gz", hash = "sha256:9ab76dc5e19b2692aaca49e00f9b41a087138d139b0ec985f92ff0498f038772"}, + {file = "dependency_injector-4.39.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c788a3d5482e63b5fd55e14fc258f1ff0b51b411927ab132ef0f689cb5d1183f"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0832e0457a360725cd1d1037b77b85478aeeaacc60e85ecceeb8020409e7b62"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d51998fff9704fd01d11c3c48f4e88d8506cb6afa1ee41409a881a5a51dae3fc"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea484cd13fc62966bf5582df0816205feee072d18f228aac75f7807b43f223ae"}, + {file = "dependency_injector-4.39.1-cp310-cp310-win32.whl", hash = "sha256:17389e53ec29ca13570319cf2065dcc4c2f6d36db5dd792bb1e8f2c39a9f146b"}, + {file = "dependency_injector-4.39.1-cp310-cp310-win_amd64.whl", hash = "sha256:55b0988489267c5a580f419133770ffe293057f2064da1c9ad6a2cc69666739b"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b297c3e79d3633cc56366386ae1f7dbce1587673cca2f559c368c1e936a1fa94"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2728827c5abb2420c5811e218262ae1b77a48e76cc9eebc6b4f55fee48a1a18d"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:029e42b064ab8cb5b2559be040ff682c7aa81592f1654a82355475956df17803"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:305e3db3f4bf40f64caaa1303e03005174e78d2339d2ae517b34c011ec2300f9"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-win32.whl", hash = "sha256:a661dd23a5e4e2f6bf4a729de7fadbe148c9a4a298dbcadfc5a94584b6930970"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-win_amd64.whl", hash = "sha256:340d6e7af5c4729d20c837d6d1e8a2626c24a05259dff746406cc823e26ba1e7"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a1553dac1c95f0de1f910b0025ee4570ea078a07d576bcdc2168990e719cea50"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c7baaa64d93359ee08c15d68579cc803e11d9becaf961f5a66b94ff627248e1"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7a27bf1951a066cf347b886cc7ab0f37dcbd1ad59bffcfe721c8c12a189a150d"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da6e2d685f7d0c65257f08133b68d9bf74ec319b90a0f21b4f629d168ce5f68f"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-win32.whl", hash = "sha256:a8ddd03ca86e67e9d3cc038793d34fbfccab12e6145df813e72bf14f9371f2ea"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-win_amd64.whl", hash = "sha256:e01a319ea05cd86b520201386dcb53a81a5400cb82fcc2f006bd7e92c0c51a0a"}, + {file = "dependency_injector-4.39.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4704804bde25b694aa65201927937a9d82d8bc055cb3dadc68eb05988bd34fa9"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0935d50b263169e7b0826a2fb6be80d6a4f2a7c59e6dd9876f86da3243bea9eb"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3c34aa5abb1826b6189f47daf6e469d4293c1d01693233da2c1b923816270cc5"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:db64904c9b9a88756cfece3e3ed078a2b57127642711dd08af342dba8abf9667"}, + {file = "dependency_injector-4.39.1-cp38-cp38-win32.whl", hash = "sha256:66ebe728194adc8720dbc4d662edbbfa55659ff23c9c493fb2dae0bfd4df5734"}, + {file = "dependency_injector-4.39.1-cp38-cp38-win_amd64.whl", hash = "sha256:4349974620f630d6726808e1291ec99713b64d449b84eb01581ee807a5a5c224"}, + {file = "dependency_injector-4.39.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d87cad0899b05cd08931bfb68ddf7be77711a67b0649c37f2045d7808977b082"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8efd965e5cfdd9f339ec895e73c119569851adedc175088d34a670f5206fea63"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:27f69485ca6b85c31d162ee86cf6ef71bb71dce9cd2b5d0745425dfc551eefa1"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a25b63de59dff04ec78f5161f00c0222a04a23def5d1f0eda14e389a32baf428"}, + {file = "dependency_injector-4.39.1-cp39-cp39-win32.whl", hash = "sha256:a14274f50d125b4579314c355e22af07def1a96641ca94bd75edcf1400b89477"}, + {file = "dependency_injector-4.39.1-cp39-cp39-win_amd64.whl", hash = "sha256:9950039d00625f9252cd26378a4406342b256886bb61e4db8b65e9f01270f53e"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6d7f39cd54678741e132e13da3a1367ac18058cbda61fe39d61c8583aa6fd757"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2368c7ba3c9ffaf816ea0f2d14c78d481491b805f62ac8496a78a51397d4689"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:84e32407bb16c58aa0d4b5ed8485537bc66ccc14cfffae7022f1204e35ec939a"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f2d80a42c546e1f934d427b071630d86653cd4a60c74b570c4ffb03025c1f1f9"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ca126bbed370b8c002c859ebeb76f6d83eba2d7fb5d66f37f47cfc19661d2889"}, +] +fastavro = [ + {file = "fastavro-1.4.11-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:44f01008f95d685edacc4b10366c755d25612df00924349f7d34a29f08522ce3"}, + {file = "fastavro-1.4.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18f5e736d12e67348f253da8a332d7c3b483ca04f2b6e772befa79d1a46bac9d"}, + {file = "fastavro-1.4.11-cp310-cp310-win_amd64.whl", hash = "sha256:8dca11bc3191cd7de0a3c4b76a70dac493356a219e96ebcde0def1f06faddef7"}, + {file = "fastavro-1.4.11-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:7a2a0bf03686f9d860e8f8476be000f5b3e6cc9af6853dbabab2ef9cfa5dc3a0"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c17e3decfac260e1be4d02d1903d2483eec2f3ce7f92c9b808a0f6a81572c4b"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19ba25c6529f50722a7618cc4ca24c7d265def57fd9f94e4e554e1df8cce38d2"}, + {file = "fastavro-1.4.11-cp37-cp37m-win_amd64.whl", hash = "sha256:ceaba04da9419f40899a670eb62eb373a127b511bb8e3ae4f6f1f23ec49bd0e4"}, + {file = "fastavro-1.4.11-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:732eab3a1ae5d2c3f4b52e747c55bcc41c4df0eb7e8a395038080741a3c0a934"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c03d3c802b71f44e7b3442abae961bba996258244bd222b242ad1e5cb7754e57"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cb7475a9b25b9f8aebe7eb756dafedd0369434571062f3883d894281befd7c"}, + {file = "fastavro-1.4.11-cp38-cp38-win_amd64.whl", hash = "sha256:ce0776f54591aef90bcd02bd919964abe4c2ad2a10a4336c3a1b66cef289b41c"}, + {file = "fastavro-1.4.11-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:621e72cc365c9539d7590e7b43e48a62e6bfb4c2de7c16837fed54d113d7312c"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:842b25782f911ee8c626f9d9fedc2ef01aeac272536fe90ee6d45b2ae7cdb024"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8491bfcba25c9d661289f884688e5a4f56f2ee389a240d0ad02692495a9a087"}, + {file = "fastavro-1.4.11-cp39-cp39-win_amd64.whl", hash = "sha256:c94130a8c8d80073eb0276844915aa5e928ae322024e76dc57943542ccda211c"}, + {file = "fastavro-1.4.11.tar.gz", hash = "sha256:7c64332ad52de0134be9a933ca986514c3ff85c63d54bc5398c31f0498ac1820"}, +] +flake8 = [ + {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, + {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, +] +h11 = [ + {file = "h11-0.12.0-py3-none-any.whl", hash = "sha256:36a3cb8c0a032f56e2da7084577878a035d3b61d104230d4bd49c0c6b555a9c6"}, + {file = "h11-0.12.0.tar.gz", hash = "sha256:47222cb6067e4a307d535814917cd98fd0a57b6788ce715755fa2b6c28b56042"}, +] +httpcore = [ + {file = "httpcore-0.14.7-py3-none-any.whl", hash = "sha256:47d772f754359e56dd9d892d9593b6f9870a37aeb8ba51e9a88b09b3d68cfade"}, + {file = "httpcore-0.14.7.tar.gz", hash = "sha256:7503ec1c0f559066e7e39bc4003fd2ce023d01cf51793e3c173b864eb456ead1"}, +] +httpx = [ + {file = "httpx-0.22.0-py3-none-any.whl", hash = "sha256:e35e83d1d2b9b2a609ef367cc4c1e66fd80b750348b20cc9e19d1952fc2ca3f6"}, + {file = "httpx-0.22.0.tar.gz", hash = "sha256:d8e778f76d9bbd46af49e7f062467e3157a5a3d2ae4876a4bbfd8a51ed9c9cb4"}, +] +idna = [ + {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, + {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, +] +iniconfig = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] +isort = [ + {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, + {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, +] +mccabe = [ + {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, + {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, +] +minos-microservice-common = [] +minos-microservice-networks = [] +mypy-extensions = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] +orjson = [ + {file = "orjson-3.6.8-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:3a287a650458de2211db03681b71c3e5cb2212b62f17a39df8ad99fc54855d0f"}, + {file = "orjson-3.6.8-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:5204e25c12cea58e524fc82f7c27ed0586f592f777b33075a92ab7b3eb3687c2"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77e8386393add64f959c044e0fb682364fd0e611a6f477aa13f0e6a733bd6a28"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:279f2d2af393fdf8601020744cb206b91b54ad60fb8401e0761819c7bda1f4e4"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:c31c9f389be7906f978ed4192eb58a4b74a37ad60556a0b88ddc47c576697770"}, + {file = "orjson-3.6.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0db5c5a0c5b89f092d52f6e5a3701660a9d6ffa9e2968b3ce17c2bc4f5eb0414"}, + {file = "orjson-3.6.8-cp310-none-win_amd64.whl", hash = "sha256:eb22485847b9a0c4bbedc668df860126ac931edbed1d456cf41a59f3cb961ed8"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:1a5fe569310bc819279bd4d5f2c349910b104ed3207936246dd5d5e0b085e74a"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:ccb356a47ab1067cd3549847e9db1d279a63fe0482d315b3ffd6e7abef35ef77"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab29c069c222248ce302a25855b4e1664f9436e8ae5a131fb0859daf31676d2b"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2b5e4cba9e774ac011071d9d27760f97f4b8cd46003e971d122e712f971345"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:c311ec504414d22834d5b972a209619925b48263856a11a14d90230f9682d49c"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:a3dfec7950b90fb8d143743503ee53fa06b32e6068bdea792fc866284da3d71d"}, + {file = "orjson-3.6.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b890dbbada2cbb26eb29bd43a848426f007f094bb0758df10dfe7a438e1cb4b4"}, + {file = "orjson-3.6.8-cp37-none-win_amd64.whl", hash = "sha256:9143ae2c52771525be9ad11a7a8cc8e7fd75391b107e7e644a9e0050496f6b4f"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:33a82199fd42f6436f833e210ae5129c922a5c355629356ca7a8e82964da7285"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:90159ea8b9a5a2a98fa33dc7b421cfac4d2ae91ba5e1058f5909e7f059f6b467"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:656fbe15d9ef0733e740d9def78f4fdb4153102f4836ee774a05123499005931"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7be3be6153843e0f01351b1313a5ad4723595427680dac2dfff22a37e652ce02"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:dd24f66b6697ee7424f7da575ec6cbffc8ede441114d53470949cda4d97c6e56"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:b07c780f7345ecf5901356dc21dee0669defc489c38ce7b9ab0f5e008cc0385c"}, + {file = "orjson-3.6.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ea32015a5d8a4ce00d348a0de5dc7040e0ad58f970a8fcbb5713a1eac129e493"}, + {file = "orjson-3.6.8-cp38-none-win_amd64.whl", hash = "sha256:c5a3e382194c838988ec128a26b08aa92044e5e055491cc4056142af0c1c54d7"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:83a8424e857ae1bf53530e88b4eb2f16ca2b489073b924e655f1575cacd7f52a"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:81e1a6a2d67f15007dadacbf9ba5d3d79237e5e33786c028557fe5a2b72f1c9a"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:137b539881c77866eba86ff6a11df910daf2eb9ab8f1acae62f879e83d7c38af"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cbd358f3b3ad539a27e36900e8e7d172d0e1b72ad9dd7d69544dcbc0f067ee7"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:6ab94701542d40b90903ecfc339333f458884979a01cb9268bc662cc67a5f6d8"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:32b6f26593a9eb606b40775826beb0dac152e3d224ea393688fced036045a821"}, + {file = "orjson-3.6.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:afd9e329ebd3418cac3cd747769b1d52daa25fa672bbf414ab59f0e0881b32b9"}, + {file = "orjson-3.6.8-cp39-none-win_amd64.whl", hash = "sha256:0c89b419914d3d1f65a1b0883f377abe42a6e44f6624ba1c63e8846cbfc2fa60"}, + {file = "orjson-3.6.8.tar.gz", hash = "sha256:e19d23741c5de13689bb316abfccea15a19c264e3ec8eb332a5319a583595ace"}, +] +packaging = [ + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, +] +pathspec = [ + {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, + {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, +] +platformdirs = [ + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, +] +pluggy = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] +py = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] +pycodestyle = [ + {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"}, + {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"}, +] +pyflakes = [ + {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, + {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, +] +pyjwt = [ + {file = "PyJWT-2.3.0-py3-none-any.whl", hash = "sha256:e0c4bb8d9f0af0c7f5b1ec4c5036309617d03d56932877f2f7a0beeb5318322f"}, + {file = "PyJWT-2.3.0.tar.gz", hash = "sha256:b888b4d56f06f6dcd777210c334e69c737be74755d3e5e9ee3fe67dc18a0ee41"}, +] +pyparsing = [ + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, +] +pytest = [ + {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, + {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, +] +pytz = [ + {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"}, + {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"}, +] +pyyaml = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] +rfc3986 = [ + {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, + {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, +] +six = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] +sniffio = [ + {file = "sniffio-1.2.0-py3-none-any.whl", hash = "sha256:471b71698eac1c2112a40ce2752bb2f4a4814c22a54a3eed3676bc0f5ca9f663"}, + {file = "sniffio-1.2.0.tar.gz", hash = "sha256:c4666eecec1d3f50960c6bdf61ab7bc350648da6c126e3cf6898d8cd4ddcd3de"}, +] +toml = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] +tomli = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] +typing-extensions = [ + {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, + {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, +] +uvloop = [ + {file = "uvloop-0.16.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6224f1401025b748ffecb7a6e2652b17768f30b1a6a3f7b44660e5b5b690b12d"}, + {file = "uvloop-0.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:30ba9dcbd0965f5c812b7c2112a1ddf60cf904c1c160f398e7eed3a6b82dcd9c"}, + {file = "uvloop-0.16.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bd53f7f5db562f37cd64a3af5012df8cac2c464c97e732ed556800129505bd64"}, + {file = "uvloop-0.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:772206116b9b57cd625c8a88f2413df2fcfd0b496eb188b82a43bed7af2c2ec9"}, + {file = "uvloop-0.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b572256409f194521a9895aef274cea88731d14732343da3ecdb175228881638"}, + {file = "uvloop-0.16.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:04ff57aa137230d8cc968f03481176041ae789308b4d5079118331ab01112450"}, + {file = "uvloop-0.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a19828c4f15687675ea912cc28bbcb48e9bb907c801873bd1519b96b04fb805"}, + {file = "uvloop-0.16.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e814ac2c6f9daf4c36eb8e85266859f42174a4ff0d71b99405ed559257750382"}, + {file = "uvloop-0.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bd8f42ea1ea8f4e84d265769089964ddda95eb2bb38b5cbe26712b0616c3edee"}, + {file = "uvloop-0.16.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:647e481940379eebd314c00440314c81ea547aa636056f554d491e40503c8464"}, + {file = "uvloop-0.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e0d26fa5875d43ddbb0d9d79a447d2ace4180d9e3239788208527c4784f7cab"}, + {file = "uvloop-0.16.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6ccd57ae8db17d677e9e06192e9c9ec4bd2066b77790f9aa7dede2cc4008ee8f"}, + {file = "uvloop-0.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:089b4834fd299d82d83a25e3335372f12117a7d38525217c2258e9b9f4578897"}, + {file = "uvloop-0.16.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98d117332cc9e5ea8dfdc2b28b0a23f60370d02e1395f88f40d1effd2cb86c4f"}, + {file = "uvloop-0.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e5f2e2ff51aefe6c19ee98af12b4ae61f5be456cd24396953244a30880ad861"}, + {file = "uvloop-0.16.0.tar.gz", hash = "sha256:f74bc20c7b67d1c27c72601c78cf95be99d5c2cdd4514502b4f3eb0933ff1228"}, +] diff --git a/packages/plugins/minos-discovery-kong/poetry.toml b/packages/plugins/minos-discovery-kong/poetry.toml new file mode 100644 index 000000000..ab1033bd3 --- /dev/null +++ b/packages/plugins/minos-discovery-kong/poetry.toml @@ -0,0 +1,2 @@ +[virtualenvs] +in-project = true diff --git a/packages/plugins/minos-discovery-kong/pyproject.toml b/packages/plugins/minos-discovery-kong/pyproject.toml new file mode 100644 index 000000000..be802b3cb --- /dev/null +++ b/packages/plugins/minos-discovery-kong/pyproject.toml @@ -0,0 +1,52 @@ +[tool.poetry] +name = "minos-discovery-kong" +version = "0.7.0" +description = "The minos-kong plugin offer an interface that permit integrate Minos Microservice with Kong API Gateway" +readme = "README.md" +repository = "https://github.com/minos-framework/minos-python" +homepage = "https://www.minos.run/" +authors = ["Minos Framework Devs "] +license = "MIT" +classifiers = [ + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "Natural Language :: English", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.9", +] +keywords = [ + "clariteia", + "minos", + "microservice", + "saga", + "kong" +] +packages = [ + { include = "minos" }, +] +include = [ + { path = "AUTHORS.md", format = "sdist" }, + { path = "HISTORY.md", format = "sdist" }, + { path = "LICENSE", format = "sdist" }, +] + +[tool.poetry.dependencies] +python = "^3.9" +minos-microservice-common = "^0.7.0" +minos-microservice-networks = "^0.7.0" +httpx = "^0.22.0" +pytz = "^2022.1" +PyJWT = "^2.3.0" + +[tool.poetry.dev-dependencies] +minos-microservice-common = { path = "../../core/minos-microservice-common", develop = true } +minos-microservice-networks = { path = "../../core/minos-microservice-networks", develop = true } +black = "^22.1" +isort = "^5.8.0" +pytest = "^6.2.4" +coverage = "^6.3" +flake8 = "^4.0.1" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/packages/plugins/minos-discovery-kong/setup.cfg b/packages/plugins/minos-discovery-kong/setup.cfg new file mode 100644 index 000000000..dbb9ac849 --- /dev/null +++ b/packages/plugins/minos-discovery-kong/setup.cfg @@ -0,0 +1,28 @@ +[coverage:run] +source = + minos + +[coverage:report] +exclude_lines = + pragma: no cover + raise NotImplementedError + if TYPE_CHECKING: + pass +precision = 2 + +[flake8] +filename = + ./minos/**/*.py, + ./tests/**/*.py, + ./examples/**/*.py +max-line-length = 120 +per-file-ignores = + ./**/__init__.py:F401,W391 + +[isort] +known_first_party=minos +multi_line_output = 3 +include_trailing_comma = True +force_grid_wrap = 1 +use_parentheses = True +line_length = 120 diff --git a/packages/plugins/minos-discovery-kong/tests/Makefile b/packages/plugins/minos-discovery-kong/tests/Makefile new file mode 100644 index 000000000..c874587ac --- /dev/null +++ b/packages/plugins/minos-discovery-kong/tests/Makefile @@ -0,0 +1,30 @@ +up: + $(MAKE) build + echo "Starting containers..." + docker-compose up --quiet-pull --detach + +build: + echo "Building images..." + docker-compose build --progress=plain --pull + +down: + echo "Stopping containers..." + docker-compose down --remove-orphans + +clean: + echo "Cleaning..." + docker system prune -a + docker volume rm $(docker volume ls -q) + docker rm -f $(docker ps -a -q) + +logs: + echo "Showing logs..." + docker-compose logs --follow + +export-logs: + echo "Showing logs..." + docker-compose logs --no-color > logs.txt + +integration-tests: + echo "Running Integration Tests..." + docker-compose run tavern \ No newline at end of file diff --git a/packages/plugins/minos-discovery-kong/tests/__init__.py b/packages/plugins/minos-discovery-kong/tests/__init__.py new file mode 100644 index 000000000..84e6145e1 --- /dev/null +++ b/packages/plugins/minos-discovery-kong/tests/__init__.py @@ -0,0 +1 @@ +"""Unit test package for minos_microservice_networks.""" diff --git a/packages/plugins/minos-discovery-kong/tests/docker-compose.yml b/packages/plugins/minos-discovery-kong/tests/docker-compose.yml new file mode 100644 index 000000000..d73637ad9 --- /dev/null +++ b/packages/plugins/minos-discovery-kong/tests/docker-compose.yml @@ -0,0 +1,113 @@ +version: '3.9' + +x-kong-config: &kong-env + KONG_DATABASE: postgres + KONG_PG_DATABASE: kong + KONG_PG_HOST: db + KONG_PG_USER: kong + KONG_PG_PASSWORD: kong + +volumes: + kong_data: {} + konga_data: + kong_prefix_vol: + driver_opts: + type: tmpfs + device: tmpfs + kong_tmp_vol: + driver_opts: + type: tmpfs + device: tmpfs + +services: + kong-migrations: + image: kong/kong-gateway:2.8.0.0-alpine + command: kong migrations bootstrap + depends_on: + - db + environment: + KONG_DATABASE: postgres + KONG_PG_DATABASE: kong + KONG_PG_HOST: db + KONG_PG_USER: kong + KONG_PG_PASSWORD: kong + restart: on-failure + + kong-migrations-up: + image: kong/kong-gateway:2.8.0.0-alpine + command: kong migrations up && kong migrations finish + depends_on: + - db + environment: + KONG_DATABASE: postgres + KONG_PG_DATABASE: kong + KONG_PG_HOST: db + KONG_PG_USER: kong + KONG_PG_PASSWORD: kong + restart: on-failure + + kong: + image: kong/kong-gateway:2.8.0.0-alpine + user: kong + environment: + KONG_DATABASE: postgres + KONG_PG_DATABASE: kong + KONG_PG_HOST: db + KONG_PG_USER: kong + KONG_PG_PASSWORD: kong + KONG_ADMIN_ACCESS_LOG: /dev/stdout + KONG_ADMIN_ERROR_LOG: /dev/stderr + KONG_PROXY_LISTEN: 0.0.0.0:8000 + KONG_ADMIN_LISTEN: 0.0.0.0:8001 + KONG_PROXY_ACCESS_LOG: /dev/stdout + KONG_PROXY_ERROR_LOG: /dev/stderr + KONG_PREFIX: /var/run/kong + KONG_LOG_LEVEL: debug + KONG_DECLARATIVE_CONFIG: "/opt/kong/kong.yaml" + ports: + - "0.0.0.0:8000:8000/tcp" + - "0.0.0.0:8443:8443/tcp" + - "127.0.0.1:8001:8001/tcp" + - "127.0.0.1:8444:8444/tcp" + healthcheck: + test: ["CMD", "kong", "health"] + interval: 10s + timeout: 10s + retries: 10 + restart: on-failure:5 + read_only: true + volumes: + - kong_prefix_vol:/var/run/kong + - kong_tmp_vol:/tmp + - ./config:/opt/kong + security_opt: + - no-new-privileges + + db: + image: postgres:9.5 + environment: + POSTGRES_DB: kong + POSTGRES_USER: kong + POSTGRES_PASSWORD: kong + healthcheck: + test: ["CMD", "pg_isready", "-U", "kong"] + interval: 30s + timeout: 30s + retries: 3 + restart: on-failure + stdin_open: true + tty: true + volumes: + - kong_data:/var/lib/postgresql/data + + konga: + image: pantsel/konga + ports: + - 1337:1337 + links: + - kong:kong + container_name: konga + #networks: + # - kong-net + environment: + - NODE_ENV=production diff --git a/packages/plugins/minos-discovery-kong/tests/test_config.yml b/packages/plugins/minos-discovery-kong/tests/test_config.yml new file mode 100644 index 000000000..dbcda81b7 --- /dev/null +++ b/packages/plugins/minos-discovery-kong/tests/test_config.yml @@ -0,0 +1,7 @@ +discovery: + connector: minos.networks.DiscoveryConnector + client: minos.networks.InMemoryDiscoveryClient + auth-type: jwt + token-exp: 60 + host: localhost + port: 8001 diff --git a/packages/plugins/minos-discovery-kong/tests/test_config_no_auth.yml b/packages/plugins/minos-discovery-kong/tests/test_config_no_auth.yml new file mode 100644 index 000000000..4958f9f90 --- /dev/null +++ b/packages/plugins/minos-discovery-kong/tests/test_config_no_auth.yml @@ -0,0 +1,5 @@ +discovery: + connector: minos.networks.DiscoveryConnector + client: minos.networks.InMemoryDiscoveryClient + host: localhost + port: 8001 diff --git a/packages/plugins/minos-discovery-kong/tests/test_kong/__init__.py b/packages/plugins/minos-discovery-kong/tests/test_kong/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/plugins/minos-discovery-kong/tests/test_kong/test_client.py b/packages/plugins/minos-discovery-kong/tests/test_kong/test_client.py new file mode 100644 index 000000000..551f6257e --- /dev/null +++ b/packages/plugins/minos-discovery-kong/tests/test_kong/test_client.py @@ -0,0 +1,307 @@ +import os +import unittest +from datetime import ( + datetime, + timedelta, +) +from uuid import ( + uuid4, +) + +import httpx +from pytz import ( + utc, +) + +from minos.common import ( + Config, +) +from minos.plugins.kong import ( + KongClient, + KongDiscoveryClient, +) +from tests.utils import ( + CONFIG_FILE_PATH, + TEST_HOST, +) + +PROTOCOL = "http" + + +class TestKongDiscoveryClient(unittest.IsolatedAsyncioTestCase): + KONG_HOST = os.getenv("KONG_HOST", "localhost") + KONG_PORT = os.getenv("KONG_PORT", 8001) + + def setUp(self) -> None: + self.client = KongDiscoveryClient(self.KONG_HOST, self.KONG_PORT, circuit_breaker_time=0.1) + self.kong = KongClient() + + @staticmethod + def generate_underscore_uuid(): + name = str(uuid4()) + return name.replace("-", "_") + + async def test_register_service(self): + name = self.generate_underscore_uuid() + response = await self.kong.register_service( + discovery_route=self.client.route, + service_name=name, + microservice_host=TEST_HOST, + microservice_port=5660, + ) + + self.assertTrue(201 == response.status_code) + + async with httpx.AsyncClient() as client: + url = f"{self.client.route}/services/{name}" + response = await client.get(url) + response_data = response.json() + self.assertTrue(200 == response.status_code) + self.assertEqual(5660, response_data["port"]) + self.assertEqual(TEST_HOST, response_data["host"]) + self.assertEqual(PROTOCOL, response_data["protocol"]) + + async def test_create_consumer(self): + user_uuid = uuid4() + user_name = self.generate_underscore_uuid() + response = await self.kong.create_consumer(username=user_name, user=user_uuid, tags=[]) + + self.assertTrue(201 == response.status_code) + + async def test_add_basic_auth_to_consumer(self): + user_uuid = uuid4() + user_name = self.generate_underscore_uuid() + response = await self.kong.create_consumer(username=user_name, user=user_uuid, tags=[]) + + self.assertTrue(201 == response.status_code) + resp = response.json() + + response = await self.kong.add_basic_auth_to_consumer(user_name, "test", resp["id"]) + + self.assertTrue(201 == response.status_code) + + async def test_add_jwt_to_consumer(self): + user_uuid = uuid4() + user_name = self.generate_underscore_uuid() + response = await self.kong.create_consumer(username=user_name, user=user_uuid, tags=[]) + + self.assertTrue(201 == response.status_code) + resp = response.json() + + response = await self.kong.add_jwt_to_consumer(consumer=resp["id"]) + + self.assertTrue(201 == response.status_code) + + async def test_add_acl_to_consumer(self): + user_uuid = uuid4() + user_name = self.generate_underscore_uuid() + response = await self.kong.create_consumer(username=user_name, user=user_uuid, tags=[]) + + self.assertTrue(201 == response.status_code) + resp = response.json() + + response = await self.kong.add_acl_to_consumer(role="admin", consumer=resp["id"]) + + self.assertTrue(201 == response.status_code) + + async def test_activate_acl_plugin_on_service(self): + name = self.generate_underscore_uuid() + response = await self.kong.register_service( + discovery_route=self.client.route, + service_name=name, + microservice_host=TEST_HOST, + microservice_port=5660, + ) + + self.assertTrue(201 == response.status_code) + + response = await self.kong.activate_acl_plugin_on_service(service_name=name, allow=["admin"]) + + self.assertTrue(201 == response.status_code) + + async def test_activate_basic_auth_plugin_on_service(self): + name = self.generate_underscore_uuid() + response = await self.kong.register_service( + discovery_route=self.client.route, + service_name=name, + microservice_host=TEST_HOST, + microservice_port=5660, + ) + + self.assertTrue(201 == response.status_code) + + response = await self.kong.activate_basic_auth_plugin_on_service(service_name=name) + + self.assertTrue(201 == response.status_code) + + async def test_activate_basic_auth_plugin_on_route(self): + name = self.generate_underscore_uuid() + response = await self.kong.register_service( + discovery_route=self.client.route, + service_name=name, + microservice_host=TEST_HOST, + microservice_port=5660, + ) + + self.assertTrue(201 == response.status_code) + res = response.json() + response = await self.kong.create_route( + endpoint=self.client.route, + protocols=["http"], + methods=["GET"], + paths=["/foo"], + service=res["id"], + regex_priority=2, + strip_path=False, + ) + + self.assertTrue(201 == response.status_code) + + res = response.json() + response = await self.kong.activate_basic_auth_plugin_on_route(route_id=res["id"]) + + self.assertTrue(201 == response.status_code) + + async def test_activate_jwt_plugin_on_route(self): + name = self.generate_underscore_uuid() + response = await self.kong.register_service( + discovery_route=self.client.route, + service_name=name, + microservice_host=TEST_HOST, + microservice_port=5660, + ) + + self.assertTrue(201 == response.status_code) + res = response.json() + response = await self.kong.create_route( + endpoint=self.client.route, + protocols=["http"], + methods=["GET"], + paths=["/foo"], + service=res["id"], + regex_priority=0, + strip_path=False, + ) + + self.assertTrue(201 == response.status_code) + + res = response.json() + response = await self.kong.activate_jwt_plugin_on_route(route_id=res["id"]) + + self.assertTrue(201 == response.status_code) + + async def test_jwt_token_generation(self): + user_uuid = uuid4() + user_name = self.generate_underscore_uuid() + response = await self.kong.create_consumer(username=user_name, user=user_uuid, tags=[]) + + self.assertTrue(201 == response.status_code) + resp = response.json() + + response = await self.kong.add_jwt_to_consumer(consumer=resp["id"]) + + self.assertTrue(201 == response.status_code) + resp = response.json() + + token = await self.kong.generate_jwt_token(key=resp["key"], secret=resp["secret"]) + + self.assertGreater(len(token), 50) + + async def test_jwt_token_generation_with_expiration(self): + user_uuid = uuid4() + user_name = self.generate_underscore_uuid() + response = await self.kong.create_consumer(username=user_name, user=user_uuid, tags=[]) + + self.assertTrue(201 == response.status_code) + resp = response.json() + + response = await self.kong.add_jwt_to_consumer(consumer=resp["id"]) + + self.assertTrue(201 == response.status_code) + resp = response.json() + + current = datetime.now(tz=utc) + token = await self.kong.generate_jwt_token( + key=resp["key"], + secret=resp["secret"], + exp=current + timedelta(minutes=10), + nbf=current + timedelta(minutes=9), + ) + + self.assertGreater(len(token), 50) + + async def test_token_decode(self): + res = await self.kong.decode_token( + "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ5ZTBRdURsNG03UW1qbnpFR0pJaUVyQnZieFBqSXM3VyIsImV4cCI6MTY1" + "MDM2NzE0NywibmJmIjoxNjUwMzY3MDI3fQ.SDH5Zq1mUSU0GkCyC_kF81_uoiF45u62Hgwnuv4wl5U" + ) + self.assertIn("iss", res) + self.assertIn("exp", res) + self.assertIn("nbf", res) + + async def test_get_token_by_id(self): + user_uuid = uuid4() + user_name = self.generate_underscore_uuid() + response = await self.kong.create_consumer(username=user_name, user=user_uuid, tags=[]) + + self.assertTrue(201 == response.status_code) + resp = response.json() + + response = await self.kong.add_jwt_to_consumer(consumer=resp["id"]) + + self.assertTrue(201 == response.status_code) + resp = response.json() + + token = await self.kong.generate_jwt_token(key=resp["key"], secret=resp["secret"]) + + self.assertGreater(len(token), 50) + + response = await self.kong.get_jwt_by_id(resp["id"]) + self.assertTrue(200 == response.status_code) + resp = response.json() + + self.assertIn("key", resp) + self.assertIn("secret", resp) + + async def test_get_consumer_jwts(self): + user_uuid = uuid4() + user_name = self.generate_underscore_uuid() + response = await self.kong.create_consumer(username=user_name, user=user_uuid, tags=[]) + + self.assertTrue(201 == response.status_code) + resp = response.json() + consumer_id = resp["id"] + response = await self.kong.add_jwt_to_consumer(consumer=resp["id"]) + + self.assertTrue(201 == response.status_code) + + response = await self.kong.get_consumer_jwts(consumer_id) + self.assertTrue(200 == response.status_code) + resp = response.json() + + self.assertEqual(len(resp["data"]), 1) + + +class TestKongClientFromConfig(unittest.IsolatedAsyncioTestCase): + KONG_HOST = os.getenv("KONG_HOST", "localhost") + KONG_PORT = os.getenv("KONG_PORT", 8001) + + def setUp(self) -> None: + config = Config(CONFIG_FILE_PATH) + self.kong = KongClient.from_config(config=config) + + @staticmethod + def generate_underscore_uuid(): + name = str(uuid4()) + return name.replace("-", "_") + + async def test_create_consumer(self): + user_uuid = uuid4() + user_name = self.generate_underscore_uuid() + response = await self.kong.create_consumer(username=user_name, user=user_uuid, tags=[]) + + self.assertTrue(201 == response.status_code) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/plugins/minos-discovery-kong/tests/test_kong/test_discovery.py b/packages/plugins/minos-discovery-kong/tests/test_kong/test_discovery.py new file mode 100644 index 000000000..71d4c0381 --- /dev/null +++ b/packages/plugins/minos-discovery-kong/tests/test_kong/test_discovery.py @@ -0,0 +1,308 @@ +import os +import unittest +from uuid import ( + uuid4, +) + +import httpx + +from minos.common import ( + Config, +) +from minos.plugins.kong import ( + KongDiscoveryClient, +) +from tests.utils import ( + CONFIG_FILE_NO_AUTH_PATH, + CONFIG_FILE_PATH, + TEST_HOST, +) + +PROTOCOL = "http" + + +class TestKongDiscoveryClient(unittest.IsolatedAsyncioTestCase): + KONG_HOST = os.getenv("KONG_HOST", "localhost") + KONG_PORT = os.getenv("KONG_PORT", 8001) + + def setUp(self) -> None: + self.client = KongDiscoveryClient(self.KONG_HOST, self.KONG_PORT, circuit_breaker_time=0.1) + + @staticmethod + def generate_underscore_uuid(): + name = str(uuid4()) + return name.replace("-", "_") + + def test_constructor(self): + client = KongDiscoveryClient() + self.assertEqual("localhost", client.host) + self.assertEqual(5567, client.port) + + def test_route(self): + # noinspection HttpUrlsUsage + self.assertEqual(f"{PROTOCOL}://{self.client.host}:{self.client.port}", self.client.route) + + async def test_already_exist_subscribe(self): + name = self.generate_underscore_uuid() + + response = await self.client.subscribe( + TEST_HOST, + 5660, + name, + [{"url": "/", "method": "GET"}, {"url": "/foo", "method": "POST"}, {"url": "/bar", "method": "GET"}], + ) + self.assertTrue(201 == response.status_code) + + response = await self.client.subscribe( + TEST_HOST, + 5660, + name, + [{"url": "/", "method": "GET"}, {"url": "/foo", "method": "POST"}, {"url": "/bar", "method": "GET"}], + ) + self.assertTrue(201 == response.status_code) + + async def test_subscribe(self): + name = self.generate_underscore_uuid() + response = await self.client.subscribe( + TEST_HOST, + 5660, + name, + [{"url": "/", "method": "GET"}, {"url": "/foo", "method": "POST"}, {"url": "/bar", "method": "GET"}], + ) + self.assertTrue(201 == response.status_code) + + async with httpx.AsyncClient() as client: + url = f"{PROTOCOL}://{self.client.host}:{self.client.port}/services/{name}" + response = await client.get(url) + response_data = response.json() + self.assertTrue(200 == response.status_code) + self.assertEqual(5660, response_data["port"]) + self.assertEqual(TEST_HOST, response_data["host"]) + self.assertEqual(PROTOCOL, response_data["protocol"]) + + async def test_subscribe_with_auth(self): + name = self.generate_underscore_uuid() + response = await self.client.subscribe( + TEST_HOST, + 5660, + name, + [ + { + "url": "/", + "method": "GET", + "authenticated": True, + "authorized_groups": ["super_admin", "admin"], + "regex_priority": 0, + }, + { + "url": "/foo", + "method": "POST", + "authenticated": True, + "authorized_groups": ["super_admin", "admin"], + "regex_priority": 0, + }, + { + "url": "/bar", + "method": "GET", + "authenticated": True, + "authorized_groups": ["super_admin", "admin"], + "regex_priority": 0, + }, + ], + ) + self.assertTrue(201 == response.status_code) + + async with httpx.AsyncClient() as client: + url = f"{PROTOCOL}://{self.client.host}:{self.client.port}/services/{name}" + response = await client.get(url) + response_data = response.json() + self.assertTrue(200 == response.status_code) + self.assertEqual(5660, response_data["port"]) + self.assertEqual(TEST_HOST, response_data["host"]) + self.assertEqual(PROTOCOL, response_data["protocol"]) + + async def test_unsubscribe(self): + name = self.generate_underscore_uuid() + response = await self.client.subscribe( + TEST_HOST, 5660, name, [{"url": "/foo", "method": "POST"}, {"url": "/bar", "method": "GET"}] + ) + + self.assertTrue(201 == response.status_code) + + response_delete = await self.client.unsubscribe(name) + self.assertTrue(204 == response_delete.status_code) + + async with httpx.AsyncClient() as client: + url = f"{PROTOCOL}://{self.client.host}:{self.client.port}/services/{name}" + response = await client.get(url) + self.assertTrue(404 == response.status_code) + + async def test_route_params(self): + expected = ["/foo/.*", "/bar/.*/.*"] + response = await self.client.subscribe( + TEST_HOST, + 5660, + "test", + [{"url": "/foo/{:user}", "method": "POST"}, {"url": "/bar/{:domain}/{:username}", "method": "GET"}], + ) + + self.assertTrue(201 == response.status_code) + + async with httpx.AsyncClient() as client: + url = f"{PROTOCOL}://{self.client.host}:{self.client.port}/services/test/routes" + response = await client.get(url) + response_data = response.json() + self.assertTrue(200 == response.status_code) + self.assertGreater(len(response_data["data"]), 0) + + for route in response_data["data"]: + self.assertTrue(bool(set(route["paths"]) & set(expected))) + + +class TestKongDiscoveryClientFromConfig(unittest.IsolatedAsyncioTestCase): + KONG_HOST = os.getenv("KONG_HOST", "localhost") + KONG_PORT = os.getenv("KONG_PORT", 8001) + + def setUp(self) -> None: + config = Config(CONFIG_FILE_PATH) + self.client = KongDiscoveryClient.from_config(config=config, circuit_breaker_time=0.1) + + @staticmethod + def generate_underscore_uuid(): + name = str(uuid4()) + return name.replace("-", "_") + + async def test_subscribe(self): + name = self.generate_underscore_uuid() + response = await self.client.subscribe( + TEST_HOST, + 5660, + name, + [{"url": "/", "method": "GET"}, {"url": "/foo", "method": "POST"}, {"url": "/bar", "method": "GET"}], + ) + self.assertTrue(201 == response.status_code) + + async with httpx.AsyncClient() as client: + url = f"{PROTOCOL}://{self.client.host}:{self.client.port}/services/{name}" + response = await client.get(url) + response_data = response.json() + self.assertTrue(200 == response.status_code) + self.assertEqual(5660, response_data["port"]) + self.assertEqual(TEST_HOST, response_data["host"]) + self.assertEqual(PROTOCOL, response_data["protocol"]) + + async def test_subscribe_with_auth(self): + name = self.generate_underscore_uuid() + response = await self.client.subscribe( + TEST_HOST, + 5660, + name, + [ + {"url": "/", "method": "GET", "authenticated": True, "authorized_groups": ["super_admin", "admin"]}, + {"url": "/foo", "method": "POST", "authenticated": True, "authorized_groups": ["super_admin", "admin"]}, + {"url": "/bar", "method": "GET", "authenticated": True, "authorized_groups": ["super_admin", "admin"]}, + ], + ) + self.assertTrue(201 == response.status_code) + + async with httpx.AsyncClient() as client: + url = f"{PROTOCOL}://{self.client.host}:{self.client.port}/services/{name}" + response = await client.get(url) + response_data = response.json() + self.assertTrue(200 == response.status_code) + self.assertEqual(5660, response_data["port"]) + self.assertEqual(TEST_HOST, response_data["host"]) + self.assertEqual(PROTOCOL, response_data["protocol"]) + + +class TestKongDiscoveryClientFromConfigOverrideAuth(unittest.IsolatedAsyncioTestCase): + KONG_HOST = os.getenv("KONG_HOST", "localhost") + KONG_PORT = os.getenv("KONG_PORT", 8001) + + def setUp(self) -> None: + config = Config(CONFIG_FILE_PATH) + self.client = KongDiscoveryClient.from_config(config=config, auth_type="basic-auth", circuit_breaker_time=0.1) + + @staticmethod + def generate_underscore_uuid(): + name = str(uuid4()) + return name.replace("-", "_") + + async def test_subscribe(self): + name = self.generate_underscore_uuid() + response = await self.client.subscribe( + TEST_HOST, + 5660, + name, + [{"url": "/", "method": "GET"}, {"url": "/foo", "method": "POST"}, {"url": "/bar", "method": "GET"}], + ) + self.assertTrue(201 == response.status_code) + + async with httpx.AsyncClient() as client: + url = f"{PROTOCOL}://{self.client.host}:{self.client.port}/services/{name}" + response = await client.get(url) + response_data = response.json() + self.assertTrue(200 == response.status_code) + self.assertEqual(5660, response_data["port"]) + self.assertEqual(TEST_HOST, response_data["host"]) + self.assertEqual(PROTOCOL, response_data["protocol"]) + + async def test_subscribe_with_auth(self): + name = self.generate_underscore_uuid() + response = await self.client.subscribe( + TEST_HOST, + 5660, + name, + [ + {"url": "/", "method": "GET", "authenticated": True, "authorized_groups": ["super_admin", "admin"]}, + {"url": "/foo", "method": "POST", "authenticated": True, "authorized_groups": ["super_admin", "admin"]}, + {"url": "/bar", "method": "GET", "authenticated": True, "authorized_groups": ["super_admin", "admin"]}, + ], + ) + self.assertTrue(201 == response.status_code) + + async with httpx.AsyncClient() as client: + url = f"{PROTOCOL}://{self.client.host}:{self.client.port}/services/{name}" + response = await client.get(url) + response_data = response.json() + self.assertTrue(200 == response.status_code) + self.assertEqual(5660, response_data["port"]) + self.assertEqual(TEST_HOST, response_data["host"]) + self.assertEqual(PROTOCOL, response_data["protocol"]) + + +class TestKongDiscoveryClientFromConfigNoAuth(unittest.IsolatedAsyncioTestCase): + KONG_HOST = os.getenv("KONG_HOST", "localhost") + KONG_PORT = os.getenv("KONG_PORT", 8001) + + def setUp(self) -> None: + config = Config(CONFIG_FILE_NO_AUTH_PATH) + self.client = KongDiscoveryClient.from_config(config=config, circuit_breaker_time=0.1) + + @staticmethod + def generate_underscore_uuid(): + name = str(uuid4()) + return name.replace("-", "_") + + async def test_subscribe(self): + name = self.generate_underscore_uuid() + response = await self.client.subscribe( + TEST_HOST, + 5660, + name, + [{"url": "/", "method": "GET"}, {"url": "/foo", "method": "POST"}, {"url": "/bar", "method": "GET"}], + ) + self.assertTrue(201 == response.status_code) + + async with httpx.AsyncClient() as client: + url = f"{PROTOCOL}://{self.client.host}:{self.client.port}/services/{name}" + response = await client.get(url) + response_data = response.json() + self.assertTrue(200 == response.status_code) + self.assertEqual(5660, response_data["port"]) + self.assertEqual(TEST_HOST, response_data["host"]) + self.assertEqual(PROTOCOL, response_data["protocol"]) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/plugins/minos-discovery-kong/tests/test_kong/test_middleware.py b/packages/plugins/minos-discovery-kong/tests/test_kong/test_middleware.py new file mode 100644 index 000000000..131bcecd0 --- /dev/null +++ b/packages/plugins/minos-discovery-kong/tests/test_kong/test_middleware.py @@ -0,0 +1,52 @@ +import unittest +from collections import ( + namedtuple, +) +from uuid import ( + uuid4, +) + +from minos.networks import ( + Request, + Response, +) +from minos.plugins.kong.middleware import ( + middleware, +) +from tests.utils import ( + InMemoryHttpRequest, +) + +PROTOCOL = "http" + + +async def _fn(request: Request) -> Response: + return Response(f"{await request.content()}bar") + + +Raw = namedtuple("Raw", ["headers", "content"]) + + +class TestKongDiscoveryClient(unittest.IsolatedAsyncioTestCase): + async def test_middleware_user_headers(self): + user_uuid = uuid4() + request_headers = {"X-Consumer-Custom-ID": str(user_uuid)} + request = InMemoryHttpRequest(content="foo", headers=request_headers) + response = await middleware(request, _fn) + + self.assertEqual("foobar", await response.content()) + + self.assertEqual({"X-Consumer-Custom-ID": str(user_uuid), "user": str(user_uuid)}, request_headers) + + async def test_middleware_no_user_headers(self): + request_headers = {} + request = InMemoryHttpRequest(content="foo", headers=request_headers) + response = await middleware(request, _fn) + + self.assertEqual("foobar", await response.content()) + + self.assertEqual({}, request_headers) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/plugins/minos-discovery-kong/tests/test_kong/test_utils.py b/packages/plugins/minos-discovery-kong/tests/test_kong/test_utils.py new file mode 100644 index 000000000..e9ff524b3 --- /dev/null +++ b/packages/plugins/minos-discovery-kong/tests/test_kong/test_utils.py @@ -0,0 +1,46 @@ +import unittest + +from minos.plugins.kong.utils import ( + Endpoint, + PathPart, +) + + +class TestKongDiscoveryUtils(unittest.IsolatedAsyncioTestCase): + def test_endpoint_constructor(self) -> None: + endopoint = Endpoint("minos/plugin") + self.assertIsInstance(endopoint, Endpoint) + self.assertEqual(endopoint.path_as_str, "minos/plugin") + self.assertEqual(endopoint.path[0].name, "minos") + + def test_path_constructor(self) -> None: + pathpart = PathPart("minos") + self.assertIsInstance(pathpart, PathPart) + self.assertEqual(pathpart.name, "minos") + self.assertEqual(pathpart.is_generic, False) + + def test_path_as_str(self) -> None: + pathpart = Endpoint(r"/user/{uuid:\w{8}-\w{4}-\w{4}-\w{4}-\w{12}}") + self.assertEqual(pathpart.path_as_str, "/user/.*") + + def test_path_as_regex(self) -> None: + # pylint: disable=W605 + pathpart = Endpoint(r"/user/{uuid:\w{8}-\w{4}-\w{4}-\w{4}-\w{12}}") + self.assertEqual(pathpart.path_as_regex, "/user/\\w{8}-\\w{4}-\\w{4}-\\w{4}-\\w{12}") + + def test_path_as_regex_simple_parameter(self) -> None: + pathpart = Endpoint("/user/{uuid}") + self.assertEqual(pathpart.path_as_regex, "/user/.*") + + def test_path_as_regex_parameter(self) -> None: + pathpart = Endpoint("/user/{:uuid}") + self.assertEqual(pathpart.path_as_regex, "/user/.*") + + def test_path_as_regex_multiple_parameter(self) -> None: + pathpart = Endpoint("/user/{:uuid}/{:uuid}") + self.assertEqual(pathpart.path_as_regex, "/user/.*/.*") + + def test_path_as_regex_uuid(self) -> None: + # pylint: disable=W605 + pathpart = Endpoint(r"/user/{uuid:\w{8}-\w{4}-\w{4}-\w{4}-\w{12}}/test") + self.assertEqual(pathpart.path_as_regex, "/user/\\w{8}-\\w{4}-\\w{4}-\\w{4}-\\w{12}/test") diff --git a/packages/plugins/minos-discovery-kong/tests/utils.py b/packages/plugins/minos-discovery-kong/tests/utils.py new file mode 100644 index 000000000..628218ad5 --- /dev/null +++ b/packages/plugins/minos-discovery-kong/tests/utils.py @@ -0,0 +1,60 @@ +from pathlib import ( + Path, +) +from typing import ( + Any, + Optional, + Union, +) + +from minos.networks import ( + HttpRequest, + InMemoryRequest, +) + +BASE_PATH = Path(__file__).parent +CONFIG_FILE_PATH = BASE_PATH / "test_config.yml" +CONFIG_FILE_NO_AUTH_PATH = BASE_PATH / "test_config_no_auth.yml" +rand = 27 +TEST_HOST = f"{rand}.{rand}.{rand}.{rand}" + + +class InMemoryHttpRequest(InMemoryRequest, HttpRequest): + """For testing purposes.""" + + def __init__( + self, + *args, + headers: Optional[dict[str, str]] = None, + **kwargs, + ): + super().__init__(*args, **kwargs) + if headers is None: + headers = dict() + self._headers = headers + + @property + def headers(self) -> dict[str, str]: + """For testing purposes.""" + return self._headers + + @property + def content_type(self) -> str: + """For testing purposes.""" + return "" + + async def url_params(self, type_: Optional[Union[type, str]] = None, **kwargs) -> Any: + """For testing purposes.""" + + @property + def has_url_params(self) -> bool: + """For testing purposes.""" + return False + + async def query_params(self, type_: Optional[Union[type, str]] = None, **kwargs) -> Any: + """For testing purposes.""" + + @property + def has_query_params(self) -> bool: + """For testing purposes.""" + return False diff --git a/packages/plugins/minos-discovery-minos/HISTORY.md b/packages/plugins/minos-discovery-minos/HISTORY.md index 1596265df..16bdde6cf 100644 --- a/packages/plugins/minos-discovery-minos/HISTORY.md +++ b/packages/plugins/minos-discovery-minos/HISTORY.md @@ -11,4 +11,11 @@ ## 0.6.0 (2022-03-28) -* Integrate `minos.common.CircuitBreakerMixin` into the `MinosDiscoveryClient` to be tolerant to connection failures to `minos-discovery`. \ No newline at end of file +* Integrate `minos.common.CircuitBreakerMixin` into the `MinosDiscoveryClient` to be tolerant to connection failures to `minos-discovery`. + +## 0.7.0 (2022-05-11) + +* Minor improvements. +* Unify documentation building pipeline across all `minos-python` packages. +* Fix documentation building warnings. +* Fix bug related with package building and additional files like `AUTHORS.md`, `HISTORY.md`, etc. \ No newline at end of file diff --git a/packages/plugins/minos-discovery-minos/Makefile b/packages/plugins/minos-discovery-minos/Makefile index acc861207..ef814b8bc 100644 --- a/packages/plugins/minos-discovery-minos/Makefile +++ b/packages/plugins/minos-discovery-minos/Makefile @@ -15,10 +15,6 @@ reformat: poetry run black --line-length 120 minos tests poetry run isort minos tests -docs: - rm -rf docs/api - poetry run $(MAKE) --directory=docs html - release: $(MAKE) dist poetry publish @@ -38,5 +34,4 @@ check: $(MAKE) reformat $(MAKE) lint $(MAKE) test - $(MAKE) docs $(MAKE) dist diff --git a/packages/plugins/minos-discovery-minos/RUNTHETESTS.md b/packages/plugins/minos-discovery-minos/RUNTHETESTS.md index 8b5e95b1f..386e2b0e7 100644 --- a/packages/plugins/minos-discovery-minos/RUNTHETESTS.md +++ b/packages/plugins/minos-discovery-minos/RUNTHETESTS.md @@ -1,5 +1,4 @@ -Run the tests -============== +# Run the tests In order to run the tests, please make sure you have the `Docker Engine `_ and `Docker Compose `_ installed. diff --git a/packages/plugins/minos-discovery-minos/SETUP.md b/packages/plugins/minos-discovery-minos/SETUP.md deleted file mode 100644 index 8203965c7..000000000 --- a/packages/plugins/minos-discovery-minos/SETUP.md +++ /dev/null @@ -1,11 +0,0 @@ -Set up a development environment -================================= - -Since we use `poetry` as the default package manager, it must be installed. Please refer to -`https://python-poetry.org/docs/#installation`. - -Run `poetry install` to get the dependencies. - -Run `pre-commit install` to set the git checks before commiting. - -Make yourself sure you are able to run the tests. Refer to the appropriate section in this guide. diff --git a/packages/plugins/minos-discovery-minos/docs/Makefile b/packages/plugins/minos-discovery-minos/docs/Makefile deleted file mode 100644 index 95592d15f..000000000 --- a/packages/plugins/minos-discovery-minos/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -SPHINXPROJ = minos-discovery-minos -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/packages/plugins/minos-discovery-minos/docs/_static/style.css b/packages/plugins/minos-discovery-minos/docs/_static/style.css deleted file mode 100644 index 8aa6c288f..000000000 --- a/packages/plugins/minos-discovery-minos/docs/_static/style.css +++ /dev/null @@ -1,3 +0,0 @@ -.wy-nav-content { - max-width: 1200px !important; -} diff --git a/packages/plugins/minos-discovery-minos/docs/_templates/layout.html b/packages/plugins/minos-discovery-minos/docs/_templates/layout.html deleted file mode 100644 index b0a448060..000000000 --- a/packages/plugins/minos-discovery-minos/docs/_templates/layout.html +++ /dev/null @@ -1,4 +0,0 @@ -{% extends "!layout.html" %} -{% block extrahead %} - -{% endblock %} \ No newline at end of file diff --git a/packages/plugins/minos-discovery-minos/docs/authors.md b/packages/plugins/minos-discovery-minos/docs/authors.md deleted file mode 100644 index cf16fc494..000000000 --- a/packages/plugins/minos-discovery-minos/docs/authors.md +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../AUTHORS.md diff --git a/packages/plugins/minos-discovery-minos/docs/conf.py b/packages/plugins/minos-discovery-minos/docs/conf.py deleted file mode 100755 index 64b4ef650..000000000 --- a/packages/plugins/minos-discovery-minos/docs/conf.py +++ /dev/null @@ -1,194 +0,0 @@ -#!/usr/bin/env python -# -# minos documentation build configuration file, created by -# sphinx-quickstart on Fri Jun 9 13:47:02 2017. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -# If extensions (or modules to document with autodoc) are in another -# directory, add these directories to sys.path here. If the directory is -# relative to the documentation root, use os.path.abspath to make it -# absolute, like shown here. -# -import os -import sys - -sys.path.insert(0, os.path.abspath("..")) - -from minos.plugins import ( - minos_discovery, -) - -# -- General configuration --------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. - - -extensions = [ - "sphinxcontrib.apidoc", - "sphinx.ext.autodoc", - "sphinx_autodoc_typehints", - "sphinx.ext.viewcode", - "sphinx_rtd_theme", - "m2r2", -] -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -source_suffix = [".rst", ".md"] - -# The master toctree document. -master_doc = "index" - -# General information about the project. -project = "Minos Discovery Minos" -copyright = "2021, Clariteia" -author = "Minos Framework Devs" - -# The version info for the project you're documenting, acts as replacement -# for |version| and |release|, also used in various other places throughout -# the built documents. -# -# The short X.Y version. -version = minos_discovery.__version__ -# The full version, including alpha/beta/rc tags. -release = minos_discovery.__version__ - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = "sphinx" - -todo_include_todos = False - - -# -- Options for HTML output ------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# - -html_theme = "sphinx_rtd_theme" - -# Theme options are theme-specific and customize the look and feel of a -# theme further. For a list of options available for each theme, see the -# documentation. -# - -# html_theme_options = { -# "codecov_button": True, -# "description": "Reactive microservices for an asynchronous world", -# "github_button": True, -# "github_user": "Clariteia", -# "github_repo": "cqrs", -# "github_type": "star", -# } - -html_sidebars = {"**": ["about.html", "navigation.html", "searchbox.html"]} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] - - -# -- Options for HTMLHelp output --------------------------------------- - -# Output file base name for HTML help builder. -htmlhelp_basename = "minosdoc" - - -# -- Options for LaTeX output ------------------------------------------ - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass -# [howto, manual, or own class]). -latex_documents = [ - (master_doc, "minos.tex", "Minos Discovery Minos Documentation", "Minos Framework Devs", "manual"), -] - - -# -- Options for manual page output ------------------------------------ - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [(master_doc, "minos", "Minos Discovery Minos Documentation", [author], 1)] - - -# -- Options for Texinfo output ---------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ( - master_doc, - "minos", - "Minos Discovery Minos Documentation", - author, - "minos", - "One line description of project.", - "Miscellaneous", - ), -] - -# "apidoc" extension -apidoc_module_dir = "../minos" -apidoc_output_dir = "api" -apidoc_separate_modules = True -autodoc_default_options = { - "inherited-members": True, - "special-members": "__init__", - "undoc-members": True, -} - -apidoc_toc_file = False -apidoc_module_first = True -apidoc_extra_args = [ - "--force", - "--implicit-namespaces", -] -# "autodoc typehints" extension - -set_type_checking_flag = True -typehints_fully_qualified = True diff --git a/packages/plugins/minos-discovery-minos/docs/history.md b/packages/plugins/minos-discovery-minos/docs/history.md deleted file mode 100644 index d26e5be83..000000000 --- a/packages/plugins/minos-discovery-minos/docs/history.md +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../HISTORY.md diff --git a/packages/plugins/minos-discovery-minos/docs/index.md b/packages/plugins/minos-discovery-minos/docs/index.md deleted file mode 100644 index b470bca77..000000000 --- a/packages/plugins/minos-discovery-minos/docs/index.md +++ /dev/null @@ -1,16 +0,0 @@ -# Welcome to Minos Discovery Minos's documentation! - -.. toctree:: - :maxdepth: 2 - - readme - runthetests - usage - api/minos.plugins - authors - history - -# Indices and tables -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/packages/plugins/minos-discovery-minos/docs/readme.md b/packages/plugins/minos-discovery-minos/docs/readme.md deleted file mode 100644 index da72dbef1..000000000 --- a/packages/plugins/minos-discovery-minos/docs/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -# Introduction - -.. mdinclude:: ../README.md diff --git a/packages/plugins/minos-discovery-minos/docs/runthetests.md b/packages/plugins/minos-discovery-minos/docs/runthetests.md deleted file mode 100644 index 309db1b96..000000000 --- a/packages/plugins/minos-discovery-minos/docs/runthetests.md +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../RUNTHETESTS.md diff --git a/packages/plugins/minos-discovery-minos/docs/usage.md b/packages/plugins/minos-discovery-minos/docs/usage.md deleted file mode 100644 index 8f04b05ad..000000000 --- a/packages/plugins/minos-discovery-minos/docs/usage.md +++ /dev/null @@ -1 +0,0 @@ -# Usage diff --git a/packages/plugins/minos-discovery-minos/minos/plugins/minos_discovery/__init__.py b/packages/plugins/minos-discovery-minos/minos/plugins/minos_discovery/__init__.py index c3eddef3b..92662cc7c 100644 --- a/packages/plugins/minos-discovery-minos/minos/plugins/minos_discovery/__init__.py +++ b/packages/plugins/minos-discovery-minos/minos/plugins/minos_discovery/__init__.py @@ -1,6 +1,8 @@ +"""The minos-discovery plugin of the Minos Framework.""" + __author__ = "Minos Framework Devs" __email__ = "hey@minos.run" -__version__ = "0.6.0" +__version__ = "0.7.0" from .client import ( MinosDiscoveryClient, diff --git a/packages/plugins/minos-discovery-minos/poetry.lock b/packages/plugins/minos-discovery-minos/poetry.lock index 0fb9bb621..b34d83729 100644 --- a/packages/plugins/minos-discovery-minos/poetry.lock +++ b/packages/plugins/minos-discovery-minos/poetry.lock @@ -39,21 +39,6 @@ develop = ["aiocontextvars (==0.2.2)", "aiohttp-asgi", "aiohttp (<4)", "async-ti raven = ["raven-aiohttp"] uvloop = ["uvloop (>=0.14,<1)"] -[[package]] -name = "aiopg" -version = "1.3.3" -description = "Postgres integration with asyncio." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -async-timeout = ">=3.0,<5.0" -psycopg2-binary = ">=2.8.4" - -[package.extras] -sa = ["sqlalchemy[postgresql_psycopg2binary] (>=1.3,<1.5)"] - [[package]] name = "aiosignal" version = "1.2.0" @@ -65,14 +50,6 @@ python-versions = ">=3.6" [package.dependencies] frozenlist = ">=1.1.0" -[[package]] -name = "alabaster" -version = "0.7.12" -description = "A configurable sidebar-enabled Sphinx theme" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "async-timeout" version = "4.0.2" @@ -103,20 +80,9 @@ docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] -[[package]] -name = "babel" -version = "2.9.1" -description = "Internationalization utilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -pytz = ">=2015.7" - [[package]] name = "black" -version = "22.1.0" +version = "22.3.0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -127,7 +93,7 @@ click = ">=8.0.0" mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = ">=1.1.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] @@ -144,22 +110,6 @@ category = "main" optional = false python-versions = "*" -[[package]] -name = "certifi" -version = "2021.10.8" -description = "Python package for providing Mozilla's CA Bundle." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "cfgv" -version = "3.3.1" -description = "Validate configuration and produce human readable error messages." -category = "dev" -optional = false -python-versions = ">=3.6.1" - [[package]] name = "charset-normalizer" version = "2.0.12" @@ -173,11 +123,11 @@ unicode_backport = ["unicodedata2"] [[package]] name = "click" -version = "8.0.4" +version = "8.1.3" description = "Composable command line interface toolkit" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -225,7 +175,7 @@ python-versions = "*" [[package]] name = "dependency-injector" -version = "4.39.0" +version = "4.39.1" description = "Dependency injection framework for Python" category = "main" optional = false @@ -240,25 +190,9 @@ flask = ["flask"] pydantic = ["pydantic"] yaml = ["pyyaml"] -[[package]] -name = "distlib" -version = "0.3.4" -description = "Distribution utilities" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "docutils" -version = "0.17.1" -description = "Docutils -- Python Documentation Utilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - [[package]] name = "fastavro" -version = "1.4.10" +version = "1.4.11" description = "Fast read/write of AVRO files" category = "main" optional = false @@ -270,18 +204,6 @@ lz4 = ["lz4"] snappy = ["python-snappy"] zstandard = ["zstandard"] -[[package]] -name = "filelock" -version = "3.6.0" -description = "A platform independent file lock." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"] -testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-cov", "pytest-timeout (>=1.4.2)"] - [[package]] name = "flake8" version = "4.0.1" @@ -303,17 +225,6 @@ category = "main" optional = false python-versions = ">=3.7" -[[package]] -name = "identify" -version = "2.4.12" -description = "File identification library for Python" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -license = ["ukkonen"] - [[package]] name = "idna" version = "3.3" @@ -322,30 +233,6 @@ category = "main" optional = false python-versions = ">=3.5" -[[package]] -name = "imagesize" -version = "1.3.0" -description = "Getting image size from png/jpeg/jpeg2000/gif file" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "importlib-metadata" -version = "4.11.3" -description = "Read metadata from Python packages" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] -perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] - [[package]] name = "iniconfig" version = "1.1.1" @@ -368,48 +255,6 @@ requirements_deprecated_finder = ["pipreqs", "pip-api"] colors = ["colorama (>=0.4.3,<0.5.0)"] plugins = ["setuptools"] -[[package]] -name = "jinja2" -version = "3.1.1" -description = "A very fast and expressive template engine." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - -[[package]] -name = "lmdb" -version = "1.3.0" -description = "Universal Python binding for the LMDB 'Lightning' Database" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "m2r2" -version = "0.3.2" -description = "Markdown and reStructuredText in a single file." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -docutils = "*" -mistune = "0.8.4" - -[[package]] -name = "markupsafe" -version = "2.1.1" -description = "Safely add untrusted strings to HTML/XML markup." -category = "dev" -optional = false -python-versions = ">=3.7" - [[package]] name = "mccabe" version = "0.6.1" @@ -420,7 +265,7 @@ python-versions = "*" [[package]] name = "minos-microservice-common" -version = "0.6.0" +version = "0.7.0" description = "The common core of the Minos Framework" category = "main" optional = false @@ -428,12 +273,10 @@ python-versions = "^3.9" develop = true [package.dependencies] -aiomisc = ">=14.0.3,<16.0.0" -aiopg = "^1.2.1" +aiomisc = ">=14.0.3,<15.8.0" cached-property = "^1.5.2" dependency-injector = "^4.32.2" fastavro = "^1.4.0" -lmdb = "^1.2.1" orjson = "^3.5.2" PyYAML = ">=5.4.1,<7.0.0" uvloop = "^0.16.0" @@ -444,7 +287,7 @@ url = "../../core/minos-microservice-common" [[package]] name = "minos-microservice-networks" -version = "0.6.0" +version = "0.7.0" description = "The networks core of the Minos Framework" category = "main" optional = false @@ -452,23 +295,13 @@ python-versions = "^3.9" develop = true [package.dependencies] -aiopg = "^1.2.1" crontab = "^0.23.0" -minos-microservice-common = "^0.6.0" -psycopg2-binary = "^2.9.3" +minos-microservice-common = "^0.7.0*" [package.source] type = "directory" url = "../../core/minos-microservice-networks" -[[package]] -name = "mistune" -version = "0.8.4" -description = "The fastest markdown parser in pure Python" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "multidict" version = "6.0.2" @@ -485,17 +318,9 @@ category = "dev" optional = false python-versions = "*" -[[package]] -name = "nodeenv" -version = "1.6.0" -description = "Node.js virtual environment builder" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "orjson" -version = "3.6.7" +version = "3.6.8" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" category = "main" optional = false @@ -520,25 +345,17 @@ category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -[[package]] -name = "pbr" -version = "5.8.1" -description = "Python Build Reasonableness" -category = "dev" -optional = false -python-versions = ">=2.6" - [[package]] name = "platformdirs" -version = "2.5.1" +version = "2.5.2" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" [package.extras] -docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] +test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] [[package]] name = "pluggy" @@ -552,30 +369,6 @@ python-versions = ">=3.6" dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] -[[package]] -name = "pre-commit" -version = "2.17.0" -description = "A framework for managing and maintaining multi-language pre-commit hooks." -category = "dev" -optional = false -python-versions = ">=3.6.1" - -[package.dependencies] -cfgv = ">=2.0.0" -identify = ">=1.0.0" -nodeenv = ">=0.11.1" -pyyaml = ">=5.1" -toml = "*" -virtualenv = ">=20.0.8" - -[[package]] -name = "psycopg2-binary" -version = "2.9.3" -description = "psycopg2 - Python-PostgreSQL Database Adapter" -category = "main" -optional = false -python-versions = ">=3.6" - [[package]] name = "py" version = "1.11.0" @@ -600,24 +393,16 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -[[package]] -name = "pygments" -version = "2.11.2" -description = "Pygments is a syntax highlighting package written in Python." -category = "dev" -optional = false -python-versions = ">=3.5" - [[package]] name = "pyparsing" -version = "3.0.7" -description = "Python parsing module" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.6.8" [package.extras] -diagrams = ["jinja2", "railroad-diagrams"] +diagrams = ["railroad-diagrams", "jinja2"] [[package]] name = "pytest" @@ -640,14 +425,6 @@ toml = "*" [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] -[[package]] -name = "pytz" -version = "2022.1" -description = "World timezone definitions, modern and historical" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "pyyaml" version = "6.0" @@ -656,24 +433,6 @@ category = "main" optional = false python-versions = ">=3.6" -[[package]] -name = "requests" -version = "2.27.1" -description = "Python HTTP for Humans." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} -urllib3 = ">=1.21.1,<1.27" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] - [[package]] name = "six" version = "1.16.0" @@ -682,159 +441,6 @@ category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -[[package]] -name = "snowballstemmer" -version = "2.2.0" -description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "sphinx" -version = "4.5.0" -description = "Python documentation generator" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -alabaster = ">=0.7,<0.8" -babel = ">=1.3" -colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.14,<0.18" -imagesize = "*" -importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} -Jinja2 = ">=2.3" -packaging = "*" -Pygments = ">=2.0" -requests = ">=2.5.0" -snowballstemmer = ">=1.1" -sphinxcontrib-applehelp = "*" -sphinxcontrib-devhelp = "*" -sphinxcontrib-htmlhelp = ">=2.0.0" -sphinxcontrib-jsmath = "*" -sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = ">=1.1.5" - -[package.extras] -docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.931)", "docutils-stubs", "types-typed-ast", "types-requests"] -test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] - -[[package]] -name = "sphinx-autodoc-typehints" -version = "1.17.0" -description = "Type hints (PEP 484) support for the Sphinx autodoc extension" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -Sphinx = ">=4" - -[package.extras] -testing = ["covdefaults (>=2)", "coverage (>=6)", "diff-cover (>=6.4)", "nptyping (>=1)", "pytest (>=6)", "pytest-cov (>=3)", "sphobjinv (>=2)", "typing-extensions (>=3.5)"] -type_comments = ["typed-ast (>=1.4.0)"] - -[[package]] -name = "sphinx-rtd-theme" -version = "1.0.0" -description = "Read the Docs theme for Sphinx" -category = "dev" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" - -[package.dependencies] -docutils = "<0.18" -sphinx = ">=1.6" - -[package.extras] -dev = ["transifex-client", "sphinxcontrib-httpdomain", "bump2version"] - -[[package]] -name = "sphinxcontrib-apidoc" -version = "0.3.0" -description = "A Sphinx extension for running 'sphinx-apidoc' on each build" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -pbr = "*" -Sphinx = ">=1.6.0" - -[[package]] -name = "sphinxcontrib-applehelp" -version = "1.0.2" -description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-devhelp" -version = "1.0.2" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-htmlhelp" -version = "2.0.0" -description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest", "html5lib"] - -[[package]] -name = "sphinxcontrib-jsmath" -version = "1.0.1" -description = "A sphinx extension which renders display math in HTML via JavaScript" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -test = ["pytest", "flake8", "mypy"] - -[[package]] -name = "sphinxcontrib-qthelp" -version = "1.0.3" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-serializinghtml" -version = "1.1.5" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - [[package]] name = "toml" version = "0.10.2" @@ -853,24 +459,11 @@ python-versions = ">=3.7" [[package]] name = "typing-extensions" -version = "4.1.1" -description = "Backported and Experimental Type Hints for Python 3.6+" +version = "4.2.0" +description = "Backported and Experimental Type Hints for Python 3.7+" category = "dev" optional = false -python-versions = ">=3.6" - -[[package]] -name = "urllib3" -version = "1.26.9" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" - -[package.extras] -brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +python-versions = ">=3.7" [[package]] name = "uvloop" @@ -885,24 +478,6 @@ dev = ["Cython (>=0.29.24,<0.30.0)", "pytest (>=3.6.0)", "Sphinx (>=4.1.2,<4.2.0 docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)"] test = ["aiohttp", "flake8 (>=3.9.2,<3.10.0)", "psutil", "pycodestyle (>=2.7.0,<2.8.0)", "pyOpenSSL (>=19.0.0,<19.1.0)", "mypy (>=0.800)"] -[[package]] -name = "virtualenv" -version = "20.14.0" -description = "Virtual Python Environment builder" -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - -[package.dependencies] -distlib = ">=0.3.1,<1" -filelock = ">=3.2,<4" -platformdirs = ">=2,<3" -six = ">=1.9.0,<2" - -[package.extras] -docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=21.3)"] -testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)"] - [[package]] name = "yarl" version = "1.7.2" @@ -915,22 +490,10 @@ python-versions = ">=3.6" idna = ">=2.0" multidict = ">=4.0" -[[package]] -name = "zipp" -version = "3.7.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] - [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "7a9d17e062dc6ea5bc5f6f84ca6e911bf86dd0bd2cdcd5917f65d990c521928f" +content-hash = "3c8f704eaee2197547064141837553faeea37617af244aa0644387a2f7c2f682" [metadata.files] aiohttp = [ @@ -1011,18 +574,10 @@ aiomisc = [ {file = "aiomisc-15.7.3-py3-none-any.whl", hash = "sha256:0403e83268e98d0f2a125a70d13303fe1a2358e36db3daf02df032c7fa4f1525"}, {file = "aiomisc-15.7.3.tar.gz", hash = "sha256:ba250a34bd4609ced36111cb50580f57c3d52f3955f953a53ecb2986988baedc"}, ] -aiopg = [ - {file = "aiopg-1.3.3-py3-none-any.whl", hash = "sha256:2842dd8741460eeef940032dcb577bfba4d4115205dd82a73ce13b3271f5bf0a"}, - {file = "aiopg-1.3.3.tar.gz", hash = "sha256:547c6ba4ea0d73c2a11a2f44387d7133cc01d3c6f3b8ed976c0ac1eff4f595d7"}, -] aiosignal = [ {file = "aiosignal-1.2.0-py3-none-any.whl", hash = "sha256:26e62109036cd181df6e6ad646f91f0dcfd05fe16d0cb924138ff2ab75d64e3a"}, {file = "aiosignal-1.2.0.tar.gz", hash = "sha256:78ed67db6c7b7ced4f98e495e572106d5c432a93e1ddd1bf475e1dc05f5b7df2"}, ] -alabaster = [ - {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, - {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, -] async-timeout = [ {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, @@ -1035,54 +590,42 @@ attrs = [ {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] -babel = [ - {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"}, - {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, -] black = [ - {file = "black-22.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1297c63b9e1b96a3d0da2d85d11cd9bf8664251fd69ddac068b98dc4f34f73b6"}, - {file = "black-22.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2ff96450d3ad9ea499fc4c60e425a1439c2120cbbc1ab959ff20f7c76ec7e866"}, - {file = "black-22.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e21e1f1efa65a50e3960edd068b6ae6d64ad6235bd8bfea116a03b21836af71"}, - {file = "black-22.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f69158a7d120fd641d1fa9a921d898e20d52e44a74a6fbbcc570a62a6bc8ab"}, - {file = "black-22.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:228b5ae2c8e3d6227e4bde5920d2fc66cc3400fde7bcc74f480cb07ef0b570d5"}, - {file = "black-22.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b1a5ed73ab4c482208d20434f700d514f66ffe2840f63a6252ecc43a9bc77e8a"}, - {file = "black-22.1.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35944b7100af4a985abfcaa860b06af15590deb1f392f06c8683b4381e8eeaf0"}, - {file = "black-22.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7835fee5238fc0a0baf6c9268fb816b5f5cd9b8793423a75e8cd663c48d073ba"}, - {file = "black-22.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dae63f2dbf82882fa3b2a3c49c32bffe144970a573cd68d247af6560fc493ae1"}, - {file = "black-22.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fa1db02410b1924b6749c245ab38d30621564e658297484952f3d8a39fce7e8"}, - {file = "black-22.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c8226f50b8c34a14608b848dc23a46e5d08397d009446353dad45e04af0c8e28"}, - {file = "black-22.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2d6f331c02f0f40aa51a22e479c8209d37fcd520c77721c034517d44eecf5912"}, - {file = "black-22.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:742ce9af3086e5bd07e58c8feb09dbb2b047b7f566eb5f5bc63fd455814979f3"}, - {file = "black-22.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fdb8754b453fb15fad3f72cd9cad3e16776f0964d67cf30ebcbf10327a3777a3"}, - {file = "black-22.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5660feab44c2e3cb24b2419b998846cbb01c23c7fe645fee45087efa3da2d61"}, - {file = "black-22.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:6f2f01381f91c1efb1451998bd65a129b3ed6f64f79663a55fe0e9b74a5f81fd"}, - {file = "black-22.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:efbadd9b52c060a8fc3b9658744091cb33c31f830b3f074422ed27bad2b18e8f"}, - {file = "black-22.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8871fcb4b447206904932b54b567923e5be802b9b19b744fdff092bd2f3118d0"}, - {file = "black-22.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccad888050f5393f0d6029deea2a33e5ae371fd182a697313bdbd835d3edaf9c"}, - {file = "black-22.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07e5c049442d7ca1a2fc273c79d1aecbbf1bc858f62e8184abe1ad175c4f7cc2"}, - {file = "black-22.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:373922fc66676133ddc3e754e4509196a8c392fec3f5ca4486673e685a421321"}, - {file = "black-22.1.0-py3-none-any.whl", hash = "sha256:3524739d76b6b3ed1132422bf9d82123cd1705086723bc3e235ca39fd21c667d"}, - {file = "black-22.1.0.tar.gz", hash = "sha256:a7c0192d35635f6fc1174be575cb7915e92e5dd629ee79fdaf0dcfa41a80afb5"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"}, + {file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"}, + {file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"}, + {file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"}, + {file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"}, + {file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"}, + {file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"}, + {file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"}, + {file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"}, + {file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"}, + {file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"}, + {file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"}, + {file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"}, + {file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"}, + {file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"}, + {file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"}, + {file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"}, + {file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"}, ] cached-property = [ {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, ] -certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, -] -cfgv = [ - {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, - {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, -] charset-normalizer = [ {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, ] click = [ - {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"}, - {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, ] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, @@ -1139,72 +682,60 @@ crontab = [ {file = "crontab-0.23.0.tar.gz", hash = "sha256:ca79dede9c2f572bb32f38703e8fddcf3427e86edc838f2ffe7ae4b9ee2b0733"}, ] dependency-injector = [ - {file = "dependency-injector-4.39.0.tar.gz", hash = "sha256:35d6c03683f512bcc8b0c950890ac40ce19bdacc7de4d59249dd61ed818f0930"}, - {file = "dependency_injector-4.39.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f046a5dbe7e5764fae9a69423f66241a8fdb62acea5c32b0c41a7da94b7f6da3"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfdd78f7d97c1f6ba4a3926a2e404507a4f77ecbd610d4a1b37dedb5c0b57ad1"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:512c23da829bb8ac2ae13f33aa017acf58ae9408e7796a146e1644e8b8471b5b"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7dc81df7f566bfdacdee448bc71085acd163b935860d2b2504b4f32840b3b692"}, - {file = "dependency_injector-4.39.0-cp310-cp310-win32.whl", hash = "sha256:9ffc5393700f45d740abecc50cdc1251eae69e50516ec9d0a48fba0e875ed083"}, - {file = "dependency_injector-4.39.0-cp310-cp310-win_amd64.whl", hash = "sha256:9118f36a3df1e9819074ccb35734d663812c8f6ef81d45c8e4ec81ce5dccac9c"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:1ff723aaf096fabb05cf8b08ba99888538a2a77e03a5082b70cd54eb9df619f3"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bb913900ceb1766f55dc628052d8e191a9c2b1737a0d775fbc230af90ab2c1e"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:329e801eb46b9933432481d3142e563e28a90d77952edac43126264c36ed2278"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1c1a67c699ae2c0234f07d121736fa44e8fe2d56c14b2fd210c3e04a151620bb"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-win32.whl", hash = "sha256:e1347defd46fe9067f857b1174bdb1b19458232ac1a485507df2ddff084cf31c"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-win_amd64.whl", hash = "sha256:9581c4c90f1aaf85ffb9b06bac7ac592df7076522881145321a9dd0702fee828"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8da8ff05fa17e852aa5831a600177e5bb72bf53b8a184f6922ae715387a460ba"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58a56999cebd8b2ba9c19e514e383924865e5f7d6273f8e5b7d85468d9042059"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4914332d6145fb7cfc5f2236a823a3859b92a7e75566ffca0987dcc0f7f7be53"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00aea40ee2d400a8091947ad97cda34b230628aeeac1774f8fa9a3500b5704b2"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-win32.whl", hash = "sha256:b94a64bc73d86d04b33c698fae4b9dad2536a8534ac6922c8226764da5d62d17"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4f59cc0b0d3beb82875d94b7e725b5097a7a454e8e323625ba6ac3095a29300e"}, - {file = "dependency_injector-4.39.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a8d840348f01d997e32394dba36e09c1ecd312b286befb6b3ca27526002ae94"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92097ffabca89d1539e200f91bfa13ff8ca502c9057391c3b78787d50fe502ed"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4a889e116fe76742ef6ff27d5e93ee9e364cbe7bbc6678df8c5dd54597a6fc"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a31e00961fdc1b3808a9e2adeb1107ec4bba0ad3a90b116af9d116a667e4626a"}, - {file = "dependency_injector-4.39.0-cp38-cp38-win32.whl", hash = "sha256:717720a220eee611ea96c0089246ec2103b168303ca2cd2c8a7cd3856da6f689"}, - {file = "dependency_injector-4.39.0-cp38-cp38-win_amd64.whl", hash = "sha256:05c0bbef90182a0d35d4d3f9ab879109070d204394578b12f0eff9eca51987ef"}, - {file = "dependency_injector-4.39.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f10bf8d146edffbee2ba5c5776395625c98048a31997afd481ce27792afee2af"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30c093b155c01e50723e8ecd2a14230daa4417356c8fb5a27369ae5be24b21d9"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dda8a85c8221e6ee433caa01c1bc4fed610381924780e04470572682569cdb8f"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ff8df47a901218a3257650f3f3a6b402dd58cb4f57b4a34d6e8092112f6e8480"}, - {file = "dependency_injector-4.39.0-cp39-cp39-win32.whl", hash = "sha256:e078c84c19ae73883a57e9b35edd843925b2b44833cd098708139a98abee5a96"}, - {file = "dependency_injector-4.39.0-cp39-cp39-win_amd64.whl", hash = "sha256:c02b6796320d6b9363d566045eeec243fa4a412ad68dcc6b2391307e93d0d401"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:865bf5ceba3e32f00e36bfcbefb1267b10df961fb2aab809f5e205968e1cd59b"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ce8645ffd8cc15a7bbd20c02e6439a61c1566a1db22766893bf79981fb89a4e"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dbdab8b024055865926a78ecbc3a6280345f4615e5c505511bbd7c6c322b1796"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:af996d66350704261382dc4e10f324eba5d23e35c04a9e75c7cb58fbea7f1f1d"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d390c6e97fec13fba832b7e39e07c43760ed3d46af4887005f679c0ab6eb9b2e"}, -] -distlib = [ - {file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"}, - {file = "distlib-0.3.4.zip", hash = "sha256:e4b58818180336dc9c529bfb9a0b58728ffc09ad92027a3f30b7cd91e3458579"}, -] -docutils = [ - {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, - {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, + {file = "dependency-injector-4.39.1.tar.gz", hash = "sha256:9ab76dc5e19b2692aaca49e00f9b41a087138d139b0ec985f92ff0498f038772"}, + {file = "dependency_injector-4.39.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c788a3d5482e63b5fd55e14fc258f1ff0b51b411927ab132ef0f689cb5d1183f"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0832e0457a360725cd1d1037b77b85478aeeaacc60e85ecceeb8020409e7b62"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d51998fff9704fd01d11c3c48f4e88d8506cb6afa1ee41409a881a5a51dae3fc"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea484cd13fc62966bf5582df0816205feee072d18f228aac75f7807b43f223ae"}, + {file = "dependency_injector-4.39.1-cp310-cp310-win32.whl", hash = "sha256:17389e53ec29ca13570319cf2065dcc4c2f6d36db5dd792bb1e8f2c39a9f146b"}, + {file = "dependency_injector-4.39.1-cp310-cp310-win_amd64.whl", hash = "sha256:55b0988489267c5a580f419133770ffe293057f2064da1c9ad6a2cc69666739b"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b297c3e79d3633cc56366386ae1f7dbce1587673cca2f559c368c1e936a1fa94"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2728827c5abb2420c5811e218262ae1b77a48e76cc9eebc6b4f55fee48a1a18d"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:029e42b064ab8cb5b2559be040ff682c7aa81592f1654a82355475956df17803"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:305e3db3f4bf40f64caaa1303e03005174e78d2339d2ae517b34c011ec2300f9"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-win32.whl", hash = "sha256:a661dd23a5e4e2f6bf4a729de7fadbe148c9a4a298dbcadfc5a94584b6930970"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-win_amd64.whl", hash = "sha256:340d6e7af5c4729d20c837d6d1e8a2626c24a05259dff746406cc823e26ba1e7"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a1553dac1c95f0de1f910b0025ee4570ea078a07d576bcdc2168990e719cea50"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c7baaa64d93359ee08c15d68579cc803e11d9becaf961f5a66b94ff627248e1"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7a27bf1951a066cf347b886cc7ab0f37dcbd1ad59bffcfe721c8c12a189a150d"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da6e2d685f7d0c65257f08133b68d9bf74ec319b90a0f21b4f629d168ce5f68f"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-win32.whl", hash = "sha256:a8ddd03ca86e67e9d3cc038793d34fbfccab12e6145df813e72bf14f9371f2ea"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-win_amd64.whl", hash = "sha256:e01a319ea05cd86b520201386dcb53a81a5400cb82fcc2f006bd7e92c0c51a0a"}, + {file = "dependency_injector-4.39.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4704804bde25b694aa65201927937a9d82d8bc055cb3dadc68eb05988bd34fa9"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0935d50b263169e7b0826a2fb6be80d6a4f2a7c59e6dd9876f86da3243bea9eb"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3c34aa5abb1826b6189f47daf6e469d4293c1d01693233da2c1b923816270cc5"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:db64904c9b9a88756cfece3e3ed078a2b57127642711dd08af342dba8abf9667"}, + {file = "dependency_injector-4.39.1-cp38-cp38-win32.whl", hash = "sha256:66ebe728194adc8720dbc4d662edbbfa55659ff23c9c493fb2dae0bfd4df5734"}, + {file = "dependency_injector-4.39.1-cp38-cp38-win_amd64.whl", hash = "sha256:4349974620f630d6726808e1291ec99713b64d449b84eb01581ee807a5a5c224"}, + {file = "dependency_injector-4.39.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d87cad0899b05cd08931bfb68ddf7be77711a67b0649c37f2045d7808977b082"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8efd965e5cfdd9f339ec895e73c119569851adedc175088d34a670f5206fea63"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:27f69485ca6b85c31d162ee86cf6ef71bb71dce9cd2b5d0745425dfc551eefa1"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a25b63de59dff04ec78f5161f00c0222a04a23def5d1f0eda14e389a32baf428"}, + {file = "dependency_injector-4.39.1-cp39-cp39-win32.whl", hash = "sha256:a14274f50d125b4579314c355e22af07def1a96641ca94bd75edcf1400b89477"}, + {file = "dependency_injector-4.39.1-cp39-cp39-win_amd64.whl", hash = "sha256:9950039d00625f9252cd26378a4406342b256886bb61e4db8b65e9f01270f53e"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6d7f39cd54678741e132e13da3a1367ac18058cbda61fe39d61c8583aa6fd757"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2368c7ba3c9ffaf816ea0f2d14c78d481491b805f62ac8496a78a51397d4689"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:84e32407bb16c58aa0d4b5ed8485537bc66ccc14cfffae7022f1204e35ec939a"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f2d80a42c546e1f934d427b071630d86653cd4a60c74b570c4ffb03025c1f1f9"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ca126bbed370b8c002c859ebeb76f6d83eba2d7fb5d66f37f47cfc19661d2889"}, ] fastavro = [ - {file = "fastavro-1.4.10-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:f225c81e869b3cefef6f2b478cd452693181ed7e645be3cea4d82024354ecaa0"}, - {file = "fastavro-1.4.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7669302c9124b7cd6c1bdff80c77116b2290c984814077fb7d01d7389586054"}, - {file = "fastavro-1.4.10-cp310-cp310-win_amd64.whl", hash = "sha256:995525bdfbdfef205ea148b5bc6a9fe5ccf921931123c39d9aad75a2b661681e"}, - {file = "fastavro-1.4.10-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:64244c53f1e4853184c2f7383d0332e1dcb34c38c05e6613530ade0378e8acfc"}, - {file = "fastavro-1.4.10-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c60965da6dc7a91e00ccd84d84797fad746555f44e8a816c4cc460fb231c44fe"}, - {file = "fastavro-1.4.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10eb25378f37dc00c10e83c4c0442c1a6d1b871f74a6dfdfc12b6447962bbdd0"}, - {file = "fastavro-1.4.10-cp37-cp37m-win_amd64.whl", hash = "sha256:d5719adf6045fc743de5fa738d561a81e58dc782c94f1b16cb21b5dd6253e7fd"}, - {file = "fastavro-1.4.10-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:24c4a1a8cc92e135ecfcd9cbd1f6cfa088cbc74d78c18e02a609cb11fa33778d"}, - {file = "fastavro-1.4.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0934490b0c3bcfd6bcbacbcb5144c6b5e4298cda209fbb17c856adf5405127dd"}, - {file = "fastavro-1.4.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a23763d73412c077aee401a0368c64cbc23859e26711dbae78a3cf0227f65165"}, - {file = "fastavro-1.4.10-cp38-cp38-win_amd64.whl", hash = "sha256:09f1dfdd8192ae09e0f477d1f024d8054fccdb099ad495d2a796bcee3cadebd1"}, - {file = "fastavro-1.4.10-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:0c6695753fa3035bbd0fa5cb21bf1b5dad39483c669b32ca0bb55fb07c1ccc87"}, - {file = "fastavro-1.4.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35f960dbba04647d8d6d5616f879622d2a1e8a84eb2d2e02a883a22e0803463a"}, - {file = "fastavro-1.4.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9660878ca01e3dbbee12385c5902a2b6b12ecbb5af4733d1026175a14b1ef67f"}, - {file = "fastavro-1.4.10-cp39-cp39-win_amd64.whl", hash = "sha256:64cbd386e408b3bcb2de53b1f847163073eb0d0d0338db65f76051c6ba9a9bc1"}, - {file = "fastavro-1.4.10.tar.gz", hash = "sha256:a24f9dd803c44bfb599476b000f9bd0088f7ac2401e6c20818f38d8af12785a0"}, -] -filelock = [ - {file = "filelock-3.6.0-py3-none-any.whl", hash = "sha256:f8314284bfffbdcfa0ff3d7992b023d4c628ced6feb957351d4c48d059f56bc0"}, - {file = "filelock-3.6.0.tar.gz", hash = "sha256:9cd540a9352e432c7246a48fe4e8712b10acb1df2ad1f30e8c070b82ae1fed85"}, + {file = "fastavro-1.4.11-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:44f01008f95d685edacc4b10366c755d25612df00924349f7d34a29f08522ce3"}, + {file = "fastavro-1.4.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18f5e736d12e67348f253da8a332d7c3b483ca04f2b6e772befa79d1a46bac9d"}, + {file = "fastavro-1.4.11-cp310-cp310-win_amd64.whl", hash = "sha256:8dca11bc3191cd7de0a3c4b76a70dac493356a219e96ebcde0def1f06faddef7"}, + {file = "fastavro-1.4.11-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:7a2a0bf03686f9d860e8f8476be000f5b3e6cc9af6853dbabab2ef9cfa5dc3a0"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c17e3decfac260e1be4d02d1903d2483eec2f3ce7f92c9b808a0f6a81572c4b"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19ba25c6529f50722a7618cc4ca24c7d265def57fd9f94e4e554e1df8cce38d2"}, + {file = "fastavro-1.4.11-cp37-cp37m-win_amd64.whl", hash = "sha256:ceaba04da9419f40899a670eb62eb373a127b511bb8e3ae4f6f1f23ec49bd0e4"}, + {file = "fastavro-1.4.11-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:732eab3a1ae5d2c3f4b52e747c55bcc41c4df0eb7e8a395038080741a3c0a934"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c03d3c802b71f44e7b3442abae961bba996258244bd222b242ad1e5cb7754e57"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cb7475a9b25b9f8aebe7eb756dafedd0369434571062f3883d894281befd7c"}, + {file = "fastavro-1.4.11-cp38-cp38-win_amd64.whl", hash = "sha256:ce0776f54591aef90bcd02bd919964abe4c2ad2a10a4336c3a1b66cef289b41c"}, + {file = "fastavro-1.4.11-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:621e72cc365c9539d7590e7b43e48a62e6bfb4c2de7c16837fed54d113d7312c"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:842b25782f911ee8c626f9d9fedc2ef01aeac272536fe90ee6d45b2ae7cdb024"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8491bfcba25c9d661289f884688e5a4f56f2ee389a240d0ad02692495a9a087"}, + {file = "fastavro-1.4.11-cp39-cp39-win_amd64.whl", hash = "sha256:c94130a8c8d80073eb0276844915aa5e928ae322024e76dc57943542ccda211c"}, + {file = "fastavro-1.4.11.tar.gz", hash = "sha256:7c64332ad52de0134be9a933ca986514c3ff85c63d54bc5398c31f0498ac1820"}, ] flake8 = [ {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, @@ -1271,22 +802,10 @@ frozenlist = [ {file = "frozenlist-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:772965f773757a6026dea111a15e6e2678fbd6216180f82a48a40b27de1ee2ab"}, {file = "frozenlist-1.3.0.tar.gz", hash = "sha256:ce6f2ba0edb7b0c1d8976565298ad2deba6f8064d2bebb6ffce2ca896eb35b0b"}, ] -identify = [ - {file = "identify-2.4.12-py2.py3-none-any.whl", hash = "sha256:5f06b14366bd1facb88b00540a1de05b69b310cbc2654db3c7e07fa3a4339323"}, - {file = "identify-2.4.12.tar.gz", hash = "sha256:3f3244a559290e7d3deb9e9adc7b33594c1bc85a9dd82e0f1be519bf12a1ec17"}, -] idna = [ {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, ] -imagesize = [ - {file = "imagesize-1.3.0-py2.py3-none-any.whl", hash = "sha256:1db2f82529e53c3e929e8926a1fa9235aa82d0bd0c580359c67ec31b2fddaa8c"}, - {file = "imagesize-1.3.0.tar.gz", hash = "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d"}, -] -importlib-metadata = [ - {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, - {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, -] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, @@ -1295,95 +814,12 @@ isort = [ {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, ] -jinja2 = [ - {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"}, - {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"}, -] -lmdb = [ - {file = "lmdb-1.3.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:63cb73fe7ce9eb93d992d632c85a0476b4332670d9e6a2802b5062f603b7809f"}, - {file = "lmdb-1.3.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:abbc439cd9fe60ffd6197009087ea885ac150017dc85384093b1d376f83f0ec4"}, - {file = "lmdb-1.3.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6260a526e4ad85b1f374a5ba9475bf369fb07e7728ea6ec57226b02c40d1976b"}, - {file = "lmdb-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e568ae0887ae196340947d9800136e90feaed6b86a261ef01f01b2ba65fc8106"}, - {file = "lmdb-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6a816954d212f40fd15007cd81ab7a6bebb77436d949a6a9ae04af57fc127f3"}, - {file = "lmdb-1.3.0-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:fa6439356e591d3249ab0e1778a6f8d8408e993f66dc911914c78208f5310309"}, - {file = "lmdb-1.3.0-cp35-cp35m-win_amd64.whl", hash = "sha256:c6adbd6f7f9048e97f31a069e652eb51020a81e80a0ce92dbb9810d21da2409a"}, - {file = "lmdb-1.3.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:eefb392f6b5cd43aada49258c5a79be11cb2c8cd3fc3e2d9319a1e0b9f906458"}, - {file = "lmdb-1.3.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a14aca2651c3af6f0d0a6b9168200eea0c8f2d27c40b01a442f33329a6e8dff"}, - {file = "lmdb-1.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cfa4aa9c67f8aee89b23005e98d1f3f32490b6b905fd1cb604b207cbd5755ab"}, - {file = "lmdb-1.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7da05d70fcc6561ac6b09e9fb1bf64b7ca294652c64c8a2889273970cee796b9"}, - {file = "lmdb-1.3.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:008243762decf8f6c90430a9bced56290ebbcdb5e877d90e42343bb97033e494"}, - {file = "lmdb-1.3.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:17215a42a4b9814c383deabecb160581e4fb75d00198eef0e3cea54f230ffbea"}, - {file = "lmdb-1.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65334eafa5d430b18d81ebd5362559a41483c362e1931f6e1b15bab2ecb7d75d"}, - {file = "lmdb-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:18c69fabdaf04efaf246587739cc1062b3e57c6ef0743f5c418df89e5e7e7b9b"}, - {file = "lmdb-1.3.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:41318717ab5d15ad2d6d263d34fbf614a045210f64b25e59ce734bb2105e421f"}, - {file = "lmdb-1.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:df2724bad7820114a205472994091097d0fa65a3e5fff5a8e688d123fb8c6326"}, - {file = "lmdb-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ddd590e1c7fcb395931aa3782fb89b9db4550ab2d81d006ecd239e0d462bc41"}, - {file = "lmdb-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:4172fba19417d7b29409beca7d73c067b54e5d8ab1fb9b51d7b4c1445d20a167"}, - {file = "lmdb-1.3.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2df38115dd9428a54d59ae7c712a4c7cce0d6b1d66056de4b1a8c38718066106"}, - {file = "lmdb-1.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d9103aa4908f0bca43c5911ca067d4e3d01f682dff0c0381a1239bd2bd757984"}, - {file = "lmdb-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:394df860c3f93cfd92b6f4caba785f38208cc9614c18b3803f83a2cc1695042f"}, - {file = "lmdb-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:62ab28e3593bdc318ea2f2fa1574e5fca3b6d1f264686d773ba54a637d4f563b"}, - {file = "lmdb-1.3.0-pp27-pypy_73-macosx_10_7_x86_64.whl", hash = "sha256:e6a704b3baced9182836c7f77b769f23856f3a8f62d0282b1bc1feaf81a86712"}, - {file = "lmdb-1.3.0-pp27-pypy_73-win_amd64.whl", hash = "sha256:08f4b5129f4683802569b02581142e415c8dcc0ff07605983ec1b07804cecbad"}, - {file = "lmdb-1.3.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:f291e3f561f58dddf63a92a5a6a4b8af3a0920b6705d35e2f80e52e86ee238a2"}, - {file = "lmdb-1.3.0.tar.gz", hash = "sha256:60a11efc21aaf009d06518996360eed346f6000bfc9de05114374230879f992e"}, -] -m2r2 = [ - {file = "m2r2-0.3.2-py3-none-any.whl", hash = "sha256:d3684086b61b4bebe2307f15189495360f05a123c9bda2a66462649b7ca236aa"}, - {file = "m2r2-0.3.2.tar.gz", hash = "sha256:ccd95b052dcd1ac7442ecb3111262b2001c10e4119b459c34c93ac7a5c2c7868"}, -] -markupsafe = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, -] mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] minos-microservice-common = [] minos-microservice-networks = [] -mistune = [ - {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, - {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, -] multidict = [ {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b9e95a740109c6047602f4db4da9949e6c5945cefbad34a1299775ddc9a62e2"}, {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac0e27844758d7177989ce406acc6a83c16ed4524ebc363c1f748cba184d89d3"}, @@ -1449,43 +885,39 @@ mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] -nodeenv = [ - {file = "nodeenv-1.6.0-py2.py3-none-any.whl", hash = "sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"}, - {file = "nodeenv-1.6.0.tar.gz", hash = "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b"}, -] orjson = [ - {file = "orjson-3.6.7-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:93188a9d6eb566419ad48befa202dfe7cd7a161756444b99c4ec77faea9352a4"}, - {file = "orjson-3.6.7-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:82515226ecb77689a029061552b5df1802b75d861780c401e96ca6bc8495f775"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3af57ffab7848aaec6ba6b9e9b41331250b57bf696f9d502bacdc71a0ebab0ba"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:a7297504d1142e7efa236ffc53f056d73934a993a08646dbcee89fc4308a8fcf"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:5a50cde0dbbde255ce751fd1bca39d00ecd878ba0903c0480961b31984f2fab7"}, - {file = "orjson-3.6.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d21f9a2d1c30e58070f93988db4cad154b9009fafbde238b52c1c760e3607fbe"}, - {file = "orjson-3.6.7-cp310-none-win_amd64.whl", hash = "sha256:e152464c4606b49398afd911777decebcf9749cc8810c5b4199039e1afb0991e"}, - {file = "orjson-3.6.7-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:0a65f3c403f38b0117c6dd8e76e85a7bd51fcd92f06c5598dfeddbc44697d3e5"}, - {file = "orjson-3.6.7-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:6c47cfca18e41f7f37b08ff3e7abf5ada2d0f27b5ade934f05be5fc5bb956e9d"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:63185af814c243fad7a72441e5f98120c9ecddf2675befa486d669fb65539e9b"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2da6fde42182b80b40df2e6ab855c55090ebfa3fcc21c182b7ad1762b61d55c"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:48c5831ec388b4e2682d4ff56d6bfa4a2ef76c963f5e75f4ff4785f9cf338a80"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:913fac5d594ccabf5e8fbac15b9b3bb9c576d537d49eeec9f664e7a64dde4c4b"}, - {file = "orjson-3.6.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:58f244775f20476e5851e7546df109f75160a5178d44257d437ba6d7e562bfe8"}, - {file = "orjson-3.6.7-cp37-none-win_amd64.whl", hash = "sha256:2d5f45c6b85e5f14646df2d32ecd7ff20fcccc71c0ea1155f4d3df8c5299bbb7"}, - {file = "orjson-3.6.7-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:612d242493afeeb2068bc72ff2544aa3b1e627578fcf92edee9daebb5893ffea"}, - {file = "orjson-3.6.7-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:539cdc5067db38db27985e257772d073cd2eb9462d0a41bde96da4e4e60bd99b"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6d103b721bbc4f5703f62b3882e638c0b65fcdd48622531c7ffd45047ef8e87c"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb10a20f80e95102dd35dfbc3a22531661b44a09b55236b012a446955846b023"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:bb68d0da349cf8a68971a48ad179434f75256159fe8b0715275d9b49fa23b7a3"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:4a2c7d0a236aaeab7f69c17b7ab4c078874e817da1bfbb9827cb8c73058b3050"}, - {file = "orjson-3.6.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3be045ca3b96119f592904cf34b962969ce97bd7843cbfca084009f6c8d2f268"}, - {file = "orjson-3.6.7-cp38-none-win_amd64.whl", hash = "sha256:bd765c06c359d8a814b90f948538f957fa8a1f55ad1aaffcdc5771996aaea061"}, - {file = "orjson-3.6.7-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:7dd9e1e46c0776eee9e0649e3ae9584ea368d96851bcaeba18e217fa5d755283"}, - {file = "orjson-3.6.7-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:c4b4f20a1e3df7e7c83717aff0ef4ab69e42ce2fb1f5234682f618153c458406"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7107a5673fd0b05adbb58bf71c1578fc84d662d29c096eb6d998982c8635c221"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a08b6940dd9a98ccf09785890112a0f81eadb4f35b51b9a80736d1725437e22c"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:f5d1648e5a9d1070f3628a69a7c6c17634dbb0caf22f2085eca6910f7427bf1f"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:e6201494e8dff2ce7fd21da4e3f6dfca1a3fed38f9dcefc972f552f6596a7621"}, - {file = "orjson-3.6.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:70d0386abe02879ebaead2f9632dd2acb71000b4721fd8c1a2fb8c031a38d4d5"}, - {file = "orjson-3.6.7-cp39-none-win_amd64.whl", hash = "sha256:d9a3288861bfd26f3511fb4081561ca768674612bac59513cb9081bb61fcc87f"}, - {file = "orjson-3.6.7.tar.gz", hash = "sha256:a4bb62b11289b7620eead2f25695212e9ac77fcfba76f050fa8a540fb5c32401"}, + {file = "orjson-3.6.8-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:3a287a650458de2211db03681b71c3e5cb2212b62f17a39df8ad99fc54855d0f"}, + {file = "orjson-3.6.8-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:5204e25c12cea58e524fc82f7c27ed0586f592f777b33075a92ab7b3eb3687c2"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77e8386393add64f959c044e0fb682364fd0e611a6f477aa13f0e6a733bd6a28"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:279f2d2af393fdf8601020744cb206b91b54ad60fb8401e0761819c7bda1f4e4"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:c31c9f389be7906f978ed4192eb58a4b74a37ad60556a0b88ddc47c576697770"}, + {file = "orjson-3.6.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0db5c5a0c5b89f092d52f6e5a3701660a9d6ffa9e2968b3ce17c2bc4f5eb0414"}, + {file = "orjson-3.6.8-cp310-none-win_amd64.whl", hash = "sha256:eb22485847b9a0c4bbedc668df860126ac931edbed1d456cf41a59f3cb961ed8"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:1a5fe569310bc819279bd4d5f2c349910b104ed3207936246dd5d5e0b085e74a"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:ccb356a47ab1067cd3549847e9db1d279a63fe0482d315b3ffd6e7abef35ef77"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab29c069c222248ce302a25855b4e1664f9436e8ae5a131fb0859daf31676d2b"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2b5e4cba9e774ac011071d9d27760f97f4b8cd46003e971d122e712f971345"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:c311ec504414d22834d5b972a209619925b48263856a11a14d90230f9682d49c"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:a3dfec7950b90fb8d143743503ee53fa06b32e6068bdea792fc866284da3d71d"}, + {file = "orjson-3.6.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b890dbbada2cbb26eb29bd43a848426f007f094bb0758df10dfe7a438e1cb4b4"}, + {file = "orjson-3.6.8-cp37-none-win_amd64.whl", hash = "sha256:9143ae2c52771525be9ad11a7a8cc8e7fd75391b107e7e644a9e0050496f6b4f"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:33a82199fd42f6436f833e210ae5129c922a5c355629356ca7a8e82964da7285"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:90159ea8b9a5a2a98fa33dc7b421cfac4d2ae91ba5e1058f5909e7f059f6b467"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:656fbe15d9ef0733e740d9def78f4fdb4153102f4836ee774a05123499005931"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7be3be6153843e0f01351b1313a5ad4723595427680dac2dfff22a37e652ce02"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:dd24f66b6697ee7424f7da575ec6cbffc8ede441114d53470949cda4d97c6e56"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:b07c780f7345ecf5901356dc21dee0669defc489c38ce7b9ab0f5e008cc0385c"}, + {file = "orjson-3.6.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ea32015a5d8a4ce00d348a0de5dc7040e0ad58f970a8fcbb5713a1eac129e493"}, + {file = "orjson-3.6.8-cp38-none-win_amd64.whl", hash = "sha256:c5a3e382194c838988ec128a26b08aa92044e5e055491cc4056142af0c1c54d7"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:83a8424e857ae1bf53530e88b4eb2f16ca2b489073b924e655f1575cacd7f52a"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:81e1a6a2d67f15007dadacbf9ba5d3d79237e5e33786c028557fe5a2b72f1c9a"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:137b539881c77866eba86ff6a11df910daf2eb9ab8f1acae62f879e83d7c38af"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cbd358f3b3ad539a27e36900e8e7d172d0e1b72ad9dd7d69544dcbc0f067ee7"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:6ab94701542d40b90903ecfc339333f458884979a01cb9268bc662cc67a5f6d8"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:32b6f26593a9eb606b40775826beb0dac152e3d224ea393688fced036045a821"}, + {file = "orjson-3.6.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:afd9e329ebd3418cac3cd747769b1d52daa25fa672bbf414ab59f0e0881b32b9"}, + {file = "orjson-3.6.8-cp39-none-win_amd64.whl", hash = "sha256:0c89b419914d3d1f65a1b0883f377abe42a6e44f6624ba1c63e8846cbfc2fa60"}, + {file = "orjson-3.6.8.tar.gz", hash = "sha256:e19d23741c5de13689bb316abfccea15a19c264e3ec8eb332a5319a583595ace"}, ] packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, @@ -1495,80 +927,14 @@ pathspec = [ {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, ] -pbr = [ - {file = "pbr-5.8.1-py2.py3-none-any.whl", hash = "sha256:27108648368782d07bbf1cb468ad2e2eeef29086affd14087a6d04b7de8af4ec"}, - {file = "pbr-5.8.1.tar.gz", hash = "sha256:66bc5a34912f408bb3925bf21231cb6f59206267b7f63f3503ef865c1a292e25"}, -] platformdirs = [ - {file = "platformdirs-2.5.1-py3-none-any.whl", hash = "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"}, - {file = "platformdirs-2.5.1.tar.gz", hash = "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d"}, + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, ] pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] -pre-commit = [ - {file = "pre_commit-2.17.0-py2.py3-none-any.whl", hash = "sha256:725fa7459782d7bec5ead072810e47351de01709be838c2ce1726b9591dad616"}, - {file = "pre_commit-2.17.0.tar.gz", hash = "sha256:c1a8040ff15ad3d648c70cc3e55b93e4d2d5b687320955505587fd79bbaed06a"}, -] -psycopg2-binary = [ - {file = "psycopg2-binary-2.9.3.tar.gz", hash = "sha256:761df5313dc15da1502b21453642d7599d26be88bff659382f8f9747c7ebea4e"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:539b28661b71da7c0e428692438efbcd048ca21ea81af618d845e06ebfd29478"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e82d38390a03da28c7985b394ec3f56873174e2c88130e6966cb1c946508e65"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57804fc02ca3ce0dbfbef35c4b3a4a774da66d66ea20f4bda601294ad2ea6092"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:083a55275f09a62b8ca4902dd11f4b33075b743cf0d360419e2051a8a5d5ff76"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_24_ppc64le.whl", hash = "sha256:0a29729145aaaf1ad8bafe663131890e2111f13416b60e460dae0a96af5905c9"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a79d622f5206d695d7824cbf609a4f5b88ea6d6dab5f7c147fc6d333a8787e4"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:090f3348c0ab2cceb6dfbe6bf721ef61262ddf518cd6cc6ecc7d334996d64efa"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a9e1f75f96ea388fbcef36c70640c4efbe4650658f3d6a2967b4cc70e907352e"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c3ae8e75eb7160851e59adc77b3a19a976e50622e44fd4fd47b8b18208189d42"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-win32.whl", hash = "sha256:7b1e9b80afca7b7a386ef087db614faebbf8839b7f4db5eb107d0f1a53225029"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:8b344adbb9a862de0c635f4f0425b7958bf5a4b927c8594e6e8d261775796d53"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:e847774f8ffd5b398a75bc1c18fbb56564cda3d629fe68fd81971fece2d3c67e"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68641a34023d306be959101b345732360fc2ea4938982309b786f7be1b43a4a1"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3303f8807f342641851578ee7ed1f3efc9802d00a6f83c101d21c608cb864460"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_24_aarch64.whl", hash = "sha256:e3699852e22aa68c10de06524a3721ade969abf382da95884e6a10ff798f9281"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_24_ppc64le.whl", hash = "sha256:526ea0378246d9b080148f2d6681229f4b5964543c170dd10bf4faaab6e0d27f"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:b1c8068513f5b158cf7e29c43a77eb34b407db29aca749d3eb9293ee0d3103ca"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:15803fa813ea05bef089fa78835118b5434204f3a17cb9f1e5dbfd0b9deea5af"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:152f09f57417b831418304c7f30d727dc83a12761627bb826951692cc6491e57"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:404224e5fef3b193f892abdbf8961ce20e0b6642886cfe1fe1923f41aaa75c9d"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-win32.whl", hash = "sha256:1f6b813106a3abdf7b03640d36e24669234120c72e91d5cbaeb87c5f7c36c65b"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:2d872e3c9d5d075a2e104540965a1cf898b52274a5923936e5bfddb58c59c7c2"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:10bb90fb4d523a2aa67773d4ff2b833ec00857f5912bafcfd5f5414e45280fb1"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a52ecab70af13e899f7847b3e074eeb16ebac5615665db33bce8a1009cf33"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a29b3ca4ec9defec6d42bf5feb36bb5817ba3c0230dd83b4edf4bf02684cd0ae"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:12b11322ea00ad8db8c46f18b7dfc47ae215e4df55b46c67a94b4effbaec7094"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_24_ppc64le.whl", hash = "sha256:53293533fcbb94c202b7c800a12c873cfe24599656b341f56e71dd2b557be063"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c381bda330ddf2fccbafab789d83ebc6c53db126e4383e73794c74eedce855ef"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9d29409b625a143649d03d0fd7b57e4b92e0ecad9726ba682244b73be91d2fdb"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:183a517a3a63503f70f808b58bfbf962f23d73b6dccddae5aa56152ef2bcb232"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:15c4e4cfa45f5a60599d9cec5f46cd7b1b29d86a6390ec23e8eebaae84e64554"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-win32.whl", hash = "sha256:adf20d9a67e0b6393eac162eb81fb10bc9130a80540f4df7e7355c2dd4af9fba"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2f9ffd643bc7349eeb664eba8864d9e01f057880f510e4681ba40a6532f93c71"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:def68d7c21984b0f8218e8a15d514f714d96904265164f75f8d3a70f9c295667"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dffc08ca91c9ac09008870c9eb77b00a46b3378719584059c034b8945e26b272"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:280b0bb5cbfe8039205c7981cceb006156a675362a00fe29b16fbc264e242834"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:af9813db73395fb1fc211bac696faea4ca9ef53f32dc0cfa27e4e7cf766dcf24"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_24_ppc64le.whl", hash = "sha256:63638d875be8c2784cfc952c9ac34e2b50e43f9f0a0660b65e2a87d656b3116c"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ffb7a888a047696e7f8240d649b43fb3644f14f0ee229077e7f6b9f9081635bd"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0c9d5450c566c80c396b7402895c4369a410cab5a82707b11aee1e624da7d004"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:d1c1b569ecafe3a69380a94e6ae09a4789bbb23666f3d3a08d06bbd2451f5ef1"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8fc53f9af09426a61db9ba357865c77f26076d48669f2e1bb24d85a22fb52307"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-win32.whl", hash = "sha256:6472a178e291b59e7f16ab49ec8b4f3bdada0a879c68d3817ff0963e722a82ce"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:35168209c9d51b145e459e05c31a9eaeffa9a6b0fd61689b48e07464ffd1a83e"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:47133f3f872faf28c1e87d4357220e809dfd3fa7c64295a4a148bcd1e6e34ec9"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91920527dea30175cc02a1099f331aa8c1ba39bf8b7762b7b56cbf54bc5cce42"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:887dd9aac71765ac0d0bac1d0d4b4f2c99d5f5c1382d8b770404f0f3d0ce8a39"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:1f14c8b0942714eb3c74e1e71700cbbcb415acbc311c730370e70c578a44a25c"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_24_ppc64le.whl", hash = "sha256:7af0dd86ddb2f8af5da57a976d27cd2cd15510518d582b478fbb2292428710b4"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:93cd1967a18aa0edd4b95b1dfd554cf15af657cb606280996d393dadc88c3c35"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bda845b664bb6c91446ca9609fc69f7db6c334ec5e4adc87571c34e4f47b7ddb"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:01310cf4cf26db9aea5158c217caa92d291f0500051a6469ac52166e1a16f5b7"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:99485cab9ba0fa9b84f1f9e1fef106f44a46ef6afdeec8885e0b88d0772b49e8"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-win32.whl", hash = "sha256:46f0e0a6b5fa5851bbd9ab1bc805eef362d3a230fbdfbc209f4a236d0a7a990d"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:accfe7e982411da3178ec690baaceaad3c278652998b2c45828aaac66cd8285f"}, -] py = [ {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, @@ -1581,22 +947,14 @@ pyflakes = [ {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, ] -pygments = [ - {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"}, - {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"}, -] pyparsing = [ - {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"}, - {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, ] pytest = [ {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, ] -pytz = [ - {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"}, - {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"}, -] pyyaml = [ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, @@ -1632,58 +990,10 @@ pyyaml = [ {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] -requests = [ - {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, - {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, -] six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] -snowballstemmer = [ - {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, - {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, -] -sphinx = [ - {file = "Sphinx-4.5.0-py3-none-any.whl", hash = "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226"}, - {file = "Sphinx-4.5.0.tar.gz", hash = "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6"}, -] -sphinx-autodoc-typehints = [ - {file = "sphinx_autodoc_typehints-1.17.0-py3-none-any.whl", hash = "sha256:081daf53077b4ae1c28347d6d858e13e63aefe3b4aacef79fd717dd60687b470"}, - {file = "sphinx_autodoc_typehints-1.17.0.tar.gz", hash = "sha256:51c7b3f5cb9ccd15d0b52088c62df3094f1abd9612930340365c26def8629a14"}, -] -sphinx-rtd-theme = [ - {file = "sphinx_rtd_theme-1.0.0-py2.py3-none-any.whl", hash = "sha256:4d35a56f4508cfee4c4fb604373ede6feae2a306731d533f409ef5c3496fdbd8"}, - {file = "sphinx_rtd_theme-1.0.0.tar.gz", hash = "sha256:eec6d497e4c2195fa0e8b2016b337532b8a699a68bcb22a512870e16925c6a5c"}, -] -sphinxcontrib-apidoc = [ - {file = "sphinxcontrib-apidoc-0.3.0.tar.gz", hash = "sha256:729bf592cf7b7dd57c4c05794f732dc026127275d785c2a5494521fdde773fb9"}, - {file = "sphinxcontrib_apidoc-0.3.0-py2.py3-none-any.whl", hash = "sha256:6671a46b2c6c5b0dca3d8a147849d159065e50443df79614f921b42fbd15cb09"}, -] -sphinxcontrib-applehelp = [ - {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, - {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, -] -sphinxcontrib-devhelp = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, -] -sphinxcontrib-htmlhelp = [ - {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, - {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, -] -sphinxcontrib-jsmath = [ - {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, - {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, -] -sphinxcontrib-qthelp = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, -] -sphinxcontrib-serializinghtml = [ - {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, - {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, -] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, @@ -1693,12 +1003,8 @@ tomli = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] typing-extensions = [ - {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, - {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, -] -urllib3 = [ - {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, - {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, + {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, + {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, ] uvloop = [ {file = "uvloop-0.16.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6224f1401025b748ffecb7a6e2652b17768f30b1a6a3f7b44660e5b5b690b12d"}, @@ -1718,10 +1024,6 @@ uvloop = [ {file = "uvloop-0.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e5f2e2ff51aefe6c19ee98af12b4ae61f5be456cd24396953244a30880ad861"}, {file = "uvloop-0.16.0.tar.gz", hash = "sha256:f74bc20c7b67d1c27c72601c78cf95be99d5c2cdd4514502b4f3eb0933ff1228"}, ] -virtualenv = [ - {file = "virtualenv-20.14.0-py2.py3-none-any.whl", hash = "sha256:1e8588f35e8b42c6ec6841a13c5e88239de1e6e4e4cedfd3916b306dc826ec66"}, - {file = "virtualenv-20.14.0.tar.gz", hash = "sha256:8e5b402037287126e81ccde9432b95a8be5b19d36584f64957060a3488c11ca8"}, -] yarl = [ {file = "yarl-1.7.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f2a8508f7350512434e41065684076f640ecce176d262a7d54f0da41d99c5a95"}, {file = "yarl-1.7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da6df107b9ccfe52d3a48165e48d72db0eca3e3029b5b8cb4fe6ee3cb870ba8b"}, @@ -1796,7 +1098,3 @@ yarl = [ {file = "yarl-1.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:797c2c412b04403d2da075fb93c123df35239cd7b4cc4e0cd9e5839b73f52c58"}, {file = "yarl-1.7.2.tar.gz", hash = "sha256:45399b46d60c253327a460e99856752009fcee5f5d3c80b2f7c0cae1c38d56dd"}, ] -zipp = [ - {file = "zipp-3.7.0-py3-none-any.whl", hash = "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375"}, - {file = "zipp-3.7.0.tar.gz", hash = "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d"}, -] diff --git a/packages/plugins/minos-discovery-minos/pyproject.toml b/packages/plugins/minos-discovery-minos/pyproject.toml index 5a297dc4b..c2566b226 100644 --- a/packages/plugins/minos-discovery-minos/pyproject.toml +++ b/packages/plugins/minos-discovery-minos/pyproject.toml @@ -1,7 +1,7 @@ [tool.poetry] name = "minos-discovery-minos" -version = "0.6.0" -description = "The minos-discover plugin of the Minos Framework" +version = "0.7.0" +description = "The minos-discovery plugin of the Minos Framework" readme = "README.md" repository = "https://github.com/minos-framework/minos-python" homepage = "https://www.minos.run/" @@ -21,18 +21,18 @@ keywords = [ "saga", ] packages = [ - { include = "minos" } + { include = "minos" }, ] include = [ - "AUTHORS.md", - "HISTORY.md", - "LICENSE", + { path = "AUTHORS.md", format = "sdist" }, + { path = "HISTORY.md", format = "sdist" }, + { path = "LICENSE", format = "sdist" }, ] [tool.poetry.dependencies] python = "^3.9" -minos-microservice-common = "^0.6.0" -minos-microservice-networks = "^0.6.0" +minos-microservice-common = "^0.7.0" +minos-microservice-networks = "^0.7.0" aiohttp = "^3.8.1" [tool.poetry.dev-dependencies] @@ -43,12 +43,6 @@ isort = "^5.8.0" pytest = "^6.2.4" coverage = "^6.3" flake8 = "^4.0.1" -Sphinx = "^4.0.1" -pre-commit = "^2.12.1" -sphinx-autodoc-typehints = "^1.12.0" -sphinxcontrib-apidoc = "^0.3.0" -sphinx-rtd-theme = "^1.0.0" -m2r2 = "^0.3.2" [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/packages/plugins/minos-http-aiohttp/HISTORY.md b/packages/plugins/minos-http-aiohttp/HISTORY.md index 507f1d38d..833e918e7 100644 --- a/packages/plugins/minos-http-aiohttp/HISTORY.md +++ b/packages/plugins/minos-http-aiohttp/HISTORY.md @@ -3,4 +3,11 @@ ## 0.6.0 (2022-03-28) * Add `AioHttpConnector` as the implementation of the `aiohttp` server. -* Add `AioHttpRequest`, `AioHttpResponse` and `AioHttpResponseException` classes as the request/response wrappers for `aiohttp`. \ No newline at end of file +* Add `AioHttpRequest`, `AioHttpResponse` and `AioHttpResponseException` classes as the request/response wrappers for `aiohttp`. + +## 0.7.0 (2022-05-11) + +* Now `AioHttpRequest`'s `headers` attribute is mutable. +* Unify documentation building pipeline across all `minos-python` packages. +* Fix documentation building warnings. +* Fix bug related with package building and additional files like `AUTHORS.md`, `HISTORY.md`, etc. \ No newline at end of file diff --git a/packages/plugins/minos-http-aiohttp/Makefile b/packages/plugins/minos-http-aiohttp/Makefile index 854bc90bc..2016f9e38 100644 --- a/packages/plugins/minos-http-aiohttp/Makefile +++ b/packages/plugins/minos-http-aiohttp/Makefile @@ -15,10 +15,6 @@ reformat: poetry run black --line-length 120 minos tests poetry run isort minos tests -docs: - rm -rf docs/api - poetry run $(MAKE) --directory=docs html - release: $(MAKE) dist poetry publish @@ -38,5 +34,4 @@ check: $(MAKE) reformat $(MAKE) lint $(MAKE) test - $(MAKE) docs $(MAKE) dist diff --git a/packages/plugins/minos-http-aiohttp/RUNTHETESTS.md b/packages/plugins/minos-http-aiohttp/RUNTHETESTS.md index 8b5e95b1f..386e2b0e7 100644 --- a/packages/plugins/minos-http-aiohttp/RUNTHETESTS.md +++ b/packages/plugins/minos-http-aiohttp/RUNTHETESTS.md @@ -1,5 +1,4 @@ -Run the tests -============== +# Run the tests In order to run the tests, please make sure you have the `Docker Engine `_ and `Docker Compose `_ installed. diff --git a/packages/plugins/minos-http-aiohttp/SETUP.md b/packages/plugins/minos-http-aiohttp/SETUP.md deleted file mode 100644 index 8203965c7..000000000 --- a/packages/plugins/minos-http-aiohttp/SETUP.md +++ /dev/null @@ -1,11 +0,0 @@ -Set up a development environment -================================= - -Since we use `poetry` as the default package manager, it must be installed. Please refer to -`https://python-poetry.org/docs/#installation`. - -Run `poetry install` to get the dependencies. - -Run `pre-commit install` to set the git checks before commiting. - -Make yourself sure you are able to run the tests. Refer to the appropriate section in this guide. diff --git a/packages/plugins/minos-http-aiohttp/docs/Makefile b/packages/plugins/minos-http-aiohttp/docs/Makefile deleted file mode 100644 index fe5d0ed63..000000000 --- a/packages/plugins/minos-http-aiohttp/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = python -msphinx -SPHINXPROJ = minos-http-aiohttp -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/packages/plugins/minos-http-aiohttp/docs/_static/style.css b/packages/plugins/minos-http-aiohttp/docs/_static/style.css deleted file mode 100644 index 8aa6c288f..000000000 --- a/packages/plugins/minos-http-aiohttp/docs/_static/style.css +++ /dev/null @@ -1,3 +0,0 @@ -.wy-nav-content { - max-width: 1200px !important; -} diff --git a/packages/plugins/minos-http-aiohttp/docs/_templates/layout.html b/packages/plugins/minos-http-aiohttp/docs/_templates/layout.html deleted file mode 100644 index b0a448060..000000000 --- a/packages/plugins/minos-http-aiohttp/docs/_templates/layout.html +++ /dev/null @@ -1,4 +0,0 @@ -{% extends "!layout.html" %} -{% block extrahead %} - -{% endblock %} \ No newline at end of file diff --git a/packages/plugins/minos-http-aiohttp/docs/authors.md b/packages/plugins/minos-http-aiohttp/docs/authors.md deleted file mode 100644 index cf16fc494..000000000 --- a/packages/plugins/minos-http-aiohttp/docs/authors.md +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../AUTHORS.md diff --git a/packages/plugins/minos-http-aiohttp/docs/conf.py b/packages/plugins/minos-http-aiohttp/docs/conf.py deleted file mode 100755 index ba6e4a8eb..000000000 --- a/packages/plugins/minos-http-aiohttp/docs/conf.py +++ /dev/null @@ -1,197 +0,0 @@ -#!/usr/bin/env python -# -# minos documentation build configuration file, created by -# sphinx-quickstart on Fri Jun 9 13:47:02 2017. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -# If extensions (or modules to document with autodoc) are in another -# directory, add these directories to sys.path here. If the directory is -# relative to the documentation root, use os.path.abspath to make it -# absolute, like shown here. -# -import os -import sys - -sys.path.insert(0, os.path.abspath("..")) - -import sphinx_rtd_theme - -from minos.plugins import ( - aiohttp, -) - -# -- General configuration --------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. - - -extensions = [ - "sphinxcontrib.apidoc", - "sphinx.ext.autodoc", - "sphinx_autodoc_typehints", - "sphinx.ext.viewcode", - "sphinx_rtd_theme", - "m2r2", -] -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -source_suffix = [".rst", ".md"] - -# The master toctree document. -master_doc = "index" - -# General information about the project. -project = "Minos Aiohttp" -copyright = "2021, Clariteia" -author = "Clariteia Devs" - -# The version info for the project you're documenting, acts as replacement -# for |version| and |release|, also used in various other places throughout -# the built documents. -# -# The short X.Y version. -version = aiohttp.__version__ -# The full version, including alpha/beta/rc tags. -release = aiohttp.__version__ - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = "sphinx" - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = False - - -# -- Options for HTML output ------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# - -html_theme = "sphinx_rtd_theme" - -# Theme options are theme-specific and customize the look and feel of a -# theme further. For a list of options available for each theme, see the -# documentation. -# - -# html_theme_options = { -# "codecov_button": True, -# "description": "Reactive microservices for an asynchronous world", -# "github_button": True, -# "github_user": "Clariteia", -# "github_repo": "plugins", -# "github_type": "star", -# } - -html_sidebars = {"**": ["about.html", "navigation.html", "searchbox.html"]} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] - - -# -- Options for HTMLHelp output --------------------------------------- - -# Output file base name for HTML help builder. -htmlhelp_basename = "minosdoc" - - -# -- Options for LaTeX output ------------------------------------------ - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass -# [howto, manual, or own class]). -latex_documents = [ - (master_doc, "minos.tex", "Minos Aiohttp Documentation", "Clariteia Devs", "manual"), -] - - -# -- Options for manual page output ------------------------------------ - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [(master_doc, "minos", "Minos Aiohttp Documentation", [author], 1)] - - -# -- Options for Texinfo output ---------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ( - master_doc, - "minos", - "Minos Aiohttp Documentation", - author, - "minos", - "One line description of project.", - "Miscellaneous", - ), -] - -# "apidoc" extension -apidoc_module_dir = "../minos" -apidoc_output_dir = "api" -apidoc_separate_modules = True -autodoc_default_options = { - "inherited-members": True, - "special-members": "__init__", - "undoc-members": True, -} - -apidoc_toc_file = False -apidoc_module_first = True -apidoc_extra_args = [ - "--force", - "--implicit-namespaces", -] -# "autodoc typehints" extension - -set_type_checking_flag = True -typehints_fully_qualified = True diff --git a/packages/plugins/minos-http-aiohttp/docs/history.md b/packages/plugins/minos-http-aiohttp/docs/history.md deleted file mode 100644 index d26e5be83..000000000 --- a/packages/plugins/minos-http-aiohttp/docs/history.md +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../HISTORY.md diff --git a/packages/plugins/minos-http-aiohttp/docs/index.md b/packages/plugins/minos-http-aiohttp/docs/index.md deleted file mode 100644 index 5e842068d..000000000 --- a/packages/plugins/minos-http-aiohttp/docs/index.md +++ /dev/null @@ -1,16 +0,0 @@ -# Welcome to Minos AIOHTTP's documentation! - -.. toctree:: - :maxdepth: 2 - - readme - runthetests - usage - api/minos.plugins - authors - history - -# Indices and tables -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/packages/plugins/minos-http-aiohttp/docs/readme.md b/packages/plugins/minos-http-aiohttp/docs/readme.md deleted file mode 100644 index da72dbef1..000000000 --- a/packages/plugins/minos-http-aiohttp/docs/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -# Introduction - -.. mdinclude:: ../README.md diff --git a/packages/plugins/minos-http-aiohttp/docs/runthetests.md b/packages/plugins/minos-http-aiohttp/docs/runthetests.md deleted file mode 100644 index 309db1b96..000000000 --- a/packages/plugins/minos-http-aiohttp/docs/runthetests.md +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../RUNTHETESTS.md diff --git a/packages/plugins/minos-http-aiohttp/docs/usage.md b/packages/plugins/minos-http-aiohttp/docs/usage.md deleted file mode 100644 index 8f04b05ad..000000000 --- a/packages/plugins/minos-http-aiohttp/docs/usage.md +++ /dev/null @@ -1 +0,0 @@ -# Usage diff --git a/packages/plugins/minos-http-aiohttp/minos/plugins/aiohttp/__init__.py b/packages/plugins/minos-http-aiohttp/minos/plugins/aiohttp/__init__.py index 9a07f1da2..b4de6d65d 100644 --- a/packages/plugins/minos-http-aiohttp/minos/plugins/aiohttp/__init__.py +++ b/packages/plugins/minos-http-aiohttp/minos/plugins/aiohttp/__init__.py @@ -1,6 +1,8 @@ +"""The aiohttp plugin of the Minos Framework.""" + __author__ = "Minos Framework Devs" __email__ = "hey@minos.run" -__version__ = "0.6.0" +__version__ = "0.7.0" from .connectors import ( AioHttpConnector, diff --git a/packages/plugins/minos-http-aiohttp/minos/plugins/aiohttp/requests.py b/packages/plugins/minos-http-aiohttp/minos/plugins/aiohttp/requests.py index 12902ea38..4a4bf3355 100644 --- a/packages/plugins/minos-http-aiohttp/minos/plugins/aiohttp/requests.py +++ b/packages/plugins/minos-http-aiohttp/minos/plugins/aiohttp/requests.py @@ -81,7 +81,7 @@ def __eq__(self, other: AioHttpRequest) -> bool: def __repr__(self) -> str: return f"{type(self).__name__}({self.raw!r})" - @cached_property + @property def user(self) -> Optional[UUID]: """ Returns the UUID of the user making the Request. @@ -90,14 +90,14 @@ def user(self) -> Optional[UUID]: return None return UUID(self.headers["user"]) - @property + @cached_property def headers(self) -> dict[str, str]: """Get the headers of the request. :return: A dictionary in which keys are ``str`` instances and values are ``str`` instances. """ # noinspection PyTypeChecker - return self.raw.headers + return self.raw.headers.copy() @property def has_content(self) -> bool: diff --git a/packages/plugins/minos-http-aiohttp/poetry.lock b/packages/plugins/minos-http-aiohttp/poetry.lock index aeab732e2..28634757a 100644 --- a/packages/plugins/minos-http-aiohttp/poetry.lock +++ b/packages/plugins/minos-http-aiohttp/poetry.lock @@ -39,21 +39,6 @@ develop = ["aiocontextvars (==0.2.2)", "aiohttp-asgi", "aiohttp (<4)", "async-ti raven = ["raven-aiohttp"] uvloop = ["uvloop (>=0.14,<1)"] -[[package]] -name = "aiopg" -version = "1.3.3" -description = "Postgres integration with asyncio." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -async-timeout = ">=3.0,<5.0" -psycopg2-binary = ">=2.8.4" - -[package.extras] -sa = ["sqlalchemy[postgresql_psycopg2binary] (>=1.3,<1.5)"] - [[package]] name = "aiosignal" version = "1.2.0" @@ -65,14 +50,6 @@ python-versions = ">=3.6" [package.dependencies] frozenlist = ">=1.1.0" -[[package]] -name = "alabaster" -version = "0.7.12" -description = "A configurable sidebar-enabled Sphinx theme" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "async-timeout" version = "4.0.2" @@ -103,20 +80,9 @@ docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] -[[package]] -name = "babel" -version = "2.9.1" -description = "Internationalization utilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -pytz = ">=2015.7" - [[package]] name = "black" -version = "22.1.0" +version = "22.3.0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -127,7 +93,7 @@ click = ">=8.0.0" mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = ">=1.1.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] @@ -144,22 +110,6 @@ category = "main" optional = false python-versions = "*" -[[package]] -name = "certifi" -version = "2021.10.8" -description = "Python package for providing Mozilla's CA Bundle." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "cfgv" -version = "3.3.1" -description = "Validate configuration and produce human readable error messages." -category = "dev" -optional = false -python-versions = ">=3.6.1" - [[package]] name = "charset-normalizer" version = "2.0.12" @@ -173,11 +123,11 @@ unicode_backport = ["unicodedata2"] [[package]] name = "click" -version = "8.0.4" +version = "8.1.3" description = "Composable command line interface toolkit" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -225,7 +175,7 @@ python-versions = "*" [[package]] name = "dependency-injector" -version = "4.39.0" +version = "4.39.1" description = "Dependency injection framework for Python" category = "main" optional = false @@ -240,25 +190,9 @@ flask = ["flask"] pydantic = ["pydantic"] yaml = ["pyyaml"] -[[package]] -name = "distlib" -version = "0.3.4" -description = "Distribution utilities" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "docutils" -version = "0.17.1" -description = "Docutils -- Python Documentation Utilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - [[package]] name = "fastavro" -version = "1.4.10" +version = "1.4.11" description = "Fast read/write of AVRO files" category = "main" optional = false @@ -270,18 +204,6 @@ lz4 = ["lz4"] snappy = ["python-snappy"] zstandard = ["zstandard"] -[[package]] -name = "filelock" -version = "3.6.0" -description = "A platform independent file lock." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"] -testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-cov", "pytest-timeout (>=1.4.2)"] - [[package]] name = "flake8" version = "4.0.1" @@ -303,17 +225,6 @@ category = "main" optional = false python-versions = ">=3.7" -[[package]] -name = "identify" -version = "2.4.12" -description = "File identification library for Python" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -license = ["ukkonen"] - [[package]] name = "idna" version = "3.3" @@ -322,30 +233,6 @@ category = "main" optional = false python-versions = ">=3.5" -[[package]] -name = "imagesize" -version = "1.3.0" -description = "Getting image size from png/jpeg/jpeg2000/gif file" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "importlib-metadata" -version = "4.11.3" -description = "Read metadata from Python packages" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] -perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] - [[package]] name = "iniconfig" version = "1.1.1" @@ -368,48 +255,6 @@ requirements_deprecated_finder = ["pipreqs", "pip-api"] colors = ["colorama (>=0.4.3,<0.5.0)"] plugins = ["setuptools"] -[[package]] -name = "jinja2" -version = "3.1.1" -description = "A very fast and expressive template engine." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - -[[package]] -name = "lmdb" -version = "1.3.0" -description = "Universal Python binding for the LMDB 'Lightning' Database" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "m2r2" -version = "0.3.2" -description = "Markdown and reStructuredText in a single file." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -docutils = "*" -mistune = "0.8.4" - -[[package]] -name = "markupsafe" -version = "2.1.1" -description = "Safely add untrusted strings to HTML/XML markup." -category = "dev" -optional = false -python-versions = ">=3.7" - [[package]] name = "mccabe" version = "0.6.1" @@ -420,7 +265,7 @@ python-versions = "*" [[package]] name = "minos-microservice-common" -version = "0.6.0" +version = "0.7.0" description = "The common core of the Minos Framework" category = "main" optional = false @@ -428,12 +273,10 @@ python-versions = "^3.9" develop = true [package.dependencies] -aiomisc = ">=14.0.3,<16.0.0" -aiopg = "^1.2.1" +aiomisc = ">=14.0.3,<15.8.0" cached-property = "^1.5.2" dependency-injector = "^4.32.2" fastavro = "^1.4.0" -lmdb = "^1.2.1" orjson = "^3.5.2" PyYAML = ">=5.4.1,<7.0.0" uvloop = "^0.16.0" @@ -444,7 +287,7 @@ url = "../../core/minos-microservice-common" [[package]] name = "minos-microservice-networks" -version = "0.6.0" +version = "0.7.0" description = "The networks core of the Minos Framework" category = "main" optional = false @@ -452,23 +295,13 @@ python-versions = "^3.9" develop = true [package.dependencies] -aiopg = "^1.2.1" crontab = "^0.23.0" -minos-microservice-common = "^0.6.0" -psycopg2-binary = "^2.9.3" +minos-microservice-common = "^0.7.0*" [package.source] type = "directory" url = "../../core/minos-microservice-networks" -[[package]] -name = "mistune" -version = "0.8.4" -description = "The fastest markdown parser in pure Python" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "multidict" version = "6.0.2" @@ -485,17 +318,9 @@ category = "dev" optional = false python-versions = "*" -[[package]] -name = "nodeenv" -version = "1.6.0" -description = "Node.js virtual environment builder" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "orjson" -version = "3.6.7" +version = "3.6.8" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" category = "main" optional = false @@ -520,25 +345,17 @@ category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -[[package]] -name = "pbr" -version = "5.8.1" -description = "Python Build Reasonableness" -category = "dev" -optional = false -python-versions = ">=2.6" - [[package]] name = "platformdirs" -version = "2.5.1" +version = "2.5.2" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" [package.extras] -docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] +test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] [[package]] name = "pluggy" @@ -552,30 +369,6 @@ python-versions = ">=3.6" dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] -[[package]] -name = "pre-commit" -version = "2.17.0" -description = "A framework for managing and maintaining multi-language pre-commit hooks." -category = "dev" -optional = false -python-versions = ">=3.6.1" - -[package.dependencies] -cfgv = ">=2.0.0" -identify = ">=1.0.0" -nodeenv = ">=0.11.1" -pyyaml = ">=5.1" -toml = "*" -virtualenv = ">=20.0.8" - -[[package]] -name = "psycopg2-binary" -version = "2.9.3" -description = "psycopg2 - Python-PostgreSQL Database Adapter" -category = "main" -optional = false -python-versions = ">=3.6" - [[package]] name = "py" version = "1.11.0" @@ -600,24 +393,16 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -[[package]] -name = "pygments" -version = "2.11.2" -description = "Pygments is a syntax highlighting package written in Python." -category = "dev" -optional = false -python-versions = ">=3.5" - [[package]] name = "pyparsing" -version = "3.0.7" -description = "Python parsing module" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.6.8" [package.extras] -diagrams = ["jinja2", "railroad-diagrams"] +diagrams = ["railroad-diagrams", "jinja2"] [[package]] name = "pytest" @@ -640,14 +425,6 @@ toml = "*" [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] -[[package]] -name = "pytz" -version = "2022.1" -description = "World timezone definitions, modern and historical" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "pyyaml" version = "6.0" @@ -656,24 +433,6 @@ category = "main" optional = false python-versions = ">=3.6" -[[package]] -name = "requests" -version = "2.27.1" -description = "Python HTTP for Humans." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} -urllib3 = ">=1.21.1,<1.27" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] - [[package]] name = "six" version = "1.16.0" @@ -682,159 +441,6 @@ category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -[[package]] -name = "snowballstemmer" -version = "2.2.0" -description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "sphinx" -version = "4.5.0" -description = "Python documentation generator" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -alabaster = ">=0.7,<0.8" -babel = ">=1.3" -colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.14,<0.18" -imagesize = "*" -importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} -Jinja2 = ">=2.3" -packaging = "*" -Pygments = ">=2.0" -requests = ">=2.5.0" -snowballstemmer = ">=1.1" -sphinxcontrib-applehelp = "*" -sphinxcontrib-devhelp = "*" -sphinxcontrib-htmlhelp = ">=2.0.0" -sphinxcontrib-jsmath = "*" -sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = ">=1.1.5" - -[package.extras] -docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.931)", "docutils-stubs", "types-typed-ast", "types-requests"] -test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] - -[[package]] -name = "sphinx-autodoc-typehints" -version = "1.17.0" -description = "Type hints (PEP 484) support for the Sphinx autodoc extension" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -Sphinx = ">=4" - -[package.extras] -testing = ["covdefaults (>=2)", "coverage (>=6)", "diff-cover (>=6.4)", "nptyping (>=1)", "pytest (>=6)", "pytest-cov (>=3)", "sphobjinv (>=2)", "typing-extensions (>=3.5)"] -type_comments = ["typed-ast (>=1.4.0)"] - -[[package]] -name = "sphinx-rtd-theme" -version = "1.0.0" -description = "Read the Docs theme for Sphinx" -category = "dev" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" - -[package.dependencies] -docutils = "<0.18" -sphinx = ">=1.6" - -[package.extras] -dev = ["transifex-client", "sphinxcontrib-httpdomain", "bump2version"] - -[[package]] -name = "sphinxcontrib-apidoc" -version = "0.3.0" -description = "A Sphinx extension for running 'sphinx-apidoc' on each build" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -pbr = "*" -Sphinx = ">=1.6.0" - -[[package]] -name = "sphinxcontrib-applehelp" -version = "1.0.2" -description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-devhelp" -version = "1.0.2" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-htmlhelp" -version = "2.0.0" -description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest", "html5lib"] - -[[package]] -name = "sphinxcontrib-jsmath" -version = "1.0.1" -description = "A sphinx extension which renders display math in HTML via JavaScript" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -test = ["pytest", "flake8", "mypy"] - -[[package]] -name = "sphinxcontrib-qthelp" -version = "1.0.3" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-serializinghtml" -version = "1.1.5" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - [[package]] name = "toml" version = "0.10.2" @@ -853,24 +459,11 @@ python-versions = ">=3.7" [[package]] name = "typing-extensions" -version = "4.1.1" -description = "Backported and Experimental Type Hints for Python 3.6+" +version = "4.2.0" +description = "Backported and Experimental Type Hints for Python 3.7+" category = "dev" optional = false -python-versions = ">=3.6" - -[[package]] -name = "urllib3" -version = "1.26.9" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" - -[package.extras] -brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +python-versions = ">=3.7" [[package]] name = "uvloop" @@ -885,24 +478,6 @@ dev = ["Cython (>=0.29.24,<0.30.0)", "pytest (>=3.6.0)", "Sphinx (>=4.1.2,<4.2.0 docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)"] test = ["aiohttp", "flake8 (>=3.9.2,<3.10.0)", "psutil", "pycodestyle (>=2.7.0,<2.8.0)", "pyOpenSSL (>=19.0.0,<19.1.0)", "mypy (>=0.800)"] -[[package]] -name = "virtualenv" -version = "20.14.0" -description = "Virtual Python Environment builder" -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - -[package.dependencies] -distlib = ">=0.3.1,<1" -filelock = ">=3.2,<4" -platformdirs = ">=2,<3" -six = ">=1.9.0,<2" - -[package.extras] -docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=21.3)"] -testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)"] - [[package]] name = "yarl" version = "1.7.2" @@ -915,22 +490,10 @@ python-versions = ">=3.6" idna = ">=2.0" multidict = ">=4.0" -[[package]] -name = "zipp" -version = "3.7.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] - [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "da8b7c522a577fd73f69a42f29043823eb2510318fbb6e4a90a9d75513f75242" +content-hash = "5ff2df19716fefd78095278add594f005e5783892b37d7787097ef23ed4b0125" [metadata.files] aiohttp = [ @@ -1011,18 +574,10 @@ aiomisc = [ {file = "aiomisc-15.7.3-py3-none-any.whl", hash = "sha256:0403e83268e98d0f2a125a70d13303fe1a2358e36db3daf02df032c7fa4f1525"}, {file = "aiomisc-15.7.3.tar.gz", hash = "sha256:ba250a34bd4609ced36111cb50580f57c3d52f3955f953a53ecb2986988baedc"}, ] -aiopg = [ - {file = "aiopg-1.3.3-py3-none-any.whl", hash = "sha256:2842dd8741460eeef940032dcb577bfba4d4115205dd82a73ce13b3271f5bf0a"}, - {file = "aiopg-1.3.3.tar.gz", hash = "sha256:547c6ba4ea0d73c2a11a2f44387d7133cc01d3c6f3b8ed976c0ac1eff4f595d7"}, -] aiosignal = [ {file = "aiosignal-1.2.0-py3-none-any.whl", hash = "sha256:26e62109036cd181df6e6ad646f91f0dcfd05fe16d0cb924138ff2ab75d64e3a"}, {file = "aiosignal-1.2.0.tar.gz", hash = "sha256:78ed67db6c7b7ced4f98e495e572106d5c432a93e1ddd1bf475e1dc05f5b7df2"}, ] -alabaster = [ - {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, - {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, -] async-timeout = [ {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, @@ -1035,54 +590,42 @@ attrs = [ {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] -babel = [ - {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"}, - {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, -] black = [ - {file = "black-22.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1297c63b9e1b96a3d0da2d85d11cd9bf8664251fd69ddac068b98dc4f34f73b6"}, - {file = "black-22.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2ff96450d3ad9ea499fc4c60e425a1439c2120cbbc1ab959ff20f7c76ec7e866"}, - {file = "black-22.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e21e1f1efa65a50e3960edd068b6ae6d64ad6235bd8bfea116a03b21836af71"}, - {file = "black-22.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f69158a7d120fd641d1fa9a921d898e20d52e44a74a6fbbcc570a62a6bc8ab"}, - {file = "black-22.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:228b5ae2c8e3d6227e4bde5920d2fc66cc3400fde7bcc74f480cb07ef0b570d5"}, - {file = "black-22.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b1a5ed73ab4c482208d20434f700d514f66ffe2840f63a6252ecc43a9bc77e8a"}, - {file = "black-22.1.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35944b7100af4a985abfcaa860b06af15590deb1f392f06c8683b4381e8eeaf0"}, - {file = "black-22.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7835fee5238fc0a0baf6c9268fb816b5f5cd9b8793423a75e8cd663c48d073ba"}, - {file = "black-22.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dae63f2dbf82882fa3b2a3c49c32bffe144970a573cd68d247af6560fc493ae1"}, - {file = "black-22.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fa1db02410b1924b6749c245ab38d30621564e658297484952f3d8a39fce7e8"}, - {file = "black-22.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c8226f50b8c34a14608b848dc23a46e5d08397d009446353dad45e04af0c8e28"}, - {file = "black-22.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2d6f331c02f0f40aa51a22e479c8209d37fcd520c77721c034517d44eecf5912"}, - {file = "black-22.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:742ce9af3086e5bd07e58c8feb09dbb2b047b7f566eb5f5bc63fd455814979f3"}, - {file = "black-22.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fdb8754b453fb15fad3f72cd9cad3e16776f0964d67cf30ebcbf10327a3777a3"}, - {file = "black-22.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5660feab44c2e3cb24b2419b998846cbb01c23c7fe645fee45087efa3da2d61"}, - {file = "black-22.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:6f2f01381f91c1efb1451998bd65a129b3ed6f64f79663a55fe0e9b74a5f81fd"}, - {file = "black-22.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:efbadd9b52c060a8fc3b9658744091cb33c31f830b3f074422ed27bad2b18e8f"}, - {file = "black-22.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8871fcb4b447206904932b54b567923e5be802b9b19b744fdff092bd2f3118d0"}, - {file = "black-22.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccad888050f5393f0d6029deea2a33e5ae371fd182a697313bdbd835d3edaf9c"}, - {file = "black-22.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07e5c049442d7ca1a2fc273c79d1aecbbf1bc858f62e8184abe1ad175c4f7cc2"}, - {file = "black-22.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:373922fc66676133ddc3e754e4509196a8c392fec3f5ca4486673e685a421321"}, - {file = "black-22.1.0-py3-none-any.whl", hash = "sha256:3524739d76b6b3ed1132422bf9d82123cd1705086723bc3e235ca39fd21c667d"}, - {file = "black-22.1.0.tar.gz", hash = "sha256:a7c0192d35635f6fc1174be575cb7915e92e5dd629ee79fdaf0dcfa41a80afb5"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"}, + {file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"}, + {file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"}, + {file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"}, + {file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"}, + {file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"}, + {file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"}, + {file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"}, + {file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"}, + {file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"}, + {file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"}, + {file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"}, + {file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"}, + {file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"}, + {file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"}, + {file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"}, + {file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"}, + {file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"}, ] cached-property = [ {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, ] -certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, -] -cfgv = [ - {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, - {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, -] charset-normalizer = [ {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, ] click = [ - {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"}, - {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, ] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, @@ -1139,72 +682,60 @@ crontab = [ {file = "crontab-0.23.0.tar.gz", hash = "sha256:ca79dede9c2f572bb32f38703e8fddcf3427e86edc838f2ffe7ae4b9ee2b0733"}, ] dependency-injector = [ - {file = "dependency-injector-4.39.0.tar.gz", hash = "sha256:35d6c03683f512bcc8b0c950890ac40ce19bdacc7de4d59249dd61ed818f0930"}, - {file = "dependency_injector-4.39.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f046a5dbe7e5764fae9a69423f66241a8fdb62acea5c32b0c41a7da94b7f6da3"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfdd78f7d97c1f6ba4a3926a2e404507a4f77ecbd610d4a1b37dedb5c0b57ad1"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:512c23da829bb8ac2ae13f33aa017acf58ae9408e7796a146e1644e8b8471b5b"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7dc81df7f566bfdacdee448bc71085acd163b935860d2b2504b4f32840b3b692"}, - {file = "dependency_injector-4.39.0-cp310-cp310-win32.whl", hash = "sha256:9ffc5393700f45d740abecc50cdc1251eae69e50516ec9d0a48fba0e875ed083"}, - {file = "dependency_injector-4.39.0-cp310-cp310-win_amd64.whl", hash = "sha256:9118f36a3df1e9819074ccb35734d663812c8f6ef81d45c8e4ec81ce5dccac9c"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:1ff723aaf096fabb05cf8b08ba99888538a2a77e03a5082b70cd54eb9df619f3"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bb913900ceb1766f55dc628052d8e191a9c2b1737a0d775fbc230af90ab2c1e"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:329e801eb46b9933432481d3142e563e28a90d77952edac43126264c36ed2278"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1c1a67c699ae2c0234f07d121736fa44e8fe2d56c14b2fd210c3e04a151620bb"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-win32.whl", hash = "sha256:e1347defd46fe9067f857b1174bdb1b19458232ac1a485507df2ddff084cf31c"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-win_amd64.whl", hash = "sha256:9581c4c90f1aaf85ffb9b06bac7ac592df7076522881145321a9dd0702fee828"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8da8ff05fa17e852aa5831a600177e5bb72bf53b8a184f6922ae715387a460ba"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58a56999cebd8b2ba9c19e514e383924865e5f7d6273f8e5b7d85468d9042059"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4914332d6145fb7cfc5f2236a823a3859b92a7e75566ffca0987dcc0f7f7be53"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00aea40ee2d400a8091947ad97cda34b230628aeeac1774f8fa9a3500b5704b2"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-win32.whl", hash = "sha256:b94a64bc73d86d04b33c698fae4b9dad2536a8534ac6922c8226764da5d62d17"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4f59cc0b0d3beb82875d94b7e725b5097a7a454e8e323625ba6ac3095a29300e"}, - {file = "dependency_injector-4.39.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a8d840348f01d997e32394dba36e09c1ecd312b286befb6b3ca27526002ae94"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92097ffabca89d1539e200f91bfa13ff8ca502c9057391c3b78787d50fe502ed"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4a889e116fe76742ef6ff27d5e93ee9e364cbe7bbc6678df8c5dd54597a6fc"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a31e00961fdc1b3808a9e2adeb1107ec4bba0ad3a90b116af9d116a667e4626a"}, - {file = "dependency_injector-4.39.0-cp38-cp38-win32.whl", hash = "sha256:717720a220eee611ea96c0089246ec2103b168303ca2cd2c8a7cd3856da6f689"}, - {file = "dependency_injector-4.39.0-cp38-cp38-win_amd64.whl", hash = "sha256:05c0bbef90182a0d35d4d3f9ab879109070d204394578b12f0eff9eca51987ef"}, - {file = "dependency_injector-4.39.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f10bf8d146edffbee2ba5c5776395625c98048a31997afd481ce27792afee2af"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30c093b155c01e50723e8ecd2a14230daa4417356c8fb5a27369ae5be24b21d9"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dda8a85c8221e6ee433caa01c1bc4fed610381924780e04470572682569cdb8f"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ff8df47a901218a3257650f3f3a6b402dd58cb4f57b4a34d6e8092112f6e8480"}, - {file = "dependency_injector-4.39.0-cp39-cp39-win32.whl", hash = "sha256:e078c84c19ae73883a57e9b35edd843925b2b44833cd098708139a98abee5a96"}, - {file = "dependency_injector-4.39.0-cp39-cp39-win_amd64.whl", hash = "sha256:c02b6796320d6b9363d566045eeec243fa4a412ad68dcc6b2391307e93d0d401"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:865bf5ceba3e32f00e36bfcbefb1267b10df961fb2aab809f5e205968e1cd59b"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ce8645ffd8cc15a7bbd20c02e6439a61c1566a1db22766893bf79981fb89a4e"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dbdab8b024055865926a78ecbc3a6280345f4615e5c505511bbd7c6c322b1796"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:af996d66350704261382dc4e10f324eba5d23e35c04a9e75c7cb58fbea7f1f1d"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d390c6e97fec13fba832b7e39e07c43760ed3d46af4887005f679c0ab6eb9b2e"}, -] -distlib = [ - {file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"}, - {file = "distlib-0.3.4.zip", hash = "sha256:e4b58818180336dc9c529bfb9a0b58728ffc09ad92027a3f30b7cd91e3458579"}, -] -docutils = [ - {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, - {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, + {file = "dependency-injector-4.39.1.tar.gz", hash = "sha256:9ab76dc5e19b2692aaca49e00f9b41a087138d139b0ec985f92ff0498f038772"}, + {file = "dependency_injector-4.39.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c788a3d5482e63b5fd55e14fc258f1ff0b51b411927ab132ef0f689cb5d1183f"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0832e0457a360725cd1d1037b77b85478aeeaacc60e85ecceeb8020409e7b62"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d51998fff9704fd01d11c3c48f4e88d8506cb6afa1ee41409a881a5a51dae3fc"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea484cd13fc62966bf5582df0816205feee072d18f228aac75f7807b43f223ae"}, + {file = "dependency_injector-4.39.1-cp310-cp310-win32.whl", hash = "sha256:17389e53ec29ca13570319cf2065dcc4c2f6d36db5dd792bb1e8f2c39a9f146b"}, + {file = "dependency_injector-4.39.1-cp310-cp310-win_amd64.whl", hash = "sha256:55b0988489267c5a580f419133770ffe293057f2064da1c9ad6a2cc69666739b"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b297c3e79d3633cc56366386ae1f7dbce1587673cca2f559c368c1e936a1fa94"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2728827c5abb2420c5811e218262ae1b77a48e76cc9eebc6b4f55fee48a1a18d"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:029e42b064ab8cb5b2559be040ff682c7aa81592f1654a82355475956df17803"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:305e3db3f4bf40f64caaa1303e03005174e78d2339d2ae517b34c011ec2300f9"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-win32.whl", hash = "sha256:a661dd23a5e4e2f6bf4a729de7fadbe148c9a4a298dbcadfc5a94584b6930970"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-win_amd64.whl", hash = "sha256:340d6e7af5c4729d20c837d6d1e8a2626c24a05259dff746406cc823e26ba1e7"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a1553dac1c95f0de1f910b0025ee4570ea078a07d576bcdc2168990e719cea50"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c7baaa64d93359ee08c15d68579cc803e11d9becaf961f5a66b94ff627248e1"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7a27bf1951a066cf347b886cc7ab0f37dcbd1ad59bffcfe721c8c12a189a150d"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da6e2d685f7d0c65257f08133b68d9bf74ec319b90a0f21b4f629d168ce5f68f"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-win32.whl", hash = "sha256:a8ddd03ca86e67e9d3cc038793d34fbfccab12e6145df813e72bf14f9371f2ea"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-win_amd64.whl", hash = "sha256:e01a319ea05cd86b520201386dcb53a81a5400cb82fcc2f006bd7e92c0c51a0a"}, + {file = "dependency_injector-4.39.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4704804bde25b694aa65201927937a9d82d8bc055cb3dadc68eb05988bd34fa9"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0935d50b263169e7b0826a2fb6be80d6a4f2a7c59e6dd9876f86da3243bea9eb"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3c34aa5abb1826b6189f47daf6e469d4293c1d01693233da2c1b923816270cc5"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:db64904c9b9a88756cfece3e3ed078a2b57127642711dd08af342dba8abf9667"}, + {file = "dependency_injector-4.39.1-cp38-cp38-win32.whl", hash = "sha256:66ebe728194adc8720dbc4d662edbbfa55659ff23c9c493fb2dae0bfd4df5734"}, + {file = "dependency_injector-4.39.1-cp38-cp38-win_amd64.whl", hash = "sha256:4349974620f630d6726808e1291ec99713b64d449b84eb01581ee807a5a5c224"}, + {file = "dependency_injector-4.39.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d87cad0899b05cd08931bfb68ddf7be77711a67b0649c37f2045d7808977b082"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8efd965e5cfdd9f339ec895e73c119569851adedc175088d34a670f5206fea63"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:27f69485ca6b85c31d162ee86cf6ef71bb71dce9cd2b5d0745425dfc551eefa1"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a25b63de59dff04ec78f5161f00c0222a04a23def5d1f0eda14e389a32baf428"}, + {file = "dependency_injector-4.39.1-cp39-cp39-win32.whl", hash = "sha256:a14274f50d125b4579314c355e22af07def1a96641ca94bd75edcf1400b89477"}, + {file = "dependency_injector-4.39.1-cp39-cp39-win_amd64.whl", hash = "sha256:9950039d00625f9252cd26378a4406342b256886bb61e4db8b65e9f01270f53e"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6d7f39cd54678741e132e13da3a1367ac18058cbda61fe39d61c8583aa6fd757"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2368c7ba3c9ffaf816ea0f2d14c78d481491b805f62ac8496a78a51397d4689"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:84e32407bb16c58aa0d4b5ed8485537bc66ccc14cfffae7022f1204e35ec939a"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f2d80a42c546e1f934d427b071630d86653cd4a60c74b570c4ffb03025c1f1f9"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ca126bbed370b8c002c859ebeb76f6d83eba2d7fb5d66f37f47cfc19661d2889"}, ] fastavro = [ - {file = "fastavro-1.4.10-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:f225c81e869b3cefef6f2b478cd452693181ed7e645be3cea4d82024354ecaa0"}, - {file = "fastavro-1.4.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7669302c9124b7cd6c1bdff80c77116b2290c984814077fb7d01d7389586054"}, - {file = "fastavro-1.4.10-cp310-cp310-win_amd64.whl", hash = "sha256:995525bdfbdfef205ea148b5bc6a9fe5ccf921931123c39d9aad75a2b661681e"}, - {file = "fastavro-1.4.10-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:64244c53f1e4853184c2f7383d0332e1dcb34c38c05e6613530ade0378e8acfc"}, - {file = "fastavro-1.4.10-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c60965da6dc7a91e00ccd84d84797fad746555f44e8a816c4cc460fb231c44fe"}, - {file = "fastavro-1.4.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10eb25378f37dc00c10e83c4c0442c1a6d1b871f74a6dfdfc12b6447962bbdd0"}, - {file = "fastavro-1.4.10-cp37-cp37m-win_amd64.whl", hash = "sha256:d5719adf6045fc743de5fa738d561a81e58dc782c94f1b16cb21b5dd6253e7fd"}, - {file = "fastavro-1.4.10-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:24c4a1a8cc92e135ecfcd9cbd1f6cfa088cbc74d78c18e02a609cb11fa33778d"}, - {file = "fastavro-1.4.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0934490b0c3bcfd6bcbacbcb5144c6b5e4298cda209fbb17c856adf5405127dd"}, - {file = "fastavro-1.4.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a23763d73412c077aee401a0368c64cbc23859e26711dbae78a3cf0227f65165"}, - {file = "fastavro-1.4.10-cp38-cp38-win_amd64.whl", hash = "sha256:09f1dfdd8192ae09e0f477d1f024d8054fccdb099ad495d2a796bcee3cadebd1"}, - {file = "fastavro-1.4.10-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:0c6695753fa3035bbd0fa5cb21bf1b5dad39483c669b32ca0bb55fb07c1ccc87"}, - {file = "fastavro-1.4.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35f960dbba04647d8d6d5616f879622d2a1e8a84eb2d2e02a883a22e0803463a"}, - {file = "fastavro-1.4.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9660878ca01e3dbbee12385c5902a2b6b12ecbb5af4733d1026175a14b1ef67f"}, - {file = "fastavro-1.4.10-cp39-cp39-win_amd64.whl", hash = "sha256:64cbd386e408b3bcb2de53b1f847163073eb0d0d0338db65f76051c6ba9a9bc1"}, - {file = "fastavro-1.4.10.tar.gz", hash = "sha256:a24f9dd803c44bfb599476b000f9bd0088f7ac2401e6c20818f38d8af12785a0"}, -] -filelock = [ - {file = "filelock-3.6.0-py3-none-any.whl", hash = "sha256:f8314284bfffbdcfa0ff3d7992b023d4c628ced6feb957351d4c48d059f56bc0"}, - {file = "filelock-3.6.0.tar.gz", hash = "sha256:9cd540a9352e432c7246a48fe4e8712b10acb1df2ad1f30e8c070b82ae1fed85"}, + {file = "fastavro-1.4.11-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:44f01008f95d685edacc4b10366c755d25612df00924349f7d34a29f08522ce3"}, + {file = "fastavro-1.4.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18f5e736d12e67348f253da8a332d7c3b483ca04f2b6e772befa79d1a46bac9d"}, + {file = "fastavro-1.4.11-cp310-cp310-win_amd64.whl", hash = "sha256:8dca11bc3191cd7de0a3c4b76a70dac493356a219e96ebcde0def1f06faddef7"}, + {file = "fastavro-1.4.11-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:7a2a0bf03686f9d860e8f8476be000f5b3e6cc9af6853dbabab2ef9cfa5dc3a0"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c17e3decfac260e1be4d02d1903d2483eec2f3ce7f92c9b808a0f6a81572c4b"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19ba25c6529f50722a7618cc4ca24c7d265def57fd9f94e4e554e1df8cce38d2"}, + {file = "fastavro-1.4.11-cp37-cp37m-win_amd64.whl", hash = "sha256:ceaba04da9419f40899a670eb62eb373a127b511bb8e3ae4f6f1f23ec49bd0e4"}, + {file = "fastavro-1.4.11-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:732eab3a1ae5d2c3f4b52e747c55bcc41c4df0eb7e8a395038080741a3c0a934"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c03d3c802b71f44e7b3442abae961bba996258244bd222b242ad1e5cb7754e57"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cb7475a9b25b9f8aebe7eb756dafedd0369434571062f3883d894281befd7c"}, + {file = "fastavro-1.4.11-cp38-cp38-win_amd64.whl", hash = "sha256:ce0776f54591aef90bcd02bd919964abe4c2ad2a10a4336c3a1b66cef289b41c"}, + {file = "fastavro-1.4.11-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:621e72cc365c9539d7590e7b43e48a62e6bfb4c2de7c16837fed54d113d7312c"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:842b25782f911ee8c626f9d9fedc2ef01aeac272536fe90ee6d45b2ae7cdb024"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8491bfcba25c9d661289f884688e5a4f56f2ee389a240d0ad02692495a9a087"}, + {file = "fastavro-1.4.11-cp39-cp39-win_amd64.whl", hash = "sha256:c94130a8c8d80073eb0276844915aa5e928ae322024e76dc57943542ccda211c"}, + {file = "fastavro-1.4.11.tar.gz", hash = "sha256:7c64332ad52de0134be9a933ca986514c3ff85c63d54bc5398c31f0498ac1820"}, ] flake8 = [ {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, @@ -1271,22 +802,10 @@ frozenlist = [ {file = "frozenlist-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:772965f773757a6026dea111a15e6e2678fbd6216180f82a48a40b27de1ee2ab"}, {file = "frozenlist-1.3.0.tar.gz", hash = "sha256:ce6f2ba0edb7b0c1d8976565298ad2deba6f8064d2bebb6ffce2ca896eb35b0b"}, ] -identify = [ - {file = "identify-2.4.12-py2.py3-none-any.whl", hash = "sha256:5f06b14366bd1facb88b00540a1de05b69b310cbc2654db3c7e07fa3a4339323"}, - {file = "identify-2.4.12.tar.gz", hash = "sha256:3f3244a559290e7d3deb9e9adc7b33594c1bc85a9dd82e0f1be519bf12a1ec17"}, -] idna = [ {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, ] -imagesize = [ - {file = "imagesize-1.3.0-py2.py3-none-any.whl", hash = "sha256:1db2f82529e53c3e929e8926a1fa9235aa82d0bd0c580359c67ec31b2fddaa8c"}, - {file = "imagesize-1.3.0.tar.gz", hash = "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d"}, -] -importlib-metadata = [ - {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, - {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, -] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, @@ -1295,95 +814,12 @@ isort = [ {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, ] -jinja2 = [ - {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"}, - {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"}, -] -lmdb = [ - {file = "lmdb-1.3.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:63cb73fe7ce9eb93d992d632c85a0476b4332670d9e6a2802b5062f603b7809f"}, - {file = "lmdb-1.3.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:abbc439cd9fe60ffd6197009087ea885ac150017dc85384093b1d376f83f0ec4"}, - {file = "lmdb-1.3.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6260a526e4ad85b1f374a5ba9475bf369fb07e7728ea6ec57226b02c40d1976b"}, - {file = "lmdb-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e568ae0887ae196340947d9800136e90feaed6b86a261ef01f01b2ba65fc8106"}, - {file = "lmdb-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6a816954d212f40fd15007cd81ab7a6bebb77436d949a6a9ae04af57fc127f3"}, - {file = "lmdb-1.3.0-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:fa6439356e591d3249ab0e1778a6f8d8408e993f66dc911914c78208f5310309"}, - {file = "lmdb-1.3.0-cp35-cp35m-win_amd64.whl", hash = "sha256:c6adbd6f7f9048e97f31a069e652eb51020a81e80a0ce92dbb9810d21da2409a"}, - {file = "lmdb-1.3.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:eefb392f6b5cd43aada49258c5a79be11cb2c8cd3fc3e2d9319a1e0b9f906458"}, - {file = "lmdb-1.3.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a14aca2651c3af6f0d0a6b9168200eea0c8f2d27c40b01a442f33329a6e8dff"}, - {file = "lmdb-1.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cfa4aa9c67f8aee89b23005e98d1f3f32490b6b905fd1cb604b207cbd5755ab"}, - {file = "lmdb-1.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7da05d70fcc6561ac6b09e9fb1bf64b7ca294652c64c8a2889273970cee796b9"}, - {file = "lmdb-1.3.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:008243762decf8f6c90430a9bced56290ebbcdb5e877d90e42343bb97033e494"}, - {file = "lmdb-1.3.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:17215a42a4b9814c383deabecb160581e4fb75d00198eef0e3cea54f230ffbea"}, - {file = "lmdb-1.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65334eafa5d430b18d81ebd5362559a41483c362e1931f6e1b15bab2ecb7d75d"}, - {file = "lmdb-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:18c69fabdaf04efaf246587739cc1062b3e57c6ef0743f5c418df89e5e7e7b9b"}, - {file = "lmdb-1.3.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:41318717ab5d15ad2d6d263d34fbf614a045210f64b25e59ce734bb2105e421f"}, - {file = "lmdb-1.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:df2724bad7820114a205472994091097d0fa65a3e5fff5a8e688d123fb8c6326"}, - {file = "lmdb-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ddd590e1c7fcb395931aa3782fb89b9db4550ab2d81d006ecd239e0d462bc41"}, - {file = "lmdb-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:4172fba19417d7b29409beca7d73c067b54e5d8ab1fb9b51d7b4c1445d20a167"}, - {file = "lmdb-1.3.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2df38115dd9428a54d59ae7c712a4c7cce0d6b1d66056de4b1a8c38718066106"}, - {file = "lmdb-1.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d9103aa4908f0bca43c5911ca067d4e3d01f682dff0c0381a1239bd2bd757984"}, - {file = "lmdb-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:394df860c3f93cfd92b6f4caba785f38208cc9614c18b3803f83a2cc1695042f"}, - {file = "lmdb-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:62ab28e3593bdc318ea2f2fa1574e5fca3b6d1f264686d773ba54a637d4f563b"}, - {file = "lmdb-1.3.0-pp27-pypy_73-macosx_10_7_x86_64.whl", hash = "sha256:e6a704b3baced9182836c7f77b769f23856f3a8f62d0282b1bc1feaf81a86712"}, - {file = "lmdb-1.3.0-pp27-pypy_73-win_amd64.whl", hash = "sha256:08f4b5129f4683802569b02581142e415c8dcc0ff07605983ec1b07804cecbad"}, - {file = "lmdb-1.3.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:f291e3f561f58dddf63a92a5a6a4b8af3a0920b6705d35e2f80e52e86ee238a2"}, - {file = "lmdb-1.3.0.tar.gz", hash = "sha256:60a11efc21aaf009d06518996360eed346f6000bfc9de05114374230879f992e"}, -] -m2r2 = [ - {file = "m2r2-0.3.2-py3-none-any.whl", hash = "sha256:d3684086b61b4bebe2307f15189495360f05a123c9bda2a66462649b7ca236aa"}, - {file = "m2r2-0.3.2.tar.gz", hash = "sha256:ccd95b052dcd1ac7442ecb3111262b2001c10e4119b459c34c93ac7a5c2c7868"}, -] -markupsafe = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, -] mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] minos-microservice-common = [] minos-microservice-networks = [] -mistune = [ - {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, - {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, -] multidict = [ {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b9e95a740109c6047602f4db4da9949e6c5945cefbad34a1299775ddc9a62e2"}, {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac0e27844758d7177989ce406acc6a83c16ed4524ebc363c1f748cba184d89d3"}, @@ -1449,43 +885,39 @@ mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] -nodeenv = [ - {file = "nodeenv-1.6.0-py2.py3-none-any.whl", hash = "sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"}, - {file = "nodeenv-1.6.0.tar.gz", hash = "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b"}, -] orjson = [ - {file = "orjson-3.6.7-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:93188a9d6eb566419ad48befa202dfe7cd7a161756444b99c4ec77faea9352a4"}, - {file = "orjson-3.6.7-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:82515226ecb77689a029061552b5df1802b75d861780c401e96ca6bc8495f775"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3af57ffab7848aaec6ba6b9e9b41331250b57bf696f9d502bacdc71a0ebab0ba"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:a7297504d1142e7efa236ffc53f056d73934a993a08646dbcee89fc4308a8fcf"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:5a50cde0dbbde255ce751fd1bca39d00ecd878ba0903c0480961b31984f2fab7"}, - {file = "orjson-3.6.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d21f9a2d1c30e58070f93988db4cad154b9009fafbde238b52c1c760e3607fbe"}, - {file = "orjson-3.6.7-cp310-none-win_amd64.whl", hash = "sha256:e152464c4606b49398afd911777decebcf9749cc8810c5b4199039e1afb0991e"}, - {file = "orjson-3.6.7-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:0a65f3c403f38b0117c6dd8e76e85a7bd51fcd92f06c5598dfeddbc44697d3e5"}, - {file = "orjson-3.6.7-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:6c47cfca18e41f7f37b08ff3e7abf5ada2d0f27b5ade934f05be5fc5bb956e9d"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:63185af814c243fad7a72441e5f98120c9ecddf2675befa486d669fb65539e9b"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2da6fde42182b80b40df2e6ab855c55090ebfa3fcc21c182b7ad1762b61d55c"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:48c5831ec388b4e2682d4ff56d6bfa4a2ef76c963f5e75f4ff4785f9cf338a80"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:913fac5d594ccabf5e8fbac15b9b3bb9c576d537d49eeec9f664e7a64dde4c4b"}, - {file = "orjson-3.6.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:58f244775f20476e5851e7546df109f75160a5178d44257d437ba6d7e562bfe8"}, - {file = "orjson-3.6.7-cp37-none-win_amd64.whl", hash = "sha256:2d5f45c6b85e5f14646df2d32ecd7ff20fcccc71c0ea1155f4d3df8c5299bbb7"}, - {file = "orjson-3.6.7-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:612d242493afeeb2068bc72ff2544aa3b1e627578fcf92edee9daebb5893ffea"}, - {file = "orjson-3.6.7-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:539cdc5067db38db27985e257772d073cd2eb9462d0a41bde96da4e4e60bd99b"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6d103b721bbc4f5703f62b3882e638c0b65fcdd48622531c7ffd45047ef8e87c"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb10a20f80e95102dd35dfbc3a22531661b44a09b55236b012a446955846b023"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:bb68d0da349cf8a68971a48ad179434f75256159fe8b0715275d9b49fa23b7a3"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:4a2c7d0a236aaeab7f69c17b7ab4c078874e817da1bfbb9827cb8c73058b3050"}, - {file = "orjson-3.6.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3be045ca3b96119f592904cf34b962969ce97bd7843cbfca084009f6c8d2f268"}, - {file = "orjson-3.6.7-cp38-none-win_amd64.whl", hash = "sha256:bd765c06c359d8a814b90f948538f957fa8a1f55ad1aaffcdc5771996aaea061"}, - {file = "orjson-3.6.7-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:7dd9e1e46c0776eee9e0649e3ae9584ea368d96851bcaeba18e217fa5d755283"}, - {file = "orjson-3.6.7-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:c4b4f20a1e3df7e7c83717aff0ef4ab69e42ce2fb1f5234682f618153c458406"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7107a5673fd0b05adbb58bf71c1578fc84d662d29c096eb6d998982c8635c221"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a08b6940dd9a98ccf09785890112a0f81eadb4f35b51b9a80736d1725437e22c"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:f5d1648e5a9d1070f3628a69a7c6c17634dbb0caf22f2085eca6910f7427bf1f"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:e6201494e8dff2ce7fd21da4e3f6dfca1a3fed38f9dcefc972f552f6596a7621"}, - {file = "orjson-3.6.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:70d0386abe02879ebaead2f9632dd2acb71000b4721fd8c1a2fb8c031a38d4d5"}, - {file = "orjson-3.6.7-cp39-none-win_amd64.whl", hash = "sha256:d9a3288861bfd26f3511fb4081561ca768674612bac59513cb9081bb61fcc87f"}, - {file = "orjson-3.6.7.tar.gz", hash = "sha256:a4bb62b11289b7620eead2f25695212e9ac77fcfba76f050fa8a540fb5c32401"}, + {file = "orjson-3.6.8-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:3a287a650458de2211db03681b71c3e5cb2212b62f17a39df8ad99fc54855d0f"}, + {file = "orjson-3.6.8-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:5204e25c12cea58e524fc82f7c27ed0586f592f777b33075a92ab7b3eb3687c2"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77e8386393add64f959c044e0fb682364fd0e611a6f477aa13f0e6a733bd6a28"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:279f2d2af393fdf8601020744cb206b91b54ad60fb8401e0761819c7bda1f4e4"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:c31c9f389be7906f978ed4192eb58a4b74a37ad60556a0b88ddc47c576697770"}, + {file = "orjson-3.6.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0db5c5a0c5b89f092d52f6e5a3701660a9d6ffa9e2968b3ce17c2bc4f5eb0414"}, + {file = "orjson-3.6.8-cp310-none-win_amd64.whl", hash = "sha256:eb22485847b9a0c4bbedc668df860126ac931edbed1d456cf41a59f3cb961ed8"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:1a5fe569310bc819279bd4d5f2c349910b104ed3207936246dd5d5e0b085e74a"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:ccb356a47ab1067cd3549847e9db1d279a63fe0482d315b3ffd6e7abef35ef77"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab29c069c222248ce302a25855b4e1664f9436e8ae5a131fb0859daf31676d2b"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2b5e4cba9e774ac011071d9d27760f97f4b8cd46003e971d122e712f971345"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:c311ec504414d22834d5b972a209619925b48263856a11a14d90230f9682d49c"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:a3dfec7950b90fb8d143743503ee53fa06b32e6068bdea792fc866284da3d71d"}, + {file = "orjson-3.6.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b890dbbada2cbb26eb29bd43a848426f007f094bb0758df10dfe7a438e1cb4b4"}, + {file = "orjson-3.6.8-cp37-none-win_amd64.whl", hash = "sha256:9143ae2c52771525be9ad11a7a8cc8e7fd75391b107e7e644a9e0050496f6b4f"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:33a82199fd42f6436f833e210ae5129c922a5c355629356ca7a8e82964da7285"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:90159ea8b9a5a2a98fa33dc7b421cfac4d2ae91ba5e1058f5909e7f059f6b467"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:656fbe15d9ef0733e740d9def78f4fdb4153102f4836ee774a05123499005931"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7be3be6153843e0f01351b1313a5ad4723595427680dac2dfff22a37e652ce02"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:dd24f66b6697ee7424f7da575ec6cbffc8ede441114d53470949cda4d97c6e56"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:b07c780f7345ecf5901356dc21dee0669defc489c38ce7b9ab0f5e008cc0385c"}, + {file = "orjson-3.6.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ea32015a5d8a4ce00d348a0de5dc7040e0ad58f970a8fcbb5713a1eac129e493"}, + {file = "orjson-3.6.8-cp38-none-win_amd64.whl", hash = "sha256:c5a3e382194c838988ec128a26b08aa92044e5e055491cc4056142af0c1c54d7"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:83a8424e857ae1bf53530e88b4eb2f16ca2b489073b924e655f1575cacd7f52a"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:81e1a6a2d67f15007dadacbf9ba5d3d79237e5e33786c028557fe5a2b72f1c9a"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:137b539881c77866eba86ff6a11df910daf2eb9ab8f1acae62f879e83d7c38af"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cbd358f3b3ad539a27e36900e8e7d172d0e1b72ad9dd7d69544dcbc0f067ee7"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:6ab94701542d40b90903ecfc339333f458884979a01cb9268bc662cc67a5f6d8"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:32b6f26593a9eb606b40775826beb0dac152e3d224ea393688fced036045a821"}, + {file = "orjson-3.6.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:afd9e329ebd3418cac3cd747769b1d52daa25fa672bbf414ab59f0e0881b32b9"}, + {file = "orjson-3.6.8-cp39-none-win_amd64.whl", hash = "sha256:0c89b419914d3d1f65a1b0883f377abe42a6e44f6624ba1c63e8846cbfc2fa60"}, + {file = "orjson-3.6.8.tar.gz", hash = "sha256:e19d23741c5de13689bb316abfccea15a19c264e3ec8eb332a5319a583595ace"}, ] packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, @@ -1495,80 +927,14 @@ pathspec = [ {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, ] -pbr = [ - {file = "pbr-5.8.1-py2.py3-none-any.whl", hash = "sha256:27108648368782d07bbf1cb468ad2e2eeef29086affd14087a6d04b7de8af4ec"}, - {file = "pbr-5.8.1.tar.gz", hash = "sha256:66bc5a34912f408bb3925bf21231cb6f59206267b7f63f3503ef865c1a292e25"}, -] platformdirs = [ - {file = "platformdirs-2.5.1-py3-none-any.whl", hash = "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"}, - {file = "platformdirs-2.5.1.tar.gz", hash = "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d"}, + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, ] pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] -pre-commit = [ - {file = "pre_commit-2.17.0-py2.py3-none-any.whl", hash = "sha256:725fa7459782d7bec5ead072810e47351de01709be838c2ce1726b9591dad616"}, - {file = "pre_commit-2.17.0.tar.gz", hash = "sha256:c1a8040ff15ad3d648c70cc3e55b93e4d2d5b687320955505587fd79bbaed06a"}, -] -psycopg2-binary = [ - {file = "psycopg2-binary-2.9.3.tar.gz", hash = "sha256:761df5313dc15da1502b21453642d7599d26be88bff659382f8f9747c7ebea4e"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:539b28661b71da7c0e428692438efbcd048ca21ea81af618d845e06ebfd29478"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e82d38390a03da28c7985b394ec3f56873174e2c88130e6966cb1c946508e65"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57804fc02ca3ce0dbfbef35c4b3a4a774da66d66ea20f4bda601294ad2ea6092"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:083a55275f09a62b8ca4902dd11f4b33075b743cf0d360419e2051a8a5d5ff76"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_24_ppc64le.whl", hash = "sha256:0a29729145aaaf1ad8bafe663131890e2111f13416b60e460dae0a96af5905c9"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a79d622f5206d695d7824cbf609a4f5b88ea6d6dab5f7c147fc6d333a8787e4"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:090f3348c0ab2cceb6dfbe6bf721ef61262ddf518cd6cc6ecc7d334996d64efa"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a9e1f75f96ea388fbcef36c70640c4efbe4650658f3d6a2967b4cc70e907352e"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c3ae8e75eb7160851e59adc77b3a19a976e50622e44fd4fd47b8b18208189d42"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-win32.whl", hash = "sha256:7b1e9b80afca7b7a386ef087db614faebbf8839b7f4db5eb107d0f1a53225029"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:8b344adbb9a862de0c635f4f0425b7958bf5a4b927c8594e6e8d261775796d53"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:e847774f8ffd5b398a75bc1c18fbb56564cda3d629fe68fd81971fece2d3c67e"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68641a34023d306be959101b345732360fc2ea4938982309b786f7be1b43a4a1"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3303f8807f342641851578ee7ed1f3efc9802d00a6f83c101d21c608cb864460"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_24_aarch64.whl", hash = "sha256:e3699852e22aa68c10de06524a3721ade969abf382da95884e6a10ff798f9281"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_24_ppc64le.whl", hash = "sha256:526ea0378246d9b080148f2d6681229f4b5964543c170dd10bf4faaab6e0d27f"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:b1c8068513f5b158cf7e29c43a77eb34b407db29aca749d3eb9293ee0d3103ca"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:15803fa813ea05bef089fa78835118b5434204f3a17cb9f1e5dbfd0b9deea5af"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:152f09f57417b831418304c7f30d727dc83a12761627bb826951692cc6491e57"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:404224e5fef3b193f892abdbf8961ce20e0b6642886cfe1fe1923f41aaa75c9d"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-win32.whl", hash = "sha256:1f6b813106a3abdf7b03640d36e24669234120c72e91d5cbaeb87c5f7c36c65b"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:2d872e3c9d5d075a2e104540965a1cf898b52274a5923936e5bfddb58c59c7c2"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:10bb90fb4d523a2aa67773d4ff2b833ec00857f5912bafcfd5f5414e45280fb1"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a52ecab70af13e899f7847b3e074eeb16ebac5615665db33bce8a1009cf33"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a29b3ca4ec9defec6d42bf5feb36bb5817ba3c0230dd83b4edf4bf02684cd0ae"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:12b11322ea00ad8db8c46f18b7dfc47ae215e4df55b46c67a94b4effbaec7094"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_24_ppc64le.whl", hash = "sha256:53293533fcbb94c202b7c800a12c873cfe24599656b341f56e71dd2b557be063"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c381bda330ddf2fccbafab789d83ebc6c53db126e4383e73794c74eedce855ef"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9d29409b625a143649d03d0fd7b57e4b92e0ecad9726ba682244b73be91d2fdb"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:183a517a3a63503f70f808b58bfbf962f23d73b6dccddae5aa56152ef2bcb232"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:15c4e4cfa45f5a60599d9cec5f46cd7b1b29d86a6390ec23e8eebaae84e64554"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-win32.whl", hash = "sha256:adf20d9a67e0b6393eac162eb81fb10bc9130a80540f4df7e7355c2dd4af9fba"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2f9ffd643bc7349eeb664eba8864d9e01f057880f510e4681ba40a6532f93c71"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:def68d7c21984b0f8218e8a15d514f714d96904265164f75f8d3a70f9c295667"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dffc08ca91c9ac09008870c9eb77b00a46b3378719584059c034b8945e26b272"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:280b0bb5cbfe8039205c7981cceb006156a675362a00fe29b16fbc264e242834"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:af9813db73395fb1fc211bac696faea4ca9ef53f32dc0cfa27e4e7cf766dcf24"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_24_ppc64le.whl", hash = "sha256:63638d875be8c2784cfc952c9ac34e2b50e43f9f0a0660b65e2a87d656b3116c"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ffb7a888a047696e7f8240d649b43fb3644f14f0ee229077e7f6b9f9081635bd"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0c9d5450c566c80c396b7402895c4369a410cab5a82707b11aee1e624da7d004"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:d1c1b569ecafe3a69380a94e6ae09a4789bbb23666f3d3a08d06bbd2451f5ef1"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8fc53f9af09426a61db9ba357865c77f26076d48669f2e1bb24d85a22fb52307"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-win32.whl", hash = "sha256:6472a178e291b59e7f16ab49ec8b4f3bdada0a879c68d3817ff0963e722a82ce"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:35168209c9d51b145e459e05c31a9eaeffa9a6b0fd61689b48e07464ffd1a83e"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:47133f3f872faf28c1e87d4357220e809dfd3fa7c64295a4a148bcd1e6e34ec9"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91920527dea30175cc02a1099f331aa8c1ba39bf8b7762b7b56cbf54bc5cce42"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:887dd9aac71765ac0d0bac1d0d4b4f2c99d5f5c1382d8b770404f0f3d0ce8a39"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:1f14c8b0942714eb3c74e1e71700cbbcb415acbc311c730370e70c578a44a25c"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_24_ppc64le.whl", hash = "sha256:7af0dd86ddb2f8af5da57a976d27cd2cd15510518d582b478fbb2292428710b4"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:93cd1967a18aa0edd4b95b1dfd554cf15af657cb606280996d393dadc88c3c35"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bda845b664bb6c91446ca9609fc69f7db6c334ec5e4adc87571c34e4f47b7ddb"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:01310cf4cf26db9aea5158c217caa92d291f0500051a6469ac52166e1a16f5b7"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:99485cab9ba0fa9b84f1f9e1fef106f44a46ef6afdeec8885e0b88d0772b49e8"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-win32.whl", hash = "sha256:46f0e0a6b5fa5851bbd9ab1bc805eef362d3a230fbdfbc209f4a236d0a7a990d"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:accfe7e982411da3178ec690baaceaad3c278652998b2c45828aaac66cd8285f"}, -] py = [ {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, @@ -1581,22 +947,14 @@ pyflakes = [ {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, ] -pygments = [ - {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"}, - {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"}, -] pyparsing = [ - {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"}, - {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, ] pytest = [ {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, ] -pytz = [ - {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"}, - {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"}, -] pyyaml = [ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, @@ -1632,58 +990,10 @@ pyyaml = [ {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] -requests = [ - {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, - {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, -] six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] -snowballstemmer = [ - {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, - {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, -] -sphinx = [ - {file = "Sphinx-4.5.0-py3-none-any.whl", hash = "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226"}, - {file = "Sphinx-4.5.0.tar.gz", hash = "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6"}, -] -sphinx-autodoc-typehints = [ - {file = "sphinx_autodoc_typehints-1.17.0-py3-none-any.whl", hash = "sha256:081daf53077b4ae1c28347d6d858e13e63aefe3b4aacef79fd717dd60687b470"}, - {file = "sphinx_autodoc_typehints-1.17.0.tar.gz", hash = "sha256:51c7b3f5cb9ccd15d0b52088c62df3094f1abd9612930340365c26def8629a14"}, -] -sphinx-rtd-theme = [ - {file = "sphinx_rtd_theme-1.0.0-py2.py3-none-any.whl", hash = "sha256:4d35a56f4508cfee4c4fb604373ede6feae2a306731d533f409ef5c3496fdbd8"}, - {file = "sphinx_rtd_theme-1.0.0.tar.gz", hash = "sha256:eec6d497e4c2195fa0e8b2016b337532b8a699a68bcb22a512870e16925c6a5c"}, -] -sphinxcontrib-apidoc = [ - {file = "sphinxcontrib-apidoc-0.3.0.tar.gz", hash = "sha256:729bf592cf7b7dd57c4c05794f732dc026127275d785c2a5494521fdde773fb9"}, - {file = "sphinxcontrib_apidoc-0.3.0-py2.py3-none-any.whl", hash = "sha256:6671a46b2c6c5b0dca3d8a147849d159065e50443df79614f921b42fbd15cb09"}, -] -sphinxcontrib-applehelp = [ - {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, - {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, -] -sphinxcontrib-devhelp = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, -] -sphinxcontrib-htmlhelp = [ - {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, - {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, -] -sphinxcontrib-jsmath = [ - {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, - {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, -] -sphinxcontrib-qthelp = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, -] -sphinxcontrib-serializinghtml = [ - {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, - {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, -] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, @@ -1693,12 +1003,8 @@ tomli = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] typing-extensions = [ - {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, - {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, -] -urllib3 = [ - {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, - {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, + {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, + {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, ] uvloop = [ {file = "uvloop-0.16.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6224f1401025b748ffecb7a6e2652b17768f30b1a6a3f7b44660e5b5b690b12d"}, @@ -1718,10 +1024,6 @@ uvloop = [ {file = "uvloop-0.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e5f2e2ff51aefe6c19ee98af12b4ae61f5be456cd24396953244a30880ad861"}, {file = "uvloop-0.16.0.tar.gz", hash = "sha256:f74bc20c7b67d1c27c72601c78cf95be99d5c2cdd4514502b4f3eb0933ff1228"}, ] -virtualenv = [ - {file = "virtualenv-20.14.0-py2.py3-none-any.whl", hash = "sha256:1e8588f35e8b42c6ec6841a13c5e88239de1e6e4e4cedfd3916b306dc826ec66"}, - {file = "virtualenv-20.14.0.tar.gz", hash = "sha256:8e5b402037287126e81ccde9432b95a8be5b19d36584f64957060a3488c11ca8"}, -] yarl = [ {file = "yarl-1.7.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f2a8508f7350512434e41065684076f640ecce176d262a7d54f0da41d99c5a95"}, {file = "yarl-1.7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da6df107b9ccfe52d3a48165e48d72db0eca3e3029b5b8cb4fe6ee3cb870ba8b"}, @@ -1796,7 +1098,3 @@ yarl = [ {file = "yarl-1.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:797c2c412b04403d2da075fb93c123df35239cd7b4cc4e0cd9e5839b73f52c58"}, {file = "yarl-1.7.2.tar.gz", hash = "sha256:45399b46d60c253327a460e99856752009fcee5f5d3c80b2f7c0cae1c38d56dd"}, ] -zipp = [ - {file = "zipp-3.7.0-py3-none-any.whl", hash = "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375"}, - {file = "zipp-3.7.0.tar.gz", hash = "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d"}, -] diff --git a/packages/plugins/minos-http-aiohttp/pyproject.toml b/packages/plugins/minos-http-aiohttp/pyproject.toml index 330040d33..e9c1fd95f 100644 --- a/packages/plugins/minos-http-aiohttp/pyproject.toml +++ b/packages/plugins/minos-http-aiohttp/pyproject.toml @@ -1,7 +1,7 @@ [tool.poetry] name = "minos-http-aiohttp" -version = "0.6.0" -description = "The aiohttp plugin of the Minos Framework." +version = "0.7.0" +description = "The aiohttp plugin of the Minos Framework" readme = "README.md" repository = "https://github.com/minos-framework/minos-python" homepage = "https://www.minos.run/" @@ -21,18 +21,18 @@ keywords = [ "saga", ] packages = [ - { include = "minos" } + { include = "minos" }, ] include = [ - "AUTHORS.md", - "HISTORY.md", - "LICENSE", + { path = "AUTHORS.md", format = "sdist" }, + { path = "HISTORY.md", format = "sdist" }, + { path = "LICENSE", format = "sdist" }, ] [tool.poetry.dependencies] python = "^3.9" -minos-microservice-common = "^0.6.0" -minos-microservice-networks = "^0.6.0" +minos-microservice-common = "^0.7.0" +minos-microservice-networks = "^0.7.0" aiohttp = "^3.8.1" orjson = "^3.6.7" cached-property = "^1.5.2" @@ -45,12 +45,6 @@ isort = "^5.8.0" pytest = "^6.2.4" coverage = "^6.3" flake8 = "^4.0.1" -Sphinx = "^4.0.1" -pre-commit = "^2.12.1" -sphinx-autodoc-typehints = "^1.12.0" -sphinxcontrib-apidoc = "^0.3.0" -sphinx-rtd-theme = "^1.0.0" -m2r2 = "^0.3.2" [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/packages/plugins/minos-http-aiohttp/tests/test_aiohttp/test_requests.py b/packages/plugins/minos-http-aiohttp/tests/test_aiohttp/test_requests.py index dd0a73feb..0375e5b21 100644 --- a/packages/plugins/minos-http-aiohttp/tests/test_aiohttp/test_requests.py +++ b/packages/plugins/minos-http-aiohttp/tests/test_aiohttp/test_requests.py @@ -73,6 +73,13 @@ def test_headers(self): request = AioHttpRequest(raw) self.assertEqual({"something": "123"}, request.headers) + def test_headers_modifiable(self): + raw = mocked_request(headers={"something": "123"}) + request = AioHttpRequest(raw) + self.assertEqual({"something": "123"}, request.headers) + request.headers["something"] = "321" + self.assertEqual({"something": "321"}, request.headers) + def test_user(self): uuid = uuid4() raw = mocked_request(user=uuid) diff --git a/packages/plugins/minos-router-graphql/HISTORY.md b/packages/plugins/minos-router-graphql/HISTORY.md index caaf8c036..0cc129c48 100644 --- a/packages/plugins/minos-router-graphql/HISTORY.md +++ b/packages/plugins/minos-router-graphql/HISTORY.md @@ -6,3 +6,10 @@ * Add `GraphQlHandler` class to handle `graphql` requests. * Add `GraphQlHttpRouter` class to route `http` request to `graphql`. * Add `GraphQlEnroute`, `GraphQlEnrouteDecorator`, `GraphQlCommandEnrouteDecorator` and `GraphQlQueryEnrouteDecorator` decorators. + +## 0.7.0 (2022-05-11) + +* Minor improvements. +* Unify documentation building pipeline across all `minos-python` packages. +* Fix documentation building warnings. +* Fix bug related with package building and additional files like `AUTHORS.md`, `HISTORY.md`, etc. \ No newline at end of file diff --git a/packages/plugins/minos-router-graphql/Makefile b/packages/plugins/minos-router-graphql/Makefile index 854bc90bc..2016f9e38 100644 --- a/packages/plugins/minos-router-graphql/Makefile +++ b/packages/plugins/minos-router-graphql/Makefile @@ -15,10 +15,6 @@ reformat: poetry run black --line-length 120 minos tests poetry run isort minos tests -docs: - rm -rf docs/api - poetry run $(MAKE) --directory=docs html - release: $(MAKE) dist poetry publish @@ -38,5 +34,4 @@ check: $(MAKE) reformat $(MAKE) lint $(MAKE) test - $(MAKE) docs $(MAKE) dist diff --git a/packages/plugins/minos-router-graphql/RUNTHETESTS.md b/packages/plugins/minos-router-graphql/RUNTHETESTS.md index 8b5e95b1f..386e2b0e7 100644 --- a/packages/plugins/minos-router-graphql/RUNTHETESTS.md +++ b/packages/plugins/minos-router-graphql/RUNTHETESTS.md @@ -1,5 +1,4 @@ -Run the tests -============== +# Run the tests In order to run the tests, please make sure you have the `Docker Engine `_ and `Docker Compose `_ installed. diff --git a/packages/plugins/minos-router-graphql/SETUP.md b/packages/plugins/minos-router-graphql/SETUP.md deleted file mode 100644 index 8203965c7..000000000 --- a/packages/plugins/minos-router-graphql/SETUP.md +++ /dev/null @@ -1,11 +0,0 @@ -Set up a development environment -================================= - -Since we use `poetry` as the default package manager, it must be installed. Please refer to -`https://python-poetry.org/docs/#installation`. - -Run `poetry install` to get the dependencies. - -Run `pre-commit install` to set the git checks before commiting. - -Make yourself sure you are able to run the tests. Refer to the appropriate section in this guide. diff --git a/packages/plugins/minos-router-graphql/docs/Makefile b/packages/plugins/minos-router-graphql/docs/Makefile deleted file mode 100644 index 86af5d733..000000000 --- a/packages/plugins/minos-router-graphql/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = python -msphinx -SPHINXPROJ = minos_rest_aiohttp -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/packages/plugins/minos-router-graphql/docs/_static/style.css b/packages/plugins/minos-router-graphql/docs/_static/style.css deleted file mode 100644 index 8aa6c288f..000000000 --- a/packages/plugins/minos-router-graphql/docs/_static/style.css +++ /dev/null @@ -1,3 +0,0 @@ -.wy-nav-content { - max-width: 1200px !important; -} diff --git a/packages/plugins/minos-router-graphql/docs/_templates/layout.html b/packages/plugins/minos-router-graphql/docs/_templates/layout.html deleted file mode 100644 index b0a448060..000000000 --- a/packages/plugins/minos-router-graphql/docs/_templates/layout.html +++ /dev/null @@ -1,4 +0,0 @@ -{% extends "!layout.html" %} -{% block extrahead %} - -{% endblock %} \ No newline at end of file diff --git a/packages/plugins/minos-router-graphql/docs/authors.md b/packages/plugins/minos-router-graphql/docs/authors.md deleted file mode 100644 index cf16fc494..000000000 --- a/packages/plugins/minos-router-graphql/docs/authors.md +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../AUTHORS.md diff --git a/packages/plugins/minos-router-graphql/docs/conf.py b/packages/plugins/minos-router-graphql/docs/conf.py deleted file mode 100755 index 8ac6c97e2..000000000 --- a/packages/plugins/minos-router-graphql/docs/conf.py +++ /dev/null @@ -1,197 +0,0 @@ -#!/usr/bin/env python -# -# minos documentation build configuration file, created by -# sphinx-quickstart on Fri Jun 9 13:47:02 2017. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -# If extensions (or modules to document with autodoc) are in another -# directory, add these directories to sys.path here. If the directory is -# relative to the documentation root, use os.path.abspath to make it -# absolute, like shown here. -# -import os -import sys - -sys.path.insert(0, os.path.abspath("..")) - -import sphinx_rtd_theme - -from minos.plugins import ( - graphql, -) - -# -- General configuration --------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. - - -extensions = [ - "sphinxcontrib.apidoc", - "sphinx.ext.autodoc", - "sphinx_autodoc_typehints", - "sphinx.ext.viewcode", - "sphinx_rtd_theme", - "m2r2", -] -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -source_suffix = [".rst", ".md"] - -# The master toctree document. -master_doc = "index" - -# General information about the project. -project = "Minos Router GraphQl" -copyright = "2021, Clariteia" -author = "Clariteia Devs" - -# The version info for the project you're documenting, acts as replacement -# for |version| and |release|, also used in various other places throughout -# the built documents. -# -# The short X.Y version. -version = graphql.__version__ -# The full version, including alpha/beta/rc tags. -release = graphql.__version__ - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = "sphinx" - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = False - - -# -- Options for HTML output ------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# - -html_theme = "sphinx_rtd_theme" - -# Theme options are theme-specific and customize the look and feel of a -# theme further. For a list of options available for each theme, see the -# documentation. -# - -# html_theme_options = { -# "codecov_button": True, -# "description": "Reactive microservices for an asynchronous world", -# "github_button": True, -# "github_user": "Clariteia", -# "github_repo": "plugins", -# "github_type": "star", -# } - -html_sidebars = {"**": ["about.html", "navigation.html", "searchbox.html"]} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] - - -# -- Options for HTMLHelp output --------------------------------------- - -# Output file base name for HTML help builder. -htmlhelp_basename = "minosdoc" - - -# -- Options for LaTeX output ------------------------------------------ - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass -# [howto, manual, or own class]). -latex_documents = [ - (master_doc, "minos.tex", "Minos Router GraphQl Documentation", "Clariteia Devs", "manual"), -] - - -# -- Options for manual page output ------------------------------------ - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [(master_doc, "minos", "Minos Router GraphQl Documentation", [author], 1)] - - -# -- Options for Texinfo output ---------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ( - master_doc, - "minos", - "Minos Router GraphQl Documentation", - author, - "minos", - "One line description of project.", - "Miscellaneous", - ), -] - -# "apidoc" extension -apidoc_module_dir = "../minos" -apidoc_output_dir = "api" -apidoc_separate_modules = True -autodoc_default_options = { - "inherited-members": True, - "special-members": "__init__", - "undoc-members": True, -} - -apidoc_toc_file = False -apidoc_module_first = True -apidoc_extra_args = [ - "--force", - "--implicit-namespaces", -] -# "autodoc typehints" extension - -set_type_checking_flag = True -typehints_fully_qualified = True diff --git a/packages/plugins/minos-router-graphql/docs/history.md b/packages/plugins/minos-router-graphql/docs/history.md deleted file mode 100644 index d26e5be83..000000000 --- a/packages/plugins/minos-router-graphql/docs/history.md +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../HISTORY.md diff --git a/packages/plugins/minos-router-graphql/docs/index.md b/packages/plugins/minos-router-graphql/docs/index.md deleted file mode 100644 index afb71f631..000000000 --- a/packages/plugins/minos-router-graphql/docs/index.md +++ /dev/null @@ -1,17 +0,0 @@ -# GraphQL plugin form Minos framework! -This plugin integrates the official graphql-core library. - -.. toctree:: - :maxdepth: 2 - - readme - runthetests - usage - api/minos.plugins - authors - history - -# Indices and tables -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/packages/plugins/minos-router-graphql/docs/readme.md b/packages/plugins/minos-router-graphql/docs/readme.md deleted file mode 100644 index da72dbef1..000000000 --- a/packages/plugins/minos-router-graphql/docs/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -# Introduction - -.. mdinclude:: ../README.md diff --git a/packages/plugins/minos-router-graphql/docs/runthetests.md b/packages/plugins/minos-router-graphql/docs/runthetests.md deleted file mode 100644 index 309db1b96..000000000 --- a/packages/plugins/minos-router-graphql/docs/runthetests.md +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../RUNTHETESTS.md diff --git a/packages/plugins/minos-router-graphql/docs/usage.md b/packages/plugins/minos-router-graphql/docs/usage.md deleted file mode 100644 index 8f04b05ad..000000000 --- a/packages/plugins/minos-router-graphql/docs/usage.md +++ /dev/null @@ -1 +0,0 @@ -# Usage diff --git a/packages/plugins/minos-router-graphql/minos/plugins/graphql/__init__.py b/packages/plugins/minos-router-graphql/minos/plugins/graphql/__init__.py index b05cceb87..c1d9b3c4f 100644 --- a/packages/plugins/minos-router-graphql/minos/plugins/graphql/__init__.py +++ b/packages/plugins/minos-router-graphql/minos/plugins/graphql/__init__.py @@ -1,6 +1,8 @@ +"""The graphql plugin of the Minos Framework.""" + __author__ = "Minos Framework Devs" __email__ = "hey@minos.run" -__version__ = "0.6.0" +__version__ = "0.7.0" from .builders import ( GraphQLSchemaBuilder, diff --git a/packages/plugins/minos-router-graphql/minos/plugins/graphql/decorators.py b/packages/plugins/minos-router-graphql/minos/plugins/graphql/decorators.py index 88161605c..a522794fc 100644 --- a/packages/plugins/minos-router-graphql/minos/plugins/graphql/decorators.py +++ b/packages/plugins/minos-router-graphql/minos/plugins/graphql/decorators.py @@ -19,7 +19,8 @@ class GraphQlEnrouteDecorator(EnrouteDecorator, ABC): """GraphQl Enroute Decorator class""" - def __init__(self, name: str, output, argument: Optional = None): + def __init__(self, name: str, output, argument: Optional = None, **kwargs): + super().__init__(**kwargs) self.name = name self.argument = argument self.output = output diff --git a/packages/plugins/minos-router-graphql/minos/plugins/graphql/handlers.py b/packages/plugins/minos-router-graphql/minos/plugins/graphql/handlers.py index cee09f688..27dc9e76d 100644 --- a/packages/plugins/minos-router-graphql/minos/plugins/graphql/handlers.py +++ b/packages/plugins/minos-router-graphql/minos/plugins/graphql/handlers.py @@ -1,3 +1,5 @@ +"""This module contains the implementation of the graphql handler.""" + import logging import traceback from typing import ( diff --git a/packages/plugins/minos-router-graphql/poetry.lock b/packages/plugins/minos-router-graphql/poetry.lock index 462e1c998..ea9dcf36f 100644 --- a/packages/plugins/minos-router-graphql/poetry.lock +++ b/packages/plugins/minos-router-graphql/poetry.lock @@ -19,37 +19,6 @@ develop = ["aiocontextvars (==0.2.2)", "aiohttp-asgi", "aiohttp (<4)", "async-ti raven = ["raven-aiohttp"] uvloop = ["uvloop (>=0.14,<1)"] -[[package]] -name = "aiopg" -version = "1.3.3" -description = "Postgres integration with asyncio." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -async-timeout = ">=3.0,<5.0" -psycopg2-binary = ">=2.8.4" - -[package.extras] -sa = ["sqlalchemy[postgresql_psycopg2binary] (>=1.3,<1.5)"] - -[[package]] -name = "alabaster" -version = "0.7.12" -description = "A configurable sidebar-enabled Sphinx theme" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "async-timeout" -version = "4.0.2" -description = "Timeout context manager for asyncio programs" -category = "main" -optional = false -python-versions = ">=3.6" - [[package]] name = "atomicwrites" version = "1.4.0" @@ -72,20 +41,9 @@ docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] -[[package]] -name = "babel" -version = "2.9.1" -description = "Internationalization utilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -pytz = ">=2015.7" - [[package]] name = "black" -version = "22.1.0" +version = "22.3.0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -96,7 +54,7 @@ click = ">=8.0.0" mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = ">=1.1.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] @@ -113,40 +71,13 @@ category = "main" optional = false python-versions = "*" -[[package]] -name = "certifi" -version = "2021.10.8" -description = "Python package for providing Mozilla's CA Bundle." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "cfgv" -version = "3.3.1" -description = "Validate configuration and produce human readable error messages." -category = "dev" -optional = false -python-versions = ">=3.6.1" - -[[package]] -name = "charset-normalizer" -version = "2.0.12" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "dev" -optional = false -python-versions = ">=3.5.0" - -[package.extras] -unicode_backport = ["unicodedata2"] - [[package]] name = "click" -version = "8.0.4" +version = "8.1.3" description = "Composable command line interface toolkit" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -194,7 +125,7 @@ python-versions = "*" [[package]] name = "dependency-injector" -version = "4.39.0" +version = "4.39.1" description = "Dependency injection framework for Python" category = "main" optional = false @@ -209,25 +140,9 @@ flask = ["flask"] pydantic = ["pydantic"] yaml = ["pyyaml"] -[[package]] -name = "distlib" -version = "0.3.4" -description = "Distribution utilities" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "docutils" -version = "0.17.1" -description = "Docutils -- Python Documentation Utilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - [[package]] name = "fastavro" -version = "1.4.10" +version = "1.4.11" description = "Fast read/write of AVRO files" category = "main" optional = false @@ -239,18 +154,6 @@ lz4 = ["lz4"] snappy = ["python-snappy"] zstandard = ["zstandard"] -[[package]] -name = "filelock" -version = "3.6.0" -description = "A platform independent file lock." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"] -testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-cov", "pytest-timeout (>=1.4.2)"] - [[package]] name = "flake8" version = "4.0.1" @@ -266,55 +169,12 @@ pyflakes = ">=2.4.0,<2.5.0" [[package]] name = "graphql-core" -version = "3.2.0" +version = "3.2.1" description = "GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL." category = "main" optional = false python-versions = ">=3.6,<4" -[[package]] -name = "identify" -version = "2.4.12" -description = "File identification library for Python" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -license = ["ukkonen"] - -[[package]] -name = "idna" -version = "3.3" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "dev" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "imagesize" -version = "1.3.0" -description = "Getting image size from png/jpeg/jpeg2000/gif file" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "importlib-metadata" -version = "4.11.3" -description = "Read metadata from Python packages" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] -perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] - [[package]] name = "iniconfig" version = "1.1.1" @@ -337,48 +197,6 @@ requirements_deprecated_finder = ["pipreqs", "pip-api"] colors = ["colorama (>=0.4.3,<0.5.0)"] plugins = ["setuptools"] -[[package]] -name = "jinja2" -version = "3.1.1" -description = "A very fast and expressive template engine." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - -[[package]] -name = "lmdb" -version = "1.3.0" -description = "Universal Python binding for the LMDB 'Lightning' Database" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "m2r2" -version = "0.3.2" -description = "Markdown and reStructuredText in a single file." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -docutils = "*" -mistune = "0.8.4" - -[[package]] -name = "markupsafe" -version = "2.1.1" -description = "Safely add untrusted strings to HTML/XML markup." -category = "dev" -optional = false -python-versions = ">=3.7" - [[package]] name = "mccabe" version = "0.6.1" @@ -389,7 +207,7 @@ python-versions = "*" [[package]] name = "minos-microservice-common" -version = "0.6.0" +version = "0.7.0" description = "The common core of the Minos Framework" category = "main" optional = false @@ -397,12 +215,10 @@ python-versions = "^3.9" develop = true [package.dependencies] -aiomisc = ">=14.0.3,<16.0.0" -aiopg = "^1.2.1" +aiomisc = ">=14.0.3,<15.8.0" cached-property = "^1.5.2" dependency-injector = "^4.32.2" fastavro = "^1.4.0" -lmdb = "^1.2.1" orjson = "^3.5.2" PyYAML = ">=5.4.1,<7.0.0" uvloop = "^0.16.0" @@ -413,7 +229,7 @@ url = "../../core/minos-microservice-common" [[package]] name = "minos-microservice-networks" -version = "0.6.0" +version = "0.7.0" description = "The networks core of the Minos Framework" category = "main" optional = false @@ -421,23 +237,13 @@ python-versions = "^3.9" develop = true [package.dependencies] -aiopg = "^1.2.1" crontab = "^0.23.0" -minos-microservice-common = "^0.6.0" -psycopg2-binary = "^2.9.3" +minos-microservice-common = "^0.7.0*" [package.source] type = "directory" url = "../../core/minos-microservice-networks" -[[package]] -name = "mistune" -version = "0.8.4" -description = "The fastest markdown parser in pure Python" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "mypy-extensions" version = "0.4.3" @@ -446,17 +252,9 @@ category = "dev" optional = false python-versions = "*" -[[package]] -name = "nodeenv" -version = "1.6.0" -description = "Node.js virtual environment builder" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "orjson" -version = "3.6.7" +version = "3.6.8" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" category = "main" optional = false @@ -481,25 +279,17 @@ category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -[[package]] -name = "pbr" -version = "5.8.1" -description = "Python Build Reasonableness" -category = "dev" -optional = false -python-versions = ">=2.6" - [[package]] name = "platformdirs" -version = "2.5.1" +version = "2.5.2" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" [package.extras] -docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] +test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] [[package]] name = "pluggy" @@ -513,30 +303,6 @@ python-versions = ">=3.6" dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] -[[package]] -name = "pre-commit" -version = "2.17.0" -description = "A framework for managing and maintaining multi-language pre-commit hooks." -category = "dev" -optional = false -python-versions = ">=3.6.1" - -[package.dependencies] -cfgv = ">=2.0.0" -identify = ">=1.0.0" -nodeenv = ">=0.11.1" -pyyaml = ">=5.1" -toml = "*" -virtualenv = ">=20.0.8" - -[[package]] -name = "psycopg2-binary" -version = "2.9.3" -description = "psycopg2 - Python-PostgreSQL Database Adapter" -category = "main" -optional = false -python-versions = ">=3.6" - [[package]] name = "py" version = "1.11.0" @@ -561,24 +327,16 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -[[package]] -name = "pygments" -version = "2.11.2" -description = "Pygments is a syntax highlighting package written in Python." -category = "dev" -optional = false -python-versions = ">=3.5" - [[package]] name = "pyparsing" -version = "3.0.7" -description = "Python parsing module" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.6.8" [package.extras] -diagrams = ["jinja2", "railroad-diagrams"] +diagrams = ["railroad-diagrams", "jinja2"] [[package]] name = "pytest" @@ -601,14 +359,6 @@ toml = "*" [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] -[[package]] -name = "pytz" -version = "2022.1" -description = "World timezone definitions, modern and historical" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "pyyaml" version = "6.0" @@ -617,24 +367,6 @@ category = "main" optional = false python-versions = ">=3.6" -[[package]] -name = "requests" -version = "2.27.1" -description = "Python HTTP for Humans." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} -urllib3 = ">=1.21.1,<1.27" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] - [[package]] name = "six" version = "1.16.0" @@ -643,159 +375,6 @@ category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -[[package]] -name = "snowballstemmer" -version = "2.2.0" -description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "sphinx" -version = "4.5.0" -description = "Python documentation generator" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -alabaster = ">=0.7,<0.8" -babel = ">=1.3" -colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.14,<0.18" -imagesize = "*" -importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} -Jinja2 = ">=2.3" -packaging = "*" -Pygments = ">=2.0" -requests = ">=2.5.0" -snowballstemmer = ">=1.1" -sphinxcontrib-applehelp = "*" -sphinxcontrib-devhelp = "*" -sphinxcontrib-htmlhelp = ">=2.0.0" -sphinxcontrib-jsmath = "*" -sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = ">=1.1.5" - -[package.extras] -docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.931)", "docutils-stubs", "types-typed-ast", "types-requests"] -test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] - -[[package]] -name = "sphinx-autodoc-typehints" -version = "1.17.0" -description = "Type hints (PEP 484) support for the Sphinx autodoc extension" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -Sphinx = ">=4" - -[package.extras] -testing = ["covdefaults (>=2)", "coverage (>=6)", "diff-cover (>=6.4)", "nptyping (>=1)", "pytest (>=6)", "pytest-cov (>=3)", "sphobjinv (>=2)", "typing-extensions (>=3.5)"] -type_comments = ["typed-ast (>=1.4.0)"] - -[[package]] -name = "sphinx-rtd-theme" -version = "1.0.0" -description = "Read the Docs theme for Sphinx" -category = "dev" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" - -[package.dependencies] -docutils = "<0.18" -sphinx = ">=1.6" - -[package.extras] -dev = ["transifex-client", "sphinxcontrib-httpdomain", "bump2version"] - -[[package]] -name = "sphinxcontrib-apidoc" -version = "0.3.0" -description = "A Sphinx extension for running 'sphinx-apidoc' on each build" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -pbr = "*" -Sphinx = ">=1.6.0" - -[[package]] -name = "sphinxcontrib-applehelp" -version = "1.0.2" -description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-devhelp" -version = "1.0.2" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-htmlhelp" -version = "2.0.0" -description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest", "html5lib"] - -[[package]] -name = "sphinxcontrib-jsmath" -version = "1.0.1" -description = "A sphinx extension which renders display math in HTML via JavaScript" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -test = ["pytest", "flake8", "mypy"] - -[[package]] -name = "sphinxcontrib-qthelp" -version = "1.0.3" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-serializinghtml" -version = "1.1.5" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - [[package]] name = "toml" version = "0.10.2" @@ -814,24 +393,11 @@ python-versions = ">=3.7" [[package]] name = "typing-extensions" -version = "4.1.1" -description = "Backported and Experimental Type Hints for Python 3.6+" +version = "4.2.0" +description = "Backported and Experimental Type Hints for Python 3.7+" category = "dev" optional = false -python-versions = ">=3.6" - -[[package]] -name = "urllib3" -version = "1.26.9" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" - -[package.extras] -brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +python-versions = ">=3.7" [[package]] name = "uvloop" @@ -846,58 +412,16 @@ dev = ["Cython (>=0.29.24,<0.30.0)", "pytest (>=3.6.0)", "Sphinx (>=4.1.2,<4.2.0 docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)"] test = ["aiohttp", "flake8 (>=3.9.2,<3.10.0)", "psutil", "pycodestyle (>=2.7.0,<2.8.0)", "pyOpenSSL (>=19.0.0,<19.1.0)", "mypy (>=0.800)"] -[[package]] -name = "virtualenv" -version = "20.14.0" -description = "Virtual Python Environment builder" -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - -[package.dependencies] -distlib = ">=0.3.1,<1" -filelock = ">=3.2,<4" -platformdirs = ">=2,<3" -six = ">=1.9.0,<2" - -[package.extras] -docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=21.3)"] -testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)"] - -[[package]] -name = "zipp" -version = "3.7.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] - [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "60bf9166dad901a62c80dae5fe0aed4b0304f633b0261d223ad27c72ec702b88" +content-hash = "167e12c889eba2e0981bd549009fdbcbc5c46cefbc19b919181666e78be3bdb2" [metadata.files] aiomisc = [ {file = "aiomisc-15.7.3-py3-none-any.whl", hash = "sha256:0403e83268e98d0f2a125a70d13303fe1a2358e36db3daf02df032c7fa4f1525"}, {file = "aiomisc-15.7.3.tar.gz", hash = "sha256:ba250a34bd4609ced36111cb50580f57c3d52f3955f953a53ecb2986988baedc"}, ] -aiopg = [ - {file = "aiopg-1.3.3-py3-none-any.whl", hash = "sha256:2842dd8741460eeef940032dcb577bfba4d4115205dd82a73ce13b3271f5bf0a"}, - {file = "aiopg-1.3.3.tar.gz", hash = "sha256:547c6ba4ea0d73c2a11a2f44387d7133cc01d3c6f3b8ed976c0ac1eff4f595d7"}, -] -alabaster = [ - {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, - {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, -] -async-timeout = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, -] atomicwrites = [ {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, @@ -906,54 +430,38 @@ attrs = [ {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] -babel = [ - {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"}, - {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, -] black = [ - {file = "black-22.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1297c63b9e1b96a3d0da2d85d11cd9bf8664251fd69ddac068b98dc4f34f73b6"}, - {file = "black-22.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2ff96450d3ad9ea499fc4c60e425a1439c2120cbbc1ab959ff20f7c76ec7e866"}, - {file = "black-22.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e21e1f1efa65a50e3960edd068b6ae6d64ad6235bd8bfea116a03b21836af71"}, - {file = "black-22.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f69158a7d120fd641d1fa9a921d898e20d52e44a74a6fbbcc570a62a6bc8ab"}, - {file = "black-22.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:228b5ae2c8e3d6227e4bde5920d2fc66cc3400fde7bcc74f480cb07ef0b570d5"}, - {file = "black-22.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b1a5ed73ab4c482208d20434f700d514f66ffe2840f63a6252ecc43a9bc77e8a"}, - {file = "black-22.1.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35944b7100af4a985abfcaa860b06af15590deb1f392f06c8683b4381e8eeaf0"}, - {file = "black-22.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7835fee5238fc0a0baf6c9268fb816b5f5cd9b8793423a75e8cd663c48d073ba"}, - {file = "black-22.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dae63f2dbf82882fa3b2a3c49c32bffe144970a573cd68d247af6560fc493ae1"}, - {file = "black-22.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fa1db02410b1924b6749c245ab38d30621564e658297484952f3d8a39fce7e8"}, - {file = "black-22.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c8226f50b8c34a14608b848dc23a46e5d08397d009446353dad45e04af0c8e28"}, - {file = "black-22.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2d6f331c02f0f40aa51a22e479c8209d37fcd520c77721c034517d44eecf5912"}, - {file = "black-22.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:742ce9af3086e5bd07e58c8feb09dbb2b047b7f566eb5f5bc63fd455814979f3"}, - {file = "black-22.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fdb8754b453fb15fad3f72cd9cad3e16776f0964d67cf30ebcbf10327a3777a3"}, - {file = "black-22.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5660feab44c2e3cb24b2419b998846cbb01c23c7fe645fee45087efa3da2d61"}, - {file = "black-22.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:6f2f01381f91c1efb1451998bd65a129b3ed6f64f79663a55fe0e9b74a5f81fd"}, - {file = "black-22.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:efbadd9b52c060a8fc3b9658744091cb33c31f830b3f074422ed27bad2b18e8f"}, - {file = "black-22.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8871fcb4b447206904932b54b567923e5be802b9b19b744fdff092bd2f3118d0"}, - {file = "black-22.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccad888050f5393f0d6029deea2a33e5ae371fd182a697313bdbd835d3edaf9c"}, - {file = "black-22.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07e5c049442d7ca1a2fc273c79d1aecbbf1bc858f62e8184abe1ad175c4f7cc2"}, - {file = "black-22.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:373922fc66676133ddc3e754e4509196a8c392fec3f5ca4486673e685a421321"}, - {file = "black-22.1.0-py3-none-any.whl", hash = "sha256:3524739d76b6b3ed1132422bf9d82123cd1705086723bc3e235ca39fd21c667d"}, - {file = "black-22.1.0.tar.gz", hash = "sha256:a7c0192d35635f6fc1174be575cb7915e92e5dd629ee79fdaf0dcfa41a80afb5"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"}, + {file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"}, + {file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"}, + {file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"}, + {file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"}, + {file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"}, + {file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"}, + {file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"}, + {file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"}, + {file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"}, + {file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"}, + {file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"}, + {file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"}, + {file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"}, + {file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"}, + {file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"}, + {file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"}, + {file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"}, ] cached-property = [ {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, ] -certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, -] -cfgv = [ - {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, - {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, - {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, -] click = [ - {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"}, - {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, ] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, @@ -1010,96 +518,68 @@ crontab = [ {file = "crontab-0.23.0.tar.gz", hash = "sha256:ca79dede9c2f572bb32f38703e8fddcf3427e86edc838f2ffe7ae4b9ee2b0733"}, ] dependency-injector = [ - {file = "dependency-injector-4.39.0.tar.gz", hash = "sha256:35d6c03683f512bcc8b0c950890ac40ce19bdacc7de4d59249dd61ed818f0930"}, - {file = "dependency_injector-4.39.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f046a5dbe7e5764fae9a69423f66241a8fdb62acea5c32b0c41a7da94b7f6da3"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfdd78f7d97c1f6ba4a3926a2e404507a4f77ecbd610d4a1b37dedb5c0b57ad1"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:512c23da829bb8ac2ae13f33aa017acf58ae9408e7796a146e1644e8b8471b5b"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7dc81df7f566bfdacdee448bc71085acd163b935860d2b2504b4f32840b3b692"}, - {file = "dependency_injector-4.39.0-cp310-cp310-win32.whl", hash = "sha256:9ffc5393700f45d740abecc50cdc1251eae69e50516ec9d0a48fba0e875ed083"}, - {file = "dependency_injector-4.39.0-cp310-cp310-win_amd64.whl", hash = "sha256:9118f36a3df1e9819074ccb35734d663812c8f6ef81d45c8e4ec81ce5dccac9c"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:1ff723aaf096fabb05cf8b08ba99888538a2a77e03a5082b70cd54eb9df619f3"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bb913900ceb1766f55dc628052d8e191a9c2b1737a0d775fbc230af90ab2c1e"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:329e801eb46b9933432481d3142e563e28a90d77952edac43126264c36ed2278"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1c1a67c699ae2c0234f07d121736fa44e8fe2d56c14b2fd210c3e04a151620bb"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-win32.whl", hash = "sha256:e1347defd46fe9067f857b1174bdb1b19458232ac1a485507df2ddff084cf31c"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-win_amd64.whl", hash = "sha256:9581c4c90f1aaf85ffb9b06bac7ac592df7076522881145321a9dd0702fee828"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8da8ff05fa17e852aa5831a600177e5bb72bf53b8a184f6922ae715387a460ba"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58a56999cebd8b2ba9c19e514e383924865e5f7d6273f8e5b7d85468d9042059"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4914332d6145fb7cfc5f2236a823a3859b92a7e75566ffca0987dcc0f7f7be53"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00aea40ee2d400a8091947ad97cda34b230628aeeac1774f8fa9a3500b5704b2"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-win32.whl", hash = "sha256:b94a64bc73d86d04b33c698fae4b9dad2536a8534ac6922c8226764da5d62d17"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4f59cc0b0d3beb82875d94b7e725b5097a7a454e8e323625ba6ac3095a29300e"}, - {file = "dependency_injector-4.39.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a8d840348f01d997e32394dba36e09c1ecd312b286befb6b3ca27526002ae94"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92097ffabca89d1539e200f91bfa13ff8ca502c9057391c3b78787d50fe502ed"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4a889e116fe76742ef6ff27d5e93ee9e364cbe7bbc6678df8c5dd54597a6fc"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a31e00961fdc1b3808a9e2adeb1107ec4bba0ad3a90b116af9d116a667e4626a"}, - {file = "dependency_injector-4.39.0-cp38-cp38-win32.whl", hash = "sha256:717720a220eee611ea96c0089246ec2103b168303ca2cd2c8a7cd3856da6f689"}, - {file = "dependency_injector-4.39.0-cp38-cp38-win_amd64.whl", hash = "sha256:05c0bbef90182a0d35d4d3f9ab879109070d204394578b12f0eff9eca51987ef"}, - {file = "dependency_injector-4.39.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f10bf8d146edffbee2ba5c5776395625c98048a31997afd481ce27792afee2af"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30c093b155c01e50723e8ecd2a14230daa4417356c8fb5a27369ae5be24b21d9"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dda8a85c8221e6ee433caa01c1bc4fed610381924780e04470572682569cdb8f"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ff8df47a901218a3257650f3f3a6b402dd58cb4f57b4a34d6e8092112f6e8480"}, - {file = "dependency_injector-4.39.0-cp39-cp39-win32.whl", hash = "sha256:e078c84c19ae73883a57e9b35edd843925b2b44833cd098708139a98abee5a96"}, - {file = "dependency_injector-4.39.0-cp39-cp39-win_amd64.whl", hash = "sha256:c02b6796320d6b9363d566045eeec243fa4a412ad68dcc6b2391307e93d0d401"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:865bf5ceba3e32f00e36bfcbefb1267b10df961fb2aab809f5e205968e1cd59b"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ce8645ffd8cc15a7bbd20c02e6439a61c1566a1db22766893bf79981fb89a4e"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dbdab8b024055865926a78ecbc3a6280345f4615e5c505511bbd7c6c322b1796"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:af996d66350704261382dc4e10f324eba5d23e35c04a9e75c7cb58fbea7f1f1d"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d390c6e97fec13fba832b7e39e07c43760ed3d46af4887005f679c0ab6eb9b2e"}, -] -distlib = [ - {file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"}, - {file = "distlib-0.3.4.zip", hash = "sha256:e4b58818180336dc9c529bfb9a0b58728ffc09ad92027a3f30b7cd91e3458579"}, -] -docutils = [ - {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, - {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, + {file = "dependency-injector-4.39.1.tar.gz", hash = "sha256:9ab76dc5e19b2692aaca49e00f9b41a087138d139b0ec985f92ff0498f038772"}, + {file = "dependency_injector-4.39.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c788a3d5482e63b5fd55e14fc258f1ff0b51b411927ab132ef0f689cb5d1183f"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0832e0457a360725cd1d1037b77b85478aeeaacc60e85ecceeb8020409e7b62"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d51998fff9704fd01d11c3c48f4e88d8506cb6afa1ee41409a881a5a51dae3fc"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea484cd13fc62966bf5582df0816205feee072d18f228aac75f7807b43f223ae"}, + {file = "dependency_injector-4.39.1-cp310-cp310-win32.whl", hash = "sha256:17389e53ec29ca13570319cf2065dcc4c2f6d36db5dd792bb1e8f2c39a9f146b"}, + {file = "dependency_injector-4.39.1-cp310-cp310-win_amd64.whl", hash = "sha256:55b0988489267c5a580f419133770ffe293057f2064da1c9ad6a2cc69666739b"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b297c3e79d3633cc56366386ae1f7dbce1587673cca2f559c368c1e936a1fa94"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2728827c5abb2420c5811e218262ae1b77a48e76cc9eebc6b4f55fee48a1a18d"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:029e42b064ab8cb5b2559be040ff682c7aa81592f1654a82355475956df17803"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:305e3db3f4bf40f64caaa1303e03005174e78d2339d2ae517b34c011ec2300f9"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-win32.whl", hash = "sha256:a661dd23a5e4e2f6bf4a729de7fadbe148c9a4a298dbcadfc5a94584b6930970"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-win_amd64.whl", hash = "sha256:340d6e7af5c4729d20c837d6d1e8a2626c24a05259dff746406cc823e26ba1e7"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a1553dac1c95f0de1f910b0025ee4570ea078a07d576bcdc2168990e719cea50"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c7baaa64d93359ee08c15d68579cc803e11d9becaf961f5a66b94ff627248e1"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7a27bf1951a066cf347b886cc7ab0f37dcbd1ad59bffcfe721c8c12a189a150d"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da6e2d685f7d0c65257f08133b68d9bf74ec319b90a0f21b4f629d168ce5f68f"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-win32.whl", hash = "sha256:a8ddd03ca86e67e9d3cc038793d34fbfccab12e6145df813e72bf14f9371f2ea"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-win_amd64.whl", hash = "sha256:e01a319ea05cd86b520201386dcb53a81a5400cb82fcc2f006bd7e92c0c51a0a"}, + {file = "dependency_injector-4.39.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4704804bde25b694aa65201927937a9d82d8bc055cb3dadc68eb05988bd34fa9"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0935d50b263169e7b0826a2fb6be80d6a4f2a7c59e6dd9876f86da3243bea9eb"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3c34aa5abb1826b6189f47daf6e469d4293c1d01693233da2c1b923816270cc5"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:db64904c9b9a88756cfece3e3ed078a2b57127642711dd08af342dba8abf9667"}, + {file = "dependency_injector-4.39.1-cp38-cp38-win32.whl", hash = "sha256:66ebe728194adc8720dbc4d662edbbfa55659ff23c9c493fb2dae0bfd4df5734"}, + {file = "dependency_injector-4.39.1-cp38-cp38-win_amd64.whl", hash = "sha256:4349974620f630d6726808e1291ec99713b64d449b84eb01581ee807a5a5c224"}, + {file = "dependency_injector-4.39.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d87cad0899b05cd08931bfb68ddf7be77711a67b0649c37f2045d7808977b082"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8efd965e5cfdd9f339ec895e73c119569851adedc175088d34a670f5206fea63"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:27f69485ca6b85c31d162ee86cf6ef71bb71dce9cd2b5d0745425dfc551eefa1"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a25b63de59dff04ec78f5161f00c0222a04a23def5d1f0eda14e389a32baf428"}, + {file = "dependency_injector-4.39.1-cp39-cp39-win32.whl", hash = "sha256:a14274f50d125b4579314c355e22af07def1a96641ca94bd75edcf1400b89477"}, + {file = "dependency_injector-4.39.1-cp39-cp39-win_amd64.whl", hash = "sha256:9950039d00625f9252cd26378a4406342b256886bb61e4db8b65e9f01270f53e"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6d7f39cd54678741e132e13da3a1367ac18058cbda61fe39d61c8583aa6fd757"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2368c7ba3c9ffaf816ea0f2d14c78d481491b805f62ac8496a78a51397d4689"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:84e32407bb16c58aa0d4b5ed8485537bc66ccc14cfffae7022f1204e35ec939a"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f2d80a42c546e1f934d427b071630d86653cd4a60c74b570c4ffb03025c1f1f9"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ca126bbed370b8c002c859ebeb76f6d83eba2d7fb5d66f37f47cfc19661d2889"}, ] fastavro = [ - {file = "fastavro-1.4.10-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:f225c81e869b3cefef6f2b478cd452693181ed7e645be3cea4d82024354ecaa0"}, - {file = "fastavro-1.4.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7669302c9124b7cd6c1bdff80c77116b2290c984814077fb7d01d7389586054"}, - {file = "fastavro-1.4.10-cp310-cp310-win_amd64.whl", hash = "sha256:995525bdfbdfef205ea148b5bc6a9fe5ccf921931123c39d9aad75a2b661681e"}, - {file = "fastavro-1.4.10-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:64244c53f1e4853184c2f7383d0332e1dcb34c38c05e6613530ade0378e8acfc"}, - {file = "fastavro-1.4.10-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c60965da6dc7a91e00ccd84d84797fad746555f44e8a816c4cc460fb231c44fe"}, - {file = "fastavro-1.4.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10eb25378f37dc00c10e83c4c0442c1a6d1b871f74a6dfdfc12b6447962bbdd0"}, - {file = "fastavro-1.4.10-cp37-cp37m-win_amd64.whl", hash = "sha256:d5719adf6045fc743de5fa738d561a81e58dc782c94f1b16cb21b5dd6253e7fd"}, - {file = "fastavro-1.4.10-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:24c4a1a8cc92e135ecfcd9cbd1f6cfa088cbc74d78c18e02a609cb11fa33778d"}, - {file = "fastavro-1.4.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0934490b0c3bcfd6bcbacbcb5144c6b5e4298cda209fbb17c856adf5405127dd"}, - {file = "fastavro-1.4.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a23763d73412c077aee401a0368c64cbc23859e26711dbae78a3cf0227f65165"}, - {file = "fastavro-1.4.10-cp38-cp38-win_amd64.whl", hash = "sha256:09f1dfdd8192ae09e0f477d1f024d8054fccdb099ad495d2a796bcee3cadebd1"}, - {file = "fastavro-1.4.10-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:0c6695753fa3035bbd0fa5cb21bf1b5dad39483c669b32ca0bb55fb07c1ccc87"}, - {file = "fastavro-1.4.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35f960dbba04647d8d6d5616f879622d2a1e8a84eb2d2e02a883a22e0803463a"}, - {file = "fastavro-1.4.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9660878ca01e3dbbee12385c5902a2b6b12ecbb5af4733d1026175a14b1ef67f"}, - {file = "fastavro-1.4.10-cp39-cp39-win_amd64.whl", hash = "sha256:64cbd386e408b3bcb2de53b1f847163073eb0d0d0338db65f76051c6ba9a9bc1"}, - {file = "fastavro-1.4.10.tar.gz", hash = "sha256:a24f9dd803c44bfb599476b000f9bd0088f7ac2401e6c20818f38d8af12785a0"}, -] -filelock = [ - {file = "filelock-3.6.0-py3-none-any.whl", hash = "sha256:f8314284bfffbdcfa0ff3d7992b023d4c628ced6feb957351d4c48d059f56bc0"}, - {file = "filelock-3.6.0.tar.gz", hash = "sha256:9cd540a9352e432c7246a48fe4e8712b10acb1df2ad1f30e8c070b82ae1fed85"}, + {file = "fastavro-1.4.11-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:44f01008f95d685edacc4b10366c755d25612df00924349f7d34a29f08522ce3"}, + {file = "fastavro-1.4.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18f5e736d12e67348f253da8a332d7c3b483ca04f2b6e772befa79d1a46bac9d"}, + {file = "fastavro-1.4.11-cp310-cp310-win_amd64.whl", hash = "sha256:8dca11bc3191cd7de0a3c4b76a70dac493356a219e96ebcde0def1f06faddef7"}, + {file = "fastavro-1.4.11-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:7a2a0bf03686f9d860e8f8476be000f5b3e6cc9af6853dbabab2ef9cfa5dc3a0"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c17e3decfac260e1be4d02d1903d2483eec2f3ce7f92c9b808a0f6a81572c4b"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19ba25c6529f50722a7618cc4ca24c7d265def57fd9f94e4e554e1df8cce38d2"}, + {file = "fastavro-1.4.11-cp37-cp37m-win_amd64.whl", hash = "sha256:ceaba04da9419f40899a670eb62eb373a127b511bb8e3ae4f6f1f23ec49bd0e4"}, + {file = "fastavro-1.4.11-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:732eab3a1ae5d2c3f4b52e747c55bcc41c4df0eb7e8a395038080741a3c0a934"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c03d3c802b71f44e7b3442abae961bba996258244bd222b242ad1e5cb7754e57"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cb7475a9b25b9f8aebe7eb756dafedd0369434571062f3883d894281befd7c"}, + {file = "fastavro-1.4.11-cp38-cp38-win_amd64.whl", hash = "sha256:ce0776f54591aef90bcd02bd919964abe4c2ad2a10a4336c3a1b66cef289b41c"}, + {file = "fastavro-1.4.11-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:621e72cc365c9539d7590e7b43e48a62e6bfb4c2de7c16837fed54d113d7312c"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:842b25782f911ee8c626f9d9fedc2ef01aeac272536fe90ee6d45b2ae7cdb024"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8491bfcba25c9d661289f884688e5a4f56f2ee389a240d0ad02692495a9a087"}, + {file = "fastavro-1.4.11-cp39-cp39-win_amd64.whl", hash = "sha256:c94130a8c8d80073eb0276844915aa5e928ae322024e76dc57943542ccda211c"}, + {file = "fastavro-1.4.11.tar.gz", hash = "sha256:7c64332ad52de0134be9a933ca986514c3ff85c63d54bc5398c31f0498ac1820"}, ] flake8 = [ {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, ] graphql-core = [ - {file = "graphql-core-3.2.0.tar.gz", hash = "sha256:86e2a0be008bfde19ef78388de8a725a1d942a9190ca431c24a60837973803ce"}, - {file = "graphql_core-3.2.0-py3-none-any.whl", hash = "sha256:0dda7e63676f119bb3d814621190fedad72fda07a8e9ab780bedd9f1957c6dc6"}, -] -identify = [ - {file = "identify-2.4.12-py2.py3-none-any.whl", hash = "sha256:5f06b14366bd1facb88b00540a1de05b69b310cbc2654db3c7e07fa3a4339323"}, - {file = "identify-2.4.12.tar.gz", hash = "sha256:3f3244a559290e7d3deb9e9adc7b33594c1bc85a9dd82e0f1be519bf12a1ec17"}, -] -idna = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, -] -imagesize = [ - {file = "imagesize-1.3.0-py2.py3-none-any.whl", hash = "sha256:1db2f82529e53c3e929e8926a1fa9235aa82d0bd0c580359c67ec31b2fddaa8c"}, - {file = "imagesize-1.3.0.tar.gz", hash = "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d"}, -] -importlib-metadata = [ - {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, - {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, + {file = "graphql-core-3.2.1.tar.gz", hash = "sha256:9d1bf141427b7d54be944587c8349df791ce60ade2e3cccaf9c56368c133c201"}, + {file = "graphql_core-3.2.1-py3-none-any.whl", hash = "sha256:f83c658e4968998eed1923a2e3e3eddd347e005ac0315fbb7ca4d70ea9156323"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, @@ -1109,136 +589,49 @@ isort = [ {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, ] -jinja2 = [ - {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"}, - {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"}, -] -lmdb = [ - {file = "lmdb-1.3.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:63cb73fe7ce9eb93d992d632c85a0476b4332670d9e6a2802b5062f603b7809f"}, - {file = "lmdb-1.3.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:abbc439cd9fe60ffd6197009087ea885ac150017dc85384093b1d376f83f0ec4"}, - {file = "lmdb-1.3.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6260a526e4ad85b1f374a5ba9475bf369fb07e7728ea6ec57226b02c40d1976b"}, - {file = "lmdb-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e568ae0887ae196340947d9800136e90feaed6b86a261ef01f01b2ba65fc8106"}, - {file = "lmdb-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6a816954d212f40fd15007cd81ab7a6bebb77436d949a6a9ae04af57fc127f3"}, - {file = "lmdb-1.3.0-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:fa6439356e591d3249ab0e1778a6f8d8408e993f66dc911914c78208f5310309"}, - {file = "lmdb-1.3.0-cp35-cp35m-win_amd64.whl", hash = "sha256:c6adbd6f7f9048e97f31a069e652eb51020a81e80a0ce92dbb9810d21da2409a"}, - {file = "lmdb-1.3.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:eefb392f6b5cd43aada49258c5a79be11cb2c8cd3fc3e2d9319a1e0b9f906458"}, - {file = "lmdb-1.3.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a14aca2651c3af6f0d0a6b9168200eea0c8f2d27c40b01a442f33329a6e8dff"}, - {file = "lmdb-1.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cfa4aa9c67f8aee89b23005e98d1f3f32490b6b905fd1cb604b207cbd5755ab"}, - {file = "lmdb-1.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7da05d70fcc6561ac6b09e9fb1bf64b7ca294652c64c8a2889273970cee796b9"}, - {file = "lmdb-1.3.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:008243762decf8f6c90430a9bced56290ebbcdb5e877d90e42343bb97033e494"}, - {file = "lmdb-1.3.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:17215a42a4b9814c383deabecb160581e4fb75d00198eef0e3cea54f230ffbea"}, - {file = "lmdb-1.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65334eafa5d430b18d81ebd5362559a41483c362e1931f6e1b15bab2ecb7d75d"}, - {file = "lmdb-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:18c69fabdaf04efaf246587739cc1062b3e57c6ef0743f5c418df89e5e7e7b9b"}, - {file = "lmdb-1.3.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:41318717ab5d15ad2d6d263d34fbf614a045210f64b25e59ce734bb2105e421f"}, - {file = "lmdb-1.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:df2724bad7820114a205472994091097d0fa65a3e5fff5a8e688d123fb8c6326"}, - {file = "lmdb-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ddd590e1c7fcb395931aa3782fb89b9db4550ab2d81d006ecd239e0d462bc41"}, - {file = "lmdb-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:4172fba19417d7b29409beca7d73c067b54e5d8ab1fb9b51d7b4c1445d20a167"}, - {file = "lmdb-1.3.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2df38115dd9428a54d59ae7c712a4c7cce0d6b1d66056de4b1a8c38718066106"}, - {file = "lmdb-1.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d9103aa4908f0bca43c5911ca067d4e3d01f682dff0c0381a1239bd2bd757984"}, - {file = "lmdb-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:394df860c3f93cfd92b6f4caba785f38208cc9614c18b3803f83a2cc1695042f"}, - {file = "lmdb-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:62ab28e3593bdc318ea2f2fa1574e5fca3b6d1f264686d773ba54a637d4f563b"}, - {file = "lmdb-1.3.0-pp27-pypy_73-macosx_10_7_x86_64.whl", hash = "sha256:e6a704b3baced9182836c7f77b769f23856f3a8f62d0282b1bc1feaf81a86712"}, - {file = "lmdb-1.3.0-pp27-pypy_73-win_amd64.whl", hash = "sha256:08f4b5129f4683802569b02581142e415c8dcc0ff07605983ec1b07804cecbad"}, - {file = "lmdb-1.3.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:f291e3f561f58dddf63a92a5a6a4b8af3a0920b6705d35e2f80e52e86ee238a2"}, - {file = "lmdb-1.3.0.tar.gz", hash = "sha256:60a11efc21aaf009d06518996360eed346f6000bfc9de05114374230879f992e"}, -] -m2r2 = [ - {file = "m2r2-0.3.2-py3-none-any.whl", hash = "sha256:d3684086b61b4bebe2307f15189495360f05a123c9bda2a66462649b7ca236aa"}, - {file = "m2r2-0.3.2.tar.gz", hash = "sha256:ccd95b052dcd1ac7442ecb3111262b2001c10e4119b459c34c93ac7a5c2c7868"}, -] -markupsafe = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, -] mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] minos-microservice-common = [] minos-microservice-networks = [] -mistune = [ - {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, - {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, -] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] -nodeenv = [ - {file = "nodeenv-1.6.0-py2.py3-none-any.whl", hash = "sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"}, - {file = "nodeenv-1.6.0.tar.gz", hash = "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b"}, -] orjson = [ - {file = "orjson-3.6.7-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:93188a9d6eb566419ad48befa202dfe7cd7a161756444b99c4ec77faea9352a4"}, - {file = "orjson-3.6.7-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:82515226ecb77689a029061552b5df1802b75d861780c401e96ca6bc8495f775"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3af57ffab7848aaec6ba6b9e9b41331250b57bf696f9d502bacdc71a0ebab0ba"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:a7297504d1142e7efa236ffc53f056d73934a993a08646dbcee89fc4308a8fcf"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:5a50cde0dbbde255ce751fd1bca39d00ecd878ba0903c0480961b31984f2fab7"}, - {file = "orjson-3.6.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d21f9a2d1c30e58070f93988db4cad154b9009fafbde238b52c1c760e3607fbe"}, - {file = "orjson-3.6.7-cp310-none-win_amd64.whl", hash = "sha256:e152464c4606b49398afd911777decebcf9749cc8810c5b4199039e1afb0991e"}, - {file = "orjson-3.6.7-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:0a65f3c403f38b0117c6dd8e76e85a7bd51fcd92f06c5598dfeddbc44697d3e5"}, - {file = "orjson-3.6.7-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:6c47cfca18e41f7f37b08ff3e7abf5ada2d0f27b5ade934f05be5fc5bb956e9d"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:63185af814c243fad7a72441e5f98120c9ecddf2675befa486d669fb65539e9b"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2da6fde42182b80b40df2e6ab855c55090ebfa3fcc21c182b7ad1762b61d55c"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:48c5831ec388b4e2682d4ff56d6bfa4a2ef76c963f5e75f4ff4785f9cf338a80"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:913fac5d594ccabf5e8fbac15b9b3bb9c576d537d49eeec9f664e7a64dde4c4b"}, - {file = "orjson-3.6.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:58f244775f20476e5851e7546df109f75160a5178d44257d437ba6d7e562bfe8"}, - {file = "orjson-3.6.7-cp37-none-win_amd64.whl", hash = "sha256:2d5f45c6b85e5f14646df2d32ecd7ff20fcccc71c0ea1155f4d3df8c5299bbb7"}, - {file = "orjson-3.6.7-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:612d242493afeeb2068bc72ff2544aa3b1e627578fcf92edee9daebb5893ffea"}, - {file = "orjson-3.6.7-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:539cdc5067db38db27985e257772d073cd2eb9462d0a41bde96da4e4e60bd99b"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6d103b721bbc4f5703f62b3882e638c0b65fcdd48622531c7ffd45047ef8e87c"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb10a20f80e95102dd35dfbc3a22531661b44a09b55236b012a446955846b023"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:bb68d0da349cf8a68971a48ad179434f75256159fe8b0715275d9b49fa23b7a3"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:4a2c7d0a236aaeab7f69c17b7ab4c078874e817da1bfbb9827cb8c73058b3050"}, - {file = "orjson-3.6.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3be045ca3b96119f592904cf34b962969ce97bd7843cbfca084009f6c8d2f268"}, - {file = "orjson-3.6.7-cp38-none-win_amd64.whl", hash = "sha256:bd765c06c359d8a814b90f948538f957fa8a1f55ad1aaffcdc5771996aaea061"}, - {file = "orjson-3.6.7-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:7dd9e1e46c0776eee9e0649e3ae9584ea368d96851bcaeba18e217fa5d755283"}, - {file = "orjson-3.6.7-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:c4b4f20a1e3df7e7c83717aff0ef4ab69e42ce2fb1f5234682f618153c458406"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7107a5673fd0b05adbb58bf71c1578fc84d662d29c096eb6d998982c8635c221"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a08b6940dd9a98ccf09785890112a0f81eadb4f35b51b9a80736d1725437e22c"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:f5d1648e5a9d1070f3628a69a7c6c17634dbb0caf22f2085eca6910f7427bf1f"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:e6201494e8dff2ce7fd21da4e3f6dfca1a3fed38f9dcefc972f552f6596a7621"}, - {file = "orjson-3.6.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:70d0386abe02879ebaead2f9632dd2acb71000b4721fd8c1a2fb8c031a38d4d5"}, - {file = "orjson-3.6.7-cp39-none-win_amd64.whl", hash = "sha256:d9a3288861bfd26f3511fb4081561ca768674612bac59513cb9081bb61fcc87f"}, - {file = "orjson-3.6.7.tar.gz", hash = "sha256:a4bb62b11289b7620eead2f25695212e9ac77fcfba76f050fa8a540fb5c32401"}, + {file = "orjson-3.6.8-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:3a287a650458de2211db03681b71c3e5cb2212b62f17a39df8ad99fc54855d0f"}, + {file = "orjson-3.6.8-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:5204e25c12cea58e524fc82f7c27ed0586f592f777b33075a92ab7b3eb3687c2"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77e8386393add64f959c044e0fb682364fd0e611a6f477aa13f0e6a733bd6a28"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:279f2d2af393fdf8601020744cb206b91b54ad60fb8401e0761819c7bda1f4e4"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:c31c9f389be7906f978ed4192eb58a4b74a37ad60556a0b88ddc47c576697770"}, + {file = "orjson-3.6.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0db5c5a0c5b89f092d52f6e5a3701660a9d6ffa9e2968b3ce17c2bc4f5eb0414"}, + {file = "orjson-3.6.8-cp310-none-win_amd64.whl", hash = "sha256:eb22485847b9a0c4bbedc668df860126ac931edbed1d456cf41a59f3cb961ed8"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:1a5fe569310bc819279bd4d5f2c349910b104ed3207936246dd5d5e0b085e74a"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:ccb356a47ab1067cd3549847e9db1d279a63fe0482d315b3ffd6e7abef35ef77"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab29c069c222248ce302a25855b4e1664f9436e8ae5a131fb0859daf31676d2b"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2b5e4cba9e774ac011071d9d27760f97f4b8cd46003e971d122e712f971345"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:c311ec504414d22834d5b972a209619925b48263856a11a14d90230f9682d49c"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:a3dfec7950b90fb8d143743503ee53fa06b32e6068bdea792fc866284da3d71d"}, + {file = "orjson-3.6.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b890dbbada2cbb26eb29bd43a848426f007f094bb0758df10dfe7a438e1cb4b4"}, + {file = "orjson-3.6.8-cp37-none-win_amd64.whl", hash = "sha256:9143ae2c52771525be9ad11a7a8cc8e7fd75391b107e7e644a9e0050496f6b4f"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:33a82199fd42f6436f833e210ae5129c922a5c355629356ca7a8e82964da7285"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:90159ea8b9a5a2a98fa33dc7b421cfac4d2ae91ba5e1058f5909e7f059f6b467"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:656fbe15d9ef0733e740d9def78f4fdb4153102f4836ee774a05123499005931"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7be3be6153843e0f01351b1313a5ad4723595427680dac2dfff22a37e652ce02"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:dd24f66b6697ee7424f7da575ec6cbffc8ede441114d53470949cda4d97c6e56"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:b07c780f7345ecf5901356dc21dee0669defc489c38ce7b9ab0f5e008cc0385c"}, + {file = "orjson-3.6.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ea32015a5d8a4ce00d348a0de5dc7040e0ad58f970a8fcbb5713a1eac129e493"}, + {file = "orjson-3.6.8-cp38-none-win_amd64.whl", hash = "sha256:c5a3e382194c838988ec128a26b08aa92044e5e055491cc4056142af0c1c54d7"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:83a8424e857ae1bf53530e88b4eb2f16ca2b489073b924e655f1575cacd7f52a"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:81e1a6a2d67f15007dadacbf9ba5d3d79237e5e33786c028557fe5a2b72f1c9a"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:137b539881c77866eba86ff6a11df910daf2eb9ab8f1acae62f879e83d7c38af"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cbd358f3b3ad539a27e36900e8e7d172d0e1b72ad9dd7d69544dcbc0f067ee7"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:6ab94701542d40b90903ecfc339333f458884979a01cb9268bc662cc67a5f6d8"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:32b6f26593a9eb606b40775826beb0dac152e3d224ea393688fced036045a821"}, + {file = "orjson-3.6.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:afd9e329ebd3418cac3cd747769b1d52daa25fa672bbf414ab59f0e0881b32b9"}, + {file = "orjson-3.6.8-cp39-none-win_amd64.whl", hash = "sha256:0c89b419914d3d1f65a1b0883f377abe42a6e44f6624ba1c63e8846cbfc2fa60"}, + {file = "orjson-3.6.8.tar.gz", hash = "sha256:e19d23741c5de13689bb316abfccea15a19c264e3ec8eb332a5319a583595ace"}, ] packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, @@ -1248,80 +641,14 @@ pathspec = [ {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, ] -pbr = [ - {file = "pbr-5.8.1-py2.py3-none-any.whl", hash = "sha256:27108648368782d07bbf1cb468ad2e2eeef29086affd14087a6d04b7de8af4ec"}, - {file = "pbr-5.8.1.tar.gz", hash = "sha256:66bc5a34912f408bb3925bf21231cb6f59206267b7f63f3503ef865c1a292e25"}, -] platformdirs = [ - {file = "platformdirs-2.5.1-py3-none-any.whl", hash = "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"}, - {file = "platformdirs-2.5.1.tar.gz", hash = "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d"}, + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, ] pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] -pre-commit = [ - {file = "pre_commit-2.17.0-py2.py3-none-any.whl", hash = "sha256:725fa7459782d7bec5ead072810e47351de01709be838c2ce1726b9591dad616"}, - {file = "pre_commit-2.17.0.tar.gz", hash = "sha256:c1a8040ff15ad3d648c70cc3e55b93e4d2d5b687320955505587fd79bbaed06a"}, -] -psycopg2-binary = [ - {file = "psycopg2-binary-2.9.3.tar.gz", hash = "sha256:761df5313dc15da1502b21453642d7599d26be88bff659382f8f9747c7ebea4e"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:539b28661b71da7c0e428692438efbcd048ca21ea81af618d845e06ebfd29478"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e82d38390a03da28c7985b394ec3f56873174e2c88130e6966cb1c946508e65"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57804fc02ca3ce0dbfbef35c4b3a4a774da66d66ea20f4bda601294ad2ea6092"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:083a55275f09a62b8ca4902dd11f4b33075b743cf0d360419e2051a8a5d5ff76"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_24_ppc64le.whl", hash = "sha256:0a29729145aaaf1ad8bafe663131890e2111f13416b60e460dae0a96af5905c9"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a79d622f5206d695d7824cbf609a4f5b88ea6d6dab5f7c147fc6d333a8787e4"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:090f3348c0ab2cceb6dfbe6bf721ef61262ddf518cd6cc6ecc7d334996d64efa"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a9e1f75f96ea388fbcef36c70640c4efbe4650658f3d6a2967b4cc70e907352e"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c3ae8e75eb7160851e59adc77b3a19a976e50622e44fd4fd47b8b18208189d42"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-win32.whl", hash = "sha256:7b1e9b80afca7b7a386ef087db614faebbf8839b7f4db5eb107d0f1a53225029"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:8b344adbb9a862de0c635f4f0425b7958bf5a4b927c8594e6e8d261775796d53"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:e847774f8ffd5b398a75bc1c18fbb56564cda3d629fe68fd81971fece2d3c67e"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68641a34023d306be959101b345732360fc2ea4938982309b786f7be1b43a4a1"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3303f8807f342641851578ee7ed1f3efc9802d00a6f83c101d21c608cb864460"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_24_aarch64.whl", hash = "sha256:e3699852e22aa68c10de06524a3721ade969abf382da95884e6a10ff798f9281"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_24_ppc64le.whl", hash = "sha256:526ea0378246d9b080148f2d6681229f4b5964543c170dd10bf4faaab6e0d27f"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:b1c8068513f5b158cf7e29c43a77eb34b407db29aca749d3eb9293ee0d3103ca"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:15803fa813ea05bef089fa78835118b5434204f3a17cb9f1e5dbfd0b9deea5af"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:152f09f57417b831418304c7f30d727dc83a12761627bb826951692cc6491e57"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:404224e5fef3b193f892abdbf8961ce20e0b6642886cfe1fe1923f41aaa75c9d"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-win32.whl", hash = "sha256:1f6b813106a3abdf7b03640d36e24669234120c72e91d5cbaeb87c5f7c36c65b"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:2d872e3c9d5d075a2e104540965a1cf898b52274a5923936e5bfddb58c59c7c2"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:10bb90fb4d523a2aa67773d4ff2b833ec00857f5912bafcfd5f5414e45280fb1"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a52ecab70af13e899f7847b3e074eeb16ebac5615665db33bce8a1009cf33"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a29b3ca4ec9defec6d42bf5feb36bb5817ba3c0230dd83b4edf4bf02684cd0ae"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:12b11322ea00ad8db8c46f18b7dfc47ae215e4df55b46c67a94b4effbaec7094"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_24_ppc64le.whl", hash = "sha256:53293533fcbb94c202b7c800a12c873cfe24599656b341f56e71dd2b557be063"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c381bda330ddf2fccbafab789d83ebc6c53db126e4383e73794c74eedce855ef"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9d29409b625a143649d03d0fd7b57e4b92e0ecad9726ba682244b73be91d2fdb"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:183a517a3a63503f70f808b58bfbf962f23d73b6dccddae5aa56152ef2bcb232"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:15c4e4cfa45f5a60599d9cec5f46cd7b1b29d86a6390ec23e8eebaae84e64554"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-win32.whl", hash = "sha256:adf20d9a67e0b6393eac162eb81fb10bc9130a80540f4df7e7355c2dd4af9fba"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2f9ffd643bc7349eeb664eba8864d9e01f057880f510e4681ba40a6532f93c71"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:def68d7c21984b0f8218e8a15d514f714d96904265164f75f8d3a70f9c295667"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dffc08ca91c9ac09008870c9eb77b00a46b3378719584059c034b8945e26b272"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:280b0bb5cbfe8039205c7981cceb006156a675362a00fe29b16fbc264e242834"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:af9813db73395fb1fc211bac696faea4ca9ef53f32dc0cfa27e4e7cf766dcf24"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_24_ppc64le.whl", hash = "sha256:63638d875be8c2784cfc952c9ac34e2b50e43f9f0a0660b65e2a87d656b3116c"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ffb7a888a047696e7f8240d649b43fb3644f14f0ee229077e7f6b9f9081635bd"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0c9d5450c566c80c396b7402895c4369a410cab5a82707b11aee1e624da7d004"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:d1c1b569ecafe3a69380a94e6ae09a4789bbb23666f3d3a08d06bbd2451f5ef1"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8fc53f9af09426a61db9ba357865c77f26076d48669f2e1bb24d85a22fb52307"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-win32.whl", hash = "sha256:6472a178e291b59e7f16ab49ec8b4f3bdada0a879c68d3817ff0963e722a82ce"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:35168209c9d51b145e459e05c31a9eaeffa9a6b0fd61689b48e07464ffd1a83e"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:47133f3f872faf28c1e87d4357220e809dfd3fa7c64295a4a148bcd1e6e34ec9"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91920527dea30175cc02a1099f331aa8c1ba39bf8b7762b7b56cbf54bc5cce42"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:887dd9aac71765ac0d0bac1d0d4b4f2c99d5f5c1382d8b770404f0f3d0ce8a39"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:1f14c8b0942714eb3c74e1e71700cbbcb415acbc311c730370e70c578a44a25c"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_24_ppc64le.whl", hash = "sha256:7af0dd86ddb2f8af5da57a976d27cd2cd15510518d582b478fbb2292428710b4"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:93cd1967a18aa0edd4b95b1dfd554cf15af657cb606280996d393dadc88c3c35"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bda845b664bb6c91446ca9609fc69f7db6c334ec5e4adc87571c34e4f47b7ddb"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:01310cf4cf26db9aea5158c217caa92d291f0500051a6469ac52166e1a16f5b7"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:99485cab9ba0fa9b84f1f9e1fef106f44a46ef6afdeec8885e0b88d0772b49e8"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-win32.whl", hash = "sha256:46f0e0a6b5fa5851bbd9ab1bc805eef362d3a230fbdfbc209f4a236d0a7a990d"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:accfe7e982411da3178ec690baaceaad3c278652998b2c45828aaac66cd8285f"}, -] py = [ {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, @@ -1334,22 +661,14 @@ pyflakes = [ {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, ] -pygments = [ - {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"}, - {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"}, -] pyparsing = [ - {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"}, - {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, ] pytest = [ {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, ] -pytz = [ - {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"}, - {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"}, -] pyyaml = [ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, @@ -1385,58 +704,10 @@ pyyaml = [ {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] -requests = [ - {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, - {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, -] six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] -snowballstemmer = [ - {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, - {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, -] -sphinx = [ - {file = "Sphinx-4.5.0-py3-none-any.whl", hash = "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226"}, - {file = "Sphinx-4.5.0.tar.gz", hash = "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6"}, -] -sphinx-autodoc-typehints = [ - {file = "sphinx_autodoc_typehints-1.17.0-py3-none-any.whl", hash = "sha256:081daf53077b4ae1c28347d6d858e13e63aefe3b4aacef79fd717dd60687b470"}, - {file = "sphinx_autodoc_typehints-1.17.0.tar.gz", hash = "sha256:51c7b3f5cb9ccd15d0b52088c62df3094f1abd9612930340365c26def8629a14"}, -] -sphinx-rtd-theme = [ - {file = "sphinx_rtd_theme-1.0.0-py2.py3-none-any.whl", hash = "sha256:4d35a56f4508cfee4c4fb604373ede6feae2a306731d533f409ef5c3496fdbd8"}, - {file = "sphinx_rtd_theme-1.0.0.tar.gz", hash = "sha256:eec6d497e4c2195fa0e8b2016b337532b8a699a68bcb22a512870e16925c6a5c"}, -] -sphinxcontrib-apidoc = [ - {file = "sphinxcontrib-apidoc-0.3.0.tar.gz", hash = "sha256:729bf592cf7b7dd57c4c05794f732dc026127275d785c2a5494521fdde773fb9"}, - {file = "sphinxcontrib_apidoc-0.3.0-py2.py3-none-any.whl", hash = "sha256:6671a46b2c6c5b0dca3d8a147849d159065e50443df79614f921b42fbd15cb09"}, -] -sphinxcontrib-applehelp = [ - {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, - {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, -] -sphinxcontrib-devhelp = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, -] -sphinxcontrib-htmlhelp = [ - {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, - {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, -] -sphinxcontrib-jsmath = [ - {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, - {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, -] -sphinxcontrib-qthelp = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, -] -sphinxcontrib-serializinghtml = [ - {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, - {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, -] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, @@ -1446,12 +717,8 @@ tomli = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] typing-extensions = [ - {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, - {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, -] -urllib3 = [ - {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, - {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, + {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, + {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, ] uvloop = [ {file = "uvloop-0.16.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6224f1401025b748ffecb7a6e2652b17768f30b1a6a3f7b44660e5b5b690b12d"}, @@ -1471,11 +738,3 @@ uvloop = [ {file = "uvloop-0.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e5f2e2ff51aefe6c19ee98af12b4ae61f5be456cd24396953244a30880ad861"}, {file = "uvloop-0.16.0.tar.gz", hash = "sha256:f74bc20c7b67d1c27c72601c78cf95be99d5c2cdd4514502b4f3eb0933ff1228"}, ] -virtualenv = [ - {file = "virtualenv-20.14.0-py2.py3-none-any.whl", hash = "sha256:1e8588f35e8b42c6ec6841a13c5e88239de1e6e4e4cedfd3916b306dc826ec66"}, - {file = "virtualenv-20.14.0.tar.gz", hash = "sha256:8e5b402037287126e81ccde9432b95a8be5b19d36584f64957060a3488c11ca8"}, -] -zipp = [ - {file = "zipp-3.7.0-py3-none-any.whl", hash = "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375"}, - {file = "zipp-3.7.0.tar.gz", hash = "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d"}, -] diff --git a/packages/plugins/minos-router-graphql/pyproject.toml b/packages/plugins/minos-router-graphql/pyproject.toml index 4425d630c..cbc64181a 100644 --- a/packages/plugins/minos-router-graphql/pyproject.toml +++ b/packages/plugins/minos-router-graphql/pyproject.toml @@ -1,7 +1,7 @@ [tool.poetry] name = "minos-router-graphql" -version = "0.6.0" -description = "The graphql plugin of the Minos Framework." +version = "0.7.0" +description = "The graphql plugin of the Minos Framework" readme = "README.md" repository = "https://github.com/minos-framework/minos-python" homepage = "https://www.minos.run/" @@ -21,18 +21,18 @@ keywords = [ "saga", ] packages = [ - { include = "minos" } + { include = "minos" }, ] include = [ - "AUTHORS.md", - "HISTORY.md", - "LICENSE", + { path = "AUTHORS.md", format = "sdist" }, + { path = "HISTORY.md", format = "sdist" }, + { path = "LICENSE", format = "sdist" }, ] [tool.poetry.dependencies] python = "^3.9" -minos-microservice-common = "^0.6.0" -minos-microservice-networks = "^0.6.0" +minos-microservice-common = "^0.7.0" +minos-microservice-networks = "^0.7.0" graphql-core = "^3.2.0" [tool.poetry.dev-dependencies] @@ -43,12 +43,6 @@ isort = "^5.8.0" pytest = "^6.2.4" coverage = "^6.3" flake8 = "^4.0.1" -Sphinx = "^4.0.1" -pre-commit = "^2.12.1" -sphinx-autodoc-typehints = "^1.12.0" -sphinxcontrib-apidoc = "^0.3.0" -sphinx-rtd-theme = "^1.0.0" -m2r2 = "^0.3.2" [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/packages/plugins/minos-router-graphql/tests/test_graphql/test_decorators.py b/packages/plugins/minos-router-graphql/tests/test_graphql/test_decorators.py index d3e59e1c5..d08c1d7ad 100644 --- a/packages/plugins/minos-router-graphql/tests/test_graphql/test_decorators.py +++ b/packages/plugins/minos-router-graphql/tests/test_graphql/test_decorators.py @@ -16,6 +16,7 @@ ) from tests.utils import ( FakeQueryService, + FakeQueryService2, ) @@ -36,6 +37,23 @@ def test_get_all_queries(self): self.assertEqual(expected, observed) + def test_get_all_queries_with_kwargs(self): + analyzer = EnrouteCollector(FakeQueryService2) + observed = analyzer.get_all() + + expected = { + "get_order": { + GraphQlQueryEnrouteDecorator( + name="order", + argument=GraphQLField(GraphQLString), + output=GraphQLString, + foo="bar", + ) + }, + } + + self.assertEqual(expected, observed) + if __name__ == "__main__": unittest.main() diff --git a/packages/plugins/minos-router-graphql/tests/test_graphql/test_handlers.py b/packages/plugins/minos-router-graphql/tests/test_graphql/test_handlers.py index 9397914d3..d95c2deff 100644 --- a/packages/plugins/minos-router-graphql/tests/test_graphql/test_handlers.py +++ b/packages/plugins/minos-router-graphql/tests/test_graphql/test_handlers.py @@ -16,12 +16,10 @@ ResponseException, ) from minos.plugins.graphql import ( - GraphQlHandler, - GraphQLSchemaBuilder, -) -from minos.plugins.graphql.decorators import ( GraphQlCommandEnrouteDecorator, + GraphQlHandler, GraphQlQueryEnrouteDecorator, + GraphQLSchemaBuilder, ) from tests.test_graphql.test_builders.test_schema import ( callback_fn, diff --git a/packages/plugins/minos-router-graphql/tests/utils.py b/packages/plugins/minos-router-graphql/tests/utils.py index 1963f10da..3d994165e 100644 --- a/packages/plugins/minos-router-graphql/tests/utils.py +++ b/packages/plugins/minos-router-graphql/tests/utils.py @@ -79,6 +79,22 @@ def get_order(self, request: Request): return "eu38hj32-889283-j2jjb5kl" +class FakeQueryService2: + """For testng purposes.""" + + # noinspection PyUnusedLocal + @enroute.graphql.query( + name="order", + argument=GraphQLField(GraphQLString), + output=GraphQLString, + foo="bar", + ) + def get_order(self, request: Request): + """For testng purposes.""" + + return "eu38hj32-889283-j2jjb5kl" + + user_type = GraphQLObjectType( "UserType", { diff --git a/poetry.lock b/poetry.lock index 6609ea7c0..da4f4a2ad 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,6 +1,6 @@ [[package]] name = "aio-pika" -version = "7.1.1" +version = "7.2.0" description = "Wrapper for the aiormq for asyncio and humans." category = "main" optional = false @@ -117,6 +117,23 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "anyio" +version = "3.5.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +category = "main" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["packaging", "sphinx-rtd-theme", "sphinx-autodoc-typehints (>=1.2.0)"] +test = ["coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "pytest (>=6.0)", "pytest-mock (>=3.6.1)", "trustme", "contextlib2", "uvloop (<0.15)", "mock (>=4)", "uvloop (>=0.15)"] +trio = ["trio (>=0.16)"] + [[package]] name = "async-timeout" version = "4.0.2" @@ -149,18 +166,18 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "babel" -version = "2.9.1" +version = "2.10.1" description = "Internationalization utilities" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" [package.dependencies] pytz = ">=2015.7" [[package]] name = "black" -version = "22.1.0" +version = "22.3.0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -171,7 +188,7 @@ click = ">=8.0.0" mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = ">=1.1.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] @@ -192,7 +209,7 @@ python-versions = "*" name = "certifi" version = "2021.10.8" description = "Python package for providing Mozilla's CA Bundle." -category = "dev" +category = "main" optional = false python-versions = "*" @@ -217,11 +234,11 @@ unicode_backport = ["unicodedata2"] [[package]] name = "click" -version = "8.0.4" +version = "8.1.3" description = "Composable command line interface toolkit" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -269,7 +286,7 @@ python-versions = "*" [[package]] name = "dependency-injector" -version = "4.39.0" +version = "4.39.1" description = "Dependency injection framework for Python" category = "main" optional = false @@ -302,7 +319,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "fastavro" -version = "1.4.10" +version = "1.4.11" description = "Fast read/write of AVRO files" category = "main" optional = false @@ -347,9 +364,64 @@ category = "main" optional = false python-versions = ">=3.7" +[[package]] +name = "graphql-core" +version = "3.2.1" +description = "GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL." +category = "main" +optional = false +python-versions = ">=3.6,<4" + +[[package]] +name = "h11" +version = "0.12.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "httpcore" +version = "0.14.7" +description = "A minimal low-level HTTP client." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +anyio = ">=3.0.0,<4.0.0" +certifi = "*" +h11 = ">=0.11,<0.13" +sniffio = ">=1.0.0,<2.0.0" + +[package.extras] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] + +[[package]] +name = "httpx" +version = "0.22.0" +description = "The next generation HTTP client." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +certifi = "*" +charset-normalizer = "*" +httpcore = ">=0.14.5,<0.15.0" +rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]} +sniffio = "*" + +[package.extras] +brotli = ["brotlicffi", "brotli"] +cli = ["click (>=8.0.0,<9.0.0)", "rich (>=10.0.0,<11.0.0)", "pygments (>=2.0.0,<3.0.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] + [[package]] name = "identify" -version = "2.4.12" +version = "2.5.0" description = "File identification library for Python" category = "dev" optional = false @@ -414,7 +486,7 @@ plugins = ["setuptools"] [[package]] name = "jinja2" -version = "3.1.1" +version = "3.1.2" description = "A very fast and expressive template engine." category = "dev" optional = false @@ -475,7 +547,7 @@ python-versions = "*" [[package]] name = "minos-broker-kafka" -version = "0.6.0" +version = "0.7.0" description = "The kafka plugin of the Minos Framework" category = "main" optional = false @@ -486,8 +558,8 @@ develop = true aiokafka = "^0.7.0" cached-property = "^1.5.2" kafka-python = "^2.0.2" -minos-microservice-common = "^0.6.0" -minos-microservice-networks = "^0.6.0" +minos-microservice-common = "^0.7.0*" +minos-microservice-networks = "^0.7.0*" [package.source] type = "directory" @@ -495,7 +567,7 @@ url = "packages/plugins/minos-broker-kafka" [[package]] name = "minos-broker-rabbitmq" -version = "0.6.0" +version = "0.7.0" description = "The rabbitmq plugin of the Minos Framework" category = "main" optional = false @@ -504,17 +576,75 @@ develop = true [package.dependencies] aio-pika = "^7.1.0" -minos-microservice-common = "^0.6.0" -minos-microservice-networks = "^0.6.0" +minos-microservice-common = "^0.7.0*" +minos-microservice-networks = "^0.7.0*" [package.source] type = "directory" url = "packages/plugins/minos-broker-rabbitmq" +[[package]] +name = "minos-database-aiopg" +version = "0.7.0" +description = "The aiopg plugin of the Minos Framework" +category = "main" +optional = false +python-versions = "^3.9" +develop = true + +[package.dependencies] +aiopg = "^1.2.1" +minos-microservice-aggregate = "^0.7.0*" +minos-microservice-common = "^0.7.0*" +minos-microservice-networks = "^0.7.0*" +psycopg2-binary = "^2.9.3" + +[package.source] +type = "directory" +url = "packages/plugins/minos-database-aiopg" + +[[package]] +name = "minos-database-lmdb" +version = "0.7.0" +description = "The lmdb plugin of the Minos Framework" +category = "main" +optional = false +python-versions = "^3.9" +develop = true + +[package.dependencies] +lmdb = "^1.2.1" +minos-microservice-common = "^0.7.0*" +minos-microservice-saga = "^0.7.0*" + +[package.source] +type = "directory" +url = "packages/plugins/minos-database-lmdb" + +[[package]] +name = "minos-discovery-kong" +version = "0.7.0" +description = "The minos-kong plugin offer an interface that permit integrate Minos Microservice with Kong API Gateway" +category = "main" +optional = false +python-versions = "^3.9" +develop = true + +[package.dependencies] +httpx = "^0.22.0" +minos-microservice-common = "^0.7.0*" +minos-microservice-networks = "^0.7.0*" +PyJWT = "^2.3.0" +pytz = "^2022.1" + +[package.source] +type = "directory" +url = "packages/plugins/minos-discovery-kong" + [[package]] name = "minos-discovery-minos" -version = "0.6.0" -description = "The minos-discover plugin of the Minos Framework" +version = "0.7.0" +description = "The minos-discovery plugin of the Minos Framework" category = "main" optional = false python-versions = "^3.9" @@ -522,8 +652,8 @@ develop = true [package.dependencies] aiohttp = "^3.8.1" -minos-microservice-common = "^0.6.0" -minos-microservice-networks = "^0.6.0" +minos-microservice-common = "^0.7.0*" +minos-microservice-networks = "^0.7.0*" [package.source] type = "directory" @@ -531,8 +661,8 @@ url = "packages/plugins/minos-discovery-minos" [[package]] name = "minos-http-aiohttp" -version = "0.6.0" -description = "The aiohttp plugin of the Minos Framework." +version = "0.7.0" +description = "The aiohttp plugin of the Minos Framework" category = "main" optional = false python-versions = "^3.9" @@ -541,8 +671,8 @@ develop = true [package.dependencies] aiohttp = "^3.8.1" cached-property = "^1.5.2" -minos-microservice-common = "^0.6.0" -minos-microservice-networks = "^0.6.0" +minos-microservice-common = "^0.7.0*" +minos-microservice-networks = "^0.7.0*" orjson = "^3.6.7" [package.source] @@ -551,7 +681,7 @@ url = "packages/plugins/minos-http-aiohttp" [[package]] name = "minos-microservice-aggregate" -version = "0.6.0" +version = "0.7.0" description = "The Aggregate pattern of the Minos Framework" category = "main" optional = false @@ -560,9 +690,8 @@ develop = true [package.dependencies] cached-property = "^1.5.2" -minos-microservice-common = "^0.6.0" -minos-microservice-networks = "^0.6.0" -psycopg2-binary = "^2.9.3" +minos-microservice-common = "^0.7.0*" +minos-microservice-networks = "^0.7.0*" [package.source] type = "directory" @@ -570,7 +699,7 @@ url = "packages/core/minos-microservice-aggregate" [[package]] name = "minos-microservice-common" -version = "0.6.0" +version = "0.7.0" description = "The common core of the Minos Framework" category = "main" optional = false @@ -578,12 +707,10 @@ python-versions = "^3.9" develop = true [package.dependencies] -aiomisc = ">=14.0.3,<16.0.0" -aiopg = "^1.2.1" +aiomisc = ">=14.0.3,<15.8.0" cached-property = "^1.5.2" dependency-injector = "^4.32.2" fastavro = "^1.4.0" -lmdb = "^1.2.1" orjson = "^3.5.2" PyYAML = ">=5.4.1,<7.0.0" uvloop = "^0.16.0" @@ -594,7 +721,7 @@ url = "packages/core/minos-microservice-common" [[package]] name = "minos-microservice-cqrs" -version = "0.6.0" +version = "0.7.0" description = "The CQRS pattern of the Minos Framework" category = "main" optional = false @@ -602,9 +729,9 @@ python-versions = "^3.9" develop = true [package.dependencies] -minos-microservice-aggregate = "^0.6.0" -minos-microservice-common = "^0.6.0" -minos-microservice-networks = "^0.6.0" +minos-microservice-aggregate = "^0.7.0*" +minos-microservice-common = "^0.7.0*" +minos-microservice-networks = "^0.7.0*" [package.source] type = "directory" @@ -612,7 +739,7 @@ url = "packages/core/minos-microservice-cqrs" [[package]] name = "minos-microservice-networks" -version = "0.6.0" +version = "0.7.0" description = "The networks core of the Minos Framework" category = "main" optional = false @@ -620,10 +747,8 @@ python-versions = "^3.9" develop = true [package.dependencies] -aiopg = "^1.2.1" crontab = "^0.23.0" -minos-microservice-common = "^0.6.0" -psycopg2-binary = "^2.9.3" +minos-microservice-common = "^0.7.0*" [package.source] type = "directory" @@ -631,7 +756,7 @@ url = "packages/core/minos-microservice-networks" [[package]] name = "minos-microservice-saga" -version = "0.6.0" +version = "0.7.0" description = "The SAGA pattern of the Minos Framework" category = "main" optional = false @@ -640,14 +765,32 @@ develop = true [package.dependencies] cached-property = "^1.5.2" -minos-microservice-aggregate = "^0.6.0" -minos-microservice-common = "^0.6.0" -minos-microservice-networks = "^0.6.0" +minos-microservice-aggregate = "^0.7.0*" +minos-microservice-common = "^0.7.0*" +minos-microservice-networks = "^0.7.0*" [package.source] type = "directory" url = "packages/core/minos-microservice-saga" +[[package]] +name = "minos-router-graphql" +version = "0.7.0" +description = "The graphql plugin of the Minos Framework" +category = "main" +optional = false +python-versions = "^3.9" +develop = true + +[package.dependencies] +graphql-core = "^3.2.0" +minos-microservice-common = "^0.7.0*" +minos-microservice-networks = "^0.7.0*" + +[package.source] +type = "directory" +url = "packages/plugins/minos-router-graphql" + [[package]] name = "mistune" version = "0.8.4" @@ -682,7 +825,7 @@ python-versions = "*" [[package]] name = "orjson" -version = "3.6.7" +version = "3.6.8" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" category = "main" optional = false @@ -721,7 +864,7 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [[package]] name = "pbr" -version = "5.8.1" +version = "5.9.0" description = "Python Build Reasonableness" category = "dev" optional = false @@ -729,15 +872,15 @@ python-versions = ">=2.6" [[package]] name = "platformdirs" -version = "2.5.1" +version = "2.5.2" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" [package.extras] -docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] +test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] [[package]] name = "pluggy" @@ -753,11 +896,11 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "pre-commit" -version = "2.17.0" +version = "2.19.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." category = "dev" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.7" [package.dependencies] cfgv = ">=2.0.0" @@ -801,26 +944,40 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pygments" -version = "2.11.2" +version = "2.12.0" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" + +[[package]] +name = "pyjwt" +version = "2.3.0" +description = "JSON Web Token implementation in Python" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +crypto = ["cryptography (>=3.3.1)"] +dev = ["sphinx", "sphinx-rtd-theme", "zope.interface", "cryptography (>=3.3.1)", "pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)", "mypy", "pre-commit"] +docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] +tests = ["pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)"] [[package]] name = "pyparsing" -version = "3.0.7" -description = "Python parsing module" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.6.8" [package.extras] -diagrams = ["jinja2", "railroad-diagrams"] +diagrams = ["railroad-diagrams", "jinja2"] [[package]] name = "pytest" -version = "7.1.1" +version = "7.1.2" description = "pytest: simple powerful testing with Python" category = "dev" optional = false @@ -843,7 +1000,7 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2. name = "pytz" version = "2022.1" description = "World timezone definitions, modern and historical" -category = "dev" +category = "main" optional = false python-versions = "*" @@ -873,6 +1030,20 @@ urllib3 = ">=1.21.1,<1.27" socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] +[[package]] +name = "rfc3986" +version = "1.5.0" +description = "Validating URI References per RFC 3986" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +idna = {version = "*", optional = true, markers = "extra == \"idna2008\""} + +[package.extras] +idna2008 = ["idna"] + [[package]] name = "six" version = "1.16.0" @@ -881,6 +1052,14 @@ category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +[[package]] +name = "sniffio" +version = "1.2.0" +description = "Sniff out which async library your code is running under" +category = "main" +optional = false +python-versions = ">=3.5" + [[package]] name = "snowballstemmer" version = "2.2.0" @@ -923,18 +1102,18 @@ test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] [[package]] name = "sphinx-autodoc-typehints" -version = "1.17.0" +version = "1.18.1" description = "Type hints (PEP 484) support for the Sphinx autodoc extension" category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] -Sphinx = ">=4" +Sphinx = ">=4.5" [package.extras] -testing = ["covdefaults (>=2)", "coverage (>=6)", "diff-cover (>=6.4)", "nptyping (>=1)", "pytest (>=6)", "pytest-cov (>=3)", "sphobjinv (>=2)", "typing-extensions (>=3.5)"] -type_comments = ["typed-ast (>=1.4.0)"] +testing = ["covdefaults (>=2.2)", "coverage (>=6.3)", "diff-cover (>=6.4)", "nptyping (>=2)", "pytest (>=7.1)", "pytest-cov (>=3)", "sphobjinv (>=2)", "typing-extensions (>=4.1)"] +type_comments = ["typed-ast (>=1.5.2)"] [[package]] name = "sphinx-rtd-theme" @@ -1052,11 +1231,11 @@ python-versions = ">=3.7" [[package]] name = "typing-extensions" -version = "4.1.1" -description = "Backported and Experimental Type Hints for Python 3.6+" +version = "4.2.0" +description = "Backported and Experimental Type Hints for Python 3.7+" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "urllib3" @@ -1086,7 +1265,7 @@ test = ["aiohttp", "flake8 (>=3.9.2,<3.10.0)", "psutil", "pycodestyle (>=2.7.0,< [[package]] name = "virtualenv" -version = "20.14.0" +version = "20.14.1" description = "Virtual Python Environment builder" category = "dev" optional = false @@ -1116,25 +1295,24 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.7.0" +version = "3.8.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "dev" optional = false python-versions = ">=3.7" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] +docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "30fddce08ca9aacf52b35da308a7eb6d6734425b5d5cdc9395d3734effd25e9d" +content-hash = "aaacb6ce77b50b2d9589e233496a4e0af9713e9156ace0f4f12b4dd3a4ebcfef" [metadata.files] aio-pika = [ - {file = "aio-pika-7.1.1.tar.gz", hash = "sha256:8c990642b2906d0ad5af8807855b2b5c400e3b9b3a5bdc64ba98357bd55051f1"}, - {file = "aio_pika-7.1.1-py3-none-any.whl", hash = "sha256:3af44e29fcad19f700d43d17ba2c536bbf763af9b228f6c0d97e5a9fe3c1bbb7"}, + {file = "aio_pika-7.2.0-py3-none-any.whl", hash = "sha256:9b741aa81b3dd3917ec1a4910ab0766e4e568bac498831c6a02f0c96936b2d3c"}, ] aiohttp = [ {file = "aiohttp-3.8.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1ed0b6477896559f17b9eaeb6d38e07f7f9ffe40b9f0f9627ae8b9926ae260a8"}, @@ -1253,6 +1431,10 @@ alabaster = [ {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, ] +anyio = [ + {file = "anyio-3.5.0-py3-none-any.whl", hash = "sha256:b5fa16c5ff93fa1046f2eeb5bbff2dad4d3514d6cda61d02816dba34fa8c3c2e"}, + {file = "anyio-3.5.0.tar.gz", hash = "sha256:a0aeffe2fb1fdf374a8e4b471444f0f3ac4fb9f5a5b542b48824475e0042a5a6"}, +] async-timeout = [ {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, @@ -1266,33 +1448,33 @@ attrs = [ {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] babel = [ - {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"}, - {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, + {file = "Babel-2.10.1-py3-none-any.whl", hash = "sha256:3f349e85ad3154559ac4930c3918247d319f21910d5ce4b25d439ed8693b98d2"}, + {file = "Babel-2.10.1.tar.gz", hash = "sha256:98aeaca086133efb3e1e2aad0396987490c8425929ddbcfe0550184fdc54cd13"}, ] black = [ - {file = "black-22.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1297c63b9e1b96a3d0da2d85d11cd9bf8664251fd69ddac068b98dc4f34f73b6"}, - {file = "black-22.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2ff96450d3ad9ea499fc4c60e425a1439c2120cbbc1ab959ff20f7c76ec7e866"}, - {file = "black-22.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e21e1f1efa65a50e3960edd068b6ae6d64ad6235bd8bfea116a03b21836af71"}, - {file = "black-22.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f69158a7d120fd641d1fa9a921d898e20d52e44a74a6fbbcc570a62a6bc8ab"}, - {file = "black-22.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:228b5ae2c8e3d6227e4bde5920d2fc66cc3400fde7bcc74f480cb07ef0b570d5"}, - {file = "black-22.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b1a5ed73ab4c482208d20434f700d514f66ffe2840f63a6252ecc43a9bc77e8a"}, - {file = "black-22.1.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35944b7100af4a985abfcaa860b06af15590deb1f392f06c8683b4381e8eeaf0"}, - {file = "black-22.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7835fee5238fc0a0baf6c9268fb816b5f5cd9b8793423a75e8cd663c48d073ba"}, - {file = "black-22.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dae63f2dbf82882fa3b2a3c49c32bffe144970a573cd68d247af6560fc493ae1"}, - {file = "black-22.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fa1db02410b1924b6749c245ab38d30621564e658297484952f3d8a39fce7e8"}, - {file = "black-22.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c8226f50b8c34a14608b848dc23a46e5d08397d009446353dad45e04af0c8e28"}, - {file = "black-22.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2d6f331c02f0f40aa51a22e479c8209d37fcd520c77721c034517d44eecf5912"}, - {file = "black-22.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:742ce9af3086e5bd07e58c8feb09dbb2b047b7f566eb5f5bc63fd455814979f3"}, - {file = "black-22.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fdb8754b453fb15fad3f72cd9cad3e16776f0964d67cf30ebcbf10327a3777a3"}, - {file = "black-22.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5660feab44c2e3cb24b2419b998846cbb01c23c7fe645fee45087efa3da2d61"}, - {file = "black-22.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:6f2f01381f91c1efb1451998bd65a129b3ed6f64f79663a55fe0e9b74a5f81fd"}, - {file = "black-22.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:efbadd9b52c060a8fc3b9658744091cb33c31f830b3f074422ed27bad2b18e8f"}, - {file = "black-22.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8871fcb4b447206904932b54b567923e5be802b9b19b744fdff092bd2f3118d0"}, - {file = "black-22.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccad888050f5393f0d6029deea2a33e5ae371fd182a697313bdbd835d3edaf9c"}, - {file = "black-22.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07e5c049442d7ca1a2fc273c79d1aecbbf1bc858f62e8184abe1ad175c4f7cc2"}, - {file = "black-22.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:373922fc66676133ddc3e754e4509196a8c392fec3f5ca4486673e685a421321"}, - {file = "black-22.1.0-py3-none-any.whl", hash = "sha256:3524739d76b6b3ed1132422bf9d82123cd1705086723bc3e235ca39fd21c667d"}, - {file = "black-22.1.0.tar.gz", hash = "sha256:a7c0192d35635f6fc1174be575cb7915e92e5dd629ee79fdaf0dcfa41a80afb5"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"}, + {file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"}, + {file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"}, + {file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"}, + {file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"}, + {file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"}, + {file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"}, + {file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"}, + {file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"}, + {file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"}, + {file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"}, + {file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"}, + {file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"}, + {file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"}, + {file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"}, + {file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"}, + {file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"}, + {file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"}, ] cached-property = [ {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, @@ -1311,8 +1493,8 @@ charset-normalizer = [ {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, ] click = [ - {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"}, - {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, ] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, @@ -1369,42 +1551,42 @@ crontab = [ {file = "crontab-0.23.0.tar.gz", hash = "sha256:ca79dede9c2f572bb32f38703e8fddcf3427e86edc838f2ffe7ae4b9ee2b0733"}, ] dependency-injector = [ - {file = "dependency-injector-4.39.0.tar.gz", hash = "sha256:35d6c03683f512bcc8b0c950890ac40ce19bdacc7de4d59249dd61ed818f0930"}, - {file = "dependency_injector-4.39.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f046a5dbe7e5764fae9a69423f66241a8fdb62acea5c32b0c41a7da94b7f6da3"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfdd78f7d97c1f6ba4a3926a2e404507a4f77ecbd610d4a1b37dedb5c0b57ad1"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:512c23da829bb8ac2ae13f33aa017acf58ae9408e7796a146e1644e8b8471b5b"}, - {file = "dependency_injector-4.39.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7dc81df7f566bfdacdee448bc71085acd163b935860d2b2504b4f32840b3b692"}, - {file = "dependency_injector-4.39.0-cp310-cp310-win32.whl", hash = "sha256:9ffc5393700f45d740abecc50cdc1251eae69e50516ec9d0a48fba0e875ed083"}, - {file = "dependency_injector-4.39.0-cp310-cp310-win_amd64.whl", hash = "sha256:9118f36a3df1e9819074ccb35734d663812c8f6ef81d45c8e4ec81ce5dccac9c"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:1ff723aaf096fabb05cf8b08ba99888538a2a77e03a5082b70cd54eb9df619f3"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bb913900ceb1766f55dc628052d8e191a9c2b1737a0d775fbc230af90ab2c1e"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:329e801eb46b9933432481d3142e563e28a90d77952edac43126264c36ed2278"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1c1a67c699ae2c0234f07d121736fa44e8fe2d56c14b2fd210c3e04a151620bb"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-win32.whl", hash = "sha256:e1347defd46fe9067f857b1174bdb1b19458232ac1a485507df2ddff084cf31c"}, - {file = "dependency_injector-4.39.0-cp36-cp36m-win_amd64.whl", hash = "sha256:9581c4c90f1aaf85ffb9b06bac7ac592df7076522881145321a9dd0702fee828"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8da8ff05fa17e852aa5831a600177e5bb72bf53b8a184f6922ae715387a460ba"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58a56999cebd8b2ba9c19e514e383924865e5f7d6273f8e5b7d85468d9042059"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4914332d6145fb7cfc5f2236a823a3859b92a7e75566ffca0987dcc0f7f7be53"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00aea40ee2d400a8091947ad97cda34b230628aeeac1774f8fa9a3500b5704b2"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-win32.whl", hash = "sha256:b94a64bc73d86d04b33c698fae4b9dad2536a8534ac6922c8226764da5d62d17"}, - {file = "dependency_injector-4.39.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4f59cc0b0d3beb82875d94b7e725b5097a7a454e8e323625ba6ac3095a29300e"}, - {file = "dependency_injector-4.39.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a8d840348f01d997e32394dba36e09c1ecd312b286befb6b3ca27526002ae94"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92097ffabca89d1539e200f91bfa13ff8ca502c9057391c3b78787d50fe502ed"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4a889e116fe76742ef6ff27d5e93ee9e364cbe7bbc6678df8c5dd54597a6fc"}, - {file = "dependency_injector-4.39.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a31e00961fdc1b3808a9e2adeb1107ec4bba0ad3a90b116af9d116a667e4626a"}, - {file = "dependency_injector-4.39.0-cp38-cp38-win32.whl", hash = "sha256:717720a220eee611ea96c0089246ec2103b168303ca2cd2c8a7cd3856da6f689"}, - {file = "dependency_injector-4.39.0-cp38-cp38-win_amd64.whl", hash = "sha256:05c0bbef90182a0d35d4d3f9ab879109070d204394578b12f0eff9eca51987ef"}, - {file = "dependency_injector-4.39.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f10bf8d146edffbee2ba5c5776395625c98048a31997afd481ce27792afee2af"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30c093b155c01e50723e8ecd2a14230daa4417356c8fb5a27369ae5be24b21d9"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dda8a85c8221e6ee433caa01c1bc4fed610381924780e04470572682569cdb8f"}, - {file = "dependency_injector-4.39.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ff8df47a901218a3257650f3f3a6b402dd58cb4f57b4a34d6e8092112f6e8480"}, - {file = "dependency_injector-4.39.0-cp39-cp39-win32.whl", hash = "sha256:e078c84c19ae73883a57e9b35edd843925b2b44833cd098708139a98abee5a96"}, - {file = "dependency_injector-4.39.0-cp39-cp39-win_amd64.whl", hash = "sha256:c02b6796320d6b9363d566045eeec243fa4a412ad68dcc6b2391307e93d0d401"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:865bf5ceba3e32f00e36bfcbefb1267b10df961fb2aab809f5e205968e1cd59b"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ce8645ffd8cc15a7bbd20c02e6439a61c1566a1db22766893bf79981fb89a4e"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dbdab8b024055865926a78ecbc3a6280345f4615e5c505511bbd7c6c322b1796"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:af996d66350704261382dc4e10f324eba5d23e35c04a9e75c7cb58fbea7f1f1d"}, - {file = "dependency_injector-4.39.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d390c6e97fec13fba832b7e39e07c43760ed3d46af4887005f679c0ab6eb9b2e"}, + {file = "dependency-injector-4.39.1.tar.gz", hash = "sha256:9ab76dc5e19b2692aaca49e00f9b41a087138d139b0ec985f92ff0498f038772"}, + {file = "dependency_injector-4.39.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c788a3d5482e63b5fd55e14fc258f1ff0b51b411927ab132ef0f689cb5d1183f"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0832e0457a360725cd1d1037b77b85478aeeaacc60e85ecceeb8020409e7b62"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d51998fff9704fd01d11c3c48f4e88d8506cb6afa1ee41409a881a5a51dae3fc"}, + {file = "dependency_injector-4.39.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea484cd13fc62966bf5582df0816205feee072d18f228aac75f7807b43f223ae"}, + {file = "dependency_injector-4.39.1-cp310-cp310-win32.whl", hash = "sha256:17389e53ec29ca13570319cf2065dcc4c2f6d36db5dd792bb1e8f2c39a9f146b"}, + {file = "dependency_injector-4.39.1-cp310-cp310-win_amd64.whl", hash = "sha256:55b0988489267c5a580f419133770ffe293057f2064da1c9ad6a2cc69666739b"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b297c3e79d3633cc56366386ae1f7dbce1587673cca2f559c368c1e936a1fa94"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2728827c5abb2420c5811e218262ae1b77a48e76cc9eebc6b4f55fee48a1a18d"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:029e42b064ab8cb5b2559be040ff682c7aa81592f1654a82355475956df17803"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:305e3db3f4bf40f64caaa1303e03005174e78d2339d2ae517b34c011ec2300f9"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-win32.whl", hash = "sha256:a661dd23a5e4e2f6bf4a729de7fadbe148c9a4a298dbcadfc5a94584b6930970"}, + {file = "dependency_injector-4.39.1-cp36-cp36m-win_amd64.whl", hash = "sha256:340d6e7af5c4729d20c837d6d1e8a2626c24a05259dff746406cc823e26ba1e7"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a1553dac1c95f0de1f910b0025ee4570ea078a07d576bcdc2168990e719cea50"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c7baaa64d93359ee08c15d68579cc803e11d9becaf961f5a66b94ff627248e1"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7a27bf1951a066cf347b886cc7ab0f37dcbd1ad59bffcfe721c8c12a189a150d"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da6e2d685f7d0c65257f08133b68d9bf74ec319b90a0f21b4f629d168ce5f68f"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-win32.whl", hash = "sha256:a8ddd03ca86e67e9d3cc038793d34fbfccab12e6145df813e72bf14f9371f2ea"}, + {file = "dependency_injector-4.39.1-cp37-cp37m-win_amd64.whl", hash = "sha256:e01a319ea05cd86b520201386dcb53a81a5400cb82fcc2f006bd7e92c0c51a0a"}, + {file = "dependency_injector-4.39.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4704804bde25b694aa65201927937a9d82d8bc055cb3dadc68eb05988bd34fa9"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0935d50b263169e7b0826a2fb6be80d6a4f2a7c59e6dd9876f86da3243bea9eb"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3c34aa5abb1826b6189f47daf6e469d4293c1d01693233da2c1b923816270cc5"}, + {file = "dependency_injector-4.39.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:db64904c9b9a88756cfece3e3ed078a2b57127642711dd08af342dba8abf9667"}, + {file = "dependency_injector-4.39.1-cp38-cp38-win32.whl", hash = "sha256:66ebe728194adc8720dbc4d662edbbfa55659ff23c9c493fb2dae0bfd4df5734"}, + {file = "dependency_injector-4.39.1-cp38-cp38-win_amd64.whl", hash = "sha256:4349974620f630d6726808e1291ec99713b64d449b84eb01581ee807a5a5c224"}, + {file = "dependency_injector-4.39.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d87cad0899b05cd08931bfb68ddf7be77711a67b0649c37f2045d7808977b082"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8efd965e5cfdd9f339ec895e73c119569851adedc175088d34a670f5206fea63"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:27f69485ca6b85c31d162ee86cf6ef71bb71dce9cd2b5d0745425dfc551eefa1"}, + {file = "dependency_injector-4.39.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a25b63de59dff04ec78f5161f00c0222a04a23def5d1f0eda14e389a32baf428"}, + {file = "dependency_injector-4.39.1-cp39-cp39-win32.whl", hash = "sha256:a14274f50d125b4579314c355e22af07def1a96641ca94bd75edcf1400b89477"}, + {file = "dependency_injector-4.39.1-cp39-cp39-win_amd64.whl", hash = "sha256:9950039d00625f9252cd26378a4406342b256886bb61e4db8b65e9f01270f53e"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6d7f39cd54678741e132e13da3a1367ac18058cbda61fe39d61c8583aa6fd757"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2368c7ba3c9ffaf816ea0f2d14c78d481491b805f62ac8496a78a51397d4689"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:84e32407bb16c58aa0d4b5ed8485537bc66ccc14cfffae7022f1204e35ec939a"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f2d80a42c546e1f934d427b071630d86653cd4a60c74b570c4ffb03025c1f1f9"}, + {file = "dependency_injector-4.39.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ca126bbed370b8c002c859ebeb76f6d83eba2d7fb5d66f37f47cfc19661d2889"}, ] distlib = [ {file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"}, @@ -1415,22 +1597,22 @@ docutils = [ {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, ] fastavro = [ - {file = "fastavro-1.4.10-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:f225c81e869b3cefef6f2b478cd452693181ed7e645be3cea4d82024354ecaa0"}, - {file = "fastavro-1.4.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7669302c9124b7cd6c1bdff80c77116b2290c984814077fb7d01d7389586054"}, - {file = "fastavro-1.4.10-cp310-cp310-win_amd64.whl", hash = "sha256:995525bdfbdfef205ea148b5bc6a9fe5ccf921931123c39d9aad75a2b661681e"}, - {file = "fastavro-1.4.10-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:64244c53f1e4853184c2f7383d0332e1dcb34c38c05e6613530ade0378e8acfc"}, - {file = "fastavro-1.4.10-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c60965da6dc7a91e00ccd84d84797fad746555f44e8a816c4cc460fb231c44fe"}, - {file = "fastavro-1.4.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10eb25378f37dc00c10e83c4c0442c1a6d1b871f74a6dfdfc12b6447962bbdd0"}, - {file = "fastavro-1.4.10-cp37-cp37m-win_amd64.whl", hash = "sha256:d5719adf6045fc743de5fa738d561a81e58dc782c94f1b16cb21b5dd6253e7fd"}, - {file = "fastavro-1.4.10-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:24c4a1a8cc92e135ecfcd9cbd1f6cfa088cbc74d78c18e02a609cb11fa33778d"}, - {file = "fastavro-1.4.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0934490b0c3bcfd6bcbacbcb5144c6b5e4298cda209fbb17c856adf5405127dd"}, - {file = "fastavro-1.4.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a23763d73412c077aee401a0368c64cbc23859e26711dbae78a3cf0227f65165"}, - {file = "fastavro-1.4.10-cp38-cp38-win_amd64.whl", hash = "sha256:09f1dfdd8192ae09e0f477d1f024d8054fccdb099ad495d2a796bcee3cadebd1"}, - {file = "fastavro-1.4.10-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:0c6695753fa3035bbd0fa5cb21bf1b5dad39483c669b32ca0bb55fb07c1ccc87"}, - {file = "fastavro-1.4.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35f960dbba04647d8d6d5616f879622d2a1e8a84eb2d2e02a883a22e0803463a"}, - {file = "fastavro-1.4.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9660878ca01e3dbbee12385c5902a2b6b12ecbb5af4733d1026175a14b1ef67f"}, - {file = "fastavro-1.4.10-cp39-cp39-win_amd64.whl", hash = "sha256:64cbd386e408b3bcb2de53b1f847163073eb0d0d0338db65f76051c6ba9a9bc1"}, - {file = "fastavro-1.4.10.tar.gz", hash = "sha256:a24f9dd803c44bfb599476b000f9bd0088f7ac2401e6c20818f38d8af12785a0"}, + {file = "fastavro-1.4.11-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:44f01008f95d685edacc4b10366c755d25612df00924349f7d34a29f08522ce3"}, + {file = "fastavro-1.4.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18f5e736d12e67348f253da8a332d7c3b483ca04f2b6e772befa79d1a46bac9d"}, + {file = "fastavro-1.4.11-cp310-cp310-win_amd64.whl", hash = "sha256:8dca11bc3191cd7de0a3c4b76a70dac493356a219e96ebcde0def1f06faddef7"}, + {file = "fastavro-1.4.11-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:7a2a0bf03686f9d860e8f8476be000f5b3e6cc9af6853dbabab2ef9cfa5dc3a0"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c17e3decfac260e1be4d02d1903d2483eec2f3ce7f92c9b808a0f6a81572c4b"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19ba25c6529f50722a7618cc4ca24c7d265def57fd9f94e4e554e1df8cce38d2"}, + {file = "fastavro-1.4.11-cp37-cp37m-win_amd64.whl", hash = "sha256:ceaba04da9419f40899a670eb62eb373a127b511bb8e3ae4f6f1f23ec49bd0e4"}, + {file = "fastavro-1.4.11-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:732eab3a1ae5d2c3f4b52e747c55bcc41c4df0eb7e8a395038080741a3c0a934"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c03d3c802b71f44e7b3442abae961bba996258244bd222b242ad1e5cb7754e57"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cb7475a9b25b9f8aebe7eb756dafedd0369434571062f3883d894281befd7c"}, + {file = "fastavro-1.4.11-cp38-cp38-win_amd64.whl", hash = "sha256:ce0776f54591aef90bcd02bd919964abe4c2ad2a10a4336c3a1b66cef289b41c"}, + {file = "fastavro-1.4.11-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:621e72cc365c9539d7590e7b43e48a62e6bfb4c2de7c16837fed54d113d7312c"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:842b25782f911ee8c626f9d9fedc2ef01aeac272536fe90ee6d45b2ae7cdb024"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8491bfcba25c9d661289f884688e5a4f56f2ee389a240d0ad02692495a9a087"}, + {file = "fastavro-1.4.11-cp39-cp39-win_amd64.whl", hash = "sha256:c94130a8c8d80073eb0276844915aa5e928ae322024e76dc57943542ccda211c"}, + {file = "fastavro-1.4.11.tar.gz", hash = "sha256:7c64332ad52de0134be9a933ca986514c3ff85c63d54bc5398c31f0498ac1820"}, ] filelock = [ {file = "filelock-3.6.0-py3-none-any.whl", hash = "sha256:f8314284bfffbdcfa0ff3d7992b023d4c628ced6feb957351d4c48d059f56bc0"}, @@ -1501,9 +1683,25 @@ frozenlist = [ {file = "frozenlist-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:772965f773757a6026dea111a15e6e2678fbd6216180f82a48a40b27de1ee2ab"}, {file = "frozenlist-1.3.0.tar.gz", hash = "sha256:ce6f2ba0edb7b0c1d8976565298ad2deba6f8064d2bebb6ffce2ca896eb35b0b"}, ] +graphql-core = [ + {file = "graphql-core-3.2.1.tar.gz", hash = "sha256:9d1bf141427b7d54be944587c8349df791ce60ade2e3cccaf9c56368c133c201"}, + {file = "graphql_core-3.2.1-py3-none-any.whl", hash = "sha256:f83c658e4968998eed1923a2e3e3eddd347e005ac0315fbb7ca4d70ea9156323"}, +] +h11 = [ + {file = "h11-0.12.0-py3-none-any.whl", hash = "sha256:36a3cb8c0a032f56e2da7084577878a035d3b61d104230d4bd49c0c6b555a9c6"}, + {file = "h11-0.12.0.tar.gz", hash = "sha256:47222cb6067e4a307d535814917cd98fd0a57b6788ce715755fa2b6c28b56042"}, +] +httpcore = [ + {file = "httpcore-0.14.7-py3-none-any.whl", hash = "sha256:47d772f754359e56dd9d892d9593b6f9870a37aeb8ba51e9a88b09b3d68cfade"}, + {file = "httpcore-0.14.7.tar.gz", hash = "sha256:7503ec1c0f559066e7e39bc4003fd2ce023d01cf51793e3c173b864eb456ead1"}, +] +httpx = [ + {file = "httpx-0.22.0-py3-none-any.whl", hash = "sha256:e35e83d1d2b9b2a609ef367cc4c1e66fd80b750348b20cc9e19d1952fc2ca3f6"}, + {file = "httpx-0.22.0.tar.gz", hash = "sha256:d8e778f76d9bbd46af49e7f062467e3157a5a3d2ae4876a4bbfd8a51ed9c9cb4"}, +] identify = [ - {file = "identify-2.4.12-py2.py3-none-any.whl", hash = "sha256:5f06b14366bd1facb88b00540a1de05b69b310cbc2654db3c7e07fa3a4339323"}, - {file = "identify-2.4.12.tar.gz", hash = "sha256:3f3244a559290e7d3deb9e9adc7b33594c1bc85a9dd82e0f1be519bf12a1ec17"}, + {file = "identify-2.5.0-py2.py3-none-any.whl", hash = "sha256:3acfe15a96e4272b4ec5662ee3e231ceba976ef63fd9980ed2ce9cc415df393f"}, + {file = "identify-2.5.0.tar.gz", hash = "sha256:c83af514ea50bf2be2c4a3f2fb349442b59dc87284558ae9ff54191bff3541d2"}, ] idna = [ {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, @@ -1526,8 +1724,8 @@ isort = [ {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, ] jinja2 = [ - {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"}, - {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"}, + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, ] kafka-python = [ {file = "kafka-python-2.0.2.tar.gz", hash = "sha256:04dfe7fea2b63726cd6f3e79a2d86e709d608d74406638c5da33a01d45a9d7e3"}, @@ -1614,6 +1812,9 @@ mccabe = [ ] minos-broker-kafka = [] minos-broker-rabbitmq = [] +minos-database-aiopg = [] +minos-database-lmdb = [] +minos-discovery-kong = [] minos-discovery-minos = [] minos-http-aiohttp = [] minos-microservice-aggregate = [] @@ -1621,6 +1822,7 @@ minos-microservice-common = [] minos-microservice-cqrs = [] minos-microservice-networks = [] minos-microservice-saga = [] +minos-router-graphql = [] mistune = [ {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, @@ -1695,38 +1897,38 @@ nodeenv = [ {file = "nodeenv-1.6.0.tar.gz", hash = "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b"}, ] orjson = [ - {file = "orjson-3.6.7-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:93188a9d6eb566419ad48befa202dfe7cd7a161756444b99c4ec77faea9352a4"}, - {file = "orjson-3.6.7-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:82515226ecb77689a029061552b5df1802b75d861780c401e96ca6bc8495f775"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3af57ffab7848aaec6ba6b9e9b41331250b57bf696f9d502bacdc71a0ebab0ba"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:a7297504d1142e7efa236ffc53f056d73934a993a08646dbcee89fc4308a8fcf"}, - {file = "orjson-3.6.7-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:5a50cde0dbbde255ce751fd1bca39d00ecd878ba0903c0480961b31984f2fab7"}, - {file = "orjson-3.6.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d21f9a2d1c30e58070f93988db4cad154b9009fafbde238b52c1c760e3607fbe"}, - {file = "orjson-3.6.7-cp310-none-win_amd64.whl", hash = "sha256:e152464c4606b49398afd911777decebcf9749cc8810c5b4199039e1afb0991e"}, - {file = "orjson-3.6.7-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:0a65f3c403f38b0117c6dd8e76e85a7bd51fcd92f06c5598dfeddbc44697d3e5"}, - {file = "orjson-3.6.7-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:6c47cfca18e41f7f37b08ff3e7abf5ada2d0f27b5ade934f05be5fc5bb956e9d"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:63185af814c243fad7a72441e5f98120c9ecddf2675befa486d669fb65539e9b"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2da6fde42182b80b40df2e6ab855c55090ebfa3fcc21c182b7ad1762b61d55c"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:48c5831ec388b4e2682d4ff56d6bfa4a2ef76c963f5e75f4ff4785f9cf338a80"}, - {file = "orjson-3.6.7-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:913fac5d594ccabf5e8fbac15b9b3bb9c576d537d49eeec9f664e7a64dde4c4b"}, - {file = "orjson-3.6.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:58f244775f20476e5851e7546df109f75160a5178d44257d437ba6d7e562bfe8"}, - {file = "orjson-3.6.7-cp37-none-win_amd64.whl", hash = "sha256:2d5f45c6b85e5f14646df2d32ecd7ff20fcccc71c0ea1155f4d3df8c5299bbb7"}, - {file = "orjson-3.6.7-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:612d242493afeeb2068bc72ff2544aa3b1e627578fcf92edee9daebb5893ffea"}, - {file = "orjson-3.6.7-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:539cdc5067db38db27985e257772d073cd2eb9462d0a41bde96da4e4e60bd99b"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6d103b721bbc4f5703f62b3882e638c0b65fcdd48622531c7ffd45047ef8e87c"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb10a20f80e95102dd35dfbc3a22531661b44a09b55236b012a446955846b023"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:bb68d0da349cf8a68971a48ad179434f75256159fe8b0715275d9b49fa23b7a3"}, - {file = "orjson-3.6.7-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:4a2c7d0a236aaeab7f69c17b7ab4c078874e817da1bfbb9827cb8c73058b3050"}, - {file = "orjson-3.6.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3be045ca3b96119f592904cf34b962969ce97bd7843cbfca084009f6c8d2f268"}, - {file = "orjson-3.6.7-cp38-none-win_amd64.whl", hash = "sha256:bd765c06c359d8a814b90f948538f957fa8a1f55ad1aaffcdc5771996aaea061"}, - {file = "orjson-3.6.7-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:7dd9e1e46c0776eee9e0649e3ae9584ea368d96851bcaeba18e217fa5d755283"}, - {file = "orjson-3.6.7-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:c4b4f20a1e3df7e7c83717aff0ef4ab69e42ce2fb1f5234682f618153c458406"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7107a5673fd0b05adbb58bf71c1578fc84d662d29c096eb6d998982c8635c221"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a08b6940dd9a98ccf09785890112a0f81eadb4f35b51b9a80736d1725437e22c"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:f5d1648e5a9d1070f3628a69a7c6c17634dbb0caf22f2085eca6910f7427bf1f"}, - {file = "orjson-3.6.7-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:e6201494e8dff2ce7fd21da4e3f6dfca1a3fed38f9dcefc972f552f6596a7621"}, - {file = "orjson-3.6.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:70d0386abe02879ebaead2f9632dd2acb71000b4721fd8c1a2fb8c031a38d4d5"}, - {file = "orjson-3.6.7-cp39-none-win_amd64.whl", hash = "sha256:d9a3288861bfd26f3511fb4081561ca768674612bac59513cb9081bb61fcc87f"}, - {file = "orjson-3.6.7.tar.gz", hash = "sha256:a4bb62b11289b7620eead2f25695212e9ac77fcfba76f050fa8a540fb5c32401"}, + {file = "orjson-3.6.8-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:3a287a650458de2211db03681b71c3e5cb2212b62f17a39df8ad99fc54855d0f"}, + {file = "orjson-3.6.8-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:5204e25c12cea58e524fc82f7c27ed0586f592f777b33075a92ab7b3eb3687c2"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77e8386393add64f959c044e0fb682364fd0e611a6f477aa13f0e6a733bd6a28"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:279f2d2af393fdf8601020744cb206b91b54ad60fb8401e0761819c7bda1f4e4"}, + {file = "orjson-3.6.8-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:c31c9f389be7906f978ed4192eb58a4b74a37ad60556a0b88ddc47c576697770"}, + {file = "orjson-3.6.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0db5c5a0c5b89f092d52f6e5a3701660a9d6ffa9e2968b3ce17c2bc4f5eb0414"}, + {file = "orjson-3.6.8-cp310-none-win_amd64.whl", hash = "sha256:eb22485847b9a0c4bbedc668df860126ac931edbed1d456cf41a59f3cb961ed8"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:1a5fe569310bc819279bd4d5f2c349910b104ed3207936246dd5d5e0b085e74a"}, + {file = "orjson-3.6.8-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:ccb356a47ab1067cd3549847e9db1d279a63fe0482d315b3ffd6e7abef35ef77"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab29c069c222248ce302a25855b4e1664f9436e8ae5a131fb0859daf31676d2b"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2b5e4cba9e774ac011071d9d27760f97f4b8cd46003e971d122e712f971345"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:c311ec504414d22834d5b972a209619925b48263856a11a14d90230f9682d49c"}, + {file = "orjson-3.6.8-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:a3dfec7950b90fb8d143743503ee53fa06b32e6068bdea792fc866284da3d71d"}, + {file = "orjson-3.6.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b890dbbada2cbb26eb29bd43a848426f007f094bb0758df10dfe7a438e1cb4b4"}, + {file = "orjson-3.6.8-cp37-none-win_amd64.whl", hash = "sha256:9143ae2c52771525be9ad11a7a8cc8e7fd75391b107e7e644a9e0050496f6b4f"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:33a82199fd42f6436f833e210ae5129c922a5c355629356ca7a8e82964da7285"}, + {file = "orjson-3.6.8-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:90159ea8b9a5a2a98fa33dc7b421cfac4d2ae91ba5e1058f5909e7f059f6b467"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:656fbe15d9ef0733e740d9def78f4fdb4153102f4836ee774a05123499005931"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7be3be6153843e0f01351b1313a5ad4723595427680dac2dfff22a37e652ce02"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:dd24f66b6697ee7424f7da575ec6cbffc8ede441114d53470949cda4d97c6e56"}, + {file = "orjson-3.6.8-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:b07c780f7345ecf5901356dc21dee0669defc489c38ce7b9ab0f5e008cc0385c"}, + {file = "orjson-3.6.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ea32015a5d8a4ce00d348a0de5dc7040e0ad58f970a8fcbb5713a1eac129e493"}, + {file = "orjson-3.6.8-cp38-none-win_amd64.whl", hash = "sha256:c5a3e382194c838988ec128a26b08aa92044e5e055491cc4056142af0c1c54d7"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:83a8424e857ae1bf53530e88b4eb2f16ca2b489073b924e655f1575cacd7f52a"}, + {file = "orjson-3.6.8-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:81e1a6a2d67f15007dadacbf9ba5d3d79237e5e33786c028557fe5a2b72f1c9a"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:137b539881c77866eba86ff6a11df910daf2eb9ab8f1acae62f879e83d7c38af"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cbd358f3b3ad539a27e36900e8e7d172d0e1b72ad9dd7d69544dcbc0f067ee7"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:6ab94701542d40b90903ecfc339333f458884979a01cb9268bc662cc67a5f6d8"}, + {file = "orjson-3.6.8-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:32b6f26593a9eb606b40775826beb0dac152e3d224ea393688fced036045a821"}, + {file = "orjson-3.6.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:afd9e329ebd3418cac3cd747769b1d52daa25fa672bbf414ab59f0e0881b32b9"}, + {file = "orjson-3.6.8-cp39-none-win_amd64.whl", hash = "sha256:0c89b419914d3d1f65a1b0883f377abe42a6e44f6624ba1c63e8846cbfc2fa60"}, + {file = "orjson-3.6.8.tar.gz", hash = "sha256:e19d23741c5de13689bb316abfccea15a19c264e3ec8eb332a5319a583595ace"}, ] packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, @@ -1740,20 +1942,20 @@ pathspec = [ {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, ] pbr = [ - {file = "pbr-5.8.1-py2.py3-none-any.whl", hash = "sha256:27108648368782d07bbf1cb468ad2e2eeef29086affd14087a6d04b7de8af4ec"}, - {file = "pbr-5.8.1.tar.gz", hash = "sha256:66bc5a34912f408bb3925bf21231cb6f59206267b7f63f3503ef865c1a292e25"}, + {file = "pbr-5.9.0-py2.py3-none-any.whl", hash = "sha256:e547125940bcc052856ded43be8e101f63828c2d94239ffbe2b327ba3d5ccf0a"}, + {file = "pbr-5.9.0.tar.gz", hash = "sha256:e8dca2f4b43560edef58813969f52a56cef023146cbb8931626db80e6c1c4308"}, ] platformdirs = [ - {file = "platformdirs-2.5.1-py3-none-any.whl", hash = "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"}, - {file = "platformdirs-2.5.1.tar.gz", hash = "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d"}, + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, ] pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] pre-commit = [ - {file = "pre_commit-2.17.0-py2.py3-none-any.whl", hash = "sha256:725fa7459782d7bec5ead072810e47351de01709be838c2ce1726b9591dad616"}, - {file = "pre_commit-2.17.0.tar.gz", hash = "sha256:c1a8040ff15ad3d648c70cc3e55b93e4d2d5b687320955505587fd79bbaed06a"}, + {file = "pre_commit-2.19.0-py2.py3-none-any.whl", hash = "sha256:10c62741aa5704faea2ad69cb550ca78082efe5697d6f04e5710c3c229afdd10"}, + {file = "pre_commit-2.19.0.tar.gz", hash = "sha256:4233a1e38621c87d9dda9808c6606d7e7ba0e087cd56d3fe03202a01d2919615"}, ] psycopg2-binary = [ {file = "psycopg2-binary-2.9.3.tar.gz", hash = "sha256:761df5313dc15da1502b21453642d7599d26be88bff659382f8f9747c7ebea4e"}, @@ -1826,16 +2028,20 @@ pyflakes = [ {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, ] pygments = [ - {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"}, - {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"}, + {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, + {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, +] +pyjwt = [ + {file = "PyJWT-2.3.0-py3-none-any.whl", hash = "sha256:e0c4bb8d9f0af0c7f5b1ec4c5036309617d03d56932877f2f7a0beeb5318322f"}, + {file = "PyJWT-2.3.0.tar.gz", hash = "sha256:b888b4d56f06f6dcd777210c334e69c737be74755d3e5e9ee3fe67dc18a0ee41"}, ] pyparsing = [ - {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"}, - {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, ] pytest = [ - {file = "pytest-7.1.1-py3-none-any.whl", hash = "sha256:92f723789a8fdd7180b6b06483874feca4c48a5c76968e03bb3e7f806a1869ea"}, - {file = "pytest-7.1.1.tar.gz", hash = "sha256:841132caef6b1ad17a9afde46dc4f6cfa59a05f9555aae5151f73bdf2820ca63"}, + {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, + {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"}, ] pytz = [ {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"}, @@ -1880,10 +2086,18 @@ requests = [ {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, ] +rfc3986 = [ + {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, + {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, +] six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +sniffio = [ + {file = "sniffio-1.2.0-py3-none-any.whl", hash = "sha256:471b71698eac1c2112a40ce2752bb2f4a4814c22a54a3eed3676bc0f5ca9f663"}, + {file = "sniffio-1.2.0.tar.gz", hash = "sha256:c4666eecec1d3f50960c6bdf61ab7bc350648da6c126e3cf6898d8cd4ddcd3de"}, +] snowballstemmer = [ {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, @@ -1893,8 +2107,8 @@ sphinx = [ {file = "Sphinx-4.5.0.tar.gz", hash = "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6"}, ] sphinx-autodoc-typehints = [ - {file = "sphinx_autodoc_typehints-1.17.0-py3-none-any.whl", hash = "sha256:081daf53077b4ae1c28347d6d858e13e63aefe3b4aacef79fd717dd60687b470"}, - {file = "sphinx_autodoc_typehints-1.17.0.tar.gz", hash = "sha256:51c7b3f5cb9ccd15d0b52088c62df3094f1abd9612930340365c26def8629a14"}, + {file = "sphinx_autodoc_typehints-1.18.1-py3-none-any.whl", hash = "sha256:f8f5bb7c13a9a71537dc2be2eb3b9e28a9711e2454df63587005eacf6fbac453"}, + {file = "sphinx_autodoc_typehints-1.18.1.tar.gz", hash = "sha256:07631c5f0c6641e5ba27143494aefc657e029bed3982138d659250e617f6f929"}, ] sphinx-rtd-theme = [ {file = "sphinx_rtd_theme-1.0.0-py2.py3-none-any.whl", hash = "sha256:4d35a56f4508cfee4c4fb604373ede6feae2a306731d533f409ef5c3496fdbd8"}, @@ -1937,8 +2151,8 @@ tomli = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] typing-extensions = [ - {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, - {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, + {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, + {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, ] urllib3 = [ {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, @@ -1963,8 +2177,8 @@ uvloop = [ {file = "uvloop-0.16.0.tar.gz", hash = "sha256:f74bc20c7b67d1c27c72601c78cf95be99d5c2cdd4514502b4f3eb0933ff1228"}, ] virtualenv = [ - {file = "virtualenv-20.14.0-py2.py3-none-any.whl", hash = "sha256:1e8588f35e8b42c6ec6841a13c5e88239de1e6e4e4cedfd3916b306dc826ec66"}, - {file = "virtualenv-20.14.0.tar.gz", hash = "sha256:8e5b402037287126e81ccde9432b95a8be5b19d36584f64957060a3488c11ca8"}, + {file = "virtualenv-20.14.1-py2.py3-none-any.whl", hash = "sha256:e617f16e25b42eb4f6e74096b9c9e37713cf10bf30168fb4a739f3fa8f898a3a"}, + {file = "virtualenv-20.14.1.tar.gz", hash = "sha256:ef589a79795589aada0c1c5b319486797c03b67ac3984c48c669c0e4f50df3a5"}, ] yarl = [ {file = "yarl-1.7.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f2a8508f7350512434e41065684076f640ecce176d262a7d54f0da41d99c5a95"}, @@ -2041,6 +2255,6 @@ yarl = [ {file = "yarl-1.7.2.tar.gz", hash = "sha256:45399b46d60c253327a460e99856752009fcee5f5d3c80b2f7c0cae1c38d56dd"}, ] zipp = [ - {file = "zipp-3.7.0-py3-none-any.whl", hash = "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375"}, - {file = "zipp-3.7.0.tar.gz", hash = "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d"}, + {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, + {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"}, ] diff --git a/pyproject.toml b/pyproject.toml index afca500c3..4a274b72e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "minos-python" -version = "0.1.0" +version = "0.7.0" description = "" authors = ["Minos Framework Devs "] license = "MIT" @@ -13,19 +13,23 @@ minos-microservice-aggregate = { path = "packages/core/minos-microservice-aggreg minos-microservice-saga = { path = "packages/core/minos-microservice-saga", develop = true } minos-microservice-cqrs = { path = "packages/core/minos-microservice-cqrs", develop = true } minos-broker-kafka = { path = "packages/plugins/minos-broker-kafka", develop = true } -minos-discovery-minos = { path = "packages/plugins/minos-discovery-minos", develop = true } minos-broker-rabbitmq = { path = "packages/plugins/minos-broker-rabbitmq", develop = true } +minos-database-aiopg = { path = "packages/plugins/minos-database-aiopg", develop = true } +minos-database-lmdb = { path = "packages/plugins/minos-database-lmdb", develop = true } +minos-discovery-minos = { path = "packages/plugins/minos-discovery-minos", develop = true } +minos-discovery-kong = { path = "packages/plugins/minos-discovery-kong", develop = true } minos-http-aiohttp = { path = "packages/plugins/minos-http-aiohttp", develop = true } +minos-router-graphql = { path = "packages/plugins/minos-router-graphql", develop = true } [tool.poetry.dev-dependencies] -black = "^22.1" +black = "^22.3" isort = "^5.8.0" -pytest = "^7.0.1" +pytest = "^7.1.2" coverage = "^6.3" flake8 = "^4.0.1" Sphinx = "^4.0.1" -pre-commit = "^2.12.1" -sphinx-autodoc-typehints = "^1.17.0" +pre-commit = "^2.18.1" +sphinx-autodoc-typehints = "^1.18.1" sphinxcontrib-apidoc = "^0.3.0" sphinx-rtd-theme = "^1.0.0" m2r2 = "^0.3.2"