diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index bd9530277..7d9141096 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -15,7 +15,7 @@ jobs: uses: actions/checkout@v2 - name: Install Poetry - uses: snok/install-poetry@v1.1.4 + uses: snok/install-poetry@v1 - name: Install dependencies run: make install diff --git a/.github/workflows/minos-broker-kafka-publish.yml b/.github/workflows/minos-broker-kafka-publish.yml new file mode 100644 index 000000000..ce9994140 --- /dev/null +++ b/.github/workflows/minos-broker-kafka-publish.yml @@ -0,0 +1,33 @@ +name: "Publish: minos-broker-kafka" + +on: + push: + branches: + - '*.*.x' + paths: + - 'packages/plugins/minos-broker-kafka/**' + +jobs: + deploy: + runs-on: ubuntu-latest + container: python:3.9-buster + defaults: + run: + working-directory: packages/plugins/minos-broker-kafka + + 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-broker-kafka-tests.yml b/.github/workflows/minos-broker-kafka-tests.yml new file mode 100644 index 000000000..9fca0d856 --- /dev/null +++ b/.github/workflows/minos-broker-kafka-tests.yml @@ -0,0 +1,79 @@ +name: "Test: minos-broker-kafka" + +on: + push: + branches: + - main + - '*.*.x' + pull_request: + paths: + - 'packages/plugins/minos-broker-kafka/**' + - '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-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: + - 2181:2181 + + kafka: + image: wurstmeister/kafka:latest + ports: + - 9092:9092 + env: + KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 + 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 + 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-broker-kafka/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-minos-publish.yml b/.github/workflows/minos-discovery-minos-publish.yml new file mode 100644 index 000000000..a46234289 --- /dev/null +++ b/.github/workflows/minos-discovery-minos-publish.yml @@ -0,0 +1,33 @@ +name: "Publish: minos-discovery-minos" + +on: + push: + branches: + - '*.*.x' + paths: + - 'packages/plugins/minos-discovery-minos/**' + +jobs: + deploy: + runs-on: ubuntu-latest + container: python:3.9-buster + defaults: + run: + working-directory: packages/plugins/minos-discovery-minos + + 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-minos-tests.yml b/.github/workflows/minos-discovery-minos-tests.yml new file mode 100644 index 000000000..ba5e9a6f6 --- /dev/null +++ b/.github/workflows/minos-discovery-minos-tests.yml @@ -0,0 +1,49 @@ +name: "Test: minos-discovery-minos" + +on: + push: + branches: + - main + - '*.*.x' + pull_request: + paths: + - 'packages/plugins/minos-discovery-minos/**' + - '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-discovery-minos + + 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-discovery-minos/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-microservice-aggregate-tests.yml b/.github/workflows/minos-microservice-aggregate-tests.yml index e452e4b1c..1c731a5dc 100644 --- a/.github/workflows/minos-microservice-aggregate-tests.yml +++ b/.github/workflows/minos-microservice-aggregate-tests.yml @@ -4,6 +4,7 @@ on: push: branches: - main + - '*.*.x' pull_request: paths: - 'packages/core/minos-microservice-aggregate/**' diff --git a/.github/workflows/minos-microservice-common-publish.yml b/.github/workflows/minos-microservice-common-publish.yml index cbf606ea7..13b756af0 100644 --- a/.github/workflows/minos-microservice-common-publish.yml +++ b/.github/workflows/minos-microservice-common-publish.yml @@ -21,7 +21,7 @@ jobs: uses: actions/checkout@v2 - name: Install Poetry - uses: snok/install-poetry@v1.1.4 + uses: snok/install-poetry@v1 - name: Install dependencies run: make install diff --git a/.github/workflows/minos-microservice-common-tests.yml b/.github/workflows/minos-microservice-common-tests.yml index 09f420aff..637130b43 100644 --- a/.github/workflows/minos-microservice-common-tests.yml +++ b/.github/workflows/minos-microservice-common-tests.yml @@ -4,6 +4,7 @@ on: push: branches: - main + - '*.*.x' pull_request: paths: - 'packages/core/minos-microservice-common/**' @@ -37,7 +38,7 @@ jobs: uses: actions/checkout@v2 - name: Install Poetry - uses: snok/install-poetry@v1.1.4 + uses: snok/install-poetry@v1 - name: Install dependencies run: make install diff --git a/.github/workflows/minos-microservice-cqrs-publish.yml b/.github/workflows/minos-microservice-cqrs-publish.yml index 2b2705c26..8c18da944 100644 --- a/.github/workflows/minos-microservice-cqrs-publish.yml +++ b/.github/workflows/minos-microservice-cqrs-publish.yml @@ -21,7 +21,7 @@ jobs: uses: actions/checkout@v2 - name: Install Poetry - uses: snok/install-poetry@v1.1.4 + uses: snok/install-poetry@v1 - name: Install dependencies run: make install diff --git a/.github/workflows/minos-microservice-cqrs-tests.yml b/.github/workflows/minos-microservice-cqrs-tests.yml index 43c3672fc..dc2644ba4 100644 --- a/.github/workflows/minos-microservice-cqrs-tests.yml +++ b/.github/workflows/minos-microservice-cqrs-tests.yml @@ -4,6 +4,7 @@ on: push: branches: - main + - '*.*.x' pull_request: paths: - 'packages/core/minos-microservice-cqrs/**' @@ -40,7 +41,7 @@ jobs: uses: actions/checkout@v2 - name: Install Poetry - uses: snok/install-poetry@v1.1.4 + uses: snok/install-poetry@v1 - name: Install dependencies run: make install diff --git a/.github/workflows/minos-microservice-networks-publish.yml b/.github/workflows/minos-microservice-networks-publish.yml index 7ca379b3d..9b382cba7 100644 --- a/.github/workflows/minos-microservice-networks-publish.yml +++ b/.github/workflows/minos-microservice-networks-publish.yml @@ -21,7 +21,7 @@ jobs: uses: actions/checkout@v2 - name: Install Poetry - uses: snok/install-poetry@v1.1.4 + uses: snok/install-poetry@v1 - name: Install dependencies run: make install diff --git a/.github/workflows/minos-microservice-networks-tests.yml b/.github/workflows/minos-microservice-networks-tests.yml index 1226367fc..49a642b3e 100644 --- a/.github/workflows/minos-microservice-networks-tests.yml +++ b/.github/workflows/minos-microservice-networks-tests.yml @@ -4,6 +4,7 @@ on: push: branches: - main + - '*.*.x' pull_request: paths: - 'packages/core/minos-microservice-networks/**' @@ -28,19 +29,6 @@ jobs: - 5432:5432 options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 - zookeeper: - image: wurstmeister/zookeeper:latest - ports: - - 2181:2181 - - kafka: - image: wurstmeister/kafka:latest - ports: - - 9092:9092 - env: - KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 - KAFKA_ADVERTISED_HOST_NAME: kafka - KAFKA_DELETE_TOPIC_ENABLE: "true" env: MINOS_BROKER_QUEUE_HOST: postgres MINOS_BROKER_HOST: kafka @@ -52,7 +40,7 @@ jobs: uses: actions/checkout@v2 - name: Install Poetry - uses: snok/install-poetry@v1.1.4 + uses: snok/install-poetry@v1 - name: Install dependencies run: make install diff --git a/.github/workflows/minos-microservice-saga-publish.yml b/.github/workflows/minos-microservice-saga-publish.yml index 874720403..67e1be47d 100644 --- a/.github/workflows/minos-microservice-saga-publish.yml +++ b/.github/workflows/minos-microservice-saga-publish.yml @@ -21,7 +21,7 @@ jobs: uses: actions/checkout@v2 - name: Install Poetry - uses: snok/install-poetry@v1.1.4 + uses: snok/install-poetry@v1 - name: Install dependencies run: make install diff --git a/.github/workflows/minos-microservice-saga-tests.yml b/.github/workflows/minos-microservice-saga-tests.yml index 204d4bebd..dbd6cad17 100644 --- a/.github/workflows/minos-microservice-saga-tests.yml +++ b/.github/workflows/minos-microservice-saga-tests.yml @@ -4,6 +4,7 @@ on: push: branches: - main + - '*.*.x' pull_request: paths: - 'packages/core/minos-microservice-saga/**' @@ -24,7 +25,7 @@ jobs: uses: actions/checkout@v2 - name: Install Poetry - uses: snok/install-poetry@v1.1.4 + uses: snok/install-poetry@v1 - name: Install dependencies run: make install diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 000000000..af1dfda3b --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,45 @@ +repos: + - repo: local + hooks: + + - id: minos-microservice-aggregate-check + pass_filenames: false + entry: make --directory=packages/core/minos-microservice-aggregate check + name: Check minos-microservice-aggregate + files: ^packages/core/minos-microservice-aggregate/ + language: system + + - id: minos-microservice-common-check + pass_filenames: false + entry: make --directory=packages/core/minos-microservice-common check + name: Check minos-microservice-common + files: ^packages/core/minos-microservice-common/ + language: system + + - id: minos-microservice-cqrs-check + pass_filenames: false + entry: make --directory=packages/core/minos-microservice-cqrs check + name: Check minos-microservice-cqrs + files: ^packages/core/minos-microservice-cqrs/ + language: system + + - id: minos-microservice-networks-check + pass_filenames: false + entry: make --directory=packages/core/minos-microservice-networks check + name: Check minos-microservice-networks + files: ^packages/core/minos-microservice-networks/ + language: system + + - id: minos-microservice-saga-check + pass_filenames: false + entry: make --directory=packages/core/minos-microservice-saga check + name: Check minos-microservice-saga + files: ^packages/core/minos-microservice-saga/ + language: system + + - id: minos-broker-kafka-check + pass_filenames: false + entry: make --directory=packages/plugins/minos-broker-kafka check + name: Check minos-broker-kafka + files: ^packages/plugins/minos-broker-kafka/ + language: system diff --git a/.sonarcloud.properties b/.sonarcloud.properties new file mode 100644 index 000000000..f1bc3af52 --- /dev/null +++ b/.sonarcloud.properties @@ -0,0 +1 @@ +sonar.python.version=3.9 diff --git a/Makefile b/Makefile index 8096991b5..f5917a4f5 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,7 @@ 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 @@ -23,4 +24,10 @@ docs: $(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 - poetry run $(MAKE) --directory=docs html \ No newline at end of file + $(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-discovery-minos install docs + cp -R packages/plugins/minos-discovery-minos/docs/_build/html $(DOCS_TARGET)/plugins/minos-discovery-minos + + poetry run $(MAKE) --directory=docs html diff --git a/README.md b/README.md index 735c7a8f5..af65375f1 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,1091 @@ -

Minos logo

# minos-python: The framework which helps you create reactive microservices in Python -[![PyPI Latest Release](https://img.shields.io/pypi/v/minos-microservice-aggregate.svg?label=minos-microservice-aggregate)](https://pypi.org/project/minos-microservice-aggregate/) -[![PyPI Latest Release](https://img.shields.io/pypi/v/minos-microservice-common.svg?label=minos-microservice-common)](https://pypi.org/project/minos-microservice-common/) -[![PyPI Latest Release](https://img.shields.io/pypi/v/minos-microservice-cqrs.svg?label=minos-microservice-cqrs)](https://pypi.org/project/minos-microservice-cqrs/) -[![PyPI Latest Release](https://img.shields.io/pypi/v/minos-microservice-networks.svg?label=minos-microservice-networks)](https://pypi.org/project/minos-microservice-networks/) -[![PyPI Latest Release](https://img.shields.io/pypi/v/minos-microservice-saga.svg?label=minos-microservice-saga)](https://pypi.org/project/minos-microservice-saga/) + +[![PyPI Latest Release](https://img.shields.io/pypi/v/minos-microservice-common.svg)](https://pypi.org/project/minos-microservice-common/) [![GitHub Workflow Status](https://img.shields.io/github/workflow/status/minos-framework/minos-python/pages%20build%20and%20deployment?label=docs)](https://minos-framework.github.io/minos-python) [![License](https://img.shields.io/github/license/minos-framework/minos-python.svg)](https://github.com/minos-framework/minos-python/blob/main/LICENSE) [![Coverage](https://codecov.io/github/minos-framework/minos-python/coverage.svg?branch=main)](https://codecov.io/gh/minos-framework/minos-python) [![Stack Overflow](https://img.shields.io/badge/Stack%20Overflow-Ask%20a%20question-green)](https://stackoverflow.com/questions/tagged/minos) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/minos-framework/community) +[![Tokei](https://tokei.rs/b1/github/minos-framework/minos-python?category=code)](https://github.com/minos-framework/minos-python) ## Summary -Minos is a framework which helps you create [reactive](https://www.reactivemanifesto.org/) microservices in Python. -Internally, it leverages Event Sourcing, CQRS and a message driven architecture to fulfil the commitments of an -asynchronous environment. +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. -## Documentation +### Roadmap + +#### 0.6.x +* [#78](https://github.com/minos-framework/minos-python/issues/78) Implement a circuit breaker for `minos-broker-kafka`. +* [#87](https://github.com/minos-framework/minos-python/issues/87) Implement idempotency for `BrokerSubscriber` message processing. +* [#100](https://github.com/minos-framework/minos-python/issues/100) Create the `minos-serializers-avro` plugin. +* [#148](https://github.com/minos-framework/minos-python/issues/148) Create the `minos-rest-aiohttp`. +* [#149](https://github.com/minos-framework/minos-python/issues/149) Add `minos-graphql-aiohttp` plugin. +* [#150](https://github.com/minos-framework/minos-python/issues/150) Refactor configuration file and `MinosConfig` accessor. +* [#151](https://github.com/minos-framework/minos-python/issues/151) Expose `OpenAPI` and `AsyncAPI` specifications. +* [#152](https://github.com/minos-framework/minos-python/issues/152) Provide a testing suite to test the microservice. + +## Foundational Patterns + +The `minos` framework is built strongly inspired by the following set of patterns: + +* [Microservice architecture](https://microservices.io/patterns/microservices.html): Architect an application as a collection of loosely coupled services. +* [Decompose by subdomain](https://microservices.io/patterns/decomposition/decompose-by-subdomain.html): Define services corresponding to Domain-Driven Design (DDD) subdomains +* [Self-contained Service](https://microservices.io/patterns/decomposition/self-contained-service.html): Microservices can respond to a synchronous request without waiting for the response from any other service. +* [Database per service](https://microservices.io/patterns/data/database-per-service.html): Keep each microservice's persistent data private to that service and accessible only via its API. A service's transactions only involve its database. +* [Saga](https://microservices.io/patterns/data/saga.html): Transaction that spans multiple services. +* [CQRS](https://microservices.io/patterns/data/cqrs.html): view database, which is a read-only replica that is designed to support queries that retrieves data from microservice. The application keeps the replica up to date by subscribing to Domain events published by the service that own the data. +* [Domain event](https://microservices.io/patterns/data/domain-event.html): A service often needs to publish events when it updates its data. These events might be needed, for example, to update a CQRS view. +* [Event Sourcing](https://microservices.io/patterns/data/event-sourcing.html): Event sourcing persists the state of a business entity such an Order or a Customer as a sequence of state-changing events. Whenever the state of a business entity changes, a new event is appended to the list of events. Since saving an event is a single operation, it is inherently atomic. The application reconstructs an entity's current state by replaying the events. +* [Messaging](https://microservices.io/patterns/communication-style/messaging.html): Services communicating by exchanging messages over messaging channels. (Apache Kafka is used in this case) +* [API gateway](https://microservices.io/patterns/apigateway.html): Single entry point for all clients. The API gateway proxy/route to the appropriate service. +* [Service registry](https://microservices.io/patterns/service-registry.html): Database of services. A service registry might invoke a service instance's health check API to verify that it is able to handle requests +* [Self Registration](https://microservices.io/patterns/self-registration.html): Each service instance register on startup and unregister on stop. +* [Access token](https://microservices.io/patterns/security/access-token.html): The API Gateway authenticates the request and passes an access token (e.g. JSON Web Token) that securely identifies the requestor in each request to the services. A service can include the access token in requests it makes to other services. +* [Health Check API](https://microservices.io/patterns/observability/health-check-api.html): A service has a health check API endpoint (e.g. HTTP `/health`) that returns the health of the service. + +## Installation + +The easiest way to manage a project is with the `minos` command-line interface, which provides commands to setup both the project skeleton (configures containerization, databases, brokers, etc.) and the microservice skeleton (the base microservice structure, environment configuration, etc.). + +You can install it with: + +```shell +pip install minos-cli +``` + +Here is a summary containing the most useful commands: + +* `minos new project $NAME`: Create a new Project +* `minos set $RESOURCE $BACKEND`: Configure an environment resource (broker, database, etc.). +* `minos deploy project`: Deploy a project. +* `minos new microservice $NAME`: Create a new microservice. +* `minos deploy microservice` deploy a microservice. + +For more information, visit the [`minos-cli`](https://github.com/minos-framework/minos-cli) repository. + +## QuickStart + +This section includes a quickstart guide to create your first `minos` microservice, so that anyone can get the gist of the framework. + +### Set up the environment + +The required environment to run this quickstart is the following: + +* A `python>=3.9` interpreter with version equal or greater to . +* A `kafka` instance available at `localhost:9092` +* A `postgres` instance available at `localhost:5432` with the `foo_db` and `foobar_db` databases accessible with the `user:pass` credentials. +* Two TCP sockets available to use at `localhost:4545` and `localhost:4546`. + +Note that these parameters can be customized on the configuration files. + +### Install the dependencies + +If you want to directly use `minos` without the command-line utility, the following command will install the needed packages: + +```shell +pip install \ + minos-microservice-aggregate \ + minos-microservice-common \ + minos-microservice-cqrs \ + minos-microservice-networks \ + minos-microservice-saga \ + minos-broker-kafka +``` + + +### Configure a Microservice + +To keep things simpler, this quickstart will create a microservice assuming all the source code is stored on a single `foo/main.py` file. In addition to the source file, a `foo/config.yml` will contain all the configuration stuff. + +The directory structure will become: + +```shell +. +└── foo + ├── config.yml + └── main.py +``` + +Create a `foo/config.yml` file and add the following lines: +
+ Click to show the full file + +```yaml +# foo/config.yml + +service: + name: foo + aggregate: main.Foo + injections: + lock_pool: minos.common.PostgreSqlLockPool + postgresql_pool: minos.common.PostgreSqlPool + broker_publisher: minos.plugins.kafka.PostgreSqlQueuedKafkaBrokerPublisher + broker_subscriber_builder: minos.plugins.kafka.PostgreSqlQueuedKafkaBrokerSubscriberBuilder + broker_pool: minos.networks.BrokerClientPool + transaction_repository: minos.aggregate.PostgreSqlTransactionRepository + event_repository: minos.aggregate.PostgreSqlEventRepository + snapshot_repository: minos.aggregate.PostgreSqlSnapshotRepository + saga_manager: minos.saga.SagaManager + discovery: minos.networks.DiscoveryConnector + services: + - minos.networks.BrokerHandlerService + - minos.networks.RestService + - minos.networks.PeriodicTaskSchedulerService +middleware: + - minos.saga.transactional_command +services: + - minos.aggregate.TransactionService + - minos.aggregate.SnapshotService + - minos.saga.SagaService + - main.FooCommandService + - main.FooQueryService +rest: + host: 0.0.0.0 + port: 4545 +broker: + host: localhost + port: 9092 + queue: + database: foo_db + user: user + password: pass + host: localhost + port: 5432 + records: 1000 + retry: 2 +repository: + database: foo_db + user: user + password: pass + host: localhost + port: 5432 +snapshot: + database: foo_db + user: user + password: pass + host: localhost + port: 5432 +saga: + storage: + path: "./foo.lmdb" +discovery: + client: minos.networks.InMemoryDiscoveryClient + host: localhost + port: 5567 +``` + +
+ +Create a `foo/main.py` file and add the following content: + +```python +# foo/main.py + +from pathlib import Path +from minos.aggregate import Aggregate, RootEntity +from minos.common import EntrypointLauncher +from minos.cqrs import CommandService, QueryService + + +class Foo(RootEntity): + """Foo RootEntity class.""" + + +class FooAggregate(Aggregate[Foo]): + """Foo Aggregate class.""" + + +class FooCommandService(CommandService): + """Foo Command Service class.""" + + +class FooQueryService(QueryService): + """Foo Query Service class.""" + + +if __name__ == '__main__': + launcher = EntrypointLauncher.from_config(Path(__file__).parent / "config.yml") + launcher.launch() +``` + +Execute the following command to start the microservice: + +```shell +python foo/main.py +``` + +### Create an Aggregate + +The way to model data in `minos` is highly inspired by the [Event Sourcing](https://microservices.io/patterns/data/event-sourcing.html) ideas. For this reason, the classes to be used to model data are: + +* `minos.aggregate.Entity`: A model that has an identifier that gives it a unique identity, in the sense that some values from which it is composed could change, but its identity will continue being the same. +* `minos.aggregate.ExternalEntity`: A model that belongs to another microservice (or aggregate boundary) but needs to be used for some reason inside this microservice (or aggregate boundary). +* `minos.aggregate.RootEntity`: Is an `Entity` superset that provides global identity across the project compared to standard `Entity` models, that has only local identity (the `RootEntity` can be accessed from another microservices as `ExternalEntity` models, but standard `Entity` models can only be accessed within the microservice that define them). The `RootEntity` is also the one that interacts with the persistence layer (the `EventRepository` and `SnapshotRepository` instances). +* `minos.aggregate.Ref`: A wrapper class that provides the functionality to store a reference of other `RootEntity` or `ExternalEntity` instances. +* `minos.aggregate.EntitySet`: A container of `Entity` instances that takes advantage of the incremental behaviour of the `EventRepository`. +* `minos.aggregate.ValueObject`: A model that is only identified by the values that compose it, so that if some of them changes, then the model becomes completely different (for that reason, these models are immutable). +* `minos.aggregate.ValueObjectSet`: A container of `ValueObject` instances that takes advantage of the incremental behaviour of the `EventRepository. +* `minos.aggregate.Aggregate`: A collection of `Entity` and/or `ValueObject` models that are related to each other through a `RootEntity`. +* `minos.aggregate.Event`: A model that contains the difference between the a `RootEntity` instance and its previous version (if any). + +Here is an example of the creation the `Foo` aggregate. In this case, it has two attributes, a `bar` being a `str`, and a `foobar` being an optional reference to the external `FooBar` aggregate, which it is assumed that it has a `something` attribute. + +```python +# foo/main.py + +from __future__ import annotations +from typing import Optional +from uuid import UUID +from minos.aggregate import Aggregate, RootEntity, ExternalEntity, Ref + + +class Foo(RootEntity): + """Foo RootEntity class.""" + + bar: str + foobar: Optional[Ref[FooBar]] + + +class FooBar(ExternalEntity): + """FooBar ExternalEntity clas.""" + + something: str + + +class FooAggregate(Aggregate[Foo]): + """Foo Aggregate class.""" + + @staticmethod + async def create_foo(bar: str) -> UUID: + """Create a new Foo instance + + :param bar: The bar of the new instance. + :return: The identifier of the new instance. + """ + foo = await Foo.create(bar) + + return foo.uuid + + @staticmethod + async def update_foobar(uuid: UUID, foobar: Optional[Ref[FooBar]]) -> None: + """Update the foobar attribute of the ``Foo`` instance. + + :param uuid: The identifier of the ``Foo`` instance. + :param foobar: The foobar value to be set. + :return: This method does not return anything. + """ + foo = await Foo.get(uuid) + foo.foobar = foobar + await foo.save() +``` + +
+ Click to show the full file + +```python +# foo/main.py + +from __future__ import annotations + +from pathlib import Path +from typing import Optional +from uuid import UUID + +from minos.aggregate import Aggregate, RootEntity, ExternalEntity, Ref +from minos.common import EntrypointLauncher +from minos.cqrs import CommandService, QueryService + + +class Foo(RootEntity): + """Foo RootEntity class.""" + + bar: str + foobar: Optional[Ref[FooBar]] + + +class FooBar(ExternalEntity): + """FooBar ExternalEntity clas.""" + + something: str + + +class FooAggregate(Aggregate[Foo]): + """Foo Aggregate class.""" + + @staticmethod + async def create_foo(bar: str) -> UUID: + """Create a new Foo instance + + :param bar: The bar of the new instance. + :return: The identifier of the new instance. + """ + foo = await Foo.create(bar) + + return foo.uuid + + @staticmethod + async def update_foobar(uuid: UUID, foobar: Optional[Ref[FooBar]]) -> None: + """Update the foobar attribute of the ``Foo`` instance. + + :param uuid: The identifier of the ``Foo`` instance. + :param foobar: The foobar value to be set. + :return: This method does not return anything. + """ + foo = await Foo.get(uuid) + foo.foobar = foobar + await foo.save() + + +class FooCommandService(CommandService): + """Foo Command Service class.""" + + +class FooQueryService(QueryService): + """Foo Query Service class.""" + + +if __name__ == '__main__': + launcher = EntrypointLauncher.from_config(Path(__file__).parent / "config.yml") + launcher.launch() +``` + +
+ +### Expose a Command + +Here is an example of the definition of a command to create `Foo` instances. To do that, it is necessary to define a `CommandService` that contains the handling function. It will handle both the broker messages sent to the `"CreateFoo"` topic and the rest calls to the `"/foos"` path with the `"POST"` method. In this case, the handling function unpacks the `Request`'s content and then calls the `create` method from the `Aggregate`, which stores the `Foo` instance following an event-driven strategy (it also publishes the `"FooCreated"` event). Finally, a `Response` is returned to be handled by the external caller (another microservice or the API-gateway). + +```python +# foo/main.py + +from minos.cqrs import CommandService +from minos.networks import enroute, Request, Response + + +class FooCommandService(CommandService): + """Foo Command Service class.""" + + @enroute.broker.command("CreateFoo") + @enroute.rest.command("/foos", "POST") + async def create_foo(self, request: Request) -> Response: + """Create a new Foo. + + :param request: The ``Request`` that contains the ``bar`` attribute. + :return: A ``Response`` containing identifier of the already created instance. + """ + content = await request.content() + bar = content["bar"] + + uuid = await FooAggregate.create_foo(bar) + + return Response({"uuid": uuid}) +``` + +
+ Click to show the full file + +```python +# foo/main.py + +from __future__ import annotations + +from pathlib import Path +from typing import Optional +from uuid import UUID + +from minos.aggregate import Aggregate, RootEntity, ExternalEntity, Ref +from minos.common import EntrypointLauncher +from minos.cqrs import CommandService, QueryService +from minos.networks import Request, Response, enroute + + +class Foo(RootEntity): + """Foo RootEntity class.""" + + bar: str + foobar: Optional[Ref[FooBar]] + + +class FooBar(ExternalEntity): + """FooBar ExternalEntity clas.""" + + something: str + + +class FooAggregate(Aggregate[Foo]): + """Foo Aggregate class.""" + + @staticmethod + async def create_foo(bar: str) -> UUID: + """Create a new Foo instance + + :param bar: The bar of the new instance. + :return: The identifier of the new instance. + """ + foo = await Foo.create(bar) + + return foo.uuid + + @staticmethod + async def update_foobar(uuid: UUID, foobar: Optional[Ref[FooBar]]) -> None: + """Update the foobar attribute of the ``Foo`` instance. + + :param uuid: The identifier of the ``Foo`` instance. + :param foobar: The foobar value to be set. + :return: This method does not return anything. + """ + foo = await Foo.get(uuid) + foo.foobar = foobar + await foo.save() + + +class FooCommandService(CommandService): + """Foo Command Service class.""" + + @enroute.broker.command("CreateFoo") + @enroute.rest.command("/foos", "POST") + async def create_foo(self, request: Request) -> Response: + """Create a new Foo. + + :param request: The ``Request`` that contains the ``bar`` attribute. + :return: A ``Response`` containing identifier of the already created instance. + """ + content = await request.content() + bar = content["bar"] + + uuid = await FooAggregate.create_foo(bar) + + return Response({"uuid": uuid}) + + +class FooQueryService(QueryService): + """Foo Query Service class.""" + + +if __name__ == '__main__': + launcher = EntrypointLauncher.from_config(Path(__file__).parent / "config.yml") + launcher.launch() +``` + +
+ +Execute the following command to start the microservice: + +```shell +python foo/main.py +``` + +To check that everything works fine, execute the following command: + +```shell +curl --location --request POST 'http://localhost:4545/foos' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "bar": "test" +}' +``` + +And the expected response will be similar to: + +```json +{ + "uuid": "YOUR_UUID" +} +``` + +### Subscribe to an Event and Expose a Query + +Here is an example of the event and query handling. In this case, it must be defined on a `QueryService` class. In this case a `"FooCreated"` and `"FooUpdated.foobar"` events are handled (they will print the content on the microservice's logs). The event contents typically contains instances of `AggregateDiff` type, which is referred to the difference respect to the previously stored instance. The exposed query is connected to the calls that come from the `"/foos/example"` path and `"GET"` method and a naive string is returned. + +*Disclaimer*: A real `QueryService` implementation must populate a query-oriented database based on the events to which is subscribed to, and expose queries performed over that query-oriented database. + +```python +# foo/main.py + +from minos.cqrs import QueryService +from minos.networks import enroute, Request, Response + + +class FooQueryService(QueryService): + """Foo Query Service class.""" + + @enroute.broker.event("FooCreated") + async def foo_created(self, request: Request) -> None: + """Handle the "FooCreated" event. + + :param request: The ``Request`` that contains a ``Event``. + :return: This method does not return anything. + """ + event = await request.content() + print(f"A Foo was created: {event}") + + @enroute.broker.event("FooUpdated.foobar") + async def foo_foobar_updated(self, request: Request) -> None: + """Handle the "FooUpdated.foobar" event. + + :param request: The ``Request`` that contains a ``Event``. + :return: This method does not return anything. + """ + event = await request.content() + print(f"The 'foobar' field of a Foo was updated: {event}") + + @enroute.rest.query("/foos/example", "GET") + async def example(self, request: Request) -> Response: + """Handle the example query. + + :param request: The ``Request`` that contains the necessary information. + :return: A ``Response`` instance. + """ + return Response("This is an example response!") +``` + +
+ Click to show the full file + +```python +# foo/main.py + +from __future__ import annotations -The official API Reference is publicly available at [GiHub Pages](https://minos-framework.github.io/minos-python). +from pathlib import Path +from typing import Optional +from uuid import UUID + +from minos.aggregate import Aggregate, RootEntity, ExternalEntity, Ref +from minos.common import EntrypointLauncher +from minos.cqrs import CommandService, QueryService +from minos.networks import Request, Response, enroute + + +class Foo(RootEntity): + """Foo RootEntity class.""" + + bar: str + foobar: Optional[Ref[FooBar]] + + +class FooBar(ExternalEntity): + """FooBar ExternalEntity clas.""" + + something: str + + +class FooAggregate(Aggregate[Foo]): + """Foo Aggregate class.""" + + @staticmethod + async def create_foo(bar: str) -> UUID: + """Create a new Foo instance + + :param bar: The bar of the new instance. + :return: The identifier of the new instance. + """ + foo = await Foo.create(bar) + + return foo.uuid + + @staticmethod + async def update_foobar(uuid: UUID, foobar: Optional[Ref[FooBar]]) -> None: + """Update the foobar attribute of the ``Foo`` instance. + + :param uuid: The identifier of the ``Foo`` instance. + :param foobar: The foobar value to be set. + :return: This method does not return anything. + """ + foo = await Foo.get(uuid) + foo.foobar = foobar + await foo.save() + + +class FooCommandService(CommandService): + """Foo Command Service class.""" + + @enroute.broker.command("CreateFoo") + @enroute.rest.command("/foos", "POST") + async def create_foo(self, request: Request) -> Response: + """Create a new Foo. + + :param request: The ``Request`` that contains the ``bar`` attribute. + :return: A ``Response`` containing identifier of the already created instance. + """ + content = await request.content() + bar = content["bar"] + + uuid = await FooAggregate.create_foo(bar) + + return Response({"uuid": uuid}) + + +class FooQueryService(QueryService): + """Foo Query Service class.""" + + @enroute.broker.event("FooCreated") + async def foo_created(self, request: Request) -> None: + """Handle the "FooCreated" event. + + :param request: The ``Request`` that contains a ``Event``. + :return: This method does not return anything. + """ + event = await request.content() + print(f"A Foo was created: {event}") + + @enroute.broker.event("FooUpdated.foobar") + async def foo_foobar_updated(self, request: Request) -> None: + """Handle the "FooUpdated.foobar" event. + + :param request: The ``Request`` that contains a ``Event``. + :return: This method does not return anything. + """ + event = await request.content() + print(f"The 'foobar' field of a Foo was updated: {event}") + + @enroute.rest.query("/foos/example", "GET") + async def example(self, request: Request) -> Response: + """Handle the example query. + + :param request: The ``Request`` that contains the necessary information. + :return: A ``Response`` instance. + """ + return Response("This is an example response!") + + +if __name__ == '__main__': + launcher = EntrypointLauncher.from_config(Path(__file__).parent / "config.yml") + launcher.launch() +``` + +
+ +Execute the following command to start the microservice: + +```shell +python foo/main.py +``` + +Now, if a new instance is created (with a rest call, like in the [previous section](#Expose a Command)), the `FooCreated` event will be handled and the microservice's console will print something like: + +``` +A Foo was created: Event(...) +``` + +Also, to check that everything is fine the example query can be executed with: + +```shell +curl --location --request GET 'http://localhost:4545/foos/example' +``` + +And the expected result should be something like: + +``` +"This is an example response!" +``` + +### Interact with another Microservice + +Here is an example of the interaction between two microservices through a SAGA pattern. In this case, the interaction starts with a call to the `"/foos/add-foobar"` path and the `"POST"` method, which performs a `SagaManager` run over the `ADD_FOOBAR_SAGA` saga. This saga has two steps, one remote that executes the `"CreateFooBar"` command (possibly defined on the supposed `"foobar"` microservice), and a local step that is executed on this microservice. The `CreateFooBarDTO` defines the structure of the request to be sent when the `"CreateFooBar"` command is executed. + +```python +# foo/main.py + +from minos.common import ModelType +from minos.cqrs import CommandService +from minos.networks import enroute, Request +from minos.saga import Saga, SagaContext, SagaRequest, SagaResponse + + +class FooCommandService(CommandService): + """Foo Command Service class.""" + + @enroute.rest.command("/foos/add-foobar", "POST") + async def update_foo(self, request: Request) -> None: + """Run a saga example. + + :param request: The ``Request`` that contains the initial saga's context. + :return: This method does not return anything. + """ + content = await request.content() + + context = SagaContext(uuid=content["uuid"], something=content["something"]) + await self.saga_manager.run(ADD_FOOBAR_SAGA, context) + + +def _create_foobar(context: SagaContext) -> SagaRequest: + something = context["something"] + content = CreateFooBarDTO(56, something) + return SagaRequest("CreateFooBar", content) + + +async def _success_foobar(context: SagaContext, response: SagaResponse) -> SagaContext: + context["foobar_uuid"] = await response.content() + return context + + +async def _error_foobar(context: SagaContext, response: SagaResponse) -> SagaContext: + raise ValueError("The foobar could not be created!") + + +async def _update_foo(context: SagaContext) -> None: + await FooAggregate.update_foobar(context["uuid"], context["foobar_uuid"]) + + +CreateFooBarDTO = ModelType.build("AnotherDTO", {"number": int, "text": str}) + +ADD_FOOBAR_SAGA = ( + Saga() + .remote_step() + .on_execute(_create_foobar) + .on_success(_success_foobar) + .on_error(_error_foobar) + .local_step() + .on_execute(_update_foo) + .commit() +) +``` + +
+ Click to show the full file + +```python +# foo/main.py + +from __future__ import annotations + +from pathlib import Path +from typing import Optional +from uuid import UUID + +from minos.aggregate import Aggregate, RootEntity, ExternalEntity, Ref +from minos.common import ModelType, EntrypointLauncher +from minos.cqrs import CommandService, QueryService +from minos.networks import Request, Response, enroute +from minos.saga import Saga, SagaContext, SagaRequest, SagaResponse + + +class Foo(RootEntity): + """Foo RootEntity class.""" + + bar: str + foobar: Optional[Ref[FooBar]] + + +class FooBar(ExternalEntity): + """FooBar ExternalEntity clas.""" + + something: str + + +class FooAggregate(Aggregate[Foo]): + """Foo Aggregate class.""" + + @staticmethod + async def create_foo(bar: str) -> UUID: + """Create a new Foo instance + + :param bar: The bar of the new instance. + :return: The identifier of the new instance. + """ + foo = await Foo.create(bar) + + return foo.uuid + + @staticmethod + async def update_foobar(uuid: UUID, foobar: Optional[Ref[FooBar]]) -> None: + """Update the foobar attribute of the ``Foo`` instance. + + :param uuid: The identifier of the ``Foo`` instance. + :param foobar: The foobar value to be set. + :return: This method does not return anything. + """ + foo = await Foo.get(uuid) + foo.foobar = foobar + await foo.save() + + +class FooCommandService(CommandService): + """Foo Command Service class.""" + + @enroute.broker.command("CreateFoo") + @enroute.rest.command("/foos", "POST") + async def create_foo(self, request: Request) -> Response: + """Create a new Foo. + + :param request: The ``Request`` that contains the ``bar`` attribute. + :return: A ``Response`` containing identifier of the already created instance. + """ + content = await request.content() + bar = content["bar"] + + uuid = await FooAggregate.create_foo(bar) + + return Response({"uuid": uuid}) + + @enroute.rest.command("/foos/add-foobar", "POST") + async def update_foo(self, request: Request) -> None: + """Run a saga example. + + :param request: The ``Request`` that contains the initial saga's context. + :return: This method does not return anything. + """ + content = await request.content() + + context = SagaContext(uuid=content["uuid"], something=content["something"]) + await self.saga_manager.run(ADD_FOOBAR_SAGA, context) + + +def _create_foobar(context: SagaContext) -> SagaRequest: + something = context["something"] + content = CreateFooBarDTO(56, something) + return SagaRequest("CreateFooBar", content) + + +async def _success_foobar(context: SagaContext, response: SagaResponse) -> SagaContext: + context["foobar_uuid"] = await response.content() + return context + + +async def _error_foobar(context: SagaContext, response: SagaResponse) -> SagaContext: + raise ValueError("The foobar could not be created!") + + +async def _update_foo(context: SagaContext) -> None: + await FooAggregate.update_foobar(context["uuid"], context["foobar_uuid"]) + + +CreateFooBarDTO = ModelType.build("AnotherDTO", {"number": int, "text": str}) + +ADD_FOOBAR_SAGA = ( + Saga() + .remote_step() + .on_execute(_create_foobar) + .on_success(_success_foobar) + .on_error(_error_foobar) + .local_step() + .on_execute(_update_foo) + .commit() +) + + +class FooQueryService(QueryService): + """Foo Query Service class.""" + + @enroute.broker.event("FooCreated") + async def foo_created(self, request: Request) -> None: + """Handle the "FooCreated" event. + + :param request: The ``Request`` that contains a ``Event``. + :return: This method does not return anything. + """ + event = await request.content() + print(f"A Foo was created: {event}") + + @enroute.broker.event("FooUpdated.foobar") + async def foo_foobar_updated(self, request: Request) -> None: + """Handle the "FooUpdated.foobar" event. + + :param request: The ``Request`` that contains a ``Event``. + :return: This method does not return anything. + """ + event = await request.content() + print(f"The 'foobar' field of a Foo was updated: {event}") + + @enroute.rest.query("/foos/example", "GET") + async def example(self, request: Request) -> Response: + """Handle the example query. + + :param request: The ``Request`` that contains the necessary information. + :return: A ``Response`` instance. + """ + return Response("This is an example response!") + + +if __name__ == '__main__': + launcher = EntrypointLauncher.from_config(Path(__file__).parent / "config.yml") + launcher.launch() +``` + +
+ +Execute the following command to start the `foo` microservice: + +```shell +python foo/main.py +``` + +**Disclaimer**: Note that in this case another microservice is needed to complete the saga. + +#### The `foobar` Microservice + +The `foobar` microservice will simply have a `CreateFooBar` command to create new instances of its `FooBar` root entity. + +The directory structure will become: + +```shell +. +├── foo +│   ├── config.yml +│   └── main.py +└── foobar + ├── config.yml + └── main.py +``` + +Here is the `foobar/config.yml` config file: +
+ Click to show the full file + +```yaml +# foobar/config.yml + +service: + name: foobar + aggregate: main.FooBar + injections: + lock_pool: minos.common.PostgreSqlLockPool + postgresql_pool: minos.common.PostgreSqlPool + broker_publisher: minos.plugins.kafka.PostgreSqlQueuedKafkaBrokerPublisher + broker_subscriber_builder: minos.plugins.kafka.PostgreSqlQueuedKafkaBrokerSubscriberBuilder + broker_pool: minos.networks.BrokerClientPool + transaction_repository: minos.aggregate.PostgreSqlTransactionRepository + event_repository: minos.aggregate.PostgreSqlEventRepository + snapshot_repository: minos.aggregate.PostgreSqlSnapshotRepository + saga_manager: minos.saga.SagaManager + discovery: minos.networks.DiscoveryConnector + services: + - minos.networks.BrokerHandlerService + - minos.networks.RestService + - minos.networks.PeriodicTaskSchedulerService +middleware: + - minos.saga.transactional_command +services: + - minos.aggregate.TransactionService + - minos.aggregate.SnapshotService + - minos.saga.SagaService + - main.FooBarCommandService +rest: + host: 0.0.0.0 + port: 4546 +broker: + host: localhost + port: 9092 + queue: + database: foobar_db + user: user + password: pass + host: localhost + port: 5432 + records: 1000 + retry: 2 +repository: + database: foobar_db + user: user + password: pass + host: localhost + port: 5432 +snapshot: + database: foobar_db + user: user + password: pass + host: localhost + port: 5432 +saga: + storage: + path: "./foobar.lmdb" +discovery: + client: minos.networks.InMemoryDiscoveryClient + host: localhost + port: 5567 +``` + +
+ +Here is the `foobar/main.py` source file: +
+ Click to show the full file + +```python +from __future__ import annotations + +from pathlib import Path +from uuid import UUID + +from minos.aggregate import Aggregate, RootEntity +from minos.common import EntrypointLauncher +from minos.cqrs import CommandService +from minos.networks import Request, Response, enroute + + +class FooBar(RootEntity): + """FooBar Root Entity clas.""" + + something: str + + +class FooBarAggregate(Aggregate[FooBar]): + """FooBar Aggregate class.""" + + @staticmethod + async def create_foobar(something: str) -> UUID: + """Create a new ``FooBar`` instance. + + :param something: The something attribute. + :return: The identifier of the new instance. + """ + foobar = await FooBar.create(something) + return foobar.uuid + + +class FooBarCommandService(CommandService): + """Foo Command Service class.""" + + @enroute.broker.command("CreateFooBar") + async def create_foobar(self, request: Request) -> Response: + """Create a new FooBar. + + :param request: The ``Request`` that contains the ``something`` attribute. + :return: A ``Response`` containing identifier of the already created instance. + """ + content = await request.content() + something = content["text"] + + uuid = await FooBarAggregate.create_foobar(something) + + return Response(uuid) + + +if __name__ == '__main__': + launcher = EntrypointLauncher.from_config(Path(__file__).parent / "config.yml") + launcher.launch() + +``` + +
+ +Execute the following command to start the `foobar` microservice: + +```shell +python foobar/main.py +``` + +To check that everything works fine, execute the following command: + +```shell +curl --location --request POST 'http://localhost:4545/foos/add-foobar' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "uuid": "YOUR_UUID", + "something": "something" +}' +``` + +This request will start a new Saga, that sends a command to the `foobar` microservice, retrieve the `FooBar` identifier and update the `Foo` instance. After that, the `FooQueryService` will handle the update event and print a message similar to this one on the console. + +``` +The 'foobar' field of a Foo was updated: Event(...) +``` ## Packages @@ -34,24 +1096,32 @@ 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. +* [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. +* [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. ### Plugins -The plugin packages provide connectors to external technologies like brokers, discovery services, databases, serializers and so on. +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-discovery-minos](https://minos-framework.github.io/minos-python/packages/plugins/minos-discovery-minos): The `minos-discovery` plugin package. + +## 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 [GitHub](https://github.com/minos-framework/minos-python). +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. ## How to contribute diff --git a/packages/core/minos-microservice-aggregate/.pre-commit-config.yaml b/packages/core/minos-microservice-aggregate/.pre-commit-config.yaml deleted file mode 100644 index 2b944a41d..000000000 --- a/packages/core/minos-microservice-aggregate/.pre-commit-config.yaml +++ /dev/null @@ -1,39 +0,0 @@ -default_stages: [ push ] -repos: - - repo: local - hooks: - - id: install - pass_filenames: false - name: Install dependencies - entry: make install - language: system - - - id: reformat - pass_filenames: false - name: Reformat package - entry: make reformat - language: system - - - id: lint - pass_filenames: false - name: Lint package - entry: make lint - language: system - - - id: test - pass_filenames: false - name: Test package - entry: make test - language: system - - - id: docs - pass_filenames: false - name: Generate documentation - entry: make docs - language: system - - - id: build - pass_filenames: false - entry: make dist - name: Generate build - language: system diff --git a/packages/core/minos-microservice-aggregate/HISTORY.md b/packages/core/minos-microservice-aggregate/HISTORY.md index 305a48804..7c9707bce 100644 --- a/packages/core/minos-microservice-aggregate/HISTORY.md +++ b/packages/core/minos-microservice-aggregate/HISTORY.md @@ -50,3 +50,18 @@ * Be compatible with `minos-microservice-common~=0.4.0`. * Be compatible with `minos-microservice-networks~=0.4.0`. + +## 0.4.1 (2022-01-31) + +* Update `README.md`. + + +## 0.5.0 (2022-02-03) + +* Rename `Aggregate` as `RootEntity`. +* Rename `AggregateRef` as `ExternalEntity`. +* Rename `ModelRef` as `Ref`. +* Rename `AggregateDiff` as `Event`. +* Create the `Aggregate` base class, with the purpose to move the business logic from the `minos.cqrs.CommandService` to this brand-new class. +* Refactor internal module hierarchy. +* Minor changes. \ No newline at end of file diff --git a/packages/core/minos-microservice-aggregate/Makefile b/packages/core/minos-microservice-aggregate/Makefile index 9b3b57da2..854bc90bc 100644 --- a/packages/core/minos-microservice-aggregate/Makefile +++ b/packages/core/minos-microservice-aggregate/Makefile @@ -32,3 +32,11 @@ install: update: poetry update + +check: + $(MAKE) install + $(MAKE) reformat + $(MAKE) lint + $(MAKE) test + $(MAKE) docs + $(MAKE) dist diff --git a/packages/core/minos-microservice-aggregate/README.md b/packages/core/minos-microservice-aggregate/README.md index 709e5499a..3e13dd2b3 100644 --- a/packages/core/minos-microservice-aggregate/README.md +++ b/packages/core/minos-microservice-aggregate/README.md @@ -1,7 +1,16 @@ -# Minos Microservice Aggregate +

+ Minos logo +

-[![codecov](https://codecov.io/gh/Clariteia/minos_microservice_aggregate/branch/main/graph/badge.svg)](https://codecov.io/gh/Clariteia/minos_microservice_aggregate) -![Tests](https://github.com/Clariteia/minos_microservice_aggregate/actions/workflows/python-tests.yml/badge.svg) +## minos-microservice-aggregate + +[![PyPI Latest Release](https://img.shields.io/pypi/v/minos-microservice-aggregate.svg)](https://pypi.org/project/minos-microservice-aggregate/) +[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/minos-framework/minos-python/pages%20build%20and%20deployment?label=docs)](https://minos-framework.github.io/minos-python) +[![License](https://img.shields.io/github/license/minos-framework/minos-python.svg)](https://github.com/minos-framework/minos-python/blob/main/LICENSE) +[![Coverage](https://codecov.io/github/minos-framework/minos-python/coverage.svg?branch=main)](https://codecov.io/gh/minos-framework/minos-python) +[![Stack Overflow](https://img.shields.io/badge/Stack%20Overflow-Ask%20a%20question-green)](https://stackoverflow.com/questions/tagged/minos) + +## Summary Minos is a framework which helps you create [reactive](https://www.reactivemanifesto.org/) microservices in Python. Internally, it leverages Event Sourcing, CQRS and a message driven architecture to fulfil the commitments of an @@ -9,76 +18,19 @@ asynchronous environment. ## Documentation -The official documentation as well as the API you can find it under https://clariteia.github.io/minos_microservice_aggregate/. -Please, submit any issue regarding documentation as well! - -## Set up a development environment - -Minos uses `poetry` as its default package manager. Please refer to the -[Poetry installation guide](https://python-poetry.org/docs/#installation) for instructions on how to install it. - -Now you con install all the dependencies by running -```bash -make install -``` - -In order to make the pre-commits checks available to git, run -```bash -pre-commit install -``` - -Make yourself sure you are able to run the tests. Refer to the appropriate section in this guide. - -## Run the tests - -In order to run the tests, please make sure you have the [Docker Engine](https://docs.docker.com/engine/install/) -and [Docker Compose](https://docs.docker.com/compose/install/) installed. - -Move into `tests/` directory - -```bash -cd tests/ -``` -Run service dependencies: - -```bash -docker-compose up -d -``` - -Install library dependencies: - -```bash -make install -``` - -Run tests: - -```bash -make test -``` - -## 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. - -Please consider these guidelines before you submit any modification. +The official API Reference is publicly available at the [GitHub Pages](https://minos-framework.github.io/minos-python). -### Create an issue +## Source Code -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. +The source code of this project is hosted at the [GitHub Repository](https://github.com/minos-framework/minos-python). -### Submit a Pull Request +## Getting Help -1. Create an issue following the previous steps. -2. Fork the project. -3. Push your changes to a local branch. -4. Run the tests! -5. Submit a pull request from your fork's branch. +For usage questions, the best place to go to is [StackOverflow](https://stackoverflow.com/questions/tagged/minos). -## Credits +## 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. -This package was created with [Cookiecutter](https://github.com/audreyr/cookiecutter) and the [Minos Package](https://github.com/Clariteia/minos-pypackage) project template. +## License +This project is distributed under the [MIT](https://raw.githubusercontent.com/minos-framework/minos-python/main/LICENSE) license. diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/__init__.py b/packages/core/minos-microservice-aggregate/minos/aggregate/__init__.py index 869432819..7353aa527 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/__init__.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/__init__.py @@ -1,22 +1,47 @@ __author__ = "Minos Framework Devs" __email__ = "hey@minos.run" -__version__ = "0.4.0" +__version__ = "0.5.0" +from .actions import ( + Action, +) +from .aggregate import ( + Aggregate, +) +from .collections import ( + IncrementalSet, + IncrementalSetDiff, + IncrementalSetDiffEntry, +) from .contextvars import ( IS_REPOSITORY_SERIALIZATION_CONTEXT_VAR, ) +from .entities import ( + Entity, + EntitySet, + ExternalEntity, + Ref, + RefExtractor, + RefInjector, + RefResolver, + RootEntity, +) from .events import ( + Event, EventEntry, EventRepository, + FieldDiff, + FieldDiffContainer, + IncrementalFieldDiff, InMemoryEventRepository, PostgreSqlEventRepository, ) from .exceptions import ( AggregateException, - AggregateNotFoundException, - DeletedAggregateException, + AlreadyDeletedException, EventRepositoryConflictException, EventRepositoryException, + NotFoundException, SnapshotRepositoryConflictException, SnapshotRepositoryException, TransactionNotFoundException, @@ -24,26 +49,6 @@ TransactionRepositoryException, ValueObjectException, ) -from .models import ( - Action, - Aggregate, - AggregateDiff, - AggregateRef, - Entity, - EntitySet, - FieldDiff, - FieldDiffContainer, - IncrementalFieldDiff, - IncrementalSet, - IncrementalSetDiff, - IncrementalSetDiffEntry, - ModelRef, - ModelRefExtractor, - ModelRefInjector, - ModelRefResolver, - ValueObject, - ValueObjectSet, -) from .queries import ( Condition, Ordering, @@ -68,3 +73,7 @@ TransactionService, TransactionStatus, ) +from .value_objects import ( + ValueObject, + ValueObjectSet, +) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/models/actions.py b/packages/core/minos-microservice-aggregate/minos/aggregate/actions.py similarity index 100% rename from packages/core/minos-microservice-aggregate/minos/aggregate/models/actions.py rename to packages/core/minos-microservice-aggregate/minos/aggregate/actions.py diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/aggregate.py b/packages/core/minos-microservice-aggregate/minos/aggregate/aggregate.py new file mode 100644 index 000000000..3fbce9609 --- /dev/null +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/aggregate.py @@ -0,0 +1,111 @@ +from __future__ import ( + annotations, +) + +from typing import ( + Generic, + TypeVar, + get_args, +) + +from dependency_injector.wiring import ( + Provide, + inject, +) + +from minos.common import ( + MinosConfig, + MinosSetup, + NotProvidedException, +) + +from .entities import ( + RootEntity, +) +from .events import ( + EventRepository, +) +from .snapshots import ( + SnapshotRepository, +) +from .transactions import ( + TransactionRepository, +) + +RT = TypeVar("RT", bound=RootEntity) + + +class Aggregate(Generic[RT], MinosSetup): + """Base Service class""" + + transaction_repository: TransactionRepository + event_repository: EventRepository + snapshot_repository: SnapshotRepository + + def __init__( + self, + transaction_repository: TransactionRepository, + event_repository: EventRepository, + snapshot_repository: SnapshotRepository, + *args, + **kwargs, + ): + super().__init__(*args, **kwargs) + self._check_root() + + self.transaction_repository = transaction_repository + self.event_repository = event_repository + self.snapshot_repository = snapshot_repository + + @classmethod + def _from_config(cls, config: MinosConfig, **kwargs) -> Aggregate: + kwargs["transaction_repository"] = cls._get_transaction_repository(**kwargs) + kwargs["event_repository"] = cls._get_event_repository(**kwargs) + kwargs["snapshot_repository"] = cls._get_snapshot_repository(**kwargs) + return cls(**kwargs) + + # noinspection PyUnusedLocal + @staticmethod + @inject + def _get_transaction_repository( + transaction_repository: TransactionRepository = Provide["transaction_repository"], **kwargs + ) -> TransactionRepository: + if transaction_repository is None or isinstance(transaction_repository, Provide): + raise NotProvidedException(f"A {TransactionRepository!r} object must be provided.") + return transaction_repository + + # noinspection PyUnusedLocal + @staticmethod + @inject + def _get_event_repository( + event_repository: EventRepository = Provide["event_repository"], **kwargs + ) -> EventRepository: + if event_repository is None or isinstance(event_repository, Provide): + raise NotProvidedException(f"A {EventRepository!r} object must be provided.") + return event_repository + + # noinspection PyUnusedLocal + @staticmethod + @inject + def _get_snapshot_repository( + snapshot_repository: SnapshotRepository = Provide["snapshot_repository"], **kwargs + ) -> SnapshotRepository: + if snapshot_repository is None or isinstance(snapshot_repository, Provide): + raise NotProvidedException(f"A {SnapshotRepository!r} object must be provided.") + return snapshot_repository + + def _check_root(self): + self.root # If root is not valid it will raise an exception. + + @property + def root(self) -> type[RootEntity]: + """Get the root entity of the aggregate. + + :return: A ``RootEntity`` type. + """ + # noinspection PyUnresolvedReferences + bases = self.__orig_bases__ + root = get_args(bases[0])[0] + if not isinstance(root, type) or not issubclass(root, RootEntity): + raise TypeError(f"{type(self)!r} must contain a {RootEntity!r} as generic value.") + return root diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/models/collections.py b/packages/core/minos-microservice-aggregate/minos/aggregate/collections.py similarity index 100% rename from packages/core/minos-microservice-aggregate/minos/aggregate/models/collections.py rename to packages/core/minos-microservice-aggregate/minos/aggregate/collections.py diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/entities/__init__.py b/packages/core/minos-microservice-aggregate/minos/aggregate/entities/__init__.py new file mode 100644 index 000000000..7be22cdf7 --- /dev/null +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/entities/__init__.py @@ -0,0 +1,14 @@ +from .collections import ( + EntitySet, +) +from .models import ( + Entity, + ExternalEntity, + RootEntity, +) +from .refs import ( + Ref, + RefExtractor, + RefInjector, + RefResolver, +) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/models/entities.py b/packages/core/minos-microservice-aggregate/minos/aggregate/entities/collections.py similarity index 93% rename from packages/core/minos-microservice-aggregate/minos/aggregate/models/entities.py rename to packages/core/minos-microservice-aggregate/minos/aggregate/entities/collections.py index ed77886eb..f68273ced 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/models/entities.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/entities/collections.py @@ -16,9 +16,12 @@ ) from uuid import ( UUID, - uuid4, ) +from minos.aggregate.collections import ( + IncrementalSet, + IncrementalSetDiff, +) from minos.common import ( DataDecoder, DataEncoder, @@ -28,23 +31,6 @@ SchemaEncoder, ) -from .collections import ( - IncrementalSet, - IncrementalSetDiff, -) - - -class Entity(DeclarativeModel): - """Entity class .""" - - uuid: UUID - - def __init__(self, *args, uuid: Optional[UUID] = None, **kwargs): - if uuid is None: - uuid = uuid4() - super().__init__(uuid, *args, **kwargs) - - T = TypeVar("T", bound=Model) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/models/aggregates.py b/packages/core/minos-microservice-aggregate/minos/aggregate/entities/models.py similarity index 74% rename from packages/core/minos-microservice-aggregate/minos/aggregate/models/aggregates.py rename to packages/core/minos-microservice-aggregate/minos/aggregate/entities/models.py index 937644b85..0cd08fb34 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/models/aggregates.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/entities/models.py @@ -14,6 +14,7 @@ ) from uuid import ( UUID, + uuid4, ) from dependency_injector.wiring import ( @@ -21,39 +22,54 @@ inject, ) -from minos.common import ( - NULL_DATETIME, - NULL_UUID, - NotProvidedException, -) - -from ..events import ( +from minos.aggregate.events import ( + Event, EventEntry, EventRepository, + IncrementalFieldDiff, ) -from ..exceptions import ( +from minos.aggregate.exceptions import ( EventRepositoryException, ) -from ..queries import ( +from minos.aggregate.queries import ( _Condition, _Ordering, ) -from ..snapshots import ( +from minos.aggregate.snapshots import ( SnapshotRepository, ) -from .diffs import ( - AggregateDiff, - IncrementalFieldDiff, -) -from .entities import ( - Entity, +from minos.common import ( + NULL_DATETIME, + NULL_UUID, + DeclarativeModel, + NotProvidedException, ) logger = logging.getLogger(__name__) -class Aggregate(Entity): - """Base aggregate class.""" +class Entity(DeclarativeModel): + """Entity class.""" + + uuid: UUID + + def __init__(self, *args, uuid: Optional[UUID] = None, **kwargs): + if uuid is None: + uuid = uuid4() + super().__init__(uuid, *args, **kwargs) + + +class ExternalEntity(Entity): + """External Entity class.""" + + version: int + + def __init__(self, uuid: UUID, *args, **kwargs): + super().__init__(uuid=uuid, *args, **kwargs) + + +class RootEntity(Entity): + """Base Root Entity class.""" version: int created_at: datetime @@ -90,8 +106,8 @@ async def get( """Get one instance from the database based on its identifier. :param uuid: The identifier of the instance. - :param _snapshot: Snapshot to be set to the aggregate. - :return: A list of aggregate instances. + :param _snapshot: Snapshot to be set to the root entity. + :return: A ``RootEntity`` instance. """ if _snapshot is None or isinstance(_snapshot, Provide): raise NotProvidedException("A snapshot instance is required.") @@ -116,25 +132,24 @@ async def find( 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 _snapshot: Snapshot to be set to the aggregate. - :return: A list of aggregate instances. - :return: An aggregate instance. + :param _snapshot: Snapshot to be set to the instances. + :return: An asynchronous iterator of ``RootEntity`` instances. """ if _snapshot is None or isinstance(_snapshot, Provide): raise NotProvidedException("A snapshot instance is required.") # noinspection PyTypeChecker iterable = _snapshot.find(cls.classname, condition, ordering, limit, _snapshot=_snapshot, **kwargs) # noinspection PyTypeChecker - async for aggregate in iterable: - yield aggregate + async for instance in iterable: + yield instance @classmethod async def create(cls: Type[T], *args, **kwargs) -> T: - """Create a new ``Aggregate`` instance. + """Create a new ``RootEntity`` instance. :param args: Additional positional arguments. :param kwargs: Additional named arguments. - :return: A new ``Aggregate`` instance. + :return: A new ``RootEntity`` instance. """ if "uuid" in kwargs: raise EventRepositoryException( @@ -155,8 +170,8 @@ async def create(cls: Type[T], *args, **kwargs) -> T: instance: T = cls(*args, **kwargs) - aggregate_diff = AggregateDiff.from_aggregate(instance) - entry = await instance._repository.submit(aggregate_diff) + event = Event.from_root_entity(instance) + entry = await instance._repository.submit(event) instance._update_from_repository_entry(entry) @@ -164,10 +179,10 @@ async def create(cls: Type[T], *args, **kwargs) -> T: # noinspection PyMethodParameters,PyShadowingBuiltins async def update(self: T, **kwargs) -> T: - """Update an existing ``Aggregate`` instance. + """Update an existing ``RootEntity`` instance. :param kwargs: Additional named arguments. - :return: An updated ``Aggregate`` instance. + :return: An updated ``RootEntity`` instance. """ if "version" in kwargs: @@ -187,11 +202,11 @@ async def update(self: T, **kwargs) -> T: setattr(self, key, value) previous = await self.get(self.uuid, _repository=self._repository, _snapshot=self._snapshot) - aggregate_diff = self.diff(previous) - if not len(aggregate_diff.fields_diff): + event = self.diff(previous) + if not len(event.fields_diff): return self - entry = await self._repository.submit(aggregate_diff) + entry = await self._repository.submit(event) self._update_from_repository_entry(entry) @@ -233,46 +248,45 @@ async def refresh(self) -> None: self._fields |= new.fields async def delete(self) -> None: - """Delete the given aggregate instance. + """Delete the given root entity instance. :return: This method does not return anything. """ - aggregate_diff = AggregateDiff.from_deleted_aggregate(self) - entry = await self._repository.submit(aggregate_diff) + event = Event.from_deleted_root_entity(self) + entry = await self._repository.submit(event) self._update_from_repository_entry(entry) def _update_from_repository_entry(self, entry: EventEntry) -> None: - self.uuid = entry.aggregate_uuid + self.uuid = entry.uuid self.version = entry.version if entry.action.is_create: self.created_at = entry.created_at self.updated_at = entry.created_at - def diff(self, another: Aggregate) -> AggregateDiff: - """Compute the difference with another aggregate. + def diff(self, another: RootEntity) -> Event: + """Compute the difference with another instance. - Both ``Aggregate`` instances (``self`` and ``another``) must share the same ``uuid`` value. + Both ``RootEntity`` instances (``self`` and ``another``) must share the same ``uuid`` value. - :param another: Another ``Aggregate`` instance. + :param another: Another ``RootEntity`` instance. :return: An ``FieldDiffContainer`` instance. """ - return AggregateDiff.from_difference(self, another) + return Event.from_difference(self, another) - def apply_diff(self, aggregate_diff: AggregateDiff) -> None: + def apply_diff(self, event: Event) -> None: """Apply the differences over the instance. - :param aggregate_diff: The ``FieldDiffContainer`` containing the values to be set. + :param event: The ``FieldDiffContainer`` containing the values to be set. :return: This method does not return anything. """ - if self.uuid != aggregate_diff.uuid: + if self.uuid != event.uuid: raise ValueError( - f"To apply the difference, it must have same uuid. " - f"Expected: {self.uuid!r} Obtained: {aggregate_diff.uuid!r}" + f"To apply the difference, it must have same uuid. " f"Expected: {self.uuid!r} Obtained: {event.uuid!r}" ) - logger.debug(f"Applying {aggregate_diff!r} to {self!r}...") - for diff in aggregate_diff.fields_diff.flatten_values(): + logger.debug(f"Applying {event!r} to {self!r}...") + for diff in event.fields_diff.flatten_values(): if isinstance(diff, IncrementalFieldDiff): container = getattr(self, diff.name) if diff.action.is_delete: @@ -281,27 +295,27 @@ def apply_diff(self, aggregate_diff: AggregateDiff) -> None: container.add(diff.value) else: setattr(self, diff.name, diff.value) - self.version = aggregate_diff.version - self.updated_at = aggregate_diff.created_at + self.version = event.version + self.updated_at = event.created_at @classmethod - def from_diff(cls: Type[T], aggregate_diff: AggregateDiff, *args, **kwargs) -> T: - """Build a new instance from an ``AggregateDiff``. + def from_diff(cls: Type[T], event: Event, *args, **kwargs) -> T: + """Build a new instance from an ``Event``. - :param aggregate_diff: The difference that contains the data. + :param event: The difference that contains the data. :param args: Additional positional arguments. :param kwargs: Additional named arguments. - :return: A new ``Aggregate`` instance. + :return: A new ``RootEntity`` instance. """ return cls( *args, - uuid=aggregate_diff.uuid, - version=aggregate_diff.version, - created_at=aggregate_diff.created_at, - updated_at=aggregate_diff.created_at, - **aggregate_diff.get_all(), + uuid=event.uuid, + version=event.version, + created_at=event.created_at, + updated_at=event.created_at, + **event.get_all(), **kwargs, ) -T = TypeVar("T", bound=Aggregate) +T = TypeVar("T", bound=RootEntity) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/models/refs/__init__.py b/packages/core/minos-microservice-aggregate/minos/aggregate/entities/refs/__init__.py similarity index 51% rename from packages/core/minos-microservice-aggregate/minos/aggregate/models/refs/__init__.py rename to packages/core/minos-microservice-aggregate/minos/aggregate/entities/refs/__init__.py index e50c49696..2d0d3bffa 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/models/refs/__init__.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/entities/refs/__init__.py @@ -1,13 +1,12 @@ from .extractors import ( - ModelRefExtractor, + RefExtractor, ) from .injectors import ( - ModelRefInjector, + RefInjector, ) from .models import ( - AggregateRef, - ModelRef, + Ref, ) from .resolvers import ( - ModelRefResolver, + RefResolver, ) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/models/refs/extractors.py b/packages/core/minos-microservice-aggregate/minos/aggregate/entities/refs/extractors.py similarity index 92% rename from packages/core/minos-microservice-aggregate/minos/aggregate/models/refs/extractors.py rename to packages/core/minos-microservice-aggregate/minos/aggregate/entities/refs/extractors.py index 1a4c39f4f..298727725 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/models/refs/extractors.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/entities/refs/extractors.py @@ -22,11 +22,11 @@ ) from .models import ( - ModelRef, + Ref, ) -class ModelRefExtractor: +class RefExtractor: """Model Reference Extractor class.""" def __init__(self, value: Any, type_: Optional[type] = None, as_uuids: bool = True): @@ -49,9 +49,9 @@ def build(self) -> dict[str, set[UUID]]: return ans - def _build(self, value: Any, type_: type, ans: dict[str, set[ModelRef]]) -> None: + def _build(self, value: Any, type_: type, ans: dict[str, set[Ref]]) -> None: if get_origin(type_) is Union: - type_ = next((t for t in get_args(type_) if get_origin(t) is ModelRef), type_) + type_ = next((t for t in get_args(type_) if get_origin(t) is Ref), type_) if isinstance(value, (tuple, list, set)): self._build_iterable(value, get_args(type_)[0], ans) @@ -60,7 +60,7 @@ def _build(self, value: Any, type_: type, ans: dict[str, set[ModelRef]]) -> None self._build_iterable(value.keys(), get_args(type_)[0], ans) self._build_iterable(value.values(), get_args(type_)[1], ans) - elif isinstance(value, ModelRef): + elif isinstance(value, Ref): cls = value.data_cls or get_args(type_)[0] name = cls.__name__ ans[name].add(value) @@ -70,6 +70,6 @@ def _build(self, value: Any, type_: type, ans: dict[str, set[ModelRef]]) -> None for field in value.fields.values(): self._build(field.value, field.type, ans) - def _build_iterable(self, value: Iterable, value_: type, ans: dict[str, set[ModelRef]]) -> None: + def _build_iterable(self, value: Iterable, value_: type, ans: dict[str, set[Ref]]) -> None: for sub_value in value: self._build(sub_value, value_, ans) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/models/refs/injectors.py b/packages/core/minos-microservice-aggregate/minos/aggregate/entities/refs/injectors.py similarity index 97% rename from packages/core/minos-microservice-aggregate/minos/aggregate/models/refs/injectors.py rename to packages/core/minos-microservice-aggregate/minos/aggregate/entities/refs/injectors.py index f36214f74..06ed13f7a 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/models/refs/injectors.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/entities/refs/injectors.py @@ -11,7 +11,7 @@ ) -class ModelRefInjector: +class RefInjector: """Model Reference Injector class.""" def __init__(self, value: Any, mapper: dict[UUID, Model]): diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/models/refs/models.py b/packages/core/minos-microservice-aggregate/minos/aggregate/entities/refs/models.py similarity index 94% rename from packages/core/minos-microservice-aggregate/minos/aggregate/models/refs/models.py rename to packages/core/minos-microservice-aggregate/minos/aggregate/entities/refs/models.py index 31a9c86e2..6f3bb1f6b 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/models/refs/models.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/entities/refs/models.py @@ -20,6 +20,9 @@ inject, ) +from minos.aggregate.contextvars import ( + IS_REPOSITORY_SERIALIZATION_CONTEXT_VAR, +) from minos.common import ( DataDecoder, DataEncoder, @@ -36,26 +39,10 @@ BrokerMessageV1Payload, ) -from ...contextvars import ( - IS_REPOSITORY_SERIALIZATION_CONTEXT_VAR, -) -from ..entities import ( - Entity, -) - MT = TypeVar("MT", bound=Model) -class AggregateRef(Entity): - """Aggregate Ref class.""" - - version: int - - def __init__(self, uuid: UUID, *args, **kwargs): - super().__init__(uuid=uuid, *args, **kwargs) - - -class ModelRef(DeclarativeModel, UUID, Generic[MT]): +class Ref(DeclarativeModel, UUID, Generic[MT]): """Model Reference.""" data: Union[MT, UUID] @@ -131,7 +118,7 @@ def encode_data(encoder: DataEncoder, target: Any, **kwargs) -> Any: return encoder.build(target, **kwargs) @classmethod - def decode_data(cls, decoder: DataDecoder, target: Any, type_: ModelType, **kwargs) -> ModelRef: + def decode_data(cls, decoder: DataDecoder, target: Any, type_: ModelType, **kwargs) -> Ref: """Decode data with the given decoder. :param decoder: The decoder instance. diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/models/refs/resolvers.py b/packages/core/minos-microservice-aggregate/minos/aggregate/entities/refs/resolvers.py similarity index 87% rename from packages/core/minos-microservice-aggregate/minos/aggregate/models/refs/resolvers.py rename to packages/core/minos-microservice-aggregate/minos/aggregate/entities/refs/resolvers.py index 5bd227148..72b51fccd 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/models/refs/resolvers.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/entities/refs/resolvers.py @@ -30,15 +30,15 @@ ) from .extractors import ( - ModelRefExtractor, + RefExtractor, ) from .injectors import ( - ModelRefInjector, + RefInjector, ) -class ModelRefResolver: - """ModelRef Resolver class.""" +class RefResolver: + """Ref Resolver class.""" # noinspection PyUnusedLocal @inject @@ -47,20 +47,20 @@ def __init__(self, broker_pool: BrokerClientPool = Provide["broker_pool"], **kwa # noinspection PyUnusedLocal async def resolve(self, data: Any, **kwargs) -> Any: - """Resolve ModelRef instances. + """Resolve Ref instances. :param data: The data to be resolved. :param kwargs: Additional named arguments. :return: The data instance with model references already resolved. """ - missing = ModelRefExtractor(data).build() + missing = RefExtractor(data).build() if not len(missing): return data recovered = await self._query(missing) - return ModelRefInjector(data, recovered).build() + return RefInjector(data, recovered).build() async def _query(self, references: dict[str, set[UUID]]) -> dict[UUID, Model]: async with self.broker_pool.acquire() as broker: 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 641eb9679..7dcf102ef 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/events/__init__.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/events/__init__.py @@ -1,6 +1,14 @@ from .entries import ( EventEntry, ) +from .fields import ( + FieldDiff, + FieldDiffContainer, + IncrementalFieldDiff, +) +from .models import ( + Event, +) from .repositories import ( EventRepository, InMemoryEventRepository, diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/events/entries.py b/packages/core/minos-microservice-aggregate/minos/aggregate/events/entries.py index 57eaf6cf7..2d33a57f7 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/events/entries.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/events/entries.py @@ -10,7 +10,6 @@ Any, Iterable, Optional, - Type, Union, ) from uuid import ( @@ -22,12 +21,19 @@ import_module, ) +from ..actions import ( + Action, +) +from .fields import ( + FieldDiffContainer, +) +from .models import ( + Event, +) + if TYPE_CHECKING: - from ..models import ( - Action, - Aggregate, - AggregateDiff, - FieldDiffContainer, + from ..entities import ( + RootEntity, ) from ..transactions import ( TransactionEntry, @@ -35,11 +41,11 @@ class EventEntry: - """Class that represents an entry (or row) on the events repository database which stores the aggregate changes.""" + """Class that represents an entry (or row) on the event repository database which stores the root entity changes.""" __slots__ = ( - "aggregate_uuid", - "aggregate_name", + "uuid", + "name", "version", "data", "id", @@ -51,8 +57,8 @@ class EventEntry: # noinspection PyShadowingBuiltins def __init__( self, - aggregate_uuid: UUID, - aggregate_name: str, + uuid: UUID, + name: str, version: Optional[int] = None, data: Union[bytes, memoryview] = bytes(), id: Optional[int] = None, @@ -63,14 +69,10 @@ def __init__( if isinstance(data, memoryview): data = data.tobytes() if action is not None and isinstance(action, str): - from ..models import ( - Action, - ) - action = Action.value_of(action) - self.aggregate_uuid = aggregate_uuid - self.aggregate_name = aggregate_name + self.uuid = uuid + self.name = name self.version = version self.data = data @@ -80,12 +82,10 @@ def __init__( self.transaction_uuid = transaction_uuid @classmethod - def from_aggregate_diff( - cls, aggregate_diff: AggregateDiff, *, transaction: Optional[TransactionEntry] = None, **kwargs - ) -> EventEntry: - """Build a new instance from an ``Aggregate``. + def from_event(cls, event: Event, *, transaction: Optional[TransactionEntry] = None, **kwargs) -> EventEntry: + """Build a new instance from a ``RootEntity``. - :param aggregate_diff: The aggregate difference. + :param event: The event. :param transaction: Optional transaction. :param kwargs: Additional named arguments. :return: A new ``EventEntry`` instance. @@ -95,10 +95,10 @@ def from_aggregate_diff( # noinspection PyTypeChecker return cls( - aggregate_uuid=aggregate_diff.uuid, - aggregate_name=aggregate_diff.name, - data=aggregate_diff.fields_diff.avro_bytes, - action=aggregate_diff.action, + uuid=event.uuid, + name=event.name, + data=event.fields_diff.avro_bytes, + action=event.action, **kwargs, ) @@ -118,8 +118,8 @@ def as_raw(self) -> dict[str, Any]: :return: A dictionary in which the keys are attribute names and values the attribute contents. """ return { - "aggregate_uuid": self.aggregate_uuid, - "aggregate_name": self.aggregate_name, + "uuid": self.uuid, + "name": self.name, "version": self.version, "data": self.data, "id": self.id, @@ -129,27 +129,23 @@ def as_raw(self) -> dict[str, Any]: } @property - def aggregate_cls(self) -> Type[Aggregate]: - """Load the concrete ``Aggregate`` class. + def type_(self) -> type[RootEntity]: + """Load the concrete ``RootEntity`` class. :return: A ``Type`` object. """ # noinspection PyTypeChecker - return import_module(self.aggregate_name) + return import_module(self.name) @property - def aggregate_diff(self) -> AggregateDiff: - """Get the stored ``AggregateDiff`` instance. + def event(self) -> Event: + """Get the stored ``Event`` instance. - :return: An ``AggregateDiff`` instance. + :return: An ``Event`` instance. """ - from ..models import ( - AggregateDiff, - ) - - return AggregateDiff( - self.aggregate_uuid, - self.aggregate_name, + return Event( + self.uuid, + self.name, self.version, self.action, self.created_at, @@ -162,10 +158,6 @@ def field_diff_container(self) -> FieldDiffContainer: :return: A ``FieldDiffContainer`` instance. """ - from ..models import ( - FieldDiffContainer, - ) - if not self.data: return FieldDiffContainer.empty() @@ -179,8 +171,8 @@ def __hash__(self) -> int: def __iter__(self) -> Iterable: yield from ( - self.aggregate_uuid, - self.aggregate_name, + self.uuid, + self.name, self.version, self.data, self.id, @@ -192,7 +184,7 @@ def __iter__(self) -> Iterable: def __repr__(self): return ( f"{type(self).__name__}(" - f"aggregate_uuid={self.aggregate_uuid!r}, aggregate_name={self.aggregate_name!r}, " + f"uuid={self.uuid!r}, name={self.name!r}, " f"version={self.version!r}, len(data)={len(self.data)!r}, " f"id={self.id!r}, action={self.action!r}, created_at={self.created_at!r}, " f"transaction_uuid={self.transaction_uuid!r})" diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/models/diffs/fields.py b/packages/core/minos-microservice-aggregate/minos/aggregate/events/fields.py similarity index 98% rename from packages/core/minos-microservice-aggregate/minos/aggregate/models/diffs/fields.py rename to packages/core/minos-microservice-aggregate/minos/aggregate/events/fields.py index c55af6a21..14eb43938 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/models/diffs/fields.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/events/fields.py @@ -22,6 +22,12 @@ uuid4, ) +from minos.aggregate.actions import ( + Action, +) +from minos.aggregate.collections import ( + IncrementalSet, +) from minos.common import ( BucketModel, Field, @@ -29,13 +35,6 @@ ModelType, ) -from ..actions import ( - Action, -) -from ..collections import ( - IncrementalSet, -) - logger = logging.getLogger(__name__) T = TypeVar("T") diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/models/diffs/aggregates.py b/packages/core/minos-microservice-aggregate/minos/aggregate/events/models.py similarity index 61% rename from packages/core/minos-microservice-aggregate/minos/aggregate/models/diffs/aggregates.py rename to packages/core/minos-microservice-aggregate/minos/aggregate/events/models.py index f0a1e69e3..ecf7afd30 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/models/diffs/aggregates.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/events/models.py @@ -21,29 +21,29 @@ UUID, ) +from minos.aggregate.actions import ( + Action, +) from minos.common import ( DeclarativeModel, ) -from ..actions import ( - Action, -) from .fields import ( FieldDiff, FieldDiffContainer, ) if TYPE_CHECKING: - from ..aggregates import ( - Aggregate, + from minos.aggregate.entities import ( + RootEntity, ) logger = logging.getLogger(__name__) @total_ordering -class AggregateDiff(DeclarativeModel): - """Aggregate Diff class.""" +class Event(DeclarativeModel): + """Event class.""" uuid: UUID name: str @@ -55,7 +55,7 @@ class AggregateDiff(DeclarativeModel): @property def simplified_name(self) -> str: - """Get the Aggregate's simplified name. + """Get the RootEntity's simplified name. :return: An string value. """ @@ -95,20 +95,19 @@ def get_all(self, return_diff: bool = False) -> dict[str, Union[FieldDiff, Any, return self.fields_diff.get_all(return_diff) @classmethod - def from_difference(cls, a: Aggregate, b: Aggregate, action: Action = Action.UPDATE) -> AggregateDiff: - """Build an ``AggregateDiff`` instance from the difference of two aggregates. + def from_difference(cls, a: RootEntity, b: RootEntity, action: Action = Action.UPDATE) -> Event: + """Build an ``Event`` instance from the difference of two instances. - :param a: One ``Aggregate`` instance. - :param b: Another ``Aggregate`` instance. - :param action: The action to that generates the aggregate difference. - :return: An ``AggregateDiff`` instance. + :param a: One ``RootEntity`` instance. + :param b: Another ``RootEntity`` instance. + :param action: The action that generates the ``RootEntity`` difference. + :return: An ``Event`` instance. """ logger.debug(f"Computing the {cls!r} between {a!r} and {b!r}...") if a.uuid != b.uuid: raise ValueError( - f"To compute aggregate differences, both arguments must have same identifier. " - f"Obtained: {a.uuid!r} vs {b.uuid!r}" + f"To compute differences, both arguments must have same identifier. Obtained: {a.uuid!r} vs {b.uuid!r}" ) old, new = sorted([a, b], key=attrgetter("version")) @@ -125,45 +124,45 @@ def from_difference(cls, a: Aggregate, b: Aggregate, action: Action = Action.UPD ) @classmethod - def from_aggregate(cls, aggregate: Aggregate, action: Action = Action.CREATE) -> AggregateDiff: - """Build an ``AggregateDiff`` from an ``Aggregate`` (considering all fields as differences). + def from_root_entity(cls, instance: RootEntity, action: Action = Action.CREATE) -> Event: + """Build an ``Event`` from a ``RootEntity`` (considering all fields as differences). - :param aggregate: An ``Aggregate`` instance. - :param action: The action to that generates the aggregate difference. - :return: An ``AggregateDiff`` instance. + :param instance: A ``RootEntity`` instance. + :param action: The action that generates the event. + :return: An ``Event`` instance. """ - fields_diff = FieldDiffContainer.from_model(aggregate, ignore={"uuid", "version", "created_at", "updated_at"}) + fields_diff = FieldDiffContainer.from_model(instance, ignore={"uuid", "version", "created_at", "updated_at"}) return cls( - uuid=aggregate.uuid, - name=aggregate.classname, - version=aggregate.version, + uuid=instance.uuid, + name=instance.classname, + version=instance.version, action=action, - created_at=aggregate.updated_at, + created_at=instance.updated_at, fields_diff=fields_diff, ) @classmethod - def from_deleted_aggregate(cls, aggregate: Aggregate, action: Action = Action.DELETE) -> AggregateDiff: - """Build an ``AggregateDiff`` from an ``Aggregate`` (considering all fields as differences). + def from_deleted_root_entity(cls, instance: RootEntity, action: Action = Action.DELETE) -> Event: + """Build an ``Event`` from a ``RootEntity`` (considering all fields as differences). - :param aggregate: An ``Aggregate`` instance. - :param action: The action to that generates the aggregate difference. - :return: An ``AggregateDiff`` instance. + :param instance: A ``RootEntity`` instance. + :param action: The action that generates the event. + :return: An ``Event`` instance. """ return cls( - uuid=aggregate.uuid, - name=aggregate.classname, - version=aggregate.version, + uuid=instance.uuid, + name=instance.classname, + version=instance.version, action=action, - created_at=aggregate.updated_at, + created_at=instance.updated_at, fields_diff=FieldDiffContainer.empty(), ) - def decompose(self) -> list[AggregateDiff]: - """Decompose AggregateDiff Fields into AggregateDiff with once Field. + def decompose(self) -> list[Event]: + """Decompose the ``Event`` fields into multiple ``Event`` instances with once Field. - :return: An list of``AggregateDiff`` instances. + :return: An list of``Event`` instances. """ return [ type(self)( 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 36588812f..b42c67b88 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,7 +13,6 @@ suppress, ) from typing import ( - TYPE_CHECKING, AsyncIterator, Awaitable, Optional, @@ -42,6 +41,9 @@ BrokerPublisher, ) +from ...actions import ( + Action, +) from ...contextvars import ( IS_REPOSITORY_SERIALIZATION_CONTEXT_VAR, ) @@ -58,11 +60,12 @@ from ..entries import ( EventEntry, ) - -if TYPE_CHECKING: - from ...models import ( - AggregateDiff, - ) +from ..fields import ( + IncrementalFieldDiff, +) +from ..models import ( + Event, +) class EventRepository(ABC, MinosSetup): @@ -100,63 +103,50 @@ def transaction(self, **kwargs) -> TransactionEntry: """ return TransactionEntry(event_repository=self, transaction_repository=self._transaction_repository, **kwargs) - async def create(self, entry: Union[AggregateDiff, EventEntry]) -> EventEntry: + async def create(self, entry: Union[Event, EventEntry]) -> EventEntry: """Store new creation entry into the repository. :param entry: Entry to be stored. :return: The repository entry containing the stored information. """ - from ...models import ( - Action, - ) entry.action = Action.CREATE return await self.submit(entry) - async def update(self, entry: Union[AggregateDiff, EventEntry]) -> EventEntry: + async def update(self, entry: Union[Event, EventEntry]) -> EventEntry: """Store new update entry into the repository. :param entry: Entry to be stored. :return: The repository entry containing the stored information. """ - from ...models import ( - Action, - ) entry.action = Action.UPDATE return await self.submit(entry) - async def delete(self, entry: Union[AggregateDiff, EventEntry]) -> EventEntry: + async def delete(self, entry: Union[Event, EventEntry]) -> EventEntry: """Store new deletion entry into the repository. :param entry: Entry to be stored. :return: The repository entry containing the stored information. """ - from ...models import ( - Action, - ) entry.action = Action.DELETE return await self.submit(entry) - async def submit(self, entry: Union[AggregateDiff, EventEntry], **kwargs) -> EventEntry: + async def submit(self, entry: Union[Event, EventEntry], **kwargs) -> EventEntry: """Store new entry into the repository. :param entry: The entry to be stored. :param kwargs: Additional named arguments. :return: The repository entry containing the stored information. """ - from ...models import ( - Action, - AggregateDiff, - ) token = IS_REPOSITORY_SERIALIZATION_CONTEXT_VAR.set(True) try: transaction = TRANSACTION_CONTEXT_VAR.get() - if isinstance(entry, AggregateDiff): - entry = EventEntry.from_aggregate_diff(entry, transaction=transaction) + if isinstance(entry, Event): + entry = EventEntry.from_event(entry, transaction=transaction) if not isinstance(entry.action, Action): raise EventRepositoryException("The 'EventEntry.action' attribute must be an 'Action' instance.") @@ -168,7 +158,7 @@ async def submit(self, entry: Union[AggregateDiff, EventEntry], **kwargs) -> Eve entry = await self._submit(entry, **kwargs) if entry.transaction_uuid == NULL_UUID: - await self._send_events(entry.aggregate_diff) + await self._send_events(entry.event) finally: IS_REPOSITORY_SERIALIZATION_CONTEXT_VAR.reset(token) @@ -194,9 +184,7 @@ async def validate(self, entry: EventEntry, transaction_uuid_ne: Optional[UUID] if len(transaction_uuids): with suppress(StopAsyncIteration): - iterable = self.select( - aggregate_uuid=entry.aggregate_uuid, transaction_uuid_in=tuple(transaction_uuids), **kwargs - ) + iterable = self.select(uuid=entry.uuid, transaction_uuid_in=tuple(transaction_uuids), **kwargs) await iterable.__anext__() # Will raise a `StopAsyncIteration` exception if not any item. @@ -208,38 +196,30 @@ async def validate(self, entry: EventEntry, transaction_uuid_ne: Optional[UUID] async def _submit(self, entry: EventEntry, **kwargs) -> EventEntry: raise NotImplementedError - async def _send_events(self, aggregate_diff: AggregateDiff): - from ...models import ( - Action, - ) - + async def _send_events(self, event: Event): suffix_mapper = { Action.CREATE: "Created", Action.UPDATE: "Updated", Action.DELETE: "Deleted", } - topic = f"{aggregate_diff.simplified_name}{suffix_mapper[aggregate_diff.action]}" + topic = f"{event.simplified_name}{suffix_mapper[event.action]}" message = BrokerMessageV1( topic=topic, - payload=BrokerMessageV1Payload(content=aggregate_diff), + payload=BrokerMessageV1Payload(content=event), strategy=BrokerMessageV1Strategy.MULTICAST, ) futures = [self._broker_publisher.send(message)] - if aggregate_diff.action == Action.UPDATE: - from ...models import ( - IncrementalFieldDiff, - ) - - for decomposed_aggregate_diff in aggregate_diff.decompose(): - diff = next(iter(decomposed_aggregate_diff.fields_diff.flatten_values())) + if event.action == Action.UPDATE: + for decomposed_event in event.decompose(): + diff = next(iter(decomposed_event.fields_diff.flatten_values())) composed_topic = f"{topic}.{diff.name}" if isinstance(diff, IncrementalFieldDiff): composed_topic += f".{diff.action.value}" message = BrokerMessageV1( topic=composed_topic, - payload=BrokerMessageV1Payload(content=decomposed_aggregate_diff), + payload=BrokerMessageV1Payload(content=decomposed_event), strategy=BrokerMessageV1Strategy.MULTICAST, ) futures.append(self._broker_publisher.send(message)) @@ -249,8 +229,8 @@ async def _send_events(self, aggregate_diff: AggregateDiff): # noinspection PyShadowingBuiltins async def select( self, - aggregate_uuid: Optional[UUID] = None, - aggregate_name: Optional[str] = None, + uuid: Optional[UUID] = None, + name: Optional[str] = None, version: Optional[int] = None, version_lt: Optional[int] = None, version_gt: Optional[int] = None, @@ -268,26 +248,26 @@ async def select( ) -> AsyncIterator[EventEntry]: """Perform a selection query of entries stored in to the repository. - :param aggregate_uuid: Aggregate identifier. - :param aggregate_name: Aggregate name. - :param version: Aggregate version. - :param version_lt: Aggregate version lower than the given value. - :param version_gt: Aggregate version greater than the given value. - :param version_le: Aggregate version lower or equal to the given value. - :param version_ge: Aggregate version greater or equal to the given value. - :param id: Entry identifier. - :param id_lt: Entry identifier lower than the given value. - :param id_gt: Entry identifier greater than the given value. - :param id_le: Entry identifier lower or equal to the given value. - :param id_ge: Entry identifier greater or equal to the given value. - :param transaction_uuid: Transaction identifier. - :param transaction_uuid_ne: Transaction identifier distinct of the given value. - :param transaction_uuid_in: Destination Transaction identifier equal to one of the given values. + :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 list of entries. """ generator = self._select( - aggregate_uuid=aggregate_uuid, - aggregate_name=aggregate_name, + uuid=uuid, + name=name, version=version, version_lt=version_lt, version_gt=version_gt, diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/events/repositories/memory.py b/packages/core/minos-microservice-aggregate/minos/aggregate/events/repositories/memory.py index 737fa787c..73dcd74f0 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/events/repositories/memory.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/events/repositories/memory.py @@ -43,8 +43,8 @@ def __init__(self, *args, **kwargs): self._next_versions = defaultdict(int) async def _submit(self, entry: EventEntry, **kwargs) -> EventEntry: - if entry.aggregate_uuid == NULL_UUID: - entry.aggregate_uuid = uuid4() + if entry.uuid == NULL_UUID: + entry.uuid = uuid4() next_version = self._get_next_version_id(entry) if entry.version is None: @@ -66,14 +66,14 @@ def _generate_next_id(self) -> int: return next(self._id_generator) + 1 def _get_next_version_id(self, entry: EventEntry) -> int: - key = (entry.aggregate_name, entry.aggregate_uuid, entry.transaction_uuid) + key = (entry.name, entry.uuid, entry.transaction_uuid) self._next_versions[key] += 1 return self._next_versions[key] async def _select( self, - aggregate_uuid: Optional[int] = None, - aggregate_name: Optional[str] = None, + uuid: Optional[int] = None, + name: Optional[str] = None, version: Optional[int] = None, version_lt: Optional[int] = None, version_gt: Optional[int] = None, @@ -93,9 +93,9 @@ async def _select( # noinspection DuplicatedCode def _fn_filter(entry: EventEntry) -> bool: - if aggregate_uuid is not None and aggregate_uuid != entry.aggregate_uuid: + if uuid is not None and uuid != entry.uuid: return False - if aggregate_name is not None and aggregate_name != entry.aggregate_name: + if name is not None and name != entry.name: return False if version is not None and version != entry.version: return False 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 index 834c6a2fd..c70bcac64 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/events/repositories/pg.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/events/repositories/pg.py @@ -58,8 +58,8 @@ async def _setup(self): async def _submit(self, entry: EventEntry, **kwargs) -> EventEntry: lock = None - if entry.aggregate_uuid != NULL_UUID: - lock = entry.aggregate_uuid.int & (1 << 32) - 1 + if entry.uuid != NULL_UUID: + lock = entry.uuid.int & (1 << 32) - 1 query, params = await self._build_query(entry) @@ -71,7 +71,7 @@ async def _submit(self, entry: EventEntry, **kwargs) -> EventEntry: await self.offset, ) - entry.id, entry.aggregate_uuid, entry.version, entry.created_at = response + entry.id, entry.uuid, entry.version, entry.created_at = response return entry async def _build_query(self, entry: EventEntry) -> tuple[Composable, dict[str, UUID]]: @@ -105,8 +105,8 @@ async def _select(self, **kwargs) -> AsyncIterator[EventEntry]: # noinspection PyUnusedLocal @staticmethod def _build_select_query( - aggregate_uuid: Optional[UUID] = None, - aggregate_name: Optional[str] = None, + uuid: Optional[UUID] = None, + name: Optional[str] = None, version: Optional[int] = None, version_lt: Optional[int] = None, version_gt: Optional[int] = None, @@ -124,10 +124,10 @@ def _build_select_query( ) -> str: conditions = list() - if aggregate_uuid is not None: - conditions.append("aggregate_uuid = %(aggregate_uuid)s") - if aggregate_name is not None: - conditions.append("aggregate_name = %(aggregate_name)s") + 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: @@ -186,51 +186,51 @@ async def _offset(self) -> int: CREATE TABLE IF NOT EXISTS aggregate_event ( id BIGSERIAL PRIMARY KEY, action ACTION_TYPE NOT NULL, - aggregate_uuid UUID NOT NULL, - aggregate_name TEXT 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 (aggregate_uuid, version, transaction_uuid) + UNIQUE (uuid, version, transaction_uuid) ); """.strip() _INSERT_VALUES_QUERY = SQL( """ -INSERT INTO aggregate_event (id, action, aggregate_uuid, aggregate_name, version, data, created_at, transaction_uuid) +INSERT INTO aggregate_event (id, action, uuid, name, version, data, created_at, transaction_uuid) VALUES ( default, %(action)s, - CASE %(aggregate_uuid)s WHEN uuid_nil() THEN uuid_generate_v4() ELSE %(aggregate_uuid)s END, - %(aggregate_name)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.aggregate_uuid) t1.version + SELECT DISTINCT ON (t1.uuid) t1.version FROM ( {from_parts} ) AS t1 - ORDER BY t1.aggregate_uuid, t1.transaction_index DESC + 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, aggregate_uuid, version, created_at; +RETURNING id, uuid, version, created_at; """ ) _SELECT_TRANSACTION_CHUNK = SQL( """ -SELECT {index} AS transaction_index, aggregate_uuid, MAX(version) AS version +SELECT {index} AS transaction_index, uuid, MAX(version) AS version FROM aggregate_event -WHERE aggregate_uuid = %(aggregate_uuid)s AND transaction_uuid = {transaction_uuid} -GROUP BY aggregate_uuid +WHERE uuid = %(uuid)s AND transaction_uuid = {transaction_uuid} +GROUP BY uuid """ ) _SELECT_ALL_ENTRIES_QUERY = """ -SELECT aggregate_uuid, aggregate_name, version, data, id, action, created_at, transaction_uuid +SELECT uuid, name, version, data, id, action, created_at, transaction_uuid 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 3f317c4e3..0b39bab65 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/exceptions.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/exceptions.py @@ -11,9 +11,11 @@ ) if TYPE_CHECKING: + from .entities import ( + RootEntity, + ) from .models import ( - Aggregate, - AggregateDiff, + Event, ) @@ -52,21 +54,21 @@ class SnapshotRepositoryException(AggregateException): class SnapshotRepositoryConflictException(SnapshotRepositoryException): """Exception to be raised when current version is newer than the one to be processed.""" - def __init__(self, previous: Aggregate, aggregate_diff: AggregateDiff): + def __init__(self, previous: RootEntity, event: Event): self.previous = previous - self.aggregate_diff = aggregate_diff + self.event = event super().__init__( - f"Version for {repr(previous.classname)} aggregate must be " - f"greater than {previous.version}. Obtained: {aggregate_diff.version}" + f"Version for {repr(previous.classname)} root entity must be " + f"greater than {previous.version}. Obtained: {event.version}" ) -class AggregateNotFoundException(SnapshotRepositoryException): - """Exception to be raised when some aggregate is not found on the repository.""" +class NotFoundException(SnapshotRepositoryException): + """Exception to be raised when a ``RootEntity`` is not found on the repository.""" -class DeletedAggregateException(SnapshotRepositoryException): - """Exception to be raised when some aggregate is already deleted from the repository.""" +class AlreadyDeletedException(SnapshotRepositoryException): + """Exception to be raised when a ``RootEntity`` is already deleted from the repository.""" class ValueObjectException(AggregateException): diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/models/__init__.py b/packages/core/minos-microservice-aggregate/minos/aggregate/models/__init__.py deleted file mode 100644 index d05225f1d..000000000 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/models/__init__.py +++ /dev/null @@ -1,32 +0,0 @@ -from .actions import ( - Action, -) -from .aggregates import ( - Aggregate, -) -from .collections import ( - IncrementalSet, - IncrementalSetDiff, - IncrementalSetDiffEntry, -) -from .diffs import ( - AggregateDiff, - FieldDiff, - FieldDiffContainer, - IncrementalFieldDiff, -) -from .entities import ( - Entity, - EntitySet, -) -from .refs import ( - AggregateRef, - ModelRef, - ModelRefExtractor, - ModelRefInjector, - ModelRefResolver, -) -from .value_objects import ( - ValueObject, - ValueObjectSet, -) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/models/diffs/__init__.py b/packages/core/minos-microservice-aggregate/minos/aggregate/models/diffs/__init__.py deleted file mode 100644 index 2543280c3..000000000 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/models/diffs/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -from .aggregates import ( - AggregateDiff, -) -from .fields import ( - FieldDiff, - FieldDiffContainer, - IncrementalFieldDiff, -) diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/abc.py b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/abc.py index 082a0dbb0..ec090eb03 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/abc.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/abc.py @@ -30,55 +30,54 @@ ) if TYPE_CHECKING: - from ..models import ( - Aggregate, + from ..entities import ( + RootEntity, ) class SnapshotRepository(ABC, MinosSetup): """Base Snapshot class. - The snapshot provides a direct accessor to the aggregate instances stored as events by the event repository class. + The snapshot provides a direct accessor to the ``RootEntity`` instances stored as events by the event repository + class. """ - async def get( - self, aggregate_name: str, uuid: UUID, transaction: Optional[TransactionEntry] = None, **kwargs - ) -> Aggregate: - """Get an aggregate instance from its identifier. + async def get(self, name: str, uuid: UUID, transaction: Optional[TransactionEntry] = None, **kwargs) -> RootEntity: + """Get a ``RootEntity`` instance from its identifier. - :param aggregate_name: Class name of the ``Aggregate``. - :param uuid: Identifier of the ``Aggregate``. + :param name: Class name of the ``RootEntity``. + :param uuid: Identifier of the ``RootEntity``. :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 kwargs: Additional named arguments. - :return: The ``Aggregate`` instance. + :return: The ``RootEntity`` instance. """ if transaction is None: transaction = TRANSACTION_CONTEXT_VAR.get() await self.synchronize(**kwargs) - return await self._get(aggregate_name=aggregate_name, uuid=uuid, transaction=transaction, **kwargs) + return await self._get(name=name, uuid=uuid, transaction=transaction, **kwargs) @abstractmethod - async def _get(self, *args, **kwargs) -> Aggregate: + async def _get(self, *args, **kwargs) -> RootEntity: raise NotImplementedError async def find( self, - aggregate_name: str, + name: str, condition: _Condition, ordering: Optional[_Ordering] = None, limit: Optional[int] = None, streaming_mode: bool = False, transaction: Optional[TransactionEntry] = None, **kwargs, - ) -> AsyncIterator[Aggregate]: - """Find a collection of ``Aggregate`` instances based on a ``Condition``. + ) -> AsyncIterator[RootEntity]: + """Find a collection of ``RootEntity`` instances based on a ``Condition``. - :param aggregate_name: Class name of the ``Aggregate``. - :param condition: The condition that must be satisfied by the ``Aggregate`` instances. + :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 @@ -89,7 +88,7 @@ async def find( transaction is extracted from the context var. If not any transaction is being scoped then the query is performed to the global snapshot. :param kwargs: Additional named arguments. - :return: An asynchronous iterator that containing the ``Aggregate`` instances. + :return: An asynchronous iterator that containing the ``RootEntity`` instances. """ if transaction is None: transaction = TRANSACTION_CONTEXT_VAR.get() @@ -97,7 +96,7 @@ async def find( await self.synchronize(**kwargs) iterable = self._find( - aggregate_name=aggregate_name, + name=name, condition=condition, ordering=ordering, limit=limit, @@ -106,11 +105,11 @@ async def find( **kwargs, ) - async for aggregate in iterable: - yield aggregate + async for instance in iterable: + yield instance @abstractmethod - def _find(self, *args, **kwargs) -> AsyncIterator[Aggregate]: + def _find(self, *args, **kwargs) -> AsyncIterator[RootEntity]: raise NotImplementedError def synchronize(self, **kwargs) -> Awaitable[None]: 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 41d1e234c..73b8afab1 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/entries.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/entries.py @@ -11,7 +11,6 @@ Any, Iterable, Optional, - Type, Union, ) from uuid import ( @@ -28,12 +27,12 @@ EventEntry, ) from ..exceptions import ( - DeletedAggregateException, + AlreadyDeletedException, ) if TYPE_CHECKING: - from ..models import ( - Aggregate, + from ..entities import ( + RootEntity, ) @@ -44,8 +43,8 @@ class SnapshotEntry: """ __slots__ = ( - "aggregate_uuid", - "aggregate_name", + "uuid", + "name", "version", "schema", "data", @@ -57,8 +56,8 @@ class SnapshotEntry: # noinspection PyShadowingBuiltins def __init__( self, - aggregate_uuid: UUID, - aggregate_name: str, + uuid: UUID, + name: str, version: int, schema: Optional[Union[list[dict[str, Any]], dict[str, Any]]] = None, data: Optional[dict[str, Any]] = None, @@ -71,8 +70,8 @@ def __init__( if isinstance(schema, bytes): schema = MinosJsonBinaryProtocol.decode(schema) - self.aggregate_uuid = aggregate_uuid - self.aggregate_name = aggregate_name + self.uuid = uuid + self.name = name self.version = version self.schema = schema @@ -84,25 +83,23 @@ def __init__( self.transaction_uuid = transaction_uuid @classmethod - def from_aggregate(cls, aggregate: Aggregate, **kwargs) -> SnapshotEntry: - """Build a new instance from an ``Aggregate``. + def from_root_entity(cls, instance: RootEntity, **kwargs) -> SnapshotEntry: + """Build a new instance from a ``RootEntity``. - :param aggregate: The aggregate instance. - :return: A new ``MinosSnapshotEntry`` instance. + :param instance: The ``RootEntity`` instance. + :return: A new ``SnapshotEntry`` instance. """ - data = { - k: v for k, v in aggregate.avro_data.items() if k not in {"uuid", "version", "created_at", "updated_at"} - } + data = {k: v for k, v in instance.avro_data.items() if k not in {"uuid", "version", "created_at", "updated_at"}} # noinspection PyTypeChecker return cls( - aggregate_uuid=aggregate.uuid, - aggregate_name=aggregate.classname, - version=aggregate.version, - schema=aggregate.avro_schema, + uuid=instance.uuid, + name=instance.classname, + version=instance.version, + schema=instance.avro_schema, data=data, - created_at=aggregate.created_at, - updated_at=aggregate.updated_at, + created_at=instance.created_at, + updated_at=instance.updated_at, **kwargs, ) @@ -114,8 +111,8 @@ def from_event_entry(cls, entry: EventEntry) -> SnapshotEntry: :return: A new ``SnapshotEntry`` instance. """ return cls( - aggregate_uuid=entry.aggregate_uuid, - aggregate_name=entry.aggregate_name, + uuid=entry.uuid, + name=entry.name, version=entry.version, created_at=entry.created_at, updated_at=entry.created_at, @@ -128,8 +125,8 @@ def as_raw(self) -> dict[str, Any]: :return: A dictionary in which the keys are attribute names and values the attribute contents. """ return { - "aggregate_uuid": self.aggregate_uuid, - "aggregate_name": self.aggregate_name, + "uuid": self.uuid, + "name": self.name, "version": self.version, "schema": self.encoded_schema, "data": self.encoded_data, @@ -160,37 +157,37 @@ def encoded_data(self) -> Optional[str]: return json.dumps(self.data) - def build_aggregate(self, **kwargs) -> Aggregate: - """Rebuild the stored ``Aggregate`` object instance from the internal state. + def build(self, **kwargs) -> RootEntity: + """Rebuild the stored ``RootEntity`` object instance from the internal state. :param kwargs: Additional named arguments. - :return: A ``Aggregate`` instance. + :return: A ``RootEntity`` instance. """ - from ..models import ( - Aggregate, + from ..entities import ( + RootEntity, ) if self.data is None: - raise DeletedAggregateException(f"The {self.aggregate_uuid!r} id points to an already deleted aggregate.") + raise AlreadyDeletedException(f"The {self.uuid!r} identifier belongs to an already deleted instance.") data = dict(self.data) data |= { - "uuid": self.aggregate_uuid, + "uuid": self.uuid, "version": self.version, "created_at": self.created_at, "updated_at": self.updated_at, } data |= kwargs - instance = Aggregate.from_avro(self.schema, data) + instance = RootEntity.from_avro(self.schema, data) return instance @property - def aggregate_cls(self) -> Type[Aggregate]: - """Load the concrete ``Aggregate`` class. + def type_(self) -> type[RootEntity]: + """Load the concrete ``RootEntity`` class. :return: A ``Type`` object. """ # noinspection PyTypeChecker - return import_module(self.aggregate_name) + return import_module(self.name) def __eq__(self, other: SnapshotEntry) -> bool: return type(self) == type(other) and tuple(self) == tuple(other) @@ -198,7 +195,7 @@ def __eq__(self, other: SnapshotEntry) -> bool: def __iter__(self) -> Iterable: # noinspection PyRedundantParentheses yield from ( - self.aggregate_name, + self.name, self.version, self.schema, self.data, @@ -210,7 +207,7 @@ def __iter__(self) -> Iterable: def __repr__(self): name = type(self).__name__ return ( - f"{name}(aggregate_uuid={self.aggregate_uuid!r}, aggregate_name={self.aggregate_name!r}, " + f"{name}(uuid={self.uuid!r}, name={self.name!r}, " f"version={self.version!r}, schema={self.schema!r}, data={self.data!r}, " f"created_at={self.created_at!r}, updated_at={self.updated_at!r}, " f"transaction_uuid={self.transaction_uuid!r})" diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/memory.py b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/memory.py index 3dec8858e..174cc9372 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/memory.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/memory.py @@ -29,8 +29,8 @@ EventRepository, ) from ..exceptions import ( - AggregateNotFoundException, - DeletedAggregateException, + AlreadyDeletedException, + NotFoundException, ) from ..queries import ( _Condition, @@ -46,15 +46,16 @@ ) if TYPE_CHECKING: - from ..models import ( - Aggregate, + from ..entities import ( + RootEntity, ) class InMemorySnapshotRepository(SnapshotRepository): """InMemory Snapshot class. - The snapshot provides a direct accessor to the aggregate instances stored as events by the event repository class. + The snapshot provides a direct accessor to the ``RootEntity`` instances stored as events by the event repository + class. """ @inject @@ -78,47 +79,45 @@ def __init__( async def _find( self, - aggregate_name: str, + name: str, condition: _Condition, ordering: Optional[_Ordering] = None, limit: Optional[int] = None, **kwargs, - ) -> AsyncIterator[Aggregate]: - uuids = {v.aggregate_uuid async for v in self._event_repository.select(aggregate_name=aggregate_name)} + ) -> AsyncIterator[RootEntity]: + uuids = {v.uuid async for v in self._event_repository.select(name=name)} - aggregates = list() + instances = list() for uuid in uuids: try: - aggregate = await self.get(aggregate_name, uuid, **kwargs) - except DeletedAggregateException: + instance = await self.get(name, uuid, **kwargs) + except AlreadyDeletedException: continue - if condition.evaluate(aggregate): - aggregates.append(aggregate) + if condition.evaluate(instance): + instances.append(instance) if ordering is not None: - aggregates.sort(key=attrgetter(ordering.by), reverse=ordering.reverse) + instances.sort(key=attrgetter(ordering.by), reverse=ordering.reverse) if limit is not None: - aggregates = aggregates[:limit] + instances = instances[:limit] - for aggregate in aggregates: - yield aggregate + for instance in instances: + yield instance # noinspection PyMethodOverriding - async def _get( - self, aggregate_name: str, uuid: UUID, transaction: Optional[TransactionEntry] = None, **kwargs - ) -> Aggregate: + async def _get(self, name: str, uuid: UUID, transaction: Optional[TransactionEntry] = None, **kwargs) -> RootEntity: transaction_uuids = await self._get_transaction_uuids(transaction) - entries = await self._get_event_entries(aggregate_name, uuid, transaction_uuids) + entries = await self._get_event_entries(name, uuid, transaction_uuids) if not len(entries): - raise AggregateNotFoundException(f"Not found any entries for the {uuid!r} id.") + raise NotFoundException(f"Not found any entries for the {uuid!r} id.") if entries[-1].action.is_delete: - raise DeletedAggregateException(f"The {uuid!r} id points to an already deleted aggregate.") + raise AlreadyDeletedException(f"The {uuid!r} identifier belongs to an already deleted instance.") - return self._build_aggregate(entries, **kwargs) + return self._build_instance(entries, **kwargs) async def _get_transaction_uuids(self, transaction: Optional[TransactionEntry]) -> tuple[UUID, ...]: if transaction is None: @@ -134,12 +133,10 @@ async def _get_transaction_uuids(self, transaction: Optional[TransactionEntry]) return transaction_uuids - async def _get_event_entries( - self, aggregate_name: str, uuid: UUID, transaction_uuids: tuple[UUID, ...] - ) -> list[EventEntry]: + async def _get_event_entries(self, name: str, uuid: UUID, transaction_uuids: tuple[UUID, ...]) -> list[EventEntry]: entries = [ v - async for v in self._event_repository.select(aggregate_name=aggregate_name, aggregate_uuid=uuid) + async for v in self._event_repository.select(name=name, uuid=uuid) if v.transaction_uuid in transaction_uuids ] @@ -154,12 +151,12 @@ async def _get_event_entries( return entries @staticmethod - def _build_aggregate(entries: list[EventEntry], **kwargs) -> Aggregate: - cls = entries[0].aggregate_cls - aggregate = cls.from_diff(entries[0].aggregate_diff, **kwargs) + def _build_instance(entries: list[EventEntry], **kwargs) -> RootEntity: + cls = entries[0].type_ + instance = cls.from_diff(entries[0].event, **kwargs) for entry in entries[1:]: - aggregate.apply_diff(entry.aggregate_diff) - return aggregate + instance.apply_diff(entry.event) + return instance async def _synchronize(self, **kwargs) -> None: pass 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 index 8ace62d08..36fcb5f42 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/abc.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/abc.py @@ -30,15 +30,15 @@ async def _setup(self) -> None: _CREATE_TABLE_QUERY = """ CREATE TABLE IF NOT EXISTS snapshot ( - aggregate_uuid UUID NOT NULL, - aggregate_name TEXT NOT NULL, + 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 (aggregate_uuid, transaction_uuid) + PRIMARY KEY (uuid, transaction_uuid) ); """.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 index 9d0d12975..9b5aec9f7 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/api.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/api.py @@ -23,15 +23,16 @@ ) if TYPE_CHECKING: - from ...models import ( - Aggregate, + from ...entities import ( + RootEntity, ) class PostgreSqlSnapshotRepository(SnapshotRepository): """PostgreSQL Snapshot class. - The snapshot provides a direct accessor to the aggregate instances stored as events by the event repository class. + The snapshot provides a direct accessor to the ``RootEntity`` instances stored as events by the event repository + class. """ reader: PostgreSqlSnapshotReader @@ -62,10 +63,10 @@ async def _destroy(self) -> None: await self.reader.destroy() await self.writer.destroy() - def _get(self, *args, **kwargs) -> Awaitable[Aggregate]: + def _get(self, *args, **kwargs) -> Awaitable[RootEntity]: return self.reader.get(*args, **kwargs) - def _find(self, *args, **kwargs) -> AsyncIterator[Aggregate]: + def _find(self, *args, **kwargs) -> AsyncIterator[RootEntity]: return self.reader.find(*args, **kwargs) def _synchronize(self, *args, **kwargs) -> Awaitable[None]: diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/queries.py b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/queries.py index 48bc4a118..8dc95af38 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/queries.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/queries.py @@ -59,14 +59,14 @@ class PostgreSqlSnapshotQueryBuilder: def __init__( self, - aggregate_name: str, + name: str, condition: _Condition, ordering: Optional[_Ordering] = None, limit: Optional[int] = None, transaction_uuids: tuple[UUID, ...] = (NULL_UUID,), exclude_deleted: bool = False, ): - self.aggregate_name = aggregate_name + self.name = name self.condition = condition self.ordering = ordering self.limit = limit @@ -93,7 +93,7 @@ def build(self) -> tuple[Composable, dict[str, Any]]: return query, parameters def _build(self) -> Composable: - self._parameters["aggregate_name"] = self.aggregate_name + self._parameters["name"] = self.name query = SQL(" WHERE ").join([self._build_select_from(), self._build_condition(self.condition)]) @@ -213,7 +213,7 @@ def generate_random_str() -> str: } _FIXED_FIELDS_MAPPER = { - "uuid": Identifier("aggregate_uuid"), + "uuid": Identifier("uuid"), "version": Identifier("version"), "created_at": Identifier("created_at"), "updated_at": Identifier("updated_at"), @@ -226,8 +226,8 @@ def generate_random_str() -> str: _SELECT_ENTRIES_QUERY = SQL( "SELECT " - " t2.aggregate_uuid, " - " t2.aggregate_name, " + " t2.uuid, " + " t2.name, " " t2.version, " " t2.schema, " " t2.data, " @@ -235,16 +235,16 @@ def generate_random_str() -> str: " t2.updated_at, " " t2.transaction_uuid " "FROM (" - " SELECT DISTINCT ON (aggregate_uuid) t1.* " + " SELECT DISTINCT ON (uuid) t1.* " " FROM ( {from_parts} ) AS t1 " - " ORDER BY aggregate_uuid, transaction_index DESC " + " ORDER BY uuid, transaction_index DESC " ") AS t2" ) _SELECT_TRANSACTION_CHUNK = SQL( "SELECT {index} AS transaction_index, * " "FROM snapshot " - "WHERE aggregate_name = %(aggregate_name)s AND transaction_uuid = {transaction_uuid} " + "WHERE name = %(name)s AND transaction_uuid = {transaction_uuid} " ) _EXCLUDE_DELETED_CONDITION = SQL("(data IS NOT NULL)") 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 index 2cef349b1..9793b7ddc 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/readers.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/readers.py @@ -17,7 +17,7 @@ ) from ...exceptions import ( - AggregateNotFoundException, + NotFoundException, ) from ...queries import ( _Condition, @@ -38,8 +38,8 @@ ) if TYPE_CHECKING: - from ...models import ( - Aggregate, + from ...entities import ( + RootEntity, ) logger = logging.getLogger(__name__) @@ -48,51 +48,52 @@ class PostgreSqlSnapshotReader(PostgreSqlSnapshotSetup): """PostgreSQL Snapshot class. - The snapshot provides a direct accessor to the aggregate instances stored as events by the event repository class. + The snapshot provides a direct accessor to the ``RootEntity`` instances stored as events by the event repository + class. """ - async def get(self, aggregate_name: str, uuid: UUID, **kwargs) -> Aggregate: - """Get an aggregate instance from its identifier. + async def get(self, name: str, uuid: UUID, **kwargs) -> RootEntity: + """Get a ``RootEntity`` instance from its identifier. - :param aggregate_name: Class name of the ``Aggregate``. - :param uuid: Identifier of the ``Aggregate``. + :param name: Class name of the ``RootEntity``. + :param uuid: Identifier of the ``RootEntity``. :param kwargs: Additional named arguments. - :return: The ``Aggregate`` instance. + :return: The ``RootEntity`` instance. """ - snapshot_entry = await self.get_entry(aggregate_name, uuid, **kwargs) - aggregate = snapshot_entry.build_aggregate(**kwargs) - return aggregate + snapshot_entry = await self.get_entry(name, uuid, **kwargs) + instance = snapshot_entry.build(**kwargs) + return instance # noinspection PyUnusedLocal - async def get_entry(self, aggregate_name: str, uuid: UUID, **kwargs) -> SnapshotEntry: + async def get_entry(self, name: str, uuid: UUID, **kwargs) -> SnapshotEntry: """Get a ``SnapshotEntry`` from its identifier. - :param aggregate_name: Class name of the ``Aggregate``. - :param uuid: Identifier of the ``Aggregate``. + :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( - aggregate_name, _EqualCondition("uuid", uuid), **kwargs | {"exclude_deleted": False} + name, _EqualCondition("uuid", uuid), **kwargs | {"exclude_deleted": False} ).__anext__() except StopAsyncIteration: - raise AggregateNotFoundException(f"Some aggregates could not be found: {uuid!s}") + raise NotFoundException(f"The instance could not be found: {uuid!s}") - async def find(self, *args, **kwargs) -> AsyncIterator[Aggregate]: - """Find a collection of ``Aggregate`` instances based on a ``Condition``. + 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 ``Aggregate`` instances. + :return: An asynchronous iterator that containing the ``RootEntity`` instances. """ async for snapshot_entry in self.find_entries(*args, **kwargs): - yield snapshot_entry.build_aggregate(**kwargs) + yield snapshot_entry.build(**kwargs) async def find_entries( self, - aggregate_name: str, + name: str, condition: _Condition, ordering: Optional[_Ordering] = None, limit: Optional[int] = None, @@ -103,8 +104,8 @@ async def find_entries( ) -> AsyncIterator[SnapshotEntry]: """Find a collection of ``SnapshotEntry`` instances based on a ``Condition``. - :param aggregate_name: Class name of the ``Aggregate``. - :param condition: The condition that must be satisfied by the ``Aggregate`` instances. + :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 @@ -114,19 +115,17 @@ async def find_entries( :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 ``Aggregate`` entries are included, otherwise deleted ``Aggregate`` - entries are filtered. + :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 ``Aggregate`` instances. + :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( - aggregate_name, condition, ordering, limit, transaction_uuids, exclude_deleted - ) + qb = PostgreSqlSnapshotQueryBuilder(name, condition, ordering, limit, transaction_uuids, exclude_deleted) query, parameters = qb.build() async with self.cursor() as cursor: diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/writers.py b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/writers.py index 0c3197ed4..99b62eba4 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/writers.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/pg/writers.py @@ -21,11 +21,12 @@ ) from ...events import ( + Event, EventEntry, EventRepository, ) from ...exceptions import ( - AggregateNotFoundException, + NotFoundException, SnapshotRepositoryConflictException, TransactionNotFoundException, ) @@ -41,9 +42,8 @@ ) if TYPE_CHECKING: - from ...models import ( - Aggregate, - AggregateDiff, + from ...entities import ( + RootEntity, ) from .readers import ( PostgreSqlSnapshotReader, @@ -60,7 +60,7 @@ def __init__( reader: PostgreSqlSnapshotReader, event_repository: EventRepository = Provide["event_repository"], transaction_repository: TransactionRepository = Provide["transaction_repository"], - **kwargs + **kwargs, ): super().__init__(*args, **kwargs) @@ -74,14 +74,14 @@ def __init__( self._event_repository = event_repository self._transaction_repository = transaction_repository - async def is_synced(self, aggregate_name: str, **kwargs) -> bool: - """Check if the snapshot has the latest version of an ``Aggregate`` instance. + async def is_synced(self, name: str, **kwargs) -> bool: + """Check if the snapshot has the latest version of a ``RootEntity`` instance. - :param aggregate_name: Class name of the ``Aggregate`` to be checked. + :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) - iterable = self._event_repository.select(id_gt=offset, aggregate_name=aggregate_name, **kwargs) + iterable = self._event_repository.select(id_gt=offset, name=name, **kwargs) try: await iterable.__anext__() return False @@ -131,42 +131,42 @@ async def _submit_delete(self, event_entry: EventEntry, **kwargs) -> SnapshotEnt return snapshot_entry async def _submit_update_or_create(self, event_entry: EventEntry, **kwargs) -> SnapshotEntry: - aggregate = await self._build_aggregate(event_entry, **kwargs) + instance = await self._build_instance(event_entry, **kwargs) - snapshot_entry = SnapshotEntry.from_aggregate(aggregate, transaction_uuid=event_entry.transaction_uuid) + snapshot_entry = SnapshotEntry.from_root_entity(instance, transaction_uuid=event_entry.transaction_uuid) snapshot_entry = await self._submit_entry(snapshot_entry, **kwargs) return snapshot_entry - async def _build_aggregate(self, event_entry: EventEntry, **kwargs) -> Aggregate: - diff = event_entry.aggregate_diff + async def _build_instance(self, event_entry: EventEntry, **kwargs) -> RootEntity: + diff = event_entry.event try: transaction = await self._transaction_repository.get(uuid=event_entry.transaction_uuid) except TransactionNotFoundException: transaction = None - aggregate = await self._update_if_exists(diff, transaction=transaction, **kwargs) - return aggregate + instance = await self._update_instance_if_exists(diff, transaction=transaction, **kwargs) + return instance - async def _update_if_exists(self, aggregate_diff: AggregateDiff, **kwargs) -> Aggregate: + async def _update_instance_if_exists(self, event: Event, **kwargs) -> RootEntity: # noinspection PyBroadException try: # noinspection PyTypeChecker - previous = await self._select_one_aggregate(aggregate_diff.uuid, aggregate_diff.name, **kwargs) - except AggregateNotFoundException: + previous = await self._select_one_instance(event.name, event.uuid, **kwargs) + except NotFoundException: # noinspection PyTypeChecker - aggregate_cls: Type[Aggregate] = import_module(aggregate_diff.name) - return aggregate_cls.from_diff(aggregate_diff, **kwargs) + cls: Type[RootEntity] = import_module(event.name) + return cls.from_diff(event, **kwargs) - if previous.version >= aggregate_diff.version: - raise SnapshotRepositoryConflictException(previous, aggregate_diff) + if previous.version >= event.version: + raise SnapshotRepositoryConflictException(previous, event) - previous.apply_diff(aggregate_diff) + previous.apply_diff(event) return previous - async def _select_one_aggregate(self, aggregate_uuid: UUID, aggregate_name: str, **kwargs) -> Aggregate: - snapshot_entry = await self._reader.get_entry(aggregate_name, aggregate_uuid, **kwargs) - return snapshot_entry.build_aggregate(**kwargs) + async def _select_one_instance(self, name: str, uuid: UUID, **kwargs) -> RootEntity: + snapshot_entry = await self._reader.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() @@ -186,10 +186,10 @@ async def _clean_transactions(self, offset: int, **kwargs) -> None: _INSERT_ONE_SNAPSHOT_ENTRY_QUERY = """ -INSERT INTO snapshot (aggregate_uuid, aggregate_name, version, schema, data, created_at, updated_at, transaction_uuid) +INSERT INTO snapshot (uuid, name, version, schema, data, created_at, updated_at, transaction_uuid) VALUES ( - %(aggregate_uuid)s, - %(aggregate_name)s, + %(uuid)s, + %(name)s, %(version)s, %(schema)s, %(data)s, @@ -197,7 +197,7 @@ async def _clean_transactions(self, offset: int, **kwargs) -> None: %(updated_at)s, %(transaction_uuid)s ) -ON CONFLICT (aggregate_uuid, transaction_uuid) +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; 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 d4e60a931..c36c2774d 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/services.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/snapshots/services.py @@ -8,7 +8,6 @@ ) from typing import ( TYPE_CHECKING, - Type, ) from uuid import ( UUID, @@ -40,8 +39,8 @@ ) if TYPE_CHECKING: - from ..models import ( - Aggregate, + from ..entities import ( + RootEntity, ) logger = logging.getLogger(__name__) @@ -64,18 +63,18 @@ def __init__( @classmethod def __get_enroute__(cls, config: MinosConfig) -> dict[str, set[EnrouteDecorator]]: - aggregate_name = config.service.aggregate.rsplit(".", 1)[-1] + simplified_name = config.service.aggregate.rsplit(".", 1)[-1] return { - cls.__get_one__.__name__: {enroute.broker.command(f"Get{aggregate_name}")}, - cls.__get_many__.__name__: {enroute.broker.command(f"Get{aggregate_name}s")}, + cls.__get_one__.__name__: {enroute.broker.command(f"Get{simplified_name}")}, + cls.__get_many__.__name__: {enroute.broker.command(f"Get{simplified_name}s")}, cls.__synchronize__.__name__: {enroute.periodic.event("* * * * *")}, } async def __get_one__(self, request: Request) -> Response: - """Get aggregate. + """Get one ``RootEntity`` instance. - :param request: The ``Request`` instance that contains the aggregate identifier. - :return: A ``Response`` instance containing the requested aggregate. + :param request: The ``Request`` instance that contains the instance identifier. + :return: A ``Response`` instance containing the requested instances. """ try: content = await request.content(model_type=ModelType.build("Query", {"uuid": UUID})) @@ -83,17 +82,17 @@ async def __get_one__(self, request: Request) -> Response: raise ResponseException(f"There was a problem while parsing the given request: {exc!r}") try: - aggregate = await self.__aggregate_cls__.get(content["uuid"]) + instance = await self.type_.get(content["uuid"]) except Exception as exc: - raise ResponseException(f"There was a problem while getting the aggregate: {exc!r}") + raise ResponseException(f"There was a problem while getting the instance: {exc!r}") - return Response(aggregate) + return Response(instance) async def __get_many__(self, request: Request) -> Response: - """Get aggregates. + """Get many ``RootEntity`` instances. - :param request: The ``Request`` instance that contains the product identifiers. - :return: A ``Response`` instance containing the requested aggregates. + :param request: The ``Request`` instance that contains the instance identifiers. + :return: A ``Response`` instance containing the requested instances. """ try: content = await request.content(model_type=ModelType.build("Query", {"uuids": list[UUID]})) @@ -101,14 +100,18 @@ async def __get_many__(self, request: Request) -> Response: raise ResponseException(f"There was a problem while parsing the given request: {exc!r}") try: - aggregates = await gather(*(self.__aggregate_cls__.get(uuid) for uuid in content["uuids"])) + instances = await gather(*(self.type_.get(uuid) for uuid in content["uuids"])) except Exception as exc: - raise ResponseException(f"There was a problem while getting aggregates: {exc!r}") + raise ResponseException(f"There was a problem while getting the instances: {exc!r}") - return Response(aggregates) + return Response(instances) @cached_property - def __aggregate_cls__(self) -> Type[Aggregate]: + def type_(self) -> type[RootEntity]: + """Load the concrete ``RootEntity`` class. + + :return: A ``Type`` object. + """ # noinspection PyTypeChecker return import_module(self.config.service.aggregate) 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 66d4df90d..e8aeb9528 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/entries.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/transactions/entries.py @@ -192,13 +192,13 @@ async def validate(self) -> bool: entries = dict() async for entry in self._event_repository.select(transaction_uuid=self.uuid): - if entry.aggregate_uuid in entries and entry.version < entries[entry.aggregate_uuid]: + if entry.uuid in entries and entry.version < entries[entry.uuid]: continue - entries[entry.aggregate_uuid] = entry.version + entries[entry.uuid] = entry.version transaction_uuids = set() - for aggregate_uuid, version in entries.items(): - async for entry in self._event_repository.select(aggregate_uuid=aggregate_uuid, version=version): + for uuid, version in entries.items(): + async for entry in self._event_repository.select(uuid=uuid, version=version): if entry.transaction_uuid == self.destination_uuid: return False if entry.transaction_uuid != self.uuid: 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 d58af3467..bdeffee3b 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 @@ -62,7 +62,7 @@ async def _submit(self, transaction: TransactionEntry) -> TransactionEntry: async def get(self, uuid: UUID, **kwargs) -> TransactionEntry: """Get a ``TransactionEntry`` from its identifier. - :param uuid: Identifier of the ``Aggregate``. + :param uuid: Identifier of the ``RootEntity``. :param kwargs: Additional named arguments. :return: The ``TransactionEntry`` instance. """ @@ -140,7 +140,7 @@ async def _select(self, **kwargs) -> AsyncIterator[TransactionEntry]: raise NotImplementedError def write_lock(self) -> Lock: - """Get a write lock. + """Get write lock. :return: An asynchronous context manager. """ diff --git a/packages/core/minos-microservice-aggregate/minos/aggregate/models/value_objects.py b/packages/core/minos-microservice-aggregate/minos/aggregate/value_objects.py similarity index 88% rename from packages/core/minos-microservice-aggregate/minos/aggregate/models/value_objects.py rename to packages/core/minos-microservice-aggregate/minos/aggregate/value_objects.py index d204d497f..1ab7ca389 100644 --- a/packages/core/minos-microservice-aggregate/minos/aggregate/models/value_objects.py +++ b/packages/core/minos-microservice-aggregate/minos/aggregate/value_objects.py @@ -7,16 +7,15 @@ TypeVar, ) -from minos.common import ( - DeclarativeModel, - Model, +from minos.aggregate.collections import ( + IncrementalSet, ) - -from ..exceptions import ( +from minos.aggregate.exceptions import ( ValueObjectException, ) -from .collections import ( - IncrementalSet, +from minos.common import ( + DeclarativeModel, + Model, ) diff --git a/packages/core/minos-microservice-aggregate/poetry.lock b/packages/core/minos-microservice-aggregate/poetry.lock index 65c2942b1..c48dbc0f7 100644 --- a/packages/core/minos-microservice-aggregate/poetry.lock +++ b/packages/core/minos-microservice-aggregate/poetry.lock @@ -130,28 +130,24 @@ pytz = ">=2015.7" [[package]] name = "black" -version = "21.12b0" +version = "22.1.0" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.6.2" [package.dependencies] -click = ">=7.1.2" +click = ">=8.0.0" mypy-extensions = ">=0.4.3" -pathspec = ">=0.9.0,<1" +pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = ">=0.2.6,<2.0.0" -typing-extensions = [ - {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}, - {version = "!=3.10.0.1", markers = "python_version >= \"3.10\""}, -] +tomli = ">=1.1.0" +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)"] -python2 = ["typed-ast (>=1.4.3)"] uvloop = ["uvloop (>=0.15.2)"] [[package]] @@ -449,7 +445,7 @@ python-versions = "*" [[package]] name = "minos-microservice-common" -version = "0.4.0" +version = "0.4.1" description = "Python Package with common Classes and Utilities used in Minos Microservices." category = "main" optional = false @@ -472,7 +468,7 @@ url = "../minos-microservice-common" [[package]] name = "minos-microservice-networks" -version = "0.4.0" +version = "0.4.1" description = "Python Package with the common network classes and utilities used in Minos Microservice." category = "main" optional = false @@ -949,7 +945,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "0ef4d2ebc5573e712d02eb7a4e38c1db284ae4964c89c5fad6110cf15042b3c9" +content-hash = "7780ec62aa832682987ee33f4fac9973fc1cc8c815dc1790d98c74e840cf5b22" [metadata.files] aiohttp = [ @@ -1082,8 +1078,29 @@ babel = [ {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, ] black = [ - {file = "black-21.12b0-py3-none-any.whl", hash = "sha256:a615e69ae185e08fdd73e4715e260e2479c861b5740057fde6e8b4e3b7dd589f"}, - {file = "black-21.12b0.tar.gz", hash = "sha256:77b80f693a569e2e527958459634f18df9b0ba2625ba4e0c2d5da5be42e6f2b3"}, + {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"}, ] cached-property = [ {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, diff --git a/packages/core/minos-microservice-aggregate/pyproject.toml b/packages/core/minos-microservice-aggregate/pyproject.toml index 7511f763e..077039bf5 100644 --- a/packages/core/minos-microservice-aggregate/pyproject.toml +++ b/packages/core/minos-microservice-aggregate/pyproject.toml @@ -1,14 +1,14 @@ [tool.poetry] name = "minos-microservice-aggregate" -version = "0.4.0" -description = "Python Package for Minos Microservices containing all the Aggregate stuff" +version = "0.5.0" +description = "The Aggregate pattern of the Minos Framework" readme = "README.md" repository = "https://github.com/minos-framework/minos-python" homepage = "http://www.minos.run/" authors = ["Minos Framework Devs "] license = "MIT" classifiers = [ - "Development Status :: 2 - Pre-Alpha", + "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Natural Language :: English", "Programming Language :: Python :: 3", @@ -37,7 +37,7 @@ minos-microservice-networks = "^0.4.0" [tool.poetry.dev-dependencies] minos-microservice-common = { path = "../minos-microservice-common", develop = true } minos-microservice-networks = { path = "../minos-microservice-networks", develop = true } -black = "^21.12b0" +black = "^22.1" isort = "^5.8.0" pytest = "^6.2.4" coverage = "^6.3" diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_actions.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_actions.py similarity index 100% rename from packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_actions.py rename to packages/core/minos-microservice-aggregate/tests/test_aggregate/test_actions.py 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 new file mode 100644 index 000000000..89e6fd82a --- /dev/null +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_aggregate.py @@ -0,0 +1,50 @@ +import unittest +from uuid import ( + UUID, +) + +from minos.aggregate import ( + Aggregate, +) +from minos.common import ( + NotProvidedException, +) +from tests.utils import ( + CONFIG_FILE_PATH, + MinosTestCase, + Order, + OrderAggregate, +) + + +class TestAggregate(MinosTestCase): + async def test_root(self): + async with OrderAggregate.from_config(CONFIG_FILE_PATH) as aggregate: + self.assertEqual(Order, aggregate.root) + + def test_root_raises(self): + with self.assertRaises(TypeError): + Aggregate.from_config(CONFIG_FILE_PATH) + + async def test_from_config(self): + async with OrderAggregate.from_config(CONFIG_FILE_PATH) as aggregate: + self.assertTrue(self.transaction_repository, aggregate.transaction_repository) + self.assertTrue(self.event_repository, aggregate.event_repository) + self.assertTrue(self.snapshot_repository, aggregate.snapshot_repository) + + def test_from_config_raises(self): + with self.assertRaises(NotProvidedException): + OrderAggregate.from_config(CONFIG_FILE_PATH, transaction_repository=None) + with self.assertRaises(NotProvidedException): + OrderAggregate.from_config(CONFIG_FILE_PATH, event_repository=None) + with self.assertRaises(NotProvidedException): + OrderAggregate.from_config(CONFIG_FILE_PATH, snapshot_repository=None) + + async def test_call(self): + async with OrderAggregate.from_config(CONFIG_FILE_PATH) as aggregate: + uuid = await aggregate.create_order() + self.assertIsInstance(uuid, UUID) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_collections.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_collections.py similarity index 93% rename from packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_collections.py rename to packages/core/minos-microservice-aggregate/tests/test_aggregate/test_collections.py index fb368b8f8..c475c4a3d 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_collections.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_collections.py @@ -82,18 +82,14 @@ def test_data_cls(self): def test_from_avro(self): expected = IncrementalSet([1, 2]) - schema = [ - {"items": "int", "logicalType": "minos.aggregate.models.collections.IncrementalSet", "type": "array"}, - ] + schema = [{"items": "int", "logicalType": "minos.aggregate.collections.IncrementalSet", "type": "array"}] data = [1, 2] observed = Model.from_avro(schema, data) self.assertEqual(expected, observed) def test_avro_schema(self): - expected = [ - {"items": "int", "logicalType": "minos.aggregate.models.collections.IncrementalSet", "type": "array"}, - ] + expected = [{"items": "int", "logicalType": "minos.aggregate.collections.IncrementalSet", "type": "array"}] observed = IncrementalSet([1, 2]).avro_schema self.assertEqual(expected, observed) diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_diffs/__init__.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/__init__.py similarity index 100% rename from packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_diffs/__init__.py rename to packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/__init__.py diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_entities.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_collections.py similarity index 71% rename from packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_entities.py rename to packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_collections.py index d1d627e44..9a655318f 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_entities.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_collections.py @@ -5,92 +5,67 @@ from unittest.mock import ( patch, ) -from uuid import ( - UUID, - uuid4, -) from minos.aggregate import ( Action, - Entity, EntitySet, IncrementalSetDiff, IncrementalSetDiffEntry, ) from minos.common import ( - NULL_UUID, - DeclarativeModel, Model, ) - - -class _Entity(Entity): - """For testing purposes.""" - - name: str - - -class TestEntity(unittest.TestCase): - def test_default(self): - entity = Entity() - self.assertIsInstance(entity, DeclarativeModel) - self.assertIsNot(entity.uuid, NULL_UUID) - self.assertIsInstance(entity.uuid, UUID) - - def test_uuid(self): - uuid = uuid4() - entity = Entity(uuid=uuid) - self.assertIsInstance(entity, DeclarativeModel) - self.assertIsNot(entity.uuid, NULL_UUID) - self.assertEqual(uuid, entity.uuid) +from tests.utils import ( + OrderItem, +) class TestEntitySet(unittest.TestCase): def test_data(self): - raw = {_Entity("John"), _Entity("Michael")} + raw = {OrderItem("John"), OrderItem("Michael")} entities = EntitySet(raw) self.assertEqual({str(v.uuid): v for v in raw}, entities.data) def test_eq_true(self): - raw = {_Entity("John"), _Entity("Michael")} + raw = {OrderItem("John"), OrderItem("Michael")} observed = EntitySet(raw) self.assertEqual(EntitySet(raw), observed) self.assertEqual(raw, observed) self.assertEqual({str(v.uuid): v for v in raw}, observed) def test_eq_false(self): - raw = {_Entity("John"), _Entity("Michael")} + raw = {OrderItem("John"), OrderItem("Michael")} observed = EntitySet(raw) - other = {_Entity("Charlie")} + other = {OrderItem("Charlie")} self.assertNotEqual(EntitySet(other), observed) self.assertNotEqual(other, observed) self.assertNotEqual({str(v.uuid): v for v in other}, observed) self.assertNotEqual(list(raw), observed) def test_len(self): - raw = {_Entity("John"), _Entity("Michael")} + raw = {OrderItem("John"), OrderItem("Michael")} entities = EntitySet(raw) self.assertEqual(2, len(entities)) def test_iter(self): - raw = {_Entity("John"), _Entity("Michael")} + raw = {OrderItem("John"), OrderItem("Michael")} entities = EntitySet(raw) self.assertEqual(raw, set(entities)) def test_contains(self): - raw = [_Entity("John")] + raw = [OrderItem("John")] entities = EntitySet(raw) self.assertIn(raw[0], entities) - self.assertNotIn(_Entity("Charlie"), entities) + self.assertNotIn(OrderItem("Charlie"), entities) self.assertNotIn(1234, entities) def test_add(self): - raw = _Entity("John") + raw = OrderItem("John") entities = EntitySet() entities.add(raw) @@ -98,14 +73,14 @@ def test_add(self): self.assertEqual({raw}, entities) def test_get(self): - raw = _Entity("John") + raw = OrderItem("John") entities = EntitySet() entities.add(raw) self.assertEqual(raw, entities.get(raw.uuid)) def test_remove(self): - raw = [_Entity("John"), _Entity("Michael")] + raw = [OrderItem("John"), OrderItem("Michael")] entities = EntitySet(raw) entities.remove(raw[1]) @@ -113,7 +88,7 @@ def test_remove(self): self.assertEqual({raw[0]}, entities) def test_diff(self): - raw = [_Entity("John"), _Entity("Michael")] + raw = [OrderItem("John"), OrderItem("Michael")] entities = EntitySet(raw) observed = entities.diff(EntitySet([raw[0]])) @@ -122,18 +97,18 @@ def test_diff(self): self.assertEqual(observed, expected) def test_data_cls(self): - raw = [_Entity("John"), _Entity("Michael")] + raw = [OrderItem("John"), OrderItem("Michael")] entities = EntitySet(raw) - self.assertEqual(_Entity, entities.data_cls) + self.assertEqual(OrderItem, entities.data_cls) def test_from_avro(self): - values = {_Entity("John"), _Entity("Michael")} + values = {OrderItem("John"), OrderItem("Michael")} expected = EntitySet(values) schema = [ { - "logicalType": "minos.aggregate.models.entities.EntitySet", + "logicalType": "minos.aggregate.entities.EntitySet", "type": "array", - "items": _Entity.avro_schema[0], + "items": OrderItem.avro_schema[0], }, ] data = [v.avro_data for v in values] @@ -145,36 +120,36 @@ def test_avro_schema(self): with patch("minos.common.AvroSchemaEncoder.generate_random_str", return_value="hello"): expected = [ { - "logicalType": "minos.aggregate.models.entities.EntitySet", + "logicalType": "minos.aggregate.entities.collections.EntitySet", "type": "array", - "items": _Entity.avro_schema[0], + "items": OrderItem.avro_schema[0], }, ] - observed = EntitySet({_Entity("John"), _Entity("Michael")}).avro_schema + observed = EntitySet({OrderItem("John"), OrderItem("Michael")}).avro_schema self.assertEqual(expected, observed) def test_avro_data(self): - values = {_Entity("John"), _Entity("Michael")} + values = {OrderItem("John"), OrderItem("Michael")} expected = sorted([v.avro_data for v in values], key=lambda v: v["uuid"]) observed = EntitySet(values).avro_data self.assertIsInstance(observed, list) self.assertEqual(expected, sorted([v.avro_data for v in values], key=lambda v: v["uuid"])) def test_avro_bytes(self): - expected = EntitySet({_Entity("John"), _Entity("Michael")}) + expected = EntitySet({OrderItem("John"), OrderItem("Michael")}) self.assertEqual(expected, Model.from_avro_bytes(expected.avro_bytes)) class TestEntitySetDiff(unittest.TestCase): def setUp(self) -> None: - self.raw = [_Entity("John"), _Entity("Michael")] + self.raw = [OrderItem("John"), OrderItem("Michael")] self.old = EntitySet(self.raw) - self.clone = [_Entity(name=entity.name, uuid=entity.uuid) for entity in self.raw] + self.clone = [OrderItem(name=entity.name, uuid=entity.uuid) for entity in self.raw] def test_from_difference_create(self): entities = EntitySet(self.clone) - new = _Entity("Charlie") + new = OrderItem("Charlie") entities.add(new) observed = IncrementalSetDiff.from_difference(entities, self.old, get_fn=attrgetter("uuid")) @@ -201,7 +176,7 @@ def test_from_difference_update(self): def test_from_difference_combined(self): entities = EntitySet(self.clone) - new = _Entity("Charlie") + new = OrderItem("Charlie") entities.add(new) removed = self.clone[1] diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_refs/__init__.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/__init__.py similarity index 100% rename from packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_refs/__init__.py rename to packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/__init__.py diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_base.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_base.py new file mode 100644 index 000000000..69dafbb8b --- /dev/null +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_base.py @@ -0,0 +1,40 @@ +import unittest +from uuid import ( + UUID, + uuid4, +) + +from minos.aggregate import ( + Entity, +) +from minos.common import ( + NULL_UUID, + DeclarativeModel, +) +from tests.utils import ( + OrderItem, +) + + +class TestEntity(unittest.TestCase): + def test_subclass(self): + self.assertTrue(issubclass(Entity, DeclarativeModel)) + + def test_default(self): + entity = OrderItem("foo") + self.assertIsInstance(entity, DeclarativeModel) + self.assertIsNot(entity.uuid, NULL_UUID) + self.assertIsInstance(entity.uuid, UUID) + self.assertEqual("foo", entity.name) + + def test_uuid(self): + uuid = uuid4() + entity = OrderItem("foo", uuid=uuid) + self.assertIsInstance(entity, DeclarativeModel) + self.assertIsNot(entity.uuid, NULL_UUID) + self.assertEqual(uuid, entity.uuid) + self.assertEqual("foo", entity.name) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_external.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_external.py new file mode 100644 index 000000000..74eb0180d --- /dev/null +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_external.py @@ -0,0 +1,23 @@ +import unittest +from uuid import ( + uuid4, +) + +from tests.utils import ( + Product, +) + + +class TestExternalEntity(unittest.TestCase): + def test_values(self): + uuid = uuid4() + product = Product(uuid, 3, "apple", 3028) + + self.assertEqual(uuid, product.uuid) + self.assertEqual(3, product.version) + self.assertEqual("apple", product.title) + self.assertEqual(3028, product.quantity) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/__init__.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/__init__.py similarity index 100% rename from packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/__init__.py rename to packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/__init__.py diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_aggregates/test_base.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_base.py similarity index 95% rename from packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_aggregates/test_base.py rename to packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_base.py index 23104e279..3cfe81c00 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_aggregates/test_base.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_base.py @@ -7,10 +7,10 @@ ) from minos.aggregate import ( - AggregateNotFoundException, + AlreadyDeletedException, Condition, - DeletedAggregateException, EventRepositoryException, + NotFoundException, Ordering, ) from minos.common import ( @@ -23,7 +23,7 @@ ) -class TestAggregate(MinosTestCase): +class TestRootEntity(MinosTestCase): def setUp(self) -> None: super().setUp() self.kwargs = {"_repository": self.event_repository, "_snapshot": self.snapshot_repository} @@ -77,7 +77,7 @@ async def test_get(self): self.assertEqual(original, recovered) async def test_get_raises(self): - with self.assertRaises(AggregateNotFoundException): + with self.assertRaises(NotFoundException): await Car.get(NULL_UUID, **self.kwargs) async def test_update(self): @@ -138,7 +138,7 @@ async def test_save_create(self): car.color = "red" car.doors = 5 - with self.assertRaises(AggregateNotFoundException): + with self.assertRaises(NotFoundException): await car.refresh() await car.save() @@ -182,7 +182,7 @@ async def test_save_raises(self): async def test_delete(self): car = await Car.create(doors=3, color="blue", **self.kwargs) await car.delete() - with self.assertRaises(DeletedAggregateException): + with self.assertRaises(AlreadyDeletedException): await Car.get(car.uuid, **self.kwargs) diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_aggregates/test_broker.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_broker.py similarity index 92% rename from packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_aggregates/test_broker.py rename to packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_broker.py index 2ec9a3515..f94810954 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_aggregates/test_broker.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_broker.py @@ -5,10 +5,10 @@ from minos.aggregate import ( Action, - AggregateDiff, + Event, FieldDiff, FieldDiffContainer, - ModelRef, + Ref, ) from minos.networks import ( BrokerMessageV1, @@ -20,7 +20,7 @@ ) -class TestAggregate(MinosTestCase): +class TestRootEntityBroker(MinosTestCase): async def test_create(self): car = await Car.create(doors=3, color="blue") @@ -30,7 +30,7 @@ async def test_create(self): self.assertIsInstance(observed[0], BrokerMessageV1) self.assertEqual("CarCreated", observed[0].topic) self.assertEqual( - AggregateDiff( + Event( uuid=car.uuid, name=Car.classname, version=1, @@ -40,7 +40,7 @@ async def test_create(self): [ FieldDiff("doors", int, 3), FieldDiff("color", str, "blue"), - FieldDiff("owner", Optional[ModelRef[Owner]], None), + FieldDiff("owner", Optional[Ref[Owner]], None), ] ), ), @@ -59,7 +59,7 @@ async def test_update(self): self.assertIsInstance(observed[0], BrokerMessageV1) self.assertEqual("CarUpdated", observed[0].topic) self.assertEqual( - AggregateDiff( + Event( uuid=car.uuid, name=Car.classname, version=2, @@ -72,7 +72,7 @@ async def test_update(self): self.assertIsInstance(observed[1], BrokerMessageV1) self.assertEqual("CarUpdated.color", observed[1].topic) self.assertEqual( - AggregateDiff( + Event( uuid=car.uuid, name=Car.classname, version=2, @@ -95,7 +95,7 @@ async def test_delete(self): self.assertIsInstance(observed[0], BrokerMessageV1) self.assertEqual("CarDeleted", observed[0].topic) self.assertEqual( - AggregateDiff( + Event( uuid=car.uuid, name=Car.classname, version=2, diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_aggregates/test_differences.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_differences.py similarity index 93% rename from packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_aggregates/test_differences.py rename to packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_differences.py index 83769a090..8fb49716e 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_aggregates/test_differences.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_differences.py @@ -5,7 +5,7 @@ from minos.aggregate import ( Action, - AggregateDiff, + Event, FieldDiff, FieldDiffContainer, ) @@ -18,7 +18,7 @@ ) -class TestAggregateDifferences(MinosTestCase): +class TestRootEntityDifferences(MinosTestCase): async def asyncSetUp(self) -> None: self.uuid = uuid4() self.uuid_another = uuid4() @@ -43,7 +43,7 @@ async def asyncSetUp(self) -> None: ) def test_diff(self): - expected = AggregateDiff( + expected = Event( uuid=self.uuid, name=Car.classname, version=3, @@ -55,7 +55,7 @@ def test_diff(self): self.assertEqual(expected, observed) def test_apply_diff(self): - diff = AggregateDiff( + diff = Event( uuid=self.uuid, name=Car.classname, version=3, @@ -67,7 +67,7 @@ def test_apply_diff(self): self.assertEqual(self.final, self.initial) def test_apply_diff_raises(self): - diff = AggregateDiff( + diff = Event( uuid=self.uuid_another, name=Car.classname, version=3, diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_aggregates/test_not_provided.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_not_provided.py similarity index 95% rename from packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_aggregates/test_not_provided.py rename to packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_not_provided.py index 1acd9bedb..1d7ed117d 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_aggregates/test_not_provided.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_not_provided.py @@ -15,7 +15,7 @@ ) -class TestAggregateNotProvided(MinosTestCase): +class TestRootEntityNotProvided(MinosTestCase): async def test_create_raises(self): with self.assertRaises(NotProvidedException): await Car.create(doors=3, color="blue", _repository=None) diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_aggregates/test_with_postgresql.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_with_postgresql.py similarity index 91% rename from packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_aggregates/test_with_postgresql.py rename to packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_with_postgresql.py index ef878482b..726e7cae2 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_aggregates/test_with_postgresql.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_models/test_root/test_with_postgresql.py @@ -1,7 +1,7 @@ import unittest from minos.aggregate import ( - DeletedAggregateException, + AlreadyDeletedException, EntitySet, PostgreSqlEventRepository, PostgreSqlSnapshotRepository, @@ -21,7 +21,7 @@ ) -class TestAggregateWithPostgreSql(MinosTestCase, PostgresAsyncTestCase): +class TestExternalEntityWithPostgreSql(MinosTestCase, PostgresAsyncTestCase): CONFIG_FILE_PATH = BASE_PATH / "test_config.yml" def setUp(self): @@ -51,7 +51,7 @@ async def test_create_update_delete(self): self.assertEqual(car, await Car.get(car.uuid)) await car.delete() - with self.assertRaises(DeletedAggregateException): + with self.assertRaises(AlreadyDeletedException): await Car.get(car.uuid) car = await Car.create(doors=3, color="blue") @@ -62,12 +62,12 @@ async def test_create_update_delete(self): self.assertEqual(expected, await Car.get(car.uuid)) await car.delete() - with self.assertRaises(DeletedAggregateException): + with self.assertRaises(AlreadyDeletedException): await Car.get(car.uuid) async def test_entity_set_value_object_set(self): order = await Order.create(products=EntitySet(), reviews=ValueObjectSet()) - item = OrderItem(24) + item = OrderItem("foo") order.products.add(item) await order.save() @@ -75,7 +75,7 @@ async def test_entity_set_value_object_set(self): recovered = await Order.get(order.uuid) self.assertEqual(order, recovered) - item.amount = 36 + item.name = "bar" order.products.add(item) await order.save() diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_refs/__init__.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_refs/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_refs/test_extractors.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_refs/test_extractors.py similarity index 62% rename from packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_refs/test_extractors.py rename to packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_refs/test_extractors.py index 7fe3262fe..5de4171fb 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_refs/test_extractors.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_refs/test_extractors.py @@ -8,82 +8,82 @@ ) from minos.aggregate import ( - ModelRef, - ModelRefExtractor, + Ref, + RefExtractor, ) from minos.common import ( ModelType, ) -class TestModelRefExtractor(unittest.TestCase): +class TestRefExtractor(unittest.TestCase): def test_simple(self): mt_foo = ModelType.build("Foo", {"uuid": UUID, "version": int}) - value = ModelRef(uuid4()) + value = Ref(uuid4()) expected = {"Foo": {value}} - observed = ModelRefExtractor(value, ModelRef[mt_foo]).build() + observed = RefExtractor(value, Ref[mt_foo]).build() self.assertEqual(expected, observed) def test_list(self): mt_foo = ModelType.build("Foo", {"uuid": UUID, "version": int}) - value = [ModelRef(uuid4()), ModelRef(uuid4())] + value = [Ref(uuid4()), Ref(uuid4())] expected = {"Foo": set(value)} - observed = ModelRefExtractor(value, list[ModelRef[mt_foo]]).build() + observed = RefExtractor(value, list[Ref[mt_foo]]).build() self.assertEqual(expected, observed) def test_dict(self): mt_key = ModelType.build("Key", {"uuid": UUID, "version": int}) mt_value = ModelType.build("Value", {"uuid": UUID, "version": int}) - value = {ModelRef(uuid4()): ModelRef(uuid4()), ModelRef(uuid4()): ModelRef(uuid4())} + value = {Ref(uuid4()): Ref(uuid4()), Ref(uuid4()): Ref(uuid4())} expected = {"Key": set(value.keys()), "Value": set(value.values())} - observed = ModelRefExtractor(value, dict[ModelRef[mt_key], ModelRef[mt_value]]).build() + observed = RefExtractor(value, dict[Ref[mt_key], Ref[mt_value]]).build() self.assertEqual(expected, observed) def test_model(self): mt_bar = ModelType.build("Bar", {"uuid": UUID, "version": int}) - mt_foo = ModelType.build("Foo", {"uuid": UUID, "version": int, "another": ModelRef[mt_bar]}) + mt_foo = ModelType.build("Foo", {"uuid": UUID, "version": int, "another": Ref[mt_bar]}) - value = mt_foo(uuid=uuid4(), version=1, another=ModelRef(uuid4())) + value = mt_foo(uuid=uuid4(), version=1, another=Ref(uuid4())) expected = {"Bar": {value.another}} - observed = ModelRefExtractor(value, mt_foo).build() + observed = RefExtractor(value, mt_foo).build() self.assertEqual(expected, observed) def test_model_without_kind(self): mt_bar = ModelType.build("Bar", {"uuid": UUID, "version": int}) - mt_foo = ModelType.build("Foo", {"uuid": UUID, "version": int, "another": ModelRef[mt_bar]}) + mt_foo = ModelType.build("Foo", {"uuid": UUID, "version": int, "another": Ref[mt_bar]}) - value = mt_foo(uuid=uuid4(), version=1, another=ModelRef(uuid4())) + value = mt_foo(uuid=uuid4(), version=1, another=Ref(uuid4())) - expected = ModelRefExtractor(value, mt_foo).build() - observed = ModelRefExtractor(value).build() + expected = RefExtractor(value, mt_foo).build() + observed = RefExtractor(value).build() self.assertEqual(expected, observed) def test_optional(self): mt_foo = ModelType.build("Foo", {"uuid": UUID, "version": int}) - value = ModelRef(uuid4()) + value = Ref(uuid4()) expected = {"Foo": {value}} - observed = ModelRefExtractor(value, Optional[ModelRef[mt_foo]]).build() + observed = RefExtractor(value, Optional[Ref[mt_foo]]).build() self.assertEqual(expected, observed) def test_model_cls_by_type_hints(self): mt_foo = ModelType.build("Foo", {"uuid": UUID, "version": int}) - value = ModelRef(mt_foo(uuid4(), 1)) + value = Ref(mt_foo(uuid4(), 1)) self.assertEqual(mt_foo, value.data_cls) def test_model_cls_none(self): - value = ModelRef(uuid4()) + value = Ref(uuid4()) self.assertEqual(None, value.data_cls) diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_refs/test_injectors.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_refs/test_injectors.py similarity index 75% rename from packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_refs/test_injectors.py rename to packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_refs/test_injectors.py index 202d04617..f88b5d0a7 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_refs/test_injectors.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_refs/test_injectors.py @@ -5,8 +5,8 @@ ) from minos.aggregate import ( - ModelRef, - ModelRefInjector, + Ref, + RefInjector, ) from minos.common import ( ModelType, @@ -17,13 +17,13 @@ ) -class TestModelRefInjector(MinosTestCase): +class TestRefInjector(MinosTestCase): async def test_simple(self): model = await Car.create(3, "test") mapper = {model.uuid: model} expected = model - observed = ModelRefInjector(model.uuid, mapper).build() + observed = RefInjector(model.uuid, mapper).build() self.assertEqual(expected, observed) @@ -32,7 +32,7 @@ async def test_list(self): mapper = {model.uuid: model} expected = [model, model, model] - observed = ModelRefInjector([model.uuid, model.uuid, model.uuid], mapper).build() + observed = RefInjector([model.uuid, model.uuid, model.uuid], mapper).build() self.assertEqual(expected, observed) @@ -41,20 +41,20 @@ async def test_dict(self): mapper = {model.uuid: model} expected = {model: model} - observed = ModelRefInjector({model.uuid: model.uuid}, mapper).build() + observed = RefInjector({model.uuid: model.uuid}, mapper).build() self.assertEqual(expected, observed) def test_model(self): mt_bar = ModelType.build("Bar", {"uuid": UUID, "version": int}) - mt_foo = ModelType.build("Foo", {"uuid": UUID, "version": int, "another": ModelRef[mt_bar]}) + mt_foo = ModelType.build("Foo", {"uuid": UUID, "version": int, "another": Ref[mt_bar]}) model = mt_bar(uuid=uuid4(), version=1) mapper = {model.uuid: model} value = mt_foo(uuid=uuid4(), version=1, another=model.uuid) expected = mt_foo(uuid=value.uuid, version=1, another=model) - observed = ModelRefInjector(value, mapper).build() + observed = RefInjector(value, mapper).build() self.assertEqual(expected, observed) diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_refs/test_models.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_refs/test_models.py similarity index 71% rename from packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_refs/test_models.py rename to packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_refs/test_models.py index 71e279dc4..50215e863 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_refs/test_models.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_refs/test_models.py @@ -11,8 +11,7 @@ from minos.aggregate import ( IS_REPOSITORY_SERIALIZATION_CONTEXT_VAR, - AggregateRef, - ModelRef, + Ref, ) from minos.common import ( DeclarativeModel, @@ -28,56 +27,37 @@ MinosTestCase, ) - -class Product(AggregateRef): - """For testing purposes.""" - - title: str - quantity: int - - -class TestSubAggregate(unittest.TestCase): - def test_values(self): - uuid = uuid4() - product = Product(uuid, 3, "apple", 3028) - - self.assertEqual(uuid, product.uuid) - self.assertEqual(3, product.version) - self.assertEqual("apple", product.title) - self.assertEqual(3028, product.quantity) - - FakeMessage = ModelType.build("FakeMessage", {"content": Any}) Bar = ModelType.build("Bar", {"uuid": UUID, "age": int}) -Foo = ModelType.build("Foo", {"another": ModelRef[Bar]}) +Foo = ModelType.build("Foo", {"another": Ref[Bar]}) -class TestModelRef(MinosTestCase): +class TestRef(MinosTestCase): def test_subclass(self): # noinspection PyTypeHints - self.assertTrue(issubclass(ModelRef, (DeclarativeModel, UUID, Generic))) + self.assertTrue(issubclass(Ref, (DeclarativeModel, UUID, Generic))) def test_raises(self): with self.assertRaises(ValueError): # noinspection PyTypeChecker - ModelRef(56) + Ref(56) def test_uuid(self): uuid = uuid4() - value = ModelRef(uuid) + value = Ref(uuid) self.assertEqual(uuid, value) def test_uuid_int(self): uuid = uuid4() - value = ModelRef(uuid) + value = Ref(uuid) self.assertEqual(uuid.int, value.int) def test_uuid_is_safe(self): uuid = uuid4() - value = ModelRef(uuid) + value = Ref(uuid) self.assertEqual(uuid.is_safe, value.is_safe) @@ -89,46 +69,46 @@ def test_model(self): def test_model_uuid(self): uuid = uuid4() - value = ModelRef(Bar(uuid, 1)) + value = Ref(Bar(uuid, 1)) self.assertEqual(uuid, value.uuid) def test_model_attribute(self): - value = ModelRef(Bar(uuid4(), 1)) + value = Ref(Bar(uuid4(), 1)) self.assertEqual(1, value.age) def test_model_attribute_raises(self): - value = ModelRef(Bar(uuid4(), 1)) + value = Ref(Bar(uuid4(), 1)) with self.assertRaises(AttributeError): value.year def test_fields(self): - value = ModelRef(Bar(uuid4(), 1)) + value = Ref(Bar(uuid4(), 1)) self.assertEqual({"data": Field("data", Union[Bar, UUID], value)}, value.fields) def test_model_avro_data(self): value = Bar(uuid4(), 1) - self.assertEqual(value.avro_data, ModelRef(value).avro_data) + self.assertEqual(value.avro_data, Ref(value).avro_data) def test_uuid_avro_data(self): value = uuid4() - self.assertEqual(str(value), ModelRef(value).avro_data) + self.assertEqual(str(value), Ref(value).avro_data) async def test_model_avro_data_submitting(self): uuid = uuid4() value = Bar(uuid, 1) IS_REPOSITORY_SERIALIZATION_CONTEXT_VAR.set(True) - self.assertEqual(str(uuid), ModelRef(value).avro_data) + self.assertEqual(str(uuid), Ref(value).avro_data) async def test_uuid_avro_data_submitting(self): value = uuid4() IS_REPOSITORY_SERIALIZATION_CONTEXT_VAR.set(True) - self.assertEqual(str(value), ModelRef(value).avro_data) + self.assertEqual(str(value), Ref(value).avro_data) def test_model_avro_schema(self): another = Bar(uuid4(), 1) @@ -143,13 +123,13 @@ def test_model_avro_schema(self): "name": "Bar", "namespace": "", "type": "record", - "logicalType": "minos.aggregate.models.refs.models.ModelRef", + "logicalType": "minos.aggregate.entities.refs.models.Ref", }, - {"logicalType": "minos.aggregate.models.refs.models.ModelRef", "type": "string"}, + {"logicalType": "minos.aggregate.entities.refs.models.Ref", "type": "string"}, ] ] - self.assertEqual(expected, ModelRef(another).avro_schema) + self.assertEqual(expected, Ref(another).avro_schema) def test_uuid_avro_schema(self): another = uuid4() @@ -162,12 +142,12 @@ def test_uuid_avro_schema(self): {"name": "uuid", "type": {"logicalType": "uuid", "type": "string"}}, {"name": "age", "type": "int"}, ], - "logicalType": "minos.aggregate.models.refs.models.ModelRef", + "logicalType": "minos.aggregate.entities.refs.models.Ref", "name": "Bar", "namespace": "", "type": "record", }, - {"logicalType": "minos.aggregate.models.refs.models.ModelRef", "type": "string"}, + {"logicalType": "minos.aggregate.entities.refs.models.Ref", "type": "string"}, ] ] self.assertEqual(expected, ref.avro_schema) @@ -177,13 +157,13 @@ def test_model_from_avro(self): expected = Foo(another).another # FIXME: This should not be needed to set the type hint properly schema = [ - {"logicalType": "minos.aggregate.models.refs.models.ModelRef", "type": "string"}, + {"logicalType": "minos.aggregate.entities.refs.models.Ref", "type": "string"}, { "fields": [ {"name": "uuid", "type": {"logicalType": "uuid", "type": "string"}}, {"name": "age", "type": "int"}, ], - "logicalType": "minos.aggregate.models.refs.models.ModelRef", + "logicalType": "minos.aggregate.entities.refs.models.Ref", "name": "Bar", "namespace": "", "type": "record", @@ -204,12 +184,12 @@ def test_uuid_from_avro(self): {"name": "uuid", "type": {"logicalType": "uuid", "type": "string"}}, {"name": "age", "type": "int"}, ], - "logicalType": "minos.aggregate.models.refs.models.ModelRef", + "logicalType": "minos.aggregate.entities.refs.models.Ref", "name": "Bar", "namespace": "", "type": "record", }, - {"logicalType": "minos.aggregate.models.refs.models.ModelRef", "type": "string"}, + {"logicalType": "minos.aggregate.entities.refs.models.Ref", "type": "string"}, ] data = str(another) @@ -238,7 +218,7 @@ async def test_resolve(self): async def test_resolve_already(self): uuid = uuid4() - ref = ModelRef(Bar(uuid, 1)) + ref = Ref(Bar(uuid, 1)) await ref.resolve() @@ -246,20 +226,20 @@ async def test_resolve_already(self): self.assertEqual(0, len(observed)) async def test_resolved(self): - self.assertFalse(ModelRef(uuid4()).resolved) - self.assertTrue(ModelRef(Bar(uuid4(), 4)).resolved) + self.assertFalse(Ref(uuid4()).resolved) + self.assertTrue(Ref(Bar(uuid4(), 4)).resolved) def test_avro_model(self): another = Bar(uuid4(), 1) ref = Foo(another).another # FIXME: This should not be needed to set the type hint properly - self.assertEqual(ref, ModelRef.from_avro_bytes(ref.avro_bytes)) + self.assertEqual(ref, Ref.from_avro_bytes(ref.avro_bytes)) def test_avro_uuid(self): another = uuid4() ref = Foo(another).another # FIXME: This should not be needed to set the type hint properly - self.assertEqual(ref, ModelRef.from_avro_bytes(ref.avro_bytes)) + self.assertEqual(ref, Ref.from_avro_bytes(ref.avro_bytes)) if __name__ == "__main__": diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_refs/test_resolvers.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_refs/test_resolvers.py similarity index 80% rename from packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_refs/test_resolvers.py rename to packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_refs/test_resolvers.py index bf842d3a5..1b74cc24e 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_refs/test_resolvers.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_entities/test_refs/test_resolvers.py @@ -5,8 +5,8 @@ ) from minos.aggregate import ( - ModelRef, - ModelRefResolver, + Ref, + RefResolver, ) from minos.common import ( ModelType, @@ -20,17 +20,17 @@ ) Bar = ModelType.build("Bar", {"uuid": UUID, "version": int}) -Foo = ModelType.build("Foo", {"uuid": UUID, "version": int, "another": ModelRef[Bar]}) +Foo = ModelType.build("Foo", {"uuid": UUID, "version": int, "another": Ref[Bar]}) -class TestModelRefResolver(MinosTestCase): +class TestRefResolver(MinosTestCase): def setUp(self) -> None: super().setUp() - self.resolver = ModelRefResolver() + self.resolver = RefResolver() self.uuid = uuid4() self.another_uuid = uuid4() - self.value = Foo(self.uuid, 1, another=ModelRef(self.another_uuid)) + self.value = Foo(self.uuid, 1, another=Ref(self.another_uuid)) async def test_resolve(self): self.broker_subscriber_builder.with_messages( @@ -46,7 +46,7 @@ async def test_resolve(self): self.assertEqual("GetBars", observed[0].topic) self.assertEqual({"uuids": {self.another_uuid}}, observed[0].content) - self.assertEqual(Foo(self.uuid, 1, another=ModelRef(Bar(self.another_uuid, 1))), resolved) + self.assertEqual(Foo(self.uuid, 1, another=Ref(Bar(self.another_uuid, 1))), resolved) async def test_resolve_already(self): self.assertEqual(34, await self.resolver.resolve(34)) 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 b6ac965e9..a2941bdfc 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 @@ -8,7 +8,7 @@ from minos.aggregate import ( Action, - AggregateDiff, + Event, EventEntry, FieldDiff, FieldDiffContainer, @@ -30,8 +30,8 @@ def setUp(self) -> None: def test_constructor(self): entry = EventEntry(self.uuid, "example.Car", 0, bytes("car", "utf-8")) - self.assertEqual(self.uuid, entry.aggregate_uuid) - self.assertEqual("example.Car", entry.aggregate_name) + self.assertEqual(self.uuid, entry.uuid) + self.assertEqual("example.Car", entry.name) self.assertEqual(0, entry.version) self.assertEqual(bytes("car", "utf-8"), entry.data) self.assertEqual(None, entry.id) @@ -41,8 +41,8 @@ def test_constructor(self): def test_constructor_extended(self): entry = EventEntry( - aggregate_uuid=self.uuid, - aggregate_name="example.Car", + uuid=self.uuid, + name="example.Car", version=0, data=bytes("car", "utf-8"), id=5678, @@ -50,8 +50,8 @@ def test_constructor_extended(self): created_at=datetime(2020, 10, 13, 8, 45, 32), transaction_uuid=self.transaction_uuid, ) - self.assertEqual(self.uuid, entry.aggregate_uuid) - self.assertEqual("example.Car", entry.aggregate_name) + self.assertEqual(self.uuid, entry.uuid) + self.assertEqual("example.Car", entry.name) self.assertEqual(0, entry.version) self.assertEqual(bytes("car", "utf-8"), entry.data) self.assertEqual(5678, entry.id) @@ -59,14 +59,14 @@ def test_constructor_extended(self): self.assertEqual(datetime(2020, 10, 13, 8, 45, 32), entry.created_at) self.assertEqual(self.transaction_uuid, entry.transaction_uuid) - async def test_from_aggregate_diff(self): + async def test_from_event(self): fields_diff = FieldDiffContainer([FieldDiff("doors", int, 3), FieldDiff("color", str, "blue")]) created_at = current_datetime() - aggregate_diff = AggregateDiff(self.uuid, Car.classname, 1, Action.CREATE, created_at, fields_diff) + event = Event(self.uuid, Car.classname, 1, Action.CREATE, created_at, fields_diff) - entry = EventEntry.from_aggregate_diff(aggregate_diff) - self.assertEqual(self.uuid, entry.aggregate_uuid) - self.assertEqual("tests.utils.Car", entry.aggregate_name) + entry = EventEntry.from_event(event) + self.assertEqual(self.uuid, entry.uuid) + self.assertEqual("tests.utils.Car", entry.name) self.assertEqual(None, entry.version) self.assertEqual(fields_diff, FieldDiffContainer.from_avro_bytes(entry.data)) self.assertEqual(None, entry.id) @@ -74,15 +74,15 @@ async def test_from_aggregate_diff(self): self.assertEqual(None, entry.created_at) self.assertEqual(NULL_UUID, entry.transaction_uuid) - async def test_from_aggregate_diff_with_transaction(self): + async def test_from_event_with_transaction(self): transaction = TransactionEntry(self.transaction_uuid) fields_diff = FieldDiffContainer([FieldDiff("doors", int, 3), FieldDiff("color", str, "blue")]) created_at = current_datetime() - aggregate_diff = AggregateDiff(self.uuid, Car.classname, 1, Action.CREATE, created_at, fields_diff) + event = Event(self.uuid, Car.classname, 1, Action.CREATE, created_at, fields_diff) - entry = EventEntry.from_aggregate_diff(aggregate_diff, transaction=transaction) - self.assertEqual(self.uuid, entry.aggregate_uuid) - self.assertEqual("tests.utils.Car", entry.aggregate_name) + entry = EventEntry.from_event(event, transaction=transaction) + self.assertEqual(self.uuid, entry.uuid) + self.assertEqual("tests.utils.Car", entry.name) self.assertEqual(None, entry.version) self.assertEqual(fields_diff, FieldDiffContainer.from_avro_bytes(entry.data)) self.assertEqual(None, entry.id) @@ -93,8 +93,8 @@ async def test_from_aggregate_diff_with_transaction(self): async def test_from_another(self): created_at = datetime(2020, 10, 13, 8, 45, 32) another = EventEntry( - aggregate_uuid=self.uuid, - aggregate_name="example.Car", + uuid=self.uuid, + name="example.Car", version=0, data=bytes("car", "utf-8"), id=5678, @@ -105,8 +105,8 @@ async def test_from_another(self): transaction_uuid = uuid4() entry = EventEntry.from_another(another, transaction_uuid=transaction_uuid) - self.assertEqual(self.uuid, entry.aggregate_uuid) - self.assertEqual("example.Car", entry.aggregate_name) + self.assertEqual(self.uuid, entry.uuid) + self.assertEqual("example.Car", entry.name) self.assertEqual(0, entry.version) self.assertEqual(bytes("car", "utf-8"), entry.data) self.assertEqual(None, entry.id) @@ -114,19 +114,19 @@ async def test_from_another(self): self.assertEqual(created_at, entry.created_at) self.assertEqual(transaction_uuid, entry.transaction_uuid) - def test_aggregate_diff(self): + def test_event(self): field_diff_container = FieldDiffContainer([FieldDiff("doors", int, 3), FieldDiff("color", str, "blue")]) version = 1 now = current_datetime() - aggregate_diff = AggregateDiff(self.uuid, Car.classname, version, Action.CREATE, now, field_diff_container) + event = Event(self.uuid, Car.classname, version, Action.CREATE, now, field_diff_container) - entry = EventEntry.from_aggregate_diff(aggregate_diff) + entry = EventEntry.from_event(event) entry.version = version entry.created_at = now - self.assertEqual(aggregate_diff, entry.aggregate_diff) + self.assertEqual(event, entry.event) def test_field_diff_container(self): field_diff_container = FieldDiffContainer([FieldDiff("doors", int, 3), FieldDiff("color", str, "blue")]) @@ -163,14 +163,14 @@ def test_hash(self): def test_repr(self): id_ = 5678 version = 0 - aggregate_name = "example.Car" + name = "example.Car" data = bytes("car", "utf-8") action = Action.CREATE created_at = datetime(2020, 10, 13, 8, 45, 32) transaction_uuid = uuid4() entry = EventEntry( - aggregate_uuid=self.uuid, - aggregate_name=aggregate_name, + uuid=self.uuid, + name=name, version=version, data=data, id=id_, @@ -179,7 +179,7 @@ def test_repr(self): transaction_uuid=transaction_uuid, ) expected = ( - f"EventEntry(aggregate_uuid={self.uuid!r}, aggregate_name={aggregate_name!r}, " + f"EventEntry(uuid={self.uuid!r}, name={name!r}, " f"version={version!r}, len(data)={len(data)!r}, id={id_!r}, action={action!r}, created_at={created_at!r}, " f"transaction_uuid={transaction_uuid!r})" ) @@ -188,14 +188,14 @@ def test_repr(self): def test_as_raw(self): id_ = 5678 version = 0 - aggregate_name = "example.Car" + name = "example.Car" data = bytes("car", "utf-8") action = Action.CREATE created_at = datetime(2020, 10, 13, 8, 45, 32) transaction_uuid = uuid4() entry = EventEntry( - aggregate_uuid=self.uuid, - aggregate_name=aggregate_name, + uuid=self.uuid, + name=name, version=version, data=data, id=id_, @@ -204,8 +204,8 @@ def test_as_raw(self): transaction_uuid=transaction_uuid, ) expected = { - "aggregate_uuid": self.uuid, - "aggregate_name": aggregate_name, + "uuid": self.uuid, + "name": name, "version": version, "data": data, "id": id_, diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_diffs/test_fields.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_fields.py similarity index 96% rename from packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_diffs/test_fields.py rename to packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_fields.py index 1fc01894a..6a878096f 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_diffs/test_fields.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_fields.py @@ -17,7 +17,7 @@ FieldDiff, FieldDiffContainer, IncrementalFieldDiff, - ModelRef, + Ref, ) from minos.common import ( NULL_DATETIME, @@ -76,7 +76,7 @@ def test_from_model(self): FieldDiff("updated_at", datetime, NULL_DATETIME), FieldDiff("doors", int, 5), FieldDiff("color", str, "red"), - FieldDiff("owner", Optional[ModelRef[Owner]], None), + FieldDiff("owner", Optional[Ref[Owner]], None), ] ) observed = FieldDiffContainer.from_model(self.car_two) @@ -87,7 +87,7 @@ def test_from_model_with_ignore(self): [ FieldDiff("doors", int, 5), FieldDiff("color", str, "red"), - FieldDiff("owner", Optional[ModelRef[Owner]], None), + FieldDiff("owner", Optional[Ref[Owner]], None), ] ) observed = FieldDiffContainer.from_model(self.car_two, ignore={"uuid", "version", "created_at", "updated_at"}) @@ -102,7 +102,7 @@ def test_avro_schema(self): "type": { "fields": [{"name": "name", "type": "string"}, {"name": "value", "type": "int"}], "name": "FieldDiff", - "namespace": "minos.aggregate.models.diffs.fields.hola", + "namespace": "minos.aggregate.events.fields.hola", "type": "record", }, }, @@ -111,13 +111,13 @@ def test_avro_schema(self): "type": { "fields": [{"name": "name", "type": "string"}, {"name": "value", "type": "string"}], "name": "FieldDiff", - "namespace": "minos.aggregate.models.diffs.fields.adios", + "namespace": "minos.aggregate.events.fields.adios", "type": "record", }, }, ], "name": "FieldDiffContainer", - "namespace": "minos.aggregate.models.diffs.fields.uno", + "namespace": "minos.aggregate.events.fields.uno", "type": "record", } ] diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_diffs/test_aggregates.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_models.py similarity index 80% rename from packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_diffs/test_aggregates.py rename to packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_models.py index fe6fef6ad..1a8583bad 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_diffs/test_aggregates.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_events/test_models.py @@ -8,11 +8,11 @@ from minos.aggregate import ( Action, - AggregateDiff, + Event, FieldDiff, FieldDiffContainer, IncrementalFieldDiff, - ModelRef, + Ref, ) from minos.common import ( current_datetime, @@ -24,7 +24,7 @@ ) -class TestAggregateDiff(MinosTestCase): +class TestEvent(MinosTestCase): async def asyncSetUp(self) -> None: await super().asyncSetUp() @@ -35,7 +35,7 @@ async def asyncSetUp(self) -> None: self.final = Car(5, "yellow", uuid=self.uuid, version=3) self.another = Car(3, "blue", uuid=self.uuid_another, version=1) - self.diff = AggregateDiff( + self.diff = Event( uuid=self.uuid, name=Car.classname, version=1, @@ -45,7 +45,7 @@ async def asyncSetUp(self) -> None: [ FieldDiff("doors", int, 3), FieldDiff("color", str, "blue"), - FieldDiff("owner", Optional[ModelRef[Owner]], None), + FieldDiff("owner", Optional[Ref[Owner]], None), ] ), ) @@ -55,27 +55,27 @@ def test_simplified_name(self): def test_total_ordering(self): observed = [ - AggregateDiff.from_aggregate(Car(3, "blue", version=4)), - AggregateDiff.from_aggregate(Car(3, "blue", version=1)), - AggregateDiff.from_aggregate(Car(3, "blue", version=3)), - AggregateDiff.from_aggregate(Car(3, "blue", version=2)), + Event.from_root_entity(Car(3, "blue", version=4)), + Event.from_root_entity(Car(3, "blue", version=1)), + Event.from_root_entity(Car(3, "blue", version=3)), + Event.from_root_entity(Car(3, "blue", version=2)), ] observed.sort() expected = [ - AggregateDiff.from_aggregate(Car(3, "blue", version=1)), - AggregateDiff.from_aggregate(Car(3, "blue", version=2)), - AggregateDiff.from_aggregate(Car(3, "blue", version=3)), - AggregateDiff.from_aggregate(Car(3, "blue", version=4)), + Event.from_root_entity(Car(3, "blue", version=1)), + Event.from_root_entity(Car(3, "blue", version=2)), + Event.from_root_entity(Car(3, "blue", version=3)), + Event.from_root_entity(Car(3, "blue", version=4)), ] self.assertEqual(expected, observed) - def test_from_aggregate(self): - observed = AggregateDiff.from_aggregate(self.initial) + def test_from_root_entity(self): + observed = Event.from_root_entity(self.initial) self.assertEqual(self.diff, observed) - def test_from_deleted_aggregate(self): - expected = AggregateDiff( + def test_from_deleted_root_entity(self): + expected = Event( uuid=self.uuid, name=Car.classname, version=1, @@ -83,11 +83,11 @@ def test_from_deleted_aggregate(self): created_at=self.initial.updated_at, fields_diff=FieldDiffContainer.empty(), ) - observed = AggregateDiff.from_deleted_aggregate(self.initial) + observed = Event.from_deleted_root_entity(self.initial) self.assertEqual(expected, observed) def test_from_difference(self): - expected = AggregateDiff( + expected = Event( uuid=self.uuid, name=Car.classname, version=3, @@ -95,22 +95,22 @@ def test_from_difference(self): created_at=self.final.updated_at, fields_diff=FieldDiffContainer([FieldDiff("doors", int, 5), FieldDiff("color", str, "yellow")]), ) - observed = AggregateDiff.from_difference(self.final, self.initial) + observed = Event.from_difference(self.final, self.initial) self.assertEqual(expected, observed) def test_from_difference_raises(self): with self.assertRaises(ValueError): - AggregateDiff.from_difference(self.initial, self.another) + Event.from_difference(self.initial, self.another) def test_avro_serialization(self): serialized = self.diff.avro_bytes self.assertIsInstance(serialized, bytes) - deserialized = AggregateDiff.from_avro_bytes(serialized) + deserialized = Event.from_avro_bytes(serialized) self.assertEqual(self.diff, deserialized) def test_decompose(self): - aggr = AggregateDiff( + aggr = Event( uuid=self.uuid, name=Car.classname, version=3, @@ -120,7 +120,7 @@ def test_decompose(self): ) expected = [ - AggregateDiff( + Event( uuid=self.uuid, name=Car.classname, version=3, @@ -128,7 +128,7 @@ def test_decompose(self): created_at=aggr.created_at, fields_diff=FieldDiffContainer([FieldDiff("doors", int, 5)]), ), - AggregateDiff( + Event( uuid=self.uuid, name=Car.classname, version=3, @@ -142,9 +142,9 @@ def test_decompose(self): self.assertEqual(expected, observed) -class TestAggregateDiffAccessors(unittest.TestCase): +class TestEventAccessors(unittest.TestCase): def setUp(self) -> None: - self.diff = AggregateDiff( + self.diff = Event( uuid=uuid4(), name="src.domain.Car", version=1, 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 af08bda6e..004072357 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 @@ -20,7 +20,7 @@ IS_REPOSITORY_SERIALIZATION_CONTEXT_VAR, TRANSACTION_CONTEXT_VAR, Action, - AggregateDiff, + Event, EventEntry, EventRepository, EventRepositoryConflictException, @@ -151,7 +151,7 @@ async def _fn(e: EventEntry) -> EventEntry: self.event_repository._send_events = send_events_mock uuid = uuid4() - aggregate_diff = AggregateDiff( + event = Event( uuid=uuid, name="example.Car", version=2, @@ -163,13 +163,13 @@ async def _fn(e: EventEntry) -> EventEntry: validate_mock = AsyncMock(return_value=True) self.event_repository.validate = validate_mock - observed = await self.event_repository.submit(aggregate_diff) + observed = await self.event_repository.submit(event) self.assertEqual(1, send_events_mock.call_count) self.assertIsInstance(observed, EventEntry) - self.assertEqual(uuid, observed.aggregate_uuid) - self.assertEqual("example.Car", observed.aggregate_name) + self.assertEqual(uuid, observed.uuid) + self.assertEqual("example.Car", observed.name) self.assertEqual(56, observed.version) self.assertEqual(field_diff_container, FieldDiffContainer.from_avro_bytes(observed.data)) self.assertEqual(12, observed.id) @@ -197,7 +197,7 @@ async def _fn(e: EventEntry) -> EventEntry: self.event_repository._send_events = send_events_mock uuid = uuid4() - aggregate_diff = AggregateDiff( + event = Event( uuid=uuid, name="example.Car", version=2, @@ -209,13 +209,13 @@ async def _fn(e: EventEntry) -> EventEntry: validate_mock = AsyncMock(return_value=True) self.event_repository.validate = validate_mock - observed = await self.event_repository.submit(aggregate_diff) + observed = await self.event_repository.submit(event) self.assertEqual(0, send_events_mock.call_count) self.assertIsInstance(observed, EventEntry) - self.assertEqual(uuid, observed.aggregate_uuid) - self.assertEqual("example.Car", observed.aggregate_name) + self.assertEqual(uuid, observed.uuid) + self.assertEqual("example.Car", observed.name) self.assertEqual(56, observed.version) self.assertEqual(field_diff_container, FieldDiffContainer.from_avro_bytes(observed.data)) self.assertEqual(12, observed.id) @@ -238,7 +238,7 @@ async def _fn(e: EventEntry) -> EventEntry: self.event_repository._submit = submit_mock uuid = uuid4() - aggregate_diff = AggregateDiff( + event = Event( uuid=uuid, name="example.Car", version=2, @@ -250,7 +250,7 @@ async def _fn(e: EventEntry) -> EventEntry: validate_mock = AsyncMock(return_value=True) self.event_repository.validate = validate_mock - await self.event_repository.submit(aggregate_diff) + await self.event_repository.submit(event) observed = self.broker_publisher.messages @@ -258,7 +258,7 @@ async def _fn(e: EventEntry) -> EventEntry: self.assertIsInstance(observed[0], BrokerMessageV1) self.assertEqual("CarUpdated", observed[0].topic) self.assertEqual( - AggregateDiff( + Event( uuid=uuid, name="example.Car", version=56, @@ -271,7 +271,7 @@ async def _fn(e: EventEntry) -> EventEntry: self.assertEqual("CarUpdated.colors.create", observed[1].topic) self.assertIsInstance(observed[1], BrokerMessageV1) self.assertEqual( - AggregateDiff( + Event( uuid=uuid, name="example.Car", version=56, @@ -297,8 +297,8 @@ async def _fn(e: EventEntry) -> EventEntry: self.event_repository._submit = submit_mock uuid = uuid4() - aggregate_diff = EventEntry.from_aggregate_diff( - AggregateDiff( + event = EventEntry.from_event( + Event( uuid=uuid, name="example.Car", version=2, @@ -312,7 +312,7 @@ async def _fn(e: EventEntry) -> EventEntry: validate_mock = AsyncMock(return_value=True) self.event_repository.validate = validate_mock - await self.event_repository.submit(aggregate_diff) + await self.event_repository.submit(event) observed = self.broker_publisher.messages @@ -333,8 +333,8 @@ async def test_submit_raises_conflict(self): await self.event_repository.submit(entry) async def test_submit_context_var(self): - mocked_aggregate_diff = AsyncMock() - mocked_aggregate_diff.action = Action.CREATE + mocked_event = AsyncMock() + mocked_event.action = Action.CREATE async def _fn(entry): self.assertEqual(True, IS_REPOSITORY_SERIALIZATION_CONTEXT_VAR.get()) @@ -344,13 +344,13 @@ async def _fn(entry): self.event_repository._submit = mocked_submit self.assertEqual(False, IS_REPOSITORY_SERIALIZATION_CONTEXT_VAR.get()) - await self.event_repository.submit(mocked_aggregate_diff) + await self.event_repository.submit(mocked_event) self.assertEqual(False, IS_REPOSITORY_SERIALIZATION_CONTEXT_VAR.get()) self.assertEqual(1, mocked_submit.call_count) async def test_validate_true(self): - aggregate_uuid = uuid4() + uuid = uuid4() transaction_uuid = uuid4() events = [] @@ -362,12 +362,12 @@ async def test_validate_true(self): select_transaction_mock = MagicMock(return_value=FakeAsyncIterator(transactions)) self.transaction_repository.select = select_transaction_mock - entry = EventEntry(aggregate_uuid, "example.Car") + entry = EventEntry(uuid, "example.Car") self.assertTrue(await self.event_repository.validate(entry)) self.assertEqual( - [call(aggregate_uuid=aggregate_uuid, transaction_uuid_in=(transaction_uuid,))], + [call(uuid=uuid, transaction_uuid_in=(transaction_uuid,))], select_event_mock.call_args_list, ) @@ -383,7 +383,7 @@ async def test_validate_true(self): ) async def test_validate_with_skip(self): - aggregate_uuid = uuid4() + uuid = uuid4() transaction_uuid = uuid4() another_transaction_uuid = uuid4() @@ -396,7 +396,7 @@ async def test_validate_with_skip(self): select_transaction_mock = MagicMock(return_value=FakeAsyncIterator(transactions)) self.transaction_repository.select = select_transaction_mock - entry = EventEntry(aggregate_uuid, "example.Car") + entry = EventEntry(uuid, "example.Car") self.assertTrue(await self.event_repository.validate(entry, transaction_uuid_ne=transaction_uuid)) self.assertEqual( @@ -411,17 +411,17 @@ async def test_validate_with_skip(self): ) self.assertEqual( - [call(aggregate_uuid=aggregate_uuid, transaction_uuid_in=(another_transaction_uuid,))], + [call(uuid=uuid, transaction_uuid_in=(another_transaction_uuid,))], select_event_mock.call_args_list, ) async def test_validate_false(self): - aggregate_uuid = uuid4() + uuid = uuid4() transaction_uuid = uuid4() events = [ - EventEntry(aggregate_uuid, "example.Car", 1), - EventEntry(aggregate_uuid, "example.Car", 2, transaction_uuid=transaction_uuid), + EventEntry(uuid, "example.Car", 1), + EventEntry(uuid, "example.Car", 2, transaction_uuid=transaction_uuid), ] transactions = [TransactionEntry(transaction_uuid, TransactionStatus.RESERVED)] @@ -431,12 +431,12 @@ async def test_validate_false(self): select_transaction_mock = MagicMock(return_value=FakeAsyncIterator(transactions)) self.transaction_repository.select = select_transaction_mock - entry = EventEntry(aggregate_uuid, "example.Car") + entry = EventEntry(uuid, "example.Car") self.assertFalse(await self.event_repository.validate(entry)) self.assertEqual( - [call(aggregate_uuid=aggregate_uuid, transaction_uuid_in=(transaction_uuid,))], + [call(uuid=uuid, transaction_uuid_in=(transaction_uuid,))], select_event_mock.call_args_list, ) @@ -464,20 +464,18 @@ async def test_select(self): mock = MagicMock(return_value=FakeAsyncIterator(range(5))) self.event_repository._select = mock - aggregate_uuid = uuid4() - aggregate_name = "path.to.Aggregate" + uuid = uuid4() + name = "path.to.Product" transaction_uuid = uuid4() - iterable = self.event_repository.select( - aggregate_uuid=aggregate_uuid, aggregate_name=aggregate_name, id_gt=56, transaction_uuid=transaction_uuid - ) + iterable = self.event_repository.select(uuid=uuid, name=name, 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( - aggregate_uuid=aggregate_uuid, - aggregate_name="path.to.Aggregate", + uuid=uuid, + name=name, version=None, version_lt=None, version_gt=None, 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 9b0ec8e17..d41042910 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 @@ -2,9 +2,9 @@ from minos.aggregate import ( AggregateException, - AggregateNotFoundException, - DeletedAggregateException, + AlreadyDeletedException, EventRepositoryException, + NotFoundException, SnapshotRepositoryException, ) from minos.common import ( @@ -22,11 +22,11 @@ def test_repository(self): def test_snapshot(self): self.assertTrue(issubclass(SnapshotRepositoryException, AggregateException)) - def test_snapshot_aggregate_not_found(self): - self.assertTrue(issubclass(AggregateNotFoundException, SnapshotRepositoryException)) + def test_snapshot_not_found(self): + self.assertTrue(issubclass(NotFoundException, SnapshotRepositoryException)) - def test_snapshot_deleted_aggregate(self): - self.assertTrue(issubclass(DeletedAggregateException, SnapshotRepositoryException)) + def test_snapshot_already_deleted(self): + self.assertTrue(issubclass(AlreadyDeletedException, SnapshotRepositoryException)) if __name__ == "__main__": diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_aggregates/__init__.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_aggregates/__init__.py deleted file mode 100644 index 8b1378917..000000000 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_aggregates/__init__.py +++ /dev/null @@ -1 +0,0 @@ - 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_abc.py index 7c754dc6d..c3501d154 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_abc.py @@ -16,9 +16,9 @@ from minos.aggregate import ( TRANSACTION_CONTEXT_VAR, - Aggregate, Condition, Ordering, + RootEntity, SnapshotRepository, TransactionEntry, ) @@ -33,10 +33,10 @@ class _SnapshotRepository(SnapshotRepository): """For testing purposes.""" - async def _get(self, *args, **kwargs) -> Aggregate: + async def _get(self, *args, **kwargs) -> RootEntity: """For testing purposes.""" - def _find(self, *args, **kwargs) -> AsyncIterator[Aggregate]: + def _find(self, *args, **kwargs) -> AsyncIterator[RootEntity]: """For testing purposes.""" async def _synchronize(self, **kwargs) -> None: @@ -57,6 +57,8 @@ def setUp(self) -> None: self.snapshot_repository._find = self.find_mock self.snapshot_repository._synchronize = self.synchronize_mock + self.classname = "path.to.Product" + def test_subclass(self): self.assertTrue(issubclass(SnapshotRepository, (ABC, MinosSetup))) @@ -67,18 +69,18 @@ def test_abstract(self): async def test_get(self): transaction = TransactionEntry() uuid = uuid4() - observed = await self.snapshot_repository.get("path.to.Aggregate", uuid, transaction) + observed = await self.snapshot_repository.get(self.classname, uuid, transaction) self.assertEqual(1, observed) self.assertEqual(1, self.synchronize_mock.call_count) self.assertEqual(call(), self.synchronize_mock.call_args) self.assertEqual(1, self.get_mock.call_count) - args = call(aggregate_name="path.to.Aggregate", uuid=uuid, transaction=transaction) + args = call(name=self.classname, uuid=uuid, transaction=transaction) self.assertEqual(args, self.get_mock.call_args) async def test_get_transaction_null(self): - await self.snapshot_repository.get("path.to.Aggregate", uuid4()) + 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"]) @@ -86,7 +88,7 @@ async def test_get_transaction_null(self): async def test_get_transaction_context(self): transaction = TransactionEntry() TRANSACTION_CONTEXT_VAR.set(transaction) - await self.snapshot_repository.get("path.to.Aggregate", uuid4()) + 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"]) @@ -94,7 +96,7 @@ async def test_get_transaction_context(self): async def test_find(self): transaction = TransactionEntry() iterable = self.snapshot_repository.find( - "path.to.Aggregate", Condition.TRUE, Ordering.ASC("name"), 10, True, transaction + self.classname, Condition.TRUE, Ordering.ASC("name"), 10, True, transaction ) observed = [a async for a in iterable] self.assertEqual(list(range(5)), observed) @@ -104,7 +106,7 @@ async def test_find(self): self.assertEqual(1, self.find_mock.call_count) args = call( - aggregate_name="path.to.Aggregate", + name=self.classname, condition=Condition.TRUE, ordering=Ordering.ASC("name"), limit=10, @@ -114,7 +116,7 @@ async def test_find(self): self.assertEqual(args, self.find_mock.call_args) async def test_find_transaction_null(self): - [a async for a in self.snapshot_repository.find("path.to.Aggregate", Condition.TRUE)] + [a async for a in self.snapshot_repository.find(self.classname, Condition.TRUE)] self.assertEqual(1, self.find_mock.call_count) self.assertEqual(None, self.find_mock.call_args.kwargs["transaction"]) @@ -122,7 +124,7 @@ async def test_find_transaction_null(self): async def test_find_transaction_context(self): transaction = TransactionEntry() TRANSACTION_CONTEXT_VAR.set(transaction) - [a async for a in self.snapshot_repository.find("path.to.Aggregate", Condition.TRUE)] + [a async for a in self.snapshot_repository.find(self.classname, Condition.TRUE)] self.assertEqual(1, self.find_mock.call_count) self.assertEqual(transaction, self.find_mock.call_args.kwargs["transaction"]) 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 2224ee51b..8e2ee0367 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 @@ -36,8 +36,8 @@ def tearDown(self) -> None: def test_constructor(self): entry = SnapshotEntry(self.uuid, "example.Car", 0, self.schema, self.data) - self.assertEqual(self.uuid, entry.aggregate_uuid) - self.assertEqual("example.Car", entry.aggregate_name) + self.assertEqual(self.uuid, entry.uuid) + self.assertEqual("example.Car", entry.name) self.assertEqual(0, entry.version) self.assertEqual(self.schema, entry.schema) self.assertEqual(self.data, entry.data) @@ -54,20 +54,20 @@ def test_constructor_extended(self): datetime(2020, 1, 10, 4, 23), datetime(2020, 1, 10, 4, 25), ) - self.assertEqual(self.uuid, entry.aggregate_uuid) - self.assertEqual("example.Car", entry.aggregate_name) + self.assertEqual(self.uuid, entry.uuid) + self.assertEqual("example.Car", entry.name) self.assertEqual(0, entry.version) self.assertEqual(self.schema, entry.schema) self.assertEqual(self.data, entry.data) self.assertEqual(datetime(2020, 1, 10, 4, 23), entry.created_at) self.assertEqual(datetime(2020, 1, 10, 4, 25), entry.updated_at) - def test_from_aggregate(self): + def test_from_root_entity(self): car = Car(3, "blue", uuid=self.uuid, version=1) with patch("minos.common.AvroSchemaEncoder.generate_random_str", return_value="hello"): - entry = SnapshotEntry.from_aggregate(car) - self.assertEqual(car.uuid, entry.aggregate_uuid) - self.assertEqual(car.classname, entry.aggregate_name) + entry = SnapshotEntry.from_root_entity(car) + self.assertEqual(car.uuid, entry.uuid) + self.assertEqual(car.classname, entry.name) self.assertEqual(car.version, entry.version) self.assertEqual(car.avro_schema, entry.schema) self.assertEqual({"color": "blue", "doors": 3, "owner": None}, entry.data) @@ -79,26 +79,26 @@ def test_equals(self): b = SnapshotEntry(self.uuid, "example.Car", 0, self.schema, self.data) self.assertEqual(a, b) - def test_aggregate_cls(self): + def test_type_(self): car = Car(3, "blue", uuid=self.uuid, version=1) - entry = SnapshotEntry.from_aggregate(car) - self.assertEqual(Car, entry.aggregate_cls) + entry = SnapshotEntry.from_root_entity(car) + self.assertEqual(Car, entry.type_) - def test_aggregate(self): + def test_build(self): car = Car(3, "blue", uuid=self.uuid, version=1) - entry = SnapshotEntry.from_aggregate(car) - self.assertEqual(car, entry.build_aggregate()) + entry = SnapshotEntry.from_root_entity(car) + self.assertEqual(car, entry.build()) def test_repr(self): - aggregate_name = "example.Car" + 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( - aggregate_uuid=self.uuid, - aggregate_name=aggregate_name, + uuid=self.uuid, + name=name, version=version, schema=self.schema, data=self.data, @@ -108,7 +108,7 @@ def test_repr(self): ) expected = ( - f"SnapshotEntry(aggregate_uuid={self.uuid!r}, aggregate_name={aggregate_name!r}, version={version!r}, " + f"SnapshotEntry(uuid={self.uuid!r}, name={name!r}, version={version!r}, " f"schema={self.schema!r}, data={self.data!r}, created_at={created_at!r}, updated_at={updated_at!r}, " f"transaction_uuid={transaction_uuid!r})" ) 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 index 190da794a..c37257891 100644 --- 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 @@ -7,13 +7,13 @@ ) from minos.aggregate import ( - AggregateNotFoundException, + AlreadyDeletedException, Condition, - DeletedAggregateException, EventEntry, FieldDiff, FieldDiffContainer, InMemorySnapshotRepository, + NotFoundException, Ordering, SnapshotEntry, SnapshotRepository, @@ -49,25 +49,25 @@ async def asyncSetUp(self): async def _populate(self): diff = FieldDiffContainer([FieldDiff("doors", int, 3), FieldDiff("color", str, "blue")]) # noinspection PyTypeChecker - aggregate_name: str = Car.classname - await self.event_repository.create(EventEntry(self.uuid_1, aggregate_name, 1, diff.avro_bytes)) - await self.event_repository.update(EventEntry(self.uuid_1, aggregate_name, 2, diff.avro_bytes)) - await self.event_repository.create(EventEntry(self.uuid_2, aggregate_name, 1, diff.avro_bytes)) - await self.event_repository.update(EventEntry(self.uuid_1, aggregate_name, 3, diff.avro_bytes)) - await self.event_repository.delete(EventEntry(self.uuid_1, aggregate_name, 4)) - await self.event_repository.update(EventEntry(self.uuid_2, aggregate_name, 2, diff.avro_bytes)) + 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, aggregate_name, 3, diff.avro_bytes, transaction_uuid=self.transaction_1) + EventEntry(self.uuid_2, name, 3, diff.avro_bytes, transaction_uuid=self.transaction_1) ) await self.event_repository.delete( - EventEntry(self.uuid_2, aggregate_name, 3, bytes(), transaction_uuid=self.transaction_2) + EventEntry(self.uuid_2, name, 3, bytes(), transaction_uuid=self.transaction_2) ) await self.event_repository.update( - EventEntry(self.uuid_2, aggregate_name, 4, diff.avro_bytes, transaction_uuid=self.transaction_1) + EventEntry(self.uuid_2, name, 4, diff.avro_bytes, transaction_uuid=self.transaction_1) ) - await self.event_repository.create(EventEntry(self.uuid_3, aggregate_name, 1, diff.avro_bytes)) + await self.event_repository.create(EventEntry(self.uuid_3, name, 1, diff.avro_bytes)) await self.event_repository.delete( - EventEntry(self.uuid_2, aggregate_name, 3, bytes(), transaction_uuid=self.transaction_3) + 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) @@ -282,13 +282,13 @@ async def test_get_with_transaction(self): self.assertEqual(expected, observed) async def test_get_raises(self): - with self.assertRaises(DeletedAggregateException): + with self.assertRaises(AlreadyDeletedException): await self.snapshot_repository.get("tests.utils.Car", self.uuid_1) - with self.assertRaises(AggregateNotFoundException): + with self.assertRaises(NotFoundException): await self.snapshot_repository.get("tests.utils.Car", uuid4()) async def test_get_with_transaction_raises(self): - with self.assertRaises(DeletedAggregateException): + with self.assertRaises(AlreadyDeletedException): await self.snapshot_repository.get( "tests.utils.Car", self.uuid_2, transaction=TransactionEntry(self.transaction_2) ) @@ -346,11 +346,11 @@ def _assert_equal_snapshot_entries(self, expected: list[SnapshotEntry], observed self.assertEqual(len(expected), len(observed)) for exp, obs in zip(expected, observed): if exp.data is None: - with self.assertRaises(DeletedAggregateException): + with self.assertRaises(AlreadyDeletedException): # noinspection PyStatementEffect - obs.build_aggregate() + obs.build() else: - self.assertEqual(exp.build_aggregate(), obs.build_aggregate()) + self.assertEqual(exp.build(), obs.build()) self.assertIsInstance(obs.created_at, datetime) self.assertIsInstance(obs.updated_at, datetime) 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 index c2e41acdb..3e6bcb4bc 100644 --- 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 @@ -41,6 +41,8 @@ def setUp(self) -> None: self.snapshot_repository.reader.find = self.find_mock self.snapshot_repository.writer.dispatch = self.dispatch_mock + self.classname = "path.to.Product" + def test_from_config(self): self.assertIsInstance(self.snapshot_repository.reader, PostgreSqlSnapshotReader) self.assertIsInstance(self.snapshot_repository.writer, PostgreSqlSnapshotWriter) @@ -48,20 +50,20 @@ def test_from_config(self): async def test_get(self): transaction = TransactionEntry() uuid = uuid4() - observed = await self.snapshot_repository.get("path.to.Aggregate", uuid, transaction) + 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(aggregate_name="path.to.Aggregate", uuid=uuid, transaction=transaction) + 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( - "path.to.Aggregate", Condition.TRUE, Ordering.ASC("name"), 10, True, transaction + self.classname, Condition.TRUE, Ordering.ASC("name"), 10, True, transaction ) observed = [a async for a in iterable] self.assertEqual(list(range(5)), observed) @@ -71,7 +73,7 @@ async def test_find(self): self.assertEqual(1, self.find_mock.call_count) args = call( - aggregate_name="path.to.Aggregate", + name=self.classname, condition=Condition.TRUE, ordering=Ordering.ASC("name"), limit=10, diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_pg/test_queries.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_pg/test_queries.py index 01615a959..b9afa3ef8 100644 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_pg/test_queries.py +++ b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_snapshots/test_pg/test_queries.py @@ -43,8 +43,9 @@ class TestPostgreSqlSnapshotQueryBuilder(PostgresAsyncTestCase): def setUp(self) -> None: super().setUp() + self.classname = "path.to.Product" self.base_parameters = { - "aggregate_name": "path.to.Aggregate", + "name": self.classname, "transaction_uuid_1": NULL_UUID, } self.base_select = _SELECT_ENTRIES_QUERY.format( @@ -54,8 +55,8 @@ def setUp(self) -> None: ) def test_constructor(self): - qb = PostgreSqlSnapshotQueryBuilder("path.to.Aggregate", Condition.TRUE) - self.assertEqual("path.to.Aggregate", qb.aggregate_name) + qb = PostgreSqlSnapshotQueryBuilder(self.classname, Condition.TRUE) + self.assertEqual(self.classname, qb.name) self.assertEqual(Condition.TRUE, qb.condition) self.assertEqual(None, qb.ordering) self.assertEqual(None, qb.limit) @@ -64,9 +65,9 @@ def test_constructor(self): def test_constructor_full(self): transaction_uuids = (NULL_UUID, uuid4()) qb = PostgreSqlSnapshotQueryBuilder( - "path.to.Aggregate", Condition.TRUE, Ordering.ASC("name"), 10, transaction_uuids, True + self.classname, Condition.TRUE, Ordering.ASC("name"), 10, transaction_uuids, True ) - self.assertEqual("path.to.Aggregate", qb.aggregate_name) + self.assertEqual(self.classname, qb.name) self.assertEqual(Condition.TRUE, qb.condition) self.assertEqual(Ordering.ASC("name"), qb.ordering) self.assertEqual(10, qb.limit) @@ -74,7 +75,7 @@ def test_constructor_full(self): self.assertTrue(qb.exclude_deleted) def test_build_submitting_context_var(self): - builder = PostgreSqlSnapshotQueryBuilder("path.to.Aggregate", Condition.TRUE) + builder = PostgreSqlSnapshotQueryBuilder(self.classname, Condition.TRUE) def _fn(): self.assertEqual(True, IS_REPOSITORY_SERIALIZATION_CONTEXT_VAR.get()) @@ -91,12 +92,12 @@ def _fn(): def test_build_raises(self): with self.assertRaises(ValueError): # noinspection PyTypeChecker - PostgreSqlSnapshotQueryBuilder("path.to.Aggregate", True).build() + PostgreSqlSnapshotQueryBuilder(self.classname, True).build() async def test_build_with_transactions(self): transaction_uuids = (NULL_UUID, uuid4()) observed = PostgreSqlSnapshotQueryBuilder( - "path.to.Aggregate", Condition.TRUE, transaction_uuids=transaction_uuids + self.classname, Condition.TRUE, transaction_uuids=transaction_uuids ).build() expected_query = SQL(" WHERE ").join( @@ -123,7 +124,7 @@ async def test_build_with_transactions(self): async def test_build_true(self): condition = Condition.TRUE - observed = PostgreSqlSnapshotQueryBuilder("path.to.Aggregate", condition).build() + observed = PostgreSqlSnapshotQueryBuilder(self.classname, condition).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL("TRUE")]) expected_parameters = self.base_parameters @@ -133,7 +134,7 @@ async def test_build_true(self): async def test_build_false(self): condition = Condition.FALSE - observed = PostgreSqlSnapshotQueryBuilder("path.to.Aggregate", condition).build() + observed = PostgreSqlSnapshotQueryBuilder(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,9 +144,9 @@ 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("path.to.Aggregate", condition).build() + observed = PostgreSqlSnapshotQueryBuilder(self.classname, condition).build() - expected_query = SQL(" WHERE ").join([self.base_select, SQL('("aggregate_uuid" = %(hello)s)')]) + expected_query = SQL(" WHERE ").join([self.base_select, SQL('("uuid" = %(hello)s)')]) expected_parameters = {"hello": str(uuid)} | self.base_parameters self.assertEqual(await self._flatten_query(expected_query), await self._flatten_query(observed[0])) @@ -154,7 +155,7 @@ 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("path.to.Aggregate", condition).build() + observed = PostgreSqlSnapshotQueryBuilder(self.classname, condition).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL('("version" = %(hello)s)')]) expected_parameters = {"hello": 1} | self.base_parameters @@ -165,7 +166,7 @@ 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("path.to.Aggregate", condition).build() + observed = PostgreSqlSnapshotQueryBuilder(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,7 +177,7 @@ 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("path.to.Aggregate", condition).build() + observed = PostgreSqlSnapshotQueryBuilder(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,7 +188,7 @@ async def test_build_fixed_updated_at(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("path.to.Aggregate", condition).build() + observed = PostgreSqlSnapshotQueryBuilder(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 @@ -198,7 +199,7 @@ 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("path.to.Aggregate", condition).build() + observed = PostgreSqlSnapshotQueryBuilder(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,7 +210,7 @@ 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("path.to.Aggregate", condition).build() + observed = PostgreSqlSnapshotQueryBuilder(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,7 +221,7 @@ 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("path.to.Aggregate", condition).build() + observed = PostgreSqlSnapshotQueryBuilder(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,7 +232,7 @@ 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("path.to.Aggregate", condition).build() + observed = PostgreSqlSnapshotQueryBuilder(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,7 +243,7 @@ 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("path.to.Aggregate", condition).build() + observed = PostgreSqlSnapshotQueryBuilder(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,7 +254,7 @@ 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("path.to.Aggregate", condition).build() + observed = PostgreSqlSnapshotQueryBuilder(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 @@ -264,7 +265,7 @@ 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("path.to.Aggregate", condition).build() + observed = PostgreSqlSnapshotQueryBuilder(self.classname, condition).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL("FALSE")]) expected_parameters = self.base_parameters @@ -275,7 +276,7 @@ async def test_build_in_empty(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("path.to.Aggregate", condition).build() + observed = PostgreSqlSnapshotQueryBuilder(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 @@ -288,7 +289,7 @@ async def test_build_and(self): with patch( "minos.aggregate.PostgreSqlSnapshotQueryBuilder.generate_random_str", side_effect=["hello", "goodbye"] ): - observed = PostgreSqlSnapshotQueryBuilder("path.to.Aggregate", condition).build() + observed = PostgreSqlSnapshotQueryBuilder(self.classname, condition).build() expected_query = SQL(" WHERE ").join( [self.base_select, SQL("((data#>'{age}' < %(hello)s::jsonb) AND (data#>'{level}' < %(goodbye)s::jsonb))")] @@ -303,7 +304,7 @@ async def test_build_or(self): with patch( "minos.aggregate.PostgreSqlSnapshotQueryBuilder.generate_random_str", side_effect=["hello", "goodbye"] ): - observed = PostgreSqlSnapshotQueryBuilder("path.to.Aggregate", condition).build() + observed = PostgreSqlSnapshotQueryBuilder(self.classname, condition).build() expected_query = SQL(" WHERE ").join( [self.base_select, SQL("((data#>'{age}' < %(hello)s::jsonb) OR (data#>'{level}' < %(goodbye)s::jsonb))")] @@ -314,7 +315,7 @@ 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("path.to.Aggregate", Condition.TRUE, exclude_deleted=True).build() + observed = PostgreSqlSnapshotQueryBuilder(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 @@ -324,7 +325,7 @@ async def test_build_exclude_deleted(self): async def test_build_fixed_ordering_asc(self): ordering = Ordering.ASC("created_at") - observed = PostgreSqlSnapshotQueryBuilder("path.to.Aggregate", Condition.TRUE, ordering).build() + observed = PostgreSqlSnapshotQueryBuilder(self.classname, Condition.TRUE, ordering).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL('TRUE ORDER BY "created_at" ASC')]) @@ -335,7 +336,7 @@ async def test_build_fixed_ordering_asc(self): async def test_build_fixed_ordering_desc(self): ordering = Ordering.DESC("created_at") - observed = PostgreSqlSnapshotQueryBuilder("path.to.Aggregate", Condition.TRUE, ordering).build() + observed = PostgreSqlSnapshotQueryBuilder(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 @@ -345,7 +346,7 @@ async def test_build_fixed_ordering_desc(self): async def test_build_ordering_asc(self): ordering = Ordering.ASC("name") - observed = PostgreSqlSnapshotQueryBuilder("path.to.Aggregate", Condition.TRUE, ordering).build() + observed = PostgreSqlSnapshotQueryBuilder(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 @@ -355,7 +356,7 @@ async def test_build_ordering_asc(self): async def test_build_ordering_desc(self): ordering = Ordering.DESC("name") - observed = PostgreSqlSnapshotQueryBuilder("path.to.Aggregate", Condition.TRUE, ordering).build() + observed = PostgreSqlSnapshotQueryBuilder(self.classname, Condition.TRUE, ordering).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL("TRUE ORDER BY data#>'{name}' DESC")]) @@ -365,7 +366,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("path.to.Aggregate", Condition.TRUE, limit=10).build() + observed = PostgreSqlSnapshotQueryBuilder(self.classname, Condition.TRUE, limit=10).build() expected_query = SQL(" WHERE ").join([self.base_select, SQL("TRUE LIMIT 10")]) @@ -385,7 +386,7 @@ async def test_build_complex(self): with patch( "minos.aggregate.PostgreSqlSnapshotQueryBuilder.generate_random_str", side_effect=["one", "two", "three"] ): - observed = PostgreSqlSnapshotQueryBuilder("path.to.Aggregate", condition, ordering, limit).build() + observed = PostgreSqlSnapshotQueryBuilder(self.classname, condition, ordering, limit).build() expected_query = SQL(" WHERE ").join( [ 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 index 0d6a10f08..032536e7b 100644 --- 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 @@ -7,12 +7,12 @@ ) from minos.aggregate import ( - AggregateNotFoundException, + AlreadyDeletedException, Condition, - DeletedAggregateException, EventEntry, FieldDiff, FieldDiffContainer, + NotFoundException, Ordering, PostgreSqlSnapshotReader, PostgreSqlSnapshotSetup, @@ -59,26 +59,26 @@ async def asyncTearDown(self): async def _populate(self): diff = FieldDiffContainer([FieldDiff("doors", int, 3), FieldDiff("color", str, "blue")]) # noinspection PyTypeChecker - aggregate_name: str = Car.classname - - await self.event_repository.create(EventEntry(self.uuid_1, aggregate_name, 1, diff.avro_bytes)) - await self.event_repository.update(EventEntry(self.uuid_1, aggregate_name, 2, diff.avro_bytes)) - await self.event_repository.create(EventEntry(self.uuid_2, aggregate_name, 1, diff.avro_bytes)) - await self.event_repository.update(EventEntry(self.uuid_1, aggregate_name, 3, diff.avro_bytes)) - await self.event_repository.delete(EventEntry(self.uuid_1, aggregate_name, 4)) - await self.event_repository.update(EventEntry(self.uuid_2, aggregate_name, 2, diff.avro_bytes)) + 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, aggregate_name, 3, diff.avro_bytes, transaction_uuid=self.transaction_1) + EventEntry(self.uuid_2, name, 3, diff.avro_bytes, transaction_uuid=self.transaction_1) ) await self.event_repository.delete( - EventEntry(self.uuid_2, aggregate_name, 3, bytes(), transaction_uuid=self.transaction_2) + EventEntry(self.uuid_2, name, 3, bytes(), transaction_uuid=self.transaction_2) ) await self.event_repository.update( - EventEntry(self.uuid_2, aggregate_name, 4, diff.avro_bytes, transaction_uuid=self.transaction_1) + EventEntry(self.uuid_2, name, 4, diff.avro_bytes, transaction_uuid=self.transaction_1) ) - await self.event_repository.create(EventEntry(self.uuid_3, aggregate_name, 1, diff.avro_bytes)) + await self.event_repository.create(EventEntry(self.uuid_3, name, 1, diff.avro_bytes)) await self.event_repository.delete( - EventEntry(self.uuid_2, aggregate_name, 3, bytes(), transaction_uuid=self.transaction_3) + 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) @@ -295,14 +295,14 @@ async def test_get_with_transaction(self): async def test_get_raises(self): - with self.assertRaises(DeletedAggregateException): + with self.assertRaises(AlreadyDeletedException): await self.reader.get("tests.utils.Car", self.uuid_1) - with self.assertRaises(AggregateNotFoundException): + with self.assertRaises(NotFoundException): await self.reader.get("tests.utils.Car", uuid4()) async def test_get_with_transaction_raises(self): - with self.assertRaises(DeletedAggregateException): + with self.assertRaises(AlreadyDeletedException): await self.reader.get("tests.utils.Car", self.uuid_2, transaction=TransactionEntry(self.transaction_2)) async def test_find(self): @@ -360,11 +360,11 @@ def _assert_equal_snapshot_entries(self, expected: list[SnapshotEntry], observed self.assertEqual(len(expected), len(observed)) for exp, obs in zip(expected, observed): if exp.data is None: - with self.assertRaises(DeletedAggregateException): + with self.assertRaises(AlreadyDeletedException): # noinspection PyStatementEffect - obs.build_aggregate() + obs.build() else: - self.assertEqual(exp.build_aggregate(), obs.build_aggregate()) + self.assertEqual(exp.build(), obs.build()) self.assertIsInstance(obs.created_at, datetime) self.assertIsInstance(obs.updated_at, datetime) 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 index 484961e52..ffebe4e14 100644 --- 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 @@ -12,8 +12,8 @@ from minos.aggregate import ( Action, + AlreadyDeletedException, Condition, - DeletedAggregateException, EventEntry, FieldDiff, FieldDiffContainer, @@ -69,26 +69,26 @@ async def asyncTearDown(self): async def _populate(self): diff = FieldDiffContainer([FieldDiff("doors", int, 3), FieldDiff("color", str, "blue")]) # noinspection PyTypeChecker - aggregate_name: str = Car.classname - - await self.event_repository.create(EventEntry(self.uuid_1, aggregate_name, 1, diff.avro_bytes)) - await self.event_repository.update(EventEntry(self.uuid_1, aggregate_name, 2, diff.avro_bytes)) - await self.event_repository.create(EventEntry(self.uuid_2, aggregate_name, 1, diff.avro_bytes)) - await self.event_repository.update(EventEntry(self.uuid_1, aggregate_name, 3, diff.avro_bytes)) - await self.event_repository.delete(EventEntry(self.uuid_1, aggregate_name, 4)) - await self.event_repository.update(EventEntry(self.uuid_2, aggregate_name, 2, diff.avro_bytes)) + 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, aggregate_name, 3, diff.avro_bytes, transaction_uuid=self.transaction_1) + EventEntry(self.uuid_2, name, 3, diff.avro_bytes, transaction_uuid=self.transaction_1) ) await self.event_repository.delete( - EventEntry(self.uuid_2, aggregate_name, 3, bytes(), transaction_uuid=self.transaction_2) + EventEntry(self.uuid_2, name, 3, bytes(), transaction_uuid=self.transaction_2) ) await self.event_repository.update( - EventEntry(self.uuid_2, aggregate_name, 4, diff.avro_bytes, transaction_uuid=self.transaction_1) + EventEntry(self.uuid_2, name, 4, diff.avro_bytes, transaction_uuid=self.transaction_1) ) - await self.event_repository.create(EventEntry(self.uuid_3, aggregate_name, 1, diff.avro_bytes)) + await self.event_repository.create(EventEntry(self.uuid_3, name, 1, diff.avro_bytes)) await self.event_repository.delete( - EventEntry(self.uuid_2, aggregate_name, 3, bytes(), transaction_uuid=self.transaction_3) + 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) @@ -129,7 +129,7 @@ async def test_dispatch(self): # noinspection PyTypeChecker expected = [ SnapshotEntry(self.uuid_1, Car.classname, 4), - SnapshotEntry.from_aggregate( + SnapshotEntry.from_root_entity( Car( 3, "blue", @@ -139,7 +139,7 @@ async def test_dispatch(self): updated_at=observed[1].updated_at, ) ), - SnapshotEntry.from_aggregate( + SnapshotEntry.from_root_entity( Car( 3, "blue", @@ -168,7 +168,7 @@ async def test_dispatch_first_transaction(self): # noinspection PyTypeChecker expected = [ SnapshotEntry(self.uuid_1, Car.classname, 4), - SnapshotEntry.from_aggregate( + SnapshotEntry.from_root_entity( Car( 3, "blue", @@ -178,7 +178,7 @@ async def test_dispatch_first_transaction(self): updated_at=observed[1].updated_at, ) ), - SnapshotEntry.from_aggregate( + SnapshotEntry.from_root_entity( Car( 3, "blue", @@ -208,7 +208,7 @@ async def test_dispatch_second_transaction(self): expected = [ SnapshotEntry(self.uuid_1, Car.classname, 4), SnapshotEntry(self.uuid_2, Car.classname, 4), - SnapshotEntry.from_aggregate( + SnapshotEntry.from_root_entity( Car( 3, "blue", @@ -237,7 +237,7 @@ async def test_dispatch_third_transaction(self): # noinspection PyTypeChecker expected = [ SnapshotEntry(self.uuid_1, Car.classname, 4), - SnapshotEntry.from_aggregate( + SnapshotEntry.from_root_entity( Car( 3, "blue", @@ -247,7 +247,7 @@ async def test_dispatch_third_transaction(self): updated_at=observed[1].updated_at, ) ), - SnapshotEntry.from_aggregate( + SnapshotEntry.from_root_entity( Car( 3, "blue", @@ -268,24 +268,24 @@ async def test_is_synced(self): async def test_dispatch_ignore_previous_version(self): diff = FieldDiffContainer([FieldDiff("doors", int, 3), FieldDiff("color", str, "blue")]) # noinspection PyTypeChecker - aggregate_name: str = Car.classname + name: str = Car.classname condition = Condition.EQUAL("uuid", self.uuid_1) async def _fn(*args, **kwargs): - yield EventEntry(self.uuid_1, aggregate_name, 1, diff.avro_bytes, 1, Action.CREATE, current_datetime()) - yield EventEntry(self.uuid_1, aggregate_name, 3, diff.avro_bytes, 2, Action.CREATE, current_datetime()) - yield EventEntry(self.uuid_1, aggregate_name, 2, diff.avro_bytes, 3, Action.CREATE, current_datetime()) + 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(aggregate_name, condition)] + observed = [v async for v in self.reader.find_entries(name, condition)] # noinspection PyTypeChecker expected = [ SnapshotEntry( - aggregate_uuid=self.uuid_1, - aggregate_name=aggregate_name, + uuid=self.uuid_1, + name=name, version=3, schema=Car.avro_schema, data=Car(3, "blue", uuid=self.uuid_1, version=1).avro_data, @@ -299,11 +299,11 @@ def _assert_equal_snapshot_entries(self, expected: list[SnapshotEntry], observed self.assertEqual(len(expected), len(observed)) for exp, obs in zip(expected, observed): if exp.data is None: - with self.assertRaises(DeletedAggregateException): + with self.assertRaises(AlreadyDeletedException): # noinspection PyStatementEffect - obs.build_aggregate() + obs.build() else: - self.assertEqual(exp.build_aggregate(), obs.build_aggregate()) + self.assertEqual(exp.build(), obs.build()) self.assertIsInstance(obs.created_at, datetime) self.assertIsInstance(obs.updated_at, datetime) @@ -318,8 +318,8 @@ async def test_dispatch_with_offset(self): # noinspection PyTypeChecker entry = EventEntry( - aggregate_uuid=self.uuid_3, - aggregate_name=Car.classname, + 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) 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 a30247cb5..e3c98eeb9 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 @@ -9,6 +9,7 @@ ) from minos.aggregate import ( + RootEntity, SnapshotService, ) from minos.common import ( @@ -49,37 +50,37 @@ def test_get_enroute(self): observed = SnapshotService.__get_enroute__(self.config) self.assertEqual(expected, observed) - async def test_get_aggregate(self): + async def test_get(self): uuid = uuid4() expected = Agg(uuid) - with patch("minos.aggregate.Aggregate.get", return_value=expected): + with patch.object(RootEntity, "get", return_value=expected): response = await self.service.__get_one__(InMemoryRequest({"uuid": uuid})) self.assertEqual(expected, await response.content()) - async def test_get_aggregate_raises(self): + async def test_get_raises(self): with self.assertRaises(ResponseException): await self.service.__get_one__(InMemoryRequest()) - with patch("minos.aggregate.Aggregate.get", side_effect=ValueError): + with patch.object(RootEntity, "get", side_effect=ValueError): with self.assertRaises(ResponseException): await self.service.__get_one__(InMemoryRequest({"uuid": uuid4()})) - async def test_get_aggregates(self): + async def test_get_many(self): uuids = [uuid4(), uuid4()] expected = [Agg(u) for u in uuids] - with patch("minos.aggregate.Aggregate.get", side_effect=expected): + with patch.object(RootEntity, "get", side_effect=expected): response = await self.service.__get_many__(InMemoryRequest({"uuids": uuids})) self.assertEqual(expected, await response.content()) - async def test_get_aggregates_raises(self): + async def test_get_many_raises(self): with self.assertRaises(ResponseException): await self.service.__get_many__(InMemoryRequest()) - with patch("minos.aggregate.Aggregate.get", side_effect=ValueError): + with patch.object(RootEntity, "get", side_effect=ValueError): with self.assertRaises(ResponseException): await self.service.__get_many__(InMemoryRequest({"uuids": [uuid4()]})) - def test_aggregate_cls(self): - self.assertEqual(Order, self.service.__aggregate_cls__) + def test_type(self): + self.assertEqual(Order, self.service.type_) async def test_synchronize(self): mock = AsyncMock() diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_something.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_something.py deleted file mode 100644 index b21589a59..000000000 --- a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_something.py +++ /dev/null @@ -1,10 +0,0 @@ -import unittest - - -class TestSomething(unittest.TestCase): - def test_something(self): - self.assertEqual(True, True) - - -if __name__ == "__main__": - unittest.main() 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 7af58bb05..e6d387c6f 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 @@ -186,7 +186,7 @@ async def test_validate_true(self): self.assertTrue(await transaction.validate()) self.assertEqual( - [call(transaction_uuid=uuid), call(aggregate_uuid=agg_uuid, version=3)], select_event_mock.call_args_list + [call(transaction_uuid=uuid), call(uuid=agg_uuid, version=3)], select_event_mock.call_args_list ) self.assertEqual( [ @@ -295,7 +295,7 @@ async def test_validate_false_already_committed(self): self.assertFalse(await transaction.validate()) self.assertEqual( - [call(transaction_uuid=uuid), call(aggregate_uuid=agg_uuid, version=3)], select_event_mock.call_args_list + [call(transaction_uuid=uuid), call(uuid=agg_uuid, version=3)], select_event_mock.call_args_list ) self.assertEqual( [ @@ -347,7 +347,7 @@ async def test_validate_false_already_reserved(self): self.assertFalse(await transaction.validate()) self.assertEqual( - [call(transaction_uuid=uuid), call(aggregate_uuid=agg_uuid, version=3)], select_event_mock.call_args_list + [call(transaction_uuid=uuid), call(uuid=agg_uuid, version=3)], select_event_mock.call_args_list ) self.assertEqual( [ diff --git a/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_value_objects.py b/packages/core/minos-microservice-aggregate/tests/test_aggregate/test_value_objects.py similarity index 100% rename from packages/core/minos-microservice-aggregate/tests/test_aggregate/test_models/test_value_objects.py rename to packages/core/minos-microservice-aggregate/tests/test_aggregate/test_value_objects.py diff --git a/packages/core/minos-microservice-aggregate/tests/testcases/event_repository.py b/packages/core/minos-microservice-aggregate/tests/testcases/event_repository.py index 89dd611d6..c97c85b42 100644 --- a/packages/core/minos-microservice-aggregate/tests/testcases/event_repository.py +++ b/packages/core/minos-microservice-aggregate/tests/testcases/event_repository.py @@ -60,8 +60,8 @@ def assert_equal_repository_entries(self, expected: list[EventEntry], observed: for e, o in zip(expected, observed): self.assertEqual(type(e), type(o)) - self.assertEqual(e.aggregate_uuid, o.aggregate_uuid) - self.assertEqual(e.aggregate_name, o.aggregate_name) + self.assertEqual(e.uuid, o.uuid) + self.assertEqual(e.name, o.name) self.assertEqual(e.version, o.version) self.assertEqual(e.data, o.data) self.assertEqual(e.id, o.id) @@ -76,8 +76,8 @@ 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()] self.assertEqual(1, len(observed)) - self.assertIsInstance(observed[0].aggregate_uuid, UUID) - self.assertNotEqual(NULL_UUID, observed[0].aggregate_uuid) + self.assertIsInstance(observed[0].uuid, UUID) + self.assertNotEqual(NULL_UUID, observed[0].uuid) async def test_submit(self): await self.event_repository.submit(EventEntry(self.uuid, "example.Car", action=Action.CREATE)) @@ -223,14 +223,14 @@ async def test_select_id_ge(self): observed = [v async for v in self.event_repository.select(id_ge=5)] self.assert_equal_repository_entries(expected, observed) - async def test_select_aggregate_uuid(self): + async def test_select_uuid(self): 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(aggregate_uuid=self.uuid_2)] + 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_aggregate_name(self): + async def test_select_name(self): expected = [self.entries[6]] - observed = [v async for v in self.event_repository.select(aggregate_name="example.MotorCycle")] + 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): @@ -301,7 +301,5 @@ async def test_select_transaction_uuid_in(self): async def test_select_combined(self): 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(aggregate_name="example.Car", aggregate_uuid=self.uuid_2) - ] + 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/tests/utils.py b/packages/core/minos-microservice-aggregate/tests/utils.py index 9098ba5be..6c5ee14ea 100644 --- a/packages/core/minos-microservice-aggregate/tests/utils.py +++ b/packages/core/minos-microservice-aggregate/tests/utils.py @@ -13,6 +13,9 @@ from typing import ( Optional, ) +from uuid import ( + UUID, +) from dependency_injector import ( containers, @@ -23,10 +26,12 @@ Aggregate, Entity, EntitySet, + ExternalEntity, InMemoryEventRepository, InMemorySnapshotRepository, InMemoryTransactionRepository, - ModelRef, + Ref, + RootEntity, ValueObject, ValueObjectSet, ) @@ -135,23 +140,23 @@ async def _destroy_instance(self, instance) -> None: """For testing purposes.""" -class Owner(Aggregate): - """Aggregate ``Owner`` class for testing purposes.""" +class Owner(RootEntity): + """For testing purposes""" name: str surname: str age: Optional[int] -class Car(Aggregate): - """Aggregate ``Car`` class for testing purposes.""" +class Car(RootEntity): + """For testing purposes""" doors: int color: str - owner: Optional[ModelRef[Owner]] + owner: Optional[Ref[Owner]] -class Order(Aggregate): +class Order(RootEntity): """For testing purposes""" products: EntitySet[OrderItem] @@ -161,10 +166,28 @@ class Order(Aggregate): class OrderItem(Entity): """For testing purposes""" - amount: int + name: str class Review(ValueObject): """For testing purposes.""" message: str + + +class Product(ExternalEntity): + """For testing purposes.""" + + title: str + quantity: int + + +class OrderAggregate(Aggregate[Order]): + """For testing purposes.""" + + @staticmethod + async def create_order() -> UUID: + """For testing purposes.""" + + order = await Order.create(products=EntitySet(), reviews=ValueObjectSet()) + return order.uuid diff --git a/packages/core/minos-microservice-common/.pre-commit-config.yaml b/packages/core/minos-microservice-common/.pre-commit-config.yaml deleted file mode 100644 index c8808ff4e..000000000 --- a/packages/core/minos-microservice-common/.pre-commit-config.yaml +++ /dev/null @@ -1,38 +0,0 @@ -repos: - - repo: local - hooks: - - id: install - pass_filenames: false - name: Install dependencies - entry: make install - language: system - - - id: reformat - pass_filenames: false - name: Reformat package - entry: make reformat - language: system - - - id: lint - pass_filenames: false - name: Lint package - entry: make lint - language: system - - - id: test - pass_filenames: false - name: Test package - entry: make test - language: system - - - id: docs - pass_filenames: false - name: Generate documentation - entry: make docs - language: system - - - id: build - pass_filenames: false - entry: make dist - name: Generate build - language: system diff --git a/packages/core/minos-microservice-common/HISTORY.md b/packages/core/minos-microservice-common/HISTORY.md index 310fc2c8e..80a7423be 100644 --- a/packages/core/minos-microservice-common/HISTORY.md +++ b/packages/core/minos-microservice-common/HISTORY.md @@ -269,3 +269,13 @@ History ------------------ * Add waiting time before destroying the `minos.common.MinosPool` acquired instances. + +0.4.1 (2022-01-31) +------------------ + +* Update `README.md`. + +0.5.0 (2022-02-03) +------------------ + +* Minor changes. \ No newline at end of file diff --git a/packages/core/minos-microservice-common/Makefile b/packages/core/minos-microservice-common/Makefile index 9b3b57da2..854bc90bc 100644 --- a/packages/core/minos-microservice-common/Makefile +++ b/packages/core/minos-microservice-common/Makefile @@ -32,3 +32,11 @@ install: update: poetry update + +check: + $(MAKE) install + $(MAKE) reformat + $(MAKE) lint + $(MAKE) test + $(MAKE) docs + $(MAKE) dist diff --git a/packages/core/minos-microservice-common/README.md b/packages/core/minos-microservice-common/README.md index 1ae766b80..3837018db 100644 --- a/packages/core/minos-microservice-common/README.md +++ b/packages/core/minos-microservice-common/README.md @@ -1,7 +1,16 @@ -# Minos Microservice Common +

+ Minos logo +

-[![codecov](https://codecov.io/gh/Clariteia/minos_microservice_common/branch/main/graph/badge.svg)](https://codecov.io/gh/Clariteia/minos_microservice_common) -![Tests](https://github.com/Clariteia/minos_microservice_common/actions/workflows/python-tests.yml/badge.svg) +## minos-microservice-common + +[![PyPI Latest Release](https://img.shields.io/pypi/v/minos-microservice-common.svg)](https://pypi.org/project/minos-microservice-common/) +[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/minos-framework/minos-python/pages%20build%20and%20deployment?label=docs)](https://minos-framework.github.io/minos-python) +[![License](https://img.shields.io/github/license/minos-framework/minos-python.svg)](https://github.com/minos-framework/minos-python/blob/main/LICENSE) +[![Coverage](https://codecov.io/github/minos-framework/minos-python/coverage.svg?branch=main)](https://codecov.io/gh/minos-framework/minos-python) +[![Stack Overflow](https://img.shields.io/badge/Stack%20Overflow-Ask%20a%20question-green)](https://stackoverflow.com/questions/tagged/minos) + +## 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 @@ -9,76 +18,19 @@ asynchronous environment. ## Documentation -The official documentation as well as the API you can find it under https://clariteia.github.io/minos_microservice_common/. -Please, submit any issue regarding documentation as well! - -## Set up a development environment - -Minos uses `poetry` as its default package manager. Please refer to the -[Poetry installation guide](https://python-poetry.org/docs/#installation) for instructions on how to install it. - -Now you con install all the dependencies by running -```bash -make install -``` - -In order to make the pre-commits checks available to git, run -```bash -pre-commit install -``` - -Make yourself sure you are able to run the tests. Refer to the appropriate section in this guide. - -## Run the tests - -In order to run the tests, please make sure you have the [Docker Engine](https://docs.docker.com/engine/install/) -and [Docker Compose](https://docs.docker.com/compose/install/) installed. - -Move into `tests/` directory - -```bash -cd tests/ -``` -Run service dependencies: - -```bash -docker-compose up -d -``` - -Install library dependencies: - -```bash -make install -``` - -Run tests: - -```bash -make test -``` - -## 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. - -Please consider these guidelines before you submit any modification. +The official API Reference is publicly available at the [GitHub Pages](https://minos-framework.github.io/minos-python). -### Create an issue +## Source Code -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. +The source code of this project is hosted at the [GitHub Repository](https://github.com/minos-framework/minos-python). -### Submit a Pull Request +## Getting Help -1. Create an issue following the previous steps. -2. Fork the project. -3. Push your changes to a local branch. -4. Run the tests! -5. Submit a pull request from your fork's branch. +For usage questions, the best place to go to is [StackOverflow](https://stackoverflow.com/questions/tagged/minos). -## Credits +## 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. -This package was created with ![Cookiecutter](https://github.com/audreyr/cookiecutter) and the ![Minos Package](https://github.com/Clariteia/minos-pypackage) project template. +## License +This project is distributed under the [MIT](https://raw.githubusercontent.com/minos-framework/minos-python/main/LICENSE) license. diff --git a/packages/core/minos-microservice-common/minos/common/__init__.py b/packages/core/minos-microservice-common/minos/common/__init__.py index b30086083..441e8c580 100644 --- a/packages/core/minos-microservice-common/minos/common/__init__.py +++ b/packages/core/minos-microservice-common/minos/common/__init__.py @@ -1,6 +1,6 @@ __author__ = "Minos Framework Devs" __email__ = "hey@minos.run" -__version__ = "0.4.0" +__version__ = "0.5.0" from .configuration import ( BROKER, diff --git a/packages/core/minos-microservice-common/minos/common/launchers.py b/packages/core/minos-microservice-common/minos/common/launchers.py index 620b03378..14e7c3e5c 100644 --- a/packages/core/minos-microservice-common/minos/common/launchers.py +++ b/packages/core/minos-microservice-common/minos/common/launchers.py @@ -79,7 +79,7 @@ def __init__( log_date_format: Union[str, DateFormat] = DateFormat["color"], external_modules: Optional[list[ModuleType]] = None, *args, - **kwargs + **kwargs, ): if external_modules is None: external_modules = list() diff --git a/packages/core/minos-microservice-common/poetry.lock b/packages/core/minos-microservice-common/poetry.lock index 741f945a4..59b0cdb43 100644 --- a/packages/core/minos-microservice-common/poetry.lock +++ b/packages/core/minos-microservice-common/poetry.lock @@ -85,28 +85,24 @@ pytz = ">=2015.7" [[package]] name = "black" -version = "21.12b0" +version = "22.1.0" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.6.2" [package.dependencies] -click = ">=7.1.2" +click = ">=8.0.0" mypy-extensions = ">=0.4.3" -pathspec = ">=0.9.0,<1" +pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = ">=0.2.6,<2.0.0" -typing-extensions = [ - {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}, - {version = "!=3.10.0.1", markers = "python_version >= \"3.10\""}, -] +tomli = ">=1.1.0" +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)"] -python2 = ["typed-ast (>=1.4.3)"] uvloop = ["uvloop (>=0.15.2)"] [[package]] @@ -190,7 +186,7 @@ toml = ["tomli"] [[package]] name = "dependency-injector" -version = "4.37.0" +version = "4.38.0" description = "Dependency injection framework for Python" category = "main" optional = false @@ -811,7 +807,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "820cf0b3e427d6b50179bf3ddfd3c37edad1858cb61c0ad3319488bd3567cf1b" +content-hash = "6d2e61afb5b2cf90183a61ffe5fab62c065f3586603a70284571b91fa7dc359b" [metadata.files] aiomisc = [ @@ -843,8 +839,29 @@ babel = [ {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, ] black = [ - {file = "black-21.12b0-py3-none-any.whl", hash = "sha256:a615e69ae185e08fdd73e4715e260e2479c861b5740057fde6e8b4e3b7dd589f"}, - {file = "black-21.12b0.tar.gz", hash = "sha256:77b80f693a569e2e527958459634f18df9b0ba2625ba4e0c2d5da5be42e6f2b3"}, + {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"}, ] cached-property = [ {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, @@ -921,42 +938,42 @@ coverage = [ {file = "coverage-6.3.tar.gz", hash = "sha256:987a84ff98a309994ca77ed3cc4b92424f824278e48e4bf7d1bb79a63cfe2099"}, ] dependency-injector = [ - {file = "dependency-injector-4.37.0.tar.gz", hash = "sha256:8881c65ecc133d4b0af1cf35215a7bfab8d907e10ee1452d2dfef27cc3ca23d3"}, - {file = "dependency_injector-4.37.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6fdabe9dd14259fe14eb4c65f5bf244524a5cc43a474cb448528daeda4453573"}, - {file = "dependency_injector-4.37.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a184b71e8aa2fffd6c3d3828c2db045a14c3bc1ac9ca7945db76b9ac93efca81"}, - {file = "dependency_injector-4.37.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0cc2cb5b85a587f9b95505391ab4f1ef02432a590807f2230f445666d0bd3984"}, - {file = "dependency_injector-4.37.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:985570539c2703c6c009077026042a05b05474e75bec585607a556c1970bdeee"}, - {file = "dependency_injector-4.37.0-cp310-cp310-win32.whl", hash = "sha256:b73bd0dd82b42950fb78baae68750ecb5c943d39cbfacea8dbee9d6df6535427"}, - {file = "dependency_injector-4.37.0-cp310-cp310-win_amd64.whl", hash = "sha256:a944c1bbbb81dbeca8c30001bc8b7e061ca52cf291bf0dd35005863484e6ea8a"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d15b6fe1be06bffecf9b5f28fd972596f1ef6b7553d884c317b6d472ca0fb040"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbf05aefcb3cd856624e2203f69a61ad54ffa0541a23a8e6d136c178b7a37153"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ededd0f6f7abe153030f3f50959abf5cb65bf7e5215a59b9333e027d6262d161"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a3c5312fa1854eb45ed78a720ac5e1e354769e55a2fb42ca142b5dd612e8f0da"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-win32.whl", hash = "sha256:6446bd95a80a487893e162eeb8aa2f3029ab47bb4641a9e5d431f3c024b459c9"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-win_amd64.whl", hash = "sha256:fb29620e8249d66e8328d30c44d2f788d773132cdb6d0d62be4f1dd4343fc748"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c9fad82e44a34c83a0b522692aace49f3149d44b3ff826197a131a27a8df51df"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bfbcaa71ea2fd3a54e46d5038e6cedbb66d7c1319ac638f935f6cbba348ffc9"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d550f4e9e81e87ae23c5086e5b3b08f2331a02e9dc7a2553ce16275ba9921817"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a5242bca4f404c4918ba00b48fa1780c42903a9ff850956e04134bfc8b423d04"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-win32.whl", hash = "sha256:59f557f1f1f7fe856759fdc59b5f2c012e4caaf05b4f848cbb1f250bdf4d8541"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c69196827505288a8f94f9d36d4b4829fb23d5a62f0898e0aa7d5ad1fce0505e"}, - {file = "dependency_injector-4.37.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7639c601288417352af3318d683e96f034ffb685de2cfb8d79a75f982c262302"}, - {file = "dependency_injector-4.37.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b607090446e697b77d36be523ed845021d2379d62fcaf152998127066b70d80"}, - {file = "dependency_injector-4.37.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c9f31a7b3806098476767531b40f8a59dac726ce7602158a6e093f9e2be46f1a"}, - {file = "dependency_injector-4.37.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:86c4e918064de9e300152233da096797c4de7bb8e33ce86a7c6a398daf760c57"}, - {file = "dependency_injector-4.37.0-cp38-cp38-win32.whl", hash = "sha256:9756873290abd53111f9a7edc055c62a7968ac67d0fc3f49e7dba5bdda5c78a3"}, - {file = "dependency_injector-4.37.0-cp38-cp38-win_amd64.whl", hash = "sha256:35ac330fc1ed6ba0751f3eaa6a6f068c4e88cb1069bbe0c10568847db00dc62d"}, - {file = "dependency_injector-4.37.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6dc75b54da62da105ea5d4541bc5f1d0d1edb1be3763d2e9e1184fd0f249f23b"}, - {file = "dependency_injector-4.37.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9f9572021c4ed1ae59d22437ba60c4d92d1a1ec1e5fee1f81ef0c58096b9ee8"}, - {file = "dependency_injector-4.37.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2c796ec1de86c5bd34ba6a96ea95409582ebc8e54d9a62f263c7c7852d593ae6"}, - {file = "dependency_injector-4.37.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b7fda0bd48b8b3d6f9e7227d872b7d0cc95b8d54f296213369867f7490e38d06"}, - {file = "dependency_injector-4.37.0-cp39-cp39-win32.whl", hash = "sha256:c80521fc43f2812fec10ab4b92e7168659e25b5b13e0e3d45da0260e959da24a"}, - {file = "dependency_injector-4.37.0-cp39-cp39-win_amd64.whl", hash = "sha256:8930da0c2a0bdc3d96863e9f9522abeeb106ee7bb5c670805e97e42838191998"}, - {file = "dependency_injector-4.37.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6001f91e67700479088763babe976354538344ca347abe2d4405f6f4bc40b803"}, - {file = "dependency_injector-4.37.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14ccce9356f161c42664b73085c7ead179186e6cb8434bf885fa64b213e32712"}, - {file = "dependency_injector-4.37.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:58be030a8b0f4a856523ce3799cecfcf686a545b79f1f897262cec43090a7fd3"}, - {file = "dependency_injector-4.37.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a3bc779fe3f1331299032c51ec66c01dfd49e1a052c7ac3ac96aef30313c2e80"}, - {file = "dependency_injector-4.37.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:7c781db928a6f02f5f373773dc1a263e1e9dfcce2a854b42c9c261db2eb0042f"}, + {file = "dependency-injector-4.38.0.tar.gz", hash = "sha256:bab4c323d822d3fc9936e8eb3c2f5553d75e9efdadac11d5b293a016e31a1477"}, + {file = "dependency_injector-4.38.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:025eb5f97021663715bff8e01feb83d5b2f66fc17ece1042a194f1aae88c0d85"}, + {file = "dependency_injector-4.38.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3c61334b196ab767eae43af207764349287d5eb0283d8ed1ab24608121aea35"}, + {file = "dependency_injector-4.38.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9bf4bfc52015e81c4f17647b7bbbe4e4549f041b3c6635b44a9ecede7594932c"}, + {file = "dependency_injector-4.38.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7aeba5882b06baf78978f33228e4c44133dada9173e330da68fbccca98520848"}, + {file = "dependency_injector-4.38.0-cp310-cp310-win32.whl", hash = "sha256:445dbf5324eee215a465d7f3b1965b05e199c31caa09e63abf0f02d982791306"}, + {file = "dependency_injector-4.38.0-cp310-cp310-win_amd64.whl", hash = "sha256:880edbcb5d810faa0623112e2e652a7bec73d20ce0708d9db998a0a40b62cbb9"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cd6f1c130462e7461a43f82fdc0d2ba25b5ef594db823dbd0e57f3d1b7c44f86"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be75905f7513886699d3ff5ed9aca233175c03808fc888da2a53b83af0a5d65"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d7f1a7d27de6295ce8b7ca69d1177817bf36c7cbaf73819e4bab04f87c5e962"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e9c1ff387d7b7d814e9d29a531c6804acc67b1cca578c09abd3590fa7ec6bf06"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-win32.whl", hash = "sha256:7770efcbc6915dabbb31ea0bdeee1105dabf76e1c8e31a454cb1983dcf19ecf1"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-win_amd64.whl", hash = "sha256:9e89a9c88317ad237abfb374c410e1466476ffefe6c44f3caeca3dce747a635c"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cb75cd29c132bfaf03a11a6ac4f459dddb7a6526669543de57d2bb5fddf78def"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d116c56e7fc3b59b3afa6078163b5f6ff4680ebf27800dd4032de7a04f7ef777"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9df330ef9e24b6f94e6764d23180350c2fb99785257233ee4738e066b876fa7f"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7a46639038313f64eca2dc858ac4cd9e0aca5ea21bb005f5d754aadd6446ba4b"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-win32.whl", hash = "sha256:d0d983b269b657744058b5858afc3c59443db53afe9c3e709e316daa9f9b9454"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1446df58169c166a5a2d5644ba9eeb3b7f2f679f260596f78d012c58ff140d92"}, + {file = "dependency_injector-4.38.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:307396f2d9d2f532fe92079a56d40af5fc60dacb1d766e3f9cd04c3802a1c251"}, + {file = "dependency_injector-4.38.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dd96b6c454ab86648f57f37b895c1c976b1a82b76f835011f607ee8a78ebc0e"}, + {file = "dependency_injector-4.38.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fb44b17e649cabcfd1f370ecfd492ac7a93216776d91954b31598eecb36cdb13"}, + {file = "dependency_injector-4.38.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ab8ebe728dd9b3be23c40ca5a5dbe195050d9ad35d42d7e9fdaea816f7134584"}, + {file = "dependency_injector-4.38.0-cp38-cp38-win32.whl", hash = "sha256:1da3bad1452212bab76e87fbf7a71d3675190a1a909f345aaf8bae2fa97b878f"}, + {file = "dependency_injector-4.38.0-cp38-cp38-win_amd64.whl", hash = "sha256:2918776e88de88be0e2be036261180ca0605c8f64ead43d835ce852f16a9efd2"}, + {file = "dependency_injector-4.38.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:493be62561218624380d4eca9243a46753444f677217db6292a7b715cf429172"}, + {file = "dependency_injector-4.38.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a70511db88f84ac4228b27e37e12ea0e04a9c2a32cae3602b9af9a27c0db992"}, + {file = "dependency_injector-4.38.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e3e1cfe41a5ada0ff71889563441f538caff0399e41d3ee377b60fa50a858bf"}, + {file = "dependency_injector-4.38.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:116cc679a2c6d40c6a4f968aefe68535e596e88e96315dbd0d0ad2ff76654e3d"}, + {file = "dependency_injector-4.38.0-cp39-cp39-win32.whl", hash = "sha256:f703c2c161de067ba9893b56743d24fb4c9dbff92eb504bc082c2d2cfeab4c01"}, + {file = "dependency_injector-4.38.0-cp39-cp39-win_amd64.whl", hash = "sha256:6821a864d6405dc0d5f794ac1b10da4a8c7e8731c6a0651a9682a0b76f5a5b3e"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6c9e8dc91aa5831bd3a58fec1b94ed8c52f78f601f5ab91135b5ad44325beef7"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b4eedadef0c84295b70803a79a3ce5a10a59dddd8f306876f6fa6bfc4de8e00"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2e88b5d09c80e20d6b3d985cc360f39a81e748667c20f6bc7eee9f4b832176ed"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b1fcd71ff46e097f4e47917ccdf6aa388b6a6372557f7d9f83db1e879e95f8bb"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:9633d6366282e83a3f21543c5c78299787948333d9fe6649b020cfac93d8b7ca"}, ] distlib = [ {file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"}, diff --git a/packages/core/minos-microservice-common/pyproject.toml b/packages/core/minos-microservice-common/pyproject.toml index 60ef02bbb..47b0e67f1 100644 --- a/packages/core/minos-microservice-common/pyproject.toml +++ b/packages/core/minos-microservice-common/pyproject.toml @@ -1,14 +1,14 @@ [tool.poetry] name = "minos-microservice-common" -version = "0.4.0" -description = "Python Package with common Classes and Utilities used in Minos Microservices." +version = "0.5.0" +description = "The common core of the Minos Framework" readme = "README.md" repository = "https://github.com/minos-framework/minos-python" homepage = "http://www.minos.run/" authors = ["Minos Framework Devs "] license = "MIT" classifiers = [ - "Development Status :: 2 - Pre-Alpha", + "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Natural Language :: English", "Programming Language :: Python :: 3", @@ -41,7 +41,7 @@ dependency-injector = "^4.32.2" cached-property = "^1.5.2" [tool.poetry.dev-dependencies] -black = "^21.12b0" +black = "^22.1" isort = "^5.8.0" pytest = "^6.2.4" coverage = "^6.3" diff --git a/packages/core/minos-microservice-cqrs/.pre-commit-config.yaml b/packages/core/minos-microservice-cqrs/.pre-commit-config.yaml deleted file mode 100644 index c8808ff4e..000000000 --- a/packages/core/minos-microservice-cqrs/.pre-commit-config.yaml +++ /dev/null @@ -1,38 +0,0 @@ -repos: - - repo: local - hooks: - - id: install - pass_filenames: false - name: Install dependencies - entry: make install - language: system - - - id: reformat - pass_filenames: false - name: Reformat package - entry: make reformat - language: system - - - id: lint - pass_filenames: false - name: Lint package - entry: make lint - language: system - - - id: test - pass_filenames: false - name: Test package - entry: make test - language: system - - - id: docs - pass_filenames: false - name: Generate documentation - entry: make docs - language: system - - - id: build - pass_filenames: false - entry: make dist - name: Generate build - language: system diff --git a/packages/core/minos-microservice-cqrs/HISTORY.md b/packages/core/minos-microservice-cqrs/HISTORY.md index 7707bd8f0..929911aaf 100644 --- a/packages/core/minos-microservice-cqrs/HISTORY.md +++ b/packages/core/minos-microservice-cqrs/HISTORY.md @@ -56,3 +56,11 @@ * 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) + +* Update `README.md`. + +# 0.5.0 (2022-02-03) + +* Minor changes. \ No newline at end of file diff --git a/packages/core/minos-microservice-cqrs/Makefile b/packages/core/minos-microservice-cqrs/Makefile index 9b3b57da2..854bc90bc 100644 --- a/packages/core/minos-microservice-cqrs/Makefile +++ b/packages/core/minos-microservice-cqrs/Makefile @@ -32,3 +32,11 @@ install: update: poetry update + +check: + $(MAKE) install + $(MAKE) reformat + $(MAKE) lint + $(MAKE) test + $(MAKE) docs + $(MAKE) dist diff --git a/packages/core/minos-microservice-cqrs/README.md b/packages/core/minos-microservice-cqrs/README.md index b1323fe95..e14b9b739 100644 --- a/packages/core/minos-microservice-cqrs/README.md +++ b/packages/core/minos-microservice-cqrs/README.md @@ -1,7 +1,16 @@ -# Minos Microservice CQRS +

+ Minos logo +

-[![codecov](https://codecov.io/gh/Clariteia/minos_microservice_cqrs/branch/main/graph/badge.svg)](https://codecov.io/gh/Clariteia/minos_microservice_cqrs) -![Tests](https://github.com/Clariteia/minos_microservice_cqrs/actions/workflows/python-tests.yml/badge.svg) +## minos-microservice-cqrs + +[![PyPI Latest Release](https://img.shields.io/pypi/v/minos-microservice-cqrs.svg)](https://pypi.org/project/minos-microservice-cqrs/) +[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/minos-framework/minos-python/pages%20build%20and%20deployment?label=docs)](https://minos-framework.github.io/minos-python) +[![License](https://img.shields.io/github/license/minos-framework/minos-python.svg)](https://github.com/minos-framework/minos-python/blob/main/LICENSE) +[![Coverage](https://codecov.io/github/minos-framework/minos-python/coverage.svg?branch=main)](https://codecov.io/gh/minos-framework/minos-python) +[![Stack Overflow](https://img.shields.io/badge/Stack%20Overflow-Ask%20a%20question-green)](https://stackoverflow.com/questions/tagged/minos) + +## Summary Minos is a framework which helps you create [reactive](https://www.reactivemanifesto.org/) microservices in Python. Internally, it leverages Event Sourcing, CQRS and a message driven architecture to fulfil the commitments of an @@ -9,76 +18,19 @@ asynchronous environment. ## Documentation -The official documentation as well as the API you can find it under https://clariteia.github.io/minos_microservice_cqrs/. -Please, submit any issue regarding documentation as well! - -## Set up a development environment - -Minos uses `poetry` as its default package manager. Please refer to the -[Poetry installation guide](https://python-poetry.org/docs/#installation) for instructions on how to install it. - -Now you con install all the dependencies by running -```bash -make install -``` - -In order to make the pre-commits checks available to git, run -```bash -pre-commit install -``` - -Make yourself sure you are able to run the tests. Refer to the appropriate section in this guide. - -## Run the tests - -In order to run the tests, please make sure you have the [Docker Engine](https://docs.docker.com/engine/install/) -and [Docker Compose](https://docs.docker.com/compose/install/) installed. - -Move into `tests/` directory - -```bash -cd tests/ -``` -Run service dependencies: - -```bash -docker-compose up -d -``` - -Install library dependencies: - -```bash -make install -``` - -Run tests: - -```bash -make test -``` - -## 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. - -Please consider these guidelines before you submit any modification. +The official API Reference is publicly available at the [GitHub Pages](https://minos-framework.github.io/minos-python). -### Create an issue +## Source Code -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. +The source code of this project is hosted at the [GitHub Repository](https://github.com/minos-framework/minos-python). -### Submit a Pull Request +## Getting Help -1. Create an issue following the previous steps. -2. Fork the project. -3. Push your changes to a local branch. -4. Run the tests! -5. Submit a pull request from your fork's branch. +For usage questions, the best place to go to is [StackOverflow](https://stackoverflow.com/questions/tagged/minos). -## Credits +## 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. -This package was created with ![Cookiecutter](https://github.com/audreyr/cookiecutter) and the ![Minos Package](https://github.com/Clariteia/minos-pypackage) project template. +## License +This project is distributed under the [MIT](https://raw.githubusercontent.com/minos-framework/minos-python/main/LICENSE) license. diff --git a/packages/core/minos-microservice-cqrs/minos/cqrs/__init__.py b/packages/core/minos-microservice-cqrs/minos/cqrs/__init__.py index 66d93ace3..be82395ea 100644 --- a/packages/core/minos-microservice-cqrs/minos/cqrs/__init__.py +++ b/packages/core/minos-microservice-cqrs/minos/cqrs/__init__.py @@ -1,6 +1,6 @@ __author__ = "Minos Framework Devs" __email__ = "hey@minos.run" -__version__ = "0.4.0" +__version__ = "0.5.0" from .exceptions import ( MinosCqrsException, diff --git a/packages/core/minos-microservice-cqrs/minos/cqrs/handlers.py b/packages/core/minos-microservice-cqrs/minos/cqrs/handlers.py index 93d3c7ab5..300d9c042 100644 --- a/packages/core/minos-microservice-cqrs/minos/cqrs/handlers.py +++ b/packages/core/minos-microservice-cqrs/minos/cqrs/handlers.py @@ -8,8 +8,8 @@ ) from minos.aggregate import ( - AggregateDiff, - ModelRefResolver, + Event, + RefResolver, ) logger = logging.getLogger(__name__) @@ -20,18 +20,18 @@ class PreEventHandler: @classmethod async def handle(cls, diff: T, resolve_references: bool = True, **kwargs) -> T: - """Handle ModelRef resolution for Events. + """Handle Ref resolution for Events. - :param diff: The instance containing ``ModelRef`` instances. + :param diff: The instance containing ``Ref`` instances. :param resolve_references: If ``True`` the resolution is performed, otherwise it is skipped. :param kwargs: Additional named arguments. - :return: The original instance with the ``ModelRef`` references already resolved. + :return: The original instance with the ``Ref`` references already resolved. """ - if not isinstance(diff, AggregateDiff) or not resolve_references: + if not isinstance(diff, Event) or not resolve_references: return diff try: - return await ModelRefResolver(**kwargs).resolve(diff) + return await RefResolver(**kwargs).resolve(diff) except Exception as exc: logger.warning(f"An exception was raised while trying to resolve model references: {exc!r}") return diff diff --git a/packages/core/minos-microservice-cqrs/minos/cqrs/services.py b/packages/core/minos-microservice-cqrs/minos/cqrs/services.py index 46c229838..267d85f85 100644 --- a/packages/core/minos-microservice-cqrs/minos/cqrs/services.py +++ b/packages/core/minos-microservice-cqrs/minos/cqrs/services.py @@ -26,6 +26,7 @@ ) from minos.networks import ( EnrouteDecorator, + HandlerWrapper, Request, WrappedRequest, ) @@ -59,9 +60,9 @@ def __getattr__(self, item: str) -> Any: def __get_enroute__(cls, config: MinosConfig) -> dict[str, set[EnrouteDecorator]]: result = dict() for name, fn in getmembers(cls, predicate=lambda x: ismethod(x) or isfunction(x)): - if not hasattr(fn, "__decorators__"): + if not isinstance(fn, HandlerWrapper): continue - result[name] = fn.__decorators__ + result[name] = fn.meta.decorators return result @staticmethod diff --git a/packages/core/minos-microservice-cqrs/poetry.lock b/packages/core/minos-microservice-cqrs/poetry.lock index 208d8c7a9..99bafd38c 100644 --- a/packages/core/minos-microservice-cqrs/poetry.lock +++ b/packages/core/minos-microservice-cqrs/poetry.lock @@ -130,28 +130,24 @@ pytz = ">=2015.7" [[package]] name = "black" -version = "21.12b0" +version = "22.1.0" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.6.2" [package.dependencies] -click = ">=7.1.2" +click = ">=8.0.0" mypy-extensions = ">=0.4.3" -pathspec = ">=0.9.0,<1" +pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = ">=0.2.6,<2.0.0" -typing-extensions = [ - {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}, - {version = "!=3.10.0.1", markers = "python_version >= \"3.10\""}, -] +tomli = ">=1.1.0" +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)"] -python2 = ["typed-ast (>=1.4.3)"] uvloop = ["uvloop (>=0.15.2)"] [[package]] @@ -243,7 +239,7 @@ python-versions = "*" [[package]] name = "dependency-injector" -version = "4.37.0" +version = "4.38.0" description = "Dependency injection framework for Python" category = "main" optional = false @@ -449,7 +445,7 @@ python-versions = "*" [[package]] name = "minos-microservice-aggregate" -version = "0.4.0" +version = "0.4.1" description = "Python Package for Minos Microservices containing all the Aggregate stuff" category = "main" optional = false @@ -466,7 +462,7 @@ url = "../minos-microservice-aggregate" [[package]] name = "minos-microservice-common" -version = "0.4.0" +version = "0.4.1" description = "Python Package with common Classes and Utilities used in Minos Microservices." category = "main" optional = false @@ -489,7 +485,7 @@ url = "../minos-microservice-common" [[package]] name = "minos-microservice-networks" -version = "0.4.0" +version = "0.4.1" description = "Python Package with the common network classes and utilities used in Minos Microservice." category = "main" optional = false @@ -966,7 +962,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "bec0d6c2fbf3ab06a59d617d379e59136374f00de999a130e8df511bcefc485d" +content-hash = "da5928149e0d3787d4d29665728c6e66db783900a95f01664333096a04edd9f8" [metadata.files] aiohttp = [ @@ -1099,8 +1095,29 @@ babel = [ {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, ] black = [ - {file = "black-21.12b0-py3-none-any.whl", hash = "sha256:a615e69ae185e08fdd73e4715e260e2479c861b5740057fde6e8b4e3b7dd589f"}, - {file = "black-21.12b0.tar.gz", hash = "sha256:77b80f693a569e2e527958459634f18df9b0ba2625ba4e0c2d5da5be42e6f2b3"}, + {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"}, ] cached-property = [ {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, @@ -1180,42 +1197,42 @@ crontab = [ {file = "crontab-0.23.0.tar.gz", hash = "sha256:ca79dede9c2f572bb32f38703e8fddcf3427e86edc838f2ffe7ae4b9ee2b0733"}, ] dependency-injector = [ - {file = "dependency-injector-4.37.0.tar.gz", hash = "sha256:8881c65ecc133d4b0af1cf35215a7bfab8d907e10ee1452d2dfef27cc3ca23d3"}, - {file = "dependency_injector-4.37.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6fdabe9dd14259fe14eb4c65f5bf244524a5cc43a474cb448528daeda4453573"}, - {file = "dependency_injector-4.37.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a184b71e8aa2fffd6c3d3828c2db045a14c3bc1ac9ca7945db76b9ac93efca81"}, - {file = "dependency_injector-4.37.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0cc2cb5b85a587f9b95505391ab4f1ef02432a590807f2230f445666d0bd3984"}, - {file = "dependency_injector-4.37.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:985570539c2703c6c009077026042a05b05474e75bec585607a556c1970bdeee"}, - {file = "dependency_injector-4.37.0-cp310-cp310-win32.whl", hash = "sha256:b73bd0dd82b42950fb78baae68750ecb5c943d39cbfacea8dbee9d6df6535427"}, - {file = "dependency_injector-4.37.0-cp310-cp310-win_amd64.whl", hash = "sha256:a944c1bbbb81dbeca8c30001bc8b7e061ca52cf291bf0dd35005863484e6ea8a"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d15b6fe1be06bffecf9b5f28fd972596f1ef6b7553d884c317b6d472ca0fb040"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbf05aefcb3cd856624e2203f69a61ad54ffa0541a23a8e6d136c178b7a37153"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ededd0f6f7abe153030f3f50959abf5cb65bf7e5215a59b9333e027d6262d161"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a3c5312fa1854eb45ed78a720ac5e1e354769e55a2fb42ca142b5dd612e8f0da"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-win32.whl", hash = "sha256:6446bd95a80a487893e162eeb8aa2f3029ab47bb4641a9e5d431f3c024b459c9"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-win_amd64.whl", hash = "sha256:fb29620e8249d66e8328d30c44d2f788d773132cdb6d0d62be4f1dd4343fc748"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c9fad82e44a34c83a0b522692aace49f3149d44b3ff826197a131a27a8df51df"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bfbcaa71ea2fd3a54e46d5038e6cedbb66d7c1319ac638f935f6cbba348ffc9"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d550f4e9e81e87ae23c5086e5b3b08f2331a02e9dc7a2553ce16275ba9921817"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a5242bca4f404c4918ba00b48fa1780c42903a9ff850956e04134bfc8b423d04"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-win32.whl", hash = "sha256:59f557f1f1f7fe856759fdc59b5f2c012e4caaf05b4f848cbb1f250bdf4d8541"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c69196827505288a8f94f9d36d4b4829fb23d5a62f0898e0aa7d5ad1fce0505e"}, - {file = "dependency_injector-4.37.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7639c601288417352af3318d683e96f034ffb685de2cfb8d79a75f982c262302"}, - {file = "dependency_injector-4.37.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b607090446e697b77d36be523ed845021d2379d62fcaf152998127066b70d80"}, - {file = "dependency_injector-4.37.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c9f31a7b3806098476767531b40f8a59dac726ce7602158a6e093f9e2be46f1a"}, - {file = "dependency_injector-4.37.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:86c4e918064de9e300152233da096797c4de7bb8e33ce86a7c6a398daf760c57"}, - {file = "dependency_injector-4.37.0-cp38-cp38-win32.whl", hash = "sha256:9756873290abd53111f9a7edc055c62a7968ac67d0fc3f49e7dba5bdda5c78a3"}, - {file = "dependency_injector-4.37.0-cp38-cp38-win_amd64.whl", hash = "sha256:35ac330fc1ed6ba0751f3eaa6a6f068c4e88cb1069bbe0c10568847db00dc62d"}, - {file = "dependency_injector-4.37.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6dc75b54da62da105ea5d4541bc5f1d0d1edb1be3763d2e9e1184fd0f249f23b"}, - {file = "dependency_injector-4.37.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9f9572021c4ed1ae59d22437ba60c4d92d1a1ec1e5fee1f81ef0c58096b9ee8"}, - {file = "dependency_injector-4.37.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2c796ec1de86c5bd34ba6a96ea95409582ebc8e54d9a62f263c7c7852d593ae6"}, - {file = "dependency_injector-4.37.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b7fda0bd48b8b3d6f9e7227d872b7d0cc95b8d54f296213369867f7490e38d06"}, - {file = "dependency_injector-4.37.0-cp39-cp39-win32.whl", hash = "sha256:c80521fc43f2812fec10ab4b92e7168659e25b5b13e0e3d45da0260e959da24a"}, - {file = "dependency_injector-4.37.0-cp39-cp39-win_amd64.whl", hash = "sha256:8930da0c2a0bdc3d96863e9f9522abeeb106ee7bb5c670805e97e42838191998"}, - {file = "dependency_injector-4.37.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6001f91e67700479088763babe976354538344ca347abe2d4405f6f4bc40b803"}, - {file = "dependency_injector-4.37.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14ccce9356f161c42664b73085c7ead179186e6cb8434bf885fa64b213e32712"}, - {file = "dependency_injector-4.37.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:58be030a8b0f4a856523ce3799cecfcf686a545b79f1f897262cec43090a7fd3"}, - {file = "dependency_injector-4.37.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a3bc779fe3f1331299032c51ec66c01dfd49e1a052c7ac3ac96aef30313c2e80"}, - {file = "dependency_injector-4.37.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:7c781db928a6f02f5f373773dc1a263e1e9dfcce2a854b42c9c261db2eb0042f"}, + {file = "dependency-injector-4.38.0.tar.gz", hash = "sha256:bab4c323d822d3fc9936e8eb3c2f5553d75e9efdadac11d5b293a016e31a1477"}, + {file = "dependency_injector-4.38.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:025eb5f97021663715bff8e01feb83d5b2f66fc17ece1042a194f1aae88c0d85"}, + {file = "dependency_injector-4.38.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3c61334b196ab767eae43af207764349287d5eb0283d8ed1ab24608121aea35"}, + {file = "dependency_injector-4.38.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9bf4bfc52015e81c4f17647b7bbbe4e4549f041b3c6635b44a9ecede7594932c"}, + {file = "dependency_injector-4.38.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7aeba5882b06baf78978f33228e4c44133dada9173e330da68fbccca98520848"}, + {file = "dependency_injector-4.38.0-cp310-cp310-win32.whl", hash = "sha256:445dbf5324eee215a465d7f3b1965b05e199c31caa09e63abf0f02d982791306"}, + {file = "dependency_injector-4.38.0-cp310-cp310-win_amd64.whl", hash = "sha256:880edbcb5d810faa0623112e2e652a7bec73d20ce0708d9db998a0a40b62cbb9"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cd6f1c130462e7461a43f82fdc0d2ba25b5ef594db823dbd0e57f3d1b7c44f86"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be75905f7513886699d3ff5ed9aca233175c03808fc888da2a53b83af0a5d65"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d7f1a7d27de6295ce8b7ca69d1177817bf36c7cbaf73819e4bab04f87c5e962"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e9c1ff387d7b7d814e9d29a531c6804acc67b1cca578c09abd3590fa7ec6bf06"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-win32.whl", hash = "sha256:7770efcbc6915dabbb31ea0bdeee1105dabf76e1c8e31a454cb1983dcf19ecf1"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-win_amd64.whl", hash = "sha256:9e89a9c88317ad237abfb374c410e1466476ffefe6c44f3caeca3dce747a635c"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cb75cd29c132bfaf03a11a6ac4f459dddb7a6526669543de57d2bb5fddf78def"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d116c56e7fc3b59b3afa6078163b5f6ff4680ebf27800dd4032de7a04f7ef777"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9df330ef9e24b6f94e6764d23180350c2fb99785257233ee4738e066b876fa7f"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7a46639038313f64eca2dc858ac4cd9e0aca5ea21bb005f5d754aadd6446ba4b"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-win32.whl", hash = "sha256:d0d983b269b657744058b5858afc3c59443db53afe9c3e709e316daa9f9b9454"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1446df58169c166a5a2d5644ba9eeb3b7f2f679f260596f78d012c58ff140d92"}, + {file = "dependency_injector-4.38.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:307396f2d9d2f532fe92079a56d40af5fc60dacb1d766e3f9cd04c3802a1c251"}, + {file = "dependency_injector-4.38.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dd96b6c454ab86648f57f37b895c1c976b1a82b76f835011f607ee8a78ebc0e"}, + {file = "dependency_injector-4.38.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fb44b17e649cabcfd1f370ecfd492ac7a93216776d91954b31598eecb36cdb13"}, + {file = "dependency_injector-4.38.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ab8ebe728dd9b3be23c40ca5a5dbe195050d9ad35d42d7e9fdaea816f7134584"}, + {file = "dependency_injector-4.38.0-cp38-cp38-win32.whl", hash = "sha256:1da3bad1452212bab76e87fbf7a71d3675190a1a909f345aaf8bae2fa97b878f"}, + {file = "dependency_injector-4.38.0-cp38-cp38-win_amd64.whl", hash = "sha256:2918776e88de88be0e2be036261180ca0605c8f64ead43d835ce852f16a9efd2"}, + {file = "dependency_injector-4.38.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:493be62561218624380d4eca9243a46753444f677217db6292a7b715cf429172"}, + {file = "dependency_injector-4.38.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a70511db88f84ac4228b27e37e12ea0e04a9c2a32cae3602b9af9a27c0db992"}, + {file = "dependency_injector-4.38.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e3e1cfe41a5ada0ff71889563441f538caff0399e41d3ee377b60fa50a858bf"}, + {file = "dependency_injector-4.38.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:116cc679a2c6d40c6a4f968aefe68535e596e88e96315dbd0d0ad2ff76654e3d"}, + {file = "dependency_injector-4.38.0-cp39-cp39-win32.whl", hash = "sha256:f703c2c161de067ba9893b56743d24fb4c9dbff92eb504bc082c2d2cfeab4c01"}, + {file = "dependency_injector-4.38.0-cp39-cp39-win_amd64.whl", hash = "sha256:6821a864d6405dc0d5f794ac1b10da4a8c7e8731c6a0651a9682a0b76f5a5b3e"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6c9e8dc91aa5831bd3a58fec1b94ed8c52f78f601f5ab91135b5ad44325beef7"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b4eedadef0c84295b70803a79a3ce5a10a59dddd8f306876f6fa6bfc4de8e00"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2e88b5d09c80e20d6b3d985cc360f39a81e748667c20f6bc7eee9f4b832176ed"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b1fcd71ff46e097f4e47917ccdf6aa388b6a6372557f7d9f83db1e879e95f8bb"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:9633d6366282e83a3f21543c5c78299787948333d9fe6649b020cfac93d8b7ca"}, ] distlib = [ {file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"}, diff --git a/packages/core/minos-microservice-cqrs/pyproject.toml b/packages/core/minos-microservice-cqrs/pyproject.toml index 3c0e02dfa..c8826041a 100644 --- a/packages/core/minos-microservice-cqrs/pyproject.toml +++ b/packages/core/minos-microservice-cqrs/pyproject.toml @@ -1,14 +1,14 @@ [tool.poetry] name = "minos-microservice-cqrs" -version = "0.4.0" -description = "Minos Microservice CQRS package" +version = "0.5.0" +description = "The CQRS pattern of the Minos Framework" readme = "README.md" repository = "https://github.com/minos-framework/minos-python" homepage = "http://www.minos.run/" authors = ["Minos Framework Devs "] license = "MIT" classifiers = [ - "Development Status :: 2 - Pre-Alpha", + "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Natural Language :: English", "Programming Language :: Python :: 3", @@ -40,7 +40,7 @@ dependency-injector = "^4.34.0" 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 = "^21.12b0" +black = "^22.1" isort = "^5.8.0" pytest = "^6.2.4" coverage = "^6.3" diff --git a/packages/core/minos-microservice-cqrs/tests/test_cqrs/test_handlers.py b/packages/core/minos-microservice-cqrs/tests/test_cqrs/test_handlers.py index e0d93deae..d28a1e459 100644 --- a/packages/core/minos-microservice-cqrs/tests/test_cqrs/test_handlers.py +++ b/packages/core/minos-microservice-cqrs/tests/test_cqrs/test_handlers.py @@ -8,10 +8,10 @@ from minos.aggregate import ( Action, - AggregateDiff, + Event, FieldDiff, FieldDiffContainer, - ModelRef, + Ref, ) from minos.common import ( current_datetime, @@ -29,35 +29,35 @@ def setUp(self) -> None: self.uuid = uuid4() self.bars = [Bar(uuid4(), 1, "hello"), Bar(uuid4(), 1, "world")] self.now = current_datetime() - self.diff = AggregateDiff( + self.diff = Event( self.uuid, "Foo", 1, Action.CREATE, self.now, - FieldDiffContainer([FieldDiff("bars", list[ModelRef[Bar]], [b.uuid for b in self.bars])]), + FieldDiffContainer([FieldDiff("bars", list[Ref[Bar]], [b.uuid for b in self.bars])]), ) async def test_handle(self): - value = AggregateDiff( + value = Event( self.uuid, "Foo", 1, Action.CREATE, self.now, - FieldDiffContainer([FieldDiff("bars", list[ModelRef[Bar]], self.bars)]), + FieldDiffContainer([FieldDiff("bars", list[Ref[Bar]], self.bars)]), ) - with patch("minos.aggregate.ModelRefResolver.resolve", return_value=value): + with patch("minos.aggregate.RefResolver.resolve", return_value=value): observed = await PreEventHandler.handle(self.diff) - expected = AggregateDiff( + expected = Event( self.uuid, "Foo", 1, Action.CREATE, self.now, - FieldDiffContainer([FieldDiff("bars", list[ModelRef[Bar]], self.bars)]), + FieldDiffContainer([FieldDiff("bars", list[Ref[Bar]], self.bars)]), ) self.assertEqual(expected, observed) @@ -70,16 +70,16 @@ async def test_handle_without_resolving_references(self): self.assertEqual(self.diff, observed) async def test_handle_raises(self): - with patch("minos.aggregate.ModelRefResolver.resolve", side_effect=ValueError): + with patch("minos.aggregate.RefResolver.resolve", side_effect=ValueError): observed = await PreEventHandler.handle(self.diff) - expected = AggregateDiff( + expected = Event( self.uuid, "Foo", 1, Action.CREATE, self.now, - FieldDiffContainer([FieldDiff("bars", list[ModelRef[Bar]], [b.uuid for b in self.bars])]), + FieldDiffContainer([FieldDiff("bars", list[Ref[Bar]], [b.uuid for b in self.bars])]), ) self.assertEqual(expected, observed) diff --git a/packages/core/minos-microservice-cqrs/tests/utils.py b/packages/core/minos-microservice-cqrs/tests/utils.py index 133fafaa6..a70c6b4cf 100644 --- a/packages/core/minos-microservice-cqrs/tests/utils.py +++ b/packages/core/minos-microservice-cqrs/tests/utils.py @@ -7,9 +7,9 @@ ) from minos.aggregate import ( - Aggregate, - AggregateRef, - ModelRef, + ExternalEntity, + Ref, + RootEntity, ) from minos.cqrs import ( CommandService, @@ -45,13 +45,13 @@ async def create_foo(self, request: Request) -> Response: """For testing purpose""" -class Foo(Aggregate): +class Foo(RootEntity): """For testing purposes""" - bar: ModelRef[Bar] + bar: Ref[Bar] -class Bar(AggregateRef): +class Bar(ExternalEntity): """For testing purposes""" name: str diff --git a/packages/core/minos-microservice-networks/.pre-commit-config.yaml b/packages/core/minos-microservice-networks/.pre-commit-config.yaml deleted file mode 100644 index c8808ff4e..000000000 --- a/packages/core/minos-microservice-networks/.pre-commit-config.yaml +++ /dev/null @@ -1,38 +0,0 @@ -repos: - - repo: local - hooks: - - id: install - pass_filenames: false - name: Install dependencies - entry: make install - language: system - - - id: reformat - pass_filenames: false - name: Reformat package - entry: make reformat - language: system - - - id: lint - pass_filenames: false - name: Lint package - entry: make lint - language: system - - - id: test - pass_filenames: false - name: Test package - entry: make test - language: system - - - id: docs - pass_filenames: false - name: Generate documentation - entry: make docs - language: system - - - id: build - pass_filenames: false - entry: make dist - name: Generate build - language: system diff --git a/packages/core/minos-microservice-networks/HISTORY.md b/packages/core/minos-microservice-networks/HISTORY.md index c2a69f6a8..a9d53e401 100644 --- a/packages/core/minos-microservice-networks/HISTORY.md +++ b/packages/core/minos-microservice-networks/HISTORY.md @@ -191,3 +191,16 @@ History * Refactor `DynamicBroker` and `DynamicBrokerPool` as `BrokerClient` and `BrokerClientPool`. The new `BrokerClient` has a `send(message: BrokerMessage) -> Awaitable[None]` method for sending messages and a `receive() -> Awaitable[BrokerMessage]` to receive them. * Implement a builder pattern on `BrokerPublisher` * Be compatible with `minos-microservice-common~=0.4.0`. + +0.4.1 (2022-01-31) +------------------ + +* Update `README.md`. + + +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. \ No newline at end of file diff --git a/packages/core/minos-microservice-networks/Makefile b/packages/core/minos-microservice-networks/Makefile index 9b3b57da2..854bc90bc 100644 --- a/packages/core/minos-microservice-networks/Makefile +++ b/packages/core/minos-microservice-networks/Makefile @@ -32,3 +32,11 @@ install: update: poetry update + +check: + $(MAKE) install + $(MAKE) reformat + $(MAKE) lint + $(MAKE) test + $(MAKE) docs + $(MAKE) dist diff --git a/packages/core/minos-microservice-networks/README.md b/packages/core/minos-microservice-networks/README.md index 6078b2d48..885fbc60b 100644 --- a/packages/core/minos-microservice-networks/README.md +++ b/packages/core/minos-microservice-networks/README.md @@ -1,7 +1,16 @@ -# Minos Microservice Network +

+ Minos logo +

-[![codecov](https://codecov.io/gh/Clariteia/minos_microservice_networks/branch/main/graph/badge.svg)](https://codecov.io/gh/Clariteia/minos_microservice_networks) -![Tests](https://github.com/Clariteia/minos_microservice_networks/actions/workflows/python-tests.yml/badge.svg) +## minos-microservice-networks + +[![PyPI Latest Release](https://img.shields.io/pypi/v/minos-microservice-networks.svg)](https://pypi.org/project/minos-microservice-networks/) +[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/minos-framework/minos-python/pages%20build%20and%20deployment?label=docs)](https://minos-framework.github.io/minos-python) +[![License](https://img.shields.io/github/license/minos-framework/minos-python.svg)](https://github.com/minos-framework/minos-python/blob/main/LICENSE) +[![Coverage](https://codecov.io/github/minos-framework/minos-python/coverage.svg?branch=main)](https://codecov.io/gh/minos-framework/minos-python) +[![Stack Overflow](https://img.shields.io/badge/Stack%20Overflow-Ask%20a%20question-green)](https://stackoverflow.com/questions/tagged/minos) + +## Summary Minos is a framework which helps you create [reactive](https://www.reactivemanifesto.org/) microservices in Python. Internally, it leverages Event Sourcing, CQRS and a message driven architecture to fulfil the commitments of an @@ -9,76 +18,19 @@ asynchronous environment. ## Documentation -The official documentation as well as the API you can find it under https://clariteia.github.io/minos_microservice_networks/. -Please, submit any issue regarding documentation as well! - -## Set up a development environment - -Minos uses `poetry` as its default package manager. Please refer to the -[Poetry installation guide](https://python-poetry.org/docs/#installation) for instructions on how to install it. - -Now you con install all the dependencies by running -```bash -make install -``` - -In order to make the pre-commits checks available to git, run -```bash -pre-commit install -``` - -Make yourself sure you are able to run the tests. Refer to the appropriate section in this guide. - -## Run the tests - -In order to run the tests, please make sure you have the [Docker Engine](https://docs.docker.com/engine/install/) -and [Docker Compose](https://docs.docker.com/compose/install/) installed. - -Move into `tests/` directory - -```bash -cd tests/ -``` -Run service dependencies: - -```bash -docker-compose up -d -``` - -Install library dependencies: - -```bash -make install -``` - -Run tests: - -```bash -make test -``` - -## 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. - -Please consider these guidelines before you submit any modification. +The official API Reference is publicly available at the [GitHub Pages](https://minos-framework.github.io/minos-python). -### Create an issue +## Source Code -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. +The source code of this project is hosted at the [GitHub Repository](https://github.com/minos-framework/minos-python). -### Submit a Pull Request +## Getting Help -1. Create an issue following the previous steps. -2. Fork the project. -3. Push your changes to a local branch. -4. Run the tests! -5. Submit a pull request from your fork's branch. +For usage questions, the best place to go to is [StackOverflow](https://stackoverflow.com/questions/tagged/minos). -## Credits +## 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. -This package was created with ![Cookiecutter](https://github.com/audreyr/cookiecutter) and the ![Minos Package](https://github.com/Clariteia/minos-pypackage) project template. +## License +This project is distributed under the [MIT](https://raw.githubusercontent.com/minos-framework/minos-python/main/LICENSE) license. diff --git a/packages/core/minos-microservice-networks/minos/networks/__init__.py b/packages/core/minos-microservice-networks/minos/networks/__init__.py index 72680f135..5012c93c7 100644 --- a/packages/core/minos-microservice-networks/minos/networks/__init__.py +++ b/packages/core/minos-microservice-networks/minos/networks/__init__.py @@ -1,6 +1,6 @@ __author__ = "Minos Framework Devs" __email__ = "hey@minos.run" -__version__ = "0.4.0" +__version__ = "0.5.0" from .brokers import ( REQUEST_HEADERS_CONTEXT_VAR, @@ -32,19 +32,12 @@ InMemoryBrokerSubscriberBuilder, InMemoryBrokerSubscriberQueue, InMemoryBrokerSubscriberQueueBuilder, - InMemoryQueuedKafkaBrokerPublisher, - InMemoryQueuedKafkaBrokerSubscriberBuilder, - KafkaBrokerPublisher, - KafkaBrokerSubscriber, - KafkaBrokerSubscriberBuilder, PostgreSqlBrokerPublisherQueue, PostgreSqlBrokerPublisherQueueQueryFactory, PostgreSqlBrokerQueue, PostgreSqlBrokerSubscriberQueue, PostgreSqlBrokerSubscriberQueueBuilder, PostgreSqlBrokerSubscriberQueueQueryFactory, - PostgreSqlQueuedKafkaBrokerPublisher, - PostgreSqlQueuedKafkaBrokerSubscriberBuilder, QueuedBrokerPublisher, QueuedBrokerSubscriber, QueuedBrokerSubscriberBuilder, @@ -75,8 +68,8 @@ from .discovery import ( DiscoveryClient, DiscoveryConnector, + InMemoryDiscoveryClient, KongDiscoveryClient, - MinosDiscoveryClient, ) from .exceptions import ( MinosActionNotFoundException, 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 7adaad1e8..97931078e 100644 --- a/packages/core/minos-microservice-networks/minos/networks/brokers/__init__.py +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/__init__.py @@ -33,11 +33,8 @@ BrokerPublisherQueue, InMemoryBrokerPublisher, InMemoryBrokerPublisherQueue, - InMemoryQueuedKafkaBrokerPublisher, - KafkaBrokerPublisher, PostgreSqlBrokerPublisherQueue, PostgreSqlBrokerPublisherQueueQueryFactory, - PostgreSqlQueuedKafkaBrokerPublisher, QueuedBrokerPublisher, ) from .subscribers import ( @@ -49,13 +46,9 @@ InMemoryBrokerSubscriberBuilder, InMemoryBrokerSubscriberQueue, InMemoryBrokerSubscriberQueueBuilder, - InMemoryQueuedKafkaBrokerSubscriberBuilder, - KafkaBrokerSubscriber, - KafkaBrokerSubscriberBuilder, PostgreSqlBrokerSubscriberQueue, PostgreSqlBrokerSubscriberQueueBuilder, PostgreSqlBrokerSubscriberQueueQueryFactory, - PostgreSqlQueuedKafkaBrokerSubscriberBuilder, QueuedBrokerSubscriber, QueuedBrokerSubscriberBuilder, ) diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/collections/queues/abc.py b/packages/core/minos-microservice-networks/minos/networks/brokers/collections/queues/abc.py index 16016f26d..a91ab4422 100644 --- a/packages/core/minos-microservice-networks/minos/networks/brokers/collections/queues/abc.py +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/collections/queues/abc.py @@ -27,7 +27,7 @@ class BrokerQueue(ABC, MinosSetup): async def enqueue(self, message: BrokerMessage) -> None: """Enqueue method.""" - logger.info(f"Enqueuing {message!r} message...") + logger.debug(f"Enqueuing {message!r} message...") await self._enqueue(message) @abstractmethod @@ -45,7 +45,7 @@ async def __anext__(self) -> BrokerMessage: async def dequeue(self) -> BrokerMessage: """Dequeue method.""" message = await self._dequeue() - logger.info(f"Dequeuing {message!r} message...") + logger.debug(f"Dequeuing {message!r} message...") return message @abstractmethod diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/dispatchers/impl.py b/packages/core/minos-microservice-networks/minos/networks/brokers/dispatchers/impl.py index 91a8c68cf..9e6d3c59f 100644 --- a/packages/core/minos-microservice-networks/minos/networks/brokers/dispatchers/impl.py +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/dispatchers/impl.py @@ -14,7 +14,6 @@ isawaitable, ) from typing import ( - Any, Optional, Union, ) @@ -124,20 +123,16 @@ async def dispatch(self, message: BrokerMessage) -> None: action = self.get_action(message.topic) fn = self.get_callback(action) - data, status, headers = await fn(message) + payload = await fn(message) if message.should_reply: - reply = BrokerMessageV1( - topic=message.reply_topic, - payload=BrokerMessageV1Payload(content=data, status=status, headers=headers), - identifier=message.identifier, - ) + reply = BrokerMessageV1(topic=message.reply_topic, payload=payload, identifier=message.identifier) await self.publisher.send(reply) @staticmethod def get_callback( fn: Callable[[BrokerRequest], Union[Optional[BrokerResponse], Awaitable[Optional[BrokerResponse]]]] - ) -> Callable[[BrokerMessage], Awaitable[tuple[Any, int, dict[str, str]]]]: + ) -> Callable[[BrokerMessage], Awaitable[BrokerMessageV1Payload]]: """Get the handler function to be used by the Broker Handler. :param fn: The action function. @@ -145,7 +140,7 @@ def get_callback( """ @wraps(fn) - async def _wrapper(raw: BrokerMessage) -> tuple[Any, int, dict[str, str]]: + async def _wrapper(raw: BrokerMessage) -> BrokerMessageV1Payload: logger.info(f"Dispatching '{raw!s}'...") request = BrokerRequest(raw) @@ -157,18 +152,22 @@ async def _wrapper(raw: BrokerMessage) -> tuple[Any, int, dict[str, str]]: if isawaitable(response): response = await response if isinstance(response, Response): - response = await response.content() - return response, BrokerMessageV1Status.SUCCESS, REQUEST_HEADERS_CONTEXT_VAR.get() + content, status = await response.content(), response.status + else: + content, status = None, BrokerMessageV1Status.SUCCESS except ResponseException as exc: logger.warning(f"Raised an application exception: {exc!s}") - return repr(exc), BrokerMessageV1Status.ERROR, REQUEST_HEADERS_CONTEXT_VAR.get() + content, status = repr(exc), exc.status except Exception as exc: logger.exception(f"Raised a system exception: {exc!r}") - return repr(exc), BrokerMessageV1Status.SYSTEM_ERROR, REQUEST_HEADERS_CONTEXT_VAR.get() + content, status = repr(exc), BrokerMessageV1Status.SYSTEM_ERROR finally: + headers = REQUEST_HEADERS_CONTEXT_VAR.get() REQUEST_USER_CONTEXT_VAR.reset(user_token) REQUEST_HEADERS_CONTEXT_VAR.reset(headers_token) + return BrokerMessageV1Payload(content=content, status=status, headers=headers) + return _wrapper def get_action(self, topic: str) -> Callable[[Request], Union[Optional[Response], Awaitable[Optional[Response]]]]: 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 6e0ee6db1..50253e07f 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 @@ -1,13 +1,6 @@ from .abc import ( BrokerPublisher, ) -from .compositions import ( - InMemoryQueuedKafkaBrokerPublisher, - PostgreSqlQueuedKafkaBrokerPublisher, -) -from .kafka import ( - KafkaBrokerPublisher, -) from .memory import ( InMemoryBrokerPublisher, ) diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/publishers/abc.py b/packages/core/minos-microservice-networks/minos/networks/brokers/publishers/abc.py index 470bdd4c8..eb188745a 100644 --- a/packages/core/minos-microservice-networks/minos/networks/brokers/publishers/abc.py +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/publishers/abc.py @@ -24,7 +24,7 @@ async def send(self, message: BrokerMessage) -> None: :param message: The message to be sent. :return: This method does not return anything. """ - logger.info(f"Sending {message!r} message...") + logger.debug(f"Sending {message!r} message...") await self._send(message) @abstractmethod diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/publishers/compositions.py b/packages/core/minos-microservice-networks/minos/networks/brokers/publishers/compositions.py deleted file mode 100644 index 5d654d206..000000000 --- a/packages/core/minos-microservice-networks/minos/networks/brokers/publishers/compositions.py +++ /dev/null @@ -1,36 +0,0 @@ -from __future__ import ( - annotations, -) - -from minos.common import ( - MinosConfig, -) - -from .kafka import ( - KafkaBrokerPublisher, -) -from .queued import ( - InMemoryBrokerPublisherQueue, - PostgreSqlBrokerPublisherQueue, - QueuedBrokerPublisher, -) - - -class PostgreSqlQueuedKafkaBrokerPublisher(QueuedBrokerPublisher): - """PostgreSql Queued Kafka Broker Publisher class.""" - - @classmethod - def _from_config(cls, config: MinosConfig, **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.""" - - @classmethod - def _from_config(cls, config: MinosConfig, **kwargs) -> InMemoryQueuedKafkaBrokerPublisher: - impl = KafkaBrokerPublisher.from_config(config, **kwargs) - queue = InMemoryBrokerPublisherQueue.from_config(config, **kwargs) - return cls(impl, queue, **kwargs) 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 169d2cad0..f5282ff3b 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 @@ -2,12 +2,6 @@ BrokerSubscriber, BrokerSubscriberBuilder, ) -from .kafka import ( - InMemoryQueuedKafkaBrokerSubscriberBuilder, - KafkaBrokerSubscriber, - KafkaBrokerSubscriberBuilder, - PostgreSqlQueuedKafkaBrokerSubscriberBuilder, -) from .memory import ( InMemoryBrokerSubscriber, InMemoryBrokerSubscriberBuilder, diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/abc.py b/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/abc.py index fc483151a..1ad1fd605 100644 --- a/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/abc.py +++ b/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/abc.py @@ -58,7 +58,7 @@ async def receive(self) -> BrokerMessage: :return: A ``BrokerMessage`` instance. """ message = await self._receive() - logger.info(f"Receiving {message!r} message...") + logger.debug(f"Receiving {message!r} message...") return message @abstractmethod diff --git a/packages/core/minos-microservice-networks/minos/networks/discovery/__init__.py b/packages/core/minos-microservice-networks/minos/networks/discovery/__init__.py index 983c9ec6d..c497d9b72 100644 --- a/packages/core/minos-microservice-networks/minos/networks/discovery/__init__.py +++ b/packages/core/minos-microservice-networks/minos/networks/discovery/__init__.py @@ -1,7 +1,7 @@ from .clients import ( DiscoveryClient, + InMemoryDiscoveryClient, KongDiscoveryClient, - MinosDiscoveryClient, ) from .connectors import ( DiscoveryConnector, diff --git a/packages/core/minos-microservice-networks/minos/networks/discovery/clients/__init__.py b/packages/core/minos-microservice-networks/minos/networks/discovery/clients/__init__.py index 4f0e51270..ad4043a90 100644 --- a/packages/core/minos-microservice-networks/minos/networks/discovery/clients/__init__.py +++ b/packages/core/minos-microservice-networks/minos/networks/discovery/clients/__init__.py @@ -4,6 +4,6 @@ from .kong import ( KongDiscoveryClient, ) -from .minos import ( - MinosDiscoveryClient, +from .memory import ( + InMemoryDiscoveryClient, ) 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 59d574bfe..735fa0633 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 @@ -42,7 +42,7 @@ async def subscribe( retry_tries: int = 3, retry_delay: float = 5, ) -> None: - """Perform a subscription query. + """Subscribe to the discovery. :param host: The ip of the microservice to be subscribed. :param port: The port of the microservice to be subscribed. @@ -82,7 +82,7 @@ async def _rest_subscribe( @abstractmethod async def unsubscribe(self, name: str, retry_tries: int = 3, retry_delay: float = 5) -> None: - """Perform an unsubscribe query. + """Unsubscribe from the discovery. :param name: The name of the microservice to be unsubscribed. :param retry_tries: Number of attempts before raising a failure exception. diff --git a/packages/core/minos-microservice-networks/minos/networks/discovery/clients/memory.py b/packages/core/minos-microservice-networks/minos/networks/discovery/clients/memory.py new file mode 100644 index 000000000..763d6678b --- /dev/null +++ b/packages/core/minos-microservice-networks/minos/networks/discovery/clients/memory.py @@ -0,0 +1,37 @@ +from .abc import ( + DiscoveryClient, +) + + +class InMemoryDiscoveryClient(DiscoveryClient): + """In Memory Discovery Client class.""" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._is_subscribed = False + + @property + def is_subscribed(self) -> bool: + """Check if the client is subscribed or not. + + :return: + """ + return self._is_subscribed + + async def subscribe(self, *args, **kwargs) -> None: + """Subscribe to the discovery. + + :param args: Additional positional arguments. + :param kwargs: Additional named arguments. + :return: This method does not return anything. + """ + self._is_subscribed = True + + async def unsubscribe(self, *args, **kwargs) -> None: + """Unsubscribe from the discovery. + + :param args: Additional positional arguments. + :param kwargs: Additional named arguments. + :return: This method does not return anything. + """ + self._is_subscribed = False diff --git a/packages/core/minos-microservice-networks/minos/networks/requests/abc.py b/packages/core/minos-microservice-networks/minos/networks/requests/abc.py index 1c35bf7a9..316cd4e4c 100644 --- a/packages/core/minos-microservice-networks/minos/networks/requests/abc.py +++ b/packages/core/minos-microservice-networks/minos/networks/requests/abc.py @@ -101,10 +101,13 @@ def __repr__(self) -> str: class Response: """Response definition.""" - __slots__ = "_data" + __slots__ = "_data", "_status" - def __init__(self, data: Any = sentinel): + def __init__(self, data: Any = sentinel, *, status: int = 200): + if not isinstance(status, int): + raise ValueError(f"The status argument must be integer. Obtained: {status}") self._data = data + self._status = status # noinspection PyUnusedLocal async def content(self, **kwargs) -> Any: @@ -113,6 +116,8 @@ async def content(self, **kwargs) -> Any: :param kwargs: Additional named arguments. :return: A list of items. """ + if not self.has_content: + return None return self._data @property @@ -123,8 +128,16 @@ def has_content(self) -> bool: """ return self._data is not sentinel + @property + def status(self) -> int: + """The status code of the response. + + :return: An ``int`` value. + """ + return self._status + def __eq__(self, other: Response) -> bool: - return type(self) == type(other) and self._data == other._data + return type(self) == type(other) and self._data == other._data and self._status == other._status def __repr__(self) -> str: return f"{type(self).__name__}({self._data!r})" @@ -135,3 +148,15 @@ def __hash__(self): class ResponseException(MinosException): """Response Exception class.""" + + def __init__(self, *args, status: int = 400): + super().__init__(*args) + self._status = status + + @property + def status(self) -> int: + """The status code of the response. + + :return: An ``int`` value. + """ + return self._status diff --git a/packages/core/minos-microservice-networks/minos/networks/rest/handlers.py b/packages/core/minos-microservice-networks/minos/networks/rest/handlers.py index 54357c9ce..dc1ca7297 100644 --- a/packages/core/minos-microservice-networks/minos/networks/rest/handlers.py +++ b/packages/core/minos-microservice-networks/minos/networks/rest/handlers.py @@ -139,11 +139,15 @@ async def _wrapper(request: web.Request) -> web.Response: if not isinstance(response, RestResponse): response = RestResponse.from_response(response) - return web.Response(body=await response.content(), content_type=response.content_type) + content = await response.content() + content_type = response.content_type + status = response.status + + return web.Response(body=content, content_type=content_type, status=status) except ResponseException as exc: logger.warning(f"Raised an application exception: {exc!s}") - raise web.HTTPBadRequest(text=str(exc)) + return web.Response(text=str(exc), status=exc.status) except Exception as exc: logger.exception(f"Raised a system exception: {exc!r}") raise web.HTTPInternalServerError() diff --git a/packages/core/minos-microservice-networks/minos/networks/rest/requests.py b/packages/core/minos-microservice-networks/minos/networks/rest/requests.py index a5b030fbb..fceeb98ea 100644 --- a/packages/core/minos-microservice-networks/minos/networks/rest/requests.py +++ b/packages/core/minos-microservice-networks/minos/networks/rest/requests.py @@ -250,8 +250,8 @@ def _parse_multi_dict(raw: Iterable[str, Any]) -> dict[str, Any]: class RestResponse(Response): """Rest Response class.""" - def __init__(self, *args, content_type: str = "application/json"): - super().__init__(*args) + def __init__(self, *args, content_type: str = "application/json", **kwargs): + super().__init__(*args, **kwargs) self.content_type = content_type @classmethod diff --git a/packages/core/minos-microservice-networks/poetry.lock b/packages/core/minos-microservice-networks/poetry.lock index 8f2119eef..f38722511 100644 --- a/packages/core/minos-microservice-networks/poetry.lock +++ b/packages/core/minos-microservice-networks/poetry.lock @@ -18,20 +18,6 @@ yarl = ">=1.0,<2.0" [package.extras] speedups = ["aiodns", "brotli", "cchardet"] -[[package]] -name = "aiokafka" -version = "0.7.2" -description = "Kafka integration with asyncio." -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -kafka-python = ">=2.0.0" - -[package.extras] -snappy = ["python-snappy (>=0.5)"] - [[package]] name = "aiomisc" version = "14.4.6" @@ -130,28 +116,24 @@ pytz = ">=2015.7" [[package]] name = "black" -version = "21.12b0" +version = "22.1.0" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.6.2" [package.dependencies] -click = ">=7.1.2" +click = ">=8.0.0" mypy-extensions = ">=0.4.3" -pathspec = ">=0.9.0,<1" +pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = ">=0.2.6,<2.0.0" -typing-extensions = [ - {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}, - {version = "!=3.10.0.1", markers = "python_version >= \"3.10\""}, -] +tomli = ">=1.1.0" +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)"] -python2 = ["typed-ast (>=1.4.3)"] uvloop = ["uvloop (>=0.15.2)"] [[package]] @@ -180,7 +162,7 @@ python-versions = ">=3.6.1" [[package]] name = "charset-normalizer" -version = "2.0.10" +version = "2.0.11" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "main" optional = false @@ -224,7 +206,7 @@ development = ["black", "flake8", "mypy", "pytest", "types-colorama"] [[package]] name = "coverage" -version = "6.3" +version = "6.3.1" description = "Code coverage measurement for Python" category = "dev" optional = false @@ -243,7 +225,7 @@ python-versions = "*" [[package]] name = "dependency-injector" -version = "4.37.0" +version = "4.38.0" description = "Dependency injection framework for Python" category = "main" optional = false @@ -323,7 +305,7 @@ python-versions = ">=3.7" [[package]] name = "identify" -version = "2.4.5" +version = "2.4.7" description = "File identification library for Python" category = "dev" optional = false @@ -400,17 +382,6 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] -[[package]] -name = "kafka-python" -version = "2.0.2" -description = "Pure Python client for Apache Kafka" -category = "main" -optional = false -python-versions = "*" - -[package.extras] -crc32c = ["crc32c"] - [[package]] name = "lmdb" version = "1.3.0" @@ -449,7 +420,7 @@ python-versions = "*" [[package]] name = "minos-microservice-common" -version = "0.4.0" +version = "0.4.1" description = "Python Package with common Classes and Utilities used in Minos Microservices." category = "main" optional = false @@ -854,11 +825,11 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "tomli" -version = "1.2.3" +version = "2.0.0" description = "A lil' TOML parser" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "typing-extensions" @@ -926,7 +897,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "afc51001c22ebc77ddbc6acb5e515a4d62dfaa1a31d44f9f44ec50d4b871d403" +content-hash = "fd4692e13c90173fcc79291142fe4cd1c377296740652d8c14165897b3839c47" [metadata.files] aiohttp = [ @@ -1003,29 +974,6 @@ aiohttp = [ {file = "aiohttp-3.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:1c182cb873bc91b411e184dab7a2b664d4fea2743df0e4d57402f7f3fa644bac"}, {file = "aiohttp-3.8.1.tar.gz", hash = "sha256:fc5471e1a54de15ef71c1bc6ebe80d4dc681ea600e68bfd1cbce40427f0b7578"}, ] -aiokafka = [ - {file = "aiokafka-0.7.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b19f077e12fe23e359f7a7dca9baf8532c63f4c8149703ce4c56de372d17e26c"}, - {file = "aiokafka-0.7.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d801bb2f5a4ae726a433ae74a5d34e7e0d44128de53c9c7eea5cb4cdaaf80175"}, - {file = "aiokafka-0.7.2-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3b1f1e9ad66883ed809d737d57edfb13f1aeb9b08c6fd6b71afefce712c13dad"}, - {file = "aiokafka-0.7.2-cp36-cp36m-win32.whl", hash = "sha256:383cc7d45b47676fea60dbedee747c5c08dde5c10b1be0afc6598fb21a7891b4"}, - {file = "aiokafka-0.7.2-cp36-cp36m-win_amd64.whl", hash = "sha256:ce23baeaacf501f619967067d2c0d4c2b2b761012f9f9c8a49593e96c7550aff"}, - {file = "aiokafka-0.7.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c96824cef1a480fd2ab4bbd9e9aa737c9191211bab5f7787ef401926d5fda95d"}, - {file = "aiokafka-0.7.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:34eda0b6eb794c36f4100be772f3b120a3c00daaf342f593f32994a762aed7e8"}, - {file = "aiokafka-0.7.2-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e6e78206e5d031e6644d3a46153a146d2d2afff4cf9da9a81edb9f8714114b62"}, - {file = "aiokafka-0.7.2-cp37-cp37m-win32.whl", hash = "sha256:ebbb258840f134bad0e6ca8681a87cd292a1f4ed7253a821c16b4e9f2610a04a"}, - {file = "aiokafka-0.7.2-cp37-cp37m-win_amd64.whl", hash = "sha256:16731e8aa0fc70dc35c31041599c9a5237dd5d2c1a4d04af58f30a942191a281"}, - {file = "aiokafka-0.7.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a9b6ecb606062b3595bc5104b85b42b62621a86d179b75d708279041152f461"}, - {file = "aiokafka-0.7.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cda55f5cfb19ea7d2f55a51d320a57312f152dab3e333fa1fbfcdde7a9e25a53"}, - {file = "aiokafka-0.7.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7d56627c3250ba2359dfa90f2c8a3ab995795e0116038905b2f8a608cd1fd606"}, - {file = "aiokafka-0.7.2-cp38-cp38-win32.whl", hash = "sha256:be43d7ddd700d501a6f4c59c859baa9888c2d086b69882f542951bae41234f6a"}, - {file = "aiokafka-0.7.2-cp38-cp38-win_amd64.whl", hash = "sha256:594d2a29875f78d56251141ff95a982c5be64844dc9ae619c285f36c57a08c6e"}, - {file = "aiokafka-0.7.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5371bd663f545ced555775e7e49f39a54b243435098a9699582bb3b32884e332"}, - {file = "aiokafka-0.7.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b1958277eaa702509591c0674790a8c9aced8fef7723dafae0f9aec6d2da71a5"}, - {file = "aiokafka-0.7.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7fe02a3868236d84356d5fa7c7625ed3a27e52699477c5ee8bd5dc9b5adb592f"}, - {file = "aiokafka-0.7.2-cp39-cp39-win32.whl", hash = "sha256:a3bfe4ad7d3829a98c8391a9a28f179b47df4f66e26ea5b1c665f872b6e21809"}, - {file = "aiokafka-0.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:6116b68ca975caafd7efd338ffdaec63789e1c334af6174e20edc1d16d14e463"}, - {file = "aiokafka-0.7.2.tar.gz", hash = "sha256:a8fc41d18731d8879483aecb93ae7ebf5457f63daf4c8923ddc046792c2c3096"}, -] aiomisc = [ {file = "aiomisc-14.4.6-py3-none-any.whl", hash = "sha256:beaa248f92acce53857f459499210643274cf06b33c7eb0c9d1f35feaad0d054"}, {file = "aiomisc-14.4.6.tar.gz", hash = "sha256:a547a94908db9213fd0acde2674973b4a7a986ad82989215f73488903b65746e"}, @@ -1059,8 +1007,29 @@ babel = [ {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, ] black = [ - {file = "black-21.12b0-py3-none-any.whl", hash = "sha256:a615e69ae185e08fdd73e4715e260e2479c861b5740057fde6e8b4e3b7dd589f"}, - {file = "black-21.12b0.tar.gz", hash = "sha256:77b80f693a569e2e527958459634f18df9b0ba2625ba4e0c2d5da5be42e6f2b3"}, + {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"}, ] cached-property = [ {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, @@ -1075,8 +1044,8 @@ cfgv = [ {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, ] charset-normalizer = [ - {file = "charset-normalizer-2.0.10.tar.gz", hash = "sha256:876d180e9d7432c5d1dfd4c5d26b72f099d503e8fcc0feb7532c9289be60fcbd"}, - {file = "charset_normalizer-2.0.10-py3-none-any.whl", hash = "sha256:cb957888737fc0bbcd78e3df769addb41fd1ff8cf950dc9e7ad7793f1bf44455"}, + {file = "charset-normalizer-2.0.11.tar.gz", hash = "sha256:98398a9d69ee80548c762ba991a4728bfc3836768ed226b3945908d1a688371c"}, + {file = "charset_normalizer-2.0.11-py3-none-any.whl", hash = "sha256:2842d8f5e82a1f6aa437380934d5e1cd4fcf2003b06fed6940769c164a480a45"}, ] click = [ {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, @@ -1091,91 +1060,88 @@ colorlog = [ {file = "colorlog-6.6.0.tar.gz", hash = "sha256:344f73204009e4c83c5b6beb00b3c45dc70fcdae3c80db919e0a4171d006fde8"}, ] coverage = [ - {file = "coverage-6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e8071e7d9ba9f457fc674afc3de054450be2c9b195c470147fbbc082468d8ff7"}, - {file = "coverage-6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:86c91c511853dfda81c2cf2360502cb72783f4b7cebabef27869f00cbe1db07d"}, - {file = "coverage-6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c4ce3b647bd1792d4394f5690d9df6dc035b00bcdbc5595099c01282a59ae01"}, - {file = "coverage-6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a491e159294d756e7fc8462f98175e2d2225e4dbe062cca7d3e0d5a75ba6260"}, - {file = "coverage-6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d008e0f67ac800b0ca04d7914b8501312c8c6c00ad8c7ba17754609fae1231a"}, - {file = "coverage-6.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4578728c36de2801c1deb1c6b760d31883e62e33f33c7ba8f982e609dc95167d"}, - {file = "coverage-6.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7ee317486593193e066fc5e98ac0ce712178c21529a85c07b7cb978171f25d53"}, - {file = "coverage-6.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2bc85664b06ba42d14bb74d6ddf19d8bfc520cb660561d2d9ce5786ae72f71b5"}, - {file = "coverage-6.3-cp310-cp310-win32.whl", hash = "sha256:27a94db5dc098c25048b0aca155f5fac674f2cf1b1736c5272ba28ead2fc267e"}, - {file = "coverage-6.3-cp310-cp310-win_amd64.whl", hash = "sha256:bde4aeabc0d1b2e52c4036c54440b1ad05beeca8113f47aceb4998bb7471e2c2"}, - {file = "coverage-6.3-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:509c68c3e2015022aeda03b003dd68fa19987cdcf64e9d4edc98db41cfc45d30"}, - {file = "coverage-6.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e4ff163602c5c77e7bb4ea81ba5d3b793b4419f8acd296aae149370902cf4e92"}, - {file = "coverage-6.3-cp311-cp311-win_amd64.whl", hash = "sha256:d1675db48490e5fa0b300f6329ecb8a9a37c29b9ab64fa9c964d34111788ca2d"}, - {file = "coverage-6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7eed8459a2b81848cafb3280b39d7d49950d5f98e403677941c752e7e7ee47cb"}, - {file = "coverage-6.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b4285fde5286b946835a1a53bba3ad41ef74285ba9e8013e14b5ea93deaeafc"}, - {file = "coverage-6.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4748349734110fd32d46ff8897b561e6300d8989a494ad5a0a2e4f0ca974fc7"}, - {file = "coverage-6.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:823f9325283dc9565ba0aa2d240471a93ca8999861779b2b6c7aded45b58ee0f"}, - {file = "coverage-6.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:fff16a30fdf57b214778eff86391301c4509e327a65b877862f7c929f10a4253"}, - {file = "coverage-6.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:da1a428bdbe71f9a8c270c7baab29e9552ac9d0e0cba5e7e9a4c9ee6465d258d"}, - {file = "coverage-6.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7d82c610a2e10372e128023c5baf9ce3d270f3029fe7274ff5bc2897c68f1318"}, - {file = "coverage-6.3-cp37-cp37m-win32.whl", hash = "sha256:11e61c5548ecf74ea1f8b059730b049871f0e32b74f88bd0d670c20c819ad749"}, - {file = "coverage-6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:8e0c3525b1a182c8ffc9bca7e56b521e0c2b8b3e82f033c8e16d6d721f1b54d6"}, - {file = "coverage-6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a189036c50dcd56100746139a459f0d27540fef95b09aba03e786540b8feaa5f"}, - {file = "coverage-6.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:32168001f33025fd756884d56d01adebb34e6c8c0b3395ca8584cdcee9c7c9d2"}, - {file = "coverage-6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5d79c9af3f410a2b5acad91258b4ae179ee9c83897eb9de69151b179b0227f5"}, - {file = "coverage-6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:85c5fc9029043cf8b07f73fbb0a7ab6d3b717510c3b5642b77058ea55d7cacde"}, - {file = "coverage-6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7596aa2f2b8fa5604129cfc9a27ad9beec0a96f18078cb424d029fdd707468d"}, - {file = "coverage-6.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ce443a3e6df90d692c38762f108fc4c88314bf477689f04de76b3f252e7a351c"}, - {file = "coverage-6.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:012157499ec4f135fc36cd2177e3d1a1840af9b236cbe80e9a5ccfc83d912a69"}, - {file = "coverage-6.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0a34d313105cdd0d3644c56df2d743fe467270d6ab93b5d4a347eb9fec8924d6"}, - {file = "coverage-6.3-cp38-cp38-win32.whl", hash = "sha256:6e78b1e25e5c5695dea012be473e442f7094d066925604be20b30713dbd47f89"}, - {file = "coverage-6.3-cp38-cp38-win_amd64.whl", hash = "sha256:433b99f7b0613bdcdc0b00cc3d39ed6d756797e3b078d2c43f8a38288520aec6"}, - {file = "coverage-6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9ed3244b415725f08ca3bdf02ed681089fd95e9465099a21c8e2d9c5d6ca2606"}, - {file = "coverage-6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab4fc4b866b279740e0d917402f0e9a08683e002f43fa408e9655818ed392196"}, - {file = "coverage-6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8582e9280f8d0f38114fe95a92ae8d0790b56b099d728cc4f8a2e14b1c4a18c"}, - {file = "coverage-6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c72bb4679283c6737f452eeb9b2a0e570acaef2197ad255fb20162adc80bea76"}, - {file = "coverage-6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca29c352389ea27a24c79acd117abdd8a865c6eb01576b6f0990cd9a4e9c9f48"}, - {file = "coverage-6.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:152cc2624381df4e4e604e21bd8e95eb8059535f7b768c1fb8b8ae0b26f47ab0"}, - {file = "coverage-6.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:51372e24b1f7143ee2df6b45cff6a721f3abe93b1e506196f3ffa4155c2497f7"}, - {file = "coverage-6.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:72d9d186508325a456475dd05b1756f9a204c7086b07fffb227ef8cee03b1dc2"}, - {file = "coverage-6.3-cp39-cp39-win32.whl", hash = "sha256:649df3641eb351cdfd0d5533c92fc9df507b6b2bf48a7ef8c71ab63cbc7b5c3c"}, - {file = "coverage-6.3-cp39-cp39-win_amd64.whl", hash = "sha256:e67ccd53da5958ea1ec833a160b96357f90859c220a00150de011b787c27b98d"}, - {file = "coverage-6.3-pp36.pp37.pp38-none-any.whl", hash = "sha256:27ac7cb84538e278e07569ceaaa6f807a029dc194b1c819a9820b9bb5dbf63ab"}, - {file = "coverage-6.3.tar.gz", hash = "sha256:987a84ff98a309994ca77ed3cc4b92424f824278e48e4bf7d1bb79a63cfe2099"}, + {file = "coverage-6.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeffd96882d8c06d31b65dddcf51db7c612547babc1c4c5db6a011abe9798525"}, + {file = "coverage-6.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:621f6ea7260ea2ffdaec64fe5cb521669984f567b66f62f81445221d4754df4c"}, + {file = "coverage-6.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84f2436d6742c01136dd940ee158bfc7cf5ced3da7e4c949662b8703b5cd8145"}, + {file = "coverage-6.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de73fca6fb403dd72d4da517cfc49fcf791f74eee697d3219f6be29adf5af6ce"}, + {file = "coverage-6.3.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78fbb2be068a13a5d99dce9e1e7d168db880870f7bc73f876152130575bd6167"}, + {file = "coverage-6.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f5a4551dfd09c3bd12fca8144d47fe7745275adf3229b7223c2f9e29a975ebda"}, + {file = "coverage-6.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7bff3a98f63b47464480de1b5bdd80c8fade0ba2832c9381253c9b74c4153c27"}, + {file = "coverage-6.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a06c358f4aed05fa1099c39decc8022261bb07dfadc127c08cfbd1391b09689e"}, + {file = "coverage-6.3.1-cp310-cp310-win32.whl", hash = "sha256:9fff3ff052922cb99f9e52f63f985d4f7a54f6b94287463bc66b7cdf3eb41217"}, + {file = "coverage-6.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:276b13cc085474e482566c477c25ed66a097b44c6e77132f3304ac0b039f83eb"}, + {file = "coverage-6.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:56c4a409381ddd7bbff134e9756077860d4e8a583d310a6f38a2315b9ce301d0"}, + {file = "coverage-6.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9eb494070aa060ceba6e4bbf44c1bc5fa97bfb883a0d9b0c9049415f9e944793"}, + {file = "coverage-6.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e15d424b8153756b7c903bde6d4610be0c3daca3986173c18dd5c1a1625e4cd"}, + {file = "coverage-6.3.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61d47a897c1e91f33f177c21de897267b38fbb45f2cd8e22a710bcef1df09ac1"}, + {file = "coverage-6.3.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:25e73d4c81efa8ea3785274a2f7f3bfbbeccb6fcba2a0bdd3be9223371c37554"}, + {file = "coverage-6.3.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:fac0bcc5b7e8169bffa87f0dcc24435446d329cbc2b5486d155c2e0f3b493ae1"}, + {file = "coverage-6.3.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:72128176fea72012063200b7b395ed8a57849282b207321124d7ff14e26988e8"}, + {file = "coverage-6.3.1-cp37-cp37m-win32.whl", hash = "sha256:1bc6d709939ff262fd1432f03f080c5042dc6508b6e0d3d20e61dd045456a1a0"}, + {file = "coverage-6.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:618eeba986cea7f621d8607ee378ecc8c2504b98b3fdc4952b30fe3578304687"}, + {file = "coverage-6.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d5ed164af5c9078596cfc40b078c3b337911190d3faeac830c3f1274f26b8320"}, + {file = "coverage-6.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:352c68e233409c31048a3725c446a9e48bbff36e39db92774d4f2380d630d8f8"}, + {file = "coverage-6.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:448d7bde7ceb6c69e08474c2ddbc5b4cd13c9e4aa4a717467f716b5fc938a734"}, + {file = "coverage-6.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9fde6b90889522c220dd56a670102ceef24955d994ff7af2cb786b4ba8fe11e4"}, + {file = "coverage-6.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e647a0be741edbb529a72644e999acb09f2ad60465f80757da183528941ff975"}, + {file = "coverage-6.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a5cdc3adb4f8bb8d8f5e64c2e9e282bc12980ef055ec6da59db562ee9bdfefa"}, + {file = "coverage-6.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2dd70a167843b4b4b2630c0c56f1b586fe965b4f8ac5da05b6690344fd065c6b"}, + {file = "coverage-6.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9ad0a117b8dc2061ce9461ea4c1b4799e55edceb236522c5b8f958ce9ed8fa9a"}, + {file = "coverage-6.3.1-cp38-cp38-win32.whl", hash = "sha256:e92c7a5f7d62edff50f60a045dc9542bf939758c95b2fcd686175dd10ce0ed10"}, + {file = "coverage-6.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:482fb42eea6164894ff82abbcf33d526362de5d1a7ed25af7ecbdddd28fc124f"}, + {file = "coverage-6.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c5b81fb37db76ebea79aa963b76d96ff854e7662921ce742293463635a87a78d"}, + {file = "coverage-6.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a4f923b9ab265136e57cc14794a15b9dcea07a9c578609cd5dbbfff28a0d15e6"}, + {file = "coverage-6.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56d296cbc8254a7dffdd7bcc2eb70be5a233aae7c01856d2d936f5ac4e8ac1f1"}, + {file = "coverage-6.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1245ab82e8554fa88c4b2ab1e098ae051faac5af829efdcf2ce6b34dccd5567c"}, + {file = "coverage-6.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f2b05757c92ad96b33dbf8e8ec8d4ccb9af6ae3c9e9bd141c7cc44d20c6bcba"}, + {file = "coverage-6.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9e3dd806f34de38d4c01416344e98eab2437ac450b3ae39c62a0ede2f8b5e4ed"}, + {file = "coverage-6.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d651fde74a4d3122e5562705824507e2f5b2d3d57557f1916c4b27635f8fbe3f"}, + {file = "coverage-6.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:704f89b87c4f4737da2860695a18c852b78ec7279b24eedacab10b29067d3a38"}, + {file = "coverage-6.3.1-cp39-cp39-win32.whl", hash = "sha256:2aed4761809640f02e44e16b8b32c1a5dee5e80ea30a0ff0912158bde9c501f2"}, + {file = "coverage-6.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:9976fb0a5709988778ac9bc44f3d50fccd989987876dfd7716dee28beed0a9fa"}, + {file = "coverage-6.3.1-pp36.pp37.pp38-none-any.whl", hash = "sha256:463e52616ea687fd323888e86bf25e864a3cc6335a043fad6bbb037dbf49bbe2"}, + {file = "coverage-6.3.1.tar.gz", hash = "sha256:6c3f6158b02ac403868eea390930ae64e9a9a2a5bbfafefbb920d29258d9f2f8"}, ] crontab = [ {file = "crontab-0.23.0.tar.gz", hash = "sha256:ca79dede9c2f572bb32f38703e8fddcf3427e86edc838f2ffe7ae4b9ee2b0733"}, ] dependency-injector = [ - {file = "dependency-injector-4.37.0.tar.gz", hash = "sha256:8881c65ecc133d4b0af1cf35215a7bfab8d907e10ee1452d2dfef27cc3ca23d3"}, - {file = "dependency_injector-4.37.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6fdabe9dd14259fe14eb4c65f5bf244524a5cc43a474cb448528daeda4453573"}, - {file = "dependency_injector-4.37.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a184b71e8aa2fffd6c3d3828c2db045a14c3bc1ac9ca7945db76b9ac93efca81"}, - {file = "dependency_injector-4.37.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0cc2cb5b85a587f9b95505391ab4f1ef02432a590807f2230f445666d0bd3984"}, - {file = "dependency_injector-4.37.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:985570539c2703c6c009077026042a05b05474e75bec585607a556c1970bdeee"}, - {file = "dependency_injector-4.37.0-cp310-cp310-win32.whl", hash = "sha256:b73bd0dd82b42950fb78baae68750ecb5c943d39cbfacea8dbee9d6df6535427"}, - {file = "dependency_injector-4.37.0-cp310-cp310-win_amd64.whl", hash = "sha256:a944c1bbbb81dbeca8c30001bc8b7e061ca52cf291bf0dd35005863484e6ea8a"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d15b6fe1be06bffecf9b5f28fd972596f1ef6b7553d884c317b6d472ca0fb040"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbf05aefcb3cd856624e2203f69a61ad54ffa0541a23a8e6d136c178b7a37153"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ededd0f6f7abe153030f3f50959abf5cb65bf7e5215a59b9333e027d6262d161"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a3c5312fa1854eb45ed78a720ac5e1e354769e55a2fb42ca142b5dd612e8f0da"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-win32.whl", hash = "sha256:6446bd95a80a487893e162eeb8aa2f3029ab47bb4641a9e5d431f3c024b459c9"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-win_amd64.whl", hash = "sha256:fb29620e8249d66e8328d30c44d2f788d773132cdb6d0d62be4f1dd4343fc748"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c9fad82e44a34c83a0b522692aace49f3149d44b3ff826197a131a27a8df51df"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bfbcaa71ea2fd3a54e46d5038e6cedbb66d7c1319ac638f935f6cbba348ffc9"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d550f4e9e81e87ae23c5086e5b3b08f2331a02e9dc7a2553ce16275ba9921817"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a5242bca4f404c4918ba00b48fa1780c42903a9ff850956e04134bfc8b423d04"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-win32.whl", hash = "sha256:59f557f1f1f7fe856759fdc59b5f2c012e4caaf05b4f848cbb1f250bdf4d8541"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c69196827505288a8f94f9d36d4b4829fb23d5a62f0898e0aa7d5ad1fce0505e"}, - {file = "dependency_injector-4.37.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7639c601288417352af3318d683e96f034ffb685de2cfb8d79a75f982c262302"}, - {file = "dependency_injector-4.37.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b607090446e697b77d36be523ed845021d2379d62fcaf152998127066b70d80"}, - {file = "dependency_injector-4.37.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c9f31a7b3806098476767531b40f8a59dac726ce7602158a6e093f9e2be46f1a"}, - {file = "dependency_injector-4.37.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:86c4e918064de9e300152233da096797c4de7bb8e33ce86a7c6a398daf760c57"}, - {file = "dependency_injector-4.37.0-cp38-cp38-win32.whl", hash = "sha256:9756873290abd53111f9a7edc055c62a7968ac67d0fc3f49e7dba5bdda5c78a3"}, - {file = "dependency_injector-4.37.0-cp38-cp38-win_amd64.whl", hash = "sha256:35ac330fc1ed6ba0751f3eaa6a6f068c4e88cb1069bbe0c10568847db00dc62d"}, - {file = "dependency_injector-4.37.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6dc75b54da62da105ea5d4541bc5f1d0d1edb1be3763d2e9e1184fd0f249f23b"}, - {file = "dependency_injector-4.37.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9f9572021c4ed1ae59d22437ba60c4d92d1a1ec1e5fee1f81ef0c58096b9ee8"}, - {file = "dependency_injector-4.37.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2c796ec1de86c5bd34ba6a96ea95409582ebc8e54d9a62f263c7c7852d593ae6"}, - {file = "dependency_injector-4.37.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b7fda0bd48b8b3d6f9e7227d872b7d0cc95b8d54f296213369867f7490e38d06"}, - {file = "dependency_injector-4.37.0-cp39-cp39-win32.whl", hash = "sha256:c80521fc43f2812fec10ab4b92e7168659e25b5b13e0e3d45da0260e959da24a"}, - {file = "dependency_injector-4.37.0-cp39-cp39-win_amd64.whl", hash = "sha256:8930da0c2a0bdc3d96863e9f9522abeeb106ee7bb5c670805e97e42838191998"}, - {file = "dependency_injector-4.37.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6001f91e67700479088763babe976354538344ca347abe2d4405f6f4bc40b803"}, - {file = "dependency_injector-4.37.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14ccce9356f161c42664b73085c7ead179186e6cb8434bf885fa64b213e32712"}, - {file = "dependency_injector-4.37.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:58be030a8b0f4a856523ce3799cecfcf686a545b79f1f897262cec43090a7fd3"}, - {file = "dependency_injector-4.37.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a3bc779fe3f1331299032c51ec66c01dfd49e1a052c7ac3ac96aef30313c2e80"}, - {file = "dependency_injector-4.37.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:7c781db928a6f02f5f373773dc1a263e1e9dfcce2a854b42c9c261db2eb0042f"}, + {file = "dependency-injector-4.38.0.tar.gz", hash = "sha256:bab4c323d822d3fc9936e8eb3c2f5553d75e9efdadac11d5b293a016e31a1477"}, + {file = "dependency_injector-4.38.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:025eb5f97021663715bff8e01feb83d5b2f66fc17ece1042a194f1aae88c0d85"}, + {file = "dependency_injector-4.38.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3c61334b196ab767eae43af207764349287d5eb0283d8ed1ab24608121aea35"}, + {file = "dependency_injector-4.38.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9bf4bfc52015e81c4f17647b7bbbe4e4549f041b3c6635b44a9ecede7594932c"}, + {file = "dependency_injector-4.38.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7aeba5882b06baf78978f33228e4c44133dada9173e330da68fbccca98520848"}, + {file = "dependency_injector-4.38.0-cp310-cp310-win32.whl", hash = "sha256:445dbf5324eee215a465d7f3b1965b05e199c31caa09e63abf0f02d982791306"}, + {file = "dependency_injector-4.38.0-cp310-cp310-win_amd64.whl", hash = "sha256:880edbcb5d810faa0623112e2e652a7bec73d20ce0708d9db998a0a40b62cbb9"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cd6f1c130462e7461a43f82fdc0d2ba25b5ef594db823dbd0e57f3d1b7c44f86"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be75905f7513886699d3ff5ed9aca233175c03808fc888da2a53b83af0a5d65"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d7f1a7d27de6295ce8b7ca69d1177817bf36c7cbaf73819e4bab04f87c5e962"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e9c1ff387d7b7d814e9d29a531c6804acc67b1cca578c09abd3590fa7ec6bf06"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-win32.whl", hash = "sha256:7770efcbc6915dabbb31ea0bdeee1105dabf76e1c8e31a454cb1983dcf19ecf1"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-win_amd64.whl", hash = "sha256:9e89a9c88317ad237abfb374c410e1466476ffefe6c44f3caeca3dce747a635c"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cb75cd29c132bfaf03a11a6ac4f459dddb7a6526669543de57d2bb5fddf78def"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d116c56e7fc3b59b3afa6078163b5f6ff4680ebf27800dd4032de7a04f7ef777"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9df330ef9e24b6f94e6764d23180350c2fb99785257233ee4738e066b876fa7f"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7a46639038313f64eca2dc858ac4cd9e0aca5ea21bb005f5d754aadd6446ba4b"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-win32.whl", hash = "sha256:d0d983b269b657744058b5858afc3c59443db53afe9c3e709e316daa9f9b9454"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1446df58169c166a5a2d5644ba9eeb3b7f2f679f260596f78d012c58ff140d92"}, + {file = "dependency_injector-4.38.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:307396f2d9d2f532fe92079a56d40af5fc60dacb1d766e3f9cd04c3802a1c251"}, + {file = "dependency_injector-4.38.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dd96b6c454ab86648f57f37b895c1c976b1a82b76f835011f607ee8a78ebc0e"}, + {file = "dependency_injector-4.38.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fb44b17e649cabcfd1f370ecfd492ac7a93216776d91954b31598eecb36cdb13"}, + {file = "dependency_injector-4.38.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ab8ebe728dd9b3be23c40ca5a5dbe195050d9ad35d42d7e9fdaea816f7134584"}, + {file = "dependency_injector-4.38.0-cp38-cp38-win32.whl", hash = "sha256:1da3bad1452212bab76e87fbf7a71d3675190a1a909f345aaf8bae2fa97b878f"}, + {file = "dependency_injector-4.38.0-cp38-cp38-win_amd64.whl", hash = "sha256:2918776e88de88be0e2be036261180ca0605c8f64ead43d835ce852f16a9efd2"}, + {file = "dependency_injector-4.38.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:493be62561218624380d4eca9243a46753444f677217db6292a7b715cf429172"}, + {file = "dependency_injector-4.38.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a70511db88f84ac4228b27e37e12ea0e04a9c2a32cae3602b9af9a27c0db992"}, + {file = "dependency_injector-4.38.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e3e1cfe41a5ada0ff71889563441f538caff0399e41d3ee377b60fa50a858bf"}, + {file = "dependency_injector-4.38.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:116cc679a2c6d40c6a4f968aefe68535e596e88e96315dbd0d0ad2ff76654e3d"}, + {file = "dependency_injector-4.38.0-cp39-cp39-win32.whl", hash = "sha256:f703c2c161de067ba9893b56743d24fb4c9dbff92eb504bc082c2d2cfeab4c01"}, + {file = "dependency_injector-4.38.0-cp39-cp39-win_amd64.whl", hash = "sha256:6821a864d6405dc0d5f794ac1b10da4a8c7e8731c6a0651a9682a0b76f5a5b3e"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6c9e8dc91aa5831bd3a58fec1b94ed8c52f78f601f5ab91135b5ad44325beef7"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b4eedadef0c84295b70803a79a3ce5a10a59dddd8f306876f6fa6bfc4de8e00"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2e88b5d09c80e20d6b3d985cc360f39a81e748667c20f6bc7eee9f4b832176ed"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b1fcd71ff46e097f4e47917ccdf6aa388b6a6372557f7d9f83db1e879e95f8bb"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:9633d6366282e83a3f21543c5c78299787948333d9fe6649b020cfac93d8b7ca"}, ] distlib = [ {file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"}, @@ -1273,8 +1239,8 @@ frozenlist = [ {file = "frozenlist-1.3.0.tar.gz", hash = "sha256:ce6f2ba0edb7b0c1d8976565298ad2deba6f8064d2bebb6ffce2ca896eb35b0b"}, ] identify = [ - {file = "identify-2.4.5-py2.py3-none-any.whl", hash = "sha256:d27d10099844741c277b45d809bd452db0d70a9b41ea3cd93799ebbbcc6dcb29"}, - {file = "identify-2.4.5.tar.gz", hash = "sha256:d11469ff952a4d7fd7f9be520d335dc450f585d474b39b5dfb86a500831ab6c7"}, + {file = "identify-2.4.7-py2.py3-none-any.whl", hash = "sha256:e64210654dfbca6ced33230eb1b137591a0981425e1a60b4c6c36309f787bbd5"}, + {file = "identify-2.4.7.tar.gz", hash = "sha256:8408f01e0be25492017346d7dffe7e7711b762b23375c775d24d3bc38618fabc"}, ] idna = [ {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, @@ -1300,10 +1266,6 @@ jinja2 = [ {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"}, {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"}, ] -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"}, @@ -1714,8 +1676,8 @@ toml = [ {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] tomli = [ - {file = "tomli-1.2.3-py3-none-any.whl", hash = "sha256:e3069e4be3ead9668e21cb9b074cd948f7b3113fd9c8bba083f48247aab8b11c"}, - {file = "tomli-1.2.3.tar.gz", hash = "sha256:05b6166bff487dc068d322585c7ea4ef78deed501cc124060e0f238e89a9231f"}, + {file = "tomli-2.0.0-py3-none-any.whl", hash = "sha256:b5bde28da1fed24b9bd1d4d2b8cba62300bfb4ec9a6187a957e8ddb9434c5224"}, + {file = "tomli-2.0.0.tar.gz", hash = "sha256:c292c34f58502a1eb2bbb9f5bbc9a5ebc37bee10ffb8c2d6bbdfa8eb13cc14e1"}, ] typing-extensions = [ {file = "typing_extensions-4.0.1-py3-none-any.whl", hash = "sha256:7f001e5ac290a0c0401508864c7ec868be4e701886d5b573a9528ed3973d9d3b"}, diff --git a/packages/core/minos-microservice-networks/pyproject.toml b/packages/core/minos-microservice-networks/pyproject.toml index 306f40987..31667da20 100644 --- a/packages/core/minos-microservice-networks/pyproject.toml +++ b/packages/core/minos-microservice-networks/pyproject.toml @@ -1,14 +1,14 @@ [tool.poetry] name = "minos-microservice-networks" -version = "0.4.0" -description = "Python Package with the common network classes and utilities used in Minos Microservice." +version = "0.5.0" +description = "The networks core of the Minos Framework" readme = "README.md" repository = "https://github.com/minos-framework/minos-python" homepage = "http://www.minos.run/" authors = ["Minos Framework Devs "] license = "MIT" classifiers = [ - "Development Status :: 2 - Pre-Alpha", + "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Natural Language :: English", "Programming Language :: Python :: 3", @@ -32,7 +32,6 @@ include = [ [tool.poetry.dependencies] python = "^3.9" minos-microservice-common = "^0.4.0" -aiokafka = "^0.7.0" aiomisc = "^14.0.3" aiopg = "^1.2.1" aiohttp = "^3.7.4" @@ -42,7 +41,7 @@ orjson = "^3.6.5" [tool.poetry.dev-dependencies] minos-microservice-common = { path = "../minos-microservice-common", develop = true } -black = "^21.12b0" +black = "^22.1" isort = "^5.8.0" pytest = "^6.2.4" coverage = "^6.3" diff --git a/packages/core/minos-microservice-networks/tests/docker-compose.yml b/packages/core/minos-microservice-networks/tests/docker-compose.yml index 6a38c18c8..ed51df977 100644 --- a/packages/core/minos-microservice-networks/tests/docker-compose.yml +++ b/packages/core/minos-microservice-networks/tests/docker-compose.yml @@ -6,23 +6,4 @@ services: environment: POSTGRES_USER: minos POSTGRES_PASSWORD: min0s - POSTGRES_DB: order_db - - zookeeper: - image: wurstmeister/zookeeper:latest - ports: - - "2181:2181" - - kafka: - image: wurstmeister/kafka:latest - ports: - - "9092:9092" - depends_on: - - zookeeper - environment: - KAFKA_ADVERTISED_HOST_NAME: kafka - KAFKA_ADVERTISED_PORT: 9092 - KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 - KAFKA_DELETE_TOPIC_ENABLE: "true" - volumes: - - /var/run/docker.sock:/var/run/docker.sock + POSTGRES_DB: order_db \ No newline at end of file diff --git a/packages/core/minos-microservice-networks/tests/test_config.yml b/packages/core/minos-microservice-networks/tests/test_config.yml index 167e46a0c..79786973a 100644 --- a/packages/core/minos-microservice-networks/tests/test_config.yml +++ b/packages/core/minos-microservice-networks/tests/test_config.yml @@ -34,6 +34,6 @@ saga: storage: path: "./order.lmdb" discovery: - client: minos.networks.MinosDiscoveryClient + client: minos.networks.InMemoryDiscoveryClient host: discovery-service port: 8080 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 5c157df05..01302d94b 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 @@ -41,6 +41,10 @@ class _Cls: async def _fn(request: Request) -> Response: return BrokerResponse(await request.content()) + @staticmethod + async def _fn_status(request: Request) -> Response: + return BrokerResponse(status=await request.content()) + @staticmethod async def _fn_none(request: Request): await request.content() @@ -120,20 +124,39 @@ async def test_get_action_raises(self): async def test_get_callback(self): fn = self.dispatcher.get_callback(_Cls._fn) - self.assertEqual((FakeModel("foo"), BrokerMessageV1Status.SUCCESS, self.headers), await fn(self.message)) + expected = BrokerMessageV1Payload(FakeModel("foo"), self.headers, BrokerMessageV1Status.SUCCESS) + self.assertEqual(expected, await fn(self.message)) + + async def test_get_callback_status(self): + fn = self.dispatcher.get_callback(_Cls._fn_status) + + message = BrokerMessageV1( + topic="AddOrder", + identifier=self.identifier, + reply_topic="UpdateTicket", + payload=BrokerMessageV1Payload(content=203, headers=self.headers), + ) + + # noinspection PyArgumentEqualDefault + expected = BrokerMessageV1Payload(None, self.headers, BrokerMessageV1Status.UNKNOWN) + self.assertEqual(expected, await fn(message)) async def test_get_callback_none(self): fn = self.dispatcher.get_callback(_Cls._fn_none) - self.assertEqual((None, BrokerMessageV1Status.SUCCESS, self.headers), await fn(self.message)) + # noinspection PyArgumentEqualDefault + expected = BrokerMessageV1Payload(None, self.headers, BrokerMessageV1Status.SUCCESS) + self.assertEqual(expected, await fn(self.message)) async def test_get_callback_raises_response(self): fn = self.dispatcher.get_callback(_Cls._fn_raises_response) - expected = (repr(BrokerResponseException("foo")), BrokerMessageV1Status.ERROR, self.headers) + expected = BrokerMessageV1Payload( + repr(BrokerResponseException("foo")), self.headers, BrokerMessageV1Status.ERROR + ) self.assertEqual(expected, await fn(self.message)) async def test_get_callback_raises_exception(self): fn = self.dispatcher.get_callback(_Cls._fn_raises_exception) - expected = (repr(ValueError()), BrokerMessageV1Status.SYSTEM_ERROR, self.headers) + expected = BrokerMessageV1Payload(repr(ValueError()), self.headers, BrokerMessageV1Status.SYSTEM_ERROR) self.assertEqual(expected, await fn(self.message)) async def test_get_callback_with_user(self): @@ -156,9 +179,9 @@ async def _fn(request) -> None: mock = AsyncMock(side_effect=_fn) action = self.dispatcher.get_callback(mock) - _, _, observed = await action(self.message) + payload = await action(self.message) - self.assertEqual(self.headers | {"bar": "foo"}, observed) + self.assertEqual(self.headers | {"bar": "foo"}, payload.headers) async def test_dispatch_with_response(self): callback_mock = AsyncMock(return_value=Response("add_order")) diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_publishers/test_compositions.py b/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_publishers/test_compositions.py deleted file mode 100644 index e86700ef8..000000000 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_publishers/test_compositions.py +++ /dev/null @@ -1,32 +0,0 @@ -import unittest - -from minos.networks import ( - InMemoryBrokerPublisherQueue, - InMemoryQueuedKafkaBrokerPublisher, - KafkaBrokerPublisher, - PostgreSqlBrokerPublisherQueue, - PostgreSqlQueuedKafkaBrokerPublisher, -) -from tests.utils import ( - CONFIG_FILE_PATH, -) - - -class TestPostgreSqlQueuedKafkaBrokerPublisher(unittest.IsolatedAsyncioTestCase): - def test_from_config(self): - 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): - 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/core/minos-microservice-networks/tests/test_networks/test_discovery/test_clients/test_memory.py b/packages/core/minos-microservice-networks/tests/test_networks/test_discovery/test_clients/test_memory.py new file mode 100644 index 000000000..de074487e --- /dev/null +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_discovery/test_clients/test_memory.py @@ -0,0 +1,28 @@ +import unittest + +from minos.networks import ( + InMemoryDiscoveryClient, +) + + +class TestInMemoryDiscoveryConnector(unittest.IsolatedAsyncioTestCase): + def test_init(self): + client = InMemoryDiscoveryClient("localhost", 9999) + self.assertEqual("localhost", client.host) + self.assertEqual(9999, client.port) + self.assertFalse(client.is_subscribed) + + async def test_subscribe(self): + client = InMemoryDiscoveryClient("localhost", 9999) + await client.subscribe() + self.assertTrue(client.is_subscribed) + + async def test_unsubscribe(self): + client = InMemoryDiscoveryClient("localhost", 9999) + await client.subscribe() + await client.unsubscribe() + self.assertFalse(client.is_subscribed) + + +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 86cd03f5a..79afc2833 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,7 +9,7 @@ ) from minos.networks import ( DiscoveryConnector, - MinosDiscoveryClient, + InMemoryDiscoveryClient, MinosInvalidDiscoveryClient, get_host_ip, ) @@ -18,7 +18,7 @@ ) -class TestDiscovery(unittest.IsolatedAsyncioTestCase): +class TestDiscoveryConnector(unittest.IsolatedAsyncioTestCase): CONFIG_FILE_PATH = BASE_PATH / "test_config.yml" def setUp(self) -> None: @@ -37,7 +37,7 @@ def test_config_minos_client_not_supported(self): DiscoveryConnector.from_config(config) def test_client(self): - self.assertIsInstance(self.discovery.client, MinosDiscoveryClient) + self.assertIsInstance(self.discovery.client, InMemoryDiscoveryClient) async def test_subscription(self): mock = AsyncMock() diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_requests/test_abc.py b/packages/core/minos-microservice-networks/tests/test_networks/test_requests/test_abc.py index d9802f6c8..5f04e0e08 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_requests/test_abc.py +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_requests/test_abc.py @@ -85,19 +85,29 @@ async def test_content(self): response = Response(self.data) self.assertEqual(self.data, await response.content()) - async def test_content_single(self): - response = Response(self.data[0]) - self.assertEqual(self.data[0], await response.content()) + async def test_content_empty(self): + response = Response() + self.assertEqual(None, await response.content()) - async def test_content_simple(self): - response = Response(1234) - self.assertEqual(1234, await response.content()) + def test_status_default(self): + response = Response(self.data) + self.assertEqual(200, response.status) + + def test_status(self): + response = Response(self.data, status=202) + self.assertEqual(202, response.status) + + def test_status_raises(self): + with self.assertRaises(ValueError): + # noinspection PyTypeChecker + Response(self.data, status="wrong") async def test_eq_true(self): - self.assertEqual(Response(self.data), Response(self.data)) + self.assertEqual(Response(self.data, status=202), Response(self.data, status=202)) async def test_eq_false(self): self.assertNotEqual(Response(self.data[0]), Response(self.data[1])) + self.assertNotEqual(Response(self.data[0], status=400), Response(self.data[0], status=202)) async def test_repr(self): response = Response(self.data) diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_rest/test_handlers.py b/packages/core/minos-microservice-networks/tests/test_networks/test_rest/test_handlers.py index 8a71710da..e40f04d97 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_rest/test_handlers.py +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_rest/test_handlers.py @@ -10,7 +10,6 @@ web, ) from aiohttp.web_exceptions import ( - HTTPBadRequest, HTTPInternalServerError, ) from orjson import ( @@ -42,6 +41,10 @@ class _Cls: async def _fn(request: Request) -> Response: return RestResponse(await request.content()) + @staticmethod + async def _fn_status(request: Request) -> Response: + return RestResponse(status=await request.content()) + @staticmethod async def _fn_none(request: Request): return @@ -80,6 +83,14 @@ async def test_get_callback(self): self.assertEqual(orjson.dumps({"foo": "bar"}), response.body) self.assertEqual("application/json", response.content_type) + async def test_get_callback_status(self): + handler = self.handler.get_callback(_Cls._fn_status) + response = await handler(json_mocked_request(203)) + self.assertIsInstance(response, web.Response) + self.assertEqual(None, response.body) + self.assertEqual("application/json", response.content_type) + self.assertEqual(203, response.status) + async def test_get_callback_none(self): handler = self.handler.get_callback(_Cls._fn_none) response = await handler(mocked_request()) @@ -89,8 +100,8 @@ async def test_get_callback_none(self): async def test_get_callback_raises_response(self): handler = self.handler.get_callback(_Cls._fn_raises_response) - with self.assertRaises(HTTPBadRequest): - await handler(json_mocked_request({"foo": "bar"})) + response = await handler(json_mocked_request({"foo": "bar"})) + self.assertEqual(400, response.status) async def test_get_callback_raises_exception(self): handler = self.handler.get_callback(_Cls._fn_raises_exception) diff --git a/packages/core/minos-microservice-saga/.pre-commit-config.yaml b/packages/core/minos-microservice-saga/.pre-commit-config.yaml deleted file mode 100644 index c8808ff4e..000000000 --- a/packages/core/minos-microservice-saga/.pre-commit-config.yaml +++ /dev/null @@ -1,38 +0,0 @@ -repos: - - repo: local - hooks: - - id: install - pass_filenames: false - name: Install dependencies - entry: make install - language: system - - - id: reformat - pass_filenames: false - name: Reformat package - entry: make reformat - language: system - - - id: lint - pass_filenames: false - name: Lint package - entry: make lint - language: system - - - id: test - pass_filenames: false - name: Test package - entry: make test - language: system - - - id: docs - pass_filenames: false - name: Generate documentation - entry: make docs - language: system - - - id: build - pass_filenames: false - entry: make dist - name: Generate build - language: system diff --git a/packages/core/minos-microservice-saga/HISTORY.md b/packages/core/minos-microservice-saga/HISTORY.md index 395374a29..5e96c8a00 100644 --- a/packages/core/minos-microservice-saga/HISTORY.md +++ b/packages/core/minos-microservice-saga/HISTORY.md @@ -154,3 +154,13 @@ History * 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) +------------------ + +* Update `README.md`. + +0.5.0 (2022-02-03) +------------------ + +* Minor changes. \ No newline at end of file diff --git a/packages/core/minos-microservice-saga/Makefile b/packages/core/minos-microservice-saga/Makefile index 9b3b57da2..854bc90bc 100644 --- a/packages/core/minos-microservice-saga/Makefile +++ b/packages/core/minos-microservice-saga/Makefile @@ -32,3 +32,11 @@ install: update: poetry update + +check: + $(MAKE) install + $(MAKE) reformat + $(MAKE) lint + $(MAKE) test + $(MAKE) docs + $(MAKE) dist diff --git a/packages/core/minos-microservice-saga/README.md b/packages/core/minos-microservice-saga/README.md index d49677ab4..8b270fe68 100644 --- a/packages/core/minos-microservice-saga/README.md +++ b/packages/core/minos-microservice-saga/README.md @@ -1,7 +1,16 @@ -# Minos Microservice Saga +

+ Minos logo +

-[![codecov](https://codecov.io/gh/Clariteia/minos_microservice_saga/branch/main/graph/badge.svg)](https://codecov.io/gh/Clariteia/minos_microservice_saga) -![Tests](https://github.com/Clariteia/minos_microservice_saga/actions/workflows/python-tests.yml/badge.svg) +## minos-microservice-saga + +[![PyPI Latest Release](https://img.shields.io/pypi/v/minos-microservice-saga.svg)](https://pypi.org/project/minos-microservice-saga/) +[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/minos-framework/minos-python/pages%20build%20and%20deployment?label=docs)](https://minos-framework.github.io/minos-python) +[![License](https://img.shields.io/github/license/minos-framework/minos-python.svg)](https://github.com/minos-framework/minos-python/blob/main/LICENSE) +[![Coverage](https://codecov.io/github/minos-framework/minos-python/coverage.svg?branch=main)](https://codecov.io/gh/minos-framework/minos-python) +[![Stack Overflow](https://img.shields.io/badge/Stack%20Overflow-Ask%20a%20question-green)](https://stackoverflow.com/questions/tagged/minos) + +## Summary Minos is a framework which helps you create [reactive](https://www.reactivemanifesto.org/) microservices in Python. Internally, it leverages Event Sourcing, CQRS and a message driven architecture to fulfil the commitments of an @@ -9,75 +18,19 @@ asynchronous environment. ## Documentation -The official documentation as well as the API you can find it under https://clariteia.github.io/minos_microservice_saga/. -Please, submit any issue regarding documentation as well! - -## Set up a development environment - -Minos uses `poetry` as its default package manager. Please refer to the -[Poetry installation guide](https://python-poetry.org/docs/#installation) for instructions on how to install it. - -Now you con install all the dependencies by running -```bash -make install -``` - -In order to make the pre-commits checks available to git, run -```bash -pre-commit install -``` - -Make yourself sure you are able to run the tests. Refer to the appropriate section in this guide. - -## Run the tests - -In order to run the tests, please make sure you have the [Docker Engine](https://docs.docker.com/engine/install/) -and [Docker Compose](https://docs.docker.com/compose/install/) installed. - -Move into `tests/` directory - -```bash -cd tests/ -``` -Run service dependencies: - -```bash -docker-compose up -d -``` - -Install library dependencies: - -```bash -make install -``` - -Run tests: - -```bash -make test -``` - -## 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. +The official API Reference is publicly available at the [GitHub Pages](https://minos-framework.github.io/minos-python). -Please consider these guidelines before you submit any modification. +## Source Code -### Create an issue +The source code of this project is hosted at the [GitHub Repository](https://github.com/minos-framework/minos-python). -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. +## Getting Help -### Submit a Pull Request +For usage questions, the best place to go to is [StackOverflow](https://stackoverflow.com/questions/tagged/minos). -1. Create an issue following the previous steps. -2. Fork the project. -3. Push your changes to a local branch. -4. Run the tests! -5. Submit a pull request from your fork's branch. +## 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. -## Credits +## License -This package was created with ![Cookiecutter](https://github.com/audreyr/cookiecutter) and the ![Minos Package](https://github.com/Clariteia/minos-pypackage) project template. +This project is distributed under the [MIT](https://raw.githubusercontent.com/minos-framework/minos-python/main/LICENSE) license. diff --git a/packages/core/minos-microservice-saga/minos/saga/__init__.py b/packages/core/minos-microservice-saga/minos/saga/__init__.py index 4d6f9abeb..c15d553c2 100644 --- a/packages/core/minos-microservice-saga/minos/saga/__init__.py +++ b/packages/core/minos-microservice-saga/minos/saga/__init__.py @@ -1,6 +1,6 @@ __author__ = "Minos Framework Devs" __email__ = "hey@minos.run" -__version__ = "0.4.0" +__version__ = "0.5.0" from .context import ( SagaContext, diff --git a/packages/core/minos-microservice-saga/minos/saga/definitions/steps/conditional.py b/packages/core/minos-microservice-saga/minos/saga/definitions/steps/conditional.py index fcfd86e61..be407d895 100644 --- a/packages/core/minos-microservice-saga/minos/saga/definitions/steps/conditional.py +++ b/packages/core/minos-microservice-saga/minos/saga/definitions/steps/conditional.py @@ -43,7 +43,7 @@ def __init__( self, if_then: Optional[Union[IfThenAlternative, Iterable[IfThenAlternative]]] = None, else_then: Optional[ElseThenAlternative] = None, - **kwargs + **kwargs, ): super().__init__(**kwargs) diff --git a/packages/core/minos-microservice-saga/poetry.lock b/packages/core/minos-microservice-saga/poetry.lock index 9c8b4387a..18d44e964 100644 --- a/packages/core/minos-microservice-saga/poetry.lock +++ b/packages/core/minos-microservice-saga/poetry.lock @@ -130,28 +130,24 @@ pytz = ">=2015.7" [[package]] name = "black" -version = "21.12b0" +version = "22.1.0" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.6.2" [package.dependencies] -click = ">=7.1.2" +click = ">=8.0.0" mypy-extensions = ">=0.4.3" -pathspec = ">=0.9.0,<1" +pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = ">=0.2.6,<2.0.0" -typing-extensions = [ - {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}, - {version = "!=3.10.0.1", markers = "python_version >= \"3.10\""}, -] +tomli = ">=1.1.0" +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)"] -python2 = ["typed-ast (>=1.4.3)"] uvloop = ["uvloop (>=0.15.2)"] [[package]] @@ -243,7 +239,7 @@ python-versions = "*" [[package]] name = "dependency-injector" -version = "4.37.0" +version = "4.38.0" description = "Dependency injection framework for Python" category = "main" optional = false @@ -449,7 +445,7 @@ python-versions = "*" [[package]] name = "minos-microservice-aggregate" -version = "0.4.0" +version = "0.4.1" description = "Python Package for Minos Microservices containing all the Aggregate stuff" category = "main" optional = false @@ -466,7 +462,7 @@ url = "../minos-microservice-aggregate" [[package]] name = "minos-microservice-common" -version = "0.4.0" +version = "0.4.1" description = "Python Package with common Classes and Utilities used in Minos Microservices." category = "main" optional = false @@ -489,7 +485,7 @@ url = "../minos-microservice-common" [[package]] name = "minos-microservice-networks" -version = "0.4.0" +version = "0.4.1" description = "Python Package with the common network classes and utilities used in Minos Microservice." category = "main" optional = false @@ -966,7 +962,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "6eaba9a492ff4414d90f5ef97dfb85311388390cd2b4ed6a63c033058f1dccd2" +content-hash = "52ac994b2aac1c6bcdd88dcc2592190dcb9e03126627e5d5c7fa0743f29c19b8" [metadata.files] aiohttp = [ @@ -1099,8 +1095,29 @@ babel = [ {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, ] black = [ - {file = "black-21.12b0-py3-none-any.whl", hash = "sha256:a615e69ae185e08fdd73e4715e260e2479c861b5740057fde6e8b4e3b7dd589f"}, - {file = "black-21.12b0.tar.gz", hash = "sha256:77b80f693a569e2e527958459634f18df9b0ba2625ba4e0c2d5da5be42e6f2b3"}, + {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"}, ] cached-property = [ {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, @@ -1180,42 +1197,42 @@ crontab = [ {file = "crontab-0.23.0.tar.gz", hash = "sha256:ca79dede9c2f572bb32f38703e8fddcf3427e86edc838f2ffe7ae4b9ee2b0733"}, ] dependency-injector = [ - {file = "dependency-injector-4.37.0.tar.gz", hash = "sha256:8881c65ecc133d4b0af1cf35215a7bfab8d907e10ee1452d2dfef27cc3ca23d3"}, - {file = "dependency_injector-4.37.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6fdabe9dd14259fe14eb4c65f5bf244524a5cc43a474cb448528daeda4453573"}, - {file = "dependency_injector-4.37.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a184b71e8aa2fffd6c3d3828c2db045a14c3bc1ac9ca7945db76b9ac93efca81"}, - {file = "dependency_injector-4.37.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0cc2cb5b85a587f9b95505391ab4f1ef02432a590807f2230f445666d0bd3984"}, - {file = "dependency_injector-4.37.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:985570539c2703c6c009077026042a05b05474e75bec585607a556c1970bdeee"}, - {file = "dependency_injector-4.37.0-cp310-cp310-win32.whl", hash = "sha256:b73bd0dd82b42950fb78baae68750ecb5c943d39cbfacea8dbee9d6df6535427"}, - {file = "dependency_injector-4.37.0-cp310-cp310-win_amd64.whl", hash = "sha256:a944c1bbbb81dbeca8c30001bc8b7e061ca52cf291bf0dd35005863484e6ea8a"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d15b6fe1be06bffecf9b5f28fd972596f1ef6b7553d884c317b6d472ca0fb040"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbf05aefcb3cd856624e2203f69a61ad54ffa0541a23a8e6d136c178b7a37153"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ededd0f6f7abe153030f3f50959abf5cb65bf7e5215a59b9333e027d6262d161"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a3c5312fa1854eb45ed78a720ac5e1e354769e55a2fb42ca142b5dd612e8f0da"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-win32.whl", hash = "sha256:6446bd95a80a487893e162eeb8aa2f3029ab47bb4641a9e5d431f3c024b459c9"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-win_amd64.whl", hash = "sha256:fb29620e8249d66e8328d30c44d2f788d773132cdb6d0d62be4f1dd4343fc748"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c9fad82e44a34c83a0b522692aace49f3149d44b3ff826197a131a27a8df51df"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bfbcaa71ea2fd3a54e46d5038e6cedbb66d7c1319ac638f935f6cbba348ffc9"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d550f4e9e81e87ae23c5086e5b3b08f2331a02e9dc7a2553ce16275ba9921817"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a5242bca4f404c4918ba00b48fa1780c42903a9ff850956e04134bfc8b423d04"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-win32.whl", hash = "sha256:59f557f1f1f7fe856759fdc59b5f2c012e4caaf05b4f848cbb1f250bdf4d8541"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c69196827505288a8f94f9d36d4b4829fb23d5a62f0898e0aa7d5ad1fce0505e"}, - {file = "dependency_injector-4.37.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7639c601288417352af3318d683e96f034ffb685de2cfb8d79a75f982c262302"}, - {file = "dependency_injector-4.37.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b607090446e697b77d36be523ed845021d2379d62fcaf152998127066b70d80"}, - {file = "dependency_injector-4.37.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c9f31a7b3806098476767531b40f8a59dac726ce7602158a6e093f9e2be46f1a"}, - {file = "dependency_injector-4.37.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:86c4e918064de9e300152233da096797c4de7bb8e33ce86a7c6a398daf760c57"}, - {file = "dependency_injector-4.37.0-cp38-cp38-win32.whl", hash = "sha256:9756873290abd53111f9a7edc055c62a7968ac67d0fc3f49e7dba5bdda5c78a3"}, - {file = "dependency_injector-4.37.0-cp38-cp38-win_amd64.whl", hash = "sha256:35ac330fc1ed6ba0751f3eaa6a6f068c4e88cb1069bbe0c10568847db00dc62d"}, - {file = "dependency_injector-4.37.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6dc75b54da62da105ea5d4541bc5f1d0d1edb1be3763d2e9e1184fd0f249f23b"}, - {file = "dependency_injector-4.37.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9f9572021c4ed1ae59d22437ba60c4d92d1a1ec1e5fee1f81ef0c58096b9ee8"}, - {file = "dependency_injector-4.37.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2c796ec1de86c5bd34ba6a96ea95409582ebc8e54d9a62f263c7c7852d593ae6"}, - {file = "dependency_injector-4.37.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b7fda0bd48b8b3d6f9e7227d872b7d0cc95b8d54f296213369867f7490e38d06"}, - {file = "dependency_injector-4.37.0-cp39-cp39-win32.whl", hash = "sha256:c80521fc43f2812fec10ab4b92e7168659e25b5b13e0e3d45da0260e959da24a"}, - {file = "dependency_injector-4.37.0-cp39-cp39-win_amd64.whl", hash = "sha256:8930da0c2a0bdc3d96863e9f9522abeeb106ee7bb5c670805e97e42838191998"}, - {file = "dependency_injector-4.37.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6001f91e67700479088763babe976354538344ca347abe2d4405f6f4bc40b803"}, - {file = "dependency_injector-4.37.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14ccce9356f161c42664b73085c7ead179186e6cb8434bf885fa64b213e32712"}, - {file = "dependency_injector-4.37.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:58be030a8b0f4a856523ce3799cecfcf686a545b79f1f897262cec43090a7fd3"}, - {file = "dependency_injector-4.37.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a3bc779fe3f1331299032c51ec66c01dfd49e1a052c7ac3ac96aef30313c2e80"}, - {file = "dependency_injector-4.37.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:7c781db928a6f02f5f373773dc1a263e1e9dfcce2a854b42c9c261db2eb0042f"}, + {file = "dependency-injector-4.38.0.tar.gz", hash = "sha256:bab4c323d822d3fc9936e8eb3c2f5553d75e9efdadac11d5b293a016e31a1477"}, + {file = "dependency_injector-4.38.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:025eb5f97021663715bff8e01feb83d5b2f66fc17ece1042a194f1aae88c0d85"}, + {file = "dependency_injector-4.38.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3c61334b196ab767eae43af207764349287d5eb0283d8ed1ab24608121aea35"}, + {file = "dependency_injector-4.38.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9bf4bfc52015e81c4f17647b7bbbe4e4549f041b3c6635b44a9ecede7594932c"}, + {file = "dependency_injector-4.38.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7aeba5882b06baf78978f33228e4c44133dada9173e330da68fbccca98520848"}, + {file = "dependency_injector-4.38.0-cp310-cp310-win32.whl", hash = "sha256:445dbf5324eee215a465d7f3b1965b05e199c31caa09e63abf0f02d982791306"}, + {file = "dependency_injector-4.38.0-cp310-cp310-win_amd64.whl", hash = "sha256:880edbcb5d810faa0623112e2e652a7bec73d20ce0708d9db998a0a40b62cbb9"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cd6f1c130462e7461a43f82fdc0d2ba25b5ef594db823dbd0e57f3d1b7c44f86"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be75905f7513886699d3ff5ed9aca233175c03808fc888da2a53b83af0a5d65"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d7f1a7d27de6295ce8b7ca69d1177817bf36c7cbaf73819e4bab04f87c5e962"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e9c1ff387d7b7d814e9d29a531c6804acc67b1cca578c09abd3590fa7ec6bf06"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-win32.whl", hash = "sha256:7770efcbc6915dabbb31ea0bdeee1105dabf76e1c8e31a454cb1983dcf19ecf1"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-win_amd64.whl", hash = "sha256:9e89a9c88317ad237abfb374c410e1466476ffefe6c44f3caeca3dce747a635c"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cb75cd29c132bfaf03a11a6ac4f459dddb7a6526669543de57d2bb5fddf78def"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d116c56e7fc3b59b3afa6078163b5f6ff4680ebf27800dd4032de7a04f7ef777"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9df330ef9e24b6f94e6764d23180350c2fb99785257233ee4738e066b876fa7f"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7a46639038313f64eca2dc858ac4cd9e0aca5ea21bb005f5d754aadd6446ba4b"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-win32.whl", hash = "sha256:d0d983b269b657744058b5858afc3c59443db53afe9c3e709e316daa9f9b9454"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1446df58169c166a5a2d5644ba9eeb3b7f2f679f260596f78d012c58ff140d92"}, + {file = "dependency_injector-4.38.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:307396f2d9d2f532fe92079a56d40af5fc60dacb1d766e3f9cd04c3802a1c251"}, + {file = "dependency_injector-4.38.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dd96b6c454ab86648f57f37b895c1c976b1a82b76f835011f607ee8a78ebc0e"}, + {file = "dependency_injector-4.38.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fb44b17e649cabcfd1f370ecfd492ac7a93216776d91954b31598eecb36cdb13"}, + {file = "dependency_injector-4.38.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ab8ebe728dd9b3be23c40ca5a5dbe195050d9ad35d42d7e9fdaea816f7134584"}, + {file = "dependency_injector-4.38.0-cp38-cp38-win32.whl", hash = "sha256:1da3bad1452212bab76e87fbf7a71d3675190a1a909f345aaf8bae2fa97b878f"}, + {file = "dependency_injector-4.38.0-cp38-cp38-win_amd64.whl", hash = "sha256:2918776e88de88be0e2be036261180ca0605c8f64ead43d835ce852f16a9efd2"}, + {file = "dependency_injector-4.38.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:493be62561218624380d4eca9243a46753444f677217db6292a7b715cf429172"}, + {file = "dependency_injector-4.38.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a70511db88f84ac4228b27e37e12ea0e04a9c2a32cae3602b9af9a27c0db992"}, + {file = "dependency_injector-4.38.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e3e1cfe41a5ada0ff71889563441f538caff0399e41d3ee377b60fa50a858bf"}, + {file = "dependency_injector-4.38.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:116cc679a2c6d40c6a4f968aefe68535e596e88e96315dbd0d0ad2ff76654e3d"}, + {file = "dependency_injector-4.38.0-cp39-cp39-win32.whl", hash = "sha256:f703c2c161de067ba9893b56743d24fb4c9dbff92eb504bc082c2d2cfeab4c01"}, + {file = "dependency_injector-4.38.0-cp39-cp39-win_amd64.whl", hash = "sha256:6821a864d6405dc0d5f794ac1b10da4a8c7e8731c6a0651a9682a0b76f5a5b3e"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6c9e8dc91aa5831bd3a58fec1b94ed8c52f78f601f5ab91135b5ad44325beef7"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b4eedadef0c84295b70803a79a3ce5a10a59dddd8f306876f6fa6bfc4de8e00"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2e88b5d09c80e20d6b3d985cc360f39a81e748667c20f6bc7eee9f4b832176ed"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b1fcd71ff46e097f4e47917ccdf6aa388b6a6372557f7d9f83db1e879e95f8bb"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:9633d6366282e83a3f21543c5c78299787948333d9fe6649b020cfac93d8b7ca"}, ] distlib = [ {file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"}, diff --git a/packages/core/minos-microservice-saga/pyproject.toml b/packages/core/minos-microservice-saga/pyproject.toml index 646b9ea16..d7affed7a 100644 --- a/packages/core/minos-microservice-saga/pyproject.toml +++ b/packages/core/minos-microservice-saga/pyproject.toml @@ -1,14 +1,14 @@ [tool.poetry] name = "minos-microservice-saga" -version = "0.4.0" -description = "Saga Library for MinOS project." +version = "0.5.0" +description = "The SAGA pattern of the Minos Framework" readme = "README.md" repository = "https://github.com/minos-framework/minos-python" homepage = "http://www.minos.run/" authors = ["Minos Framework Devs "] license = "MIT" classifiers = [ - "Development Status :: 2 - Pre-Alpha", + "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Natural Language :: English", "Programming Language :: Python :: 3", @@ -40,7 +40,7 @@ dependency-injector = "^4.32.2" 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 = "^21.12b0" +black = "^22.1" isort = "^5.8.0" pytest = "^6.2.4" coverage = "^6.3" diff --git a/packages/plugins/minos-broker-kafka/AUTHORS.md b/packages/plugins/minos-broker-kafka/AUTHORS.md new file mode 100644 index 000000000..30ff94991 --- /dev/null +++ b/packages/plugins/minos-broker-kafka/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-broker-kafka/HISTORY.md b/packages/plugins/minos-broker-kafka/HISTORY.md new file mode 100644 index 000000000..af6eb3c93 --- /dev/null +++ b/packages/plugins/minos-broker-kafka/HISTORY.md @@ -0,0 +1,12 @@ +# History + +## 0.5.0 (2022-02-03) + +* Migrate `PostgreSqlQueuedKafkaBrokerPublisher` from `minos-microservice-networks`. +* Migrate `InMemoryQueuedKafkaBrokerPublisher` from `minos-microservice-networks`. +* Migrate `KafkaBrokerPublisher` from `minos-microservice-networks`. +* Migrate `KafkaBrokerSubscriber` from `minos-microservice-networks`. +* Migrate `KafkaBrokerSubscriberBuilder` from `minos-microservice-networks`. +* Migrate `PostgreSqlQueuedKafkaBrokerSubscriberBuilder` from `minos-microservice-networks`. +* Migrate `InMemoryQueuedKafkaBrokerSubscriberBuilder` from `minos-microservice-networks`. +* Minor changes. \ No newline at end of file diff --git a/packages/plugins/minos-broker-kafka/LICENSE b/packages/plugins/minos-broker-kafka/LICENSE new file mode 100644 index 000000000..4daf85bf2 --- /dev/null +++ b/packages/plugins/minos-broker-kafka/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-broker-kafka/Makefile b/packages/plugins/minos-broker-kafka/Makefile new file mode 100644 index 000000000..854bc90bc --- /dev/null +++ b/packages/plugins/minos-broker-kafka/Makefile @@ -0,0 +1,42 @@ +.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 + +docs: + rm -rf docs/api + poetry run $(MAKE) --directory=docs html + +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) docs + $(MAKE) dist diff --git a/packages/plugins/minos-broker-kafka/README.md b/packages/plugins/minos-broker-kafka/README.md new file mode 100644 index 000000000..a632668b8 --- /dev/null +++ b/packages/plugins/minos-broker-kafka/README.md @@ -0,0 +1,36 @@ +

+ Minos logo +

+ +## minos-broker-kafka + +[![PyPI Latest Release](https://img.shields.io/pypi/v/minos-broker-kafka.svg)](https://pypi.org/project/minos-broker-kafka/) +[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/minos-framework/minos-python/pages%20build%20and%20deployment?label=docs)](https://minos-framework.github.io/minos-python) +[![License](https://img.shields.io/github/license/minos-framework/minos-python.svg)](https://github.com/minos-framework/minos-python/blob/main/LICENSE) +[![Coverage](https://codecov.io/github/minos-framework/minos-python/coverage.svg?branch=main)](https://codecov.io/gh/minos-framework/minos-python) +[![Stack Overflow](https://img.shields.io/badge/Stack%20Overflow-Ask%20a%20question-green)](https://stackoverflow.com/questions/tagged/minos) + +## Summary + +Minos is a framework which helps you create [reactive](https://www.reactivemanifesto.org/) microservices in Python. +Internally, it leverages Event Sourcing, CQRS and a message driven architecture to fulfil the commitments of an +asynchronous environment. + +## 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-broker-kafka/RUNTHETESTS.md b/packages/plugins/minos-broker-kafka/RUNTHETESTS.md new file mode 100644 index 000000000..8b5e95b1f --- /dev/null +++ b/packages/plugins/minos-broker-kafka/RUNTHETESTS.md @@ -0,0 +1,21 @@ +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-broker-kafka/SETUP.md b/packages/plugins/minos-broker-kafka/SETUP.md new file mode 100644 index 000000000..8203965c7 --- /dev/null +++ b/packages/plugins/minos-broker-kafka/SETUP.md @@ -0,0 +1,11 @@ +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 new file mode 100644 index 000000000..09dee594d --- /dev/null +++ b/packages/plugins/minos-broker-kafka/docs/Makefile @@ -0,0 +1,20 @@ +# 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 new file mode 100644 index 000000000..8aa6c288f --- /dev/null +++ b/packages/plugins/minos-broker-kafka/docs/_static/style.css @@ -0,0 +1,3 @@ +.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 new file mode 100644 index 000000000..b0a448060 --- /dev/null +++ b/packages/plugins/minos-broker-kafka/docs/_templates/layout.html @@ -0,0 +1,4 @@ +{% 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 new file mode 100644 index 000000000..cf16fc494 --- /dev/null +++ b/packages/plugins/minos-broker-kafka/docs/authors.md @@ -0,0 +1 @@ +.. mdinclude:: ../AUTHORS.md diff --git a/packages/plugins/minos-broker-kafka/docs/conf.py b/packages/plugins/minos-broker-kafka/docs/conf.py new file mode 100755 index 000000000..fa8cbc601 --- /dev/null +++ b/packages/plugins/minos-broker-kafka/docs/conf.py @@ -0,0 +1,191 @@ +#!/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 new file mode 100644 index 000000000..d26e5be83 --- /dev/null +++ b/packages/plugins/minos-broker-kafka/docs/history.md @@ -0,0 +1 @@ +.. mdinclude:: ../HISTORY.md diff --git a/packages/plugins/minos-broker-kafka/docs/index.md b/packages/plugins/minos-broker-kafka/docs/index.md new file mode 100644 index 000000000..7ddfe91be --- /dev/null +++ b/packages/plugins/minos-broker-kafka/docs/index.md @@ -0,0 +1,16 @@ +# Welcome to Minos Broker Kafka'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-kafka/docs/readme.md b/packages/plugins/minos-broker-kafka/docs/readme.md new file mode 100644 index 000000000..da72dbef1 --- /dev/null +++ b/packages/plugins/minos-broker-kafka/docs/readme.md @@ -0,0 +1,3 @@ +# Introduction + +.. mdinclude:: ../README.md diff --git a/packages/plugins/minos-broker-kafka/docs/runthetests.md b/packages/plugins/minos-broker-kafka/docs/runthetests.md new file mode 100644 index 000000000..309db1b96 --- /dev/null +++ b/packages/plugins/minos-broker-kafka/docs/runthetests.md @@ -0,0 +1 @@ +.. mdinclude:: ../RUNTHETESTS.md diff --git a/packages/plugins/minos-broker-kafka/docs/usage.md b/packages/plugins/minos-broker-kafka/docs/usage.md new file mode 100644 index 000000000..8f04b05ad --- /dev/null +++ b/packages/plugins/minos-broker-kafka/docs/usage.md @@ -0,0 +1 @@ +# 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 new file mode 100644 index 000000000..3da0404fa --- /dev/null +++ b/packages/plugins/minos-broker-kafka/minos/plugins/kafka/__init__.py @@ -0,0 +1,15 @@ +__author__ = "Minos Framework Devs" +__email__ = "hey@minos.run" +__version__ = "0.5.0" + +from .publisher import ( + InMemoryQueuedKafkaBrokerPublisher, + KafkaBrokerPublisher, + PostgreSqlQueuedKafkaBrokerPublisher, +) +from .subscriber import ( + InMemoryQueuedKafkaBrokerSubscriberBuilder, + KafkaBrokerSubscriber, + KafkaBrokerSubscriberBuilder, + PostgreSqlQueuedKafkaBrokerSubscriberBuilder, +) diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/publishers/kafka.py b/packages/plugins/minos-broker-kafka/minos/plugins/kafka/publisher.py similarity index 62% rename from packages/core/minos-microservice-networks/minos/networks/brokers/publishers/kafka.py rename to packages/plugins/minos-broker-kafka/minos/plugins/kafka/publisher.py index 1f0169a98..06a28561f 100644 --- a/packages/core/minos-microservice-networks/minos/networks/brokers/publishers/kafka.py +++ b/packages/plugins/minos-broker-kafka/minos/plugins/kafka/publisher.py @@ -21,17 +21,37 @@ from minos.common import ( MinosConfig, ) - -from ..messages import ( +from minos.networks import ( BrokerMessage, -) -from .abc import ( BrokerPublisher, + InMemoryBrokerPublisherQueue, + PostgreSqlBrokerPublisherQueue, + QueuedBrokerPublisher, ) logger = logging.getLogger(__name__) +class PostgreSqlQueuedKafkaBrokerPublisher(QueuedBrokerPublisher): + """PostgreSql Queued Kafka Broker Publisher class.""" + + @classmethod + def _from_config(cls, config: MinosConfig, **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.""" + + @classmethod + def _from_config(cls, config: MinosConfig, **kwargs) -> InMemoryQueuedKafkaBrokerPublisher: + impl = KafkaBrokerPublisher.from_config(config, **kwargs) + queue = InMemoryBrokerPublisherQueue.from_config(config, **kwargs) + return cls(impl, queue, **kwargs) + + class KafkaBrokerPublisher(BrokerPublisher): """Kafka Broker Publisher class.""" diff --git a/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/kafka.py b/packages/plugins/minos-broker-kafka/minos/plugins/kafka/subscriber.py similarity index 98% rename from packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/kafka.py rename to packages/plugins/minos-broker-kafka/minos/plugins/kafka/subscriber.py index ea6ee6b0e..c1aac0ed7 100644 --- a/packages/core/minos-microservice-networks/minos/networks/brokers/subscribers/kafka.py +++ b/packages/plugins/minos-broker-kafka/minos/plugins/kafka/subscriber.py @@ -36,15 +36,10 @@ from minos.common import ( MinosConfig, ) - -from ..messages import ( +from minos.networks import ( BrokerMessage, -) -from .abc import ( BrokerSubscriber, BrokerSubscriberBuilder, -) -from .queued import ( InMemoryBrokerSubscriberQueueBuilder, PostgreSqlBrokerSubscriberQueueBuilder, QueuedBrokerSubscriberBuilder, diff --git a/packages/plugins/minos-broker-kafka/poetry.lock b/packages/plugins/minos-broker-kafka/poetry.lock new file mode 100644 index 000000000..d5ebcbc13 --- /dev/null +++ b/packages/plugins/minos-broker-kafka/poetry.lock @@ -0,0 +1,1847 @@ +[[package]] +name = "aiohttp" +version = "3.8.1" +description = "Async http client/server framework (asyncio)" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = ">=4.0.0a3,<5.0" +attrs = ">=17.3.0" +charset-normalizer = ">=2.0,<3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["aiodns", "brotli", "cchardet"] + +[[package]] +name = "aiokafka" +version = "0.7.2" +description = "Kafka integration with asyncio." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +kafka-python = ">=2.0.0" + +[package.extras] +snappy = ["python-snappy (>=0.5)"] + +[[package]] +name = "aiomisc" +version = "14.4.6" +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 (<4)", "aiohttp-asgi", "async-timeout", "coverage (==4.5.1)", "coveralls", "croniter (>=0.3.34,<0.4.0)", "fastapi", "freezegun (<1.1)", "mypy (>=0.782,<1.0)", "pylava", "pytest", "pytest-cov (>=2.5.1,<2.6.0)", "pytest-freezegun (>=0.4.2,<0.5.0)", "sphinx (>=3.5.1)", "sphinx-autobuild", "sphinx-intl", "timeout-decorator", "types-croniter", "tox (>=2.4)"] +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" +description = "aiosignal: a list of registered asynchronous callbacks" +category = "main" +optional = false +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" +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 = "main" +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 = "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" +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 = ">=1.1.0" +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 = "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.11" +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.0.3" +description = "Composable command line interface toolkit" +category = "dev" +optional = false +python-versions = ">=3.6" + +[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.1" +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.38.0" +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 = "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.9" +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 = "filelock" +version = "3.4.2" +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" +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 = "frozenlist" +version = "1.3.0" +description = "A list-like structure which implements collections.abc.MutableSequence" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "identify" +version = "2.4.7" +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 = "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.10.1" +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 (>=8.2)", "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", "importlib-resources (>=1.3)"] + +[[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 = "jinja2" +version = "3.0.3" +description = "A very fast and expressive template engine." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "kafka-python" +version = "2.0.2" +description = "Pure Python client for Apache Kafka" +category = "main" +optional = false +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.0.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "dev" +optional = false +python-versions = ">=3.6" + +[[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.4.1" +description = "Python Package with common Classes and Utilities used in Minos Microservices." +category = "main" +optional = false +python-versions = "^3.9" +develop = true + +[package.dependencies] +aiomisc = "^14.0.3" +aiopg = "^1.2.1" +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" + +[package.source] +type = "directory" +url = "../../core/minos-microservice-common" + +[[package]] +name = "minos-microservice-networks" +version = "0.4.1" +description = "Python Package with the common network classes and utilities used in Minos Microservice." +category = "main" +optional = false +python-versions = "^3.9" +develop = true + +[package.dependencies] +aiohttp = "^3.7.4" +aiokafka = "^0.7.0" +aiomisc = "^14.0.3" +aiopg = "^1.2.1" +crontab = "^0.23.0" +dependency-injector = "^4.32.2" +minos-microservice-common = "^0.4.0" +orjson = "^3.6.5" + +[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" +description = "multidict implementation" +category = "main" +optional = false +python-versions = ">=3.7" + +[[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 = "nodeenv" +version = "1.6.0" +description = "Node.js virtual environment builder" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "orjson" +version = "3.6.6" +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 = "pbr" +version = "5.8.0" +description = "Python Build Reasonableness" +category = "dev" +optional = false +python-versions = ">=2.6" + +[[package]] +name = "platformdirs" +version = "2.4.1" +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)"] + +[[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 = "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" +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 = "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" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[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 = "2021.3" +description = "World timezone definitions, modern and historical" +category = "dev" +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 = "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" +description = "Python 2 and 3 compatibility utilities" +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.4.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.16.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.0" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "typing-extensions" +version = "4.0.1" +description = "Backported and Experimental Type Hints for Python 3.6+" +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "urllib3" +version = "1.26.8" +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 = ["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)"] + +[[package]] +name = "virtualenv" +version = "20.13.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" +description = "Yet another URL library" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +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 = "eb405d50d73d2f9c30fcdb13ab2b1aeaa55dd25543c9ecbd93550484f437a0eb" + +[metadata.files] +aiohttp = [ + {file = "aiohttp-3.8.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1ed0b6477896559f17b9eaeb6d38e07f7f9ffe40b9f0f9627ae8b9926ae260a8"}, + {file = "aiohttp-3.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7dadf3c307b31e0e61689cbf9e06be7a867c563d5a63ce9dca578f956609abf8"}, + {file = "aiohttp-3.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a79004bb58748f31ae1cbe9fa891054baaa46fb106c2dc7af9f8e3304dc30316"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12de6add4038df8f72fac606dff775791a60f113a725c960f2bab01d8b8e6b15"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f0d5f33feb5f69ddd57a4a4bd3d56c719a141080b445cbf18f238973c5c9923"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eaba923151d9deea315be1f3e2b31cc39a6d1d2f682f942905951f4e40200922"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:099ebd2c37ac74cce10a3527d2b49af80243e2a4fa39e7bce41617fbc35fa3c1"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2e5d962cf7e1d426aa0e528a7e198658cdc8aa4fe87f781d039ad75dcd52c516"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fa0ffcace9b3aa34d205d8130f7873fcfefcb6a4dd3dd705b0dab69af6712642"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:61bfc23df345d8c9716d03717c2ed5e27374e0fe6f659ea64edcd27b4b044cf7"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:31560d268ff62143e92423ef183680b9829b1b482c011713ae941997921eebc8"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:01d7bdb774a9acc838e6b8f1d114f45303841b89b95984cbb7d80ea41172a9e3"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:97ef77eb6b044134c0b3a96e16abcb05ecce892965a2124c566af0fd60f717e2"}, + {file = "aiohttp-3.8.1-cp310-cp310-win32.whl", hash = "sha256:c2aef4703f1f2ddc6df17519885dbfa3514929149d3ff900b73f45998f2532fa"}, + {file = "aiohttp-3.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:713ac174a629d39b7c6a3aa757b337599798da4c1157114a314e4e391cd28e32"}, + {file = "aiohttp-3.8.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:473d93d4450880fe278696549f2e7aed8cd23708c3c1997981464475f32137db"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99b5eeae8e019e7aad8af8bb314fb908dd2e028b3cdaad87ec05095394cce632"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af642b43ce56c24d063325dd2cf20ee012d2b9ba4c3c008755a301aaea720ad"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3630c3ef435c0a7c549ba170a0633a56e92629aeed0e707fec832dee313fb7a"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4a4a4e30bf1edcad13fb0804300557aedd07a92cabc74382fdd0ba6ca2661091"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6f8b01295e26c68b3a1b90efb7a89029110d3a4139270b24fda961893216c440"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a25fa703a527158aaf10dafd956f7d42ac6d30ec80e9a70846253dd13e2f067b"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5bfde62d1d2641a1f5173b8c8c2d96ceb4854f54a44c23102e2ccc7e02f003ec"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:51467000f3647d519272392f484126aa716f747859794ac9924a7aafa86cd411"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:03a6d5349c9ee8f79ab3ff3694d6ce1cfc3ced1c9d36200cb8f08ba06bd3b782"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:102e487eeb82afac440581e5d7f8f44560b36cf0bdd11abc51a46c1cd88914d4"}, + {file = "aiohttp-3.8.1-cp36-cp36m-win32.whl", hash = "sha256:4aed991a28ea3ce320dc8ce655875e1e00a11bdd29fe9444dd4f88c30d558602"}, + {file = "aiohttp-3.8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b0e20cddbd676ab8a64c774fefa0ad787cc506afd844de95da56060348021e96"}, + {file = "aiohttp-3.8.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:37951ad2f4a6df6506750a23f7cbabad24c73c65f23f72e95897bb2cecbae676"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c23b1ad869653bc818e972b7a3a79852d0e494e9ab7e1a701a3decc49c20d51"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:15b09b06dae900777833fe7fc4b4aa426556ce95847a3e8d7548e2d19e34edb8"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:477c3ea0ba410b2b56b7efb072c36fa91b1e6fc331761798fa3f28bb224830dd"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2f2f69dca064926e79997f45b2f34e202b320fd3782f17a91941f7eb85502ee2"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ef9612483cb35171d51d9173647eed5d0069eaa2ee812793a75373447d487aa4"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6d69f36d445c45cda7b3b26afef2fc34ef5ac0cdc75584a87ef307ee3c8c6d00"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:55c3d1072704d27401c92339144d199d9de7b52627f724a949fc7d5fc56d8b93"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b9d00268fcb9f66fbcc7cd9fe423741d90c75ee029a1d15c09b22d23253c0a44"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:07b05cd3305e8a73112103c834e91cd27ce5b4bd07850c4b4dbd1877d3f45be7"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c34dc4958b232ef6188c4318cb7b2c2d80521c9a56c52449f8f93ab7bc2a8a1c"}, + {file = "aiohttp-3.8.1-cp37-cp37m-win32.whl", hash = "sha256:d2f9b69293c33aaa53d923032fe227feac867f81682f002ce33ffae978f0a9a9"}, + {file = "aiohttp-3.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6ae828d3a003f03ae31915c31fa684b9890ea44c9c989056fea96e3d12a9fa17"}, + {file = "aiohttp-3.8.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0c7ebbbde809ff4e970824b2b6cb7e4222be6b95a296e46c03cf050878fc1785"}, + {file = "aiohttp-3.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b7ef7cbd4fec9a1e811a5de813311ed4f7ac7d93e0fda233c9b3e1428f7dd7b"}, + {file = "aiohttp-3.8.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c3d6a4d0619e09dcd61021debf7059955c2004fa29f48788a3dfaf9c9901a7cd"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:718626a174e7e467f0558954f94af117b7d4695d48eb980146016afa4b580b2e"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:589c72667a5febd36f1315aa6e5f56dd4aa4862df295cb51c769d16142ddd7cd"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ed076098b171573161eb146afcb9129b5ff63308960aeca4b676d9d3c35e700"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:086f92daf51a032d062ec5f58af5ca6a44d082c35299c96376a41cbb33034675"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:11691cf4dc5b94236ccc609b70fec991234e7ef8d4c02dd0c9668d1e486f5abf"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:31d1e1c0dbf19ebccbfd62eff461518dcb1e307b195e93bba60c965a4dcf1ba0"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:11a67c0d562e07067c4e86bffc1553f2cf5b664d6111c894671b2b8712f3aba5"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:bb01ba6b0d3f6c68b89fce7305080145d4877ad3acaed424bae4d4ee75faa950"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:44db35a9e15d6fe5c40d74952e803b1d96e964f683b5a78c3cc64eb177878155"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:844a9b460871ee0a0b0b68a64890dae9c415e513db0f4a7e3cab41a0f2fedf33"}, + {file = "aiohttp-3.8.1-cp38-cp38-win32.whl", hash = "sha256:7d08744e9bae2ca9c382581f7dce1273fe3c9bae94ff572c3626e8da5b193c6a"}, + {file = "aiohttp-3.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:04d48b8ce6ab3cf2097b1855e1505181bdd05586ca275f2505514a6e274e8e75"}, + {file = "aiohttp-3.8.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f5315a2eb0239185af1bddb1abf472d877fede3cc8d143c6cddad37678293237"}, + {file = "aiohttp-3.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a996d01ca39b8dfe77440f3cd600825d05841088fd6bc0144cc6c2ec14cc5f74"}, + {file = "aiohttp-3.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:13487abd2f761d4be7c8ff9080de2671e53fff69711d46de703c310c4c9317ca"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea302f34477fda3f85560a06d9ebdc7fa41e82420e892fc50b577e35fc6a50b2"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2f635ce61a89c5732537a7896b6319a8fcfa23ba09bec36e1b1ac0ab31270d2"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e999f2d0e12eea01caeecb17b653f3713d758f6dcc770417cf29ef08d3931421"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0770e2806a30e744b4e21c9d73b7bee18a1cfa3c47991ee2e5a65b887c49d5cf"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d15367ce87c8e9e09b0f989bfd72dc641bcd04ba091c68cd305312d00962addd"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6c7cefb4b0640703eb1069835c02486669312bf2f12b48a748e0a7756d0de33d"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:71927042ed6365a09a98a6377501af5c9f0a4d38083652bcd2281a06a5976724"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:28d490af82bc6b7ce53ff31337a18a10498303fe66f701ab65ef27e143c3b0ef"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:b6613280ccedf24354406caf785db748bebbddcf31408b20c0b48cb86af76866"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:81e3d8c34c623ca4e36c46524a3530e99c0bc95ed068fd6e9b55cb721d408fb2"}, + {file = "aiohttp-3.8.1-cp39-cp39-win32.whl", hash = "sha256:7187a76598bdb895af0adbd2fb7474d7f6025d170bc0a1130242da817ce9e7d1"}, + {file = "aiohttp-3.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:1c182cb873bc91b411e184dab7a2b664d4fea2743df0e4d57402f7f3fa644bac"}, + {file = "aiohttp-3.8.1.tar.gz", hash = "sha256:fc5471e1a54de15ef71c1bc6ebe80d4dc681ea600e68bfd1cbce40427f0b7578"}, +] +aiokafka = [ + {file = "aiokafka-0.7.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b19f077e12fe23e359f7a7dca9baf8532c63f4c8149703ce4c56de372d17e26c"}, + {file = "aiokafka-0.7.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d801bb2f5a4ae726a433ae74a5d34e7e0d44128de53c9c7eea5cb4cdaaf80175"}, + {file = "aiokafka-0.7.2-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3b1f1e9ad66883ed809d737d57edfb13f1aeb9b08c6fd6b71afefce712c13dad"}, + {file = "aiokafka-0.7.2-cp36-cp36m-win32.whl", hash = "sha256:383cc7d45b47676fea60dbedee747c5c08dde5c10b1be0afc6598fb21a7891b4"}, + {file = "aiokafka-0.7.2-cp36-cp36m-win_amd64.whl", hash = "sha256:ce23baeaacf501f619967067d2c0d4c2b2b761012f9f9c8a49593e96c7550aff"}, + {file = "aiokafka-0.7.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c96824cef1a480fd2ab4bbd9e9aa737c9191211bab5f7787ef401926d5fda95d"}, + {file = "aiokafka-0.7.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:34eda0b6eb794c36f4100be772f3b120a3c00daaf342f593f32994a762aed7e8"}, + {file = "aiokafka-0.7.2-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e6e78206e5d031e6644d3a46153a146d2d2afff4cf9da9a81edb9f8714114b62"}, + {file = "aiokafka-0.7.2-cp37-cp37m-win32.whl", hash = "sha256:ebbb258840f134bad0e6ca8681a87cd292a1f4ed7253a821c16b4e9f2610a04a"}, + {file = "aiokafka-0.7.2-cp37-cp37m-win_amd64.whl", hash = "sha256:16731e8aa0fc70dc35c31041599c9a5237dd5d2c1a4d04af58f30a942191a281"}, + {file = "aiokafka-0.7.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a9b6ecb606062b3595bc5104b85b42b62621a86d179b75d708279041152f461"}, + {file = "aiokafka-0.7.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cda55f5cfb19ea7d2f55a51d320a57312f152dab3e333fa1fbfcdde7a9e25a53"}, + {file = "aiokafka-0.7.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7d56627c3250ba2359dfa90f2c8a3ab995795e0116038905b2f8a608cd1fd606"}, + {file = "aiokafka-0.7.2-cp38-cp38-win32.whl", hash = "sha256:be43d7ddd700d501a6f4c59c859baa9888c2d086b69882f542951bae41234f6a"}, + {file = "aiokafka-0.7.2-cp38-cp38-win_amd64.whl", hash = "sha256:594d2a29875f78d56251141ff95a982c5be64844dc9ae619c285f36c57a08c6e"}, + {file = "aiokafka-0.7.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5371bd663f545ced555775e7e49f39a54b243435098a9699582bb3b32884e332"}, + {file = "aiokafka-0.7.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b1958277eaa702509591c0674790a8c9aced8fef7723dafae0f9aec6d2da71a5"}, + {file = "aiokafka-0.7.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7fe02a3868236d84356d5fa7c7625ed3a27e52699477c5ee8bd5dc9b5adb592f"}, + {file = "aiokafka-0.7.2-cp39-cp39-win32.whl", hash = "sha256:a3bfe4ad7d3829a98c8391a9a28f179b47df4f66e26ea5b1c665f872b6e21809"}, + {file = "aiokafka-0.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:6116b68ca975caafd7efd338ffdaec63789e1c334af6174e20edc1d16d14e463"}, + {file = "aiokafka-0.7.2.tar.gz", hash = "sha256:a8fc41d18731d8879483aecb93ae7ebf5457f63daf4c8923ddc046792c2c3096"}, +] +aiomisc = [ + {file = "aiomisc-14.4.6-py3-none-any.whl", hash = "sha256:beaa248f92acce53857f459499210643274cf06b33c7eb0c9d1f35feaad0d054"}, + {file = "aiomisc-14.4.6.tar.gz", hash = "sha256:a547a94908db9213fd0acde2674973b4a7a986ad82989215f73488903b65746e"}, +] +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"}, +] +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"}, +] +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"}, +] +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.11.tar.gz", hash = "sha256:98398a9d69ee80548c762ba991a4728bfc3836768ed226b3945908d1a688371c"}, + {file = "charset_normalizer-2.0.11-py3-none-any.whl", hash = "sha256:2842d8f5e82a1f6aa437380934d5e1cd4fcf2003b06fed6940769c164a480a45"}, +] +click = [ + {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, + {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"}, +] +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.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeffd96882d8c06d31b65dddcf51db7c612547babc1c4c5db6a011abe9798525"}, + {file = "coverage-6.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:621f6ea7260ea2ffdaec64fe5cb521669984f567b66f62f81445221d4754df4c"}, + {file = "coverage-6.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84f2436d6742c01136dd940ee158bfc7cf5ced3da7e4c949662b8703b5cd8145"}, + {file = "coverage-6.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de73fca6fb403dd72d4da517cfc49fcf791f74eee697d3219f6be29adf5af6ce"}, + {file = "coverage-6.3.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78fbb2be068a13a5d99dce9e1e7d168db880870f7bc73f876152130575bd6167"}, + {file = "coverage-6.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f5a4551dfd09c3bd12fca8144d47fe7745275adf3229b7223c2f9e29a975ebda"}, + {file = "coverage-6.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7bff3a98f63b47464480de1b5bdd80c8fade0ba2832c9381253c9b74c4153c27"}, + {file = "coverage-6.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a06c358f4aed05fa1099c39decc8022261bb07dfadc127c08cfbd1391b09689e"}, + {file = "coverage-6.3.1-cp310-cp310-win32.whl", hash = "sha256:9fff3ff052922cb99f9e52f63f985d4f7a54f6b94287463bc66b7cdf3eb41217"}, + {file = "coverage-6.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:276b13cc085474e482566c477c25ed66a097b44c6e77132f3304ac0b039f83eb"}, + {file = "coverage-6.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:56c4a409381ddd7bbff134e9756077860d4e8a583d310a6f38a2315b9ce301d0"}, + {file = "coverage-6.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9eb494070aa060ceba6e4bbf44c1bc5fa97bfb883a0d9b0c9049415f9e944793"}, + {file = "coverage-6.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e15d424b8153756b7c903bde6d4610be0c3daca3986173c18dd5c1a1625e4cd"}, + {file = "coverage-6.3.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61d47a897c1e91f33f177c21de897267b38fbb45f2cd8e22a710bcef1df09ac1"}, + {file = "coverage-6.3.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:25e73d4c81efa8ea3785274a2f7f3bfbbeccb6fcba2a0bdd3be9223371c37554"}, + {file = "coverage-6.3.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:fac0bcc5b7e8169bffa87f0dcc24435446d329cbc2b5486d155c2e0f3b493ae1"}, + {file = "coverage-6.3.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:72128176fea72012063200b7b395ed8a57849282b207321124d7ff14e26988e8"}, + {file = "coverage-6.3.1-cp37-cp37m-win32.whl", hash = "sha256:1bc6d709939ff262fd1432f03f080c5042dc6508b6e0d3d20e61dd045456a1a0"}, + {file = "coverage-6.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:618eeba986cea7f621d8607ee378ecc8c2504b98b3fdc4952b30fe3578304687"}, + {file = "coverage-6.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d5ed164af5c9078596cfc40b078c3b337911190d3faeac830c3f1274f26b8320"}, + {file = "coverage-6.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:352c68e233409c31048a3725c446a9e48bbff36e39db92774d4f2380d630d8f8"}, + {file = "coverage-6.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:448d7bde7ceb6c69e08474c2ddbc5b4cd13c9e4aa4a717467f716b5fc938a734"}, + {file = "coverage-6.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9fde6b90889522c220dd56a670102ceef24955d994ff7af2cb786b4ba8fe11e4"}, + {file = "coverage-6.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e647a0be741edbb529a72644e999acb09f2ad60465f80757da183528941ff975"}, + {file = "coverage-6.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a5cdc3adb4f8bb8d8f5e64c2e9e282bc12980ef055ec6da59db562ee9bdfefa"}, + {file = "coverage-6.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2dd70a167843b4b4b2630c0c56f1b586fe965b4f8ac5da05b6690344fd065c6b"}, + {file = "coverage-6.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9ad0a117b8dc2061ce9461ea4c1b4799e55edceb236522c5b8f958ce9ed8fa9a"}, + {file = "coverage-6.3.1-cp38-cp38-win32.whl", hash = "sha256:e92c7a5f7d62edff50f60a045dc9542bf939758c95b2fcd686175dd10ce0ed10"}, + {file = "coverage-6.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:482fb42eea6164894ff82abbcf33d526362de5d1a7ed25af7ecbdddd28fc124f"}, + {file = "coverage-6.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c5b81fb37db76ebea79aa963b76d96ff854e7662921ce742293463635a87a78d"}, + {file = "coverage-6.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a4f923b9ab265136e57cc14794a15b9dcea07a9c578609cd5dbbfff28a0d15e6"}, + {file = "coverage-6.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56d296cbc8254a7dffdd7bcc2eb70be5a233aae7c01856d2d936f5ac4e8ac1f1"}, + {file = "coverage-6.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1245ab82e8554fa88c4b2ab1e098ae051faac5af829efdcf2ce6b34dccd5567c"}, + {file = "coverage-6.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f2b05757c92ad96b33dbf8e8ec8d4ccb9af6ae3c9e9bd141c7cc44d20c6bcba"}, + {file = "coverage-6.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9e3dd806f34de38d4c01416344e98eab2437ac450b3ae39c62a0ede2f8b5e4ed"}, + {file = "coverage-6.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d651fde74a4d3122e5562705824507e2f5b2d3d57557f1916c4b27635f8fbe3f"}, + {file = "coverage-6.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:704f89b87c4f4737da2860695a18c852b78ec7279b24eedacab10b29067d3a38"}, + {file = "coverage-6.3.1-cp39-cp39-win32.whl", hash = "sha256:2aed4761809640f02e44e16b8b32c1a5dee5e80ea30a0ff0912158bde9c501f2"}, + {file = "coverage-6.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:9976fb0a5709988778ac9bc44f3d50fccd989987876dfd7716dee28beed0a9fa"}, + {file = "coverage-6.3.1-pp36.pp37.pp38-none-any.whl", hash = "sha256:463e52616ea687fd323888e86bf25e864a3cc6335a043fad6bbb037dbf49bbe2"}, + {file = "coverage-6.3.1.tar.gz", hash = "sha256:6c3f6158b02ac403868eea390930ae64e9a9a2a5bbfafefbb920d29258d9f2f8"}, +] +crontab = [ + {file = "crontab-0.23.0.tar.gz", hash = "sha256:ca79dede9c2f572bb32f38703e8fddcf3427e86edc838f2ffe7ae4b9ee2b0733"}, +] +dependency-injector = [ + {file = "dependency-injector-4.38.0.tar.gz", hash = "sha256:bab4c323d822d3fc9936e8eb3c2f5553d75e9efdadac11d5b293a016e31a1477"}, + {file = "dependency_injector-4.38.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:025eb5f97021663715bff8e01feb83d5b2f66fc17ece1042a194f1aae88c0d85"}, + {file = "dependency_injector-4.38.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3c61334b196ab767eae43af207764349287d5eb0283d8ed1ab24608121aea35"}, + {file = "dependency_injector-4.38.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9bf4bfc52015e81c4f17647b7bbbe4e4549f041b3c6635b44a9ecede7594932c"}, + {file = "dependency_injector-4.38.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7aeba5882b06baf78978f33228e4c44133dada9173e330da68fbccca98520848"}, + {file = "dependency_injector-4.38.0-cp310-cp310-win32.whl", hash = "sha256:445dbf5324eee215a465d7f3b1965b05e199c31caa09e63abf0f02d982791306"}, + {file = "dependency_injector-4.38.0-cp310-cp310-win_amd64.whl", hash = "sha256:880edbcb5d810faa0623112e2e652a7bec73d20ce0708d9db998a0a40b62cbb9"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cd6f1c130462e7461a43f82fdc0d2ba25b5ef594db823dbd0e57f3d1b7c44f86"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be75905f7513886699d3ff5ed9aca233175c03808fc888da2a53b83af0a5d65"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d7f1a7d27de6295ce8b7ca69d1177817bf36c7cbaf73819e4bab04f87c5e962"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e9c1ff387d7b7d814e9d29a531c6804acc67b1cca578c09abd3590fa7ec6bf06"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-win32.whl", hash = "sha256:7770efcbc6915dabbb31ea0bdeee1105dabf76e1c8e31a454cb1983dcf19ecf1"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-win_amd64.whl", hash = "sha256:9e89a9c88317ad237abfb374c410e1466476ffefe6c44f3caeca3dce747a635c"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cb75cd29c132bfaf03a11a6ac4f459dddb7a6526669543de57d2bb5fddf78def"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d116c56e7fc3b59b3afa6078163b5f6ff4680ebf27800dd4032de7a04f7ef777"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9df330ef9e24b6f94e6764d23180350c2fb99785257233ee4738e066b876fa7f"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7a46639038313f64eca2dc858ac4cd9e0aca5ea21bb005f5d754aadd6446ba4b"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-win32.whl", hash = "sha256:d0d983b269b657744058b5858afc3c59443db53afe9c3e709e316daa9f9b9454"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1446df58169c166a5a2d5644ba9eeb3b7f2f679f260596f78d012c58ff140d92"}, + {file = "dependency_injector-4.38.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:307396f2d9d2f532fe92079a56d40af5fc60dacb1d766e3f9cd04c3802a1c251"}, + {file = "dependency_injector-4.38.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dd96b6c454ab86648f57f37b895c1c976b1a82b76f835011f607ee8a78ebc0e"}, + {file = "dependency_injector-4.38.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fb44b17e649cabcfd1f370ecfd492ac7a93216776d91954b31598eecb36cdb13"}, + {file = "dependency_injector-4.38.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ab8ebe728dd9b3be23c40ca5a5dbe195050d9ad35d42d7e9fdaea816f7134584"}, + {file = "dependency_injector-4.38.0-cp38-cp38-win32.whl", hash = "sha256:1da3bad1452212bab76e87fbf7a71d3675190a1a909f345aaf8bae2fa97b878f"}, + {file = "dependency_injector-4.38.0-cp38-cp38-win_amd64.whl", hash = "sha256:2918776e88de88be0e2be036261180ca0605c8f64ead43d835ce852f16a9efd2"}, + {file = "dependency_injector-4.38.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:493be62561218624380d4eca9243a46753444f677217db6292a7b715cf429172"}, + {file = "dependency_injector-4.38.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a70511db88f84ac4228b27e37e12ea0e04a9c2a32cae3602b9af9a27c0db992"}, + {file = "dependency_injector-4.38.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e3e1cfe41a5ada0ff71889563441f538caff0399e41d3ee377b60fa50a858bf"}, + {file = "dependency_injector-4.38.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:116cc679a2c6d40c6a4f968aefe68535e596e88e96315dbd0d0ad2ff76654e3d"}, + {file = "dependency_injector-4.38.0-cp39-cp39-win32.whl", hash = "sha256:f703c2c161de067ba9893b56743d24fb4c9dbff92eb504bc082c2d2cfeab4c01"}, + {file = "dependency_injector-4.38.0-cp39-cp39-win_amd64.whl", hash = "sha256:6821a864d6405dc0d5f794ac1b10da4a8c7e8731c6a0651a9682a0b76f5a5b3e"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6c9e8dc91aa5831bd3a58fec1b94ed8c52f78f601f5ab91135b5ad44325beef7"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b4eedadef0c84295b70803a79a3ce5a10a59dddd8f306876f6fa6bfc4de8e00"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2e88b5d09c80e20d6b3d985cc360f39a81e748667c20f6bc7eee9f4b832176ed"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b1fcd71ff46e097f4e47917ccdf6aa388b6a6372557f7d9f83db1e879e95f8bb"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:9633d6366282e83a3f21543c5c78299787948333d9fe6649b020cfac93d8b7ca"}, +] +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"}, +] +fastavro = [ + {file = "fastavro-1.4.9-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:2e64a77c529b638e89a879ff0211debfab5b2d114c26a2af29c81f6b013f395a"}, + {file = "fastavro-1.4.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fc9c95b7c1d59c5a2d29be21075870a122152cf927d84587dafc96da6b2ac3d"}, + {file = "fastavro-1.4.9-cp310-cp310-win_amd64.whl", hash = "sha256:927fd6148a8dd9646c129c0a0e8571aea829abc3cba04a3d5a4010a866934f4c"}, + {file = "fastavro-1.4.9-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:000b70c5109a61bdbfddeb2821a506de8f5333f243c608cbced61d44657d6c2f"}, + {file = "fastavro-1.4.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37a77a1b5347a06416e236c77027c750aaeda29ef8189aa456eb2a2571274b43"}, + {file = "fastavro-1.4.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce2c7747ce958115388872db0756d3eeb0d796084eea9b46dc3758ef32c4d952"}, + {file = "fastavro-1.4.9-cp37-cp37m-win_amd64.whl", hash = "sha256:d6ccb77604903a0308316e696bb65a8943361af5f757d10985689656c9bce6ed"}, + {file = "fastavro-1.4.9-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:9a6ada2d6e133a2319438248c2e023b6735747b249c5a79d5f08f9d431e5d226"}, + {file = "fastavro-1.4.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7537e4df7782b03b9761e9338cef9fc7bfcc41100ab93c36c5c60fa568e724a"}, + {file = "fastavro-1.4.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a9cd6d8471beb4020b4126fd04150ed7295f74ae7234d0dc9205b55c193851e"}, + {file = "fastavro-1.4.9-cp38-cp38-win_amd64.whl", hash = "sha256:fa9d8b47e0533c84152332ad491bb63bbae76a8a7a0df1caa821e0cbebf0fb70"}, + {file = "fastavro-1.4.9-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:3759bdc77009ee1e2e76fc9f58b951c05c00a8600ef9ddbff59fee3cb0c9e235"}, + {file = "fastavro-1.4.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b98ef2bdb123b95945aa6d69d6a7d79f211df3274b2dd7786da7852ddec964d0"}, + {file = "fastavro-1.4.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32b804aa6920d80c0e94e1180d480f28f56c4b901849bd80ed180851752b5ce6"}, + {file = "fastavro-1.4.9-cp39-cp39-win_amd64.whl", hash = "sha256:f9b04acaf06b16218b47985e92d8daa98c1116d58f3cff81a5b3cf39cef9afc0"}, + {file = "fastavro-1.4.9.tar.gz", hash = "sha256:be3fec387eb2cdc9627060b5ae0690542c687dddc951b63fa11203553769ae5e"}, +] +filelock = [ + {file = "filelock-3.4.2-py3-none-any.whl", hash = "sha256:cf0fc6a2f8d26bd900f19bf33915ca70ba4dd8c56903eeb14e1e7a2fd7590146"}, + {file = "filelock-3.4.2.tar.gz", hash = "sha256:38b4f4c989f9d06d44524df1b24bd19e167d851f19b50bf3e3559952dddc5b80"}, +] +flake8 = [ + {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, + {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, +] +frozenlist = [ + {file = "frozenlist-1.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d2257aaba9660f78c7b1d8fea963b68f3feffb1a9d5d05a18401ca9eb3e8d0a3"}, + {file = "frozenlist-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4a44ebbf601d7bac77976d429e9bdb5a4614f9f4027777f9e54fd765196e9d3b"}, + {file = "frozenlist-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:45334234ec30fc4ea677f43171b18a27505bfb2dba9aca4398a62692c0ea8868"}, + {file = "frozenlist-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47be22dc27ed933d55ee55845d34a3e4e9f6fee93039e7f8ebadb0c2f60d403f"}, + {file = "frozenlist-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:03a7dd1bfce30216a3f51a84e6dd0e4a573d23ca50f0346634916ff105ba6e6b"}, + {file = "frozenlist-1.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:691ddf6dc50480ce49f68441f1d16a4c3325887453837036e0fb94736eae1e58"}, + {file = "frozenlist-1.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bde99812f237f79eaf3f04ebffd74f6718bbd216101b35ac7955c2d47c17da02"}, + {file = "frozenlist-1.3.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a202458d1298ced3768f5a7d44301e7c86defac162ace0ab7434c2e961166e8"}, + {file = "frozenlist-1.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b9e3e9e365991f8cc5f5edc1fd65b58b41d0514a6a7ad95ef5c7f34eb49b3d3e"}, + {file = "frozenlist-1.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:04cb491c4b1c051734d41ea2552fde292f5f3a9c911363f74f39c23659c4af78"}, + {file = "frozenlist-1.3.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:436496321dad302b8b27ca955364a439ed1f0999311c393dccb243e451ff66aa"}, + {file = "frozenlist-1.3.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:754728d65f1acc61e0f4df784456106e35afb7bf39cfe37227ab00436fb38676"}, + {file = "frozenlist-1.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6eb275c6385dd72594758cbe96c07cdb9bd6becf84235f4a594bdf21e3596c9d"}, + {file = "frozenlist-1.3.0-cp310-cp310-win32.whl", hash = "sha256:e30b2f9683812eb30cf3f0a8e9f79f8d590a7999f731cf39f9105a7c4a39489d"}, + {file = "frozenlist-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f7353ba3367473d1d616ee727945f439e027f0bb16ac1a750219a8344d1d5d3c"}, + {file = "frozenlist-1.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88aafd445a233dbbf8a65a62bc3249a0acd0d81ab18f6feb461cc5a938610d24"}, + {file = "frozenlist-1.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4406cfabef8f07b3b3af0f50f70938ec06d9f0fc26cbdeaab431cbc3ca3caeaa"}, + {file = "frozenlist-1.3.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8cf829bd2e2956066dd4de43fd8ec881d87842a06708c035b37ef632930505a2"}, + {file = "frozenlist-1.3.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:603b9091bd70fae7be28bdb8aa5c9990f4241aa33abb673390a7f7329296695f"}, + {file = "frozenlist-1.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25af28b560e0c76fa41f550eacb389905633e7ac02d6eb3c09017fa1c8cdfde1"}, + {file = "frozenlist-1.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c7a8a9fc9383b52c410a2ec952521906d355d18fccc927fca52ab575ee8b93"}, + {file = "frozenlist-1.3.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:65bc6e2fece04e2145ab6e3c47428d1bbc05aede61ae365b2c1bddd94906e478"}, + {file = "frozenlist-1.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3f7c935c7b58b0d78c0beea0c7358e165f95f1fd8a7e98baa40d22a05b4a8141"}, + {file = "frozenlist-1.3.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd89acd1b8bb4f31b47072615d72e7f53a948d302b7c1d1455e42622de180eae"}, + {file = "frozenlist-1.3.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:6983a31698490825171be44ffbafeaa930ddf590d3f051e397143a5045513b01"}, + {file = "frozenlist-1.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:adac9700675cf99e3615eb6a0eb5e9f5a4143c7d42c05cea2e7f71c27a3d0846"}, + {file = "frozenlist-1.3.0-cp37-cp37m-win32.whl", hash = "sha256:0c36e78b9509e97042ef869c0e1e6ef6429e55817c12d78245eb915e1cca7468"}, + {file = "frozenlist-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:57f4d3f03a18facacb2a6bcd21bccd011e3b75d463dc49f838fd699d074fabd1"}, + {file = "frozenlist-1.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8c905a5186d77111f02144fab5b849ab524f1e876a1e75205cd1386a9be4b00a"}, + {file = "frozenlist-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b5009062d78a8c6890d50b4e53b0ddda31841b3935c1937e2ed8c1bda1c7fb9d"}, + {file = "frozenlist-1.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2fdc3cd845e5a1f71a0c3518528bfdbfe2efaf9886d6f49eacc5ee4fd9a10953"}, + {file = "frozenlist-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92e650bd09b5dda929523b9f8e7f99b24deac61240ecc1a32aeba487afcd970f"}, + {file = "frozenlist-1.3.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:40dff8962b8eba91fd3848d857203f0bd704b5f1fa2b3fc9af64901a190bba08"}, + {file = "frozenlist-1.3.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:768efd082074bb203c934e83a61654ed4931ef02412c2fbdecea0cff7ecd0274"}, + {file = "frozenlist-1.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:006d3595e7d4108a12025ddf415ae0f6c9e736e726a5db0183326fd191b14c5e"}, + {file = "frozenlist-1.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:871d42623ae15eb0b0e9df65baeee6976b2e161d0ba93155411d58ff27483ad8"}, + {file = "frozenlist-1.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aff388be97ef2677ae185e72dc500d19ecaf31b698986800d3fc4f399a5e30a5"}, + {file = "frozenlist-1.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9f892d6a94ec5c7b785e548e42722e6f3a52f5f32a8461e82ac3e67a3bd073f1"}, + {file = "frozenlist-1.3.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:e982878792c971cbd60ee510c4ee5bf089a8246226dea1f2138aa0bb67aff148"}, + {file = "frozenlist-1.3.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c6c321dd013e8fc20735b92cb4892c115f5cdb82c817b1e5b07f6b95d952b2f0"}, + {file = "frozenlist-1.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:30530930410855c451bea83f7b272fb1c495ed9d5cc72895ac29e91279401db3"}, + {file = "frozenlist-1.3.0-cp38-cp38-win32.whl", hash = "sha256:40ec383bc194accba825fbb7d0ef3dda5736ceab2375462f1d8672d9f6b68d07"}, + {file = "frozenlist-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:f20baa05eaa2bcd5404c445ec51aed1c268d62600362dc6cfe04fae34a424bd9"}, + {file = "frozenlist-1.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0437fe763fb5d4adad1756050cbf855bbb2bf0d9385c7bb13d7a10b0dd550486"}, + {file = "frozenlist-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b684c68077b84522b5c7eafc1dc735bfa5b341fb011d5552ebe0968e22ed641c"}, + {file = "frozenlist-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93641a51f89473837333b2f8100f3f89795295b858cd4c7d4a1f18e299dc0a4f"}, + {file = "frozenlist-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6d32ff213aef0fd0bcf803bffe15cfa2d4fde237d1d4838e62aec242a8362fa"}, + {file = "frozenlist-1.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31977f84828b5bb856ca1eb07bf7e3a34f33a5cddce981d880240ba06639b94d"}, + {file = "frozenlist-1.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c62964192a1c0c30b49f403495911298810bada64e4f03249ca35a33ca0417a"}, + {file = "frozenlist-1.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4eda49bea3602812518765810af732229b4291d2695ed24a0a20e098c45a707b"}, + {file = "frozenlist-1.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acb267b09a509c1df5a4ca04140da96016f40d2ed183cdc356d237286c971b51"}, + {file = "frozenlist-1.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e1e26ac0a253a2907d654a37e390904426d5ae5483150ce3adedb35c8c06614a"}, + {file = "frozenlist-1.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f96293d6f982c58ebebb428c50163d010c2f05de0cde99fd681bfdc18d4b2dc2"}, + {file = "frozenlist-1.3.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e84cb61b0ac40a0c3e0e8b79c575161c5300d1d89e13c0e02f76193982f066ed"}, + {file = "frozenlist-1.3.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:ff9310f05b9d9c5c4dd472983dc956901ee6cb2c3ec1ab116ecdde25f3ce4951"}, + {file = "frozenlist-1.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d26b650b71fdc88065b7a21f8ace70175bcf3b5bdba5ea22df4bfd893e795a3b"}, + {file = "frozenlist-1.3.0-cp39-cp39-win32.whl", hash = "sha256:01a73627448b1f2145bddb6e6c2259988bb8aee0fb361776ff8604b99616cd08"}, + {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.7-py2.py3-none-any.whl", hash = "sha256:e64210654dfbca6ced33230eb1b137591a0981425e1a60b4c6c36309f787bbd5"}, + {file = "identify-2.4.7.tar.gz", hash = "sha256:8408f01e0be25492017346d7dffe7e7711b762b23375c775d24d3bc38618fabc"}, +] +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.10.1-py3-none-any.whl", hash = "sha256:899e2a40a8c4a1aec681feef45733de8a6c58f3f6a0dbed2eb6574b4387a77b6"}, + {file = "importlib_metadata-4.10.1.tar.gz", hash = "sha256:951f0d8a5b7260e9db5e41d429285b5f451e928479f19d80818878527d36e95e"}, +] +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"}, +] +jinja2 = [ + {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"}, + {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"}, +] +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.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, + {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, +] +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"}, + {file = "multidict-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:041b81a5f6b38244b34dc18c7b6aba91f9cdaf854d9a39e5ff0b58e2b5773b9c"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fdda29a3c7e76a064f2477c9aab1ba96fd94e02e386f1e665bca1807fc5386f"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3368bf2398b0e0fcbf46d85795adc4c259299fec50c1416d0f77c0a843a3eed9"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4f052ee022928d34fe1f4d2bc743f32609fb79ed9c49a1710a5ad6b2198db20"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:225383a6603c086e6cef0f2f05564acb4f4d5f019a4e3e983f572b8530f70c88"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50bd442726e288e884f7be9071016c15a8742eb689a593a0cac49ea093eef0a7"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:47e6a7e923e9cada7c139531feac59448f1f47727a79076c0b1ee80274cd8eee"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0556a1d4ea2d949efe5fd76a09b4a82e3a4a30700553a6725535098d8d9fb672"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:626fe10ac87851f4cffecee161fc6f8f9853f0f6f1035b59337a51d29ff3b4f9"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:8064b7c6f0af936a741ea1efd18690bacfbae4078c0c385d7c3f611d11f0cf87"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2d36e929d7f6a16d4eb11b250719c39560dd70545356365b494249e2186bc389"}, + {file = "multidict-6.0.2-cp310-cp310-win32.whl", hash = "sha256:fcb91630817aa8b9bc4a74023e4198480587269c272c58b3279875ed7235c293"}, + {file = "multidict-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:8cbf0132f3de7cc6c6ce00147cc78e6439ea736cee6bca4f068bcf892b0fd658"}, + {file = "multidict-6.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:05f6949d6169878a03e607a21e3b862eaf8e356590e8bdae4227eedadacf6e51"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2c2e459f7050aeb7c1b1276763364884595d47000c1cddb51764c0d8976e608"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0509e469d48940147e1235d994cd849a8f8195e0bca65f8f5439c56e17872a3"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:514fe2b8d750d6cdb4712346a2c5084a80220821a3e91f3f71eec11cf8d28fd4"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19adcfc2a7197cdc3987044e3f415168fc5dc1f720c932eb1ef4f71a2067e08b"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9d153e7f1f9ba0b23ad1568b3b9e17301e23b042c23870f9ee0522dc5cc79e8"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:aef9cc3d9c7d63d924adac329c33835e0243b5052a6dfcbf7732a921c6e918ba"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4571f1beddff25f3e925eea34268422622963cd8dc395bb8778eb28418248e43"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:d48b8ee1d4068561ce8033d2c344cf5232cb29ee1a0206a7b828c79cbc5982b8"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:45183c96ddf61bf96d2684d9fbaf6f3564d86b34cb125761f9a0ef9e36c1d55b"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:75bdf08716edde767b09e76829db8c1e5ca9d8bb0a8d4bd94ae1eafe3dac5e15"}, + {file = "multidict-6.0.2-cp37-cp37m-win32.whl", hash = "sha256:a45e1135cb07086833ce969555df39149680e5471c04dfd6a915abd2fc3f6dbc"}, + {file = "multidict-6.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6f3cdef8a247d1eafa649085812f8a310e728bdf3900ff6c434eafb2d443b23a"}, + {file = "multidict-6.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0327292e745a880459ef71be14e709aaea2f783f3537588fb4ed09b6c01bca60"}, + {file = "multidict-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e875b6086e325bab7e680e4316d667fc0e5e174bb5611eb16b3ea121c8951b86"}, + {file = "multidict-6.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:feea820722e69451743a3d56ad74948b68bf456984d63c1a92e8347b7b88452d"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc57c68cb9139c7cd6fc39f211b02198e69fb90ce4bc4a094cf5fe0d20fd8b0"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:497988d6b6ec6ed6f87030ec03280b696ca47dbf0648045e4e1d28b80346560d"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:89171b2c769e03a953d5969b2f272efa931426355b6c0cb508022976a17fd376"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:684133b1e1fe91eda8fa7447f137c9490a064c6b7f392aa857bba83a28cfb693"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd9fc9c4849a07f3635ccffa895d57abce554b467d611a5009ba4f39b78a8849"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e07c8e79d6e6fd37b42f3250dba122053fddb319e84b55dd3a8d6446e1a7ee49"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4070613ea2227da2bfb2c35a6041e4371b0af6b0be57f424fe2318b42a748516"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:47fbeedbf94bed6547d3aa632075d804867a352d86688c04e606971595460227"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5774d9218d77befa7b70d836004a768fb9aa4fdb53c97498f4d8d3f67bb9cfa9"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2957489cba47c2539a8eb7ab32ff49101439ccf78eab724c828c1a54ff3ff98d"}, + {file = "multidict-6.0.2-cp38-cp38-win32.whl", hash = "sha256:e5b20e9599ba74391ca0cfbd7b328fcc20976823ba19bc573983a25b32e92b57"}, + {file = "multidict-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:8004dca28e15b86d1b1372515f32eb6f814bdf6f00952699bdeb541691091f96"}, + {file = "multidict-6.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2e4a0785b84fb59e43c18a015ffc575ba93f7d1dbd272b4cdad9f5134b8a006c"}, + {file = "multidict-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6701bf8a5d03a43375909ac91b6980aea74b0f5402fbe9428fc3f6edf5d9677e"}, + {file = "multidict-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a007b1638e148c3cfb6bf0bdc4f82776cef0ac487191d093cdc316905e504071"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07a017cfa00c9890011628eab2503bee5872f27144936a52eaab449be5eaf032"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c207fff63adcdf5a485969131dc70e4b194327666b7e8a87a97fbc4fd80a53b2"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:373ba9d1d061c76462d74e7de1c0c8e267e9791ee8cfefcf6b0b2495762c370c"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfba7c6d5d7c9099ba21f84662b037a0ffd4a5e6b26ac07d19e423e6fdf965a9"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19d9bad105dfb34eb539c97b132057a4e709919ec4dd883ece5838bcbf262b80"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:de989b195c3d636ba000ee4281cd03bb1234635b124bf4cd89eeee9ca8fcb09d"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7c40b7bbece294ae3a87c1bc2abff0ff9beef41d14188cda94ada7bcea99b0fb"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:d16cce709ebfadc91278a1c005e3c17dd5f71f5098bfae1035149785ea6e9c68"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:a2c34a93e1d2aa35fbf1485e5010337c72c6791407d03aa5f4eed920343dd360"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:feba80698173761cddd814fa22e88b0661e98cb810f9f986c54aa34d281e4937"}, + {file = "multidict-6.0.2-cp39-cp39-win32.whl", hash = "sha256:23b616fdc3c74c9fe01d76ce0d1ce872d2d396d8fa8e4899398ad64fb5aa214a"}, + {file = "multidict-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:4bae31803d708f6f15fd98be6a6ac0b6958fcf68fda3c77a048a4f9073704aae"}, + {file = "multidict-6.0.2.tar.gz", hash = "sha256:5ff3bd75f38e4c43f1f470f2df7a4d430b821c4ce22be384e1459cb57d6bb013"}, +] +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.6-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:e4a7cad6c63306318453980d302c7c0b74c0cc290dd1f433bbd7d31a5af90cf1"}, + {file = "orjson-3.6.6-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:e533941dca4a0530a876de32e54bf2fd3269cdec3751aebde7bfb5b5eba98e74"}, + {file = "orjson-3.6.6-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:9adf63be386eaa34278967512b83ff8fc4bed036a246391ae236f68d23c47452"}, + {file = "orjson-3.6.6-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:3b636753ae34d4619b11ea7d664a2f1e87e55e9738e5123e12bcce22acae9d13"}, + {file = "orjson-3.6.6-cp310-none-win_amd64.whl", hash = "sha256:78a10295ed048fd916c6584d6d27c232eae805a43e7c14be56e3745f784f0eb6"}, + {file = "orjson-3.6.6-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:82b4f9fb2af7799b52932a62eac484083f930d5519560d6f64b24d66a368d03f"}, + {file = "orjson-3.6.6-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:a0033d07309cc7d8b8c4bc5d42f0dd4422b53ceb91dee9f4086bb2afa70b7772"}, + {file = "orjson-3.6.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b321f99473116ab7c7c028377372f7b4adba4029aaca19cd567e83898f55579"}, + {file = "orjson-3.6.6-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:b9c98ed94f1688cc11b5c61b8eea39d854a1a2f09f71d8a5af005461b14994ed"}, + {file = "orjson-3.6.6-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:00b333a41392bd07a8603c42670547dbedf9b291485d773f90c6470eff435608"}, + {file = "orjson-3.6.6-cp37-none-win_amd64.whl", hash = "sha256:8d4fd3bdee65a81f2b79c50937d4b3c054e1e6bfa3fc72ed018a97c0c7c3d521"}, + {file = "orjson-3.6.6-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:954c9f8547247cd7a8c91094ff39c9fe314b5eaeaec90b7bfb7384a4108f416f"}, + {file = "orjson-3.6.6-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:74e5aed657ed0b91ef05d44d6a26d3e3e12ce4d2d71f75df41a477b05878c4a9"}, + {file = "orjson-3.6.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4008a5130e6e9c33abaa95e939e0e755175da10745740aa6968461b2f16830e2"}, + {file = "orjson-3.6.6-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:012761d5f3d186deb4f6238f15e9ea7c1aac6deebc8f5b741ba3b4fafe017460"}, + {file = "orjson-3.6.6-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:b464546718a940b48d095a98df4c04808bfa6c8706fe751fc3f9390bc2f82643"}, + {file = "orjson-3.6.6-cp38-none-win_amd64.whl", hash = "sha256:f10a800f4e5a4aab52076d4628e9e4dab9370bdd9d8ea254ebfde846b653ab25"}, + {file = "orjson-3.6.6-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:8010d2610cfab721725ef14d578c7071e946bbdae63322d8f7b49061cf3fde8d"}, + {file = "orjson-3.6.6-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:8dca67a4855e1e0f9a2ea0386e8db892708522e1171dc0ddf456932288fbae63"}, + {file = "orjson-3.6.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af065d60523139b99bd35b839c7a2d8c5da55df8a8c4402d2eb6cdc07fa7a624"}, + {file = "orjson-3.6.6-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:fa1f389cc9f766ae0cf7ba3533d5089836b01a5ccb3f8d904297f1fcf3d9dc34"}, + {file = "orjson-3.6.6-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:ec1221ad78f94d27b162a1d35672b62ef86f27f0e4c2b65051edb480cc86b286"}, + {file = "orjson-3.6.6-cp39-none-win_amd64.whl", hash = "sha256:afed2af55eeda1de6b3f1cbc93431981b19d380fcc04f6ed86e74c1913070304"}, + {file = "orjson-3.6.6.tar.gz", hash = "sha256:55dd988400fa7fbe0e31407c683f5aaab013b5bd967167b8fe058186773c4d6c"}, +] +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"}, +] +pbr = [ + {file = "pbr-5.8.0-py2.py3-none-any.whl", hash = "sha256:176e8560eaf61e127817ef93d8a844803abb27a4d4637f0ff3bb783129be2e0a"}, + {file = "pbr-5.8.0.tar.gz", hash = "sha256:672d8ebee84921862110f23fcec2acea191ef58543d34dfe9ef3d9f13c31cddf"}, +] +platformdirs = [ + {file = "platformdirs-2.4.1-py3-none-any.whl", hash = "sha256:1d7385c7db91728b83efd0ca99a5afb296cab9d0ed8313a45ed8ba17967ecfca"}, + {file = "platformdirs-2.4.1.tar.gz", hash = "sha256:440633ddfebcc36264232365d7840a970e75e1018d15b4327d11f91909045fda"}, +] +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"}, +] +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"}, +] +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"}, +] +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-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, + {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, +] +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"}, +] +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.4.0-py3-none-any.whl", hash = "sha256:5da895959511473857b6d0200f56865ed62c31e8f82dd338063b84ec022701fe"}, + {file = "Sphinx-4.4.0.tar.gz", hash = "sha256:6caad9786055cb1fa22b4a365c1775816b876f91966481765d7d50e9f0dd35cc"}, +] +sphinx-autodoc-typehints = [ + {file = "sphinx_autodoc_typehints-1.16.0-py3-none-any.whl", hash = "sha256:b5efe1fb5754349f849ca09b1f5c9b4bb37f1e360f00fbde003b12c60d67cc3a"}, + {file = "sphinx_autodoc_typehints-1.16.0.tar.gz", hash = "sha256:21df6ee692c2c8366f6df13b13e4d4ab8af25cc0dfb65e2d182351528b6eb704"}, +] +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.0-py3-none-any.whl", hash = "sha256:b5bde28da1fed24b9bd1d4d2b8cba62300bfb4ec9a6187a957e8ddb9434c5224"}, + {file = "tomli-2.0.0.tar.gz", hash = "sha256:c292c34f58502a1eb2bbb9f5bbc9a5ebc37bee10ffb8c2d6bbdfa8eb13cc14e1"}, +] +typing-extensions = [ + {file = "typing_extensions-4.0.1-py3-none-any.whl", hash = "sha256:7f001e5ac290a0c0401508864c7ec868be4e701886d5b573a9528ed3973d9d3b"}, + {file = "typing_extensions-4.0.1.tar.gz", hash = "sha256:4ca091dea149f945ec56afb48dae714f21e8692ef22a395223bcd328961b6a0e"}, +] +urllib3 = [ + {file = "urllib3-1.26.8-py2.py3-none-any.whl", hash = "sha256:000ca7f471a233c2251c6c7023ee85305721bfdf18621ebff4fd17a8653427ed"}, + {file = "urllib3-1.26.8.tar.gz", hash = "sha256:0e7c33d9a63e7ddfcb86780aac87befc2fbddf46c58dbb487e0855f7ceec283c"}, +] +virtualenv = [ + {file = "virtualenv-20.13.0-py2.py3-none-any.whl", hash = "sha256:339f16c4a86b44240ba7223d0f93a7887c3ca04b5f9c8129da7958447d079b09"}, + {file = "virtualenv-20.13.0.tar.gz", hash = "sha256:d8458cf8d59d0ea495ad9b34c2599487f8a7772d796f9910858376d1600dd2dd"}, +] +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"}, + {file = "yarl-1.7.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1d0894f238763717bdcfea74558c94e3bc34aeacd3351d769460c1a586a8b05"}, + {file = "yarl-1.7.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfe4b95b7e00c6635a72e2d00b478e8a28bfb122dc76349a06e20792eb53a523"}, + {file = "yarl-1.7.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c145ab54702334c42237a6c6c4cc08703b6aa9b94e2f227ceb3d477d20c36c63"}, + {file = "yarl-1.7.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ca56f002eaf7998b5fcf73b2421790da9d2586331805f38acd9997743114e98"}, + {file = "yarl-1.7.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1d3d5ad8ea96bd6d643d80c7b8d5977b4e2fb1bab6c9da7322616fd26203d125"}, + {file = "yarl-1.7.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:167ab7f64e409e9bdd99333fe8c67b5574a1f0495dcfd905bc7454e766729b9e"}, + {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:95a1873b6c0dd1c437fb3bb4a4aaa699a48c218ac7ca1e74b0bee0ab16c7d60d"}, + {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6152224d0a1eb254f97df3997d79dadd8bb2c1a02ef283dbb34b97d4f8492d23"}, + {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:5bb7d54b8f61ba6eee541fba4b83d22b8a046b4ef4d8eb7f15a7e35db2e1e245"}, + {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:9c1f083e7e71b2dd01f7cd7434a5f88c15213194df38bc29b388ccdf1492b739"}, + {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f44477ae29025d8ea87ec308539f95963ffdc31a82f42ca9deecf2d505242e72"}, + {file = "yarl-1.7.2-cp310-cp310-win32.whl", hash = "sha256:cff3ba513db55cc6a35076f32c4cdc27032bd075c9faef31fec749e64b45d26c"}, + {file = "yarl-1.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:c9c6d927e098c2d360695f2e9d38870b2e92e0919be07dbe339aefa32a090265"}, + {file = "yarl-1.7.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9b4c77d92d56a4c5027572752aa35082e40c561eec776048330d2907aead891d"}, + {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c01a89a44bb672c38f42b49cdb0ad667b116d731b3f4c896f72302ff77d71656"}, + {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c19324a1c5399b602f3b6e7db9478e5b1adf5cf58901996fc973fe4fccd73eed"}, + {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3abddf0b8e41445426d29f955b24aeecc83fa1072be1be4e0d194134a7d9baee"}, + {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6a1a9fe17621af43e9b9fcea8bd088ba682c8192d744b386ee3c47b56eaabb2c"}, + {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8b0915ee85150963a9504c10de4e4729ae700af11df0dc5550e6587ed7891e92"}, + {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:29e0656d5497733dcddc21797da5a2ab990c0cb9719f1f969e58a4abac66234d"}, + {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:bf19725fec28452474d9887a128e98dd67eee7b7d52e932e6949c532d820dc3b"}, + {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:d6f3d62e16c10e88d2168ba2d065aa374e3c538998ed04996cd373ff2036d64c"}, + {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ac10bbac36cd89eac19f4e51c032ba6b412b3892b685076f4acd2de18ca990aa"}, + {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:aa32aaa97d8b2ed4e54dc65d241a0da1c627454950f7d7b1f95b13985afd6c5d"}, + {file = "yarl-1.7.2-cp36-cp36m-win32.whl", hash = "sha256:87f6e082bce21464857ba58b569370e7b547d239ca22248be68ea5d6b51464a1"}, + {file = "yarl-1.7.2-cp36-cp36m-win_amd64.whl", hash = "sha256:ac35ccde589ab6a1870a484ed136d49a26bcd06b6a1c6397b1967ca13ceb3913"}, + {file = "yarl-1.7.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a467a431a0817a292121c13cbe637348b546e6ef47ca14a790aa2fa8cc93df63"}, + {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ab0c3274d0a846840bf6c27d2c60ba771a12e4d7586bf550eefc2df0b56b3b4"}, + {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d260d4dc495c05d6600264a197d9d6f7fc9347f21d2594926202fd08cf89a8ba"}, + {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fc4dd8b01a8112809e6b636b00f487846956402834a7fd59d46d4f4267181c41"}, + {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c1164a2eac148d85bbdd23e07dfcc930f2e633220f3eb3c3e2a25f6148c2819e"}, + {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:67e94028817defe5e705079b10a8438b8cb56e7115fa01640e9c0bb3edf67332"}, + {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:89ccbf58e6a0ab89d487c92a490cb5660d06c3a47ca08872859672f9c511fc52"}, + {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:8cce6f9fa3df25f55521fbb5c7e4a736683148bcc0c75b21863789e5185f9185"}, + {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:211fcd65c58bf250fb994b53bc45a442ddc9f441f6fec53e65de8cba48ded986"}, + {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c10ea1e80a697cf7d80d1ed414b5cb8f1eec07d618f54637067ae3c0334133c4"}, + {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:52690eb521d690ab041c3919666bea13ab9fbff80d615ec16fa81a297131276b"}, + {file = "yarl-1.7.2-cp37-cp37m-win32.whl", hash = "sha256:695ba021a9e04418507fa930d5f0704edbce47076bdcfeeaba1c83683e5649d1"}, + {file = "yarl-1.7.2-cp37-cp37m-win_amd64.whl", hash = "sha256:c17965ff3706beedafd458c452bf15bac693ecd146a60a06a214614dc097a271"}, + {file = "yarl-1.7.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fce78593346c014d0d986b7ebc80d782b7f5e19843ca798ed62f8e3ba8728576"}, + {file = "yarl-1.7.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c2a1ac41a6aa980db03d098a5531f13985edcb451bcd9d00670b03129922cd0d"}, + {file = "yarl-1.7.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:39d5493c5ecd75c8093fa7700a2fb5c94fe28c839c8e40144b7ab7ccba6938c8"}, + {file = "yarl-1.7.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1eb6480ef366d75b54c68164094a6a560c247370a68c02dddb11f20c4c6d3c9d"}, + {file = "yarl-1.7.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ba63585a89c9885f18331a55d25fe81dc2d82b71311ff8bd378fc8004202ff6"}, + {file = "yarl-1.7.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e39378894ee6ae9f555ae2de332d513a5763276a9265f8e7cbaeb1b1ee74623a"}, + {file = "yarl-1.7.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c0910c6b6c31359d2f6184828888c983d54d09d581a4a23547a35f1d0b9484b1"}, + {file = "yarl-1.7.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6feca8b6bfb9eef6ee057628e71e1734caf520a907b6ec0d62839e8293e945c0"}, + {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8300401dc88cad23f5b4e4c1226f44a5aa696436a4026e456fe0e5d2f7f486e6"}, + {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:788713c2896f426a4e166b11f4ec538b5736294ebf7d5f654ae445fd44270832"}, + {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fd547ec596d90c8676e369dd8a581a21227fe9b4ad37d0dc7feb4ccf544c2d59"}, + {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:737e401cd0c493f7e3dd4db72aca11cfe069531c9761b8ea474926936b3c57c8"}, + {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baf81561f2972fb895e7844882898bda1eef4b07b5b385bcd308d2098f1a767b"}, + {file = "yarl-1.7.2-cp38-cp38-win32.whl", hash = "sha256:ede3b46cdb719c794427dcce9d8beb4abe8b9aa1e97526cc20de9bd6583ad1ef"}, + {file = "yarl-1.7.2-cp38-cp38-win_amd64.whl", hash = "sha256:cc8b7a7254c0fc3187d43d6cb54b5032d2365efd1df0cd1749c0c4df5f0ad45f"}, + {file = "yarl-1.7.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:580c1f15500e137a8c37053e4cbf6058944d4c114701fa59944607505c2fe3a0"}, + {file = "yarl-1.7.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3ec1d9a0d7780416e657f1e405ba35ec1ba453a4f1511eb8b9fbab81cb8b3ce1"}, + {file = "yarl-1.7.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3bf8cfe8856708ede6a73907bf0501f2dc4e104085e070a41f5d88e7faf237f3"}, + {file = "yarl-1.7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1be4bbb3d27a4e9aa5f3df2ab61e3701ce8fcbd3e9846dbce7c033a7e8136746"}, + {file = "yarl-1.7.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:534b047277a9a19d858cde163aba93f3e1677d5acd92f7d10ace419d478540de"}, + {file = "yarl-1.7.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6ddcd80d79c96eb19c354d9dca95291589c5954099836b7c8d29278a7ec0bda"}, + {file = "yarl-1.7.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9bfcd43c65fbb339dc7086b5315750efa42a34eefad0256ba114cd8ad3896f4b"}, + {file = "yarl-1.7.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f64394bd7ceef1237cc604b5a89bf748c95982a84bcd3c4bbeb40f685c810794"}, + {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044daf3012e43d4b3538562da94a88fb12a6490652dbc29fb19adfa02cf72eac"}, + {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:368bcf400247318382cc150aaa632582d0780b28ee6053cd80268c7e72796dec"}, + {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:bab827163113177aee910adb1f48ff7af31ee0289f434f7e22d10baf624a6dfe"}, + {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0cba38120db72123db7c58322fa69e3c0efa933040ffb586c3a87c063ec7cae8"}, + {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:59218fef177296451b23214c91ea3aba7858b4ae3306dde120224cfe0f7a6ee8"}, + {file = "yarl-1.7.2-cp39-cp39-win32.whl", hash = "sha256:1edc172dcca3f11b38a9d5c7505c83c1913c0addc99cd28e993efeaafdfaa18d"}, + {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-kafka/poetry.toml b/packages/plugins/minos-broker-kafka/poetry.toml new file mode 100644 index 000000000..ab1033bd3 --- /dev/null +++ b/packages/plugins/minos-broker-kafka/poetry.toml @@ -0,0 +1,2 @@ +[virtualenvs] +in-project = true diff --git a/packages/plugins/minos-broker-kafka/pyproject.toml b/packages/plugins/minos-broker-kafka/pyproject.toml new file mode 100644 index 000000000..699c59a66 --- /dev/null +++ b/packages/plugins/minos-broker-kafka/pyproject.toml @@ -0,0 +1,55 @@ +[tool.poetry] +name = "minos-broker-kafka" +version = "0.5.0" +description = "The kafka plugin of the Minos Framework" +readme = "README.md" +repository = "https://github.com/minos-framework/minos-python" +homepage = "http://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 = [ + "AUTHORS.md", + "HISTORY.md", + "LICENSE", +] + +[tool.poetry.dependencies] +python = "^3.9" +minos-microservice-common = "^0.4.0" +minos-microservice-networks = "^0.4.0" +aiokafka = "^0.7.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" +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"] +build-backend = "poetry.core.masonry.api" diff --git a/packages/plugins/minos-broker-kafka/setup.cfg b/packages/plugins/minos-broker-kafka/setup.cfg new file mode 100644 index 000000000..dbb9ac849 --- /dev/null +++ b/packages/plugins/minos-broker-kafka/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-broker-kafka/tests/__init__.py b/packages/plugins/minos-broker-kafka/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/plugins/minos-broker-kafka/tests/docker-compose.yml b/packages/plugins/minos-broker-kafka/tests/docker-compose.yml new file mode 100644 index 000000000..6a38c18c8 --- /dev/null +++ b/packages/plugins/minos-broker-kafka/tests/docker-compose.yml @@ -0,0 +1,28 @@ +version: '2' +services: + postgres: + image: postgres:alpine + network_mode: host + environment: + POSTGRES_USER: minos + POSTGRES_PASSWORD: min0s + POSTGRES_DB: order_db + + zookeeper: + image: wurstmeister/zookeeper:latest + ports: + - "2181:2181" + + kafka: + image: wurstmeister/kafka:latest + ports: + - "9092:9092" + depends_on: + - zookeeper + environment: + KAFKA_ADVERTISED_HOST_NAME: kafka + KAFKA_ADVERTISED_PORT: 9092 + KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 + KAFKA_DELETE_TOPIC_ENABLE: "true" + volumes: + - /var/run/docker.sock:/var/run/docker.sock diff --git a/packages/plugins/minos-broker-kafka/tests/test_config.yml b/packages/plugins/minos-broker-kafka/tests/test_config.yml new file mode 100644 index 000000000..167e46a0c --- /dev/null +++ b/packages/plugins/minos-broker-kafka/tests/test_config.yml @@ -0,0 +1,39 @@ +service: + name: Order + aggregate: tests.utils.Order +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: 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.MinosDiscoveryClient + host: discovery-service + port: 8080 diff --git a/packages/plugins/minos-broker-kafka/tests/test_kafka/__init__.py b/packages/plugins/minos-broker-kafka/tests/test_kafka/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_publishers/test_kafka.py b/packages/plugins/minos-broker-kafka/tests/test_kafka/test_publisher.py similarity index 67% rename from packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_publishers/test_kafka.py rename to packages/plugins/minos-broker-kafka/tests/test_kafka/test_publisher.py index 0de33b9e6..45f527d04 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_publishers/test_kafka.py +++ b/packages/plugins/minos-broker-kafka/tests/test_kafka/test_publisher.py @@ -15,7 +15,13 @@ BrokerMessageV1, BrokerMessageV1Payload, BrokerPublisher, + InMemoryBrokerPublisherQueue, + PostgreSqlBrokerPublisherQueue, +) +from minos.plugins.kafka import ( + InMemoryQueuedKafkaBrokerPublisher, KafkaBrokerPublisher, + PostgreSqlQueuedKafkaBrokerPublisher, ) from tests.utils import ( CONFIG_FILE_PATH, @@ -69,5 +75,21 @@ async def test_setup_destroy(self): self.assertEqual(1, stop_mock.call_count) +class TestPostgreSqlQueuedKafkaBrokerPublisher(unittest.IsolatedAsyncioTestCase): + def test_from_config(self): + 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): + 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/core/minos-microservice-networks/tests/test_networks/test_brokers/test_subscribers/test_kafka.py b/packages/plugins/minos-broker-kafka/tests/test_kafka/test_subscriber.py similarity index 99% rename from packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_subscribers/test_kafka.py rename to packages/plugins/minos-broker-kafka/tests/test_kafka/test_subscriber.py index 7d8f066d0..df9010629 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_brokers/test_subscribers/test_kafka.py +++ b/packages/plugins/minos-broker-kafka/tests/test_kafka/test_subscriber.py @@ -22,12 +22,14 @@ BrokerMessageV1Payload, BrokerSubscriber, InMemoryBrokerSubscriberQueue, + PostgreSqlBrokerSubscriberQueue, + QueuedBrokerSubscriber, +) +from minos.plugins.kafka import ( InMemoryQueuedKafkaBrokerSubscriberBuilder, KafkaBrokerSubscriber, KafkaBrokerSubscriberBuilder, - PostgreSqlBrokerSubscriberQueue, PostgreSqlQueuedKafkaBrokerSubscriberBuilder, - QueuedBrokerSubscriber, ) from tests.utils import ( CONFIG_FILE_PATH, diff --git a/packages/plugins/minos-broker-kafka/tests/utils.py b/packages/plugins/minos-broker-kafka/tests/utils.py new file mode 100644 index 000000000..c816e645f --- /dev/null +++ b/packages/plugins/minos-broker-kafka/tests/utils.py @@ -0,0 +1,6 @@ +from pathlib import ( + Path, +) + +BASE_PATH = Path(__file__).parent +CONFIG_FILE_PATH = BASE_PATH / "test_config.yml" diff --git a/packages/plugins/minos-discovery-minos/AUTHORS.md b/packages/plugins/minos-discovery-minos/AUTHORS.md new file mode 100644 index 000000000..30ff94991 --- /dev/null +++ b/packages/plugins/minos-discovery-minos/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-minos/HISTORY.md b/packages/plugins/minos-discovery-minos/HISTORY.md new file mode 100644 index 000000000..d4ec91a28 --- /dev/null +++ b/packages/plugins/minos-discovery-minos/HISTORY.md @@ -0,0 +1,6 @@ +# History + +## 0.5.0 (2022-02-03) + +* Migrate `MinosDiscoveryClient` from `minos-microservice-networks`. +* Minor changes. \ No newline at end of file diff --git a/packages/plugins/minos-discovery-minos/LICENSE b/packages/plugins/minos-discovery-minos/LICENSE new file mode 100644 index 000000000..4daf85bf2 --- /dev/null +++ b/packages/plugins/minos-discovery-minos/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-minos/Makefile b/packages/plugins/minos-discovery-minos/Makefile new file mode 100644 index 000000000..854bc90bc --- /dev/null +++ b/packages/plugins/minos-discovery-minos/Makefile @@ -0,0 +1,42 @@ +.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 + +docs: + rm -rf docs/api + poetry run $(MAKE) --directory=docs html + +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) docs + $(MAKE) dist diff --git a/packages/plugins/minos-discovery-minos/README.md b/packages/plugins/minos-discovery-minos/README.md new file mode 100644 index 000000000..5b4b511ac --- /dev/null +++ b/packages/plugins/minos-discovery-minos/README.md @@ -0,0 +1,36 @@ +

+ Minos logo +

+ +## minos-discovery-minos + +[![PyPI Latest Release](https://img.shields.io/pypi/v/minos-discovery-minos.svg)](https://pypi.org/project/minos-discovery-minos/) +[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/minos-framework/minos-python/pages%20build%20and%20deployment?label=docs)](https://minos-framework.github.io/minos-python) +[![License](https://img.shields.io/github/license/minos-framework/minos-python.svg)](https://github.com/minos-framework/minos-python/blob/main/LICENSE) +[![Coverage](https://codecov.io/github/minos-framework/minos-python/coverage.svg?branch=main)](https://codecov.io/gh/minos-framework/minos-python) +[![Stack Overflow](https://img.shields.io/badge/Stack%20Overflow-Ask%20a%20question-green)](https://stackoverflow.com/questions/tagged/minos) + +## Summary + +Minos is a framework which helps you create [reactive](https://www.reactivemanifesto.org/) microservices in Python. +Internally, it leverages Event Sourcing, CQRS and a message driven architecture to fulfil the commitments of an +asynchronous environment. + +## 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-minos/RUNTHETESTS.md b/packages/plugins/minos-discovery-minos/RUNTHETESTS.md new file mode 100644 index 000000000..8b5e95b1f --- /dev/null +++ b/packages/plugins/minos-discovery-minos/RUNTHETESTS.md @@ -0,0 +1,21 @@ +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-minos/SETUP.md b/packages/plugins/minos-discovery-minos/SETUP.md new file mode 100644 index 000000000..8203965c7 --- /dev/null +++ b/packages/plugins/minos-discovery-minos/SETUP.md @@ -0,0 +1,11 @@ +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 new file mode 100644 index 000000000..95592d15f --- /dev/null +++ b/packages/plugins/minos-discovery-minos/docs/Makefile @@ -0,0 +1,20 @@ +# 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 new file mode 100644 index 000000000..8aa6c288f --- /dev/null +++ b/packages/plugins/minos-discovery-minos/docs/_static/style.css @@ -0,0 +1,3 @@ +.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 new file mode 100644 index 000000000..b0a448060 --- /dev/null +++ b/packages/plugins/minos-discovery-minos/docs/_templates/layout.html @@ -0,0 +1,4 @@ +{% 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 new file mode 100644 index 000000000..cf16fc494 --- /dev/null +++ b/packages/plugins/minos-discovery-minos/docs/authors.md @@ -0,0 +1 @@ +.. mdinclude:: ../AUTHORS.md diff --git a/packages/plugins/minos-discovery-minos/docs/conf.py b/packages/plugins/minos-discovery-minos/docs/conf.py new file mode 100755 index 000000000..64b4ef650 --- /dev/null +++ b/packages/plugins/minos-discovery-minos/docs/conf.py @@ -0,0 +1,194 @@ +#!/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 new file mode 100644 index 000000000..d26e5be83 --- /dev/null +++ b/packages/plugins/minos-discovery-minos/docs/history.md @@ -0,0 +1 @@ +.. mdinclude:: ../HISTORY.md diff --git a/packages/plugins/minos-discovery-minos/docs/index.md b/packages/plugins/minos-discovery-minos/docs/index.md new file mode 100644 index 000000000..d851df4d8 --- /dev/null +++ b/packages/plugins/minos-discovery-minos/docs/index.md @@ -0,0 +1,16 @@ +# Welcome to Minos Discovery Minos'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-discovery-minos/docs/readme.md b/packages/plugins/minos-discovery-minos/docs/readme.md new file mode 100644 index 000000000..da72dbef1 --- /dev/null +++ b/packages/plugins/minos-discovery-minos/docs/readme.md @@ -0,0 +1,3 @@ +# Introduction + +.. mdinclude:: ../README.md diff --git a/packages/plugins/minos-discovery-minos/docs/runthetests.md b/packages/plugins/minos-discovery-minos/docs/runthetests.md new file mode 100644 index 000000000..309db1b96 --- /dev/null +++ b/packages/plugins/minos-discovery-minos/docs/runthetests.md @@ -0,0 +1 @@ +.. mdinclude:: ../RUNTHETESTS.md diff --git a/packages/plugins/minos-discovery-minos/docs/usage.md b/packages/plugins/minos-discovery-minos/docs/usage.md new file mode 100644 index 000000000..8f04b05ad --- /dev/null +++ b/packages/plugins/minos-discovery-minos/docs/usage.md @@ -0,0 +1 @@ +# 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 new file mode 100644 index 000000000..d3b5c3156 --- /dev/null +++ b/packages/plugins/minos-discovery-minos/minos/plugins/minos_discovery/__init__.py @@ -0,0 +1,7 @@ +__author__ = "Minos Framework Devs" +__email__ = "hey@minos.run" +__version__ = "0.5.0" + +from .client import ( + MinosDiscoveryClient, +) diff --git a/packages/core/minos-microservice-networks/minos/networks/discovery/clients/minos.py b/packages/plugins/minos-discovery-minos/minos/plugins/minos_discovery/client.py similarity index 93% rename from packages/core/minos-microservice-networks/minos/networks/discovery/clients/minos.py rename to packages/plugins/minos-discovery-minos/minos/plugins/minos_discovery/client.py index 0c4ad5cf8..0c0bcc2cd 100644 --- a/packages/core/minos-microservice-networks/minos/networks/discovery/clients/minos.py +++ b/packages/plugins/minos-discovery-minos/minos/plugins/minos_discovery/client.py @@ -1,6 +1,6 @@ import logging -from .abc import ( +from minos.networks import ( DiscoveryClient, ) @@ -19,7 +19,7 @@ async def subscribe( retry_tries: int = 3, retry_delay: float = 5, ) -> None: - """Perform a subscription query. + """Perform the subscription query. :param host: The ip of the microservice to be subscribed. :param port: The port of the microservice to be subscribed. @@ -39,7 +39,7 @@ async def subscribe( await self._rest_subscribe(endpoint, service_metadata, host, port, name, endpoints, retry_tries, retry_delay) async def unsubscribe(self, name: str, retry_tries: int = 3, retry_delay: float = 5) -> None: - """Perform an unsubscribe query. + """Perform the unsubscription query. :param name: The name of the microservice to be unsubscribed. :param retry_tries: Number of attempts before raising a failure exception. diff --git a/packages/plugins/minos-discovery-minos/poetry.lock b/packages/plugins/minos-discovery-minos/poetry.lock new file mode 100644 index 000000000..68ff21ff8 --- /dev/null +++ b/packages/plugins/minos-discovery-minos/poetry.lock @@ -0,0 +1,1794 @@ +[[package]] +name = "aiohttp" +version = "3.8.1" +description = "Async http client/server framework (asyncio)" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = ">=4.0.0a3,<5.0" +attrs = ">=17.3.0" +charset-normalizer = ">=2.0,<3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["aiodns", "brotli", "cchardet"] + +[[package]] +name = "aiomisc" +version = "14.4.6" +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 (<4)", "aiohttp-asgi", "async-timeout", "coverage (==4.5.1)", "coveralls", "croniter (>=0.3.34,<0.4.0)", "fastapi", "freezegun (<1.1)", "mypy (>=0.782,<1.0)", "pylava", "pytest", "pytest-cov (>=2.5.1,<2.6.0)", "pytest-freezegun (>=0.4.2,<0.5.0)", "sphinx (>=3.5.1)", "sphinx-autobuild", "sphinx-intl", "timeout-decorator", "types-croniter", "tox (>=2.4)"] +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" +description = "aiosignal: a list of registered asynchronous callbacks" +category = "main" +optional = false +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" +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 = "main" +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 = "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" +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 = ">=1.1.0" +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 = "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.11" +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.0.3" +description = "Composable command line interface toolkit" +category = "dev" +optional = false +python-versions = ">=3.6" + +[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.1" +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.38.0" +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 = "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.9" +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 = "filelock" +version = "3.4.2" +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" +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 = "frozenlist" +version = "1.3.0" +description = "A list-like structure which implements collections.abc.MutableSequence" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "identify" +version = "2.4.7" +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 = "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.10.1" +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 (>=8.2)", "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", "importlib-resources (>=1.3)"] + +[[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 = "jinja2" +version = "3.0.3" +description = "A very fast and expressive template engine." +category = "dev" +optional = false +python-versions = ">=3.6" + +[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.0.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "dev" +optional = false +python-versions = ">=3.6" + +[[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.4.1" +description = "Python Package with common Classes and Utilities used in Minos Microservices." +category = "main" +optional = false +python-versions = "^3.9" +develop = true + +[package.dependencies] +aiomisc = "^14.0.3" +aiopg = "^1.2.1" +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" + +[package.source] +type = "directory" +url = "../../core/minos-microservice-common" + +[[package]] +name = "minos-microservice-networks" +version = "0.4.1" +description = "Python Package with the common network classes and utilities used in Minos Microservice." +category = "main" +optional = false +python-versions = "^3.9" +develop = true + +[package.dependencies] +aiohttp = "^3.7.4" +aiomisc = "^14.0.3" +aiopg = "^1.2.1" +crontab = "^0.23.0" +dependency-injector = "^4.32.2" +minos-microservice-common = "^0.4.0" +orjson = "^3.6.5" + +[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" +description = "multidict implementation" +category = "main" +optional = false +python-versions = ">=3.7" + +[[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 = "nodeenv" +version = "1.6.0" +description = "Node.js virtual environment builder" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "orjson" +version = "3.6.6" +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 = "pbr" +version = "5.8.0" +description = "Python Build Reasonableness" +category = "dev" +optional = false +python-versions = ">=2.6" + +[[package]] +name = "platformdirs" +version = "2.4.1" +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)"] + +[[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 = "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" +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 = "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" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[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 = "2021.3" +description = "World timezone definitions, modern and historical" +category = "dev" +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 = "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" +description = "Python 2 and 3 compatibility utilities" +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.4.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.16.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.0" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "typing-extensions" +version = "4.0.1" +description = "Backported and Experimental Type Hints for Python 3.6+" +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "urllib3" +version = "1.26.8" +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 = ["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)"] + +[[package]] +name = "virtualenv" +version = "20.13.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" +description = "Yet another URL library" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +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 = "004dc19cb8bb94e893ba8e3b095c5ad99efe0e70d97e925819b01636667493ab" + +[metadata.files] +aiohttp = [ + {file = "aiohttp-3.8.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1ed0b6477896559f17b9eaeb6d38e07f7f9ffe40b9f0f9627ae8b9926ae260a8"}, + {file = "aiohttp-3.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7dadf3c307b31e0e61689cbf9e06be7a867c563d5a63ce9dca578f956609abf8"}, + {file = "aiohttp-3.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a79004bb58748f31ae1cbe9fa891054baaa46fb106c2dc7af9f8e3304dc30316"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12de6add4038df8f72fac606dff775791a60f113a725c960f2bab01d8b8e6b15"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f0d5f33feb5f69ddd57a4a4bd3d56c719a141080b445cbf18f238973c5c9923"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eaba923151d9deea315be1f3e2b31cc39a6d1d2f682f942905951f4e40200922"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:099ebd2c37ac74cce10a3527d2b49af80243e2a4fa39e7bce41617fbc35fa3c1"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2e5d962cf7e1d426aa0e528a7e198658cdc8aa4fe87f781d039ad75dcd52c516"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fa0ffcace9b3aa34d205d8130f7873fcfefcb6a4dd3dd705b0dab69af6712642"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:61bfc23df345d8c9716d03717c2ed5e27374e0fe6f659ea64edcd27b4b044cf7"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:31560d268ff62143e92423ef183680b9829b1b482c011713ae941997921eebc8"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:01d7bdb774a9acc838e6b8f1d114f45303841b89b95984cbb7d80ea41172a9e3"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:97ef77eb6b044134c0b3a96e16abcb05ecce892965a2124c566af0fd60f717e2"}, + {file = "aiohttp-3.8.1-cp310-cp310-win32.whl", hash = "sha256:c2aef4703f1f2ddc6df17519885dbfa3514929149d3ff900b73f45998f2532fa"}, + {file = "aiohttp-3.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:713ac174a629d39b7c6a3aa757b337599798da4c1157114a314e4e391cd28e32"}, + {file = "aiohttp-3.8.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:473d93d4450880fe278696549f2e7aed8cd23708c3c1997981464475f32137db"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99b5eeae8e019e7aad8af8bb314fb908dd2e028b3cdaad87ec05095394cce632"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af642b43ce56c24d063325dd2cf20ee012d2b9ba4c3c008755a301aaea720ad"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3630c3ef435c0a7c549ba170a0633a56e92629aeed0e707fec832dee313fb7a"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4a4a4e30bf1edcad13fb0804300557aedd07a92cabc74382fdd0ba6ca2661091"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6f8b01295e26c68b3a1b90efb7a89029110d3a4139270b24fda961893216c440"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a25fa703a527158aaf10dafd956f7d42ac6d30ec80e9a70846253dd13e2f067b"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5bfde62d1d2641a1f5173b8c8c2d96ceb4854f54a44c23102e2ccc7e02f003ec"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:51467000f3647d519272392f484126aa716f747859794ac9924a7aafa86cd411"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:03a6d5349c9ee8f79ab3ff3694d6ce1cfc3ced1c9d36200cb8f08ba06bd3b782"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:102e487eeb82afac440581e5d7f8f44560b36cf0bdd11abc51a46c1cd88914d4"}, + {file = "aiohttp-3.8.1-cp36-cp36m-win32.whl", hash = "sha256:4aed991a28ea3ce320dc8ce655875e1e00a11bdd29fe9444dd4f88c30d558602"}, + {file = "aiohttp-3.8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b0e20cddbd676ab8a64c774fefa0ad787cc506afd844de95da56060348021e96"}, + {file = "aiohttp-3.8.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:37951ad2f4a6df6506750a23f7cbabad24c73c65f23f72e95897bb2cecbae676"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c23b1ad869653bc818e972b7a3a79852d0e494e9ab7e1a701a3decc49c20d51"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:15b09b06dae900777833fe7fc4b4aa426556ce95847a3e8d7548e2d19e34edb8"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:477c3ea0ba410b2b56b7efb072c36fa91b1e6fc331761798fa3f28bb224830dd"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2f2f69dca064926e79997f45b2f34e202b320fd3782f17a91941f7eb85502ee2"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ef9612483cb35171d51d9173647eed5d0069eaa2ee812793a75373447d487aa4"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6d69f36d445c45cda7b3b26afef2fc34ef5ac0cdc75584a87ef307ee3c8c6d00"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:55c3d1072704d27401c92339144d199d9de7b52627f724a949fc7d5fc56d8b93"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b9d00268fcb9f66fbcc7cd9fe423741d90c75ee029a1d15c09b22d23253c0a44"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:07b05cd3305e8a73112103c834e91cd27ce5b4bd07850c4b4dbd1877d3f45be7"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c34dc4958b232ef6188c4318cb7b2c2d80521c9a56c52449f8f93ab7bc2a8a1c"}, + {file = "aiohttp-3.8.1-cp37-cp37m-win32.whl", hash = "sha256:d2f9b69293c33aaa53d923032fe227feac867f81682f002ce33ffae978f0a9a9"}, + {file = "aiohttp-3.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6ae828d3a003f03ae31915c31fa684b9890ea44c9c989056fea96e3d12a9fa17"}, + {file = "aiohttp-3.8.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0c7ebbbde809ff4e970824b2b6cb7e4222be6b95a296e46c03cf050878fc1785"}, + {file = "aiohttp-3.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b7ef7cbd4fec9a1e811a5de813311ed4f7ac7d93e0fda233c9b3e1428f7dd7b"}, + {file = "aiohttp-3.8.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c3d6a4d0619e09dcd61021debf7059955c2004fa29f48788a3dfaf9c9901a7cd"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:718626a174e7e467f0558954f94af117b7d4695d48eb980146016afa4b580b2e"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:589c72667a5febd36f1315aa6e5f56dd4aa4862df295cb51c769d16142ddd7cd"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ed076098b171573161eb146afcb9129b5ff63308960aeca4b676d9d3c35e700"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:086f92daf51a032d062ec5f58af5ca6a44d082c35299c96376a41cbb33034675"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:11691cf4dc5b94236ccc609b70fec991234e7ef8d4c02dd0c9668d1e486f5abf"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:31d1e1c0dbf19ebccbfd62eff461518dcb1e307b195e93bba60c965a4dcf1ba0"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:11a67c0d562e07067c4e86bffc1553f2cf5b664d6111c894671b2b8712f3aba5"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:bb01ba6b0d3f6c68b89fce7305080145d4877ad3acaed424bae4d4ee75faa950"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:44db35a9e15d6fe5c40d74952e803b1d96e964f683b5a78c3cc64eb177878155"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:844a9b460871ee0a0b0b68a64890dae9c415e513db0f4a7e3cab41a0f2fedf33"}, + {file = "aiohttp-3.8.1-cp38-cp38-win32.whl", hash = "sha256:7d08744e9bae2ca9c382581f7dce1273fe3c9bae94ff572c3626e8da5b193c6a"}, + {file = "aiohttp-3.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:04d48b8ce6ab3cf2097b1855e1505181bdd05586ca275f2505514a6e274e8e75"}, + {file = "aiohttp-3.8.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f5315a2eb0239185af1bddb1abf472d877fede3cc8d143c6cddad37678293237"}, + {file = "aiohttp-3.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a996d01ca39b8dfe77440f3cd600825d05841088fd6bc0144cc6c2ec14cc5f74"}, + {file = "aiohttp-3.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:13487abd2f761d4be7c8ff9080de2671e53fff69711d46de703c310c4c9317ca"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea302f34477fda3f85560a06d9ebdc7fa41e82420e892fc50b577e35fc6a50b2"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2f635ce61a89c5732537a7896b6319a8fcfa23ba09bec36e1b1ac0ab31270d2"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e999f2d0e12eea01caeecb17b653f3713d758f6dcc770417cf29ef08d3931421"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0770e2806a30e744b4e21c9d73b7bee18a1cfa3c47991ee2e5a65b887c49d5cf"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d15367ce87c8e9e09b0f989bfd72dc641bcd04ba091c68cd305312d00962addd"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6c7cefb4b0640703eb1069835c02486669312bf2f12b48a748e0a7756d0de33d"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:71927042ed6365a09a98a6377501af5c9f0a4d38083652bcd2281a06a5976724"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:28d490af82bc6b7ce53ff31337a18a10498303fe66f701ab65ef27e143c3b0ef"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:b6613280ccedf24354406caf785db748bebbddcf31408b20c0b48cb86af76866"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:81e3d8c34c623ca4e36c46524a3530e99c0bc95ed068fd6e9b55cb721d408fb2"}, + {file = "aiohttp-3.8.1-cp39-cp39-win32.whl", hash = "sha256:7187a76598bdb895af0adbd2fb7474d7f6025d170bc0a1130242da817ce9e7d1"}, + {file = "aiohttp-3.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:1c182cb873bc91b411e184dab7a2b664d4fea2743df0e4d57402f7f3fa644bac"}, + {file = "aiohttp-3.8.1.tar.gz", hash = "sha256:fc5471e1a54de15ef71c1bc6ebe80d4dc681ea600e68bfd1cbce40427f0b7578"}, +] +aiomisc = [ + {file = "aiomisc-14.4.6-py3-none-any.whl", hash = "sha256:beaa248f92acce53857f459499210643274cf06b33c7eb0c9d1f35feaad0d054"}, + {file = "aiomisc-14.4.6.tar.gz", hash = "sha256:a547a94908db9213fd0acde2674973b4a7a986ad82989215f73488903b65746e"}, +] +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"}, +] +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"}, +] +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"}, +] +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.11.tar.gz", hash = "sha256:98398a9d69ee80548c762ba991a4728bfc3836768ed226b3945908d1a688371c"}, + {file = "charset_normalizer-2.0.11-py3-none-any.whl", hash = "sha256:2842d8f5e82a1f6aa437380934d5e1cd4fcf2003b06fed6940769c164a480a45"}, +] +click = [ + {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, + {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"}, +] +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.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeffd96882d8c06d31b65dddcf51db7c612547babc1c4c5db6a011abe9798525"}, + {file = "coverage-6.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:621f6ea7260ea2ffdaec64fe5cb521669984f567b66f62f81445221d4754df4c"}, + {file = "coverage-6.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84f2436d6742c01136dd940ee158bfc7cf5ced3da7e4c949662b8703b5cd8145"}, + {file = "coverage-6.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de73fca6fb403dd72d4da517cfc49fcf791f74eee697d3219f6be29adf5af6ce"}, + {file = "coverage-6.3.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78fbb2be068a13a5d99dce9e1e7d168db880870f7bc73f876152130575bd6167"}, + {file = "coverage-6.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f5a4551dfd09c3bd12fca8144d47fe7745275adf3229b7223c2f9e29a975ebda"}, + {file = "coverage-6.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7bff3a98f63b47464480de1b5bdd80c8fade0ba2832c9381253c9b74c4153c27"}, + {file = "coverage-6.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a06c358f4aed05fa1099c39decc8022261bb07dfadc127c08cfbd1391b09689e"}, + {file = "coverage-6.3.1-cp310-cp310-win32.whl", hash = "sha256:9fff3ff052922cb99f9e52f63f985d4f7a54f6b94287463bc66b7cdf3eb41217"}, + {file = "coverage-6.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:276b13cc085474e482566c477c25ed66a097b44c6e77132f3304ac0b039f83eb"}, + {file = "coverage-6.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:56c4a409381ddd7bbff134e9756077860d4e8a583d310a6f38a2315b9ce301d0"}, + {file = "coverage-6.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9eb494070aa060ceba6e4bbf44c1bc5fa97bfb883a0d9b0c9049415f9e944793"}, + {file = "coverage-6.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e15d424b8153756b7c903bde6d4610be0c3daca3986173c18dd5c1a1625e4cd"}, + {file = "coverage-6.3.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61d47a897c1e91f33f177c21de897267b38fbb45f2cd8e22a710bcef1df09ac1"}, + {file = "coverage-6.3.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:25e73d4c81efa8ea3785274a2f7f3bfbbeccb6fcba2a0bdd3be9223371c37554"}, + {file = "coverage-6.3.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:fac0bcc5b7e8169bffa87f0dcc24435446d329cbc2b5486d155c2e0f3b493ae1"}, + {file = "coverage-6.3.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:72128176fea72012063200b7b395ed8a57849282b207321124d7ff14e26988e8"}, + {file = "coverage-6.3.1-cp37-cp37m-win32.whl", hash = "sha256:1bc6d709939ff262fd1432f03f080c5042dc6508b6e0d3d20e61dd045456a1a0"}, + {file = "coverage-6.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:618eeba986cea7f621d8607ee378ecc8c2504b98b3fdc4952b30fe3578304687"}, + {file = "coverage-6.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d5ed164af5c9078596cfc40b078c3b337911190d3faeac830c3f1274f26b8320"}, + {file = "coverage-6.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:352c68e233409c31048a3725c446a9e48bbff36e39db92774d4f2380d630d8f8"}, + {file = "coverage-6.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:448d7bde7ceb6c69e08474c2ddbc5b4cd13c9e4aa4a717467f716b5fc938a734"}, + {file = "coverage-6.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9fde6b90889522c220dd56a670102ceef24955d994ff7af2cb786b4ba8fe11e4"}, + {file = "coverage-6.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e647a0be741edbb529a72644e999acb09f2ad60465f80757da183528941ff975"}, + {file = "coverage-6.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a5cdc3adb4f8bb8d8f5e64c2e9e282bc12980ef055ec6da59db562ee9bdfefa"}, + {file = "coverage-6.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2dd70a167843b4b4b2630c0c56f1b586fe965b4f8ac5da05b6690344fd065c6b"}, + {file = "coverage-6.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9ad0a117b8dc2061ce9461ea4c1b4799e55edceb236522c5b8f958ce9ed8fa9a"}, + {file = "coverage-6.3.1-cp38-cp38-win32.whl", hash = "sha256:e92c7a5f7d62edff50f60a045dc9542bf939758c95b2fcd686175dd10ce0ed10"}, + {file = "coverage-6.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:482fb42eea6164894ff82abbcf33d526362de5d1a7ed25af7ecbdddd28fc124f"}, + {file = "coverage-6.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c5b81fb37db76ebea79aa963b76d96ff854e7662921ce742293463635a87a78d"}, + {file = "coverage-6.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a4f923b9ab265136e57cc14794a15b9dcea07a9c578609cd5dbbfff28a0d15e6"}, + {file = "coverage-6.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56d296cbc8254a7dffdd7bcc2eb70be5a233aae7c01856d2d936f5ac4e8ac1f1"}, + {file = "coverage-6.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1245ab82e8554fa88c4b2ab1e098ae051faac5af829efdcf2ce6b34dccd5567c"}, + {file = "coverage-6.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f2b05757c92ad96b33dbf8e8ec8d4ccb9af6ae3c9e9bd141c7cc44d20c6bcba"}, + {file = "coverage-6.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9e3dd806f34de38d4c01416344e98eab2437ac450b3ae39c62a0ede2f8b5e4ed"}, + {file = "coverage-6.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d651fde74a4d3122e5562705824507e2f5b2d3d57557f1916c4b27635f8fbe3f"}, + {file = "coverage-6.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:704f89b87c4f4737da2860695a18c852b78ec7279b24eedacab10b29067d3a38"}, + {file = "coverage-6.3.1-cp39-cp39-win32.whl", hash = "sha256:2aed4761809640f02e44e16b8b32c1a5dee5e80ea30a0ff0912158bde9c501f2"}, + {file = "coverage-6.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:9976fb0a5709988778ac9bc44f3d50fccd989987876dfd7716dee28beed0a9fa"}, + {file = "coverage-6.3.1-pp36.pp37.pp38-none-any.whl", hash = "sha256:463e52616ea687fd323888e86bf25e864a3cc6335a043fad6bbb037dbf49bbe2"}, + {file = "coverage-6.3.1.tar.gz", hash = "sha256:6c3f6158b02ac403868eea390930ae64e9a9a2a5bbfafefbb920d29258d9f2f8"}, +] +crontab = [ + {file = "crontab-0.23.0.tar.gz", hash = "sha256:ca79dede9c2f572bb32f38703e8fddcf3427e86edc838f2ffe7ae4b9ee2b0733"}, +] +dependency-injector = [ + {file = "dependency-injector-4.38.0.tar.gz", hash = "sha256:bab4c323d822d3fc9936e8eb3c2f5553d75e9efdadac11d5b293a016e31a1477"}, + {file = "dependency_injector-4.38.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:025eb5f97021663715bff8e01feb83d5b2f66fc17ece1042a194f1aae88c0d85"}, + {file = "dependency_injector-4.38.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3c61334b196ab767eae43af207764349287d5eb0283d8ed1ab24608121aea35"}, + {file = "dependency_injector-4.38.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9bf4bfc52015e81c4f17647b7bbbe4e4549f041b3c6635b44a9ecede7594932c"}, + {file = "dependency_injector-4.38.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7aeba5882b06baf78978f33228e4c44133dada9173e330da68fbccca98520848"}, + {file = "dependency_injector-4.38.0-cp310-cp310-win32.whl", hash = "sha256:445dbf5324eee215a465d7f3b1965b05e199c31caa09e63abf0f02d982791306"}, + {file = "dependency_injector-4.38.0-cp310-cp310-win_amd64.whl", hash = "sha256:880edbcb5d810faa0623112e2e652a7bec73d20ce0708d9db998a0a40b62cbb9"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cd6f1c130462e7461a43f82fdc0d2ba25b5ef594db823dbd0e57f3d1b7c44f86"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be75905f7513886699d3ff5ed9aca233175c03808fc888da2a53b83af0a5d65"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d7f1a7d27de6295ce8b7ca69d1177817bf36c7cbaf73819e4bab04f87c5e962"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e9c1ff387d7b7d814e9d29a531c6804acc67b1cca578c09abd3590fa7ec6bf06"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-win32.whl", hash = "sha256:7770efcbc6915dabbb31ea0bdeee1105dabf76e1c8e31a454cb1983dcf19ecf1"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-win_amd64.whl", hash = "sha256:9e89a9c88317ad237abfb374c410e1466476ffefe6c44f3caeca3dce747a635c"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cb75cd29c132bfaf03a11a6ac4f459dddb7a6526669543de57d2bb5fddf78def"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d116c56e7fc3b59b3afa6078163b5f6ff4680ebf27800dd4032de7a04f7ef777"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9df330ef9e24b6f94e6764d23180350c2fb99785257233ee4738e066b876fa7f"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7a46639038313f64eca2dc858ac4cd9e0aca5ea21bb005f5d754aadd6446ba4b"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-win32.whl", hash = "sha256:d0d983b269b657744058b5858afc3c59443db53afe9c3e709e316daa9f9b9454"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1446df58169c166a5a2d5644ba9eeb3b7f2f679f260596f78d012c58ff140d92"}, + {file = "dependency_injector-4.38.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:307396f2d9d2f532fe92079a56d40af5fc60dacb1d766e3f9cd04c3802a1c251"}, + {file = "dependency_injector-4.38.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dd96b6c454ab86648f57f37b895c1c976b1a82b76f835011f607ee8a78ebc0e"}, + {file = "dependency_injector-4.38.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fb44b17e649cabcfd1f370ecfd492ac7a93216776d91954b31598eecb36cdb13"}, + {file = "dependency_injector-4.38.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ab8ebe728dd9b3be23c40ca5a5dbe195050d9ad35d42d7e9fdaea816f7134584"}, + {file = "dependency_injector-4.38.0-cp38-cp38-win32.whl", hash = "sha256:1da3bad1452212bab76e87fbf7a71d3675190a1a909f345aaf8bae2fa97b878f"}, + {file = "dependency_injector-4.38.0-cp38-cp38-win_amd64.whl", hash = "sha256:2918776e88de88be0e2be036261180ca0605c8f64ead43d835ce852f16a9efd2"}, + {file = "dependency_injector-4.38.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:493be62561218624380d4eca9243a46753444f677217db6292a7b715cf429172"}, + {file = "dependency_injector-4.38.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a70511db88f84ac4228b27e37e12ea0e04a9c2a32cae3602b9af9a27c0db992"}, + {file = "dependency_injector-4.38.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e3e1cfe41a5ada0ff71889563441f538caff0399e41d3ee377b60fa50a858bf"}, + {file = "dependency_injector-4.38.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:116cc679a2c6d40c6a4f968aefe68535e596e88e96315dbd0d0ad2ff76654e3d"}, + {file = "dependency_injector-4.38.0-cp39-cp39-win32.whl", hash = "sha256:f703c2c161de067ba9893b56743d24fb4c9dbff92eb504bc082c2d2cfeab4c01"}, + {file = "dependency_injector-4.38.0-cp39-cp39-win_amd64.whl", hash = "sha256:6821a864d6405dc0d5f794ac1b10da4a8c7e8731c6a0651a9682a0b76f5a5b3e"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6c9e8dc91aa5831bd3a58fec1b94ed8c52f78f601f5ab91135b5ad44325beef7"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b4eedadef0c84295b70803a79a3ce5a10a59dddd8f306876f6fa6bfc4de8e00"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2e88b5d09c80e20d6b3d985cc360f39a81e748667c20f6bc7eee9f4b832176ed"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b1fcd71ff46e097f4e47917ccdf6aa388b6a6372557f7d9f83db1e879e95f8bb"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:9633d6366282e83a3f21543c5c78299787948333d9fe6649b020cfac93d8b7ca"}, +] +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"}, +] +fastavro = [ + {file = "fastavro-1.4.9-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:2e64a77c529b638e89a879ff0211debfab5b2d114c26a2af29c81f6b013f395a"}, + {file = "fastavro-1.4.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fc9c95b7c1d59c5a2d29be21075870a122152cf927d84587dafc96da6b2ac3d"}, + {file = "fastavro-1.4.9-cp310-cp310-win_amd64.whl", hash = "sha256:927fd6148a8dd9646c129c0a0e8571aea829abc3cba04a3d5a4010a866934f4c"}, + {file = "fastavro-1.4.9-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:000b70c5109a61bdbfddeb2821a506de8f5333f243c608cbced61d44657d6c2f"}, + {file = "fastavro-1.4.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37a77a1b5347a06416e236c77027c750aaeda29ef8189aa456eb2a2571274b43"}, + {file = "fastavro-1.4.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce2c7747ce958115388872db0756d3eeb0d796084eea9b46dc3758ef32c4d952"}, + {file = "fastavro-1.4.9-cp37-cp37m-win_amd64.whl", hash = "sha256:d6ccb77604903a0308316e696bb65a8943361af5f757d10985689656c9bce6ed"}, + {file = "fastavro-1.4.9-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:9a6ada2d6e133a2319438248c2e023b6735747b249c5a79d5f08f9d431e5d226"}, + {file = "fastavro-1.4.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7537e4df7782b03b9761e9338cef9fc7bfcc41100ab93c36c5c60fa568e724a"}, + {file = "fastavro-1.4.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a9cd6d8471beb4020b4126fd04150ed7295f74ae7234d0dc9205b55c193851e"}, + {file = "fastavro-1.4.9-cp38-cp38-win_amd64.whl", hash = "sha256:fa9d8b47e0533c84152332ad491bb63bbae76a8a7a0df1caa821e0cbebf0fb70"}, + {file = "fastavro-1.4.9-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:3759bdc77009ee1e2e76fc9f58b951c05c00a8600ef9ddbff59fee3cb0c9e235"}, + {file = "fastavro-1.4.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b98ef2bdb123b95945aa6d69d6a7d79f211df3274b2dd7786da7852ddec964d0"}, + {file = "fastavro-1.4.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32b804aa6920d80c0e94e1180d480f28f56c4b901849bd80ed180851752b5ce6"}, + {file = "fastavro-1.4.9-cp39-cp39-win_amd64.whl", hash = "sha256:f9b04acaf06b16218b47985e92d8daa98c1116d58f3cff81a5b3cf39cef9afc0"}, + {file = "fastavro-1.4.9.tar.gz", hash = "sha256:be3fec387eb2cdc9627060b5ae0690542c687dddc951b63fa11203553769ae5e"}, +] +filelock = [ + {file = "filelock-3.4.2-py3-none-any.whl", hash = "sha256:cf0fc6a2f8d26bd900f19bf33915ca70ba4dd8c56903eeb14e1e7a2fd7590146"}, + {file = "filelock-3.4.2.tar.gz", hash = "sha256:38b4f4c989f9d06d44524df1b24bd19e167d851f19b50bf3e3559952dddc5b80"}, +] +flake8 = [ + {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, + {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, +] +frozenlist = [ + {file = "frozenlist-1.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d2257aaba9660f78c7b1d8fea963b68f3feffb1a9d5d05a18401ca9eb3e8d0a3"}, + {file = "frozenlist-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4a44ebbf601d7bac77976d429e9bdb5a4614f9f4027777f9e54fd765196e9d3b"}, + {file = "frozenlist-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:45334234ec30fc4ea677f43171b18a27505bfb2dba9aca4398a62692c0ea8868"}, + {file = "frozenlist-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47be22dc27ed933d55ee55845d34a3e4e9f6fee93039e7f8ebadb0c2f60d403f"}, + {file = "frozenlist-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:03a7dd1bfce30216a3f51a84e6dd0e4a573d23ca50f0346634916ff105ba6e6b"}, + {file = "frozenlist-1.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:691ddf6dc50480ce49f68441f1d16a4c3325887453837036e0fb94736eae1e58"}, + {file = "frozenlist-1.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bde99812f237f79eaf3f04ebffd74f6718bbd216101b35ac7955c2d47c17da02"}, + {file = "frozenlist-1.3.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a202458d1298ced3768f5a7d44301e7c86defac162ace0ab7434c2e961166e8"}, + {file = "frozenlist-1.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b9e3e9e365991f8cc5f5edc1fd65b58b41d0514a6a7ad95ef5c7f34eb49b3d3e"}, + {file = "frozenlist-1.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:04cb491c4b1c051734d41ea2552fde292f5f3a9c911363f74f39c23659c4af78"}, + {file = "frozenlist-1.3.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:436496321dad302b8b27ca955364a439ed1f0999311c393dccb243e451ff66aa"}, + {file = "frozenlist-1.3.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:754728d65f1acc61e0f4df784456106e35afb7bf39cfe37227ab00436fb38676"}, + {file = "frozenlist-1.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6eb275c6385dd72594758cbe96c07cdb9bd6becf84235f4a594bdf21e3596c9d"}, + {file = "frozenlist-1.3.0-cp310-cp310-win32.whl", hash = "sha256:e30b2f9683812eb30cf3f0a8e9f79f8d590a7999f731cf39f9105a7c4a39489d"}, + {file = "frozenlist-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f7353ba3367473d1d616ee727945f439e027f0bb16ac1a750219a8344d1d5d3c"}, + {file = "frozenlist-1.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88aafd445a233dbbf8a65a62bc3249a0acd0d81ab18f6feb461cc5a938610d24"}, + {file = "frozenlist-1.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4406cfabef8f07b3b3af0f50f70938ec06d9f0fc26cbdeaab431cbc3ca3caeaa"}, + {file = "frozenlist-1.3.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8cf829bd2e2956066dd4de43fd8ec881d87842a06708c035b37ef632930505a2"}, + {file = "frozenlist-1.3.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:603b9091bd70fae7be28bdb8aa5c9990f4241aa33abb673390a7f7329296695f"}, + {file = "frozenlist-1.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25af28b560e0c76fa41f550eacb389905633e7ac02d6eb3c09017fa1c8cdfde1"}, + {file = "frozenlist-1.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c7a8a9fc9383b52c410a2ec952521906d355d18fccc927fca52ab575ee8b93"}, + {file = "frozenlist-1.3.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:65bc6e2fece04e2145ab6e3c47428d1bbc05aede61ae365b2c1bddd94906e478"}, + {file = "frozenlist-1.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3f7c935c7b58b0d78c0beea0c7358e165f95f1fd8a7e98baa40d22a05b4a8141"}, + {file = "frozenlist-1.3.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd89acd1b8bb4f31b47072615d72e7f53a948d302b7c1d1455e42622de180eae"}, + {file = "frozenlist-1.3.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:6983a31698490825171be44ffbafeaa930ddf590d3f051e397143a5045513b01"}, + {file = "frozenlist-1.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:adac9700675cf99e3615eb6a0eb5e9f5a4143c7d42c05cea2e7f71c27a3d0846"}, + {file = "frozenlist-1.3.0-cp37-cp37m-win32.whl", hash = "sha256:0c36e78b9509e97042ef869c0e1e6ef6429e55817c12d78245eb915e1cca7468"}, + {file = "frozenlist-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:57f4d3f03a18facacb2a6bcd21bccd011e3b75d463dc49f838fd699d074fabd1"}, + {file = "frozenlist-1.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8c905a5186d77111f02144fab5b849ab524f1e876a1e75205cd1386a9be4b00a"}, + {file = "frozenlist-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b5009062d78a8c6890d50b4e53b0ddda31841b3935c1937e2ed8c1bda1c7fb9d"}, + {file = "frozenlist-1.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2fdc3cd845e5a1f71a0c3518528bfdbfe2efaf9886d6f49eacc5ee4fd9a10953"}, + {file = "frozenlist-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92e650bd09b5dda929523b9f8e7f99b24deac61240ecc1a32aeba487afcd970f"}, + {file = "frozenlist-1.3.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:40dff8962b8eba91fd3848d857203f0bd704b5f1fa2b3fc9af64901a190bba08"}, + {file = "frozenlist-1.3.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:768efd082074bb203c934e83a61654ed4931ef02412c2fbdecea0cff7ecd0274"}, + {file = "frozenlist-1.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:006d3595e7d4108a12025ddf415ae0f6c9e736e726a5db0183326fd191b14c5e"}, + {file = "frozenlist-1.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:871d42623ae15eb0b0e9df65baeee6976b2e161d0ba93155411d58ff27483ad8"}, + {file = "frozenlist-1.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aff388be97ef2677ae185e72dc500d19ecaf31b698986800d3fc4f399a5e30a5"}, + {file = "frozenlist-1.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9f892d6a94ec5c7b785e548e42722e6f3a52f5f32a8461e82ac3e67a3bd073f1"}, + {file = "frozenlist-1.3.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:e982878792c971cbd60ee510c4ee5bf089a8246226dea1f2138aa0bb67aff148"}, + {file = "frozenlist-1.3.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c6c321dd013e8fc20735b92cb4892c115f5cdb82c817b1e5b07f6b95d952b2f0"}, + {file = "frozenlist-1.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:30530930410855c451bea83f7b272fb1c495ed9d5cc72895ac29e91279401db3"}, + {file = "frozenlist-1.3.0-cp38-cp38-win32.whl", hash = "sha256:40ec383bc194accba825fbb7d0ef3dda5736ceab2375462f1d8672d9f6b68d07"}, + {file = "frozenlist-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:f20baa05eaa2bcd5404c445ec51aed1c268d62600362dc6cfe04fae34a424bd9"}, + {file = "frozenlist-1.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0437fe763fb5d4adad1756050cbf855bbb2bf0d9385c7bb13d7a10b0dd550486"}, + {file = "frozenlist-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b684c68077b84522b5c7eafc1dc735bfa5b341fb011d5552ebe0968e22ed641c"}, + {file = "frozenlist-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93641a51f89473837333b2f8100f3f89795295b858cd4c7d4a1f18e299dc0a4f"}, + {file = "frozenlist-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6d32ff213aef0fd0bcf803bffe15cfa2d4fde237d1d4838e62aec242a8362fa"}, + {file = "frozenlist-1.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31977f84828b5bb856ca1eb07bf7e3a34f33a5cddce981d880240ba06639b94d"}, + {file = "frozenlist-1.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c62964192a1c0c30b49f403495911298810bada64e4f03249ca35a33ca0417a"}, + {file = "frozenlist-1.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4eda49bea3602812518765810af732229b4291d2695ed24a0a20e098c45a707b"}, + {file = "frozenlist-1.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acb267b09a509c1df5a4ca04140da96016f40d2ed183cdc356d237286c971b51"}, + {file = "frozenlist-1.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e1e26ac0a253a2907d654a37e390904426d5ae5483150ce3adedb35c8c06614a"}, + {file = "frozenlist-1.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f96293d6f982c58ebebb428c50163d010c2f05de0cde99fd681bfdc18d4b2dc2"}, + {file = "frozenlist-1.3.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e84cb61b0ac40a0c3e0e8b79c575161c5300d1d89e13c0e02f76193982f066ed"}, + {file = "frozenlist-1.3.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:ff9310f05b9d9c5c4dd472983dc956901ee6cb2c3ec1ab116ecdde25f3ce4951"}, + {file = "frozenlist-1.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d26b650b71fdc88065b7a21f8ace70175bcf3b5bdba5ea22df4bfd893e795a3b"}, + {file = "frozenlist-1.3.0-cp39-cp39-win32.whl", hash = "sha256:01a73627448b1f2145bddb6e6c2259988bb8aee0fb361776ff8604b99616cd08"}, + {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.7-py2.py3-none-any.whl", hash = "sha256:e64210654dfbca6ced33230eb1b137591a0981425e1a60b4c6c36309f787bbd5"}, + {file = "identify-2.4.7.tar.gz", hash = "sha256:8408f01e0be25492017346d7dffe7e7711b762b23375c775d24d3bc38618fabc"}, +] +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.10.1-py3-none-any.whl", hash = "sha256:899e2a40a8c4a1aec681feef45733de8a6c58f3f6a0dbed2eb6574b4387a77b6"}, + {file = "importlib_metadata-4.10.1.tar.gz", hash = "sha256:951f0d8a5b7260e9db5e41d429285b5f451e928479f19d80818878527d36e95e"}, +] +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"}, +] +jinja2 = [ + {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"}, + {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"}, +] +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.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, + {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, +] +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"}, + {file = "multidict-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:041b81a5f6b38244b34dc18c7b6aba91f9cdaf854d9a39e5ff0b58e2b5773b9c"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fdda29a3c7e76a064f2477c9aab1ba96fd94e02e386f1e665bca1807fc5386f"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3368bf2398b0e0fcbf46d85795adc4c259299fec50c1416d0f77c0a843a3eed9"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4f052ee022928d34fe1f4d2bc743f32609fb79ed9c49a1710a5ad6b2198db20"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:225383a6603c086e6cef0f2f05564acb4f4d5f019a4e3e983f572b8530f70c88"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50bd442726e288e884f7be9071016c15a8742eb689a593a0cac49ea093eef0a7"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:47e6a7e923e9cada7c139531feac59448f1f47727a79076c0b1ee80274cd8eee"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0556a1d4ea2d949efe5fd76a09b4a82e3a4a30700553a6725535098d8d9fb672"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:626fe10ac87851f4cffecee161fc6f8f9853f0f6f1035b59337a51d29ff3b4f9"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:8064b7c6f0af936a741ea1efd18690bacfbae4078c0c385d7c3f611d11f0cf87"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2d36e929d7f6a16d4eb11b250719c39560dd70545356365b494249e2186bc389"}, + {file = "multidict-6.0.2-cp310-cp310-win32.whl", hash = "sha256:fcb91630817aa8b9bc4a74023e4198480587269c272c58b3279875ed7235c293"}, + {file = "multidict-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:8cbf0132f3de7cc6c6ce00147cc78e6439ea736cee6bca4f068bcf892b0fd658"}, + {file = "multidict-6.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:05f6949d6169878a03e607a21e3b862eaf8e356590e8bdae4227eedadacf6e51"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2c2e459f7050aeb7c1b1276763364884595d47000c1cddb51764c0d8976e608"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0509e469d48940147e1235d994cd849a8f8195e0bca65f8f5439c56e17872a3"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:514fe2b8d750d6cdb4712346a2c5084a80220821a3e91f3f71eec11cf8d28fd4"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19adcfc2a7197cdc3987044e3f415168fc5dc1f720c932eb1ef4f71a2067e08b"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9d153e7f1f9ba0b23ad1568b3b9e17301e23b042c23870f9ee0522dc5cc79e8"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:aef9cc3d9c7d63d924adac329c33835e0243b5052a6dfcbf7732a921c6e918ba"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4571f1beddff25f3e925eea34268422622963cd8dc395bb8778eb28418248e43"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:d48b8ee1d4068561ce8033d2c344cf5232cb29ee1a0206a7b828c79cbc5982b8"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:45183c96ddf61bf96d2684d9fbaf6f3564d86b34cb125761f9a0ef9e36c1d55b"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:75bdf08716edde767b09e76829db8c1e5ca9d8bb0a8d4bd94ae1eafe3dac5e15"}, + {file = "multidict-6.0.2-cp37-cp37m-win32.whl", hash = "sha256:a45e1135cb07086833ce969555df39149680e5471c04dfd6a915abd2fc3f6dbc"}, + {file = "multidict-6.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6f3cdef8a247d1eafa649085812f8a310e728bdf3900ff6c434eafb2d443b23a"}, + {file = "multidict-6.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0327292e745a880459ef71be14e709aaea2f783f3537588fb4ed09b6c01bca60"}, + {file = "multidict-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e875b6086e325bab7e680e4316d667fc0e5e174bb5611eb16b3ea121c8951b86"}, + {file = "multidict-6.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:feea820722e69451743a3d56ad74948b68bf456984d63c1a92e8347b7b88452d"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc57c68cb9139c7cd6fc39f211b02198e69fb90ce4bc4a094cf5fe0d20fd8b0"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:497988d6b6ec6ed6f87030ec03280b696ca47dbf0648045e4e1d28b80346560d"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:89171b2c769e03a953d5969b2f272efa931426355b6c0cb508022976a17fd376"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:684133b1e1fe91eda8fa7447f137c9490a064c6b7f392aa857bba83a28cfb693"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd9fc9c4849a07f3635ccffa895d57abce554b467d611a5009ba4f39b78a8849"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e07c8e79d6e6fd37b42f3250dba122053fddb319e84b55dd3a8d6446e1a7ee49"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4070613ea2227da2bfb2c35a6041e4371b0af6b0be57f424fe2318b42a748516"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:47fbeedbf94bed6547d3aa632075d804867a352d86688c04e606971595460227"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5774d9218d77befa7b70d836004a768fb9aa4fdb53c97498f4d8d3f67bb9cfa9"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2957489cba47c2539a8eb7ab32ff49101439ccf78eab724c828c1a54ff3ff98d"}, + {file = "multidict-6.0.2-cp38-cp38-win32.whl", hash = "sha256:e5b20e9599ba74391ca0cfbd7b328fcc20976823ba19bc573983a25b32e92b57"}, + {file = "multidict-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:8004dca28e15b86d1b1372515f32eb6f814bdf6f00952699bdeb541691091f96"}, + {file = "multidict-6.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2e4a0785b84fb59e43c18a015ffc575ba93f7d1dbd272b4cdad9f5134b8a006c"}, + {file = "multidict-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6701bf8a5d03a43375909ac91b6980aea74b0f5402fbe9428fc3f6edf5d9677e"}, + {file = "multidict-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a007b1638e148c3cfb6bf0bdc4f82776cef0ac487191d093cdc316905e504071"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07a017cfa00c9890011628eab2503bee5872f27144936a52eaab449be5eaf032"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c207fff63adcdf5a485969131dc70e4b194327666b7e8a87a97fbc4fd80a53b2"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:373ba9d1d061c76462d74e7de1c0c8e267e9791ee8cfefcf6b0b2495762c370c"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfba7c6d5d7c9099ba21f84662b037a0ffd4a5e6b26ac07d19e423e6fdf965a9"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19d9bad105dfb34eb539c97b132057a4e709919ec4dd883ece5838bcbf262b80"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:de989b195c3d636ba000ee4281cd03bb1234635b124bf4cd89eeee9ca8fcb09d"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7c40b7bbece294ae3a87c1bc2abff0ff9beef41d14188cda94ada7bcea99b0fb"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:d16cce709ebfadc91278a1c005e3c17dd5f71f5098bfae1035149785ea6e9c68"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:a2c34a93e1d2aa35fbf1485e5010337c72c6791407d03aa5f4eed920343dd360"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:feba80698173761cddd814fa22e88b0661e98cb810f9f986c54aa34d281e4937"}, + {file = "multidict-6.0.2-cp39-cp39-win32.whl", hash = "sha256:23b616fdc3c74c9fe01d76ce0d1ce872d2d396d8fa8e4899398ad64fb5aa214a"}, + {file = "multidict-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:4bae31803d708f6f15fd98be6a6ac0b6958fcf68fda3c77a048a4f9073704aae"}, + {file = "multidict-6.0.2.tar.gz", hash = "sha256:5ff3bd75f38e4c43f1f470f2df7a4d430b821c4ce22be384e1459cb57d6bb013"}, +] +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.6-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:e4a7cad6c63306318453980d302c7c0b74c0cc290dd1f433bbd7d31a5af90cf1"}, + {file = "orjson-3.6.6-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:e533941dca4a0530a876de32e54bf2fd3269cdec3751aebde7bfb5b5eba98e74"}, + {file = "orjson-3.6.6-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:9adf63be386eaa34278967512b83ff8fc4bed036a246391ae236f68d23c47452"}, + {file = "orjson-3.6.6-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:3b636753ae34d4619b11ea7d664a2f1e87e55e9738e5123e12bcce22acae9d13"}, + {file = "orjson-3.6.6-cp310-none-win_amd64.whl", hash = "sha256:78a10295ed048fd916c6584d6d27c232eae805a43e7c14be56e3745f784f0eb6"}, + {file = "orjson-3.6.6-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:82b4f9fb2af7799b52932a62eac484083f930d5519560d6f64b24d66a368d03f"}, + {file = "orjson-3.6.6-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:a0033d07309cc7d8b8c4bc5d42f0dd4422b53ceb91dee9f4086bb2afa70b7772"}, + {file = "orjson-3.6.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b321f99473116ab7c7c028377372f7b4adba4029aaca19cd567e83898f55579"}, + {file = "orjson-3.6.6-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:b9c98ed94f1688cc11b5c61b8eea39d854a1a2f09f71d8a5af005461b14994ed"}, + {file = "orjson-3.6.6-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:00b333a41392bd07a8603c42670547dbedf9b291485d773f90c6470eff435608"}, + {file = "orjson-3.6.6-cp37-none-win_amd64.whl", hash = "sha256:8d4fd3bdee65a81f2b79c50937d4b3c054e1e6bfa3fc72ed018a97c0c7c3d521"}, + {file = "orjson-3.6.6-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:954c9f8547247cd7a8c91094ff39c9fe314b5eaeaec90b7bfb7384a4108f416f"}, + {file = "orjson-3.6.6-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:74e5aed657ed0b91ef05d44d6a26d3e3e12ce4d2d71f75df41a477b05878c4a9"}, + {file = "orjson-3.6.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4008a5130e6e9c33abaa95e939e0e755175da10745740aa6968461b2f16830e2"}, + {file = "orjson-3.6.6-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:012761d5f3d186deb4f6238f15e9ea7c1aac6deebc8f5b741ba3b4fafe017460"}, + {file = "orjson-3.6.6-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:b464546718a940b48d095a98df4c04808bfa6c8706fe751fc3f9390bc2f82643"}, + {file = "orjson-3.6.6-cp38-none-win_amd64.whl", hash = "sha256:f10a800f4e5a4aab52076d4628e9e4dab9370bdd9d8ea254ebfde846b653ab25"}, + {file = "orjson-3.6.6-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:8010d2610cfab721725ef14d578c7071e946bbdae63322d8f7b49061cf3fde8d"}, + {file = "orjson-3.6.6-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:8dca67a4855e1e0f9a2ea0386e8db892708522e1171dc0ddf456932288fbae63"}, + {file = "orjson-3.6.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af065d60523139b99bd35b839c7a2d8c5da55df8a8c4402d2eb6cdc07fa7a624"}, + {file = "orjson-3.6.6-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:fa1f389cc9f766ae0cf7ba3533d5089836b01a5ccb3f8d904297f1fcf3d9dc34"}, + {file = "orjson-3.6.6-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:ec1221ad78f94d27b162a1d35672b62ef86f27f0e4c2b65051edb480cc86b286"}, + {file = "orjson-3.6.6-cp39-none-win_amd64.whl", hash = "sha256:afed2af55eeda1de6b3f1cbc93431981b19d380fcc04f6ed86e74c1913070304"}, + {file = "orjson-3.6.6.tar.gz", hash = "sha256:55dd988400fa7fbe0e31407c683f5aaab013b5bd967167b8fe058186773c4d6c"}, +] +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"}, +] +pbr = [ + {file = "pbr-5.8.0-py2.py3-none-any.whl", hash = "sha256:176e8560eaf61e127817ef93d8a844803abb27a4d4637f0ff3bb783129be2e0a"}, + {file = "pbr-5.8.0.tar.gz", hash = "sha256:672d8ebee84921862110f23fcec2acea191ef58543d34dfe9ef3d9f13c31cddf"}, +] +platformdirs = [ + {file = "platformdirs-2.4.1-py3-none-any.whl", hash = "sha256:1d7385c7db91728b83efd0ca99a5afb296cab9d0ed8313a45ed8ba17967ecfca"}, + {file = "platformdirs-2.4.1.tar.gz", hash = "sha256:440633ddfebcc36264232365d7840a970e75e1018d15b4327d11f91909045fda"}, +] +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"}, +] +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"}, +] +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"}, +] +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-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, + {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, +] +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"}, +] +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.4.0-py3-none-any.whl", hash = "sha256:5da895959511473857b6d0200f56865ed62c31e8f82dd338063b84ec022701fe"}, + {file = "Sphinx-4.4.0.tar.gz", hash = "sha256:6caad9786055cb1fa22b4a365c1775816b876f91966481765d7d50e9f0dd35cc"}, +] +sphinx-autodoc-typehints = [ + {file = "sphinx_autodoc_typehints-1.16.0-py3-none-any.whl", hash = "sha256:b5efe1fb5754349f849ca09b1f5c9b4bb37f1e360f00fbde003b12c60d67cc3a"}, + {file = "sphinx_autodoc_typehints-1.16.0.tar.gz", hash = "sha256:21df6ee692c2c8366f6df13b13e4d4ab8af25cc0dfb65e2d182351528b6eb704"}, +] +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.0-py3-none-any.whl", hash = "sha256:b5bde28da1fed24b9bd1d4d2b8cba62300bfb4ec9a6187a957e8ddb9434c5224"}, + {file = "tomli-2.0.0.tar.gz", hash = "sha256:c292c34f58502a1eb2bbb9f5bbc9a5ebc37bee10ffb8c2d6bbdfa8eb13cc14e1"}, +] +typing-extensions = [ + {file = "typing_extensions-4.0.1-py3-none-any.whl", hash = "sha256:7f001e5ac290a0c0401508864c7ec868be4e701886d5b573a9528ed3973d9d3b"}, + {file = "typing_extensions-4.0.1.tar.gz", hash = "sha256:4ca091dea149f945ec56afb48dae714f21e8692ef22a395223bcd328961b6a0e"}, +] +urllib3 = [ + {file = "urllib3-1.26.8-py2.py3-none-any.whl", hash = "sha256:000ca7f471a233c2251c6c7023ee85305721bfdf18621ebff4fd17a8653427ed"}, + {file = "urllib3-1.26.8.tar.gz", hash = "sha256:0e7c33d9a63e7ddfcb86780aac87befc2fbddf46c58dbb487e0855f7ceec283c"}, +] +virtualenv = [ + {file = "virtualenv-20.13.0-py2.py3-none-any.whl", hash = "sha256:339f16c4a86b44240ba7223d0f93a7887c3ca04b5f9c8129da7958447d079b09"}, + {file = "virtualenv-20.13.0.tar.gz", hash = "sha256:d8458cf8d59d0ea495ad9b34c2599487f8a7772d796f9910858376d1600dd2dd"}, +] +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"}, + {file = "yarl-1.7.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1d0894f238763717bdcfea74558c94e3bc34aeacd3351d769460c1a586a8b05"}, + {file = "yarl-1.7.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfe4b95b7e00c6635a72e2d00b478e8a28bfb122dc76349a06e20792eb53a523"}, + {file = "yarl-1.7.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c145ab54702334c42237a6c6c4cc08703b6aa9b94e2f227ceb3d477d20c36c63"}, + {file = "yarl-1.7.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ca56f002eaf7998b5fcf73b2421790da9d2586331805f38acd9997743114e98"}, + {file = "yarl-1.7.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1d3d5ad8ea96bd6d643d80c7b8d5977b4e2fb1bab6c9da7322616fd26203d125"}, + {file = "yarl-1.7.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:167ab7f64e409e9bdd99333fe8c67b5574a1f0495dcfd905bc7454e766729b9e"}, + {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:95a1873b6c0dd1c437fb3bb4a4aaa699a48c218ac7ca1e74b0bee0ab16c7d60d"}, + {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6152224d0a1eb254f97df3997d79dadd8bb2c1a02ef283dbb34b97d4f8492d23"}, + {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:5bb7d54b8f61ba6eee541fba4b83d22b8a046b4ef4d8eb7f15a7e35db2e1e245"}, + {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:9c1f083e7e71b2dd01f7cd7434a5f88c15213194df38bc29b388ccdf1492b739"}, + {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f44477ae29025d8ea87ec308539f95963ffdc31a82f42ca9deecf2d505242e72"}, + {file = "yarl-1.7.2-cp310-cp310-win32.whl", hash = "sha256:cff3ba513db55cc6a35076f32c4cdc27032bd075c9faef31fec749e64b45d26c"}, + {file = "yarl-1.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:c9c6d927e098c2d360695f2e9d38870b2e92e0919be07dbe339aefa32a090265"}, + {file = "yarl-1.7.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9b4c77d92d56a4c5027572752aa35082e40c561eec776048330d2907aead891d"}, + {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c01a89a44bb672c38f42b49cdb0ad667b116d731b3f4c896f72302ff77d71656"}, + {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c19324a1c5399b602f3b6e7db9478e5b1adf5cf58901996fc973fe4fccd73eed"}, + {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3abddf0b8e41445426d29f955b24aeecc83fa1072be1be4e0d194134a7d9baee"}, + {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6a1a9fe17621af43e9b9fcea8bd088ba682c8192d744b386ee3c47b56eaabb2c"}, + {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8b0915ee85150963a9504c10de4e4729ae700af11df0dc5550e6587ed7891e92"}, + {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:29e0656d5497733dcddc21797da5a2ab990c0cb9719f1f969e58a4abac66234d"}, + {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:bf19725fec28452474d9887a128e98dd67eee7b7d52e932e6949c532d820dc3b"}, + {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:d6f3d62e16c10e88d2168ba2d065aa374e3c538998ed04996cd373ff2036d64c"}, + {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ac10bbac36cd89eac19f4e51c032ba6b412b3892b685076f4acd2de18ca990aa"}, + {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:aa32aaa97d8b2ed4e54dc65d241a0da1c627454950f7d7b1f95b13985afd6c5d"}, + {file = "yarl-1.7.2-cp36-cp36m-win32.whl", hash = "sha256:87f6e082bce21464857ba58b569370e7b547d239ca22248be68ea5d6b51464a1"}, + {file = "yarl-1.7.2-cp36-cp36m-win_amd64.whl", hash = "sha256:ac35ccde589ab6a1870a484ed136d49a26bcd06b6a1c6397b1967ca13ceb3913"}, + {file = "yarl-1.7.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a467a431a0817a292121c13cbe637348b546e6ef47ca14a790aa2fa8cc93df63"}, + {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ab0c3274d0a846840bf6c27d2c60ba771a12e4d7586bf550eefc2df0b56b3b4"}, + {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d260d4dc495c05d6600264a197d9d6f7fc9347f21d2594926202fd08cf89a8ba"}, + {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fc4dd8b01a8112809e6b636b00f487846956402834a7fd59d46d4f4267181c41"}, + {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c1164a2eac148d85bbdd23e07dfcc930f2e633220f3eb3c3e2a25f6148c2819e"}, + {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:67e94028817defe5e705079b10a8438b8cb56e7115fa01640e9c0bb3edf67332"}, + {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:89ccbf58e6a0ab89d487c92a490cb5660d06c3a47ca08872859672f9c511fc52"}, + {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:8cce6f9fa3df25f55521fbb5c7e4a736683148bcc0c75b21863789e5185f9185"}, + {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:211fcd65c58bf250fb994b53bc45a442ddc9f441f6fec53e65de8cba48ded986"}, + {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c10ea1e80a697cf7d80d1ed414b5cb8f1eec07d618f54637067ae3c0334133c4"}, + {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:52690eb521d690ab041c3919666bea13ab9fbff80d615ec16fa81a297131276b"}, + {file = "yarl-1.7.2-cp37-cp37m-win32.whl", hash = "sha256:695ba021a9e04418507fa930d5f0704edbce47076bdcfeeaba1c83683e5649d1"}, + {file = "yarl-1.7.2-cp37-cp37m-win_amd64.whl", hash = "sha256:c17965ff3706beedafd458c452bf15bac693ecd146a60a06a214614dc097a271"}, + {file = "yarl-1.7.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fce78593346c014d0d986b7ebc80d782b7f5e19843ca798ed62f8e3ba8728576"}, + {file = "yarl-1.7.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c2a1ac41a6aa980db03d098a5531f13985edcb451bcd9d00670b03129922cd0d"}, + {file = "yarl-1.7.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:39d5493c5ecd75c8093fa7700a2fb5c94fe28c839c8e40144b7ab7ccba6938c8"}, + {file = "yarl-1.7.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1eb6480ef366d75b54c68164094a6a560c247370a68c02dddb11f20c4c6d3c9d"}, + {file = "yarl-1.7.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ba63585a89c9885f18331a55d25fe81dc2d82b71311ff8bd378fc8004202ff6"}, + {file = "yarl-1.7.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e39378894ee6ae9f555ae2de332d513a5763276a9265f8e7cbaeb1b1ee74623a"}, + {file = "yarl-1.7.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c0910c6b6c31359d2f6184828888c983d54d09d581a4a23547a35f1d0b9484b1"}, + {file = "yarl-1.7.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6feca8b6bfb9eef6ee057628e71e1734caf520a907b6ec0d62839e8293e945c0"}, + {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8300401dc88cad23f5b4e4c1226f44a5aa696436a4026e456fe0e5d2f7f486e6"}, + {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:788713c2896f426a4e166b11f4ec538b5736294ebf7d5f654ae445fd44270832"}, + {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fd547ec596d90c8676e369dd8a581a21227fe9b4ad37d0dc7feb4ccf544c2d59"}, + {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:737e401cd0c493f7e3dd4db72aca11cfe069531c9761b8ea474926936b3c57c8"}, + {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baf81561f2972fb895e7844882898bda1eef4b07b5b385bcd308d2098f1a767b"}, + {file = "yarl-1.7.2-cp38-cp38-win32.whl", hash = "sha256:ede3b46cdb719c794427dcce9d8beb4abe8b9aa1e97526cc20de9bd6583ad1ef"}, + {file = "yarl-1.7.2-cp38-cp38-win_amd64.whl", hash = "sha256:cc8b7a7254c0fc3187d43d6cb54b5032d2365efd1df0cd1749c0c4df5f0ad45f"}, + {file = "yarl-1.7.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:580c1f15500e137a8c37053e4cbf6058944d4c114701fa59944607505c2fe3a0"}, + {file = "yarl-1.7.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3ec1d9a0d7780416e657f1e405ba35ec1ba453a4f1511eb8b9fbab81cb8b3ce1"}, + {file = "yarl-1.7.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3bf8cfe8856708ede6a73907bf0501f2dc4e104085e070a41f5d88e7faf237f3"}, + {file = "yarl-1.7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1be4bbb3d27a4e9aa5f3df2ab61e3701ce8fcbd3e9846dbce7c033a7e8136746"}, + {file = "yarl-1.7.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:534b047277a9a19d858cde163aba93f3e1677d5acd92f7d10ace419d478540de"}, + {file = "yarl-1.7.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6ddcd80d79c96eb19c354d9dca95291589c5954099836b7c8d29278a7ec0bda"}, + {file = "yarl-1.7.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9bfcd43c65fbb339dc7086b5315750efa42a34eefad0256ba114cd8ad3896f4b"}, + {file = "yarl-1.7.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f64394bd7ceef1237cc604b5a89bf748c95982a84bcd3c4bbeb40f685c810794"}, + {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044daf3012e43d4b3538562da94a88fb12a6490652dbc29fb19adfa02cf72eac"}, + {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:368bcf400247318382cc150aaa632582d0780b28ee6053cd80268c7e72796dec"}, + {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:bab827163113177aee910adb1f48ff7af31ee0289f434f7e22d10baf624a6dfe"}, + {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0cba38120db72123db7c58322fa69e3c0efa933040ffb586c3a87c063ec7cae8"}, + {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:59218fef177296451b23214c91ea3aba7858b4ae3306dde120224cfe0f7a6ee8"}, + {file = "yarl-1.7.2-cp39-cp39-win32.whl", hash = "sha256:1edc172dcca3f11b38a9d5c7505c83c1913c0addc99cd28e993efeaafdfaa18d"}, + {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/poetry.toml b/packages/plugins/minos-discovery-minos/poetry.toml new file mode 100644 index 000000000..ab1033bd3 --- /dev/null +++ b/packages/plugins/minos-discovery-minos/poetry.toml @@ -0,0 +1,2 @@ +[virtualenvs] +in-project = true diff --git a/packages/plugins/minos-discovery-minos/pyproject.toml b/packages/plugins/minos-discovery-minos/pyproject.toml new file mode 100644 index 000000000..d608125d6 --- /dev/null +++ b/packages/plugins/minos-discovery-minos/pyproject.toml @@ -0,0 +1,54 @@ +[tool.poetry] +name = "minos-discovery-minos" +version = "0.5.0" +description = "The minos-discover plugin of the Minos Framework" +readme = "README.md" +repository = "https://github.com/minos-framework/minos-python" +homepage = "http://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 = [ + "AUTHORS.md", + "HISTORY.md", + "LICENSE", +] + +[tool.poetry.dependencies] +python = "^3.9" +minos-microservice-common = "^0.4.0" +minos-microservice-networks = "^0.4.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" +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"] +build-backend = "poetry.core.masonry.api" diff --git a/packages/plugins/minos-discovery-minos/setup.cfg b/packages/plugins/minos-discovery-minos/setup.cfg new file mode 100644 index 000000000..dbb9ac849 --- /dev/null +++ b/packages/plugins/minos-discovery-minos/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-minos/tests/test_minos_discovery/__init__.py b/packages/plugins/minos-discovery-minos/tests/test_minos_discovery/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_discovery/test_clients/test_minos_discovery.py b/packages/plugins/minos-discovery-minos/tests/test_minos_discovery/test_client.py similarity index 74% rename from packages/core/minos-microservice-networks/tests/test_networks/test_discovery/test_clients/test_minos_discovery.py rename to packages/plugins/minos-discovery-minos/tests/test_minos_discovery/test_client.py index 314958d30..d412b1340 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_discovery/test_clients/test_minos_discovery.py +++ b/packages/plugins/minos-discovery-minos/tests/test_minos_discovery/test_client.py @@ -8,9 +8,11 @@ ) from minos.networks import ( - MinosDiscoveryClient, MinosDiscoveryConnectorException, ) +from minos.plugins.minos_discovery import ( + MinosDiscoveryClient, +) _Response = namedtuple("Response", ["ok"]) @@ -52,21 +54,13 @@ async def test_subscribe(self, mock): self.assertEqual(expected, mock.call_args) @patch("aiohttp.ClientSession.post") - async def test_subscribe_raises_failure(self, mock): + async def test_subscribe_raises(self, mock): mock.return_value.__aenter__ = _fn_failure with self.assertRaises(MinosDiscoveryConnectorException): await self.client.subscribe("56.56.56.56", 56, "test", [{"url": "/foo", "method": "POST"}], retry_delay=0) self.assertEqual(3, mock.call_count) - @patch("aiohttp.ClientSession.post") - async def test_subscribe_raises_exception(self, mock): - mock.return_value.__aenter__ = _fn_raises - - with self.assertRaises(MinosDiscoveryConnectorException): - await self.client.subscribe("56.56.56.56", 56, "test", [{"url": "/foo", "method": "POST"}], retry_delay=0) - self.assertEqual(3, mock.call_count) - @patch("aiohttp.ClientSession.delete") async def test_unsubscribe(self, mock): mock.return_value.__aenter__ = _fn @@ -76,21 +70,13 @@ async def test_unsubscribe(self, mock): self.assertEqual(call("http://123.456.123.1:1234/microservices/test"), mock.call_args) @patch("aiohttp.ClientSession.delete") - async def test_unsubscribe_raises_failure(self, mock): + async def test_unsubscribe_raises(self, mock): mock.return_value.__aenter__ = _fn_failure with self.assertRaises(MinosDiscoveryConnectorException): await self.client.unsubscribe("test", retry_delay=0) self.assertEqual(3, mock.call_count) - @patch("aiohttp.ClientSession.delete") - async def test_unsubscribe_raises_exception(self, mock): - mock.return_value.__aenter__ = _fn_raises - - with self.assertRaises(MinosDiscoveryConnectorException): - await self.client.unsubscribe("test", retry_delay=0) - self.assertEqual(3, mock.call_count) - if __name__ == "__main__": unittest.main() diff --git a/poetry.lock b/poetry.lock index b331d6c9d..6d14c11f4 100644 --- a/poetry.lock +++ b/poetry.lock @@ -130,28 +130,24 @@ pytz = ">=2015.7" [[package]] name = "black" -version = "21.12b0" +version = "22.1.0" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.6.2" [package.dependencies] -click = ">=7.1.2" +click = ">=8.0.0" mypy-extensions = ">=0.4.3" -pathspec = ">=0.9.0,<1" +pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = ">=0.2.6,<2.0.0" -typing-extensions = [ - {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}, - {version = "!=3.10.0.1", markers = "python_version >= \"3.10\""}, -] +tomli = ">=1.1.0" +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)"] -python2 = ["typed-ast (>=1.4.3)"] uvloop = ["uvloop (>=0.15.2)"] [[package]] @@ -180,7 +176,7 @@ python-versions = ">=3.6.1" [[package]] name = "charset-normalizer" -version = "2.0.10" +version = "2.0.11" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "main" optional = false @@ -224,7 +220,7 @@ development = ["black", "flake8", "mypy", "pytest", "types-colorama"] [[package]] name = "coverage" -version = "6.3" +version = "6.3.1" description = "Code coverage measurement for Python" category = "dev" optional = false @@ -243,7 +239,7 @@ python-versions = "*" [[package]] name = "dependency-injector" -version = "4.37.0" +version = "4.38.0" description = "Dependency injection framework for Python" category = "main" optional = false @@ -323,7 +319,7 @@ python-versions = ">=3.7" [[package]] name = "identify" -version = "2.4.5" +version = "2.4.7" description = "File identification library for Python" category = "dev" optional = false @@ -447,9 +443,27 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "minos-broker-kafka" +version = "0.4.1" +description = "Minos Broker Kafka package" +category = "main" +optional = false +python-versions = "^3.9" +develop = true + +[package.dependencies] +aiokafka = "^0.7.0" +minos-microservice-common = "^0.4.0" +minos-microservice-networks = "^0.4.0" + +[package.source] +type = "directory" +url = "packages/plugins/minos-broker-kafka" + [[package]] name = "minos-microservice-aggregate" -version = "0.4.0" +version = "0.4.1" description = "Python Package for Minos Microservices containing all the Aggregate stuff" category = "main" optional = false @@ -466,7 +480,7 @@ url = "packages/core/minos-microservice-aggregate" [[package]] name = "minos-microservice-common" -version = "0.4.0" +version = "0.4.1" description = "Python Package with common Classes and Utilities used in Minos Microservices." category = "main" optional = false @@ -489,7 +503,7 @@ url = "packages/core/minos-microservice-common" [[package]] name = "minos-microservice-cqrs" -version = "0.4.0" +version = "0.4.1" description = "Minos Microservice CQRS package" category = "main" optional = false @@ -508,7 +522,7 @@ url = "packages/core/minos-microservice-cqrs" [[package]] name = "minos-microservice-networks" -version = "0.4.0" +version = "0.4.1" description = "Python Package with the common network classes and utilities used in Minos Microservice." category = "main" optional = false @@ -517,7 +531,6 @@ develop = true [package.dependencies] aiohttp = "^3.7.4" -aiokafka = "^0.7.0" aiomisc = "^14.0.3" aiopg = "^1.2.1" crontab = "^0.23.0" @@ -531,7 +544,7 @@ url = "packages/core/minos-microservice-networks" [[package]] name = "minos-microservice-saga" -version = "0.4.0" +version = "0.4.1" description = "Saga Library for MinOS project." category = "main" optional = false @@ -932,11 +945,11 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "tomli" -version = "1.2.3" +version = "2.0.0" description = "A lil' TOML parser" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "typing-extensions" @@ -1004,7 +1017,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "33fedaaa2db26d5be69f53f87a6a3de1d454861b75f229c97e5c8004a7c190ba" +content-hash = "791434a286b5460c30e700201c900312b2a941951430e346c51000033f1f65b9" [metadata.files] aiohttp = [ @@ -1137,8 +1150,29 @@ babel = [ {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, ] black = [ - {file = "black-21.12b0-py3-none-any.whl", hash = "sha256:a615e69ae185e08fdd73e4715e260e2479c861b5740057fde6e8b4e3b7dd589f"}, - {file = "black-21.12b0.tar.gz", hash = "sha256:77b80f693a569e2e527958459634f18df9b0ba2625ba4e0c2d5da5be42e6f2b3"}, + {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"}, ] cached-property = [ {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, @@ -1153,8 +1187,8 @@ cfgv = [ {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, ] charset-normalizer = [ - {file = "charset-normalizer-2.0.10.tar.gz", hash = "sha256:876d180e9d7432c5d1dfd4c5d26b72f099d503e8fcc0feb7532c9289be60fcbd"}, - {file = "charset_normalizer-2.0.10-py3-none-any.whl", hash = "sha256:cb957888737fc0bbcd78e3df769addb41fd1ff8cf950dc9e7ad7793f1bf44455"}, + {file = "charset-normalizer-2.0.11.tar.gz", hash = "sha256:98398a9d69ee80548c762ba991a4728bfc3836768ed226b3945908d1a688371c"}, + {file = "charset_normalizer-2.0.11-py3-none-any.whl", hash = "sha256:2842d8f5e82a1f6aa437380934d5e1cd4fcf2003b06fed6940769c164a480a45"}, ] click = [ {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, @@ -1169,91 +1203,88 @@ colorlog = [ {file = "colorlog-6.6.0.tar.gz", hash = "sha256:344f73204009e4c83c5b6beb00b3c45dc70fcdae3c80db919e0a4171d006fde8"}, ] coverage = [ - {file = "coverage-6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e8071e7d9ba9f457fc674afc3de054450be2c9b195c470147fbbc082468d8ff7"}, - {file = "coverage-6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:86c91c511853dfda81c2cf2360502cb72783f4b7cebabef27869f00cbe1db07d"}, - {file = "coverage-6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c4ce3b647bd1792d4394f5690d9df6dc035b00bcdbc5595099c01282a59ae01"}, - {file = "coverage-6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a491e159294d756e7fc8462f98175e2d2225e4dbe062cca7d3e0d5a75ba6260"}, - {file = "coverage-6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d008e0f67ac800b0ca04d7914b8501312c8c6c00ad8c7ba17754609fae1231a"}, - {file = "coverage-6.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4578728c36de2801c1deb1c6b760d31883e62e33f33c7ba8f982e609dc95167d"}, - {file = "coverage-6.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7ee317486593193e066fc5e98ac0ce712178c21529a85c07b7cb978171f25d53"}, - {file = "coverage-6.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2bc85664b06ba42d14bb74d6ddf19d8bfc520cb660561d2d9ce5786ae72f71b5"}, - {file = "coverage-6.3-cp310-cp310-win32.whl", hash = "sha256:27a94db5dc098c25048b0aca155f5fac674f2cf1b1736c5272ba28ead2fc267e"}, - {file = "coverage-6.3-cp310-cp310-win_amd64.whl", hash = "sha256:bde4aeabc0d1b2e52c4036c54440b1ad05beeca8113f47aceb4998bb7471e2c2"}, - {file = "coverage-6.3-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:509c68c3e2015022aeda03b003dd68fa19987cdcf64e9d4edc98db41cfc45d30"}, - {file = "coverage-6.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e4ff163602c5c77e7bb4ea81ba5d3b793b4419f8acd296aae149370902cf4e92"}, - {file = "coverage-6.3-cp311-cp311-win_amd64.whl", hash = "sha256:d1675db48490e5fa0b300f6329ecb8a9a37c29b9ab64fa9c964d34111788ca2d"}, - {file = "coverage-6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7eed8459a2b81848cafb3280b39d7d49950d5f98e403677941c752e7e7ee47cb"}, - {file = "coverage-6.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b4285fde5286b946835a1a53bba3ad41ef74285ba9e8013e14b5ea93deaeafc"}, - {file = "coverage-6.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4748349734110fd32d46ff8897b561e6300d8989a494ad5a0a2e4f0ca974fc7"}, - {file = "coverage-6.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:823f9325283dc9565ba0aa2d240471a93ca8999861779b2b6c7aded45b58ee0f"}, - {file = "coverage-6.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:fff16a30fdf57b214778eff86391301c4509e327a65b877862f7c929f10a4253"}, - {file = "coverage-6.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:da1a428bdbe71f9a8c270c7baab29e9552ac9d0e0cba5e7e9a4c9ee6465d258d"}, - {file = "coverage-6.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7d82c610a2e10372e128023c5baf9ce3d270f3029fe7274ff5bc2897c68f1318"}, - {file = "coverage-6.3-cp37-cp37m-win32.whl", hash = "sha256:11e61c5548ecf74ea1f8b059730b049871f0e32b74f88bd0d670c20c819ad749"}, - {file = "coverage-6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:8e0c3525b1a182c8ffc9bca7e56b521e0c2b8b3e82f033c8e16d6d721f1b54d6"}, - {file = "coverage-6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a189036c50dcd56100746139a459f0d27540fef95b09aba03e786540b8feaa5f"}, - {file = "coverage-6.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:32168001f33025fd756884d56d01adebb34e6c8c0b3395ca8584cdcee9c7c9d2"}, - {file = "coverage-6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5d79c9af3f410a2b5acad91258b4ae179ee9c83897eb9de69151b179b0227f5"}, - {file = "coverage-6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:85c5fc9029043cf8b07f73fbb0a7ab6d3b717510c3b5642b77058ea55d7cacde"}, - {file = "coverage-6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7596aa2f2b8fa5604129cfc9a27ad9beec0a96f18078cb424d029fdd707468d"}, - {file = "coverage-6.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ce443a3e6df90d692c38762f108fc4c88314bf477689f04de76b3f252e7a351c"}, - {file = "coverage-6.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:012157499ec4f135fc36cd2177e3d1a1840af9b236cbe80e9a5ccfc83d912a69"}, - {file = "coverage-6.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0a34d313105cdd0d3644c56df2d743fe467270d6ab93b5d4a347eb9fec8924d6"}, - {file = "coverage-6.3-cp38-cp38-win32.whl", hash = "sha256:6e78b1e25e5c5695dea012be473e442f7094d066925604be20b30713dbd47f89"}, - {file = "coverage-6.3-cp38-cp38-win_amd64.whl", hash = "sha256:433b99f7b0613bdcdc0b00cc3d39ed6d756797e3b078d2c43f8a38288520aec6"}, - {file = "coverage-6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9ed3244b415725f08ca3bdf02ed681089fd95e9465099a21c8e2d9c5d6ca2606"}, - {file = "coverage-6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab4fc4b866b279740e0d917402f0e9a08683e002f43fa408e9655818ed392196"}, - {file = "coverage-6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8582e9280f8d0f38114fe95a92ae8d0790b56b099d728cc4f8a2e14b1c4a18c"}, - {file = "coverage-6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c72bb4679283c6737f452eeb9b2a0e570acaef2197ad255fb20162adc80bea76"}, - {file = "coverage-6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca29c352389ea27a24c79acd117abdd8a865c6eb01576b6f0990cd9a4e9c9f48"}, - {file = "coverage-6.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:152cc2624381df4e4e604e21bd8e95eb8059535f7b768c1fb8b8ae0b26f47ab0"}, - {file = "coverage-6.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:51372e24b1f7143ee2df6b45cff6a721f3abe93b1e506196f3ffa4155c2497f7"}, - {file = "coverage-6.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:72d9d186508325a456475dd05b1756f9a204c7086b07fffb227ef8cee03b1dc2"}, - {file = "coverage-6.3-cp39-cp39-win32.whl", hash = "sha256:649df3641eb351cdfd0d5533c92fc9df507b6b2bf48a7ef8c71ab63cbc7b5c3c"}, - {file = "coverage-6.3-cp39-cp39-win_amd64.whl", hash = "sha256:e67ccd53da5958ea1ec833a160b96357f90859c220a00150de011b787c27b98d"}, - {file = "coverage-6.3-pp36.pp37.pp38-none-any.whl", hash = "sha256:27ac7cb84538e278e07569ceaaa6f807a029dc194b1c819a9820b9bb5dbf63ab"}, - {file = "coverage-6.3.tar.gz", hash = "sha256:987a84ff98a309994ca77ed3cc4b92424f824278e48e4bf7d1bb79a63cfe2099"}, + {file = "coverage-6.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeffd96882d8c06d31b65dddcf51db7c612547babc1c4c5db6a011abe9798525"}, + {file = "coverage-6.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:621f6ea7260ea2ffdaec64fe5cb521669984f567b66f62f81445221d4754df4c"}, + {file = "coverage-6.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84f2436d6742c01136dd940ee158bfc7cf5ced3da7e4c949662b8703b5cd8145"}, + {file = "coverage-6.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de73fca6fb403dd72d4da517cfc49fcf791f74eee697d3219f6be29adf5af6ce"}, + {file = "coverage-6.3.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78fbb2be068a13a5d99dce9e1e7d168db880870f7bc73f876152130575bd6167"}, + {file = "coverage-6.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f5a4551dfd09c3bd12fca8144d47fe7745275adf3229b7223c2f9e29a975ebda"}, + {file = "coverage-6.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7bff3a98f63b47464480de1b5bdd80c8fade0ba2832c9381253c9b74c4153c27"}, + {file = "coverage-6.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a06c358f4aed05fa1099c39decc8022261bb07dfadc127c08cfbd1391b09689e"}, + {file = "coverage-6.3.1-cp310-cp310-win32.whl", hash = "sha256:9fff3ff052922cb99f9e52f63f985d4f7a54f6b94287463bc66b7cdf3eb41217"}, + {file = "coverage-6.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:276b13cc085474e482566c477c25ed66a097b44c6e77132f3304ac0b039f83eb"}, + {file = "coverage-6.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:56c4a409381ddd7bbff134e9756077860d4e8a583d310a6f38a2315b9ce301d0"}, + {file = "coverage-6.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9eb494070aa060ceba6e4bbf44c1bc5fa97bfb883a0d9b0c9049415f9e944793"}, + {file = "coverage-6.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e15d424b8153756b7c903bde6d4610be0c3daca3986173c18dd5c1a1625e4cd"}, + {file = "coverage-6.3.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61d47a897c1e91f33f177c21de897267b38fbb45f2cd8e22a710bcef1df09ac1"}, + {file = "coverage-6.3.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:25e73d4c81efa8ea3785274a2f7f3bfbbeccb6fcba2a0bdd3be9223371c37554"}, + {file = "coverage-6.3.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:fac0bcc5b7e8169bffa87f0dcc24435446d329cbc2b5486d155c2e0f3b493ae1"}, + {file = "coverage-6.3.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:72128176fea72012063200b7b395ed8a57849282b207321124d7ff14e26988e8"}, + {file = "coverage-6.3.1-cp37-cp37m-win32.whl", hash = "sha256:1bc6d709939ff262fd1432f03f080c5042dc6508b6e0d3d20e61dd045456a1a0"}, + {file = "coverage-6.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:618eeba986cea7f621d8607ee378ecc8c2504b98b3fdc4952b30fe3578304687"}, + {file = "coverage-6.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d5ed164af5c9078596cfc40b078c3b337911190d3faeac830c3f1274f26b8320"}, + {file = "coverage-6.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:352c68e233409c31048a3725c446a9e48bbff36e39db92774d4f2380d630d8f8"}, + {file = "coverage-6.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:448d7bde7ceb6c69e08474c2ddbc5b4cd13c9e4aa4a717467f716b5fc938a734"}, + {file = "coverage-6.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9fde6b90889522c220dd56a670102ceef24955d994ff7af2cb786b4ba8fe11e4"}, + {file = "coverage-6.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e647a0be741edbb529a72644e999acb09f2ad60465f80757da183528941ff975"}, + {file = "coverage-6.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a5cdc3adb4f8bb8d8f5e64c2e9e282bc12980ef055ec6da59db562ee9bdfefa"}, + {file = "coverage-6.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2dd70a167843b4b4b2630c0c56f1b586fe965b4f8ac5da05b6690344fd065c6b"}, + {file = "coverage-6.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9ad0a117b8dc2061ce9461ea4c1b4799e55edceb236522c5b8f958ce9ed8fa9a"}, + {file = "coverage-6.3.1-cp38-cp38-win32.whl", hash = "sha256:e92c7a5f7d62edff50f60a045dc9542bf939758c95b2fcd686175dd10ce0ed10"}, + {file = "coverage-6.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:482fb42eea6164894ff82abbcf33d526362de5d1a7ed25af7ecbdddd28fc124f"}, + {file = "coverage-6.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c5b81fb37db76ebea79aa963b76d96ff854e7662921ce742293463635a87a78d"}, + {file = "coverage-6.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a4f923b9ab265136e57cc14794a15b9dcea07a9c578609cd5dbbfff28a0d15e6"}, + {file = "coverage-6.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56d296cbc8254a7dffdd7bcc2eb70be5a233aae7c01856d2d936f5ac4e8ac1f1"}, + {file = "coverage-6.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1245ab82e8554fa88c4b2ab1e098ae051faac5af829efdcf2ce6b34dccd5567c"}, + {file = "coverage-6.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f2b05757c92ad96b33dbf8e8ec8d4ccb9af6ae3c9e9bd141c7cc44d20c6bcba"}, + {file = "coverage-6.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9e3dd806f34de38d4c01416344e98eab2437ac450b3ae39c62a0ede2f8b5e4ed"}, + {file = "coverage-6.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d651fde74a4d3122e5562705824507e2f5b2d3d57557f1916c4b27635f8fbe3f"}, + {file = "coverage-6.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:704f89b87c4f4737da2860695a18c852b78ec7279b24eedacab10b29067d3a38"}, + {file = "coverage-6.3.1-cp39-cp39-win32.whl", hash = "sha256:2aed4761809640f02e44e16b8b32c1a5dee5e80ea30a0ff0912158bde9c501f2"}, + {file = "coverage-6.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:9976fb0a5709988778ac9bc44f3d50fccd989987876dfd7716dee28beed0a9fa"}, + {file = "coverage-6.3.1-pp36.pp37.pp38-none-any.whl", hash = "sha256:463e52616ea687fd323888e86bf25e864a3cc6335a043fad6bbb037dbf49bbe2"}, + {file = "coverage-6.3.1.tar.gz", hash = "sha256:6c3f6158b02ac403868eea390930ae64e9a9a2a5bbfafefbb920d29258d9f2f8"}, ] crontab = [ {file = "crontab-0.23.0.tar.gz", hash = "sha256:ca79dede9c2f572bb32f38703e8fddcf3427e86edc838f2ffe7ae4b9ee2b0733"}, ] dependency-injector = [ - {file = "dependency-injector-4.37.0.tar.gz", hash = "sha256:8881c65ecc133d4b0af1cf35215a7bfab8d907e10ee1452d2dfef27cc3ca23d3"}, - {file = "dependency_injector-4.37.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6fdabe9dd14259fe14eb4c65f5bf244524a5cc43a474cb448528daeda4453573"}, - {file = "dependency_injector-4.37.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a184b71e8aa2fffd6c3d3828c2db045a14c3bc1ac9ca7945db76b9ac93efca81"}, - {file = "dependency_injector-4.37.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0cc2cb5b85a587f9b95505391ab4f1ef02432a590807f2230f445666d0bd3984"}, - {file = "dependency_injector-4.37.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:985570539c2703c6c009077026042a05b05474e75bec585607a556c1970bdeee"}, - {file = "dependency_injector-4.37.0-cp310-cp310-win32.whl", hash = "sha256:b73bd0dd82b42950fb78baae68750ecb5c943d39cbfacea8dbee9d6df6535427"}, - {file = "dependency_injector-4.37.0-cp310-cp310-win_amd64.whl", hash = "sha256:a944c1bbbb81dbeca8c30001bc8b7e061ca52cf291bf0dd35005863484e6ea8a"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d15b6fe1be06bffecf9b5f28fd972596f1ef6b7553d884c317b6d472ca0fb040"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbf05aefcb3cd856624e2203f69a61ad54ffa0541a23a8e6d136c178b7a37153"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ededd0f6f7abe153030f3f50959abf5cb65bf7e5215a59b9333e027d6262d161"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a3c5312fa1854eb45ed78a720ac5e1e354769e55a2fb42ca142b5dd612e8f0da"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-win32.whl", hash = "sha256:6446bd95a80a487893e162eeb8aa2f3029ab47bb4641a9e5d431f3c024b459c9"}, - {file = "dependency_injector-4.37.0-cp36-cp36m-win_amd64.whl", hash = "sha256:fb29620e8249d66e8328d30c44d2f788d773132cdb6d0d62be4f1dd4343fc748"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c9fad82e44a34c83a0b522692aace49f3149d44b3ff826197a131a27a8df51df"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bfbcaa71ea2fd3a54e46d5038e6cedbb66d7c1319ac638f935f6cbba348ffc9"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d550f4e9e81e87ae23c5086e5b3b08f2331a02e9dc7a2553ce16275ba9921817"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a5242bca4f404c4918ba00b48fa1780c42903a9ff850956e04134bfc8b423d04"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-win32.whl", hash = "sha256:59f557f1f1f7fe856759fdc59b5f2c012e4caaf05b4f848cbb1f250bdf4d8541"}, - {file = "dependency_injector-4.37.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c69196827505288a8f94f9d36d4b4829fb23d5a62f0898e0aa7d5ad1fce0505e"}, - {file = "dependency_injector-4.37.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7639c601288417352af3318d683e96f034ffb685de2cfb8d79a75f982c262302"}, - {file = "dependency_injector-4.37.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b607090446e697b77d36be523ed845021d2379d62fcaf152998127066b70d80"}, - {file = "dependency_injector-4.37.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c9f31a7b3806098476767531b40f8a59dac726ce7602158a6e093f9e2be46f1a"}, - {file = "dependency_injector-4.37.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:86c4e918064de9e300152233da096797c4de7bb8e33ce86a7c6a398daf760c57"}, - {file = "dependency_injector-4.37.0-cp38-cp38-win32.whl", hash = "sha256:9756873290abd53111f9a7edc055c62a7968ac67d0fc3f49e7dba5bdda5c78a3"}, - {file = "dependency_injector-4.37.0-cp38-cp38-win_amd64.whl", hash = "sha256:35ac330fc1ed6ba0751f3eaa6a6f068c4e88cb1069bbe0c10568847db00dc62d"}, - {file = "dependency_injector-4.37.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6dc75b54da62da105ea5d4541bc5f1d0d1edb1be3763d2e9e1184fd0f249f23b"}, - {file = "dependency_injector-4.37.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9f9572021c4ed1ae59d22437ba60c4d92d1a1ec1e5fee1f81ef0c58096b9ee8"}, - {file = "dependency_injector-4.37.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2c796ec1de86c5bd34ba6a96ea95409582ebc8e54d9a62f263c7c7852d593ae6"}, - {file = "dependency_injector-4.37.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b7fda0bd48b8b3d6f9e7227d872b7d0cc95b8d54f296213369867f7490e38d06"}, - {file = "dependency_injector-4.37.0-cp39-cp39-win32.whl", hash = "sha256:c80521fc43f2812fec10ab4b92e7168659e25b5b13e0e3d45da0260e959da24a"}, - {file = "dependency_injector-4.37.0-cp39-cp39-win_amd64.whl", hash = "sha256:8930da0c2a0bdc3d96863e9f9522abeeb106ee7bb5c670805e97e42838191998"}, - {file = "dependency_injector-4.37.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6001f91e67700479088763babe976354538344ca347abe2d4405f6f4bc40b803"}, - {file = "dependency_injector-4.37.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14ccce9356f161c42664b73085c7ead179186e6cb8434bf885fa64b213e32712"}, - {file = "dependency_injector-4.37.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:58be030a8b0f4a856523ce3799cecfcf686a545b79f1f897262cec43090a7fd3"}, - {file = "dependency_injector-4.37.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a3bc779fe3f1331299032c51ec66c01dfd49e1a052c7ac3ac96aef30313c2e80"}, - {file = "dependency_injector-4.37.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:7c781db928a6f02f5f373773dc1a263e1e9dfcce2a854b42c9c261db2eb0042f"}, + {file = "dependency-injector-4.38.0.tar.gz", hash = "sha256:bab4c323d822d3fc9936e8eb3c2f5553d75e9efdadac11d5b293a016e31a1477"}, + {file = "dependency_injector-4.38.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:025eb5f97021663715bff8e01feb83d5b2f66fc17ece1042a194f1aae88c0d85"}, + {file = "dependency_injector-4.38.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3c61334b196ab767eae43af207764349287d5eb0283d8ed1ab24608121aea35"}, + {file = "dependency_injector-4.38.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9bf4bfc52015e81c4f17647b7bbbe4e4549f041b3c6635b44a9ecede7594932c"}, + {file = "dependency_injector-4.38.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7aeba5882b06baf78978f33228e4c44133dada9173e330da68fbccca98520848"}, + {file = "dependency_injector-4.38.0-cp310-cp310-win32.whl", hash = "sha256:445dbf5324eee215a465d7f3b1965b05e199c31caa09e63abf0f02d982791306"}, + {file = "dependency_injector-4.38.0-cp310-cp310-win_amd64.whl", hash = "sha256:880edbcb5d810faa0623112e2e652a7bec73d20ce0708d9db998a0a40b62cbb9"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cd6f1c130462e7461a43f82fdc0d2ba25b5ef594db823dbd0e57f3d1b7c44f86"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be75905f7513886699d3ff5ed9aca233175c03808fc888da2a53b83af0a5d65"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d7f1a7d27de6295ce8b7ca69d1177817bf36c7cbaf73819e4bab04f87c5e962"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e9c1ff387d7b7d814e9d29a531c6804acc67b1cca578c09abd3590fa7ec6bf06"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-win32.whl", hash = "sha256:7770efcbc6915dabbb31ea0bdeee1105dabf76e1c8e31a454cb1983dcf19ecf1"}, + {file = "dependency_injector-4.38.0-cp36-cp36m-win_amd64.whl", hash = "sha256:9e89a9c88317ad237abfb374c410e1466476ffefe6c44f3caeca3dce747a635c"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cb75cd29c132bfaf03a11a6ac4f459dddb7a6526669543de57d2bb5fddf78def"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d116c56e7fc3b59b3afa6078163b5f6ff4680ebf27800dd4032de7a04f7ef777"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9df330ef9e24b6f94e6764d23180350c2fb99785257233ee4738e066b876fa7f"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7a46639038313f64eca2dc858ac4cd9e0aca5ea21bb005f5d754aadd6446ba4b"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-win32.whl", hash = "sha256:d0d983b269b657744058b5858afc3c59443db53afe9c3e709e316daa9f9b9454"}, + {file = "dependency_injector-4.38.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1446df58169c166a5a2d5644ba9eeb3b7f2f679f260596f78d012c58ff140d92"}, + {file = "dependency_injector-4.38.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:307396f2d9d2f532fe92079a56d40af5fc60dacb1d766e3f9cd04c3802a1c251"}, + {file = "dependency_injector-4.38.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dd96b6c454ab86648f57f37b895c1c976b1a82b76f835011f607ee8a78ebc0e"}, + {file = "dependency_injector-4.38.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fb44b17e649cabcfd1f370ecfd492ac7a93216776d91954b31598eecb36cdb13"}, + {file = "dependency_injector-4.38.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ab8ebe728dd9b3be23c40ca5a5dbe195050d9ad35d42d7e9fdaea816f7134584"}, + {file = "dependency_injector-4.38.0-cp38-cp38-win32.whl", hash = "sha256:1da3bad1452212bab76e87fbf7a71d3675190a1a909f345aaf8bae2fa97b878f"}, + {file = "dependency_injector-4.38.0-cp38-cp38-win_amd64.whl", hash = "sha256:2918776e88de88be0e2be036261180ca0605c8f64ead43d835ce852f16a9efd2"}, + {file = "dependency_injector-4.38.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:493be62561218624380d4eca9243a46753444f677217db6292a7b715cf429172"}, + {file = "dependency_injector-4.38.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a70511db88f84ac4228b27e37e12ea0e04a9c2a32cae3602b9af9a27c0db992"}, + {file = "dependency_injector-4.38.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e3e1cfe41a5ada0ff71889563441f538caff0399e41d3ee377b60fa50a858bf"}, + {file = "dependency_injector-4.38.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:116cc679a2c6d40c6a4f968aefe68535e596e88e96315dbd0d0ad2ff76654e3d"}, + {file = "dependency_injector-4.38.0-cp39-cp39-win32.whl", hash = "sha256:f703c2c161de067ba9893b56743d24fb4c9dbff92eb504bc082c2d2cfeab4c01"}, + {file = "dependency_injector-4.38.0-cp39-cp39-win_amd64.whl", hash = "sha256:6821a864d6405dc0d5f794ac1b10da4a8c7e8731c6a0651a9682a0b76f5a5b3e"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6c9e8dc91aa5831bd3a58fec1b94ed8c52f78f601f5ab91135b5ad44325beef7"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b4eedadef0c84295b70803a79a3ce5a10a59dddd8f306876f6fa6bfc4de8e00"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2e88b5d09c80e20d6b3d985cc360f39a81e748667c20f6bc7eee9f4b832176ed"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b1fcd71ff46e097f4e47917ccdf6aa388b6a6372557f7d9f83db1e879e95f8bb"}, + {file = "dependency_injector-4.38.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:9633d6366282e83a3f21543c5c78299787948333d9fe6649b020cfac93d8b7ca"}, ] distlib = [ {file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"}, @@ -1351,8 +1382,8 @@ frozenlist = [ {file = "frozenlist-1.3.0.tar.gz", hash = "sha256:ce6f2ba0edb7b0c1d8976565298ad2deba6f8064d2bebb6ffce2ca896eb35b0b"}, ] identify = [ - {file = "identify-2.4.5-py2.py3-none-any.whl", hash = "sha256:d27d10099844741c277b45d809bd452db0d70a9b41ea3cd93799ebbbcc6dcb29"}, - {file = "identify-2.4.5.tar.gz", hash = "sha256:d11469ff952a4d7fd7f9be520d335dc450f585d474b39b5dfb86a500831ab6c7"}, + {file = "identify-2.4.7-py2.py3-none-any.whl", hash = "sha256:e64210654dfbca6ced33230eb1b137591a0981425e1a60b4c6c36309f787bbd5"}, + {file = "identify-2.4.7.tar.gz", hash = "sha256:8408f01e0be25492017346d7dffe7e7711b762b23375c775d24d3bc38618fabc"}, ] idna = [ {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, @@ -1490,6 +1521,7 @@ 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-broker-kafka = [] minos-microservice-aggregate = [] minos-microservice-common = [] minos-microservice-cqrs = [] @@ -1796,8 +1828,8 @@ toml = [ {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] tomli = [ - {file = "tomli-1.2.3-py3-none-any.whl", hash = "sha256:e3069e4be3ead9668e21cb9b074cd948f7b3113fd9c8bba083f48247aab8b11c"}, - {file = "tomli-1.2.3.tar.gz", hash = "sha256:05b6166bff487dc068d322585c7ea4ef78deed501cc124060e0f238e89a9231f"}, + {file = "tomli-2.0.0-py3-none-any.whl", hash = "sha256:b5bde28da1fed24b9bd1d4d2b8cba62300bfb4ec9a6187a957e8ddb9434c5224"}, + {file = "tomli-2.0.0.tar.gz", hash = "sha256:c292c34f58502a1eb2bbb9f5bbc9a5ebc37bee10ffb8c2d6bbdfa8eb13cc14e1"}, ] typing-extensions = [ {file = "typing_extensions-4.0.1-py3-none-any.whl", hash = "sha256:7f001e5ac290a0c0401508864c7ec868be4e701886d5b573a9528ed3973d9d3b"}, diff --git a/pyproject.toml b/pyproject.toml index 3ee16910a..d20715469 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,9 +12,11 @@ minos-microservice-networks = { path = "packages/core/minos-microservice-network minos-microservice-aggregate = { path = "packages/core/minos-microservice-aggregate", develop = true } 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 } [tool.poetry.dev-dependencies] -black = "^21.12b0" +black = "^22.1" isort = "^5.8.0" pytest = "^6.2.4" coverage = "^6.3"