From 44333a6784b85597a30adaf150d93a242d31316f Mon Sep 17 00:00:00 2001 From: Lukasz Ostrowski Date: Wed, 19 Jul 2023 10:21:39 +0200 Subject: [PATCH] Remove monitoring app (#784) * Remove monitoring app * remove monitoring cicd --- .changeset/four-walls-rhyme.md | 1 - .changeset/nasty-mugs-divide.md | 1 - .github/dependabot.yaml | 21 - .github/labeler.yml | 1 - .../build-and-publish-monitoring-backend.yml | 81 - .github/workflows/unit-tests-monitoring.yml | 33 - apps/monitoring/.env.example | 1 - apps/monitoring/.eslintrc | 4 - apps/monitoring/.gitignore | 125 -- apps/monitoring/.graphqlrc.yml | 19 - apps/monitoring/.prettierignore | 6 - apps/monitoring/.prettierrc | 4 - apps/monitoring/CHANGELOG.md | 189 -- apps/monitoring/README.md | 78 - apps/monitoring/backend/.dockerignore | 1 - apps/monitoring/backend/Dockerfile | 28 - .../monitoring/backend/monitoring/__init__.py | 1 - .../monitoring/backend/monitoring/__main__.py | 15 - apps/monitoring/backend/monitoring/api.py | 93 - .../backend/monitoring/apl/__init__.py | 12 - .../monitoring/apl/backends/__init__.py | 6 - .../backend/monitoring/apl/backends/base.py | 25 - .../backend/monitoring/apl/backends/file.py | 31 - .../backend/monitoring/apl/backends/mem.py | 26 - .../backend/monitoring/apl/backends/rest.py | 83 - .../backend/monitoring/apl/common.py | 32 - .../backend/monitoring/apl/tests/__init__.py | 0 .../test_apl_delete[rest_apl_client].yaml | 135 -- ..._delete_non_existing[rest_apl_client].yaml | 44 - .../test_apl_get[rest_apl_client].yaml | 98 - .../test_apl_get_all[rest_apl_client].yaml | 742 ------- .../test_apl_key_error[rest_apl_client].yaml | 44 - .../backend/monitoring/apl/tests/conftest.py | 72 - .../monitoring/apl/tests/test_apl_client.py | 134 -- .../backend/monitoring/apl/wrapper.py | 49 - apps/monitoring/backend/monitoring/app.py | 131 -- apps/monitoring/backend/monitoring/deps.py | 143 -- .../monitoring/integrations/__init__.py | 0 .../monitoring/integrations/datadog.py | 145 -- .../backend/monitoring/integrations/logs.py | 291 --- apps/monitoring/backend/monitoring/logs.py | 62 - apps/monitoring/backend/monitoring/payload.py | 93 - .../backend/monitoring/saleor/__init__.py | 13 - .../backend/monitoring/saleor/client.py | 103 - .../backend/monitoring/saleor/common.py | 151 -- .../backend/monitoring/saleor/crypto.py | 66 - .../backend/monitoring/saleor/graphql.py | 62 - .../backend/monitoring/saleor/manager.py | 40 - .../backend/monitoring/saleor/metadata.py | 88 - .../monitoring/saleor/tests/__init__.py | 0 .../monitoring/saleor/tests/test_metadata.py | 81 - .../backend/monitoring/saleor/utils.py | 12 - .../backend/monitoring/schema.graphql | 62 - apps/monitoring/backend/monitoring/schema.py | 12 - .../monitoring/backend/monitoring/settings.py | 43 - .../backend/monitoring/tests/__init__.py | 0 .../backend/monitoring/tests/conftest.py | 20 - .../backend/monitoring/tests/test_app.py | 8 - .../backend/monitoring/tests/test_utils.py | 28 - apps/monitoring/backend/monitoring/utils.py | 48 - apps/monitoring/backend/poetry.lock | 1925 ----------------- apps/monitoring/backend/pyproject.toml | 58 - apps/monitoring/docker-compose.yml | 18 - apps/monitoring/next-env.d.ts | 5 - apps/monitoring/next.config.js | 26 - apps/monitoring/package.json | 56 - .../src/assets/datadog/dd_logo_h_rgb.svg | 64 - .../src/assets/datadog/dd_logo_h_white.svg | 52 - .../logzio/1584985593-blue-horizontal.svg | 18 - .../new-relic/new_relic_logo_horizontal.svg | 1 - apps/monitoring/src/datadog-urls.ts | 17 - apps/monitoring/src/graphql-provider.tsx | 60 - .../monitoring/src/lib/theme-synchronizer.tsx | 25 - apps/monitoring/src/pages/_app.tsx | 35 - .../src/pages/configuration/[[...path]].tsx | 96 - apps/monitoring/src/pages/index.tsx | 36 - apps/monitoring/src/public/logo.png | Bin 7383 -> 0 bytes apps/monitoring/src/setup-tests.ts | 6 - apps/monitoring/src/style.css | 3 - .../src/ui/datadog/datadog-config.tsx | 251 --- .../src/ui/no-providers-configured.tsx | 14 - apps/monitoring/tsconfig.json | 20 - apps/monitoring/turbo.json | 27 - apps/monitoring/vitest.config.ts | 13 - pnpm-lock.yaml | 118 - 85 files changed, 6881 deletions(-) delete mode 100644 .github/workflows/build-and-publish-monitoring-backend.yml delete mode 100644 .github/workflows/unit-tests-monitoring.yml delete mode 100644 apps/monitoring/.env.example delete mode 100644 apps/monitoring/.eslintrc delete mode 100644 apps/monitoring/.gitignore delete mode 100644 apps/monitoring/.graphqlrc.yml delete mode 100644 apps/monitoring/.prettierignore delete mode 100644 apps/monitoring/.prettierrc delete mode 100644 apps/monitoring/CHANGELOG.md delete mode 100644 apps/monitoring/README.md delete mode 100644 apps/monitoring/backend/.dockerignore delete mode 100644 apps/monitoring/backend/Dockerfile delete mode 100644 apps/monitoring/backend/monitoring/__init__.py delete mode 100644 apps/monitoring/backend/monitoring/__main__.py delete mode 100644 apps/monitoring/backend/monitoring/api.py delete mode 100644 apps/monitoring/backend/monitoring/apl/__init__.py delete mode 100644 apps/monitoring/backend/monitoring/apl/backends/__init__.py delete mode 100644 apps/monitoring/backend/monitoring/apl/backends/base.py delete mode 100644 apps/monitoring/backend/monitoring/apl/backends/file.py delete mode 100644 apps/monitoring/backend/monitoring/apl/backends/mem.py delete mode 100644 apps/monitoring/backend/monitoring/apl/backends/rest.py delete mode 100644 apps/monitoring/backend/monitoring/apl/common.py delete mode 100644 apps/monitoring/backend/monitoring/apl/tests/__init__.py delete mode 100644 apps/monitoring/backend/monitoring/apl/tests/cassettes/test_apl_client/test_apl_delete[rest_apl_client].yaml delete mode 100644 apps/monitoring/backend/monitoring/apl/tests/cassettes/test_apl_client/test_apl_delete_non_existing[rest_apl_client].yaml delete mode 100644 apps/monitoring/backend/monitoring/apl/tests/cassettes/test_apl_client/test_apl_get[rest_apl_client].yaml delete mode 100644 apps/monitoring/backend/monitoring/apl/tests/cassettes/test_apl_client/test_apl_get_all[rest_apl_client].yaml delete mode 100644 apps/monitoring/backend/monitoring/apl/tests/cassettes/test_apl_client/test_apl_key_error[rest_apl_client].yaml delete mode 100644 apps/monitoring/backend/monitoring/apl/tests/conftest.py delete mode 100644 apps/monitoring/backend/monitoring/apl/tests/test_apl_client.py delete mode 100644 apps/monitoring/backend/monitoring/apl/wrapper.py delete mode 100644 apps/monitoring/backend/monitoring/app.py delete mode 100644 apps/monitoring/backend/monitoring/deps.py delete mode 100644 apps/monitoring/backend/monitoring/integrations/__init__.py delete mode 100644 apps/monitoring/backend/monitoring/integrations/datadog.py delete mode 100644 apps/monitoring/backend/monitoring/integrations/logs.py delete mode 100644 apps/monitoring/backend/monitoring/logs.py delete mode 100644 apps/monitoring/backend/monitoring/payload.py delete mode 100644 apps/monitoring/backend/monitoring/saleor/__init__.py delete mode 100644 apps/monitoring/backend/monitoring/saleor/client.py delete mode 100644 apps/monitoring/backend/monitoring/saleor/common.py delete mode 100644 apps/monitoring/backend/monitoring/saleor/crypto.py delete mode 100644 apps/monitoring/backend/monitoring/saleor/graphql.py delete mode 100644 apps/monitoring/backend/monitoring/saleor/manager.py delete mode 100644 apps/monitoring/backend/monitoring/saleor/metadata.py delete mode 100644 apps/monitoring/backend/monitoring/saleor/tests/__init__.py delete mode 100644 apps/monitoring/backend/monitoring/saleor/tests/test_metadata.py delete mode 100644 apps/monitoring/backend/monitoring/saleor/utils.py delete mode 100644 apps/monitoring/backend/monitoring/schema.graphql delete mode 100644 apps/monitoring/backend/monitoring/schema.py delete mode 100644 apps/monitoring/backend/monitoring/settings.py delete mode 100644 apps/monitoring/backend/monitoring/tests/__init__.py delete mode 100644 apps/monitoring/backend/monitoring/tests/conftest.py delete mode 100644 apps/monitoring/backend/monitoring/tests/test_app.py delete mode 100644 apps/monitoring/backend/monitoring/tests/test_utils.py delete mode 100644 apps/monitoring/backend/monitoring/utils.py delete mode 100644 apps/monitoring/backend/poetry.lock delete mode 100644 apps/monitoring/backend/pyproject.toml delete mode 100644 apps/monitoring/docker-compose.yml delete mode 100644 apps/monitoring/next-env.d.ts delete mode 100644 apps/monitoring/next.config.js delete mode 100644 apps/monitoring/package.json delete mode 100644 apps/monitoring/src/assets/datadog/dd_logo_h_rgb.svg delete mode 100644 apps/monitoring/src/assets/datadog/dd_logo_h_white.svg delete mode 100644 apps/monitoring/src/assets/logzio/1584985593-blue-horizontal.svg delete mode 100644 apps/monitoring/src/assets/new-relic/new_relic_logo_horizontal.svg delete mode 100644 apps/monitoring/src/datadog-urls.ts delete mode 100644 apps/monitoring/src/graphql-provider.tsx delete mode 100644 apps/monitoring/src/lib/theme-synchronizer.tsx delete mode 100644 apps/monitoring/src/pages/_app.tsx delete mode 100644 apps/monitoring/src/pages/configuration/[[...path]].tsx delete mode 100644 apps/monitoring/src/pages/index.tsx delete mode 100644 apps/monitoring/src/public/logo.png delete mode 100644 apps/monitoring/src/setup-tests.ts delete mode 100644 apps/monitoring/src/style.css delete mode 100644 apps/monitoring/src/ui/datadog/datadog-config.tsx delete mode 100644 apps/monitoring/src/ui/no-providers-configured.tsx delete mode 100644 apps/monitoring/tsconfig.json delete mode 100644 apps/monitoring/turbo.json delete mode 100644 apps/monitoring/vitest.config.ts diff --git a/.changeset/four-walls-rhyme.md b/.changeset/four-walls-rhyme.md index d2aeee2..2de046b 100644 --- a/.changeset/four-walls-rhyme.md +++ b/.changeset/four-walls-rhyme.md @@ -4,7 +4,6 @@ "saleor-app-emails-and-messages": patch "saleor-app-data-importer": patch "saleor-app-products-feed": patch -"saleor-app-monitoring": patch "@saleor/apps-shared": patch "saleor-app-invoices": patch "saleor-app-klaviyo": patch diff --git a/.changeset/nasty-mugs-divide.md b/.changeset/nasty-mugs-divide.md index cdff233..d836d60 100644 --- a/.changeset/nasty-mugs-divide.md +++ b/.changeset/nasty-mugs-divide.md @@ -2,7 +2,6 @@ "saleor-app-emails-and-messages": patch "saleor-app-data-importer": patch "saleor-app-products-feed": patch -"saleor-app-monitoring": patch "@saleor/apps-shared": patch "saleor-app-invoices": patch "saleor-app-klaviyo": patch diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml index 3b2229d..c22a11b 100644 --- a/.github/dependabot.yaml +++ b/.github/dependabot.yaml @@ -88,27 +88,6 @@ updates: interval: weekly commit-message: prefix: "[skip ci]" - - package-ecosystem: "npm" - directory: apps/monitoring - open-pull-requests-limit: 1 - schedule: - interval: weekly - commit-message: - prefix: "[skip ci]" - - package-ecosystem: "pip" - directory: apps/monitoring/backend - open-pull-requests-limit: 1 - schedule: - interval: weekly - commit-message: - prefix: "[skip ci]" - - package-ecosystem: "docker" - directory: apps/monitoring/backend - open-pull-requests-limit: 1 - schedule: - interval: weekly - commit-message: - prefix: "[skip ci]" - package-ecosystem: "npm" directory: apps/products-feed open-pull-requests-limit: 1 diff --git a/.github/labeler.yml b/.github/labeler.yml index 4a89fef..c9f7278 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -1,7 +1,6 @@ "App: Data Importer": "apps/data-importer/**/*" "App: Invoices": "apps/invoices/**/*" "App: Klaviyo": "apps/klaviyo/**/*" -"App: Monitoring": "apps/monitoring/**/*" "App: Product Feed": "apps/products-feed/**/*" "App: Search": "apps/search/**/*" "App: Slack": "apps/slack/**/*" diff --git a/.github/workflows/build-and-publish-monitoring-backend.yml b/.github/workflows/build-and-publish-monitoring-backend.yml deleted file mode 100644 index 1abcca7..0000000 --- a/.github/workflows/build-and-publish-monitoring-backend.yml +++ /dev/null @@ -1,81 +0,0 @@ -name: Publish image - -on: - push: - branches: - - main - paths: - - apps/monitoring/backend/** - -jobs: - publish: - runs-on: ubuntu-22.04 - env: - AWS_REGION: eu-west-1 - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - with: - platforms: all - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - with: - install: true - - - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v2 - with: - aws-access-key-id: ${{ secrets.AWS_APPS_STAGING_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_APPS_STAGING_SECRET_ACCESS_KEY }} - aws-region: ${{ env.AWS_REGION }} - - - id: ecr-login - name: Login to Amazon ECR - uses: aws-actions/amazon-ecr-login@v1 - with: - registries: ${{ secrets.AWS_ECR_ACCOUNT }} - - - name: Evaluate image tags - run: | - IMAGE_REPOSITORY=${{ steps.ecr-login.outputs.registry }}/${{ secrets.ECR_REPOSITORY }} - BRANCH_IMAGE_TAG=${{ github.ref_name }} - UNIQUE_IMAGE_TAG=${BRANCH_IMAGE_TAG}-$(git rev-parse --short HEAD) - - IMAGE_TAGS=${IMAGE_REPOSITORY}:${BRANCH_IMAGE_TAG},${IMAGE_REPOSITORY}:${UNIQUE_IMAGE_TAG} - - echo "UNIQUE_IMAGE_TAG=${UNIQUE_IMAGE_TAG}" >> $GITHUB_ENV - echo "IMAGE_TAGS=${IMAGE_TAGS}" >> $GITHUB_ENV - - - name: Build and push - timeout-minutes: 20 - uses: docker/build-push-action@v4 - with: - context: ./apps/monitoring/backend - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ env.IMAGE_TAGS }} - target: prod - cache-from: type=gha,scope=buildkit-master - cache-to: type=gha,scope=buildkit-master - - # - name: Configure GitHub credentials - # run: | - # GITHUB_TOKEN=$( \ - # curl --request GET --url ${{ secrets.VAULT_URL}} --header "Authorization: JWT ${{ secrets.VAULT_JWT }}" | jq -r .token \ - # ) - # echo "GITHUB_TOKEN=${GITHUB_TOKEN}" >> $GITHUB_ENV - - # - name: Trigger Helm deployment - # run: | - # gh api /repos/saleor/saleor-cloud-deployments/dispatches \ - # --input - <<< '{ - # "event_type": "deploy-app-monitoring-staging", - # "client_payload": { - # "image_tag": "${{ env.UNIQUE_IMAGE_TAG }}" - # } - # }' diff --git a/.github/workflows/unit-tests-monitoring.yml b/.github/workflows/unit-tests-monitoring.yml deleted file mode 100644 index 41f0159..0000000 --- a/.github/workflows/unit-tests-monitoring.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: "App: Monitoring backend tests" - -on: - pull_request: - paths: - - "apps/monitoring/backend/**" - -jobs: - unit_test: - name: Unit tests - runs-on: ubuntu-latest - defaults: - run: - working-directory: apps/monitoring/backend - steps: - - uses: actions/checkout@v3 - - name: Install poetry - run: pipx install poetry - - name: Setup python - uses: actions/setup-python@v4 - with: - python-version: "3.10" - cache: poetry - - name: Install dependencies - run: poetry install - - name: Run unit tests - run: poetry run pytest - - name: Run black - run: poetry run black . - - name: Run ruff - run: poetry run ruff . - - name: Run mypy - run: poetry run mypy . diff --git a/apps/monitoring/.env.example b/apps/monitoring/.env.example deleted file mode 100644 index 5ee7944..0000000 --- a/apps/monitoring/.env.example +++ /dev/null @@ -1 +0,0 @@ -MONITORING_APP_API_URL= \ No newline at end of file diff --git a/apps/monitoring/.eslintrc b/apps/monitoring/.eslintrc deleted file mode 100644 index 5470783..0000000 --- a/apps/monitoring/.eslintrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "root": true, - "extends": ["saleor"] -} diff --git a/apps/monitoring/.gitignore b/apps/monitoring/.gitignore deleted file mode 100644 index 3959fcf..0000000 --- a/apps/monitoring/.gitignore +++ /dev/null @@ -1,125 +0,0 @@ -# Environments -.venv - -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ -cover/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Cython debug symbols -cython_debug/ - -# Ruff -.ruff_cache - -# Backend -.fileApl.json diff --git a/apps/monitoring/.graphqlrc.yml b/apps/monitoring/.graphqlrc.yml deleted file mode 100644 index 7053ecd..0000000 --- a/apps/monitoring/.graphqlrc.yml +++ /dev/null @@ -1,19 +0,0 @@ -schema: backend/monitoring/schema.graphql -documents: [src/**/*.tsx] -extensions: - codegen: - overwrite: true - generates: - generated/graphql.ts: - config: - dedupeFragments: true - plugins: - - typescript - - typescript-operations - - typescript-urql: - documentVariablePrefix: "Untyped" - fragmentVariablePrefix: "Untyped" - - typed-document-node - generated/schema.graphql: - plugins: - - schema-ast diff --git a/apps/monitoring/.prettierignore b/apps/monitoring/.prettierignore deleted file mode 100644 index 0dcbc89..0000000 --- a/apps/monitoring/.prettierignore +++ /dev/null @@ -1,6 +0,0 @@ -.next -saleor/api.tsx -pnpm-lock.yaml -graphql/schema.graphql -generated -backend diff --git a/apps/monitoring/.prettierrc b/apps/monitoring/.prettierrc deleted file mode 100644 index 5982106..0000000 --- a/apps/monitoring/.prettierrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "singleQuote": false, - "printWidth": 100 -} diff --git a/apps/monitoring/CHANGELOG.md b/apps/monitoring/CHANGELOG.md deleted file mode 100644 index d4fae46..0000000 --- a/apps/monitoring/CHANGELOG.md +++ /dev/null @@ -1,189 +0,0 @@ -# saleor-app-monitoring - -## 1.1.0 - -### Minor Changes - -- 47102ba: Added additional ENV variables (see each app's .env.example), that can overwrite app base URL. This change allows easy apps development using Docker - -### Patch Changes - -- 2d77bca: Updated Next.js to 13.4.8 -- 6299e06: Update @saleor/app-sdk to 0.41.0 -- Updated dependencies [2d77bca] -- Updated dependencies [6299e06] - - @saleor/apps-shared@1.7.3 - - @saleor/apps-ui@1.1.3 - - @saleor/react-hook-form-macaw@0.2.0 - -## 1.0.0 - -### Major Changes - -- 3bd7e3f: Updated App's UI to the new Macaw. Simplified the view and removed unnecessary not-implemented providers. - -### Minor Changes - -- 1dead1e: Included dedicated logo and attached it to App's manifest. From Saleor 3.15 the logo will be visible in the Dashboard during and after installation. - -### Patch Changes - -- 860bac4: Updated @saleor/app-sdk to 0.40.1 -- a1ad70e: Updated configuration and dependencies of GraphQL client - urql. - All applications use now unified config for creating the client. Also unused related packages has been removed. -- cb6ee29: Updated dependencies -- Updated dependencies [f96563f] -- Updated dependencies [f96563f] -- Updated dependencies [860bac4] -- Updated dependencies [a1ad70e] -- Updated dependencies [cb6ee29] -- Updated dependencies [a1ad70e] - - @saleor/react-hook-form-macaw@0.2.0 - - @saleor/apps-ui@1.1.2 - - @saleor/apps-shared@1.7.2 - -## 0.6.6 - -### Patch Changes - -- a8834a1: Unified graphql version to 16.6 -- a8834a1: Unified graphql codegen packages -- a8834a1: Removed unnecessary duplicated dependencies from apps and moved them to shared and root (types, eslint rules) -- a8834a1: Updated dev dependencies - Typescript, Eslint and Turborepo -- Updated dependencies [a8834a1] -- Updated dependencies [a8834a1] -- Updated dependencies [a8834a1] -- Updated dependencies [a8834a1] - - @saleor/apps-shared@1.7.1 - -## 0.6.5 - -### Patch Changes - -- 0c2fc65: Update dev dependencies - Vite and Vitest. These changes will not affect runtime Apps, but can affect tests and builds -- Updated dependencies [0c2fc65] -- Updated dependencies [b75a664] - - @saleor/apps-shared@1.7.0 - -## 0.6.4 - -### Patch Changes - -- 6e69f4f: Update app-sdk to 0.39.1 -- Updated dependencies [6e69f4f] - - @saleor/apps-shared@1.6.1 - -## 0.6.3 - -### Patch Changes - -- Updated dependencies [23b5c70] - - @saleor/apps-shared@1.6.0 - -## 0.6.2 - -### Patch Changes - -- c406318: Updated dep @saleor/app-sdk to 0.38.0 -- Updated dependencies [c406318] - - @saleor/apps-shared@1.5.1 - -## 0.6.1 - -### Patch Changes - -- 8b22b1c: Restored Pino logger packages to each app, to fix failing logs in development. Also updated .env.example to contain up to date APP_LOG_LEVEL variable - -## 0.6.0 - -### Minor Changes - -- 830cfe9: Changed APP_DEBUG env to APP_LOG_LEVEL - -### Patch Changes - -- Updated dependencies [830cfe9] - - @saleor/apps-shared@1.5.0 - -## 0.5.0 - -### Minor Changes - -- 57f6d41: Updated Manifest to contain up to date support, privacy, homepage and author fields - -### Patch Changes - -- 2c0df91: Added lint:fix script, so `eslint --fix` can be run deliberately -- e167e72: Update next.js to 13.3.0 -- 74174c4: Updated @saleor/app-sdk to 0.37.3 -- 2e51890: Update next.js to 13.3.0 -- 2e51890: Update @saleor/app-sdk to 0.37.2 -- 2e51890: Use useDashboardNotification hook from shared package, instead of direct AppBridge usage -- Updated dependencies [2c0df91] -- Updated dependencies [e167e72] -- Updated dependencies [74174c4] -- Updated dependencies [2e51890] -- Updated dependencies [2e51890] -- Updated dependencies [2e51890] - - @saleor/apps-shared@1.4.0 - -## 0.4.1 - -### Patch Changes - -- eca52ad: Replace "export default" with named exports - - @saleor/apps-shared@1.3.0 - -## 0.4.0 - -### Minor Changes - -- 7cb3b89: Added "author" field to the Manifest, set it to Saleor Commerce, so Dashboard can display it too - -### Patch Changes - -- 7cb3b89: Replace apps to avoid AppPermission (use Permission for client permissions) and authData.domain (use saleorApiUrl) -- 7cb3b89: Updated @saleor/app-sdk to 0.37.1 - -## 0.3.3 - -### Patch Changes - -- e93a4dc: Updated GraphQL Code Generator package - -## 0.3.2 - -### Patch Changes - -- dca82bb: Update app-sdk to pre-0.34.0. Update Async Webhooks to use new API - -## 0.3.1 - -### Patch Changes - -- 2755ed2: Added extra padding on top of the app so it has some space between content and dashboard header - -## 0.3.0 - -### Minor Changes - -- 2d23480: Remove TitleBar component from apps, because it is moved to Dashboard, outside of iframe context - -### Patch Changes - -- Updated dependencies [2d23480] - - @saleor/apps-shared@1.3.0 - -## 0.2.0 - -### Minor Changes - -- 289b42f: Breaking change for app maintainers: VercelAPL can no longer be set for the app since it's deprecated and will be removed in app-sdk 0.30.0. As a replacement, we recommend using Upstash APL or implementing your own. - Read more about APLs: https://github.com/saleor/saleor-app-sdk/blob/main/docs/apl.md - -## 0.1.1 - -### Patch Changes - -- Updated dependencies [5fc88ed] - - @saleor/apps-shared@1.2.0 diff --git a/apps/monitoring/README.md b/apps/monitoring/README.md deleted file mode 100644 index a2c1fac..0000000 --- a/apps/monitoring/README.md +++ /dev/null @@ -1,78 +0,0 @@ -# Saleor Monitoring app - -❗️NOTE: This is Alpha version of the app.❗️ - -## Local development - -### Start Monitoring backend - -Run: - -```shell -docker-compose up -``` - -It is beneficial to run this command in a separate terminal tab to observe backend logs easily. - -By default, backend will run at `localhost:5001` with: - -- Manifest at `/manifest` -- Graphql Playground at `/graphql` -- OpenApi viewer at `/docs` - -### Develop frontend: - -Installing dependencies with: - -```shell -pnpm i -``` - -Running dev server - -```shell -pnpm dev -``` - -The frontend app will run at `localhost:3000`. -By default, it acts as a proxy and redirects all unhandled requests to the backend (configured by `MONITORING_APP_API_URL` env). -This way, all frontend and backend endpoints are accessible at `http://localhost:3000` - -### Test with Saleor - -Expose `http://localhost:3000` using a tunnel and use `https://your.tunnel/manifest` manifest URL to install `Monitoring` app - -### Graphql Playground - -To use Graphql Playground, `Monitoring` app needs to be installed in Saleor, and HTTP headers must be set: - -```json -{ - "authorization-bearer": "token", - "saleor-api-url": "https://my-env.saleor.cloud/graphql/" -} -``` - -### Testing DataDog integration - -Set `MOCK_DATADOG_CLIENT` env to `True` - -Use these credentials sets to test DataDog integration: - -Working credentials: - -```json -{ - "site": "US1", - "apiKey": "156e22d50c4e8b6816e1fd4794d3fd8c" -} -``` - -Credentials that validate but generate an error while sending events - -```json -{ - "site": "EU1", - "apiKey": "156e22d50c4e8b6816e1fd4794d3fd8c" -} -``` diff --git a/apps/monitoring/backend/.dockerignore b/apps/monitoring/backend/.dockerignore deleted file mode 100644 index 7e0f416..0000000 --- a/apps/monitoring/backend/.dockerignore +++ /dev/null @@ -1 +0,0 @@ -**/.fileApl.json diff --git a/apps/monitoring/backend/Dockerfile b/apps/monitoring/backend/Dockerfile deleted file mode 100644 index 5db0944..0000000 --- a/apps/monitoring/backend/Dockerfile +++ /dev/null @@ -1,28 +0,0 @@ -FROM python:3.10 as build - -RUN pip install poetry'>=1.3.2,<1.4.0' - -WORKDIR /app -COPY pyproject.toml poetry.lock /app/ - -RUN POETRY_VIRTUALENVS_CREATE=false poetry install --no-cache --only main - -FROM python:3.10-slim as prod - -ENV PYTHONUNBUFFERED 1 - -COPY --from=build /usr/local/bin/ /usr/local/bin/ -COPY --from=build /usr/local/lib/python3.10/site-packages/ /usr/local/lib/python3.10/site-packages/ - -WORKDIR /app - -COPY monitoring/ /app/monitoring/ - -EXPOSE 80 - -CMD ["uvicorn", "monitoring.app:app", "--host", "0.0.0.0", "--port", "80", "--no-access-log", "--forwarded-allow-ips", "*"] - -FROM prod as dev - -COPY pyproject.toml poetry.lock /app/ -RUN POETRY_VIRTUALENVS_CREATE=false poetry install --no-cache --only dev diff --git a/apps/monitoring/backend/monitoring/__init__.py b/apps/monitoring/backend/monitoring/__init__.py deleted file mode 100644 index 3dc1f76..0000000 --- a/apps/monitoring/backend/monitoring/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = "0.1.0" diff --git a/apps/monitoring/backend/monitoring/__main__.py b/apps/monitoring/backend/monitoring/__main__.py deleted file mode 100644 index fbe35e5..0000000 --- a/apps/monitoring/backend/monitoring/__main__.py +++ /dev/null @@ -1,15 +0,0 @@ -import uvicorn - - -def main(): - uvicorn.run( - "monitoring.app:app", - host="0.0.0.0", - port=5001, - reload=True, - forwarded_allow_ips="*", - ) - - -if __name__ == "__main__": - main() diff --git a/apps/monitoring/backend/monitoring/api.py b/apps/monitoring/backend/monitoring/api.py deleted file mode 100644 index 7667887..0000000 --- a/apps/monitoring/backend/monitoring/api.py +++ /dev/null @@ -1,93 +0,0 @@ -from pathlib import Path - -from ariadne import ( - MutationType, - ObjectType, - QueryType, - convert_kwargs_to_snake_case, - load_schema_from_path, - make_executable_schema, - snake_case_fallback_resolvers, -) -from ariadne.asgi import GraphQL -from graphql import GraphQLResolveInfo - -from .deps import ApiDependencies -from .schema import DatadogConfig, DatadogCredentials -from .settings import settings - -base_dir = Path(__file__).resolve().parent -type_defs = load_schema_from_path(str(base_dir / "schema.graphql")) -query = QueryType() -datadog_config = ObjectType("DatadogConfig") -mutation = MutationType() - - -def get_api_context(info: GraphQLResolveInfo) -> ApiDependencies: - return info.context["request"].state.api_context - - -@datadog_config.field("credentials") -def resolve_datadog_credentials(datadog: DatadogConfig, *_): - return { - "site": datadog.credentials.site, - "api_key_last_4": datadog.credentials.api_key[-4:], - } - - -@query.field("integrations") -async def resolve_integrations(_, info): - context = get_api_context(info) - metadata = await context.manager.get_metadata() - return metadata - - -@mutation.field("updateDatadogConfig") -@convert_kwargs_to_snake_case -async def resolve_update_datadog(_, info, input): - context = get_api_context(info) - metadata = await context.manager.get_metadata() - - if creds := input.get("credentials", None): - creds = DatadogCredentials(site=creds["site"], api_key=creds["api_key"]) - if not await context.datadog_client.validate_credentials(creds): - return { - "errors": [ - { - "field": "credentials", - "message": f"Invalid datadog apiKey for site {creds.site}", - } - ] - } - - # Create new configuration - if metadata.datadog is None: - if creds is None: - return {"errors": [{"message": "No DataDog config to update"}]} - metadata.datadog = DatadogConfig(credentials=creds) - - if "active" in input: - metadata.datadog.active = input["active"] - if creds: - metadata.datadog.credentials = creds - metadata.datadog.error = None - - await context.manager.save_private_metadata(metadata) - return {"datadog": metadata.datadog, "errors": []} - - -@mutation.field("deleteDatadogConfig") -async def resolve_delete_datadog(_, info): - context = get_api_context(info) - metadata = await context.manager.get_metadata() - if metadata.datadog is None: - return {"errors": [{"message": "No DataDog config to delete"}]} - await context.manager.delete_private_metadata("datadog") - return {"datadog": metadata.datadog, "errors": []} - - -schema = make_executable_schema( - type_defs, query, datadog_config, mutation, snake_case_fallback_resolvers -) -graphQL = GraphQL(schema, debug=settings.debug) -graphql_app = graphQL.http_handler diff --git a/apps/monitoring/backend/monitoring/apl/__init__.py b/apps/monitoring/backend/monitoring/apl/__init__.py deleted file mode 100644 index e99b866..0000000 --- a/apps/monitoring/backend/monitoring/apl/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -from .common import AplEntity, AplError, AplKeyError -from .wrapper import AplClient - -apl_client = AplClient() - -__all__ = [ - "apl_client", - "AplClient", - "AplEntity", - "AplError", - "AplKeyError", -] diff --git a/apps/monitoring/backend/monitoring/apl/backends/__init__.py b/apps/monitoring/backend/monitoring/apl/backends/__init__.py deleted file mode 100644 index afad83b..0000000 --- a/apps/monitoring/backend/monitoring/apl/backends/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -from .base import AplBackend -from .file import FileAplBackend -from .mem import MemAplBackend -from .rest import RestAplBackend - -__all__ = ["AplBackend", "MemAplBackend", "FileAplBackend", "RestAplBackend"] diff --git a/apps/monitoring/backend/monitoring/apl/backends/base.py b/apps/monitoring/backend/monitoring/apl/backends/base.py deleted file mode 100644 index 0a2ed4c..0000000 --- a/apps/monitoring/backend/monitoring/apl/backends/base.py +++ /dev/null @@ -1,25 +0,0 @@ -from typing import AsyncGenerator - -from ..common import AplEntity - - -class AplBackend: - async def get(self, key: str) -> AplEntity: - raise NotImplementedError( - "subclasses of BaseAPLClient must provide a get() method" - ) - - async def set(self, key: str, value: AplEntity): - raise NotImplementedError( - "subclasses of BaseAPLClient must provide a add() method" - ) - - async def delete(self, key: str): - raise NotImplementedError( - "subclasses of BaseAPLClient must provide a delete() method" - ) - - def get_all(self, page_size: int) -> AsyncGenerator[tuple[str, AplEntity], None]: - raise NotImplementedError( - "subclasses of BaseAPLClient must provide a delete() method" - ) diff --git a/apps/monitoring/backend/monitoring/apl/backends/file.py b/apps/monitoring/backend/monitoring/apl/backends/file.py deleted file mode 100644 index e68622e..0000000 --- a/apps/monitoring/backend/monitoring/apl/backends/file.py +++ /dev/null @@ -1,31 +0,0 @@ -from json import dumps -from pathlib import Path - -from fastapi.encoders import jsonable_encoder -from pydantic import parse_file_as - -from ..common import AplEntity -from .mem import MemAplBackend - - -class FileAplBackend(MemAplBackend): - def _load_file(self): - self._apl = parse_file_as(dict[str, AplEntity], self.path) - - def _save_file(self): - data = dumps(jsonable_encoder(self._apl), indent=2) - self.path.write_text(data) - - def __init__(self, path: Path): - super().__init__() - self.path = path - if self.path.exists(): - self._load_file() - - async def set(self, *args, **kwargs): - await super().set(*args, **kwargs) - self._save_file() - - async def delete(self, *args, **kwargs): - await super().delete(*args, **kwargs) - self._save_file() diff --git a/apps/monitoring/backend/monitoring/apl/backends/mem.py b/apps/monitoring/backend/monitoring/apl/backends/mem.py deleted file mode 100644 index 5e7636a..0000000 --- a/apps/monitoring/backend/monitoring/apl/backends/mem.py +++ /dev/null @@ -1,26 +0,0 @@ -from ..common import AplEntity, AplKeyError -from .base import AplBackend - - -class MemAplBackend(AplBackend): - def __init__(self): - self._apl: dict[str, AplEntity] = {} - - async def get(self, key: str): - try: - return self._apl[key] - except KeyError as err: - raise AplKeyError(f"Key: {key} not found in MemApl") from err - - async def set(self, key: str, value: AplEntity): - self._apl[key] = value - - async def delete(self, key: str): - try: - del self._apl[key] - except KeyError as err: - raise AplKeyError(f"Key: {key} not found in MemApl") from err - - async def get_all(self, page_size: int): - for key, val in self._apl.items(): - yield key, val diff --git a/apps/monitoring/backend/monitoring/apl/backends/rest.py b/apps/monitoring/backend/monitoring/apl/backends/rest.py deleted file mode 100644 index b9d785f..0000000 --- a/apps/monitoring/backend/monitoring/apl/backends/rest.py +++ /dev/null @@ -1,83 +0,0 @@ -import json -from base64 import urlsafe_b64encode -from contextlib import asynccontextmanager -from urllib.parse import urlparse - -import httpx -from pydantic import BaseModel - -from ..common import AplEntity, AplError, AplKeyError -from .base import AplBackend - - -class AplPage(BaseModel): - count: int - next: str | None - previous: str | None - results: list[AplEntity] - - -class RestAplBackend(AplBackend): - def __init__(self, apl_url: str, token: str): - self.apl_url = apl_url - self.token = token - - @property - def headers(self): - return {"Authorization": f"Bearer {self.token}"} - - @staticmethod - def map_apl_entity(value: AplEntity): - return { - "saleor_app_id": value.app_id, - "saleor_api_url": value.saleor_api_url, - "jwks": json.dumps(value.jwks), - "domain": urlparse(value.saleor_api_url).netloc, - "token": value.app_token, - } - - @staticmethod - def b64_encode(key: str): - return urlsafe_b64encode(key.encode()).decode() - - @asynccontextmanager - async def _client(self): - headers = {"Authorization": f"Bearer {self.token}"} - async with httpx.AsyncClient(base_url=self.apl_url, headers=headers) as client: - try: - yield client - except httpx.HTTPError as exc: - raise AplError("RestApl error") from exc - - async def set(self, key: str, value: AplEntity): - async with self._client() as client: - resp = await client.post("/api/v1/apl", json=self.map_apl_entity(value)) - resp.raise_for_status() - - async def get(self, key: str): - async with self._client() as client: - resp = await client.get(f"/api/v1/apl/{self.b64_encode(key)}") - if resp.status_code == 404: - raise AplKeyError(f"Key: {key} not found in RestApl") - resp.raise_for_status() - return AplEntity.parse_raw(resp.content) - - async def delete(self, key: str): - async with self._client() as client: - resp = await client.delete(f"/api/v1/apl/{self.b64_encode(key)}") - if resp.status_code == 404: - raise AplKeyError(f"Key: {key} not found in RestApl") - resp.raise_for_status() - - async def get_all(self, page_size: int): - async with self._client() as client: - offset, count = 0, 1 - while offset < count: - params = {"limit": page_size, "offset": offset} - resp = await client.get("/api/v1/apl", params=params) - resp.raise_for_status() - page = AplPage.parse_raw(resp.content) - count = page.count - offset += page_size - for elem in page.results: - yield elem.saleor_api_url, elem diff --git a/apps/monitoring/backend/monitoring/apl/common.py b/apps/monitoring/backend/monitoring/apl/common.py deleted file mode 100644 index 2903be1..0000000 --- a/apps/monitoring/backend/monitoring/apl/common.py +++ /dev/null @@ -1,32 +0,0 @@ -import json -from typing import Any - -from pydantic import AnyHttpUrl, BaseModel, Field, validator - - -class AplEntity(BaseModel): - saleor_api_url: AnyHttpUrl - app_id: str = Field(..., alias="saleor_app_id") - app_token: str = Field(..., alias="token") - jwks: dict[str, Any] - - class Config: - allow_population_by_field_name = True - - @validator("jwks", pre=True) - def parse_json(cls, v): - if isinstance(v, str): - return json.loads(v) - return v - - -class AplError(Exception): - pass - - -class AplKeyError(AplError): - pass - - -class NotConfiguredError(AplError): - """If apl client was not configured""" diff --git a/apps/monitoring/backend/monitoring/apl/tests/__init__.py b/apps/monitoring/backend/monitoring/apl/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/monitoring/backend/monitoring/apl/tests/cassettes/test_apl_client/test_apl_delete[rest_apl_client].yaml b/apps/monitoring/backend/monitoring/apl/tests/cassettes/test_apl_client/test_apl_delete[rest_apl_client].yaml deleted file mode 100644 index 6627e67..0000000 --- a/apps/monitoring/backend/monitoring/apl/tests/cassettes/test_apl_client/test_apl_delete[rest_apl_client].yaml +++ /dev/null @@ -1,135 +0,0 @@ -interactions: -- request: - body: '{"saleor_app_id": "uzfbqpkchx", "saleor_api_url": "https://sbnpsagopi.saleor.cloud/graphql", - "jwks": "{\"keys\": [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"jrlyhkvronpcuskqfhnhbbpjtvcrce\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}", "domain": "sbnpsagopi.saleor.cloud", - "token": "lbnetlmnjviofvjvleoyhotmbsaheg"}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - Bearer access.token - connection: - - keep-alive - content-length: - - '337' - content-type: - - application/json - host: - - apl.example.com - user-agent: - - python-httpx/0.23.3 - method: POST - uri: https://apl.example.com/api/v1/apl - response: - content: '{"saleor_api_url":"https://sbnpsagopi.saleor.cloud/graphql","token":"lbnetlmnjviofvjvleoyhotmbsaheg","jwks":"{\"keys\": - [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"jrlyhkvronpcuskqfhnhbbpjtvcrce\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}","saleor_app_id":"uzfbqpkchx","domain":"sbnpsagopi.saleor.cloud"}' - headers: - Connection: - - keep-alive - Content-Length: - - '328' - Content-Type: - - application/json - Date: - - Sun, 19 Feb 2023 16:51:49 GMT - allow: - - GET, POST, HEAD, OPTIONS - referrer-policy: - - same-origin - server: - - uvicorn - vary: - - Origin - x-content-type-options: - - nosniff - x-frame-options: - - DENY - http_version: HTTP/1.1 - status_code: 201 -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - Bearer access.token - connection: - - keep-alive - host: - - apl.example.com - user-agent: - - python-httpx/0.23.3 - method: DELETE - uri: https://apl.example.com/api/v1/apl/aHR0cHM6Ly9zYm5wc2Fnb3BpLnNhbGVvci5jbG91ZC9ncmFwaHFs - response: - content: '' - headers: - Connection: - - keep-alive - Content-Length: - - '0' - Date: - - Sun, 19 Feb 2023 16:51:49 GMT - allow: - - GET, PUT, PATCH, DELETE, HEAD, OPTIONS - referrer-policy: - - same-origin - server: - - uvicorn - vary: - - Origin - x-content-type-options: - - nosniff - x-frame-options: - - DENY - http_version: HTTP/1.1 - status_code: 204 -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - Bearer access.token - connection: - - keep-alive - host: - - apl.example.com - user-agent: - - python-httpx/0.23.3 - method: GET - uri: https://apl.example.com/api/v1/apl/aHR0cHM6Ly9zYm5wc2Fnb3BpLnNhbGVvci5jbG91ZC9ncmFwaHFs - response: - content: '{"detail":"Not found."}' - headers: - Connection: - - keep-alive - Content-Length: - - '23' - Content-Type: - - application/json - Date: - - Sun, 19 Feb 2023 16:51:50 GMT - allow: - - GET, PUT, PATCH, DELETE, HEAD, OPTIONS - referrer-policy: - - same-origin - server: - - uvicorn - vary: - - Origin - x-content-type-options: - - nosniff - x-frame-options: - - DENY - http_version: HTTP/1.1 - status_code: 404 -version: 1 diff --git a/apps/monitoring/backend/monitoring/apl/tests/cassettes/test_apl_client/test_apl_delete_non_existing[rest_apl_client].yaml b/apps/monitoring/backend/monitoring/apl/tests/cassettes/test_apl_client/test_apl_delete_non_existing[rest_apl_client].yaml deleted file mode 100644 index daafa5a..0000000 --- a/apps/monitoring/backend/monitoring/apl/tests/cassettes/test_apl_client/test_apl_delete_non_existing[rest_apl_client].yaml +++ /dev/null @@ -1,44 +0,0 @@ -interactions: -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - Bearer access.token - connection: - - keep-alive - host: - - apl.example.com - user-agent: - - python-httpx/0.23.3 - method: DELETE - uri: https://apl.example.com/api/v1/apl/aHR0cHM6Ly9ub24uZXhpc3RpbmcuZG9tYWlu - response: - content: '{"detail":"Not found."}' - headers: - Connection: - - keep-alive - Content-Length: - - '23' - Content-Type: - - application/json - Date: - - Sun, 19 Feb 2023 16:59:52 GMT - allow: - - GET, PUT, PATCH, DELETE, HEAD, OPTIONS - referrer-policy: - - same-origin - server: - - uvicorn - vary: - - Origin - x-content-type-options: - - nosniff - x-frame-options: - - DENY - http_version: HTTP/1.1 - status_code: 404 -version: 1 diff --git a/apps/monitoring/backend/monitoring/apl/tests/cassettes/test_apl_client/test_apl_get[rest_apl_client].yaml b/apps/monitoring/backend/monitoring/apl/tests/cassettes/test_apl_client/test_apl_get[rest_apl_client].yaml deleted file mode 100644 index 1d17aff..0000000 --- a/apps/monitoring/backend/monitoring/apl/tests/cassettes/test_apl_client/test_apl_get[rest_apl_client].yaml +++ /dev/null @@ -1,98 +0,0 @@ -interactions: -- request: - body: '{"saleor_app_id": "uzfbqpkchx", "saleor_api_url": "https://sbnpsagopi.saleor.cloud/graphql", - "jwks": "{\"keys\": [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"jrlyhkvronpcuskqfhnhbbpjtvcrce\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}", "domain": "sbnpsagopi.saleor.cloud", - "token": "lbnetlmnjviofvjvleoyhotmbsaheg"}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - Bearer access.token - connection: - - keep-alive - content-length: - - '337' - content-type: - - application/json - host: - - apl.example.com - user-agent: - - python-httpx/0.23.3 - method: POST - uri: https://apl.example.com/api/v1/apl - - response: - content: '{"saleor_api_url":"https://sbnpsagopi.saleor.cloud/graphql","token":"lbnetlmnjviofvjvleoyhotmbsaheg","jwks":"{\"keys\": - [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"jrlyhkvronpcuskqfhnhbbpjtvcrce\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}","saleor_app_id":"uzfbqpkchx","domain":"sbnpsagopi.saleor.cloud"}' - headers: - Connection: - - keep-alive - Content-Length: - - '328' - Content-Type: - - application/json - Date: - - Sun, 19 Feb 2023 16:48:47 GMT - allow: - - GET, POST, HEAD, OPTIONS - referrer-policy: - - same-origin - server: - - uvicorn - vary: - - Origin - x-content-type-options: - - nosniff - x-frame-options: - - DENY - http_version: HTTP/1.1 - status_code: 201 -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - Bearer access.token - connection: - - keep-alive - host: - - apl.example.com - user-agent: - - python-httpx/0.23.3 - method: GET - uri: https://apl.example.com/api/v1/apl/aHR0cHM6Ly9zYm5wc2Fnb3BpLnNhbGVvci5jbG91ZC9ncmFwaHFs - response: - content: '{"saleor_api_url":"https://sbnpsagopi.saleor.cloud/graphql","token":"lbnetlmnjviofvjvleoyhotmbsaheg","jwks":"{\"keys\": - [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"jrlyhkvronpcuskqfhnhbbpjtvcrce\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}","saleor_app_id":"uzfbqpkchx","domain":"sbnpsagopi.saleor.cloud"}' - headers: - Connection: - - keep-alive - Content-Length: - - '328' - Content-Type: - - application/json - Date: - - Sun, 19 Feb 2023 16:48:48 GMT - allow: - - GET, PUT, PATCH, DELETE, HEAD, OPTIONS - referrer-policy: - - same-origin - server: - - uvicorn - vary: - - Origin - x-content-type-options: - - nosniff - x-frame-options: - - DENY - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/apps/monitoring/backend/monitoring/apl/tests/cassettes/test_apl_client/test_apl_get_all[rest_apl_client].yaml b/apps/monitoring/backend/monitoring/apl/tests/cassettes/test_apl_client/test_apl_get_all[rest_apl_client].yaml deleted file mode 100644 index f696bbe..0000000 --- a/apps/monitoring/backend/monitoring/apl/tests/cassettes/test_apl_client/test_apl_get_all[rest_apl_client].yaml +++ /dev/null @@ -1,742 +0,0 @@ -interactions: -- request: - body: '{"saleor_app_id": "uzfbqpkchx", "saleor_api_url": "https://sbnpsagopi.saleor.cloud/graphql", - "jwks": "{\"keys\": [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"jrlyhkvronpcuskqfhnhbbpjtvcrce\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}", "domain": "sbnpsagopi.saleor.cloud", - "token": "lbnetlmnjviofvjvleoyhotmbsaheg"}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - Bearer access.token - connection: - - keep-alive - content-length: - - '337' - content-type: - - application/json - host: - - apl.example.com - user-agent: - - python-httpx/0.23.3 - method: POST - uri: https://apl.example.com/api/v1/apl - response: - content: '{"saleor_api_url":"https://sbnpsagopi.saleor.cloud/graphql","token":"lbnetlmnjviofvjvleoyhotmbsaheg","jwks":"{\"keys\": - [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"jrlyhkvronpcuskqfhnhbbpjtvcrce\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}","saleor_app_id":"uzfbqpkchx","domain":"sbnpsagopi.saleor.cloud"}' - headers: - Connection: - - keep-alive - Content-Length: - - '328' - Content-Type: - - application/json - Date: - - Sun, 19 Feb 2023 17:07:37 GMT - allow: - - GET, POST, HEAD, OPTIONS - referrer-policy: - - same-origin - server: - - uvicorn - vary: - - Origin - x-content-type-options: - - nosniff - x-frame-options: - - DENY - http_version: HTTP/1.1 - status_code: 201 -- request: - body: '{"saleor_app_id": "fzglnnohvi", "saleor_api_url": "https://msltedyydo.saleor.cloud/graphql", - "jwks": "{\"keys\": [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"msfmpvhxqiqptpcfpvomenrslrmpwf\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}", "domain": "msltedyydo.saleor.cloud", - "token": "etqfdiojfvufyfpylknharwbkkhcio"}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - Bearer access.token - connection: - - keep-alive - content-length: - - '337' - content-type: - - application/json - host: - - apl.example.com - user-agent: - - python-httpx/0.23.3 - method: POST - uri: https://apl.example.com/api/v1/apl - response: - content: '{"saleor_api_url":"https://msltedyydo.saleor.cloud/graphql","token":"etqfdiojfvufyfpylknharwbkkhcio","jwks":"{\"keys\": - [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"msfmpvhxqiqptpcfpvomenrslrmpwf\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}","saleor_app_id":"fzglnnohvi","domain":"msltedyydo.saleor.cloud"}' - headers: - Connection: - - keep-alive - Content-Length: - - '328' - Content-Type: - - application/json - Date: - - Sun, 19 Feb 2023 17:07:38 GMT - allow: - - GET, POST, HEAD, OPTIONS - referrer-policy: - - same-origin - server: - - uvicorn - vary: - - Origin - x-content-type-options: - - nosniff - x-frame-options: - - DENY - http_version: HTTP/1.1 - status_code: 201 -- request: - body: '{"saleor_app_id": "lcedtozpeo", "saleor_api_url": "https://rodnbaorcb.saleor.cloud/graphql", - "jwks": "{\"keys\": [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"djnhwjcbtrydjfvpeltmzglfcsgngd\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}", "domain": "rodnbaorcb.saleor.cloud", - "token": "nyqokxizwonkuqqexhktbvgussupaz"}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - Bearer access.token - connection: - - keep-alive - content-length: - - '337' - content-type: - - application/json - host: - - apl.example.com - user-agent: - - python-httpx/0.23.3 - method: POST - uri: https://apl.example.com/api/v1/apl - response: - content: '{"saleor_api_url":"https://rodnbaorcb.saleor.cloud/graphql","token":"nyqokxizwonkuqqexhktbvgussupaz","jwks":"{\"keys\": - [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"djnhwjcbtrydjfvpeltmzglfcsgngd\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}","saleor_app_id":"lcedtozpeo","domain":"rodnbaorcb.saleor.cloud"}' - headers: - Connection: - - keep-alive - Content-Length: - - '328' - Content-Type: - - application/json - Date: - - Sun, 19 Feb 2023 17:07:38 GMT - allow: - - GET, POST, HEAD, OPTIONS - referrer-policy: - - same-origin - server: - - uvicorn - vary: - - Origin - x-content-type-options: - - nosniff - x-frame-options: - - DENY - http_version: HTTP/1.1 - status_code: 201 -- request: - body: '{"saleor_app_id": "vxrgitlduz", "saleor_api_url": "https://vjoxywqxno.saleor.cloud/graphql", - "jwks": "{\"keys\": [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"pqimouklxipopspcwrxlzxmzftnxsc\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}", "domain": "vjoxywqxno.saleor.cloud", - "token": "uagntnmzugcynzcblilonyguxjowjq"}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - Bearer access.token - connection: - - keep-alive - content-length: - - '337' - content-type: - - application/json - host: - - apl.example.com - user-agent: - - python-httpx/0.23.3 - method: POST - uri: https://apl.example.com/api/v1/apl - response: - content: '{"saleor_api_url":"https://vjoxywqxno.saleor.cloud/graphql","token":"uagntnmzugcynzcblilonyguxjowjq","jwks":"{\"keys\": - [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"pqimouklxipopspcwrxlzxmzftnxsc\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}","saleor_app_id":"vxrgitlduz","domain":"vjoxywqxno.saleor.cloud"}' - headers: - Connection: - - keep-alive - Content-Length: - - '328' - Content-Type: - - application/json - Date: - - Sun, 19 Feb 2023 17:07:39 GMT - allow: - - GET, POST, HEAD, OPTIONS - referrer-policy: - - same-origin - server: - - uvicorn - vary: - - Origin - x-content-type-options: - - nosniff - x-frame-options: - - DENY - http_version: HTTP/1.1 - status_code: 201 -- request: - body: '{"saleor_app_id": "mtljtfhfjd", "saleor_api_url": "https://txjaskukcx.saleor.cloud/graphql", - "jwks": "{\"keys\": [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"bbslmktufyfdtzlfaxrqzlcmoslbeo\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}", "domain": "txjaskukcx.saleor.cloud", - "token": "rzbhsxcngssozsamgksgqzsyykbvws"}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - Bearer access.token - connection: - - keep-alive - content-length: - - '337' - content-type: - - application/json - host: - - apl.example.com - user-agent: - - python-httpx/0.23.3 - method: POST - uri: https://apl.example.com/api/v1/apl - response: - content: '{"saleor_api_url":"https://txjaskukcx.saleor.cloud/graphql","token":"rzbhsxcngssozsamgksgqzsyykbvws","jwks":"{\"keys\": - [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"bbslmktufyfdtzlfaxrqzlcmoslbeo\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}","saleor_app_id":"mtljtfhfjd","domain":"txjaskukcx.saleor.cloud"}' - headers: - Connection: - - keep-alive - Content-Length: - - '328' - Content-Type: - - application/json - Date: - - Sun, 19 Feb 2023 17:07:39 GMT - allow: - - GET, POST, HEAD, OPTIONS - referrer-policy: - - same-origin - server: - - uvicorn - vary: - - Origin - x-content-type-options: - - nosniff - x-frame-options: - - DENY - http_version: HTTP/1.1 - status_code: 201 -- request: - body: '{"saleor_app_id": "krqomgdnue", "saleor_api_url": "https://wptoxotfln.saleor.cloud/graphql", - "jwks": "{\"keys\": [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"nclygpffmzyoykbffswnequwmdmdhd\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}", "domain": "wptoxotfln.saleor.cloud", - "token": "bfuugsnzlrmbtbfjhbsfduslfjbmty"}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - Bearer access.token - connection: - - keep-alive - content-length: - - '337' - content-type: - - application/json - host: - - apl.example.com - user-agent: - - python-httpx/0.23.3 - method: POST - uri: https://apl.example.com/api/v1/apl - response: - content: '{"saleor_api_url":"https://wptoxotfln.saleor.cloud/graphql","token":"bfuugsnzlrmbtbfjhbsfduslfjbmty","jwks":"{\"keys\": - [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"nclygpffmzyoykbffswnequwmdmdhd\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}","saleor_app_id":"krqomgdnue","domain":"wptoxotfln.saleor.cloud"}' - headers: - Connection: - - keep-alive - Content-Length: - - '328' - Content-Type: - - application/json - Date: - - Sun, 19 Feb 2023 17:07:39 GMT - allow: - - GET, POST, HEAD, OPTIONS - referrer-policy: - - same-origin - server: - - uvicorn - vary: - - Origin - x-content-type-options: - - nosniff - x-frame-options: - - DENY - http_version: HTTP/1.1 - status_code: 201 -- request: - body: '{"saleor_app_id": "qtpthrjavf", "saleor_api_url": "https://nxujxjrudl.saleor.cloud/graphql", - "jwks": "{\"keys\": [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"fxblkupzfagejghhmtrstnryaeadab\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}", "domain": "nxujxjrudl.saleor.cloud", - "token": "vmwhdquypdsmsgjlcgtrqacmzbaunk"}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - Bearer access.token - connection: - - keep-alive - content-length: - - '337' - content-type: - - application/json - host: - - apl.example.com - user-agent: - - python-httpx/0.23.3 - method: POST - uri: https://apl.example.com/api/v1/apl - response: - content: '{"saleor_api_url":"https://nxujxjrudl.saleor.cloud/graphql","token":"vmwhdquypdsmsgjlcgtrqacmzbaunk","jwks":"{\"keys\": - [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"fxblkupzfagejghhmtrstnryaeadab\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}","saleor_app_id":"qtpthrjavf","domain":"nxujxjrudl.saleor.cloud"}' - headers: - Connection: - - keep-alive - Content-Length: - - '328' - Content-Type: - - application/json - Date: - - Sun, 19 Feb 2023 17:07:40 GMT - allow: - - GET, POST, HEAD, OPTIONS - referrer-policy: - - same-origin - server: - - uvicorn - vary: - - Origin - x-content-type-options: - - nosniff - x-frame-options: - - DENY - http_version: HTTP/1.1 - status_code: 201 -- request: - body: '{"saleor_app_id": "nxvftnbrfb", "saleor_api_url": "https://vyyfdwmcav.saleor.cloud/graphql", - "jwks": "{\"keys\": [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"ydrdjwtzkzasiuyqnqewbubtbugrag\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}", "domain": "vyyfdwmcav.saleor.cloud", - "token": "wmsookfbmuopwwlvceiifcoaeicqje"}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - Bearer access.token - connection: - - keep-alive - content-length: - - '337' - content-type: - - application/json - host: - - apl.example.com - user-agent: - - python-httpx/0.23.3 - method: POST - uri: https://apl.example.com/api/v1/apl - response: - content: '{"saleor_api_url":"https://vyyfdwmcav.saleor.cloud/graphql","token":"wmsookfbmuopwwlvceiifcoaeicqje","jwks":"{\"keys\": - [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"ydrdjwtzkzasiuyqnqewbubtbugrag\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}","saleor_app_id":"nxvftnbrfb","domain":"vyyfdwmcav.saleor.cloud"}' - headers: - Connection: - - keep-alive - Content-Length: - - '328' - Content-Type: - - application/json - Date: - - Sun, 19 Feb 2023 17:07:40 GMT - allow: - - GET, POST, HEAD, OPTIONS - referrer-policy: - - same-origin - server: - - uvicorn - vary: - - Origin - x-content-type-options: - - nosniff - x-frame-options: - - DENY - http_version: HTTP/1.1 - status_code: 201 -- request: - body: '{"saleor_app_id": "dpjoofueam", "saleor_api_url": "https://ejwnealqvw.saleor.cloud/graphql", - "jwks": "{\"keys\": [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"ukxkebobvkqqbmtyzcwxbebalnhvps\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}", "domain": "ejwnealqvw.saleor.cloud", - "token": "teovwyfkqvpebpsmfpwigpqlusyrme"}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - Bearer access.token - connection: - - keep-alive - content-length: - - '337' - content-type: - - application/json - host: - - apl.example.com - user-agent: - - python-httpx/0.23.3 - method: POST - uri: https://apl.example.com/api/v1/apl - response: - content: '{"saleor_api_url":"https://ejwnealqvw.saleor.cloud/graphql","token":"teovwyfkqvpebpsmfpwigpqlusyrme","jwks":"{\"keys\": - [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"ukxkebobvkqqbmtyzcwxbebalnhvps\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}","saleor_app_id":"dpjoofueam","domain":"ejwnealqvw.saleor.cloud"}' - headers: - Connection: - - keep-alive - Content-Length: - - '328' - Content-Type: - - application/json - Date: - - Sun, 19 Feb 2023 17:07:41 GMT - allow: - - GET, POST, HEAD, OPTIONS - referrer-policy: - - same-origin - server: - - uvicorn - vary: - - Origin - x-content-type-options: - - nosniff - x-frame-options: - - DENY - http_version: HTTP/1.1 - status_code: 201 -- request: - body: '{"saleor_app_id": "fxeyumrwrg", "saleor_api_url": "https://vxcdclzonj.saleor.cloud/graphql", - "jwks": "{\"keys\": [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"aofvflmughkjsiebpnlkakvjqywsbn\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}", "domain": "vxcdclzonj.saleor.cloud", - "token": "vxhxemgqtpvvmzgcrxxetsrecvmocg"}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - Bearer access.token - connection: - - keep-alive - content-length: - - '337' - content-type: - - application/json - host: - - apl.example.com - user-agent: - - python-httpx/0.23.3 - method: POST - uri: https://apl.example.com/api/v1/apl - response: - content: '{"saleor_api_url":"https://vxcdclzonj.saleor.cloud/graphql","token":"vxhxemgqtpvvmzgcrxxetsrecvmocg","jwks":"{\"keys\": - [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"aofvflmughkjsiebpnlkakvjqywsbn\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}","saleor_app_id":"fxeyumrwrg","domain":"vxcdclzonj.saleor.cloud"}' - headers: - Connection: - - keep-alive - Content-Length: - - '328' - Content-Type: - - application/json - Date: - - Sun, 19 Feb 2023 17:07:41 GMT - allow: - - GET, POST, HEAD, OPTIONS - referrer-policy: - - same-origin - server: - - uvicorn - vary: - - Origin - x-content-type-options: - - nosniff - x-frame-options: - - DENY - http_version: HTTP/1.1 - status_code: 201 -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - Bearer access.token - connection: - - keep-alive - host: - - apl.example.com - user-agent: - - python-httpx/0.23.3 - method: GET - uri: https://apl.example.com/api/v1/apl?limit=2&offset=0 - response: - content: '{"count":10,"next":"http://apl.example.com/api/v1/apl?limit=2&offset=2","previous":null,"results":[{"saleor_api_url":"https://sbnpsagopi.saleor.cloud/graphql","token":"lbnetlmnjviofvjvleoyhotmbsaheg","jwks":"{\"keys\": - [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"jrlyhkvronpcuskqfhnhbbpjtvcrce\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}","saleor_app_id":"uzfbqpkchx","domain":"sbnpsagopi.saleor.cloud"},{"saleor_api_url":"https://msltedyydo.saleor.cloud/graphql","token":"etqfdiojfvufyfpylknharwbkkhcio","jwks":"{\"keys\": - [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"msfmpvhxqiqptpcfpvomenrslrmpwf\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}","saleor_app_id":"fzglnnohvi","domain":"msltedyydo.saleor.cloud"}]}' - headers: - Connection: - - keep-alive - Content-Length: - - '779' - Content-Type: - - application/json - Date: - - Sun, 19 Feb 2023 17:07:41 GMT - allow: - - GET, POST, HEAD, OPTIONS - referrer-policy: - - same-origin - server: - - uvicorn - vary: - - Origin - x-content-type-options: - - nosniff - x-frame-options: - - DENY - http_version: HTTP/1.1 - status_code: 200 -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - Bearer access.token - connection: - - keep-alive - host: - - apl.example.com - user-agent: - - python-httpx/0.23.3 - method: GET - uri: https://apl.example.com/api/v1/apl?limit=2&offset=2 - response: - content: '{"count":10,"next":"http://apl.example.com/api/v1/apl?limit=2&offset=4","previous":"http://apl.example.com/api/v1/apl?limit=2","results":[{"saleor_api_url":"https://rodnbaorcb.saleor.cloud/graphql","token":"nyqokxizwonkuqqexhktbvgussupaz","jwks":"{\"keys\": - [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"djnhwjcbtrydjfvpeltmzglfcsgngd\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}","saleor_app_id":"lcedtozpeo","domain":"rodnbaorcb.saleor.cloud"},{"saleor_api_url":"https://vjoxywqxno.saleor.cloud/graphql","token":"uagntnmzugcynzcblilonyguxjowjq","jwks":"{\"keys\": - [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"pqimouklxipopspcwrxlzxmzftnxsc\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}","saleor_app_id":"vxrgitlduz","domain":"vjoxywqxno.saleor.cloud"}]}' - headers: - Connection: - - keep-alive - Content-Length: - - '839' - Content-Type: - - application/json - Date: - - Sun, 19 Feb 2023 17:07:42 GMT - allow: - - GET, POST, HEAD, OPTIONS - referrer-policy: - - same-origin - server: - - uvicorn - vary: - - Origin - x-content-type-options: - - nosniff - x-frame-options: - - DENY - http_version: HTTP/1.1 - status_code: 200 -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - Bearer access.token - connection: - - keep-alive - host: - - apl.example.com - user-agent: - - python-httpx/0.23.3 - method: GET - uri: https://apl.example.com/api/v1/apl?limit=2&offset=4 - response: - content: '{"count":10,"next":"http://apl.example.com/api/v1/apl?limit=2&offset=6","previous":"http://apl.example.com/api/v1/apl?limit=2&offset=2","results":[{"saleor_api_url":"https://txjaskukcx.saleor.cloud/graphql","token":"rzbhsxcngssozsamgksgqzsyykbvws","jwks":"{\"keys\": - [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"bbslmktufyfdtzlfaxrqzlcmoslbeo\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}","saleor_app_id":"mtljtfhfjd","domain":"txjaskukcx.saleor.cloud"},{"saleor_api_url":"https://wptoxotfln.saleor.cloud/graphql","token":"bfuugsnzlrmbtbfjhbsfduslfjbmty","jwks":"{\"keys\": - [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"nclygpffmzyoykbffswnequwmdmdhd\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}","saleor_app_id":"krqomgdnue","domain":"wptoxotfln.saleor.cloud"}]}' - headers: - Connection: - - keep-alive - Content-Length: - - '848' - Content-Type: - - application/json - Date: - - Sun, 19 Feb 2023 17:07:42 GMT - allow: - - GET, POST, HEAD, OPTIONS - referrer-policy: - - same-origin - server: - - uvicorn - vary: - - Origin - x-content-type-options: - - nosniff - x-frame-options: - - DENY - http_version: HTTP/1.1 - status_code: 200 -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - Bearer access.token - connection: - - keep-alive - host: - - apl.example.com - user-agent: - - python-httpx/0.23.3 - method: GET - uri: https://apl.example.com/api/v1/apl?limit=2&offset=6 - response: - content: '{"count":10,"next":"http://apl.example.com/api/v1/apl?limit=2&offset=8","previous":"http://apl.example.com/api/v1/apl?limit=2&offset=4","results":[{"saleor_api_url":"https://nxujxjrudl.saleor.cloud/graphql","token":"vmwhdquypdsmsgjlcgtrqacmzbaunk","jwks":"{\"keys\": - [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"fxblkupzfagejghhmtrstnryaeadab\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}","saleor_app_id":"qtpthrjavf","domain":"nxujxjrudl.saleor.cloud"},{"saleor_api_url":"https://vyyfdwmcav.saleor.cloud/graphql","token":"wmsookfbmuopwwlvceiifcoaeicqje","jwks":"{\"keys\": - [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"ydrdjwtzkzasiuyqnqewbubtbugrag\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}","saleor_app_id":"nxvftnbrfb","domain":"vyyfdwmcav.saleor.cloud"}]}' - headers: - Connection: - - keep-alive - Content-Length: - - '848' - Content-Type: - - application/json - Date: - - Sun, 19 Feb 2023 17:07:42 GMT - allow: - - GET, POST, HEAD, OPTIONS - referrer-policy: - - same-origin - server: - - uvicorn - vary: - - Origin - x-content-type-options: - - nosniff - x-frame-options: - - DENY - http_version: HTTP/1.1 - status_code: 200 -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - Bearer access.token - connection: - - keep-alive - host: - - apl.example.com - user-agent: - - python-httpx/0.23.3 - method: GET - uri: https://apl.example.com/api/v1/apl?limit=2&offset=8 - response: - content: '{"count":10,"next":null,"previous":"http://apl.example.com/api/v1/apl?limit=2&offset=6","results":[{"saleor_api_url":"https://ejwnealqvw.saleor.cloud/graphql","token":"teovwyfkqvpebpsmfpwigpqlusyrme","jwks":"{\"keys\": - [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"ukxkebobvkqqbmtyzcwxbebalnhvps\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}","saleor_app_id":"dpjoofueam","domain":"ejwnealqvw.saleor.cloud"},{"saleor_api_url":"https://vxcdclzonj.saleor.cloud/graphql","token":"vxhxemgqtpvvmzgcrxxetsrecvmocg","jwks":"{\"keys\": - [{\"kty\": \"RSA\", \"key_ops\": [\"verify\"], \"n\": \"aofvflmughkjsiebpnlkakvjqywsbn\", - \"e\": \"AQAB\", \"use\": \"sig\", \"kid\": \"1\"}]}","saleor_app_id":"fxeyumrwrg","domain":"vxcdclzonj.saleor.cloud"}]}' - headers: - Connection: - - keep-alive - Content-Length: - - '779' - Content-Type: - - application/json - Date: - - Sun, 19 Feb 2023 17:07:43 GMT - allow: - - GET, POST, HEAD, OPTIONS - referrer-policy: - - same-origin - server: - - uvicorn - vary: - - Origin - x-content-type-options: - - nosniff - x-frame-options: - - DENY - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/apps/monitoring/backend/monitoring/apl/tests/cassettes/test_apl_client/test_apl_key_error[rest_apl_client].yaml b/apps/monitoring/backend/monitoring/apl/tests/cassettes/test_apl_client/test_apl_key_error[rest_apl_client].yaml deleted file mode 100644 index 8da9954..0000000 --- a/apps/monitoring/backend/monitoring/apl/tests/cassettes/test_apl_client/test_apl_key_error[rest_apl_client].yaml +++ /dev/null @@ -1,44 +0,0 @@ -interactions: -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - Bearer access.token - connection: - - keep-alive - host: - - apl.example.com - user-agent: - - python-httpx/0.23.3 - method: GET - uri: https://apl.example.com/api/v1/apl/aHR0cHM6Ly9ub24uZXhpc3RpbmcuZG9tYWlu - response: - content: '{"detail":"Not found."}' - headers: - Connection: - - keep-alive - Content-Length: - - '23' - Content-Type: - - application/json - Date: - - Sun, 19 Feb 2023 16:59:27 GMT - allow: - - GET, PUT, PATCH, DELETE, HEAD, OPTIONS - referrer-policy: - - same-origin - server: - - uvicorn - vary: - - Origin - x-content-type-options: - - nosniff - x-frame-options: - - DENY - http_version: HTTP/1.1 - status_code: 404 -version: 1 diff --git a/apps/monitoring/backend/monitoring/apl/tests/conftest.py b/apps/monitoring/backend/monitoring/apl/tests/conftest.py deleted file mode 100644 index b343b9e..0000000 --- a/apps/monitoring/backend/monitoring/apl/tests/conftest.py +++ /dev/null @@ -1,72 +0,0 @@ -import random -import string - -import pytest - -from ..common import AplEntity - -_SEED = 10 - - -def _random_str(size: int, uppercase=False) -> str: - letters = string.ascii_uppercase if uppercase else string.ascii_lowercase - return "".join(random.choice(letters) for _ in range(size)) - - -@pytest.fixture -def anyio_backend(): - return "asyncio", {"use_uvloop": True} - - -@pytest.fixture(scope="module") -def vcr_config(): - return { - "match_on": [ - "method", - "scheme", - "host", - "port", - "path", - "query", - "headers", - "body", - ] - } - - -jwks_template = """ -{{ - "keys": [ - {{ - "kty": "RSA", - "key_ops": ["verify"], - "n": "{key_n}", - "e": "AQAB", - "use": "sig", - "kid": "1" - }} - ] -}} -""" - - -@pytest.fixture(scope="session") -def entities_factory(): - def factory(size=10): - random.seed(_SEED) - return [ - AplEntity( - saleor_api_url=f"https://{_random_str(10)}.saleor.cloud/graphql", - app_id=_random_str(10), - app_token=_random_str(30), - jwks=jwks_template.format(key_n=_random_str(30)), - ) - for _ in range(size) - ] - - return factory - - -@pytest.fixture(scope="session") -def entity(entities_factory) -> AplEntity: - return entities_factory()[0] diff --git a/apps/monitoring/backend/monitoring/apl/tests/test_apl_client.py b/apps/monitoring/backend/monitoring/apl/tests/test_apl_client.py deleted file mode 100644 index 7eebc6e..0000000 --- a/apps/monitoring/backend/monitoring/apl/tests/test_apl_client.py +++ /dev/null @@ -1,134 +0,0 @@ -from pathlib import Path - -import pytest - -from ..backends import FileAplBackend, MemAplBackend, RestAplBackend -from ..common import AplKeyError, NotConfiguredError -from ..wrapper import AplClient - -pytestmark = pytest.mark.anyio - - -@pytest.fixture -def mem_apl_client(): - client = AplClient() - client.setup("mem://") - return client - - -@pytest.fixture -def file_apl_client(): - path_string = ".test_fileApl.json" - apl_file = Path(path_string) - client = AplClient() - client.setup(f"file://{path_string}") - yield client - if apl_file.exists(): - apl_file.unlink() - - -@pytest.fixture -def rest_apl_client(): - client = AplClient() - client.setup("https://access.token@apl.example.com") - return client - - -apl_clients = ["mem_apl_client", "file_apl_client", "rest_apl_client"] - - -def test_parse_settings_url_mem_backend(): - backend = AplClient.parse_settings_url("mem://") - assert isinstance(backend, MemAplBackend) - - -@pytest.mark.parametrize( - "url,path", - [ - ("file://.fileApl.json", ".fileApl.json"), - ("file://path/to/fileApl.json", "path/to/fileApl.json"), - ], -) -def test_parse_settings_url_file_backend(url, path): - backend = AplClient.parse_settings_url(url) - assert isinstance(backend, FileAplBackend) - assert backend.path == Path(path) - - -@pytest.mark.parametrize( - "url,apl_url,token", - [ - ( - "https://86b0bb44ee7e488d9cc3949b78b0a3ac.6dnRhRlMhhtjHXwBh3f3lJkmz4opGX7EInHKvxlMyPq6T5Y7@apl.example.com", - "https://apl.example.com", - "86b0bb44ee7e488d9cc3949b78b0a3ac.6dnRhRlMhhtjHXwBh3f3lJkmz4opGX7EInHKvxlMyPq6T5Y7", - ), - ( - "http://access.token@localhost:8000", - "http://localhost:8000", - "access.token", - ), - ], -) -def test_parse_settings_url_rest_backend(url, apl_url, token): - backend = AplClient.parse_settings_url(url) - assert isinstance(backend, RestAplBackend) - assert backend.apl_url == apl_url - assert backend.token == token - - -def test_parse_settings_url_not_supported_backend(): - with pytest.raises(NotImplementedError): - AplClient.parse_settings_url("new-schema://path") - - -async def test_apl_client_no_setup(): - client = AplClient() - with pytest.raises(NotConfiguredError): - await client.get("shop.saleor.cloud") - - -@pytest.mark.vcr -@pytest.mark.parametrize("client_fixture", apl_clients) -async def test_apl_get(client_fixture, entity, request): - apl_client: AplClient = request.getfixturevalue(client_fixture) - await apl_client.set(entity.saleor_api_url, entity) - entity_from_client = await apl_client.get(entity.saleor_api_url) - assert entity_from_client == entity.copy() - - -@pytest.mark.vcr -@pytest.mark.parametrize("client_fixture", apl_clients) -async def test_apl_key_error(client_fixture, request): - apl_client: AplClient = request.getfixturevalue(client_fixture) - with pytest.raises(AplKeyError): - await apl_client.get("https://non.existing.domain") - - -@pytest.mark.vcr -@pytest.mark.parametrize("client_fixture", apl_clients) -async def test_apl_delete(client_fixture, entity, request): - apl_client: AplClient = request.getfixturevalue(client_fixture) - await apl_client.set(entity.saleor_api_url, entity) - await apl_client.delete(entity.saleor_api_url) - with pytest.raises(AplKeyError): - await apl_client.get(entity.saleor_api_url) - - -@pytest.mark.vcr -@pytest.mark.parametrize("client_fixture", apl_clients) -async def test_apl_delete_non_existing(client_fixture, request): - apl_client: AplClient = request.getfixturevalue(client_fixture) - with pytest.raises(AplKeyError): - await apl_client.delete("https://non.existing.domain") - - -@pytest.mark.vcr -@pytest.mark.parametrize("client_fixture", apl_clients) -async def test_apl_get_all(client_fixture, entities_factory, request): - apl_client: AplClient = request.getfixturevalue(client_fixture) - entities = entities_factory() - for entity in entities: - await apl_client.set(entity.saleor_api_url, entity) - apl_entities = [entity async for entity in apl_client.get_all(page_size=2)] - assert apl_entities == [(entity.saleor_api_url, entity) for entity in entities] diff --git a/apps/monitoring/backend/monitoring/apl/wrapper.py b/apps/monitoring/backend/monitoring/apl/wrapper.py deleted file mode 100644 index ec58899..0000000 --- a/apps/monitoring/backend/monitoring/apl/wrapper.py +++ /dev/null @@ -1,49 +0,0 @@ -from pathlib import Path -from urllib.parse import urlparse - -from .backends import AplBackend, FileAplBackend, MemAplBackend, RestAplBackend -from .common import AplEntity, NotConfiguredError - - -class AplClient: - def __init__(self): - self._backend: AplBackend | None = None - - @staticmethod - def parse_settings_url(url: str) -> AplBackend: - parts = urlparse(url) - if parts.scheme == "file": - path = Path(url.removeprefix("file://")) - return FileAplBackend(path) - elif parts.scheme == "mem": - return MemAplBackend() - elif parts.scheme in ["http", "https"]: - token = parts.username or "" - port = "" if parts.port is None else f":{parts.port}" - apl_url = f"{parts.scheme}://{parts.hostname}{port}{parts.path}" - return RestAplBackend(apl_url=apl_url, token=token) - raise NotImplementedError() - - def setup(self, url: str): - self._backend = self.parse_settings_url(url) - - @property - def backend(self) -> AplBackend: - if self._backend is None: - raise NotConfiguredError( - "Run `apl_client.setup(...)` before using apl_client" - ) - return self._backend - - async def get(self, key: str) -> AplEntity: - return await self.backend.get(key) - - async def set(self, key: str, value: AplEntity): - return await self.backend.set(key, value) - - async def delete(self, key: str): - return await self.backend.delete(key) - - async def get_all(self, page_size=100): - async for item in self.backend.get_all(page_size=page_size): - yield item diff --git a/apps/monitoring/backend/monitoring/app.py b/apps/monitoring/backend/monitoring/app.py deleted file mode 100644 index 3024309..0000000 --- a/apps/monitoring/backend/monitoring/app.py +++ /dev/null @@ -1,131 +0,0 @@ -import logging - -from fastapi import Depends, FastAPI, Request, status -from starlette.middleware.cors import CORSMiddleware - -from .api import graphql_app -from .apl import AplEntity, apl_client -from .deps import ( - ApiDependencies, - WebhookDependencies, - saleor_api_url_header, - verify_saleor_api_url, -) -from .integrations.datadog import DataDogClientError -from .logs import configure_logging -from .payload import OBSERVABILITY_EVENTS -from .saleor.client import GraphQLError, SaleorClient -from .saleor.common import InstallData, LazyUrl -from .settings import manifest, settings -from .utils import get_base_url - -logger = logging.getLogger(__name__) - -configure_logging(settings.debug) - -apl_client.setup(settings.apl_url) - - -app = FastAPI(openapi_url="/api/openapi.json") - -app.add_middleware( - CORSMiddleware, - allow_origins=["*"], - allow_headers=["*"], - allow_methods=["OPTIONS", "GET", "POST", "DELETE"], -) - - -@app.get("/manifest", status_code=status.HTTP_200_OK, tags=["installation-handshake"]) -async def show_manifest(request: Request): - manifest_copy = manifest.copy() - for name, field in manifest_copy: - if isinstance(field, LazyUrl): - setattr(manifest_copy, name, field(request)) - for extension in manifest_copy.extensions: - if isinstance(extension.url, LazyUrl): - extension.url = extension.url(request) - for webhook in manifest_copy.webhooks: - if isinstance(webhook.target_url, LazyUrl): - webhook.target_url = webhook.target_url(request) - return manifest_copy - - -@app.post( - "/install", - status_code=status.HTTP_200_OK, - tags=["installation-handshake"], - name="install", -) -async def install( - data: InstallData, - request: Request, - api_url=Depends(saleor_api_url_header), - _valid=Depends(verify_saleor_api_url), -): - client = SaleorClient(api_url, "test", data.auth_token) - try: - app_info = await client.app_info() - target_url = get_base_url(request).replace(path="webhooks") - await client.create_webhook( - target_url=str(target_url), - events=["OBSERVABILITY"], - name="OBSERVABILITY", - ) - jwks = await client.get_jwks() - entity = AplEntity( - saleor_api_url=api_url, - app_id=app_info.id, - app_token=data.auth_token, - jwks=jwks, - ) - await apl_client.set(api_url, entity) - except GraphQLError: - return {"error": {"message": "Wrong app token"}} - return {} - - -@app.post( - "/webhooks", - status_code=status.HTTP_200_OK, - tags=["webhooks"], - name="webhooks", -) -async def handle_observability_events( - payloads: list[OBSERVABILITY_EVENTS], - commons: WebhookDependencies = Depends(), -): - metadata = await commons.manager.get_metadata() - if not metadata.datadog or not metadata.datadog.active: - logger.warning( - "DataDog integration inactive or not configured. Dropping %s events", - len(payloads), - ) - return - credentials = metadata.datadog.credentials - try: - logger.info("Sending %s events to DataDog", len(payloads)) - await commons.datadog_client.send_logs( - commons.saleor_data.saleor_api_url, credentials, payloads - ) - except DataDogClientError: - logger.warning("Sending logs to DataDog failed. Deactivating integration") - metadata.datadog.active = False - metadata.datadog.error = "Wrong credentials. Integration deactivated" - await commons.manager.save_private_metadata(metadata) - - -@app.get("/health", status_code=status.HTTP_200_OK, tags=["health"], name="health") -async def health(): - return {"status": "ok"} - - -@app.get("/graphql") -async def graphiql(request: Request): - return await graphql_app.render_playground(request) - - -@app.post("/graphql") -async def graphql(request: Request, commons: ApiDependencies = Depends()): - request.state.api_context = commons - return await graphql_app.graphql_http_server(request) diff --git a/apps/monitoring/backend/monitoring/deps.py b/apps/monitoring/backend/monitoring/deps.py deleted file mode 100644 index f8c3192..0000000 --- a/apps/monitoring/backend/monitoring/deps.py +++ /dev/null @@ -1,143 +0,0 @@ -import logging - -from fastapi import Depends, Header, HTTPException, Request -from jwt.api_jwk import PyJWKSet - -from .apl import AplEntity, AplError, AplKeyError, apl_client -from .integrations.datadog import DataDogApiClient, DataDogClient, TestDataDogClient -from .saleor import ( - SALEOR_API_URL_HEADER, - SALEOR_SIGNATURE_HEADER, - SALEOR_TOKEN_HEADER, - SaleorToken, -) -from .saleor.crypto import decode_webhook_payload -from .saleor.manager import SaleorManager -from .schema import Metadata -from .settings import settings - -logger = logging.getLogger(__name__) - - -async def saleor_api_url_header( - api_url: str | None = Header(None, alias=SALEOR_API_URL_HEADER) -) -> str: - if not api_url: - msg = f"Missing {SALEOR_API_URL_HEADER.upper()} header." - logger.warning(msg) - raise HTTPException(status_code=400, detail=msg) - return api_url - - -async def verify_saleor_api_url(api_url: str = Depends(saleor_api_url_header)): - # TODO implement - if api_url: - return True - raise HTTPException( - status_code=400, - detail=f"Provided url is invalid or environment {api_url} not allowed.", - ) - - -async def saleor_token_header( - token: str | None = Header(None, alias=SALEOR_TOKEN_HEADER) -) -> str: - if not token: - msg = f"Missing {SALEOR_TOKEN_HEADER.upper()} header." - logger.warning(msg) - raise HTTPException(status_code=400, detail=msg) - return token - - -async def apl_entity( - api_url: str = Depends(saleor_api_url_header), - _verify=Depends(verify_saleor_api_url), -) -> AplEntity: - try: - return await apl_client.get(api_url) - except AplKeyError: - msg = f"App needs to be installed before use. First, install the app in Saleor at {api_url}." - logger.warning(msg) - raise HTTPException(status_code=400, detail=msg) # noqa: 904 - except AplError as error: - logging.error("APL error %r", error) - raise HTTPException( # noqa: 904 - status_code=500, detail="App error. Try again later." - ) - - -async def saleor_token( - token_str: str = Depends(saleor_token_header), - saleor_data: AplEntity = Depends(apl_entity), -) -> SaleorToken: - token = SaleorToken(token_str, saleor_data.jwks) - # TODO handle jwks reload - return token - - -async def verify_is_stuff_user(token: SaleorToken = Depends(saleor_token)) -> bool: - if not token.is_staff_user(): - HTTPException( - status_code=400, detail="Only staff user can perform this operation." - ) - return True - - -async def get_saleor_signature( - saleor_signature: str | None = Header(None, alias=SALEOR_SIGNATURE_HEADER) -): - return saleor_signature - - -async def verify_webhook_signature( - request: Request, - jws: str = Depends(get_saleor_signature), - saleor_data: AplEntity = Depends(apl_entity), -): - saleor_jwks = PyJWKSet.from_dict(saleor_data.jwks) - return decode_webhook_payload( - jws=jws, jwks=saleor_jwks, webhook_payload=await request.body() - ) - - -async def saleor_manager(saleor_data: AplEntity = Depends(apl_entity)): - return SaleorManager[Metadata]( - saleor_data.saleor_api_url, - saleor_data.app_id, - saleor_data.app_token, - Metadata, - ) - - -async def datadog_client() -> DataDogClient: - if settings.mock_datadog_client: - return TestDataDogClient() - return DataDogApiClient() - - -class ApiDependencies: - def __init__( - self, - token: SaleorToken = Depends(saleor_token), - saleor_data: AplEntity = Depends(apl_entity), - manager: SaleorManager[Metadata] = Depends(saleor_manager), - datadog_client: DataDogClient = Depends(datadog_client), - _verify_is_stuff_user=Depends(verify_is_stuff_user), - ): - self.saleor_data = saleor_data - self.token = token - self.manager = manager - self.datadog_client = datadog_client - - -class WebhookDependencies: - def __init__( - self, - saleor_data: AplEntity = Depends(apl_entity), - manager: SaleorManager[Metadata] = Depends(saleor_manager), - datadog_client: DataDogClient = Depends(datadog_client), - _verify_webhook_signature=Depends(verify_webhook_signature), - ): - self.saleor_data = saleor_data - self.manager = manager - self.datadog_client = datadog_client diff --git a/apps/monitoring/backend/monitoring/integrations/__init__.py b/apps/monitoring/backend/monitoring/integrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/monitoring/backend/monitoring/integrations/datadog.py b/apps/monitoring/backend/monitoring/integrations/datadog.py deleted file mode 100644 index 05af725..0000000 --- a/apps/monitoring/backend/monitoring/integrations/datadog.py +++ /dev/null @@ -1,145 +0,0 @@ -import logging -from typing import Any, Awaitable, cast - -from datadog_api_client.exceptions import ApiException, ForbiddenException -from datadog_api_client.v1.api.authentication_api import AuthenticationApi -from datadog_api_client.v2 import AsyncApiClient, Configuration -from datadog_api_client.v2.api.logs_api import LogsApi -from datadog_api_client.v2.model.content_encoding import ContentEncoding -from datadog_api_client.v2.model.http_log import HTTPLog -from pydantic import BaseModel - -from ..payload import OBSERVABILITY_EVENTS -from .logs import generate_logs - -LOGS_ENCODING = ContentEncoding("gzip") - -logger = logging.getLogger(__name__) - -LOGS_ERRORS = { - 400: "Bad request (likely an issue in the payload formatting)", - 401: "Unauthorized (likely a missing API Key)", - 403: "Permission issue (likely using an invalid API Key)", - 408: "Request Timeout, request should be retried after some time", - 413: "Payload too large (batch is above 5MB uncompressed)", - 429: "Too Many Requests, request should be retried after some time", - 500: "Internal Server Error, the server encountered an unexpected condition that " - "prevented it from fulfilling the request, request should be retried after some time", - 503: "Service Unavailable, the server is not ready to handle the request " - "probably because it is overloaded, request should be retried after some time", -} - - -class DataDogClientError(Exception): - pass - - -class DataDogCredsRejectedError(DataDogClientError): - """DataDog credentials were rejected""" - - -class DatadogCredentials(BaseModel): - site: str - api_key: str - - -class DataDogClient: - async def validate_credentials(self, credentials: DatadogCredentials) -> bool: - raise NotImplementedError() - - async def send_logs( - self, - saleor_api_url: str, - credentials: DatadogCredentials, - logs: list[OBSERVABILITY_EVENTS], - ): - raise NotImplementedError() - - -class TestDataDogClient(DataDogClient): - _good_creds = DatadogCredentials( - site="US1", api_key="156e22d50c4e8b6816e1fd4794d3fd8c" - ) - _failing_creds = DatadogCredentials( - site="EU1", api_key="156e22d50c4e8b6816e1fd4794d3fd8c" - ) - - async def validate_credentials(self, credentials: DatadogCredentials) -> bool: - return credentials == self._good_creds or credentials == self._failing_creds - - async def send_logs( - self, - saleor_api_url: str, - credentials: DatadogCredentials, - logs: list[OBSERVABILITY_EVENTS], - ): - if credentials == self._good_creds: - return - raise DataDogCredsRejectedError() - - -class DataDogApiClient(DataDogClient): - _site_map = { - "US1": "datadoghq.com", - "US3": "us3.datadoghq.com", - "US5": "us5.datadoghq.com", - "EU1": "datadoghq.eu", - "US1_FED": "ddog-gov.com", - } - - @classmethod - def _get_config(cls, credentials: DatadogCredentials) -> Configuration: - configuration = Configuration() - configuration.api_key["apiKeyAuth"] = credentials.api_key - configuration.server_variables["site"] = cls._site_map[credentials.site] - return configuration - - async def validate_credentials(self, credentials: DatadogCredentials) -> bool: - config = self._get_config(credentials) - async with AsyncApiClient(config) as api_client: - api_instance = AuthenticationApi(api_client) - try: - response = await cast(Awaitable[Any], api_instance.validate()) - return response.valid - except ForbiddenException: - pass - except ApiException as exp: - logger.error( - "DataDog validate_credentials ApiException[%s]", - exp.status, - extra={ - "status_code": exp.status, - "response_headers": dict(exp.headers) if exp.headers else None, - }, - ) - return False - - async def send_logs( - self, - saleor_api_url: str, - credentials: DatadogCredentials, - logs: list[OBSERVABILITY_EVENTS], - ): - config = self._get_config(credentials) - logs = generate_logs(logs, saleor_api_url) - async with AsyncApiClient(config) as api_client: - api_instance = LogsApi(api_client) - try: - await cast( - Awaitable[Any], - api_instance.submit_log( - body=HTTPLog(logs), content_encoding=LOGS_ENCODING - ), - ) - except ApiException as exp: - error_msg = LOGS_ERRORS.get(exp.status) - logger.error( - "DataDog send_logs ApiException[%s]", - error_msg, - extra={ - "status_code": exp.status, - "response_headers": dict(exp.headers) if exp.headers else None, - }, - ) - except Exception: - logger.error("DataDog send_logs Unknown error") diff --git a/apps/monitoring/backend/monitoring/integrations/logs.py b/apps/monitoring/backend/monitoring/integrations/logs.py deleted file mode 100644 index 410285a..0000000 --- a/apps/monitoring/backend/monitoring/integrations/logs.py +++ /dev/null @@ -1,291 +0,0 @@ -from datetime import datetime -from enum import Enum - -from datadog_api_client.v2.model.http_log_item import HTTPLogItem -from pydantic import BaseModel -from ua_parser import user_agent_parser # type: ignore - -from ..payload import ( - OBSERVABILITY_EVENTS, - ApiCallPayload, - EventDeliveryAttemptPayload, - JsonTruncText, -) -from ..utils import parse_headers - - -class EventDeliveryStatus(str, Enum): - pending = "pending" - success = "success" - failed = "failed" - - -class LogLevel(str, Enum): - info = "INFO" - warn = "WARN" - error = "ERROR" - - -log_level_map = { - EventDeliveryStatus.pending.value: LogLevel.warn, - EventDeliveryStatus.success.value: LogLevel.info, - EventDeliveryStatus.failed.value: LogLevel.error, -} - - -class DataDogLogUseragentDetails(BaseModel): - os: dict[str, str | None] - browser: dict[str, str | None] - device: dict[str, str | None] - - -class DataDogLogNetwork(BaseModel): - bytes_read: int | None - bytes_written: int | None - - -class DataDogLogEvent(BaseModel): - name: str - outcome: str | None - - -class DataDogLogHttp(BaseModel): - url: str - request_id: str | None - referer: str | None - status_code: str | None - method: str | None - useragent: str | None - useragent_details: DataDogLogUseragentDetails | None - - -class DataDogLog(BaseModel): - ddsource: str = "saleor" - service: str - timestamp: float - level: LogLevel = LogLevel.info - ddtags: str | None - http: DataDogLogHttp - network: DataDogLogNetwork - evt: DataDogLogEvent - duration: int | None - - -class GraphQLOperation(BaseModel): - name: str | None - operation_type: str - query: str | None - result: str | None - result_invalid: bool - truncated: bool - - -class EventRequest(BaseModel): - headers: dict[str, str] = {} - - -class EventResponse(BaseModel): - headers: dict[str, str] = {} - body: JsonTruncText | None - - -class App(BaseModel): - id: str - name: str - - -class ApiCall(BaseModel): - request_headers: dict[str, str] = {} - response_headers: dict[str, str] = {} - gql_operations: list[GraphQLOperation] - app: App | None - - -class ApiCallLog(DataDogLog): - saleor: ApiCall - - -class Webhook(BaseModel): - id: str - name: str - target_url: str - subscription_query: JsonTruncText | None - - -class EventDeliveryPayload(BaseModel): - content_length: int - body: JsonTruncText - - -class EventDelivery(BaseModel): - id: str - status: str - event_type: str - event_sync: bool - payload: EventDeliveryPayload - - -class EventDeliveryAttempt(BaseModel): - id: str - status: str - next_retry: datetime | None - request_headers: dict[str, str] = {} - response_headers: dict[str, str] = {} - response_body: JsonTruncText | None - - -class EventDeliveryAttemptData(BaseModel): - event_delivery_attempt: EventDeliveryAttempt - event_delivery: EventDelivery - webhook: Webhook - app: App - - -class EventDeliveryAttemptLog(DataDogLog): - saleor: EventDeliveryAttemptData - - -def http_status_ok(status_code: int | None): - if status_code is None or status_code >= 400: - return False - return True - - -def parse_useragent(useragent: str | None) -> DataDogLogUseragentDetails | None: - if not useragent: - return None - parsed = user_agent_parser.Parse(useragent) - return DataDogLogUseragentDetails( - os=parsed["os"], - browser=parsed["user_agent"], - device=parsed["device"], - ) - - -def convert_duration(duration: float | None) -> float | None: - return duration * 1_000_000_000 if duration else None - - -def generate_api_call_log(payload: ApiCallPayload, saleor_domain: str) -> HTTPLogItem: - request_headers = parse_headers(payload.request.headers) - response_headers = parse_headers(payload.response.headers) - gql_operations: list[GraphQLOperation] = [] - for op in payload.gql_operations: - gql_operations.append( - GraphQLOperation( - name=op.name.text if op.name else None, - operation_type=op.operation_type, - query=op.query.text if op.query else None, - result=op.result.text if op.result else None, - result_invalid=op.result_invalid, - truncated=any( - [ - op.name.truncated if op.name else False, - op.query.truncated if op.query else False, - op.result.truncated if op.result else False, - ] - ), - ) - ) - level = ( - LogLevel.info - if http_status_ok(payload.response.status_code) - else LogLevel.error - ) - message = ApiCallLog( - service=saleor_domain, - timestamp=payload.request.time.timestamp() * 1000, - level=level, - http=DataDogLogHttp( - url=payload.request.url, - request_id=payload.request.id, - referer=request_headers.get("Referer"), - status_code=str(payload.response.status_code), - method=payload.request.method, - useragent=request_headers.get("User-Agent"), - useragent_details=parse_useragent(request_headers.get("User-Agent")), - ), - network=DataDogLogNetwork( - bytes_read=payload.request.content_length, - bytes_written=payload.response.content_length, - ), - evt=DataDogLogEvent( - name=payload.event_type, - outcome="success" if level == LogLevel.info else "failure", - ), - saleor=ApiCall( - gql_operations=gql_operations, - app=App(id=payload.app.id, name=payload.app.name) if payload.app else None, - request_headers=dict(request_headers), - response_headers=dict(response_headers), - ), - ) - return HTTPLogItem(message=message.json()) - - -def generate_event_delivery_attempt_log( - payload: EventDeliveryAttemptPayload, saleor_domain: str -) -> HTTPLogItem: - request_headers = parse_headers(payload.request.headers) - response_headers = parse_headers(payload.response.headers) - message = EventDeliveryAttemptLog( - service=saleor_domain, - timestamp=payload.time.timestamp() * 1000, - level=log_level_map.get(payload.event_delivery.status, LogLevel.error), - duration=convert_duration(payload.duration), - http=DataDogLogHttp( - url=payload.webhook.target_url, - request_id=payload.id, - status_code=str(payload.response.status_code), - ), - network=DataDogLogNetwork( - bytes_read=payload.response.content_length, - bytes_written=payload.event_delivery.payload.content_length, - ), - evt=DataDogLogEvent( - name=payload.event_type, - outcome=payload.status, - ), - saleor=EventDeliveryAttemptData( - event_delivery_attempt=EventDeliveryAttempt( - id=payload.id, - status=payload.status, - next_retry=payload.next_retry, - request_headers=dict(request_headers), - response_headers=dict(response_headers), - response_body=payload.response.body, - ), - app=App(id=payload.app.id, name=payload.app.name), - event_delivery=EventDelivery( - id=payload.event_delivery.id, - status=payload.event_delivery.status, - event_type=payload.event_delivery.event_type, - event_sync=payload.event_delivery.event_sync, - payload=EventDeliveryPayload( - body=payload.event_delivery.payload.body, - content_length=payload.event_delivery.payload.content_length, - ), - ), - webhook=Webhook( - id=payload.webhook.id, - name=payload.webhook.name, - target_url=payload.webhook.target_url, - subscription_query=payload.webhook.subscription_query, - ), - ), - ) - return HTTPLogItem(message=message.json()) - - -def generate_logs( - payloads: list[OBSERVABILITY_EVENTS], saleor_domain: str -) -> list[HTTPLogItem]: - log_items: list[HTTPLogItem] = [] - for payload in payloads: - if isinstance(payload, ApiCallPayload): - log_items.append(generate_api_call_log(payload, saleor_domain)) - elif isinstance(payload, EventDeliveryAttemptPayload): - log_items.append( - generate_event_delivery_attempt_log(payload, saleor_domain) - ) - return log_items diff --git a/apps/monitoring/backend/monitoring/logs.py b/apps/monitoring/backend/monitoring/logs.py deleted file mode 100644 index fd4f47f..0000000 --- a/apps/monitoring/backend/monitoring/logs.py +++ /dev/null @@ -1,62 +0,0 @@ -import logging.config - - -def configure_logging(debug=False): - config = { - "version": 1, - "disable_existing_loggers": False, - "root": { - "level": "INFO", - "handlers": ["default"], - }, - "formatters": { - "json": { - "()": "pythonjsonlogger.jsonlogger.JsonFormatter", - "datefmt": "%Y-%m-%dT%H:%M:%SZ", - "format": ( - "%(asctime)s %(levelname)s %(lineno)s %(message)s %(name)s " - + "%(pathname)s %(process)d %(threadName)s" - ), - }, - "verbose": { - "format": ( - "%(levelname)s %(name)s %(message)s [PID:%(process)d:%(threadName)s]" - ) - }, - "uvicorn": { - "()": "uvicorn.logging.DefaultFormatter", - "fmt": "%(levelprefix)s %(message)s [PID:%(process)d:%(threadName)s]", - "use_colors": None, - }, - }, - "handlers": { - "default": { - "level": "DEBUG", - "class": "logging.StreamHandler", - "formatter": "verbose" if debug else "json", - }, - "uvicorn": { - "class": "logging.StreamHandler", - "formatter": "uvicorn" if debug else "json", - }, - "null": { - "class": "logging.NullHandler", - }, - }, - "loggers": { - "uvicorn": { - "propagate": False, - "handlers": ["uvicorn"], - "level": "INFO", - }, - "uvicorn.access": { - "propagate": False, - "handlers": ["null"], - }, - "saleor_app_observability": { - "level": "DEBUG" if debug else "INFO", - "propagate": True, - }, - }, - } - logging.config.dictConfig(config) diff --git a/apps/monitoring/backend/monitoring/payload.py b/apps/monitoring/backend/monitoring/payload.py deleted file mode 100644 index 8af457c..0000000 --- a/apps/monitoring/backend/monitoring/payload.py +++ /dev/null @@ -1,93 +0,0 @@ -from datetime import datetime -from typing import Any, Literal - -from .utils import HttpHeaders, JsonBaseModel - - -class App(JsonBaseModel): - id: str - name: str - - -class ApiCallRequest(JsonBaseModel): - id: str - method: str - url: str - time: datetime - headers: HttpHeaders - content_length: int - - -class ApiCallResponse(JsonBaseModel): - headers: HttpHeaders - status_code: int | None - content_length: int - - -class JsonTruncText(JsonBaseModel): - text: str - truncated: bool - - -class GraphQLOperation(JsonBaseModel): - name: JsonTruncText | None - operation_type: str | None - query: JsonTruncText | None - result: JsonTruncText | None - result_invalid: bool - - -class ApiCallPayload(JsonBaseModel): - event_type: Literal["api_call"] - request: ApiCallRequest - response: ApiCallResponse - gql_operations: list[GraphQLOperation] - app: App | None - - -class EventDeliveryAttemptRequest(JsonBaseModel): - headers: HttpHeaders - - -class EventDeliveryAttemptResponse(JsonBaseModel): - headers: HttpHeaders - status_code: int | None - content_length: int - body: JsonTruncText - - -class EventDeliveryPayload(JsonBaseModel): - content_length: int - body: JsonTruncText - - -class EventDelivery(JsonBaseModel): - id: str - status: str - event_type: str - event_sync: bool - payload: EventDeliveryPayload - - -class Webhook(JsonBaseModel): - id: str - name: str - target_url: str - subscription_query: JsonTruncText | None - - -class EventDeliveryAttemptPayload(JsonBaseModel): - event_type: Literal["event_delivery_attempt"] - id: str - time: datetime - duration: float | None - status: str - next_retry: datetime | None - request: EventDeliveryAttemptRequest - response: EventDeliveryAttemptResponse - event_delivery: EventDelivery - webhook: Webhook - app: App - - -OBSERVABILITY_EVENTS = ApiCallPayload | EventDeliveryAttemptPayload | dict[str, Any] diff --git a/apps/monitoring/backend/monitoring/saleor/__init__.py b/apps/monitoring/backend/monitoring/saleor/__init__.py deleted file mode 100644 index f3c2f52..0000000 --- a/apps/monitoring/backend/monitoring/saleor/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -from .common import ( - SALEOR_API_URL_HEADER, - SALEOR_SIGNATURE_HEADER, - SALEOR_TOKEN_HEADER, - SaleorToken, -) - -__all__ = [ - "SALEOR_TOKEN_HEADER", - "SALEOR_API_URL_HEADER", - "SALEOR_SIGNATURE_HEADER", - "SaleorToken", -] diff --git a/apps/monitoring/backend/monitoring/saleor/client.py b/apps/monitoring/backend/monitoring/saleor/client.py deleted file mode 100644 index 7d435a3..0000000 --- a/apps/monitoring/backend/monitoring/saleor/client.py +++ /dev/null @@ -1,103 +0,0 @@ -from typing import Any, Dict, Optional, Sequence -from urllib.parse import urlparse, urlunparse - -import httpx - -from .graphql import ( - CREATE_WEBHOOK, - DELETE_PRIVATE_METADATA, - GET_APP_INFO, - UPDATE_PRIVATE_METADATA, -) -from .utils import JsonBaseModel - - -class WebhookInfo(JsonBaseModel): - id: str - target_url: str - is_active: bool - - -class AppInfo(JsonBaseModel): - id: str - webhooks: list[WebhookInfo] - private_metafields: dict[str, str] - - -class GraphQLError(Exception): - """ - Raised on Saleor GraphQL errors - """ - - def __init__( - self, - errors: Sequence[Dict[str, Any]], - response_data: Optional[Dict[str, Any]] = None, - ): - self.errors = errors - self.response_data = response_data - - def __str__(self): - return ( - f"GraphQLError: {', '.join([error['message'] for error in self.errors])}." - ) - - -class SaleorClient: - def __init__(self, saleor_api_url: str, user_agent, auth_token=None): - self.saleor_api_url = saleor_api_url - self.headers = {"User-Agent": user_agent} - if auth_token: - self.headers["Authorization"] = f"Bearer {auth_token}" - - async def get_jwks(self) -> dict[str, Any]: - parts = urlparse(self.saleor_api_url) - jwks_url = urlunparse(parts._replace(path="/.well-known/jwks.json")) - async with httpx.AsyncClient() as client: - res = await client.get(jwks_url) - return res.json() - - async def execute(self, query, variables=None): - async with httpx.AsyncClient() as client: - data = {"query": query, "variables": variables} - res = await client.post( - self.saleor_api_url, - json=data, - headers=self.headers, - ) - res_data = res.json() - if errors := res_data.get("errors"): - raise GraphQLError(errors=errors, response_data=res_data.get("data")) - return res_data["data"] - - async def app_info(self) -> AppInfo: - result = await self.execute(GET_APP_INFO) - return AppInfo.parse_obj(result["app"]) - - async def update_private_metadata(self, app_id: str, metadata: dict[str, str]): - metadata_input = [{"key": key, "value": val} for key, val in metadata.items()] - await self.execute( - UPDATE_PRIVATE_METADATA, - variables={"appId": app_id, "metadata": metadata_input}, - ) - - async def delete_private_metadata(self, app_id: str, keys: set[str]): - await self.execute( - DELETE_PRIVATE_METADATA, variables={"appId": app_id, "keys": list(keys)} - ) - - async def create_webhook( - self, - target_url: str, - events: list[str], - name: str, - ): - webhook_input = { - "targetUrl": target_url, - "events": events, - "name": name, - } - await self.execute( - CREATE_WEBHOOK, - variables={"input": webhook_input}, - ) diff --git a/apps/monitoring/backend/monitoring/saleor/common.py b/apps/monitoring/backend/monitoring/saleor/common.py deleted file mode 100644 index 789b327..0000000 --- a/apps/monitoring/backend/monitoring/saleor/common.py +++ /dev/null @@ -1,151 +0,0 @@ -from enum import Enum -from typing import Any - -from fastapi import Request -from jwt.api_jwk import PyJWKSet -from pydantic import AnyHttpUrl, BaseModel, Field -from starlette.routing import NoMatchFound - -from ..utils import get_base_url -from .crypto import decode_jwt - -SALEOR_API_URL_HEADER = "saleor-api-url" -SALEOR_TOKEN_HEADER = "authorization-bearer" -SALEOR_SIGNATURE_HEADER = "saleor-signature" - - -class SaleorAppError(Exception): - """Generic Saleor App Error, all framework errros inherit from this""" - - -class InstallAppError(SaleorAppError): - """Install App error""" - - -class ConfigurationError(SaleorAppError): - """App is misconfigured""" - - -class InstallData(BaseModel): - auth_token: str - - -class SaleorPermissions(str, Enum): - MANAGE_OBSERVABILITY = "MANAGE_OBSERVABILITY" - - -class LazyUrl(str): - """ - Used to declare a fully qualified url that is to be resolved when the - request is available. - """ - - def __init__(self, name: str): - self.name = name - - @classmethod - def __get_validators__(cls): - yield cls.validate - - @classmethod - def validate(cls, v): - return v - - def resolve(self): - return self.request.url_for(self.name) - - def __call__(self, request: Request): - self.request = request - try: - return self.resolve() - except NoMatchFound: - raise ConfigurationError( - f"Failed to resolve a lazy url, check if an endpoint named '{self.name}' is defined." - ) from None - - def __hash__(self): - return hash(self.name) - - def __eq__(self, other): - return self.name == other.name - - def __ne__(self, other): - return not (self.name == other.name) - - def __str__(self): - return f"LazyURL('{self.name}')" - - def __repr__(self): - return str(self) - - -class LazyAbsoluteUrl(LazyUrl): - def resolve(self): - base_url = get_base_url(self.request) - return str(base_url.replace(path=self.name)) - - -class LazyPath(LazyUrl): - """ - Much like LazyUrl but resolves only to the path part of an url. - The lazy aspect of this class is very redundant but is built like so to - maintain the same usage as the LazyUrl class. - """ - - def resolve(self): - return self.request.app.url_path_for(self.name) - - def __str__(self): - return f"LazyPath('{self.name}')" - - -class Webhook(BaseModel): - name: str - async_events: list[str] = Field(..., alias="asyncEvents") - query: str - target_url: AnyHttpUrl | LazyUrl = Field(..., alias="targetUrl") - is_active: bool = Field(..., alias="isActive") - - class Config: - allow_population_by_field_name = True - - -class Manifest(BaseModel): - id: str - permissions: list[str] - name: str - author: str - version: str - about: str - extensions: list[Any] = [] - webhooks: list[Webhook] = [] - data_privacy: str = Field(..., alias="dataPrivacy") - data_privacy_url: AnyHttpUrl | LazyUrl = Field(..., alias="dataPrivacyUrl") - homepage_url: AnyHttpUrl | LazyUrl = Field(..., alias="homepageUrl") - support_url: AnyHttpUrl | LazyUrl = Field(..., alias="supportUrl") - configuration_url: AnyHttpUrl | LazyUrl | None = Field( - None, alias="configurationUrl" - ) - app_url: AnyHttpUrl | LazyUrl = Field(..., alias="appUrl") - token_target_url: AnyHttpUrl | LazyUrl = Field( - LazyUrl("install"), alias="tokenTargetUrl" - ) - - class Config: - allow_population_by_field_name = True - - -class SaleorToken: - def __init__(self, token_str: str, jwks: dict[str, Any]): - self.token_str = token_str - self.jwks = PyJWKSet.from_dict(jwks) - self.jwt = decode_jwt(self.token_str, self.jwks) - - def is_staff_user(self) -> bool: - return self.jwt["is_staff"] - - def validate_permission(self, permissions: str | list[str]) -> bool: - return True - - def validate_user_permission(self, permissions: str | list[str]) -> bool: - return True diff --git a/apps/monitoring/backend/monitoring/saleor/crypto.py b/apps/monitoring/backend/monitoring/saleor/crypto.py deleted file mode 100644 index bfce99b..0000000 --- a/apps/monitoring/backend/monitoring/saleor/crypto.py +++ /dev/null @@ -1,66 +0,0 @@ -from typing import Dict - -from jwt.api_jwk import PyJWKSet -from jwt.api_jws import PyJWS -from jwt.api_jwt import PyJWT - - -class CryptoException(Exception): - """ - Base exception for the crypto module errors. - """ - - -class JWKSKeyMissing(CryptoException): - """ - Raised when a requested kid is missing from a keyset. - """ - - -class KeyIDMissing(CryptoException): - """ - Raised when a JWT without a 'kid' header is received. - """ - - -jwt_global_obj = PyJWT(options={"verify_signature": True}) -jws_global_obj = PyJWS(options={"verify_signature": True}) -get_unverified_header = jws_global_obj.get_unverified_header - - -def get_kid(sig_header: Dict[str, str]): - try: - return sig_header["kid"] - except KeyError as err: - raise KeyIDMissing() from err - - -def get_key_from_jwks(kid: str, jwks: PyJWKSet): - try: - jwks_key = jwks[kid] - except KeyError as err: - raise JWKSKeyMissing(f"The JWKS does not hold the key: {kid}") from err - return jwks_key.key - - -def decode_webhook_payload(jws: str, jwks: PyJWKSet, webhook_payload: bytes): - sig_header = get_unverified_header(jws) - key = get_key_from_jwks(kid=get_kid(sig_header), jwks=jwks) - - return jws_global_obj.decode( - jws, - algorithms=[sig_header["alg"]], - key=key, - detached_payload=webhook_payload, - ) - - -def decode_jwt(jwt: str, jwks: PyJWKSet): - sig_header = get_unverified_header(jwt) - key = get_key_from_jwks(kid=get_kid(sig_header), jwks=jwks) - - return jwt_global_obj.decode( - jwt, - algorithms=[sig_header["alg"]], - key=key, - ) diff --git a/apps/monitoring/backend/monitoring/saleor/graphql.py b/apps/monitoring/backend/monitoring/saleor/graphql.py deleted file mode 100644 index 1eac42a..0000000 --- a/apps/monitoring/backend/monitoring/saleor/graphql.py +++ /dev/null @@ -1,62 +0,0 @@ -GET_APP_INFO = """ -query GetAppInfo { - app { - id - webhooks { - id - targetUrl - isActive - } - privateMetafields - } -} - -""" - -UPDATE_PRIVATE_METADATA = """ -mutation UpdatePrivateMetadata($appId: ID!, $metadata: [MetadataInput!]!) { - updatePrivateMetadata(id: $appId, input: $metadata) { - errors { - field - message - code - } - item { - privateMetafields - } - } -} - -""" - -DELETE_PRIVATE_METADATA = """ -mutation DeletePrivateMetadata($appId: ID!, $keys: [String!]!) { - deletePrivateMetadata(id: $appId, keys: $keys) { - errors { - field - message - code - } - item { - privateMetafields - } - } -} - -""" - -CREATE_WEBHOOK = """ -mutation WebhookCreate($input: WebhookCreateInput!) { - webhookCreate(input: $input) { - webhookErrors { - field - message - code - } - webhook { - id - } - } -} - -""" diff --git a/apps/monitoring/backend/monitoring/saleor/manager.py b/apps/monitoring/backend/monitoring/saleor/manager.py deleted file mode 100644 index e91020e..0000000 --- a/apps/monitoring/backend/monitoring/saleor/manager.py +++ /dev/null @@ -1,40 +0,0 @@ -from typing import Generic, Type, TypeVar - -from .client import AppInfo, SaleorClient -from .metadata import BaseMetadata - -T = TypeVar("T", bound=BaseMetadata) - - -class SaleorManager(Generic[T]): - def __init__( - self, - saleor_api_url: str, - app_id: str, - auth_token: str, - metadata_cls: Type[T], - user_agent="test", - ): - self.client = SaleorClient(saleor_api_url, user_agent, auth_token) - self.app_id = app_id - self.metadata_cls = metadata_cls - - async def get_app_info(self) -> AppInfo: - return await self.client.app_info() - - async def get_metadata(self) -> T: - app_info = await self.get_app_info() - return self.metadata_cls.parse_obj(app_info.private_metafields) - - async def save_private_metadata(self, metadata: T, include: set[str] | None = None): - exported = metadata.export(include) - await self.client.update_private_metadata(self.app_id, exported) - - async def delete_private_metadata(self, keys: str | set[str]): - await self.client.delete_private_metadata(self.app_id, {"datadog"}) - flatten_keys: set[str] = set() - if isinstance(keys, str): - keys = {keys} - for key in keys: - flatten_keys.update(self.metadata_cls.field_flatten(key)) - await self.client.delete_private_metadata(self.app_id, flatten_keys) diff --git a/apps/monitoring/backend/monitoring/saleor/metadata.py b/apps/monitoring/backend/monitoring/saleor/metadata.py deleted file mode 100644 index 5394712..0000000 --- a/apps/monitoring/backend/monitoring/saleor/metadata.py +++ /dev/null @@ -1,88 +0,0 @@ -import json -from typing import Any - -from fastapi.encoders import jsonable_encoder -from pydantic import BaseModel, root_validator, validator -from pydantic.fields import ModelField - - -class JsonFieldsModel(BaseModel): - @validator("*", pre=True) - def parse_field(cls, v): - if isinstance(v, str): - try: - return json.loads(v) - except json.JSONDecodeError: - pass - return v - - -class FlatMetadata(JsonFieldsModel): - pass - - -class BaseMetadata(JsonFieldsModel): - _flat_fields: dict[str, tuple[str, str]] = {} - - @classmethod - def field_flatten(cls, field: str | ModelField) -> set[str]: - flatten_set: set[str] = set() - if isinstance(field, str): - field = cls.__fields__[field] - if issubclass(field.type_, FlatMetadata): - for sub_field in field.type_.__fields__.values(): - flat_key = f"{field.name}_{sub_field.name}" - flatten_set.add(flat_key) - else: - flatten_set.add(field.name) - return flatten_set - - @classmethod - def _get_flat_fields_map(cls) -> dict[str, tuple[str, str]]: - flat_fields: dict[str, tuple[str, str]] = {} - for field in cls.__fields__.values(): - if issubclass(field.type_, FlatMetadata): - for sub_field in field.type_.__fields__.values(): - flat_key = f"{field.name}_{sub_field.name}" - flat_fields[flat_key] = field.name, sub_field.name - return flat_fields - - def __init_subclass__(cls, **kwargs): - super().__init_subclass__(**kwargs) - cls._flat_fields = cls._get_flat_fields_map() - for field_name in cls.__fields__.keys(): - if field_name in cls._flat_fields: - parent, subfield = cls._flat_fields[field_name] - raise ValueError( - f"{cls!r}: field {field_name} name conflict with flatten {parent}.{subfield}" - ) - - @staticmethod - def _encode_field(field, value): - if isinstance(value, FlatMetadata): - result = {} - for key, val in value.dict().items(): - result[f"{field.name}_{key}"] = jsonable_encoder(val) - return result - return {field.name: jsonable_encoder(value)} - - def export(self, include: set | None = None) -> dict[str, str]: - metadata: dict[str, Any] = {} - fields = set(self.__fields__.keys()) - if include is not None: - fields = fields & include - for field_name in fields: - field, value = self.__fields__[field_name], getattr(self, field_name) - metadata.update(self._encode_field(field, value)) - return {key: json.dumps(val) for key, val in metadata.items()} - - @root_validator(pre=True) - def unflatten(cls, values): - unflatten_values: dict[str, Any] = {} - for key, val in values.items(): - try: - parent_name, field_name = cls._flat_fields[key] - unflatten_values.setdefault(parent_name, {})[field_name] = val - except KeyError: - unflatten_values[key] = val - return unflatten_values diff --git a/apps/monitoring/backend/monitoring/saleor/tests/__init__.py b/apps/monitoring/backend/monitoring/saleor/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/monitoring/backend/monitoring/saleor/tests/test_metadata.py b/apps/monitoring/backend/monitoring/saleor/tests/test_metadata.py deleted file mode 100644 index cb5ed4a..0000000 --- a/apps/monitoring/backend/monitoring/saleor/tests/test_metadata.py +++ /dev/null @@ -1,81 +0,0 @@ -import pytest -from pydantic import BaseModel - -from ..metadata import BaseMetadata, FlatMetadata - - -class Foo(BaseModel): - a: str - b: float | None = None - - -class Bar(BaseModel): - a: int - b: Foo | None = None - c: list[Foo] = [] - - -class ExampleConfig(FlatMetadata): - login: str - password: str - more: Bar | None = None - - -class Metadata(BaseMetadata): - a: str | None = None - b: int | None = None - c: list[str] | None = None - d: str | None = None - e: Bar | None = None - f: ExampleConfig | None = None - g: list[Bar] = [] - - -@pytest.fixture -def metadata(): - return Metadata( - a="a", - b=3, - c=["a", "b", "c"], - e=Bar(a=0, b=Foo(a="a"), c=[Foo(a="a"), Foo(a="b")]), - f=ExampleConfig( - login="admin", - password="admin", - more=Bar( - a=1, - b=Foo( - a="a", - ), - ), - ), - g=[Bar(a=0), Bar(a=1, b=Foo(a="a"))], - ) - - -def test_to_metadata(metadata): - assert metadata.export() == { - "a": '"a"', - "b": "3", - "c": '["a", "b", "c"]', - "d": "null", - "e": '{"a": 0, "b": {"a": "a", "b": null}, "c": [{"a": "a", "b": null}, {"a": "b", "b": null}]}', - "f_login": '"admin"', - "f_password": '"admin"', - "f_more": '{"a": 1, "b": {"a": "a", "b": null}, "c": []}', - "g": '[{"a": 0, "b": null, "c": []}, {"a": 1, "b": {"a": "a", "b": null}, "c": []}]', - } - - -def test_metadata_export_reversible(metadata): - exported = metadata.export() - assert Metadata.parse_obj(exported) == metadata - - -def test_metadata_flatten_field(metadata): - assert metadata.field_flatten("a") == {"a"} - assert metadata.field_flatten("f") == {"f_login", "f_password", "f_more"} - assert metadata.field_flatten(metadata.__fields__["f"]) == { - "f_login", - "f_password", - "f_more", - } diff --git a/apps/monitoring/backend/monitoring/saleor/utils.py b/apps/monitoring/backend/monitoring/saleor/utils.py deleted file mode 100644 index f9b1f28..0000000 --- a/apps/monitoring/backend/monitoring/saleor/utils.py +++ /dev/null @@ -1,12 +0,0 @@ -from pydantic import BaseModel - - -def to_camel(snake_str: str) -> str: - components = snake_str.split("_") - return components[0] + "".join(x.capitalize() if x else "_" for x in components[1:]) - - -class JsonBaseModel(BaseModel): - class Config: - alias_generator = to_camel - allow_population_by_field_name = True diff --git a/apps/monitoring/backend/monitoring/schema.graphql b/apps/monitoring/backend/monitoring/schema.graphql deleted file mode 100644 index 04722c7..0000000 --- a/apps/monitoring/backend/monitoring/schema.graphql +++ /dev/null @@ -1,62 +0,0 @@ -interface Configuration { - active: Boolean! - error: String -} - -type ConfigurationError { - field: String - message: String! -} - -# Integration specific - -# Datadog -enum DatadogSite{ - US1 - US3 - US5 - EU1 - US1_FED -} - -type DataDogCredentials { - site: DatadogSite! - apiKeyLast4: String! -} - -type DatadogConfig implements Configuration { - active: Boolean! - error: String - credentials: DataDogCredentials! -} - -type Integrations { - datadog: DatadogConfig -} - -input DataDogCredentialsInput { - site: DatadogSite! - apiKey: String! - -} - -input DatadogConfigInput { - active: Boolean - credentials: DataDogCredentialsInput -} - -type DataDogConfigMutationResult { - errors: [ConfigurationError!]! - datadog: DatadogConfig -} - -# End integrations - -type Query { - integrations: Integrations! -} - -type Mutation { - updateDatadogConfig(input: DatadogConfigInput!): DataDogConfigMutationResult! - deleteDatadogConfig: DataDogConfigMutationResult! -} diff --git a/apps/monitoring/backend/monitoring/schema.py b/apps/monitoring/backend/monitoring/schema.py deleted file mode 100644 index 6079f98..0000000 --- a/apps/monitoring/backend/monitoring/schema.py +++ /dev/null @@ -1,12 +0,0 @@ -from .integrations.datadog import DatadogCredentials -from .saleor.metadata import BaseMetadata, FlatMetadata - - -class DatadogConfig(FlatMetadata): - active: bool = False - error: str | None = None - credentials: DatadogCredentials - - -class Metadata(BaseMetadata): - datadog: DatadogConfig | None = None diff --git a/apps/monitoring/backend/monitoring/settings.py b/apps/monitoring/backend/monitoring/settings.py deleted file mode 100644 index b6c4784..0000000 --- a/apps/monitoring/backend/monitoring/settings.py +++ /dev/null @@ -1,43 +0,0 @@ -from pathlib import Path - -from pydantic import BaseSettings - -from . import __version__ as app_version -from .saleor.common import LazyAbsoluteUrl, Manifest, SaleorPermissions - -base_dir = Path(__file__).resolve().parent - - -class AppSettings(BaseSettings): - debug: bool = True - apl_url: str = f"file://{base_dir/'.fileApl.json'}" - mock_datadog_client = False - allowed_domains: set[str] = {"*"} - forbidden_domains: set[str] = set() - - class Config: - env_file = ".env" - env_file_encoding = "utf-8" - - -settings = AppSettings() - - -manifest = Manifest( - id="saleor-app-monitoring", - name="Monitoring", - version=app_version, - about="Saleor Monitoring app", - data_privacy="", - app_url=LazyAbsoluteUrl("/"), - configuration_url=LazyAbsoluteUrl("/configuration"), - data_privacy_url="https://saleor.io/legal/privacy", # noqa - homepage_url="https://saleor.io/", # noqa - support_url="https://github.com/saleor", # noqa - token_target_url=LazyAbsoluteUrl("install"), - permissions=[SaleorPermissions.MANAGE_OBSERVABILITY], - extensions=[], - webhooks=[], - author="Saleor Commerce" - # TODO Add brand.logo.default -) diff --git a/apps/monitoring/backend/monitoring/tests/__init__.py b/apps/monitoring/backend/monitoring/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/monitoring/backend/monitoring/tests/conftest.py b/apps/monitoring/backend/monitoring/tests/conftest.py deleted file mode 100644 index 600660b..0000000 --- a/apps/monitoring/backend/monitoring/tests/conftest.py +++ /dev/null @@ -1,20 +0,0 @@ -import pytest -from httpx import AsyncClient - -from ..app import app - - -@pytest.fixture -def anyio_backend(): - return "asyncio", {"use_uvloop": True} - - -@pytest.fixture -def observability_app(): - return app - - -@pytest.fixture -async def client(observability_app): - async with AsyncClient(app=observability_app, base_url="http://test") as client: - yield client diff --git a/apps/monitoring/backend/monitoring/tests/test_app.py b/apps/monitoring/backend/monitoring/tests/test_app.py deleted file mode 100644 index e30d9f8..0000000 --- a/apps/monitoring/backend/monitoring/tests/test_app.py +++ /dev/null @@ -1,8 +0,0 @@ -import pytest - - -@pytest.mark.anyio -async def test_health(client): - response = await client.get("/health") - assert response.status_code == 200 - assert response.json() == {"status": "ok"} diff --git a/apps/monitoring/backend/monitoring/tests/test_utils.py b/apps/monitoring/backend/monitoring/tests/test_utils.py deleted file mode 100644 index 1265946..0000000 --- a/apps/monitoring/backend/monitoring/tests/test_utils.py +++ /dev/null @@ -1,28 +0,0 @@ -import pytest - -from ..utils import domain_validation - - -@pytest.mark.parametrize( - "domain,allowed,forbidden,is_allowed", - [ - ("localhost:8000", {"*"}, None, True), - ("wrong.com", {"example.com"}, None, False), - ("sub.example.com", {"example.com"}, None, False), - ("sub.example.com", {"*.example.com"}, None, True), - ("sub.sub.example.com", {"*.example.com"}, None, True), - ("example.com", {"*.example.com"}, None, False), - ("sub.example.com", {"*.sub.example.com"}, None, False), - ("sub.sub.example.com", {"*.sub.example.com"}, None, True), - ("example.com", {"python.org", "example.com"}, None, True), - ("any.com", {"python.org", "example.com", "*"}, None, True), - ("example.com", {"*.example.com"}, None, False), - ("sub.example.com", {"*"}, {"*.example.com"}, False), - ("sub.example.com", {"*.example.com"}, {"*.banned.com"}, True), - ("sub.example.com", {"*.example.com"}, {"x.example.com"}, True), - ("non-eu-sub.saleor.cloud", {"*.saleor.cloud"}, {"*.eu.saleor.cloud"}, True), - ("sub.eu.saleor.cloud", {"*.saleor.cloud"}, {"*.eu.saleor.cloud"}, False), - ], -) -def test_domain_validation(domain, allowed, forbidden, is_allowed): - assert domain_validation(domain, allowed, forbidden) is is_allowed diff --git a/apps/monitoring/backend/monitoring/utils.py b/apps/monitoring/backend/monitoring/utils.py deleted file mode 100644 index a7e1eab..0000000 --- a/apps/monitoring/backend/monitoring/utils.py +++ /dev/null @@ -1,48 +0,0 @@ -import fnmatch -import urllib.parse - -from fastapi import Request -from pydantic import BaseModel -from starlette.datastructures import URL - -HttpHeaders = list[tuple[str, str]] - - -def domain_validation( - domain_name: str, allowed: set[str], forbidden: set[str] | None = None -): - forbidden = set() if forbidden is None else forbidden - for origin in allowed: - if fnmatch.fnmatchcase(domain_name, origin): - for disallowed in forbidden: - if fnmatch.fnmatchcase(domain_name, disallowed): - return False - return True - return False - - -def to_camel(snake_str: str) -> str: - components = snake_str.split("_") - return components[0] + "".join(x.capitalize() if x else "_" for x in components[1:]) - - -class JsonBaseModel(BaseModel): - class Config: - alias_generator = to_camel - allow_population_by_field_name = True - - -def parse_headers(headers_list: HttpHeaders) -> dict[str, str]: - headers: dict[str, str] = {} - for key, val in headers_list: - headers[key] = val - return headers - - -def get_base_url(request: Request) -> URL: - base_url, headers = request.base_url, request.headers - scheme = headers.get("x-forwarded-proto", base_url.scheme).split(",")[0].strip() - if forwarded_host := headers.get("x-forwarded-host"): - parts = urllib.parse.urlsplit(f"//{forwarded_host}") - base_url = base_url.replace(hostname=parts.hostname, port=parts.port) - return base_url.replace(scheme=scheme) diff --git a/apps/monitoring/backend/poetry.lock b/apps/monitoring/backend/poetry.lock deleted file mode 100644 index c013f03..0000000 --- a/apps/monitoring/backend/poetry.lock +++ /dev/null @@ -1,1925 +0,0 @@ -# This file is automatically @generated by Poetry and should not be changed by hand. - -[[package]] -name = "aiohttp" -version = "3.8.4" -description = "Async http client/server framework (asyncio)" -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5ce45967538fb747370308d3145aa68a074bdecb4f3a300869590f725ced69c1"}, - {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b744c33b6f14ca26b7544e8d8aadff6b765a80ad6164fb1a430bbadd593dfb1a"}, - {file = "aiohttp-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a45865451439eb320784918617ba54b7a377e3501fb70402ab84d38c2cd891b"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86d42d7cba1cec432d47ab13b6637bee393a10f664c425ea7b305d1301ca1a3"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee3c36df21b5714d49fc4580247947aa64bcbe2939d1b77b4c8dcb8f6c9faecc"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:176a64b24c0935869d5bbc4c96e82f89f643bcdf08ec947701b9dbb3c956b7dd"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c844fd628851c0bc309f3c801b3a3d58ce430b2ce5b359cd918a5a76d0b20cb5"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5393fb786a9e23e4799fec788e7e735de18052f83682ce2dfcabaf1c00c2c08e"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e4b09863aae0dc965c3ef36500d891a3ff495a2ea9ae9171e4519963c12ceefd"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:adfbc22e87365a6e564c804c58fc44ff7727deea782d175c33602737b7feadb6"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:147ae376f14b55f4f3c2b118b95be50a369b89b38a971e80a17c3fd623f280c9"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:eafb3e874816ebe2a92f5e155f17260034c8c341dad1df25672fb710627c6949"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6cc15d58053c76eacac5fa9152d7d84b8d67b3fde92709195cb984cfb3475ea"}, - {file = "aiohttp-3.8.4-cp310-cp310-win32.whl", hash = "sha256:59f029a5f6e2d679296db7bee982bb3d20c088e52a2977e3175faf31d6fb75d1"}, - {file = "aiohttp-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:fe7ba4a51f33ab275515f66b0a236bcde4fb5561498fe8f898d4e549b2e4509f"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d8ef1a630519a26d6760bc695842579cb09e373c5f227a21b67dc3eb16cfea4"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b3f2e06a512e94722886c0827bee9807c86a9f698fac6b3aee841fab49bbfb4"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a80464982d41b1fbfe3154e440ba4904b71c1a53e9cd584098cd41efdb188ef"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b631e26df63e52f7cce0cce6507b7a7f1bc9b0c501fcde69742130b32e8782f"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f43255086fe25e36fd5ed8f2ee47477408a73ef00e804cb2b5cba4bf2ac7f5e"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d347a172f866cd1d93126d9b239fcbe682acb39b48ee0873c73c933dd23bd0f"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3fec6a4cb5551721cdd70473eb009d90935b4063acc5f40905d40ecfea23e05"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80a37fe8f7c1e6ce8f2d9c411676e4bc633a8462844e38f46156d07a7d401654"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d1e6a862b76f34395a985b3cd39a0d949ca80a70b6ebdea37d3ab39ceea6698a"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd468460eefef601ece4428d3cf4562459157c0f6523db89365202c31b6daebb"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:618c901dd3aad4ace71dfa0f5e82e88b46ef57e3239fc7027773cb6d4ed53531"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:652b1bff4f15f6287550b4670546a2947f2a4575b6c6dff7760eafb22eacbf0b"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80575ba9377c5171407a06d0196b2310b679dc752d02a1fcaa2bc20b235dbf24"}, - {file = "aiohttp-3.8.4-cp311-cp311-win32.whl", hash = "sha256:bbcf1a76cf6f6dacf2c7f4d2ebd411438c275faa1dc0c68e46eb84eebd05dd7d"}, - {file = "aiohttp-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:6e74dd54f7239fcffe07913ff8b964e28b712f09846e20de78676ce2a3dc0bfc"}, - {file = "aiohttp-3.8.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:880e15bb6dad90549b43f796b391cfffd7af373f4646784795e20d92606b7a51"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb96fa6b56bb536c42d6a4a87dfca570ff8e52de2d63cabebfd6fb67049c34b6"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a6cadebe132e90cefa77e45f2d2f1a4b2ce5c6b1bfc1656c1ddafcfe4ba8131"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f352b62b45dff37b55ddd7b9c0c8672c4dd2eb9c0f9c11d395075a84e2c40f75"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ab43061a0c81198d88f39aaf90dae9a7744620978f7ef3e3708339b8ed2ef01"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9cb1565a7ad52e096a6988e2ee0397f72fe056dadf75d17fa6b5aebaea05622"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:1b3ea7edd2d24538959c1c1abf97c744d879d4e541d38305f9bd7d9b10c9ec41"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:7c7837fe8037e96b6dd5cfcf47263c1620a9d332a87ec06a6ca4564e56bd0f36"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3b90467ebc3d9fa5b0f9b6489dfb2c304a1db7b9946fa92aa76a831b9d587e99"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:cab9401de3ea52b4b4c6971db5fb5c999bd4260898af972bf23de1c6b5dd9d71"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d1f9282c5f2b5e241034a009779e7b2a1aa045f667ff521e7948ea9b56e0c5ff"}, - {file = "aiohttp-3.8.4-cp36-cp36m-win32.whl", hash = "sha256:5e14f25765a578a0a634d5f0cd1e2c3f53964553a00347998dfdf96b8137f777"}, - {file = "aiohttp-3.8.4-cp36-cp36m-win_amd64.whl", hash = "sha256:4c745b109057e7e5f1848c689ee4fb3a016c8d4d92da52b312f8a509f83aa05e"}, - {file = "aiohttp-3.8.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:aede4df4eeb926c8fa70de46c340a1bc2c6079e1c40ccf7b0eae1313ffd33519"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ddaae3f3d32fc2cb4c53fab020b69a05c8ab1f02e0e59665c6f7a0d3a5be54f"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4eb3b82ca349cf6fadcdc7abcc8b3a50ab74a62e9113ab7a8ebc268aad35bb9"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bcb89336efa095ea21b30f9e686763f2be4478f1b0a616969551982c4ee4c3b"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c08e8ed6fa3d477e501ec9db169bfac8140e830aa372d77e4a43084d8dd91ab"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6cd05ea06daca6ad6a4ca3ba7fe7dc5b5de063ff4daec6170ec0f9979f6c332"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7a00a9ed8d6e725b55ef98b1b35c88013245f35f68b1b12c5cd4100dddac333"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:de04b491d0e5007ee1b63a309956eaed959a49f5bb4e84b26c8f5d49de140fa9"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:40653609b3bf50611356e6b6554e3a331f6879fa7116f3959b20e3528783e699"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dbf3a08a06b3f433013c143ebd72c15cac33d2914b8ea4bea7ac2c23578815d6"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854f422ac44af92bfe172d8e73229c270dc09b96535e8a548f99c84f82dde241"}, - {file = "aiohttp-3.8.4-cp37-cp37m-win32.whl", hash = "sha256:aeb29c84bb53a84b1a81c6c09d24cf33bb8432cc5c39979021cc0f98c1292a1a"}, - {file = "aiohttp-3.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:db3fc6120bce9f446d13b1b834ea5b15341ca9ff3f335e4a951a6ead31105480"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fabb87dd8850ef0f7fe2b366d44b77d7e6fa2ea87861ab3844da99291e81e60f"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91f6d540163f90bbaef9387e65f18f73ffd7c79f5225ac3d3f61df7b0d01ad15"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d265f09a75a79a788237d7f9054f929ced2e69eb0bb79de3798c468d8a90f945"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d89efa095ca7d442a6d0cbc755f9e08190ba40069b235c9886a8763b03785da"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4dac314662f4e2aa5009977b652d9b8db7121b46c38f2073bfeed9f4049732cd"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe11310ae1e4cd560035598c3f29d86cef39a83d244c7466f95c27ae04850f10"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ddb2a2026c3f6a68c3998a6c47ab6795e4127315d2e35a09997da21865757f8"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e75b89ac3bd27d2d043b234aa7b734c38ba1b0e43f07787130a0ecac1e12228a"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6e601588f2b502c93c30cd5a45bfc665faaf37bbe835b7cfd461753068232074"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a5d794d1ae64e7753e405ba58e08fcfa73e3fad93ef9b7e31112ef3c9a0efb52"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a1f4689c9a1462f3df0a1f7e797791cd6b124ddbee2b570d34e7f38ade0e2c71"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3032dcb1c35bc330134a5b8a5d4f68c1a87252dfc6e1262c65a7e30e62298275"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8189c56eb0ddbb95bfadb8f60ea1b22fcfa659396ea36f6adcc521213cd7b44d"}, - {file = "aiohttp-3.8.4-cp38-cp38-win32.whl", hash = "sha256:33587f26dcee66efb2fff3c177547bd0449ab7edf1b73a7f5dea1e38609a0c54"}, - {file = "aiohttp-3.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:e595432ac259af2d4630008bf638873d69346372d38255774c0e286951e8b79f"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5a7bdf9e57126dc345b683c3632e8ba317c31d2a41acd5800c10640387d193ed"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:22f6eab15b6db242499a16de87939a342f5a950ad0abaf1532038e2ce7d31567"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7235604476a76ef249bd64cb8274ed24ccf6995c4a8b51a237005ee7a57e8643"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea9eb976ffdd79d0e893869cfe179a8f60f152d42cb64622fca418cd9b18dc2a"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92c0cea74a2a81c4c76b62ea1cac163ecb20fb3ba3a75c909b9fa71b4ad493cf"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:493f5bc2f8307286b7799c6d899d388bbaa7dfa6c4caf4f97ef7521b9cb13719"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a63f03189a6fa7c900226e3ef5ba4d3bd047e18f445e69adbd65af433add5a2"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10c8cefcff98fd9168cdd86c4da8b84baaa90bf2da2269c6161984e6737bf23e"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bca5f24726e2919de94f047739d0a4fc01372801a3672708260546aa2601bf57"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:03baa76b730e4e15a45f81dfe29a8d910314143414e528737f8589ec60cf7391"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8c29c77cc57e40f84acef9bfb904373a4e89a4e8b74e71aa8075c021ec9078c2"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:03543dcf98a6619254b409be2d22b51f21ec66272be4ebda7b04e6412e4b2e14"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17b79c2963db82086229012cff93ea55196ed31f6493bb1ccd2c62f1724324e4"}, - {file = "aiohttp-3.8.4-cp39-cp39-win32.whl", hash = "sha256:34ce9f93a4a68d1272d26030655dd1b58ff727b3ed2a33d80ec433561b03d67a"}, - {file = "aiohttp-3.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:41a86a69bb63bb2fc3dc9ad5ea9f10f1c9c8e282b471931be0268ddd09430b04"}, - {file = "aiohttp-3.8.4.tar.gz", hash = "sha256:bf2e1a9162c1e441bf805a1fd166e249d574ca04e03b34f97e2928769e91ab5c"}, -] - -[package.dependencies] -aiosignal = ">=1.1.2" -async-timeout = ">=4.0.0a3,<5.0" -attrs = ">=17.3.0" -charset-normalizer = ">=2.0,<4.0" -frozenlist = ">=1.1.1" -multidict = ">=4.5,<7.0" -yarl = ">=1.0,<2.0" - -[package.extras] -speedups = ["Brotli", "aiodns", "cchardet"] - -[[package]] -name = "aiosignal" -version = "1.3.1" -description = "aiosignal: a list of registered asynchronous callbacks" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, - {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, -] - -[package.dependencies] -frozenlist = ">=1.1.0" - -[[package]] -name = "aiosonic" -version = "0.15.1" -description = "Async http client" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "aiosonic-0.15.1.tar.gz", hash = "sha256:4388c142100c96c38f943902c4f34721b3b05110c5d7aa3448eaf73ea55a2756"}, -] - -[package.dependencies] -chardet = "4.0.0" -h2 = "4.1.0" -hpack = "4.0.0" -hyperframe = "6.0.1" -onecache = "0.3.1" - -[package.extras] -test = ["aiodns (==3.0.0)", "aiohttp (==3.8.1)", "aiosignal (==1.2.0)", "anyio (==3.6.1)", "asgiref (==3.4.1)", "async-timeout (==4.0.2)", "attrs (==21.4.0)", "black (==22.6.0)", "certifi (==2022.6.15)", "cffi (==1.15.1)", "charset-normalizer (==2.1.0)", "click (==8.0.4)", "coverage[toml] (==6.4.1)", "coveralls (==3.3.1)", "django (==3.2.14)", "docopt (==0.6.2)", "filelock (==3.7.1)", "frozenlist (==1.3.0)", "h11 (==0.12.0)", "httpcore (==0.15.0)", "httpx (==0.23.0)", "idna (==3.3)", "iniconfig (==1.1.1)", "multidict (==6.0.2)", "mypy (==0.961)", "mypy-extensions (==0.4.3)", "packaging (==21.3)", "pathspec (==0.9.0)", "platformdirs (==2.5.2)", "pluggy (==1.0.0)", "proxy-py (==2.4.3)", "py (==1.11.0)", "pycares (==4.2.1)", "pycparser (==2.21)", "pyparsing (==3.0.9)", "pytest (==7.1.2)", "pytest-aiohttp (==1.0.4)", "pytest-asyncio (==0.18.3)", "pytest-black (==0.3.12)", "pytest-cov (==3.0.0)", "pytest-django (==4.5.2)", "pytest-mock (==3.8.2)", "pytest-mypy (==0.9.1)", "pytest-sugar (==0.9.4)", "pytest-timeout (==2.1.0)", "pytz (==2022.1)", "requests (==2.28.1)", "rfc3986[idna2008] (==1.5.0)", "sniffio (==1.2.0)", "sqlparse (==0.4.2)", "termcolor (==1.1.0)", "toml (==0.10.2)", "tomli (==2.0.1)", "typing-extensions (==4.3.0)", "urllib3 (==1.26.9)", "uvicorn (==0.18.2)", "yarl (==1.7.2)"] - -[[package]] -name = "anyio" -version = "3.6.2" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -category = "main" -optional = false -python-versions = ">=3.6.2" -files = [ - {file = "anyio-3.6.2-py3-none-any.whl", hash = "sha256:fbbe32bd270d2a2ef3ed1c5d45041250284e31fc0a4df4a5a6071842051a51e3"}, - {file = "anyio-3.6.2.tar.gz", hash = "sha256:25ea0d673ae30af41a0c442f81cf3b38c7e79fdc7b60335a4c14e05eb0947421"}, -] - -[package.dependencies] -idna = ">=2.8" -sniffio = ">=1.1" - -[package.extras] -doc = ["packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["contextlib2", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (<0.15)", "uvloop (>=0.15)"] -trio = ["trio (>=0.16,<0.22)"] - -[[package]] -name = "ariadne" -version = "0.17.1" -description = "Ariadne is a Python library for implementing GraphQL servers." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "ariadne-0.17.1-py3-none-any.whl", hash = "sha256:62e50d28e40ebf6d99c690e261798d28b6bee21ad14154e409d0c0fc941ab83d"}, - {file = "ariadne-0.17.1.tar.gz", hash = "sha256:07df3097f36434ecaaf7d00ab1541e9bd4d9d2678e9ef83b21d588100236bf2f"}, -] - -[package.dependencies] -graphql-core = ">=3.2.0,<3.3" -starlette = "<1.0" -typing-extensions = ">=3.6.0" - -[package.extras] -asgi-file-uploads = ["python-multipart (>=0.0.5)"] -file-uploads = ["python-multipart (>=0.0.5)"] - -[[package]] -name = "async-timeout" -version = "4.0.2" -description = "Timeout context manager for asyncio programs" -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, -] - -[[package]] -name = "attrs" -version = "22.2.0" -description = "Classes Without Boilerplate" -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, - {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, -] - -[package.extras] -cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] -tests = ["attrs[tests-no-zope]", "zope.interface"] -tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] - -[[package]] -name = "black" -version = "22.12.0" -description = "The uncompromising code formatter." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, - {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, - {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, - {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, - {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, - {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, - {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, - {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, - {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, - {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, - {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, - {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, -] - -[package.dependencies] -aiohttp = {version = ">=3.7.4", optional = true, markers = "extra == \"d\""} -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -pathspec = ">=0.9.0" -platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} - -[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 = "certifi" -version = "2022.12.7" -description = "Python package for providing Mozilla's CA Bundle." -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, - {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, -] - -[[package]] -name = "cffi" -version = "1.15.1" -description = "Foreign Function Interface for Python calling C code." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, -] - -[package.dependencies] -pycparser = "*" - -[[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" -files = [ - {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, - {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, -] - -[[package]] -name = "chardet" -version = "4.0.0" -description = "Universal encoding detector for Python 2 and 3" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, - {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, -] - -[[package]] -name = "charset-normalizer" -version = "3.0.1" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "charset-normalizer-3.0.1.tar.gz", hash = "sha256:ebea339af930f8ca5d7a699b921106c6e29c617fe9606fa7baa043c1cdae326f"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88600c72ef7587fe1708fd242b385b6ed4b8904976d5da0893e31df8b3480cb6"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c75ffc45f25324e68ab238cb4b5c0a38cd1c3d7f1fb1f72b5541de469e2247db"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db72b07027db150f468fbada4d85b3b2729a3db39178abf5c543b784c1254539"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62595ab75873d50d57323a91dd03e6966eb79c41fa834b7a1661ed043b2d404d"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff6f3db31555657f3163b15a6b7c6938d08df7adbfc9dd13d9d19edad678f1e8"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:772b87914ff1152b92a197ef4ea40efe27a378606c39446ded52c8f80f79702e"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70990b9c51340e4044cfc394a81f614f3f90d41397104d226f21e66de668730d"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:292d5e8ba896bbfd6334b096e34bffb56161c81408d6d036a7dfa6929cff8783"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2edb64ee7bf1ed524a1da60cdcd2e1f6e2b4f66ef7c077680739f1641f62f555"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:31a9ddf4718d10ae04d9b18801bd776693487cbb57d74cc3458a7673f6f34639"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:44ba614de5361b3e5278e1241fda3dc1838deed864b50a10d7ce92983797fa76"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:12db3b2c533c23ab812c2b25934f60383361f8a376ae272665f8e48b88e8e1c6"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c512accbd6ff0270939b9ac214b84fb5ada5f0409c44298361b2f5e13f9aed9e"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-win32.whl", hash = "sha256:502218f52498a36d6bf5ea77081844017bf7982cdbe521ad85e64cabee1b608b"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:601f36512f9e28f029d9481bdaf8e89e5148ac5d89cffd3b05cd533eeb423b59"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0298eafff88c99982a4cf66ba2efa1128e4ddaca0b05eec4c456bbc7db691d8d"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8d0fc946c784ff7f7c3742310cc8a57c5c6dc31631269876a88b809dbeff3d3"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:87701167f2a5c930b403e9756fab1d31d4d4da52856143b609e30a1ce7160f3c"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e76c0f23218b8f46c4d87018ca2e441535aed3632ca134b10239dfb6dadd6b"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c0a590235ccd933d9892c627dec5bc7511ce6ad6c1011fdf5b11363022746c1"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c7fe7afa480e3e82eed58e0ca89f751cd14d767638e2550c77a92a9e749c317"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79909e27e8e4fcc9db4addea88aa63f6423ebb171db091fb4373e3312cb6d603"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ac7b6a045b814cf0c47f3623d21ebd88b3e8cf216a14790b455ea7ff0135d18"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:72966d1b297c741541ca8cf1223ff262a6febe52481af742036a0b296e35fa5a"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f9d0c5c045a3ca9bedfc35dca8526798eb91a07aa7a2c0fee134c6c6f321cbd7"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5995f0164fa7df59db4746112fec3f49c461dd6b31b841873443bdb077c13cfc"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4a8fcf28c05c1f6d7e177a9a46a1c52798bfe2ad80681d275b10dcf317deaf0b"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:761e8904c07ad053d285670f36dd94e1b6ab7f16ce62b9805c475b7aa1cffde6"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-win32.whl", hash = "sha256:71140351489970dfe5e60fc621ada3e0f41104a5eddaca47a7acb3c1b851d6d3"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:9ab77acb98eba3fd2a85cd160851816bfce6871d944d885febf012713f06659c"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:84c3990934bae40ea69a82034912ffe5a62c60bbf6ec5bc9691419641d7d5c9a"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74292fc76c905c0ef095fe11e188a32ebd03bc38f3f3e9bcb85e4e6db177b7ea"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c95a03c79bbe30eec3ec2b7f076074f4281526724c8685a42872974ef4d36b72"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c39b0e3eac288fedc2b43055cfc2ca7a60362d0e5e87a637beac5d801ef478"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df2c707231459e8a4028eabcd3cfc827befd635b3ef72eada84ab13b52e1574d"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93ad6d87ac18e2a90b0fe89df7c65263b9a99a0eb98f0a3d2e079f12a0735837"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:59e5686dd847347e55dffcc191a96622f016bc0ad89105e24c14e0d6305acbc6"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:cd6056167405314a4dc3c173943f11249fa0f1b204f8b51ed4bde1a9cd1834dc"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:083c8d17153ecb403e5e1eb76a7ef4babfc2c48d58899c98fcaa04833e7a2f9a"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:f5057856d21e7586765171eac8b9fc3f7d44ef39425f85dbcccb13b3ebea806c"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:7eb33a30d75562222b64f569c642ff3dc6689e09adda43a082208397f016c39a"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-win32.whl", hash = "sha256:95dea361dd73757c6f1c0a1480ac499952c16ac83f7f5f4f84f0658a01b8ef41"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:eaa379fcd227ca235d04152ca6704c7cb55564116f8bc52545ff357628e10602"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3e45867f1f2ab0711d60c6c71746ac53537f1684baa699f4f668d4c6f6ce8e14"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cadaeaba78750d58d3cc6ac4d1fd867da6fc73c88156b7a3212a3cd4819d679d"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:911d8a40b2bef5b8bbae2e36a0b103f142ac53557ab421dc16ac4aafee6f53dc"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:503e65837c71b875ecdd733877d852adbc465bd82c768a067badd953bf1bc5a3"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a60332922359f920193b1d4826953c507a877b523b2395ad7bc716ddd386d866"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16a8663d6e281208d78806dbe14ee9903715361cf81f6d4309944e4d1e59ac5b"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a16418ecf1329f71df119e8a65f3aa68004a3f9383821edcb20f0702934d8087"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9d9153257a3f70d5f69edf2325357251ed20f772b12e593f3b3377b5f78e7ef8"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:02a51034802cbf38db3f89c66fb5d2ec57e6fe7ef2f4a44d070a593c3688667b"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:2e396d70bc4ef5325b72b593a72c8979999aa52fb8bcf03f701c1b03e1166918"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:11b53acf2411c3b09e6af37e4b9005cba376c872503c8f28218c7243582df45d"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-win32.whl", hash = "sha256:0bf2dae5291758b6f84cf923bfaa285632816007db0330002fa1de38bfcb7154"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:2c03cc56021a4bd59be889c2b9257dae13bf55041a3372d3295416f86b295fb5"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:024e606be3ed92216e2b6952ed859d86b4cfa52cd5bc5f050e7dc28f9b43ec42"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4b0d02d7102dd0f997580b51edc4cebcf2ab6397a7edf89f1c73b586c614272c"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:358a7c4cb8ba9b46c453b1dd8d9e431452d5249072e4f56cfda3149f6ab1405e"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81d6741ab457d14fdedc215516665050f3822d3e56508921cc7239f8c8e66a58"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8b8af03d2e37866d023ad0ddea594edefc31e827fee64f8de5611a1dbc373174"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9cf4e8ad252f7c38dd1f676b46514f92dc0ebeb0db5552f5f403509705e24753"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e696f0dd336161fca9adbb846875d40752e6eba585843c768935ba5c9960722b"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c22d3fe05ce11d3671297dc8973267daa0f938b93ec716e12e0f6dee81591dc1"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:109487860ef6a328f3eec66f2bf78b0b72400280d8f8ea05f69c51644ba6521a"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:37f8febc8ec50c14f3ec9637505f28e58d4f66752207ea177c1d67df25da5aed"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:f97e83fa6c25693c7a35de154681fcc257c1c41b38beb0304b9c4d2d9e164479"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a152f5f33d64a6be73f1d30c9cc82dfc73cec6477ec268e7c6e4c7d23c2d2291"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:39049da0ffb96c8cbb65cbf5c5f3ca3168990adf3551bd1dee10c48fce8ae820"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-win32.whl", hash = "sha256:4457ea6774b5611f4bed5eaa5df55f70abde42364d498c5134b7ef4c6958e20e"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:e62164b50f84e20601c1ff8eb55620d2ad25fb81b59e3cd776a1902527a788af"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8eade758719add78ec36dc13201483f8e9b5d940329285edcd5f70c0a9edbd7f"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8499ca8f4502af841f68135133d8258f7b32a53a1d594aa98cc52013fff55678"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3fc1c4a2ffd64890aebdb3f97e1278b0cc72579a08ca4de8cd2c04799a3a22be"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00d3ffdaafe92a5dc603cb9bd5111aaa36dfa187c8285c543be562e61b755f6b"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2ac1b08635a8cd4e0cbeaf6f5e922085908d48eb05d44c5ae9eabab148512ca"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6f45710b4459401609ebebdbcfb34515da4fc2aa886f95107f556ac69a9147e"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ae1de54a77dc0d6d5fcf623290af4266412a7c4be0b1ff7444394f03f5c54e3"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b590df687e3c5ee0deef9fc8c547d81986d9a1b56073d82de008744452d6541"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab5de034a886f616a5668aa5d098af2b5385ed70142090e2a31bcbd0af0fdb3d"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9cb3032517f1627cc012dbc80a8ec976ae76d93ea2b5feaa9d2a5b8882597579"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:608862a7bf6957f2333fc54ab4399e405baad0163dc9f8d99cb236816db169d4"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0f438ae3532723fb6ead77e7c604be7c8374094ef4ee2c5e03a3a17f1fca256c"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:356541bf4381fa35856dafa6a965916e54bed415ad8a24ee6de6e37deccf2786"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-win32.whl", hash = "sha256:39cf9ed17fe3b1bc81f33c9ceb6ce67683ee7526e65fde1447c772afc54a1bb8"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:0a11e971ed097d24c534c037d298ad32c6ce81a45736d31e0ff0ad37ab437d59"}, - {file = "charset_normalizer-3.0.1-py3-none-any.whl", hash = "sha256:7e189e2e1d3ed2f4aebabd2d5b0f931e883676e51c7624826e0a4e5fe8a0bf24"}, -] - -[[package]] -name = "click" -version = "8.1.3" -description = "Composable command line interface toolkit" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "cryptography" -version = "41.0.0" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "cryptography-41.0.0-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:3c5ef25d060c80d6d9f7f9892e1d41bb1c79b78ce74805b8cb4aa373cb7d5ec8"}, - {file = "cryptography-41.0.0-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:8362565b3835ceacf4dc8f3b56471a2289cf51ac80946f9087e66dc283a810e0"}, - {file = "cryptography-41.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3680248309d340fda9611498a5319b0193a8dbdb73586a1acf8109d06f25b92d"}, - {file = "cryptography-41.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84a165379cb9d411d58ed739e4af3396e544eac190805a54ba2e0322feb55c46"}, - {file = "cryptography-41.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:4ab14d567f7bbe7f1cdff1c53d5324ed4d3fc8bd17c481b395db224fb405c237"}, - {file = "cryptography-41.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9f65e842cb02550fac96536edb1d17f24c0a338fd84eaf582be25926e993dde4"}, - {file = "cryptography-41.0.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:b7f2f5c525a642cecad24ee8670443ba27ac1fab81bba4cc24c7b6b41f2d0c75"}, - {file = "cryptography-41.0.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:7d92f0248d38faa411d17f4107fc0bce0c42cae0b0ba5415505df72d751bf62d"}, - {file = "cryptography-41.0.0-cp37-abi3-win32.whl", hash = "sha256:34d405ea69a8b34566ba3dfb0521379b210ea5d560fafedf9f800a9a94a41928"}, - {file = "cryptography-41.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:344c6de9f8bda3c425b3a41b319522ba3208551b70c2ae00099c205f0d9fd3be"}, - {file = "cryptography-41.0.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:88ff107f211ea696455ea8d911389f6d2b276aabf3231bf72c8853d22db755c5"}, - {file = "cryptography-41.0.0-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:b846d59a8d5a9ba87e2c3d757ca019fa576793e8758174d3868aecb88d6fc8eb"}, - {file = "cryptography-41.0.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f5d0bf9b252f30a31664b6f64432b4730bb7038339bd18b1fafe129cfc2be9be"}, - {file = "cryptography-41.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5c1f7293c31ebc72163a9a0df246f890d65f66b4a40d9ec80081969ba8c78cc9"}, - {file = "cryptography-41.0.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bf8fc66012ca857d62f6a347007e166ed59c0bc150cefa49f28376ebe7d992a2"}, - {file = "cryptography-41.0.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a4fc68d1c5b951cfb72dfd54702afdbbf0fb7acdc9b7dc4301bbf2225a27714d"}, - {file = "cryptography-41.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:14754bcdae909d66ff24b7b5f166d69340ccc6cb15731670435efd5719294895"}, - {file = "cryptography-41.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0ddaee209d1cf1f180f1efa338a68c4621154de0afaef92b89486f5f96047c55"}, - {file = "cryptography-41.0.0.tar.gz", hash = "sha256:6b71f64beeea341c9b4f963b48ee3b62d62d57ba93eb120e1196b31dc1025e78"}, -] - -[package.dependencies] -cffi = ">=1.12" - -[package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] -docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] -nox = ["nox"] -pep8test = ["black", "check-sdist", "mypy", "ruff"] -sdist = ["build"] -ssh = ["bcrypt (>=3.1.5)"] -test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] -test-randomorder = ["pytest-randomly"] - -[[package]] -name = "datadog-api-client" -version = "2.10.0" -description = "Collection of all Datadog Public endpoints" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "datadog-api-client-2.10.0.tar.gz", hash = "sha256:ed567545491e2671420f136a6c2d5952c9a9e43973702d6386f6b89c11476207"}, - {file = "datadog_api_client-2.10.0-py3-none-any.whl", hash = "sha256:b7880e310a18012b98958c1f0c40fca12f9127ad18abecad686afcd44adf29f0"}, -] - -[package.dependencies] -aiosonic = {version = "*", optional = true, markers = "extra == \"async\""} -certifi = "*" -python-dateutil = "*" -typing-extensions = "*" -urllib3 = ">=1.15" - -[package.extras] -apm = ["ddtrace (>=1.2.0)"] -async = ["aiosonic"] -tests = ["aiosonic", "glom", "jinja2", "mypy", "pytest", "pytest-asyncio", "pytest-bdd (==6.0.1)", "pytest-randomly", "pytest-recording", "python-dateutil", "types-python-dateutil", "zstandard"] -zstandard = ["zstandard"] - -[[package]] -name = "distlib" -version = "0.3.6" -description = "Distribution utilities" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, - {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, -] - -[[package]] -name = "exceptiongroup" -version = "1.1.0" -description = "Backport of PEP 654 (exception groups)" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.1.0-py3-none-any.whl", hash = "sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e"}, - {file = "exceptiongroup-1.1.0.tar.gz", hash = "sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23"}, -] - -[package.extras] -test = ["pytest (>=6)"] - -[[package]] -name = "fastapi" -version = "0.92.0" -description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "fastapi-0.92.0-py3-none-any.whl", hash = "sha256:ae7b97c778e2f2ec3fb3cb4fb14162129411d99907fb71920f6d69a524340ebf"}, - {file = "fastapi-0.92.0.tar.gz", hash = "sha256:023a0f5bd2c8b2609014d3bba1e14a1d7df96c6abea0a73070621c9862b9a4de"}, -] - -[package.dependencies] -pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" -starlette = ">=0.25.0,<0.26.0" - -[package.extras] -all = ["email-validator (>=1.1.1)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] -dev = ["pre-commit (>=2.17.0,<3.0.0)", "ruff (==0.0.138)", "uvicorn[standard] (>=0.12.0,<0.21.0)"] -doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pyyaml (>=5.3.1,<7.0.0)", "typer[all] (>=0.6.1,<0.8.0)"] -test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==22.10.0)", "coverage[toml] (>=6.5.0,<8.0)", "databases[sqlite] (>=0.3.2,<0.7.0)", "email-validator (>=1.1.1,<2.0.0)", "flask (>=1.1.2,<3.0.0)", "httpx (>=0.23.0,<0.24.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.982)", "orjson (>=3.2.1,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "peewee (>=3.13.3,<4.0.0)", "pytest (>=7.1.3,<8.0.0)", "python-jose[cryptography] (>=3.3.0,<4.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "pyyaml (>=5.3.1,<7.0.0)", "ruff (==0.0.138)", "sqlalchemy (>=1.3.18,<1.4.43)", "types-orjson (==3.6.2)", "types-ujson (==5.6.0.0)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)"] - -[[package]] -name = "filelock" -version = "3.9.0" -description = "A platform independent file lock." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "filelock-3.9.0-py3-none-any.whl", hash = "sha256:f58d535af89bb9ad5cd4df046f741f8553a418c01a7856bf0d173bbc9f6bd16d"}, - {file = "filelock-3.9.0.tar.gz", hash = "sha256:7b319f24340b51f55a2bf7a12ac0755a9b03e718311dac567a0f4f7fabd2f5de"}, -] - -[package.extras] -docs = ["furo (>=2022.12.7)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.5)"] -testing = ["covdefaults (>=2.2.2)", "coverage (>=7.0.1)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-timeout (>=2.1)"] - -[[package]] -name = "frozenlist" -version = "1.3.3" -description = "A list-like structure which implements collections.abc.MutableSequence" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff8bf625fe85e119553b5383ba0fb6aa3d0ec2ae980295aaefa552374926b3f4"}, - {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dfbac4c2dfcc082fcf8d942d1e49b6aa0766c19d3358bd86e2000bf0fa4a9cf0"}, - {file = "frozenlist-1.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1c63e8d377d039ac769cd0926558bb7068a1f7abb0f003e3717ee003ad85530"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fdfc24dcfce5b48109867c13b4cb15e4660e7bd7661741a391f821f23dfdca7"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c926450857408e42f0bbc295e84395722ce74bae69a3b2aa2a65fe22cb14b99"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1841e200fdafc3d51f974d9d377c079a0694a8f06de2e67b48150328d66d5483"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f470c92737afa7d4c3aacc001e335062d582053d4dbe73cda126f2d7031068dd"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:783263a4eaad7c49983fe4b2e7b53fa9770c136c270d2d4bbb6d2192bf4d9caf"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:924620eef691990dfb56dc4709f280f40baee568c794b5c1885800c3ecc69816"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae4dc05c465a08a866b7a1baf360747078b362e6a6dbeb0c57f234db0ef88ae0"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bed331fe18f58d844d39ceb398b77d6ac0b010d571cba8267c2e7165806b00ce"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:02c9ac843e3390826a265e331105efeab489ffaf4dd86384595ee8ce6d35ae7f"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9545a33965d0d377b0bc823dcabf26980e77f1b6a7caa368a365a9497fb09420"}, - {file = "frozenlist-1.3.3-cp310-cp310-win32.whl", hash = "sha256:d5cd3ab21acbdb414bb6c31958d7b06b85eeb40f66463c264a9b343a4e238642"}, - {file = "frozenlist-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:b756072364347cb6aa5b60f9bc18e94b2f79632de3b0190253ad770c5df17db1"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b4395e2f8d83fbe0c627b2b696acce67868793d7d9750e90e39592b3626691b7"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14143ae966a6229350021384870458e4777d1eae4c28d1a7aa47f24d030e6678"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d8860749e813a6f65bad8285a0520607c9500caa23fea6ee407e63debcdbef6"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23d16d9f477bb55b6154654e0e74557040575d9d19fe78a161bd33d7d76808e8"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb82dbba47a8318e75f679690190c10a5e1f447fbf9df41cbc4c3afd726d88cb"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9309869032abb23d196cb4e4db574232abe8b8be1339026f489eeb34a4acfd91"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a97b4fe50b5890d36300820abd305694cb865ddb7885049587a5678215782a6b"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c188512b43542b1e91cadc3c6c915a82a5eb95929134faf7fd109f14f9892ce4"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:303e04d422e9b911a09ad499b0368dc551e8c3cd15293c99160c7f1f07b59a48"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0771aed7f596c7d73444c847a1c16288937ef988dc04fb9f7be4b2aa91db609d"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:66080ec69883597e4d026f2f71a231a1ee9887835902dbe6b6467d5a89216cf6"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:41fe21dc74ad3a779c3d73a2786bdf622ea81234bdd4faf90b8b03cad0c2c0b4"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f20380df709d91525e4bee04746ba612a4df0972c1b8f8e1e8af997e678c7b81"}, - {file = "frozenlist-1.3.3-cp311-cp311-win32.whl", hash = "sha256:f30f1928162e189091cf4d9da2eac617bfe78ef907a761614ff577ef4edfb3c8"}, - {file = "frozenlist-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a6394d7dadd3cfe3f4b3b186e54d5d8504d44f2d58dcc89d693698e8b7132b32"}, - {file = "frozenlist-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8df3de3a9ab8325f94f646609a66cbeeede263910c5c0de0101079ad541af332"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0693c609e9742c66ba4870bcee1ad5ff35462d5ffec18710b4ac89337ff16e27"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd4210baef299717db0a600d7a3cac81d46ef0e007f88c9335db79f8979c0d3d"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:394c9c242113bfb4b9aa36e2b80a05ffa163a30691c7b5a29eba82e937895d5e"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6327eb8e419f7d9c38f333cde41b9ae348bec26d840927332f17e887a8dcb70d"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e24900aa13212e75e5b366cb9065e78bbf3893d4baab6052d1aca10d46d944c"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3843f84a6c465a36559161e6c59dce2f2ac10943040c2fd021cfb70d58c4ad56"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:84610c1502b2461255b4c9b7d5e9c48052601a8957cd0aea6ec7a7a1e1fb9420"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c21b9aa40e08e4f63a2f92ff3748e6b6c84d717d033c7b3438dd3123ee18f70e"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:efce6ae830831ab6a22b9b4091d411698145cb9b8fc869e1397ccf4b4b6455cb"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:40de71985e9042ca00b7953c4f41eabc3dc514a2d1ff534027f091bc74416401"}, - {file = "frozenlist-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:180c00c66bde6146a860cbb81b54ee0df350d2daf13ca85b275123bbf85de18a"}, - {file = "frozenlist-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9bbbcedd75acdfecf2159663b87f1bb5cfc80e7cd99f7ddd9d66eb98b14a8411"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:034a5c08d36649591be1cbb10e09da9f531034acfe29275fc5454a3b101ce41a"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba64dc2b3b7b158c6660d49cdb1d872d1d0bf4e42043ad8d5006099479a194e5"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:47df36a9fe24054b950bbc2db630d508cca3aa27ed0566c0baf661225e52c18e"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:008a054b75d77c995ea26629ab3a0c0d7281341f2fa7e1e85fa6153ae29ae99c"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:841ea19b43d438a80b4de62ac6ab21cfe6827bb8a9dc62b896acc88eaf9cecba"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e235688f42b36be2b6b06fc37ac2126a73b75fb8d6bc66dd632aa35286238703"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca713d4af15bae6e5d79b15c10c8522859a9a89d3b361a50b817c98c2fb402a2"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ac5995f2b408017b0be26d4a1d7c61bce106ff3d9e3324374d66b5964325448"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4ae8135b11652b08a8baf07631d3ebfe65a4c87909dbef5fa0cdde440444ee4"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ea42116ceb6bb16dbb7d526e242cb6747b08b7710d9782aa3d6732bd8d27649"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:810860bb4bdce7557bc0febb84bbd88198b9dbc2022d8eebe5b3590b2ad6c842"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ee78feb9d293c323b59a6f2dd441b63339a30edf35abcb51187d2fc26e696d13"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0af2e7c87d35b38732e810befb9d797a99279cbb85374d42ea61c1e9d23094b3"}, - {file = "frozenlist-1.3.3-cp38-cp38-win32.whl", hash = "sha256:899c5e1928eec13fd6f6d8dc51be23f0d09c5281e40d9cf4273d188d9feeaf9b"}, - {file = "frozenlist-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:7f44e24fa70f6fbc74aeec3e971f60a14dde85da364aa87f15d1be94ae75aeef"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2b07ae0c1edaa0a36339ec6cce700f51b14a3fc6545fdd32930d2c83917332cf"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ebb86518203e12e96af765ee89034a1dbb0c3c65052d1b0c19bbbd6af8a145e1"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5cf820485f1b4c91e0417ea0afd41ce5cf5965011b3c22c400f6d144296ccbc0"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c11e43016b9024240212d2a65043b70ed8dfd3b52678a1271972702d990ac6d"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8fa3c6e3305aa1146b59a09b32b2e04074945ffcfb2f0931836d103a2c38f936"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:352bd4c8c72d508778cf05ab491f6ef36149f4d0cb3c56b1b4302852255d05d5"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65a5e4d3aa679610ac6e3569e865425b23b372277f89b5ef06cf2cdaf1ebf22b"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e2c1185858d7e10ff045c496bbf90ae752c28b365fef2c09cf0fa309291669"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f163d2fd041c630fed01bc48d28c3ed4a3b003c00acd396900e11ee5316b56bb"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05cdb16d09a0832eedf770cb7bd1fe57d8cf4eaf5aced29c4e41e3f20b30a784"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8bae29d60768bfa8fb92244b74502b18fae55a80eac13c88eb0b496d4268fd2d"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eedab4c310c0299961ac285591acd53dc6723a1ebd90a57207c71f6e0c2153ab"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3bbdf44855ed8f0fbcd102ef05ec3012d6a4fd7c7562403f76ce6a52aeffb2b1"}, - {file = "frozenlist-1.3.3-cp39-cp39-win32.whl", hash = "sha256:efa568b885bca461f7c7b9e032655c0c143d305bf01c30caf6db2854a4532b38"}, - {file = "frozenlist-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfe33efc9cb900a4c46f91a5ceba26d6df370ffddd9ca386eb1d4f0ad97b9ea9"}, - {file = "frozenlist-1.3.3.tar.gz", hash = "sha256:58bcc55721e8a90b88332d6cd441261ebb22342e238296bb330968952fbb3a6a"}, -] - -[[package]] -name = "graphql-core" -version = "3.2.3" -description = "GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL." -category = "main" -optional = false -python-versions = ">=3.6,<4" -files = [ - {file = "graphql-core-3.2.3.tar.gz", hash = "sha256:06d2aad0ac723e35b1cb47885d3e5c45e956a53bc1b209a9fc5369007fe46676"}, - {file = "graphql_core-3.2.3-py3-none-any.whl", hash = "sha256:5766780452bd5ec8ba133f8bf287dc92713e3868ddd83aee4faab9fc3e303dc3"}, -] - -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - -[[package]] -name = "h2" -version = "4.1.0" -description = "HTTP/2 State-Machine based protocol implementation" -category = "main" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "h2-4.1.0-py3-none-any.whl", hash = "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d"}, - {file = "h2-4.1.0.tar.gz", hash = "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb"}, -] - -[package.dependencies] -hpack = ">=4.0,<5" -hyperframe = ">=6.0,<7" - -[[package]] -name = "hpack" -version = "4.0.0" -description = "Pure-Python HPACK header compression" -category = "main" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c"}, - {file = "hpack-4.0.0.tar.gz", hash = "sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095"}, -] - -[[package]] -name = "httpcore" -version = "0.16.3" -description = "A minimal low-level HTTP client." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "httpcore-0.16.3-py3-none-any.whl", hash = "sha256:da1fb708784a938aa084bde4feb8317056c55037247c787bd7e19eb2c2949dc0"}, - {file = "httpcore-0.16.3.tar.gz", hash = "sha256:c5d6f04e2fc530f39e0c077e6a30caa53f1451096120f1f38b954afd0b17c0cb"}, -] - -[package.dependencies] -anyio = ">=3.0,<5.0" -certifi = "*" -h11 = ">=0.13,<0.15" -sniffio = ">=1.0.0,<2.0.0" - -[package.extras] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] - -[[package]] -name = "httptools" -version = "0.5.0" -description = "A collection of framework independent HTTP protocol utils." -category = "main" -optional = false -python-versions = ">=3.5.0" -files = [ - {file = "httptools-0.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8f470c79061599a126d74385623ff4744c4e0f4a0997a353a44923c0b561ee51"}, - {file = "httptools-0.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e90491a4d77d0cb82e0e7a9cb35d86284c677402e4ce7ba6b448ccc7325c5421"}, - {file = "httptools-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1d2357f791b12d86faced7b5736dea9ef4f5ecdc6c3f253e445ee82da579449"}, - {file = "httptools-0.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f90cd6fd97c9a1b7fe9215e60c3bd97336742a0857f00a4cb31547bc22560c2"}, - {file = "httptools-0.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5230a99e724a1bdbbf236a1b58d6e8504b912b0552721c7c6b8570925ee0ccde"}, - {file = "httptools-0.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3a47a34f6015dd52c9eb629c0f5a8a5193e47bf2a12d9a3194d231eaf1bc451a"}, - {file = "httptools-0.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:24bb4bb8ac3882f90aa95403a1cb48465de877e2d5298ad6ddcfdebec060787d"}, - {file = "httptools-0.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e67d4f8734f8054d2c4858570cc4b233bf753f56e85217de4dfb2495904cf02e"}, - {file = "httptools-0.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7e5eefc58d20e4c2da82c78d91b2906f1a947ef42bd668db05f4ab4201a99f49"}, - {file = "httptools-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0297822cea9f90a38df29f48e40b42ac3d48a28637368f3ec6d15eebefd182f9"}, - {file = "httptools-0.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:557be7fbf2bfa4a2ec65192c254e151684545ebab45eca5d50477d562c40f986"}, - {file = "httptools-0.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:54465401dbbec9a6a42cf737627fb0f014d50dc7365a6b6cd57753f151a86ff0"}, - {file = "httptools-0.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4d9ebac23d2de960726ce45f49d70eb5466725c0087a078866043dad115f850f"}, - {file = "httptools-0.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:e8a34e4c0ab7b1ca17b8763613783e2458e77938092c18ac919420ab8655c8c1"}, - {file = "httptools-0.5.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f659d7a48401158c59933904040085c200b4be631cb5f23a7d561fbae593ec1f"}, - {file = "httptools-0.5.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef1616b3ba965cd68e6f759eeb5d34fbf596a79e84215eeceebf34ba3f61fdc7"}, - {file = "httptools-0.5.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3625a55886257755cb15194efbf209584754e31d336e09e2ffe0685a76cb4b60"}, - {file = "httptools-0.5.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:72ad589ba5e4a87e1d404cc1cb1b5780bfcb16e2aec957b88ce15fe879cc08ca"}, - {file = "httptools-0.5.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:850fec36c48df5a790aa735417dca8ce7d4b48d59b3ebd6f83e88a8125cde324"}, - {file = "httptools-0.5.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f222e1e9d3f13b68ff8a835574eda02e67277d51631d69d7cf7f8e07df678c86"}, - {file = "httptools-0.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3cb8acf8f951363b617a8420768a9f249099b92e703c052f9a51b66342eea89b"}, - {file = "httptools-0.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:550059885dc9c19a072ca6d6735739d879be3b5959ec218ba3e013fd2255a11b"}, - {file = "httptools-0.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a04fe458a4597aa559b79c7f48fe3dceabef0f69f562daf5c5e926b153817281"}, - {file = "httptools-0.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d0c1044bce274ec6711f0770fd2d5544fe392591d204c68328e60a46f88843b"}, - {file = "httptools-0.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c6eeefd4435055a8ebb6c5cc36111b8591c192c56a95b45fe2af22d9881eee25"}, - {file = "httptools-0.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:5b65be160adcd9de7a7e6413a4966665756e263f0d5ddeffde277ffeee0576a5"}, - {file = "httptools-0.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fe9c766a0c35b7e3d6b6939393c8dfdd5da3ac5dec7f971ec9134f284c6c36d6"}, - {file = "httptools-0.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:85b392aba273566c3d5596a0a490978c085b79700814fb22bfd537d381dd230c"}, - {file = "httptools-0.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5e3088f4ed33947e16fd865b8200f9cfae1144f41b64a8cf19b599508e096bc"}, - {file = "httptools-0.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c2a56b6aad7cc8f5551d8e04ff5a319d203f9d870398b94702300de50190f63"}, - {file = "httptools-0.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9b571b281a19762adb3f48a7731f6842f920fa71108aff9be49888320ac3e24d"}, - {file = "httptools-0.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa47ffcf70ba6f7848349b8a6f9b481ee0f7637931d91a9860a1838bfc586901"}, - {file = "httptools-0.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:bede7ee075e54b9a5bde695b4fc8f569f30185891796b2e4e09e2226801d09bd"}, - {file = "httptools-0.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:64eba6f168803a7469866a9c9b5263a7463fa8b7a25b35e547492aa7322036b6"}, - {file = "httptools-0.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4b098e4bb1174096a93f48f6193e7d9aa7071506a5877da09a783509ca5fff42"}, - {file = "httptools-0.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9423a2de923820c7e82e18980b937893f4aa8251c43684fa1772e341f6e06887"}, - {file = "httptools-0.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca1b7becf7d9d3ccdbb2f038f665c0f4857e08e1d8481cbcc1a86a0afcfb62b2"}, - {file = "httptools-0.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:50d4613025f15f4b11f1c54bbed4761c0020f7f921b95143ad6d58c151198142"}, - {file = "httptools-0.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8ffce9d81c825ac1deaa13bc9694c0562e2840a48ba21cfc9f3b4c922c16f372"}, - {file = "httptools-0.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:1af91b3650ce518d226466f30bbba5b6376dbd3ddb1b2be8b0658c6799dd450b"}, - {file = "httptools-0.5.0.tar.gz", hash = "sha256:295874861c173f9101960bba332429bb77ed4dcd8cdf5cee9922eb00e4f6bc09"}, -] - -[package.extras] -test = ["Cython (>=0.29.24,<0.30.0)"] - -[[package]] -name = "httpx" -version = "0.23.3" -description = "The next generation HTTP client." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "httpx-0.23.3-py3-none-any.whl", hash = "sha256:a211fcce9b1254ea24f0cd6af9869b3d29aba40154e947d2a07bb499b3e310d6"}, - {file = "httpx-0.23.3.tar.gz", hash = "sha256:9818458eb565bb54898ccb9b8b251a28785dd4a55afbc23d0eb410754fe7d0f9"}, -] - -[package.dependencies] -certifi = "*" -httpcore = ">=0.15.0,<0.17.0" -rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]} -sniffio = "*" - -[package.extras] -brotli = ["brotli", "brotlicffi"] -cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<13)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] - -[[package]] -name = "hyperframe" -version = "6.0.1" -description = "HTTP/2 framing layer for Python" -category = "main" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "hyperframe-6.0.1-py3-none-any.whl", hash = "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15"}, - {file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"}, -] - -[[package]] -name = "identify" -version = "2.5.18" -description = "File identification library for Python" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "identify-2.5.18-py2.py3-none-any.whl", hash = "sha256:93aac7ecf2f6abf879b8f29a8002d3c6de7086b8c28d88e1ad15045a15ab63f9"}, - {file = "identify-2.5.18.tar.gz", hash = "sha256:89e144fa560cc4cffb6ef2ab5e9fb18ed9f9b3cb054384bab4b95c12f6c309fe"}, -] - -[package.extras] -license = ["ukkonen"] - -[[package]] -name = "idna" -version = "3.4" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" -optional = false -python-versions = ">=3.5" -files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] - -[[package]] -name = "iniconfig" -version = "2.0.0" -description = "brain-dead simple config-ini parsing" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] - -[[package]] -name = "multidict" -version = "6.0.4" -description = "multidict implementation" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, - {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, - {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, - {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, - {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, - {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, - {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, - {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, - {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, - {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, - {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, - {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, - {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, -] - -[[package]] -name = "mypy" -version = "0.991" -description = "Optional static typing for Python" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "mypy-0.991-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7d17e0a9707d0772f4a7b878f04b4fd11f6f5bcb9b3813975a9b13c9332153ab"}, - {file = "mypy-0.991-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0714258640194d75677e86c786e80ccf294972cc76885d3ebbb560f11db0003d"}, - {file = "mypy-0.991-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0c8f3be99e8a8bd403caa8c03be619544bc2c77a7093685dcf308c6b109426c6"}, - {file = "mypy-0.991-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc9ec663ed6c8f15f4ae9d3c04c989b744436c16d26580eaa760ae9dd5d662eb"}, - {file = "mypy-0.991-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4307270436fd7694b41f913eb09210faff27ea4979ecbcd849e57d2da2f65305"}, - {file = "mypy-0.991-cp310-cp310-win_amd64.whl", hash = "sha256:901c2c269c616e6cb0998b33d4adbb4a6af0ac4ce5cd078afd7bc95830e62c1c"}, - {file = "mypy-0.991-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d13674f3fb73805ba0c45eb6c0c3053d218aa1f7abead6e446d474529aafc372"}, - {file = "mypy-0.991-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1c8cd4fb70e8584ca1ed5805cbc7c017a3d1a29fb450621089ffed3e99d1857f"}, - {file = "mypy-0.991-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:209ee89fbb0deed518605edddd234af80506aec932ad28d73c08f1400ef80a33"}, - {file = "mypy-0.991-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37bd02ebf9d10e05b00d71302d2c2e6ca333e6c2a8584a98c00e038db8121f05"}, - {file = "mypy-0.991-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:26efb2fcc6b67e4d5a55561f39176821d2adf88f2745ddc72751b7890f3194ad"}, - {file = "mypy-0.991-cp311-cp311-win_amd64.whl", hash = "sha256:3a700330b567114b673cf8ee7388e949f843b356a73b5ab22dd7cff4742a5297"}, - {file = "mypy-0.991-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1f7d1a520373e2272b10796c3ff721ea1a0712288cafaa95931e66aa15798813"}, - {file = "mypy-0.991-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:641411733b127c3e0dab94c45af15fea99e4468f99ac88b39efb1ad677da5711"}, - {file = "mypy-0.991-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3d80e36b7d7a9259b740be6d8d906221789b0d836201af4234093cae89ced0cd"}, - {file = "mypy-0.991-cp37-cp37m-win_amd64.whl", hash = "sha256:e62ebaad93be3ad1a828a11e90f0e76f15449371ffeecca4a0a0b9adc99abcef"}, - {file = "mypy-0.991-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b86ce2c1866a748c0f6faca5232059f881cda6dda2a893b9a8373353cfe3715a"}, - {file = "mypy-0.991-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac6e503823143464538efda0e8e356d871557ef60ccd38f8824a4257acc18d93"}, - {file = "mypy-0.991-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0cca5adf694af539aeaa6ac633a7afe9bbd760df9d31be55ab780b77ab5ae8bf"}, - {file = "mypy-0.991-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a12c56bf73cdab116df96e4ff39610b92a348cc99a1307e1da3c3768bbb5b135"}, - {file = "mypy-0.991-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:652b651d42f155033a1967739788c436491b577b6a44e4c39fb340d0ee7f0d70"}, - {file = "mypy-0.991-cp38-cp38-win_amd64.whl", hash = "sha256:4175593dc25d9da12f7de8de873a33f9b2b8bdb4e827a7cae952e5b1a342e243"}, - {file = "mypy-0.991-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:98e781cd35c0acf33eb0295e8b9c55cdbef64fcb35f6d3aa2186f289bed6e80d"}, - {file = "mypy-0.991-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6d7464bac72a85cb3491c7e92b5b62f3dcccb8af26826257760a552a5e244aa5"}, - {file = "mypy-0.991-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c9166b3f81a10cdf9b49f2d594b21b31adadb3d5e9db9b834866c3258b695be3"}, - {file = "mypy-0.991-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8472f736a5bfb159a5e36740847808f6f5b659960115ff29c7cecec1741c648"}, - {file = "mypy-0.991-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e80e758243b97b618cdf22004beb09e8a2de1af481382e4d84bc52152d1c476"}, - {file = "mypy-0.991-cp39-cp39-win_amd64.whl", hash = "sha256:74e259b5c19f70d35fcc1ad3d56499065c601dfe94ff67ae48b85596b9ec1461"}, - {file = "mypy-0.991-py3-none-any.whl", hash = "sha256:de32edc9b0a7e67c2775e574cb061a537660e51210fbf6006b0b36ea695ae9bb"}, - {file = "mypy-0.991.tar.gz", hash = "sha256:3c0165ba8f354a6d9881809ef29f1a9318a236a6d81c690094c5df32107bde06"}, -] - -[package.dependencies] -mypy-extensions = ">=0.4.3" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=3.10" - -[package.extras] -dmypy = ["psutil (>=4.0)"] -install-types = ["pip"] -python2 = ["typed-ast (>=1.4.0,<2)"] -reports = ["lxml"] - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." -category = "dev" -optional = false -python-versions = ">=3.5" -files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] - -[[package]] -name = "nodeenv" -version = "1.7.0" -description = "Node.js virtual environment builder" -category = "dev" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" -files = [ - {file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"}, - {file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"}, -] - -[package.dependencies] -setuptools = "*" - -[[package]] -name = "onecache" -version = "0.3.1" -description = "Python cache for sync and async code" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "onecache-0.3.1.tar.gz", hash = "sha256:ac3854c070b1888031c16a44737ba68eb4f80a5e626e43d5954065ad92694948"}, -] - -[package.extras] -test = ["astroid (==2.6.2)", "attrs (==21.2.0)", "autopep8 (==1.5.7)", "certifi (==2021.5.30)", "charset-normalizer (==2.0.2)", "coverage (==5.5)", "coveralls (==3.1.0)", "docopt (==0.6.2)", "flake8 (==3.9.2)", "flake8-docstrings (==1.6.0)", "idna (==3.2)", "iniconfig (==1.1.1)", "isort (==5.9.2)", "lazy-object-proxy (==1.6.0)", "mccabe (==0.6.1)", "packaging (==21.0)", "pluggy (==0.13.1)", "py (==1.10.0)", "pycodestyle (==2.7.0)", "pydocstyle (==6.1.1)", "pyflakes (==2.3.1)", "pylint (==2.9.3)", "pyparsing (==2.4.7)", "pytest (==6.2.4)", "pytest-asyncio (==0.15.1)", "pytest-cov (==2.12.1)", "pytest-sugar (==0.9.4)", "requests (==2.26.0)", "snowballstemmer (==2.1.0)", "termcolor (==1.1.0)", "toml (==0.10.2)", "urllib3 (==1.26.6)", "wrapt (==1.12.1)"] - -[[package]] -name = "packaging" -version = "23.0" -description = "Core utilities for Python packages" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, - {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, -] - -[[package]] -name = "pathspec" -version = "0.11.0" -description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pathspec-0.11.0-py3-none-any.whl", hash = "sha256:3a66eb970cbac598f9e5ccb5b2cf58930cd8e3ed86d393d541eaf2d8b1705229"}, - {file = "pathspec-0.11.0.tar.gz", hash = "sha256:64d338d4e0914e91c1792321e6907b5a593f1ab1851de7fc269557a21b30ebbc"}, -] - -[[package]] -name = "platformdirs" -version = "3.0.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "platformdirs-3.0.0-py3-none-any.whl", hash = "sha256:b1d5eb14f221506f50d6604a561f4c5786d9e80355219694a1b244bcd96f4567"}, - {file = "platformdirs-3.0.0.tar.gz", hash = "sha256:8a1228abb1ef82d788f74139988b137e78692984ec7b08eaa6c65f1723af28f9"}, -] - -[package.extras] -docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] - -[[package]] -name = "pluggy" -version = "1.0.0" -description = "plugin and hook calling mechanisms for python" -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "pre-commit" -version = "2.21.0" -description = "A framework for managing and maintaining multi-language pre-commit hooks." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pre_commit-2.21.0-py2.py3-none-any.whl", hash = "sha256:e2f91727039fc39a92f58a588a25b87f936de6567eed4f0e673e0507edc75bad"}, - {file = "pre_commit-2.21.0.tar.gz", hash = "sha256:31ef31af7e474a8d8995027fefdfcf509b5c913ff31f2015b4ec4beb26a6f658"}, -] - -[package.dependencies] -cfgv = ">=2.0.0" -identify = ">=1.0.0" -nodeenv = ">=0.11.1" -pyyaml = ">=5.1" -virtualenv = ">=20.10.0" - -[[package]] -name = "pycparser" -version = "2.21" -description = "C parser in Python" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, -] - -[[package]] -name = "pydantic" -version = "1.10.5" -description = "Data validation and settings management using python type hints" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pydantic-1.10.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5920824fe1e21cbb3e38cf0f3dd24857c8959801d1031ce1fac1d50857a03bfb"}, - {file = "pydantic-1.10.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3bb99cf9655b377db1a9e47fa4479e3330ea96f4123c6c8200e482704bf1eda2"}, - {file = "pydantic-1.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2185a3b3d98ab4506a3f6707569802d2d92c3a7ba3a9a35683a7709ea6c2aaa2"}, - {file = "pydantic-1.10.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f582cac9d11c227c652d3ce8ee223d94eb06f4228b52a8adaafa9fa62e73d5c9"}, - {file = "pydantic-1.10.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c9e5b778b6842f135902e2d82624008c6a79710207e28e86966cd136c621bfee"}, - {file = "pydantic-1.10.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:72ef3783be8cbdef6bca034606a5de3862be6b72415dc5cb1fb8ddbac110049a"}, - {file = "pydantic-1.10.5-cp310-cp310-win_amd64.whl", hash = "sha256:45edea10b75d3da43cfda12f3792833a3fa70b6eee4db1ed6aed528cef17c74e"}, - {file = "pydantic-1.10.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:63200cd8af1af2c07964546b7bc8f217e8bda9d0a2ef0ee0c797b36353914984"}, - {file = "pydantic-1.10.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:305d0376c516b0dfa1dbefeae8c21042b57b496892d721905a6ec6b79494a66d"}, - {file = "pydantic-1.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fd326aff5d6c36f05735c7c9b3d5b0e933b4ca52ad0b6e4b38038d82703d35b"}, - {file = "pydantic-1.10.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6bb0452d7b8516178c969d305d9630a3c9b8cf16fcf4713261c9ebd465af0d73"}, - {file = "pydantic-1.10.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9a9d9155e2a9f38b2eb9374c88f02fd4d6851ae17b65ee786a87d032f87008f8"}, - {file = "pydantic-1.10.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f836444b4c5ece128b23ec36a446c9ab7f9b0f7981d0d27e13a7c366ee163f8a"}, - {file = "pydantic-1.10.5-cp311-cp311-win_amd64.whl", hash = "sha256:8481dca324e1c7b715ce091a698b181054d22072e848b6fc7895cd86f79b4449"}, - {file = "pydantic-1.10.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:87f831e81ea0589cd18257f84386bf30154c5f4bed373b7b75e5cb0b5d53ea87"}, - {file = "pydantic-1.10.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ce1612e98c6326f10888df951a26ec1a577d8df49ddcaea87773bfbe23ba5cc"}, - {file = "pydantic-1.10.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58e41dd1e977531ac6073b11baac8c013f3cd8706a01d3dc74e86955be8b2c0c"}, - {file = "pydantic-1.10.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6a4b0aab29061262065bbdede617ef99cc5914d1bf0ddc8bcd8e3d7928d85bd6"}, - {file = "pydantic-1.10.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:36e44a4de37b8aecffa81c081dbfe42c4d2bf9f6dff34d03dce157ec65eb0f15"}, - {file = "pydantic-1.10.5-cp37-cp37m-win_amd64.whl", hash = "sha256:261f357f0aecda005934e413dfd7aa4077004a174dafe414a8325e6098a8e419"}, - {file = "pydantic-1.10.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b429f7c457aebb7fbe7cd69c418d1cd7c6fdc4d3c8697f45af78b8d5a7955760"}, - {file = "pydantic-1.10.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:663d2dd78596c5fa3eb996bc3f34b8c2a592648ad10008f98d1348be7ae212fb"}, - {file = "pydantic-1.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51782fd81f09edcf265823c3bf43ff36d00db246eca39ee765ef58dc8421a642"}, - {file = "pydantic-1.10.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c428c0f64a86661fb4873495c4fac430ec7a7cef2b8c1c28f3d1a7277f9ea5ab"}, - {file = "pydantic-1.10.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:76c930ad0746c70f0368c4596020b736ab65b473c1f9b3872310a835d852eb19"}, - {file = "pydantic-1.10.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3257bd714de9db2102b742570a56bf7978e90441193acac109b1f500290f5718"}, - {file = "pydantic-1.10.5-cp38-cp38-win_amd64.whl", hash = "sha256:f5bee6c523d13944a1fdc6f0525bc86dbbd94372f17b83fa6331aabacc8fd08e"}, - {file = "pydantic-1.10.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:532e97c35719f137ee5405bd3eeddc5c06eb91a032bc755a44e34a712420daf3"}, - {file = "pydantic-1.10.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ca9075ab3de9e48b75fa8ccb897c34ccc1519177ad8841d99f7fd74cf43be5bf"}, - {file = "pydantic-1.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd46a0e6296346c477e59a954da57beaf9c538da37b9df482e50f836e4a7d4bb"}, - {file = "pydantic-1.10.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3353072625ea2a9a6c81ad01b91e5c07fa70deb06368c71307529abf70d23325"}, - {file = "pydantic-1.10.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3f9d9b2be177c3cb6027cd67fbf323586417868c06c3c85d0d101703136e6b31"}, - {file = "pydantic-1.10.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b473d00ccd5c2061fd896ac127b7755baad233f8d996ea288af14ae09f8e0d1e"}, - {file = "pydantic-1.10.5-cp39-cp39-win_amd64.whl", hash = "sha256:5f3bc8f103b56a8c88021d481410874b1f13edf6e838da607dcb57ecff9b4594"}, - {file = "pydantic-1.10.5-py3-none-any.whl", hash = "sha256:7c5b94d598c90f2f46b3a983ffb46ab806a67099d118ae0da7ef21a2a4033b28"}, - {file = "pydantic-1.10.5.tar.gz", hash = "sha256:9e337ac83686645a46db0e825acceea8e02fca4062483f40e9ae178e8bd1103a"}, -] - -[package.dependencies] -typing-extensions = ">=4.2.0" - -[package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] - -[[package]] -name = "pyjwt" -version = "2.6.0" -description = "JSON Web Token implementation in Python" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "PyJWT-2.6.0-py3-none-any.whl", hash = "sha256:d83c3d892a77bbb74d3e1a2cfa90afaadb60945205d1095d9221f04466f64c14"}, - {file = "PyJWT-2.6.0.tar.gz", hash = "sha256:69285c7e31fc44f68a1feb309e948e0df53259d579295e6cfe2b1792329f05fd"}, -] - -[package.dependencies] -cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""} - -[package.extras] -crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] - -[[package]] -name = "pytest" -version = "7.2.1" -description = "pytest: simple powerful testing with Python" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pytest-7.2.1-py3-none-any.whl", hash = "sha256:c7c6ca206e93355074ae32f7403e8ea12163b1163c976fee7d4d84027c162be5"}, - {file = "pytest-7.2.1.tar.gz", hash = "sha256:d45e0952f3727241918b8fd0f376f5ff6b301cc0777c6f9a556935c92d8a7d42"}, -] - -[package.dependencies] -attrs = ">=19.2.0" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} - -[package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] - -[[package]] -name = "pytest-recording" -version = "0.12.2" -description = "A pytest plugin that allows you recording of network interactions via VCR.py" -category = "dev" -optional = false -python-versions = ">=3.5" -files = [ - {file = "pytest-recording-0.12.2.tar.gz", hash = "sha256:7c8949c24e5546a699f8fbbff0c5d6896cd09463378ac3d3f1ebb110d2186847"}, - {file = "pytest_recording-0.12.2-py3-none-any.whl", hash = "sha256:f055f97eb98bbefd0453a7796aa3a6833502c173421928b9d878cf1420b36406"}, -] - -[package.dependencies] -attrs = "*" -pytest = ">=3.5.0" -vcrpy = ">=2.0.1" - -[[package]] -name = "python-dateutil" -version = "2.8.2" -description = "Extensions to the standard Python datetime module" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "python-dotenv" -version = "0.21.1" -description = "Read key-value pairs from a .env file and set them as environment variables" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "python-dotenv-0.21.1.tar.gz", hash = "sha256:1c93de8f636cde3ce377292818d0e440b6e45a82f215c3744979151fa8151c49"}, - {file = "python_dotenv-0.21.1-py3-none-any.whl", hash = "sha256:41e12e0318bebc859fcc4d97d4db8d20ad21721a6aa5047dd59f090391cb549a"}, -] - -[package.extras] -cli = ["click (>=5.0)"] - -[[package]] -name = "python-json-logger" -version = "2.0.6" -description = "A python library adding a json log formatter" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "python-json-logger-2.0.6.tar.gz", hash = "sha256:ed33182c2b438a366775c25c1219ebbd5bd7f71694c644d6b3b3861e19565ae3"}, - {file = "python_json_logger-2.0.6-py3-none-any.whl", hash = "sha256:3af8e5b907b4a5b53cae249205ee3a3d3472bd7ad9ddfaec136eec2f2faf4995"}, -] - -[[package]] -name = "pyyaml" -version = "6.0" -description = "YAML parser and emitter for Python" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {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-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {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"}, -] - -[[package]] -name = "rfc3986" -version = "1.5.0" -description = "Validating URI References per RFC 3986" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, - {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, -] - -[package.dependencies] -idna = {version = "*", optional = true, markers = "extra == \"idna2008\""} - -[package.extras] -idna2008 = ["idna"] - -[[package]] -name = "ruff" -version = "0.0.215" -description = "An extremely fast Python linter, written in Rust." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "ruff-0.0.215-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:a4963613bca6ffc448deca1ce3a3fc69af216d6234e5d7f256935d7407088724"}, - {file = "ruff-0.0.215-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:7bcd7b07a88c6530bb4e80850d6cf261081b9d4147eb0ea91fbb85a332ba4fe6"}, - {file = "ruff-0.0.215-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf3fcbf717a1e0c480b3d1fe9fd823043af463f067ec896746dab2123c4dcf10"}, - {file = "ruff-0.0.215-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8199acc4a20d2b3761c4489171f45f37654f2d5ce096361221ea392f078b4be0"}, - {file = "ruff-0.0.215-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f68624344209d07000aba115eeac551f362e278970112f0b69838c70f77f7df"}, - {file = "ruff-0.0.215-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f3c846df8a83445c394e6be58b8e784ec8fc82d67de94f137026c43e6037958b"}, - {file = "ruff-0.0.215-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65b13019821af35a3225a64f2c93877c1e8059b92bb13fce32281ceefeecd199"}, - {file = "ruff-0.0.215-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a02cb67a7171418c5a90ad0d8f983b5fd29b321c9861e0164d126cda4869c61"}, - {file = "ruff-0.0.215-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07d69e654d977842c327f26487ef9b7dba39204b113619d33b4139bd3fdd101c"}, - {file = "ruff-0.0.215-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ed2a0e13c822f8f0c40e6fe6172ff9c88add55a1dac9e0c05315618f82375648"}, - {file = "ruff-0.0.215-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1fd4b80bf34e20d18b01bf6d981973975184a85ed39f64934e11d00e2aba882f"}, - {file = "ruff-0.0.215-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5360b476b8720fa76d9dd6ee980c563b930a08524c91c99edddb25364ef656d7"}, - {file = "ruff-0.0.215-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:352534c0c2ffd491b331fe5982b1d3e88a6c2083a3c127466d4eed63918f6ea8"}, - {file = "ruff-0.0.215-py3-none-win32.whl", hash = "sha256:af3cd199a0c6f5b90b9c84a2b9b74b202901194b8b00d5d3e28a0a814037b73f"}, - {file = "ruff-0.0.215-py3-none-win_amd64.whl", hash = "sha256:aa6fe5b56b17a04c8db7f60fef21a9ff96109d10d9232b436ae2dfdc6cc70b7c"}, - {file = "ruff-0.0.215.tar.gz", hash = "sha256:a82ab1452396d5ca389bdcb182e8f273c5f7db854022d7a303764b6218e9e77e"}, -] - -[[package]] -name = "setuptools" -version = "67.3.3" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "setuptools-67.3.3-py3-none-any.whl", hash = "sha256:9d3de8591bd6f6522594406fa46a6418eabd0562dacb267f8556675762801514"}, - {file = "setuptools-67.3.3.tar.gz", hash = "sha256:ed4e75fafe103c79b692f217158ba87edf38d31004b9dbc1913debb48793c828"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - -[[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.*" -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] - -[[package]] -name = "sniffio" -version = "1.3.0" -description = "Sniff out which async library your code is running under" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, -] - -[[package]] -name = "starlette" -version = "0.25.0" -description = "The little ASGI library that shines." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "starlette-0.25.0-py3-none-any.whl", hash = "sha256:774f1df1983fd594b9b6fb3ded39c2aa1979d10ac45caac0f4255cbe2acb8628"}, - {file = "starlette-0.25.0.tar.gz", hash = "sha256:854c71e73736c429c2bdb07801f2c76c9cba497e7c3cf4988fde5e95fe4cdb3c"}, -] - -[package.dependencies] -anyio = ">=3.4.0,<5" - -[package.extras] -full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] - -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] - -[[package]] -name = "typing-extensions" -version = "4.5.0" -description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, - {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, -] - -[[package]] -name = "ua-parser" -version = "0.16.1" -description = "Python port of Browserscope's user agent parser" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "ua-parser-0.16.1.tar.gz", hash = "sha256:ed3efc695f475ffe56248c9789b3016247e9c20e3556cfa4d5aadc78ab4b26c6"}, - {file = "ua_parser-0.16.1-py2.py3-none-any.whl", hash = "sha256:f97126300df8ac0f8f2c9d8559669532d626a1af529265fd253cba56e73ab36e"}, -] - -[[package]] -name = "urllib3" -version = "1.26.14" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -files = [ - {file = "urllib3-1.26.14-py2.py3-none-any.whl", hash = "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1"}, - {file = "urllib3-1.26.14.tar.gz", hash = "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] - -[[package]] -name = "uvicorn" -version = "0.20.0" -description = "The lightning-fast ASGI server." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "uvicorn-0.20.0-py3-none-any.whl", hash = "sha256:c3ed1598a5668208723f2bb49336f4509424ad198d6ab2615b7783db58d919fd"}, - {file = "uvicorn-0.20.0.tar.gz", hash = "sha256:a4e12017b940247f836bc90b72e725d7dfd0c8ed1c51eb365f5ba30d9f5127d8"}, -] - -[package.dependencies] -click = ">=7.0" -colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""} -h11 = ">=0.8" -httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""} -python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} -pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} -uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\" and extra == \"standard\""} -watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} -websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""} - -[package.extras] -standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] - -[[package]] -name = "uvloop" -version = "0.17.0" -description = "Fast implementation of asyncio event loop on top of libuv" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce9f61938d7155f79d3cb2ffa663147d4a76d16e08f65e2c66b77bd41b356718"}, - {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:68532f4349fd3900b839f588972b3392ee56042e440dd5873dfbbcd2cc67617c"}, - {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0949caf774b9fcefc7c5756bacbbbd3fc4c05a6b7eebc7c7ad6f825b23998d6d"}, - {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff3d00b70ce95adce264462c930fbaecb29718ba6563db354608f37e49e09024"}, - {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a5abddb3558d3f0a78949c750644a67be31e47936042d4f6c888dd6f3c95f4aa"}, - {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8efcadc5a0003d3a6e887ccc1fb44dec25594f117a94e3127954c05cf144d811"}, - {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3378eb62c63bf336ae2070599e49089005771cc651c8769aaad72d1bd9385a7c"}, - {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6aafa5a78b9e62493539456f8b646f85abc7093dd997f4976bb105537cf2635e"}, - {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c686a47d57ca910a2572fddfe9912819880b8765e2f01dc0dd12a9bf8573e539"}, - {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:864e1197139d651a76c81757db5eb199db8866e13acb0dfe96e6fc5d1cf45fc4"}, - {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2a6149e1defac0faf505406259561bc14b034cdf1d4711a3ddcdfbaa8d825a05"}, - {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6708f30db9117f115eadc4f125c2a10c1a50d711461699a0cbfaa45b9a78e376"}, - {file = "uvloop-0.17.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:23609ca361a7fc587031429fa25ad2ed7242941adec948f9d10c045bfecab06b"}, - {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2deae0b0fb00a6af41fe60a675cec079615b01d68beb4cc7b722424406b126a8"}, - {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45cea33b208971e87a31c17622e4b440cac231766ec11e5d22c76fab3bf9df62"}, - {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9b09e0f0ac29eee0451d71798878eae5a4e6a91aa275e114037b27f7db72702d"}, - {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dbbaf9da2ee98ee2531e0c780455f2841e4675ff580ecf93fe5c48fe733b5667"}, - {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a4aee22ece20958888eedbad20e4dbb03c37533e010fb824161b4f05e641f738"}, - {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:307958f9fc5c8bb01fad752d1345168c0abc5d62c1b72a4a8c6c06f042b45b20"}, - {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ebeeec6a6641d0adb2ea71dcfb76017602ee2bfd8213e3fcc18d8f699c5104f"}, - {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1436c8673c1563422213ac6907789ecb2b070f5939b9cbff9ef7113f2b531595"}, - {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8887d675a64cfc59f4ecd34382e5b4f0ef4ae1da37ed665adba0c2badf0d6578"}, - {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3db8de10ed684995a7f34a001f15b374c230f7655ae840964d51496e2f8a8474"}, - {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7d37dccc7ae63e61f7b96ee2e19c40f153ba6ce730d8ba4d3b4e9738c1dccc1b"}, - {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cbbe908fda687e39afd6ea2a2f14c2c3e43f2ca88e3a11964b297822358d0e6c"}, - {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d97672dc709fa4447ab83276f344a165075fd9f366a97b712bdd3fee05efae8"}, - {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1e507c9ee39c61bfddd79714e4f85900656db1aec4d40c6de55648e85c2799c"}, - {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c092a2c1e736086d59ac8e41f9c98f26bbf9b9222a76f21af9dfe949b99b2eb9"}, - {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:30babd84706115626ea78ea5dbc7dd8d0d01a2e9f9b306d24ca4ed5796c66ded"}, - {file = "uvloop-0.17.0.tar.gz", hash = "sha256:0ddf6baf9cf11a1a22c71487f39f15b2cf78eb5bde7e5b45fbb99e8a9d91b9e1"}, -] - -[package.extras] -dev = ["Cython (>=0.29.32,<0.30.0)", "Sphinx (>=4.1.2,<4.2.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)", "pytest (>=3.6.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] -docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] -test = ["Cython (>=0.29.32,<0.30.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)"] - -[[package]] -name = "vcrpy" -version = "4.2.1" -description = "Automatically mock your HTTP interactions to simplify and speed up testing" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "vcrpy-4.2.1-py2.py3-none-any.whl", hash = "sha256:efac3e2e0b2af7686f83a266518180af7a048619b2f696e7bad9520f5e2eac09"}, - {file = "vcrpy-4.2.1.tar.gz", hash = "sha256:7cd3e81a2c492e01c281f180bcc2a86b520b173d2b656cb5d89d99475423e013"}, -] - -[package.dependencies] -PyYAML = "*" -six = ">=1.5" -wrapt = "*" -yarl = "*" - -[[package]] -name = "virtualenv" -version = "20.19.0" -description = "Virtual Python Environment builder" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "virtualenv-20.19.0-py3-none-any.whl", hash = "sha256:54eb59e7352b573aa04d53f80fc9736ed0ad5143af445a1e539aada6eb947dd1"}, - {file = "virtualenv-20.19.0.tar.gz", hash = "sha256:37a640ba82ed40b226599c522d411e4be5edb339a0c0de030c0dc7b646d61590"}, -] - -[package.dependencies] -distlib = ">=0.3.6,<1" -filelock = ">=3.4.1,<4" -platformdirs = ">=2.4,<4" - -[package.extras] -docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] -test = ["covdefaults (>=2.2.2)", "coverage (>=7.1)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23)", "pytest (>=7.2.1)", "pytest-env (>=0.8.1)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)"] - -[[package]] -name = "watchfiles" -version = "0.18.1" -description = "Simple, modern and high performance file watching and code reload in python." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "watchfiles-0.18.1-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:9891d3c94272108bcecf5597a592e61105279def1313521e637f2d5acbe08bc9"}, - {file = "watchfiles-0.18.1-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:7102342d60207fa635e24c02a51c6628bf0472e5fef067f78a612386840407fc"}, - {file = "watchfiles-0.18.1-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:00ea0081eca5e8e695cffbc3a726bb90da77f4e3f78ce29b86f0d95db4e70ef7"}, - {file = "watchfiles-0.18.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b8e6db99e49cd7125d8a4c9d33c0735eea7b75a942c6ad68b75be3e91c242fb"}, - {file = "watchfiles-0.18.1-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bc7c726855f04f22ac79131b51bf0c9f728cb2117419ed830a43828b2c4a5fcb"}, - {file = "watchfiles-0.18.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbaff354d12235002e62d9d3fa8bcf326a8490c1179aa5c17195a300a9e5952f"}, - {file = "watchfiles-0.18.1-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:888db233e06907c555eccd10da99b9cd5ed45deca47e41766954292dc9f7b198"}, - {file = "watchfiles-0.18.1-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:dde79930d1b28f15994ad6613aa2865fc7a403d2bb14585a8714a53233b15717"}, - {file = "watchfiles-0.18.1-cp37-abi3-win32.whl", hash = "sha256:e2b2bdd26bf8d6ed90763e6020b475f7634f919dbd1730ea1b6f8cb88e21de5d"}, - {file = "watchfiles-0.18.1-cp37-abi3-win_amd64.whl", hash = "sha256:c541e0f2c3e95e83e4f84561c893284ba984e9d0025352057396d96dceb09f44"}, - {file = "watchfiles-0.18.1-cp37-abi3-win_arm64.whl", hash = "sha256:9a26272ef3e930330fc0c2c148cc29706cc2c40d25760c7ccea8d768a8feef8b"}, - {file = "watchfiles-0.18.1-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:9fb12a5e2b42e0b53769455ff93546e6bc9ab14007fbd436978d827a95ca5bd1"}, - {file = "watchfiles-0.18.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:548d6b42303d40264118178053c78820533b683b20dfbb254a8706ca48467357"}, - {file = "watchfiles-0.18.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e0d8fdfebc50ac7569358f5c75f2b98bb473befccf9498cf23b3e39993bb45a"}, - {file = "watchfiles-0.18.1-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:0f9a22fff1745e2bb930b1e971c4c5b67ea3b38ae17a6adb9019371f80961219"}, - {file = "watchfiles-0.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b02e7fa03cd4059dd61ff0600080a5a9e7a893a85cb8e5178943533656eec65e"}, - {file = "watchfiles-0.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a868ce2c7565137f852bd4c863a164dc81306cae7378dbdbe4e2aca51ddb8857"}, - {file = "watchfiles-0.18.1.tar.gz", hash = "sha256:4ec0134a5e31797eb3c6c624dbe9354f2a8ee9c720e0b46fc5b7bab472b7c6d4"}, -] - -[package.dependencies] -anyio = ">=3.0.0" - -[[package]] -name = "websockets" -version = "10.4" -description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "websockets-10.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d58804e996d7d2307173d56c297cf7bc132c52df27a3efaac5e8d43e36c21c48"}, - {file = "websockets-10.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc0b82d728fe21a0d03e65f81980abbbcb13b5387f733a1a870672c5be26edab"}, - {file = "websockets-10.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ba089c499e1f4155d2a3c2a05d2878a3428cf321c848f2b5a45ce55f0d7d310c"}, - {file = "websockets-10.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33d69ca7612f0ddff3316b0c7b33ca180d464ecac2d115805c044bf0a3b0d032"}, - {file = "websockets-10.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62e627f6b6d4aed919a2052efc408da7a545c606268d5ab5bfab4432734b82b4"}, - {file = "websockets-10.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ea7b82bfcae927eeffc55d2ffa31665dc7fec7b8dc654506b8e5a518eb4d50"}, - {file = "websockets-10.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e0cb5cc6ece6ffa75baccfd5c02cffe776f3f5c8bf486811f9d3ea3453676ce8"}, - {file = "websockets-10.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae5e95cfb53ab1da62185e23b3130e11d64431179debac6dc3c6acf08760e9b1"}, - {file = "websockets-10.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7c584f366f46ba667cfa66020344886cf47088e79c9b9d39c84ce9ea98aaa331"}, - {file = "websockets-10.4-cp310-cp310-win32.whl", hash = "sha256:b029fb2032ae4724d8ae8d4f6b363f2cc39e4c7b12454df8df7f0f563ed3e61a"}, - {file = "websockets-10.4-cp310-cp310-win_amd64.whl", hash = "sha256:8dc96f64ae43dde92530775e9cb169979f414dcf5cff670455d81a6823b42089"}, - {file = "websockets-10.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:47a2964021f2110116cc1125b3e6d87ab5ad16dea161949e7244ec583b905bb4"}, - {file = "websockets-10.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e789376b52c295c4946403bd0efecf27ab98f05319df4583d3c48e43c7342c2f"}, - {file = "websockets-10.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7d3f0b61c45c3fa9a349cf484962c559a8a1d80dae6977276df8fd1fa5e3cb8c"}, - {file = "websockets-10.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f55b5905705725af31ccef50e55391621532cd64fbf0bc6f4bac935f0fccec46"}, - {file = "websockets-10.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00c870522cdb69cd625b93f002961ffb0c095394f06ba8c48f17eef7c1541f96"}, - {file = "websockets-10.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f38706e0b15d3c20ef6259fd4bc1700cd133b06c3c1bb108ffe3f8947be15fa"}, - {file = "websockets-10.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f2c38d588887a609191d30e902df2a32711f708abfd85d318ca9b367258cfd0c"}, - {file = "websockets-10.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:fe10ddc59b304cb19a1bdf5bd0a7719cbbc9fbdd57ac80ed436b709fcf889106"}, - {file = "websockets-10.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:90fcf8929836d4a0e964d799a58823547df5a5e9afa83081761630553be731f9"}, - {file = "websockets-10.4-cp311-cp311-win32.whl", hash = "sha256:b9968694c5f467bf67ef97ae7ad4d56d14be2751000c1207d31bf3bb8860bae8"}, - {file = "websockets-10.4-cp311-cp311-win_amd64.whl", hash = "sha256:a7a240d7a74bf8d5cb3bfe6be7f21697a28ec4b1a437607bae08ac7acf5b4882"}, - {file = "websockets-10.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:74de2b894b47f1d21cbd0b37a5e2b2392ad95d17ae983e64727e18eb281fe7cb"}, - {file = "websockets-10.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3a686ecb4aa0d64ae60c9c9f1a7d5d46cab9bfb5d91a2d303d00e2cd4c4c5cc"}, - {file = "websockets-10.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0d15c968ea7a65211e084f523151dbf8ae44634de03c801b8bd070b74e85033"}, - {file = "websockets-10.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00213676a2e46b6ebf6045bc11d0f529d9120baa6f58d122b4021ad92adabd41"}, - {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e23173580d740bf8822fd0379e4bf30aa1d5a92a4f252d34e893070c081050df"}, - {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:dd500e0a5e11969cdd3320935ca2ff1e936f2358f9c2e61f100a1660933320ea"}, - {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4239b6027e3d66a89446908ff3027d2737afc1a375f8fd3eea630a4842ec9a0c"}, - {file = "websockets-10.4-cp37-cp37m-win32.whl", hash = "sha256:8a5cc00546e0a701da4639aa0bbcb0ae2bb678c87f46da01ac2d789e1f2d2038"}, - {file = "websockets-10.4-cp37-cp37m-win_amd64.whl", hash = "sha256:a9f9a735deaf9a0cadc2d8c50d1a5bcdbae8b6e539c6e08237bc4082d7c13f28"}, - {file = "websockets-10.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c1289596042fad2cdceb05e1ebf7aadf9995c928e0da2b7a4e99494953b1b94"}, - {file = "websockets-10.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0cff816f51fb33c26d6e2b16b5c7d48eaa31dae5488ace6aae468b361f422b63"}, - {file = "websockets-10.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dd9becd5fe29773d140d68d607d66a38f60e31b86df75332703757ee645b6faf"}, - {file = "websockets-10.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45ec8e75b7dbc9539cbfafa570742fe4f676eb8b0d3694b67dabe2f2ceed8aa6"}, - {file = "websockets-10.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f72e5cd0f18f262f5da20efa9e241699e0cf3a766317a17392550c9ad7b37d8"}, - {file = "websockets-10.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:185929b4808b36a79c65b7865783b87b6841e852ef5407a2fb0c03381092fa3b"}, - {file = "websockets-10.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d27a7e34c313b3a7f91adcd05134315002aaf8540d7b4f90336beafaea6217c"}, - {file = "websockets-10.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:884be66c76a444c59f801ac13f40c76f176f1bfa815ef5b8ed44321e74f1600b"}, - {file = "websockets-10.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:931c039af54fc195fe6ad536fde4b0de04da9d5916e78e55405436348cfb0e56"}, - {file = "websockets-10.4-cp38-cp38-win32.whl", hash = "sha256:db3c336f9eda2532ec0fd8ea49fef7a8df8f6c804cdf4f39e5c5c0d4a4ad9a7a"}, - {file = "websockets-10.4-cp38-cp38-win_amd64.whl", hash = "sha256:48c08473563323f9c9debac781ecf66f94ad5a3680a38fe84dee5388cf5acaf6"}, - {file = "websockets-10.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:40e826de3085721dabc7cf9bfd41682dadc02286d8cf149b3ad05bff89311e4f"}, - {file = "websockets-10.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:56029457f219ade1f2fc12a6504ea61e14ee227a815531f9738e41203a429112"}, - {file = "websockets-10.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f5fc088b7a32f244c519a048c170f14cf2251b849ef0e20cbbb0fdf0fdaf556f"}, - {file = "websockets-10.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc8709c00704194213d45e455adc106ff9e87658297f72d544220e32029cd3d"}, - {file = "websockets-10.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0154f7691e4fe6c2b2bc275b5701e8b158dae92a1ab229e2b940efe11905dff4"}, - {file = "websockets-10.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c6d2264f485f0b53adf22697ac11e261ce84805c232ed5dbe6b1bcb84b00ff0"}, - {file = "websockets-10.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9bc42e8402dc5e9905fb8b9649f57efcb2056693b7e88faa8fb029256ba9c68c"}, - {file = "websockets-10.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:edc344de4dac1d89300a053ac973299e82d3db56330f3494905643bb68801269"}, - {file = "websockets-10.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:84bc2a7d075f32f6ed98652db3a680a17a4edb21ca7f80fe42e38753a58ee02b"}, - {file = "websockets-10.4-cp39-cp39-win32.whl", hash = "sha256:c94ae4faf2d09f7c81847c63843f84fe47bf6253c9d60b20f25edfd30fb12588"}, - {file = "websockets-10.4-cp39-cp39-win_amd64.whl", hash = "sha256:bbccd847aa0c3a69b5f691a84d2341a4f8a629c6922558f2a70611305f902d74"}, - {file = "websockets-10.4-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:82ff5e1cae4e855147fd57a2863376ed7454134c2bf49ec604dfe71e446e2193"}, - {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d210abe51b5da0ffdbf7b43eed0cfdff8a55a1ab17abbec4301c9ff077dd0342"}, - {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:942de28af58f352a6f588bc72490ae0f4ccd6dfc2bd3de5945b882a078e4e179"}, - {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9b27d6c1c6cd53dc93614967e9ce00ae7f864a2d9f99fe5ed86706e1ecbf485"}, - {file = "websockets-10.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:3d3cac3e32b2c8414f4f87c1b2ab686fa6284a980ba283617404377cd448f631"}, - {file = "websockets-10.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:da39dd03d130162deb63da51f6e66ed73032ae62e74aaccc4236e30edccddbb0"}, - {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389f8dbb5c489e305fb113ca1b6bdcdaa130923f77485db5b189de343a179393"}, - {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09a1814bb15eff7069e51fed0826df0bc0702652b5cb8f87697d469d79c23576"}, - {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff64a1d38d156d429404aaa84b27305e957fd10c30e5880d1765c9480bea490f"}, - {file = "websockets-10.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b343f521b047493dc4022dd338fc6db9d9282658862756b4f6fd0e996c1380e1"}, - {file = "websockets-10.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:932af322458da7e4e35df32f050389e13d3d96b09d274b22a7aa1808f292fee4"}, - {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a4162139374a49eb18ef5b2f4da1dd95c994588f5033d64e0bbfda4b6b6fcf"}, - {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c57e4c1349fbe0e446c9fa7b19ed2f8a4417233b6984277cce392819123142d3"}, - {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b627c266f295de9dea86bd1112ed3d5fafb69a348af30a2422e16590a8ecba13"}, - {file = "websockets-10.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:05a7233089f8bd355e8cbe127c2e8ca0b4ea55467861906b80d2ebc7db4d6b72"}, - {file = "websockets-10.4.tar.gz", hash = "sha256:eef610b23933c54d5d921c92578ae5f89813438fded840c2e9809d378dc765d3"}, -] - -[[package]] -name = "wrapt" -version = "1.14.1" -description = "Module for decorators, wrappers and monkey patching." -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -files = [ - {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, - {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, - {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, - {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, - {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, - {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, - {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, - {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, - {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, - {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, - {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, - {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, - {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, - {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, - {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, - {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, -] - -[[package]] -name = "yarl" -version = "1.8.2" -description = "Yet another URL library" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "yarl-1.8.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bb81f753c815f6b8e2ddd2eef3c855cf7da193b82396ac013c661aaa6cc6b0a5"}, - {file = "yarl-1.8.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:47d49ac96156f0928f002e2424299b2c91d9db73e08c4cd6742923a086f1c863"}, - {file = "yarl-1.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3fc056e35fa6fba63248d93ff6e672c096f95f7836938241ebc8260e062832fe"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58a3c13d1c3005dbbac5c9f0d3210b60220a65a999b1833aa46bd6677c69b08e"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10b08293cda921157f1e7c2790999d903b3fd28cd5c208cf8826b3b508026996"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de986979bbd87272fe557e0a8fcb66fd40ae2ddfe28a8b1ce4eae22681728fef"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c4fcfa71e2c6a3cb568cf81aadc12768b9995323186a10827beccf5fa23d4f8"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae4d7ff1049f36accde9e1ef7301912a751e5bae0a9d142459646114c70ecba6"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bf071f797aec5b96abfc735ab97da9fd8f8768b43ce2abd85356a3127909d146"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:74dece2bfc60f0f70907c34b857ee98f2c6dd0f75185db133770cd67300d505f"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:df60a94d332158b444301c7f569659c926168e4d4aad2cfbf4bce0e8fb8be826"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:63243b21c6e28ec2375f932a10ce7eda65139b5b854c0f6b82ed945ba526bff3"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cfa2bbca929aa742b5084fd4663dd4b87c191c844326fcb21c3afd2d11497f80"}, - {file = "yarl-1.8.2-cp310-cp310-win32.whl", hash = "sha256:b05df9ea7496df11b710081bd90ecc3a3db6adb4fee36f6a411e7bc91a18aa42"}, - {file = "yarl-1.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:24ad1d10c9db1953291f56b5fe76203977f1ed05f82d09ec97acb623a7976574"}, - {file = "yarl-1.8.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2a1fca9588f360036242f379bfea2b8b44cae2721859b1c56d033adfd5893634"}, - {file = "yarl-1.8.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f37db05c6051eff17bc832914fe46869f8849de5b92dc4a3466cd63095d23dfd"}, - {file = "yarl-1.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77e913b846a6b9c5f767b14dc1e759e5aff05502fe73079f6f4176359d832581"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0978f29222e649c351b173da2b9b4665ad1feb8d1daa9d971eb90df08702668a"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388a45dc77198b2460eac0aca1efd6a7c09e976ee768b0d5109173e521a19daf"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2305517e332a862ef75be8fad3606ea10108662bc6fe08509d5ca99503ac2aee"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42430ff511571940d51e75cf42f1e4dbdded477e71c1b7a17f4da76c1da8ea76"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3150078118f62371375e1e69b13b48288e44f6691c1069340081c3fd12c94d5b"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c15163b6125db87c8f53c98baa5e785782078fbd2dbeaa04c6141935eb6dab7a"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4d04acba75c72e6eb90745447d69f84e6c9056390f7a9724605ca9c56b4afcc6"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e7fd20d6576c10306dea2d6a5765f46f0ac5d6f53436217913e952d19237efc4"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:75c16b2a900b3536dfc7014905a128a2bea8fb01f9ee26d2d7d8db0a08e7cb2c"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6d88056a04860a98341a0cf53e950e3ac9f4e51d1b6f61a53b0609df342cc8b2"}, - {file = "yarl-1.8.2-cp311-cp311-win32.whl", hash = "sha256:fb742dcdd5eec9f26b61224c23baea46c9055cf16f62475e11b9b15dfd5c117b"}, - {file = "yarl-1.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:8c46d3d89902c393a1d1e243ac847e0442d0196bbd81aecc94fcebbc2fd5857c"}, - {file = "yarl-1.8.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ceff9722e0df2e0a9e8a79c610842004fa54e5b309fe6d218e47cd52f791d7ef"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f6b4aca43b602ba0f1459de647af954769919c4714706be36af670a5f44c9c1"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1684a9bd9077e922300ecd48003ddae7a7474e0412bea38d4631443a91d61077"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ebb78745273e51b9832ef90c0898501006670d6e059f2cdb0e999494eb1450c2"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3adeef150d528ded2a8e734ebf9ae2e658f4c49bf413f5f157a470e17a4a2e89"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57a7c87927a468e5a1dc60c17caf9597161d66457a34273ab1760219953f7f4c"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:efff27bd8cbe1f9bd127e7894942ccc20c857aa8b5a0327874f30201e5ce83d0"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a783cd344113cb88c5ff7ca32f1f16532a6f2142185147822187913eb989f739"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:705227dccbe96ab02c7cb2c43e1228e2826e7ead880bb19ec94ef279e9555b5b"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:34c09b43bd538bf6c4b891ecce94b6fa4f1f10663a8d4ca589a079a5018f6ed7"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a48f4f7fea9a51098b02209d90297ac324241bf37ff6be6d2b0149ab2bd51b37"}, - {file = "yarl-1.8.2-cp37-cp37m-win32.whl", hash = "sha256:0414fd91ce0b763d4eadb4456795b307a71524dbacd015c657bb2a39db2eab89"}, - {file = "yarl-1.8.2-cp37-cp37m-win_amd64.whl", hash = "sha256:d881d152ae0007809c2c02e22aa534e702f12071e6b285e90945aa3c376463c5"}, - {file = "yarl-1.8.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5df5e3d04101c1e5c3b1d69710b0574171cc02fddc4b23d1b2813e75f35a30b1"}, - {file = "yarl-1.8.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a66c506ec67eb3159eea5096acd05f5e788ceec7b96087d30c7d2865a243918"}, - {file = "yarl-1.8.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2b4fa2606adf392051d990c3b3877d768771adc3faf2e117b9de7eb977741229"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e21fb44e1eff06dd6ef971d4bdc611807d6bd3691223d9c01a18cec3677939e"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93202666046d9edadfe9f2e7bf5e0782ea0d497b6d63da322e541665d65a044e"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fc77086ce244453e074e445104f0ecb27530d6fd3a46698e33f6c38951d5a0f1"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dd68a92cab699a233641f5929a40f02a4ede8c009068ca8aa1fe87b8c20ae3"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b372aad2b5f81db66ee7ec085cbad72c4da660d994e8e590c997e9b01e44901"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e6f3515aafe0209dd17fb9bdd3b4e892963370b3de781f53e1746a521fb39fc0"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dfef7350ee369197106805e193d420b75467b6cceac646ea5ed3049fcc950a05"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:728be34f70a190566d20aa13dc1f01dc44b6aa74580e10a3fb159691bc76909d"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ff205b58dc2929191f68162633d5e10e8044398d7a45265f90a0f1d51f85f72c"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baf211dcad448a87a0d9047dc8282d7de59473ade7d7fdf22150b1d23859f946"}, - {file = "yarl-1.8.2-cp38-cp38-win32.whl", hash = "sha256:272b4f1599f1b621bf2aabe4e5b54f39a933971f4e7c9aa311d6d7dc06965165"}, - {file = "yarl-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:326dd1d3caf910cd26a26ccbfb84c03b608ba32499b5d6eeb09252c920bcbe4f"}, - {file = "yarl-1.8.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f8ca8ad414c85bbc50f49c0a106f951613dfa5f948ab69c10ce9b128d368baf8"}, - {file = "yarl-1.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:418857f837347e8aaef682679f41e36c24250097f9e2f315d39bae3a99a34cbf"}, - {file = "yarl-1.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ae0eec05ab49e91a78700761777f284c2df119376e391db42c38ab46fd662b77"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:009a028127e0a1755c38b03244c0bea9d5565630db9c4cf9572496e947137a87"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3edac5d74bb3209c418805bda77f973117836e1de7c000e9755e572c1f7850d0"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da65c3f263729e47351261351b8679c6429151ef9649bba08ef2528ff2c423b2"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ef8fb25e52663a1c85d608f6dd72e19bd390e2ecaf29c17fb08f730226e3a08"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcd7bb1e5c45274af9a1dd7494d3c52b2be5e6bd8d7e49c612705fd45420b12d"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44ceac0450e648de86da8e42674f9b7077d763ea80c8ceb9d1c3e41f0f0a9951"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:97209cc91189b48e7cfe777237c04af8e7cc51eb369004e061809bcdf4e55220"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:48dd18adcf98ea9cd721a25313aef49d70d413a999d7d89df44f469edfb38a06"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e59399dda559688461762800d7fb34d9e8a6a7444fd76ec33220a926c8be1516"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d617c241c8c3ad5c4e78a08429fa49e4b04bedfc507b34b4d8dceb83b4af3588"}, - {file = "yarl-1.8.2-cp39-cp39-win32.whl", hash = "sha256:cb6d48d80a41f68de41212f3dfd1a9d9898d7841c8f7ce6696cf2fd9cb57ef83"}, - {file = "yarl-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:6604711362f2dbf7160df21c416f81fac0de6dbcf0b5445a2ef25478ecc4c778"}, - {file = "yarl-1.8.2.tar.gz", hash = "sha256:49d43402c6e3013ad0978602bf6bf5328535c48d192304b91b97a3c6790b1562"}, -] - -[package.dependencies] -idna = ">=2.0" -multidict = ">=4.0" - -[metadata] -lock-version = "2.0" -python-versions = "^3.10" -content-hash = "6e5dcb70097bc9ac74890e4f58e7b2b2e5037636ccb7e93e0f03480b107a16d2" diff --git a/apps/monitoring/backend/pyproject.toml b/apps/monitoring/backend/pyproject.toml deleted file mode 100644 index 425c1cf..0000000 --- a/apps/monitoring/backend/pyproject.toml +++ /dev/null @@ -1,58 +0,0 @@ -[tool.poetry] -name = "saleor-app-monitoring" -version = "0.1.0" -description = "Saleor Monitoring app" -authors = ["Przemysław Łada "] - -[tool.poetry.dependencies] -python = "^3.10" -fastapi = "^0.92.0" -uvicorn = {extras = ["standard"], version = "^0.20.0"} -python-dotenv = "^0.21.0" -python-json-logger = "^2.0.4" -datadog-api-client = {extras = ["async"], version = "^2.8.0"} -ua-parser = "^0.16.1" -ariadne = "^0.17.1" -httpx = "^0.23.3" -pyjwt = {extras = ["crypto"], version = "^2.6.0"} - - -[tool.poetry.group.dev.dependencies] -black = {extras = ["d"], version = "^22.12.0"} -pytest = "^7.2.0" -pre-commit = "^2.21.0" -ruff = "^0.0.215" -mypy = "^0.991" -anyio = "^3.6.2" -pytest-recording = "^0.12.2" - -[build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" - -[tool.ruff] -target-version = "py310" -select = [ - "E", # pycodestyle errors - "W", # pycodestyle warnings - "F", # pyflakes - "I001", # isort - "C", # flake8-comprehensions - "B", # flake8-bugbear -] -ignore = [ - "E501", # line too long, handled by black - "B008", # do not perform function calls in argument defaults - "C901", # too complex -] -fix = true -fixable = ["I001"] -src = ["monitoring"] - -[tool.ruff.isort] -known-first-party = ["monitoring"] - -[tool.mypy] -allow_redefinition = true -show_error_codes = true -check_untyped_defs = true diff --git a/apps/monitoring/docker-compose.yml b/apps/monitoring/docker-compose.yml deleted file mode 100644 index 9b98231..0000000 --- a/apps/monitoring/docker-compose.yml +++ /dev/null @@ -1,18 +0,0 @@ -version: "3.8" - -services: - api: - build: - context: ./backend - dockerfile: Dockerfile - target: dev - stdin_open: true - tty: true - ports: - - "5001:80" - environment: - - DEBUG=True - # Uncomment to enable test credentials mode - # - MOCK_DATADOG_CLIENT=True - volumes: - - ./backend/monitoring/:/app/monitoring diff --git a/apps/monitoring/next-env.d.ts b/apps/monitoring/next-env.d.ts deleted file mode 100644 index 4f11a03..0000000 --- a/apps/monitoring/next-env.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -/// -/// - -// NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/apps/monitoring/next.config.js b/apps/monitoring/next.config.js deleted file mode 100644 index 58fd378..0000000 --- a/apps/monitoring/next.config.js +++ /dev/null @@ -1,26 +0,0 @@ -/** @type {import('next').NextConfig} */ -module.exports = { - reactStrictMode: true, - transpilePackages: ["@saleor/apps-shared", "@saleor/apps-ui", "@saleor/react-hook-form-macaw"], - rewrites() { - /** - * For dev/preview Next.js can work as a proxy and redirect unknown paths to provided backend address - * - * In production, when env is not provided, frontend will call its relative path and reverse proxy will do the rest - */ - const backendPath = process.env.MONITORING_APP_API_URL; - - if(!backendPath) { - throw new Error('Please set MONITORING_APP_API_URL variable') - } - - return { - fallback: [ - { - source: "/:path*", - destination: `${backendPath}/:path*`, - }, - ], - }; - }, -}; diff --git a/apps/monitoring/package.json b/apps/monitoring/package.json deleted file mode 100644 index 769285c..0000000 --- a/apps/monitoring/package.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "name": "saleor-app-monitoring", - "version": "1.1.0", - "scripts": { - "build": "pnpm generate && next build", - "dev": "pnpm generate && NODE_OPTIONS='--inspect' next dev", - "generate": "graphql-codegen", - "lint": "next lint", - "lint:fix": "eslint --fix .", - "start": "next start", - "test": "vitest" - }, - "dependencies": { - "@material-ui/core": "^4.12.4", - "@material-ui/icons": "^4.11.3", - "@material-ui/lab": "4.0.0-alpha.61", - "@saleor/app-sdk": "0.41.1", - "@saleor/apps-shared": "workspace:*", - "@saleor/apps-ui": "workspace:*", - "@saleor/macaw-ui": "0.8.0-pre.95", - "@saleor/react-hook-form-macaw": "workspace:*", - "@urql/exchange-auth": "^2.1.4", - "@vitejs/plugin-react": "4.0.0", - "clsx": "^1.2.1", - "graphql": "16.6.0", - "graphql-tag": "^2.12.6", - "jsdom": "^20.0.3", - "next": "13.4.8", - "pino": "^8.14.1", - "pino-pretty": "^10.0.0", - "react": "18.2.0", - "react-dom": "18.2.0", - "react-hook-form": "^7.43.9", - "urql": "^4.0.4", - "vite": "4.3.9", - "vitest": "0.31.3" - }, - "devDependencies": { - "@graphql-codegen/cli": "3.2.2", - "@graphql-codegen/introspection": "3.0.1", - "@graphql-codegen/schema-ast": "^3.0.1", - "@graphql-codegen/typed-document-node": "3.0.2", - "@graphql-codegen/typescript": "3.0.2", - "@graphql-codegen/typescript-operations": "3.0.2", - "@graphql-codegen/typescript-urql": "3.7.3", - "@graphql-typed-document-node/core": "3.2.0", - "@testing-library/react": "^13.4.0", - "@testing-library/react-hooks": "^8.0.1", - "@types/react": "18.2.5", - "@types/react-dom": "18.2.5", - "eslint": "8.44.0", - "eslint-config-saleor": "workspace:*", - "typescript": "5.1.6" - }, - "private": true -} diff --git a/apps/monitoring/src/assets/datadog/dd_logo_h_rgb.svg b/apps/monitoring/src/assets/datadog/dd_logo_h_rgb.svg deleted file mode 100644 index f6f77fa..0000000 --- a/apps/monitoring/src/assets/datadog/dd_logo_h_rgb.svg +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/monitoring/src/assets/datadog/dd_logo_h_white.svg b/apps/monitoring/src/assets/datadog/dd_logo_h_white.svg deleted file mode 100644 index 5334c98..0000000 --- a/apps/monitoring/src/assets/datadog/dd_logo_h_white.svg +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/apps/monitoring/src/assets/logzio/1584985593-blue-horizontal.svg b/apps/monitoring/src/assets/logzio/1584985593-blue-horizontal.svg deleted file mode 100644 index 616abaa..0000000 --- a/apps/monitoring/src/assets/logzio/1584985593-blue-horizontal.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/apps/monitoring/src/assets/new-relic/new_relic_logo_horizontal.svg b/apps/monitoring/src/assets/new-relic/new_relic_logo_horizontal.svg deleted file mode 100644 index c20a227..0000000 --- a/apps/monitoring/src/assets/new-relic/new_relic_logo_horizontal.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/monitoring/src/datadog-urls.ts b/apps/monitoring/src/datadog-urls.ts deleted file mode 100644 index 257afa9..0000000 --- a/apps/monitoring/src/datadog-urls.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { DatadogSite } from "../generated/graphql"; - -export const API_KEYS_LINKS: { [key in DatadogSite]: string } = { - [DatadogSite.Us1]: "https://app.datadoghq.com/organization-settings/api-keys", - [DatadogSite.Us3]: "https://us3.datadoghq.com/organization-settings/api-keys", - [DatadogSite.Us5]: "https://us5.datadoghq.com/organization-settings/api-keys", - [DatadogSite.Eu1]: "https://app.datadoghq.eu/organization-settings/api-keys", - [DatadogSite.Us1Fed]: "https://app.ddog-gov.com/organization-settings/api-keys", -}; - -export const DATADOG_SITES_LINKS: { [key in DatadogSite]: string } = { - [DatadogSite.Us1]: "https://datadoghq.com", - [DatadogSite.Us3]: "https://us3.datadoghq.com", - [DatadogSite.Us5]: "https://us5.datadoghq.com", - [DatadogSite.Eu1]: "https://datadoghq.eu", - [DatadogSite.Us1Fed]: "https://ddog-gov.com", -}; diff --git a/apps/monitoring/src/graphql-provider.tsx b/apps/monitoring/src/graphql-provider.tsx deleted file mode 100644 index 6780544..0000000 --- a/apps/monitoring/src/graphql-provider.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { useAppBridge } from "@saleor/app-sdk/app-bridge"; -import { PropsWithChildren } from "react"; -import { cacheExchange, createClient as urqlCreateClient, fetchExchange, Provider } from "urql"; -import { authExchange } from "@urql/exchange-auth"; - -/** - * Local client creation. Contrary to other apps, Monitoring frontend doesnt contact Saleor directly, - * but calls Python-based service which also provides graphQL endpoint. - * - * App calls /graphql/ which is rewritten MONITORING_APP_API_URL. See next.config.js - */ -const createGraphQLClient = ({ - graphql, - saleorApiUrl, - token, -}: { - graphql: string; - saleorApiUrl: string; - token: string; -}) => { - return urqlCreateClient({ - url: graphql, - exchanges: [ - cacheExchange, - authExchange(async (utils) => { - return { - addAuthToOperation(operation) { - const headers: Record = token - ? { - "Authorization-Bearer": token, - "Saleor-Api-Url": saleorApiUrl, - } - : {}; - - return utils.appendHeaders(operation, headers); - }, - didAuthError(error) { - return error.graphQLErrors.some((e) => e.extensions?.code === "FORBIDDEN"); - }, - async refreshAuth() {}, - }; - }), - fetchExchange, - ], - }); -}; - -export function GraphQLProvider(props: PropsWithChildren<{}>) { - const { appBridgeState } = useAppBridge(); - const saleorApiUrl = appBridgeState?.saleorApiUrl!; - const token = appBridgeState?.token!; - - const client = createGraphQLClient({ - saleorApiUrl, - token, - graphql: "/graphql/", - }); - - return ; -} diff --git a/apps/monitoring/src/lib/theme-synchronizer.tsx b/apps/monitoring/src/lib/theme-synchronizer.tsx deleted file mode 100644 index 3386f49..0000000 --- a/apps/monitoring/src/lib/theme-synchronizer.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { useAppBridge } from "@saleor/app-sdk/app-bridge"; -import { useTheme } from "@saleor/macaw-ui/next"; -import { useEffect } from "react"; - -// todo move to shared -export function ThemeSynchronizer() { - const { appBridgeState } = useAppBridge(); - const { setTheme } = useTheme(); - - useEffect(() => { - if (!setTheme || !appBridgeState?.theme) { - return; - } - - if (appBridgeState.theme === "light") { - setTheme("defaultLight"); - } - - if (appBridgeState.theme === "dark") { - setTheme("defaultDark"); - } - }, [appBridgeState?.theme, setTheme]); - - return null; -} diff --git a/apps/monitoring/src/pages/_app.tsx b/apps/monitoring/src/pages/_app.tsx deleted file mode 100644 index 4542346..0000000 --- a/apps/monitoring/src/pages/_app.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import "@saleor/macaw-ui/next/style"; -import "../style.css"; -import { AppBridge, AppBridgeProvider } from "@saleor/app-sdk/app-bridge"; -import React from "react"; -import { AppProps } from "next/app"; -import { RoutePropagator } from "@saleor/app-sdk/app-bridge/next"; -import { ThemeSynchronizer } from "../lib/theme-synchronizer"; -import { Box, ThemeProvider } from "@saleor/macaw-ui/next"; -import { NoSSRWrapper } from "@saleor/apps-shared"; -import { GraphQLProvider } from "../graphql-provider"; - -/** - * Ensure instance is a singleton. - */ -export const appBridgeInstance = typeof window !== "undefined" ? new AppBridge() : undefined; - -function NextApp({ Component, pageProps }: AppProps) { - return ( - - - - - - - - - - - - - - ); -} - -export default NextApp; diff --git a/apps/monitoring/src/pages/configuration/[[...path]].tsx b/apps/monitoring/src/pages/configuration/[[...path]].tsx deleted file mode 100644 index 653c3ce..0000000 --- a/apps/monitoring/src/pages/configuration/[[...path]].tsx +++ /dev/null @@ -1,96 +0,0 @@ -import { NextPage } from "next"; -import React, { useEffect } from "react"; -import { NoProvidersConfigured } from "../../ui/no-providers-configured"; -import { useRouter } from "next/router"; -import { DatadogConfig } from "../../ui/datadog/datadog-config"; -import { DatadogSite, useConfigQuery } from "../../../generated/graphql"; -import { useAppBridge } from "@saleor/app-sdk/app-bridge"; -import { DATADOG_SITES_LINKS } from "../../datadog-urls"; -import { Box, Button, Text } from "@saleor/macaw-ui/next"; -import { Breadcrumbs, TextLink } from "@saleor/apps-ui"; - -const useActiveProvider = () => { - const router = useRouter(); - - const selectedProvider = router.query?.path && router.query.path[0]; - - return selectedProvider ?? null; -}; - -const ConfigurationPage = () => { - const [configuration, fetchConfiguration] = useConfigQuery(); - const { appBridge } = useAppBridge(); - - const datadogCredentials = configuration.data?.integrations.datadog?.credentials; - const datadogError = configuration.data?.integrations.datadog?.error; - - const { push } = useRouter(); - - useEffect(() => { - fetchConfiguration(); - }, [fetchConfiguration]); - - const selectedProvider = useActiveProvider(); - - if (configuration.fetching && !configuration.data) { - return Loading...; - } - - if (selectedProvider === "datadog") { - return ; - } - - if (!configuration.data?.integrations.datadog) { - return ; - } - - // when configured and everything is fine - if (datadogCredentials && !datadogError) { - const site = configuration.data?.integrations.datadog?.credentials.site ?? DatadogSite.Us1; - - return ( - - - App configured - - - Visit{" "} - - Datadog - {" "} - to access your logs - - - - ); - } - - if (datadogError) { - return ( - - - Configuration Error - - {datadogError} - - - ); - } - - return null; -}; - -export default ConfigurationPage; diff --git a/apps/monitoring/src/pages/index.tsx b/apps/monitoring/src/pages/index.tsx deleted file mode 100644 index d85150f..0000000 --- a/apps/monitoring/src/pages/index.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { NextPage } from "next"; -import { useAppBridge } from "@saleor/app-sdk/app-bridge"; -import { useEffect } from "react"; -import { isInIframe } from "@saleor/apps-shared"; -import { useRouter } from "next/router"; -import { Box, Text } from "@saleor/macaw-ui/next"; - -/** - * This is page publicly accessible from your app. - * You should probably remove it. - */ -const IndexPage: NextPage = () => { - const { appBridgeState } = useAppBridge(); - const { replace } = useRouter(); - - useEffect(() => { - if (appBridgeState?.ready) { - replace("/configuration"); - } - }, [appBridgeState?.ready, replace]); - - if (isInIframe()) { - return Loading...; - } - - return ( - - - Saleor Monitoring - - Install App in Saleor Dashboard to use it - - ); -}; - -export default IndexPage; diff --git a/apps/monitoring/src/public/logo.png b/apps/monitoring/src/public/logo.png deleted file mode 100644 index 632857161a058c6a847264e0b22d736b6845ae49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7383 zcmeHMYdDnayMJad2vN@DQ2r(5kSJ>kvtlCWGZDs; zR2YZJX&go=%rGO2(~Ozful3*i%l@#hYhTy;us`e%bG`5V%=_HW;lA(RegB^4(Ro`7 zu^kFK003fEmS-FQfJ3ivAcTM(%;>Ky=plT=(lrbK5y|Zz3}n8NgBoFB4i=|C8F3F4 z68Qa0&zS;HnJlv9EdaotAgeQ`7ouVG3HL;g!R)DTJmZL^dw(6TB30paLmOT^Fi%L5 z;I?i5r!Gf>nvkx{+If{Qi|MKn}^7Ovi309oyOJsKNduG z1TFYmEYbIon_g>1nmu>_@=z;uMF2#ER?fYD{g6cE9CgdCr<>Fyr24FL26-p;NT2_Z za%p4G>m*6LYt|6U$*D^8gM*{?QlSl!0-bJVOZ^phQ8?HUgE@=Qc->2be8`)Pj{FbY z&E_+(iFaBAk(rYr$u=z`n}SA*XH@`$7Vat)62$(Nx}Mj|k^vJDoc_0b^vKP#4P-$~ z+FYyQ_5*X@4F94d&i?(4Ce-{7aIQT~|a2_po*ghb$6!-cy1Y?%~(JIn|7@hfXL~ zya98QL&G^naziW_D#f<9?r|KtZt+v43;v=GYx(IrI%P0NNct_BuD|pgOF9fgo>r6@Wv34j%GsT`Yg{zVfL_^=kn2Mjk8Gho>t6 zFC~T#Sp^goJ!~CgwNtbLOFW%GK41KR5f=t7xcR-|vMD3$)NlBB%2QYhVcmrU=<3q~Sb!+j3^Wi3PIQ9S}8PtpRiD6zp3=sr< z(Ps9Mom&hN=tVQH$OEK|8$DvZw#AJn2&!~ziwCv+*7-q7(rD@kDPe$t2A{0#BjLD% z2_Xom_2?ImQeu`C3|z^3xZzt|!wPpwh_s?-2bJq-o@(SQB_ z%m0~8&{ybFFHJJM95g?9@Z*8YS5_Dx-O1LA{=V$P0{)q9*yfd*^0-}n;&4ok!o-?O zVhH-g5Pi$kZ>rS*Q)>k~634h^!(BSx{fd1O=bW&jV&sY_F;$owHmPXUn==_}rU|mt zItZ)NiywcyJPixn4_uyw*S0S8^C9BpRQDovgn-k2k5vjgJ2$dm>&~|qTkEGoIUkzV zgewj);HVDs<0gBuTGw0JRPF~&aC$$!DVThedhYmW)lE1?TAp%iMe&ISy6`@;wt?E( zLh^WmO_Knc?h0G#Yc0M}CKqfP2P3~P#zTCbGrkMdy zR{jY~lZ#v3X(ksgWePW}FXfu+(gM@)!XUlId)<0y>(2v?ZIh3HO9GfG8~A4IU!Z$l zB~1P1UlT%r5zwxtBXHh?iqW=)jVA$={gbtOtg~KC^D5&i6>>1b>r0%|&G?58I)s4C z^C1b3ZK>Q_J+cb=@9q#s)_G?i|MXa^Vub`Gf2^a6;kZM;E2WqvBF4QTQ{>q4GDyzf zKfV?Bp)GV~ua_e#D#BBGM~0d!xp!n^){ea}_GP)`$bHJ@2P=s|Bg)N3W2sjzZ7y`S zY!Z&*%U`~&&i!yEW_)dCa?gC$>&pYfs!~)&? z3;>L%FaV!Y{>hglgnsv2UFYTY`nAqaGY|4=LoEmaJ)S4z>49D!zK$mQEO-BjIj{@p zn=AZMUwc0kC(@i^oG}m>)JdxRmYVT>IW?on6r4i|W6b3!n?XS_G$pJ_+%w;2bz478 z!i|S>M6SVMNIE{GTQb(`@#Td{OnlR9Kc8-ue-v^;7zF5eY_{X1d?d4{ZXd%j_(5%5 znciwho(eWSJ#)aRxP2-c>To@LY!c%wH%1Ffj*$dk-MT)S-2X5j z8KM3+++p0p4vMrx_Bn&x{#Z+?e@FX~uuU&MnhiJ~=;&u6EQjbt{5{a|Fvbc)1fe0u zHC`++_-DE^pr z&Ad9-vD?}IWukx(P*98WY1!yS(_hk=7ZgtV5#y9IlHZ?v{%N5jTbney;EZbN#~`en zZM>A@stwhSRBe7^cx#o~3)WSf(95ukG%g_ST-^}^0f}xSz0#$Wc}#a=Q|^X345`-R zQENJZmoH^*d}IFT8f@_OPc(CZ>YR%3g08gQ_&vp``=Y-*m3u4!fV9Cj!WglJ5_sKd zy?)~`bKD~Yo zkuUbx{|kD#yIgEb^DzL0FZKJzetdCrh5v71v^HvILT9tYwjF&q!_xouDC+e3XZ^)f7X`x^*1{s^khpXCF8j~8A$mr(ip9zjv8 z8YpZo?wm|mW2WII2c|;o1Vx`ffiQpz{rRa2k*r{iZ7oL2X+q}hhCnmJa2HDKou@+$ zo<|Yo9*I^KwDHMr`$6MzLlc8zOW27RC=hPhBF*qk25(w78rXF;xA{&(fw)JJ50>r= zq5FR;+m6HFqOOhZSHnr|_KD}hDY;FtSFfa6sP%e6S$}^2glT_EWF32Y)LI?xbP52` z^SY5Ci9zujL#0Jj4m0d<<%j_zT-m&_wklS=`{%Qro!`s&0Wud4i=QB>gbQ*8MK`+A zj3Z+@_}EP*IU;wNeVTgw<5mz?G*$RvQBO}2qmU^^uL9&|?xNzKXdv4?;<|Fu*7m(g>|75$h&nad^-W z`5g*N4H&3EL?~=5K2JYzJi^o8e2OKU>_bcfzy%*+m`k^Lt5P^YKo`7|zoW=o$2P=o zH6QdliPI2-1Ju2N7}kdz=LdD~%Dsk6HclljMxQ8Cj_s;KB3|(eRlujSi@80N*w#=i z@0FB6R!)riaqi|F+$cXF9L@LV>Q9(duGf<7HgzmA#YUDhcsJ%RoXWHSK+~I16wTq& zIb%D+Z6?9Y^^*Z;c>K<^BK9xO`;BZRWu9wL^bb7FH3-h{az=qkn#yf|&U2W7PqCJw zu)a_cUIDPY+Zyn0e*FhfS8N+PbRX__XxQsBLtA3p$C9ufRRCHp|MF^)0@H@MA~b6N zKJ>7+NK=a~>p!zb*a3+_WTmfAnxC^&r(6vEWhXvo)wxXcJhAI%_$qO(6)Kt%-elfX zR848t&(2o9?1&~7nzzHvQeH-t_ ze_L&P-J0`VwRwQEanZHP(*CKf)%!6@7Oj#WT+tGHeKB-(E~`uV3~2z_NV5$oRy9&@ zi^pthsT)W`UmPkYNpmjvk3=tW;SkvJeM(f9wRZ^AdMPHc11?fDZeIXx2VbqmY-SHkglGp9sflz`>TEjoH z7w8x{Q-Z#MJ|71MpNK~2c-5lUv1nd5xqQ-3+gS}ftr11Z;8>92v>MxN&x@&Llf}%? zm^MwMkq}TlJl}d1rNCbe1|dcnl%LI;Hq6<{>eWQ93IkQei{#B*zIuMAEQlfL)?E)d z@|(X5?krnt;{-Gr@7rurj++7h#aq{Qtw3Lk_>7fu#82u$P!|Cen6otv`Z)LUl27^oVc1*Zgf)ve(sy zm^k>^udR5-B=atsLk>2i~=p;`oSRc7Utt>aX-p?D>H8@Y@K|pg`nFImwtwzd^ zH|5NQFa8i=i1eb$Xf)whbRkr=$>!v?O+G-U3M;dxlWmx9sXqp)ea zfhG+q1A5?nj#T4ctKy7gQ|fAFTxQ#Ljwm|7i7Ne0nYX7Or2p)Kiui+xHOo#cLHYH)hSb7kX{9)4h@Gck>@<~a_ExRN3f+A?Z{BV`} zX*(+3l;INMwb+Y$whtFO@Kb_VZ?{egxy?k*F8*@++HpkukIUXW;g?+Oo`vz+{(QO}q2eo$-TUP}7;ZR$whIT-rT0rHr1EhG4` zU9b|fOoX-{A}Y#CC--_~iauWjgR4~Q`amW9Wf%6baeC)&aQNvy!c7pUJGa6d8|JFX zwdh-)g1pE{Q-Cm-7eel9Pry@`Oa-rG#@Mo5S=29;`^0rLg?;Fi(7RL@&3a1>i#`1m= z4;wKIu1nacH;YXV9W2r~$M!N}IoXIW2|t@S+()G3{S2)+t-E@!;IUIG!1)c(o&3#J zt?CaY1;@z52{AJ5c?P9=oj@Ff~@%D-%bQK0&y2ur7wW4Kj7-j>~?3j3UMRt%L z@Na1^t<~>NTG}D-#*pG#9W4RohX_Yrts20T;0t6tO&DdET1&-4*SCsQAQd6YUj=jA z>d#V(Os*H^$3uy}GsA+Sf3JCmvoX7p7kmuL*xzSJaMFR}*wJMVHfL;NzZ4BZxZC^1 zxD$unvfvrdhqgk((`^fNVBkhpxLNG}9{z_IGkhE6O)CpJFOHIcJ=WVWfD)VwM(71p zqiI4Zd6x!Uo401B$TvN6-vo=U76ObMMPpz znXq?XU&5B=e)uYgf%N_7u)X1kj-=%GQV^GU{n=q5U+t-Ntf~TJixOnaIK6u_ukuex z*nFh1;yJyjn(|`q%wgi+Cuk)j(dr;mUva9)M8_8ZC;#B%P_3UYf2Z-RGn-mOnb>(t zmk;#uL0});1^1t7h3XFy=jCnyjPzyUKJM#Ik^TgN-97+V|Dx}5q1;Lej@7)cb#Bov zGF>zH6{}Cd!~?3ldk1U?*Zj;;eY(&=v0bhSEg<(6l-Yr_&-zD*H2XmLL${IoCxcC$ zjqzR^ctk{@OW2XL1@$uKyTdSWt=u# zJNZR(d|mA2T&1m&=VJhNUsG(7dNni0bXoJCru$HZ`Olso{J+BgnNC49uN*+yYC|_N zpX_#Epc)-%p0LlhegI-2DM^v?8E#iyx!ch$W&bKTjlS#xz~;d(q|(%D+dFF+TX%9O zLC!=8Adk0HE|S_y*=tHIE>fYtL3Ku!;!2Y`EdA;h6emf}>1I*giwIJ;ht^&|=QR>0$WV19#hXLFuxti`S%kH4J z{^IedpDE9;o|FVg(s(AbP4FCcPC$uRI+qWjN?A3kg z+fB4Lztyd7s>Lp@8M;+|eegny=iYD_YW^NxJTY1SHN@>G7+{+EDR_St=Le!*#YWYO z!H&H8crVR%gSEJr-^kvMs^Ef4lb#c0c%r?&=Bfa)DuS{YpL$%1ADsW)Kap$hSK`T7 z^tvfImCX(R^=R0=^t(EA>+x4l8;>;XyzJ++2Rwq75a7}?m0NNMJY5mYy^XKN{8|Cv z{=U-9@+)LsWbsbS51!H%F(-9su8r8#1P5}@A5(WWGY)Vrx~&}`+{=d`Sr=<2)kO{! z0ww3{KYSyOG(~A)(d*M^l1F3#;M9^=x%Zfw;HijU?#N)UbgQs69Q5f?i&|e~yRI2= zyI3#!1!s2}FI^4|JC1_xUWx}@=aUVbn)(-mS-U~l9}tqBCI47oyH>*Mh-2?u|9R_V zoEYYJ$Q{$u->|wKCc9P7Pc9A<(DS*{e9Qu@-AR)09a%$O-{L(vfcbG*zC))glC3h_ zSdHF~PyqE!@_eN#wF%2(SLJ&l`moP~THp2E3t=>erY}lJr{2XKb6C*my6mjJqh)mS zt(N`AvZKw-n{Z5H!-zb}&~c-q19I~0Hm-Pouu5R(LS<#cY `************${keyLastChars}`; - -const ApiKeyHelperText = ({ site }: { site: DatadogSite }) => { - const url = API_KEYS_LINKS[site]; - const { appBridge } = useAppBridge(); - - return ( - - Get one{" "} - { - e.preventDefault(); - appBridge?.dispatch( - actions.Redirect({ - to: url, - newContext: true, - }) - ); - }} - > - here - - - ); -}; - -export const DatadogConfig = () => { - const [queryData, fetchConfig] = useConfigQuery(); - const [, mutateCredentials] = useUpdateCredentialsMutation(); - const [, deleteCredentials] = useDeleteDatadogCredentialsMutation(); - const router = useRouter(); - const { notifyError, notifySuccess } = useDashboardNotification(); - - const { register, handleSubmit, setValue, control, reset, watch } = useForm< - DataDogCredentialsInput & { - active: boolean; - } - >({ - defaultValues: { - site: DatadogSite.Us1, - apiKey: "", - active: true, - }, - }); - - const activeSite = watch("site"); - - useEffect(() => { - fetchConfig(); - }, [fetchConfig]); - - const updateValuesToCurrentConfig = () => { - const datadogConfig = queryData.data?.integrations.datadog; - - if (!datadogConfig) { - return; - } - - setValue("active", datadogConfig.active); - setValue("apiKey", buildMaskedKey(datadogConfig.credentials.apiKeyLast4)); - setValue("site", datadogConfig.credentials.site); - }; - - useEffect(() => { - const datadogConfig = queryData.data?.integrations.datadog; - - if (datadogConfig) { - updateValuesToCurrentConfig(); - } - }, [queryData.data, setValue]); - - if (queryData.fetching && !queryData.data) { - return Loading; - } - - return ( - - - Configuration - DataDog - - - - - - Configuration - - DataDog - - Configure your Datadog integration to send your Saleor metrics to Datadog. - - - { - return mutateCredentials({ - input: { - active: values.active, - credentials: { - apiKey: values.apiKey, - site: values.site, - }, - }, - }).then((res) => { - const updatedConfig = res.data?.updateDatadogConfig.datadog; - const errors = res.data?.updateDatadogConfig.errors; - - if (updatedConfig) { - setValue("active", updatedConfig.active); - setValue("apiKey", buildMaskedKey(updatedConfig.credentials.apiKeyLast4)); - setValue("site", updatedConfig.credentials.site); - - notifySuccess("Configuration updated", "Successfully updated Datadog settings"); - } - - if (errors?.length) { - notifyError("Error configuring Datadog", errors[0].message); - } - }); - })} - > - - - Active - - - } - control={control} - name={"apiKey"} - /> - {queryData.data?.integrations.datadog?.error && ( - {queryData.data?.integrations.datadog?.error} - )} - - - - - - - - ); -}; diff --git a/apps/monitoring/src/ui/no-providers-configured.tsx b/apps/monitoring/src/ui/no-providers-configured.tsx deleted file mode 100644 index cac506f..0000000 --- a/apps/monitoring/src/ui/no-providers-configured.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { Box, Button, Text } from "@saleor/macaw-ui/next"; -import Link from "next/link"; - -export const NoProvidersConfigured = () => ( - - - No providers configured - - You need to configure Datadog to enable the app - - - - -); diff --git a/apps/monitoring/tsconfig.json b/apps/monitoring/tsconfig.json deleted file mode 100644 index 99710e8..0000000 --- a/apps/monitoring/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "compilerOptions": { - "target": "es5", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "incremental": true - }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], - "exclude": ["node_modules"] -} diff --git a/apps/monitoring/turbo.json b/apps/monitoring/turbo.json deleted file mode 100644 index cb18e8f..0000000 --- a/apps/monitoring/turbo.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "$schema": "https://turbo.build/schema.json", - "extends": ["//"], - "pipeline": { - "build": { - "env": [ - "APL", - "APP_DEBUG", - "NODE_ENV", - "SECRET_KEY", - "ALLOWED_DOMAIN_PATTERN", - "REST_APL_ENDPOINT", - "REST_APL_TOKEN", - "NEXT_PUBLIC_SENTRY_DSN", - "SENTRY_DSN", - "NEXT_PUBLIC_SENTRY_DSN", - "SENTRY_ORG", - "SENTRY_PROJECT", - "SENTRY_AUTH_TOKEN", - "NEXT_PUBLIC_VERCEL_ENV", - "MONITORING_APP_API_URL", - "APP_IFRAME_BASE_URL", - "APP_API_BASE_URL" - ] - } - } -} diff --git a/apps/monitoring/vitest.config.ts b/apps/monitoring/vitest.config.ts deleted file mode 100644 index 1dde5bc..0000000 --- a/apps/monitoring/vitest.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import react from "@vitejs/plugin-react"; -import { defineConfig } from "vitest/config"; - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [react()], - test: { - passWithNoTests: true, - environment: "jsdom", - setupFiles: "./src/setup-tests.ts", - css: false, - }, -}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c1df61b..32b0c62 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1017,124 +1017,6 @@ importers: specifier: 5.1.6 version: 5.1.6 - apps/monitoring: - dependencies: - '@material-ui/core': - specifier: ^4.12.4 - version: 4.12.4(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) - '@material-ui/icons': - specifier: ^4.11.3 - version: 4.11.3(@material-ui/core@4.12.4)(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) - '@material-ui/lab': - specifier: 4.0.0-alpha.61 - version: 4.0.0-alpha.61(@material-ui/core@4.12.4)(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) - '@saleor/app-sdk': - specifier: 0.41.1 - version: 0.41.1(next@13.4.8)(react-dom@18.2.0)(react@18.2.0) - '@saleor/apps-shared': - specifier: workspace:* - version: link:../../packages/shared - '@saleor/apps-ui': - specifier: workspace:* - version: link:../../packages/ui - '@saleor/macaw-ui': - specifier: 0.8.0-pre.95 - version: 0.8.0-pre.95(@types/react-dom@18.2.5)(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) - '@saleor/react-hook-form-macaw': - specifier: workspace:* - version: link:../../packages/react-hook-form-macaw - '@urql/exchange-auth': - specifier: ^2.1.4 - version: 2.1.4(graphql@16.6.0) - '@vitejs/plugin-react': - specifier: 4.0.0 - version: 4.0.0(vite@4.3.9) - clsx: - specifier: ^1.2.1 - version: 1.2.1 - graphql: - specifier: 16.6.0 - version: 16.6.0 - graphql-tag: - specifier: ^2.12.6 - version: 2.12.6(graphql@16.6.0) - jsdom: - specifier: ^20.0.3 - version: 20.0.3 - next: - specifier: 13.4.8 - version: 13.4.8(@babel/core@7.22.8)(react-dom@18.2.0)(react@18.2.0) - pino: - specifier: ^8.14.1 - version: 8.14.1 - pino-pretty: - specifier: ^10.0.0 - version: 10.0.0 - react: - specifier: 18.2.0 - version: 18.2.0 - react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) - react-hook-form: - specifier: ^7.43.9 - version: 7.44.3(react@18.2.0) - urql: - specifier: ^4.0.4 - version: 4.0.4(graphql@16.6.0)(react@18.2.0) - vite: - specifier: 4.3.9 - version: 4.3.9(@types/node@18.15.3) - vitest: - specifier: 0.31.3 - version: 0.31.3(jsdom@20.0.3) - devDependencies: - '@graphql-codegen/cli': - specifier: 3.2.2 - version: 3.2.2(@babel/core@7.22.8)(@types/node@18.15.3)(graphql@16.6.0) - '@graphql-codegen/introspection': - specifier: 3.0.1 - version: 3.0.1(graphql@16.6.0) - '@graphql-codegen/schema-ast': - specifier: ^3.0.1 - version: 3.0.1(graphql@16.6.0) - '@graphql-codegen/typed-document-node': - specifier: 3.0.2 - version: 3.0.2(graphql@16.6.0) - '@graphql-codegen/typescript': - specifier: 3.0.2 - version: 3.0.2(graphql@16.6.0) - '@graphql-codegen/typescript-operations': - specifier: 3.0.2 - version: 3.0.2(graphql@16.6.0) - '@graphql-codegen/typescript-urql': - specifier: 3.7.3 - version: 3.7.3(graphql-tag@2.12.6)(graphql@16.6.0) - '@graphql-typed-document-node/core': - specifier: 3.2.0 - version: 3.2.0(graphql@16.6.0) - '@testing-library/react': - specifier: ^13.4.0 - version: 13.4.0(react-dom@18.2.0)(react@18.2.0) - '@testing-library/react-hooks': - specifier: ^8.0.1 - version: 8.0.1(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) - '@types/react': - specifier: 18.2.5 - version: 18.2.5 - '@types/react-dom': - specifier: 18.2.5 - version: 18.2.5 - eslint: - specifier: 8.44.0 - version: 8.44.0 - eslint-config-saleor: - specifier: workspace:* - version: link:../../packages/eslint-config-saleor - typescript: - specifier: 5.1.6 - version: 5.1.6 - apps/products-feed: dependencies: '@aws-sdk/client-s3':