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
+[](https://github.com/minos-framework/minos-python/stargazers)
[](https://pypi.org/project/minos-microservice-common/)
[](https://minos-framework.github.io/minos-python)
[](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-python: The framework which helps you create reactive microservices in Python
+
+[](https://github.com/minos-framework/minos-python/stargazers)
+[](https://pypi.org/project/minos-microservice-common/)
+[](https://minos-framework.github.io/minos-python)
+[](https://github.com/minos-framework/minos-python/blob/main/LICENSE)
+[](https://codecov.io/gh/minos-framework/minos-python)
+[](https://stackoverflow.com/questions/tagged/minos)
+[](https://gitter.im/minos-framework/community)
+[](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-database-aiopg
+
+[](https://pypi.org/project/minos-database-aiopg/)
+[](https://minos-framework.github.io/minos-python)
+[](https://github.com/minos-framework/minos-python/blob/main/LICENSE)
+[](https://codecov.io/gh/minos-framework/minos-python)
+[](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-database-lmdb
+
+[](https://pypi.org/project/minos-database-lmdb/)
+[](https://minos-framework.github.io/minos-python)
+[](https://github.com/minos-framework/minos-python/blob/main/LICENSE)
+[](https://codecov.io/gh/minos-framework/minos-python)
+[](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-kong
+
+[](https://pypi.org/project/minos-kong/)
+[](https://minos-framework.github.io/minos-python)
+[](https://github.com/minos-framework/minos-python/blob/main/LICENSE)
+[](https://codecov.io/gh/minos-framework/minos-python)
+[](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"