From e597cb5bb5ac0d16347e927fd01ca22f598ddabe Mon Sep 17 00:00:00 2001 From: Nicolas Drebenstedt Date: Thu, 21 Nov 2024 17:17:32 +0100 Subject: [PATCH] setup artificial data generation --- .cruft.json | 14 + .dockerignore | 149 ++ .github/pull_request_template.md | 20 + .github/workflows/cookiecutter.yml | 88 + .github/workflows/cve-scan.yml | 77 + .github/workflows/documentation.yml | 82 + .github/workflows/linting.yml | 62 + .github/workflows/open-code.yml | 27 + .github/workflows/release.yml | 162 ++ .github/workflows/renovatebot.yml | 31 + .github/workflows/reviewing.yml | 31 + .github/workflows/testing.yml | 62 + .gitignore | 130 ++ .pre-commit-config.yaml | 40 + AUTHORS | 1 + CHANGELOG.md | 20 + CODE_OF_CONDUCT.md | 74 + Dockerfile | 34 + LICENSE | 21 + Makefile | 65 + README.md | 106 + SECURITY.md | 14 + assets/raw-data/artificial/README.md | 9 + assets/raw-data/artificial/asciimesh.bin | 1004 +++++++++ compose.yaml | 21 + docs/conf.py | 9 + docs/index.rst | 10 + docs/layout.html | 18 + mex.bat | 46 + mex/__init__.py | 3 + mex/artificial/__init__.py | 23 + mex/artificial/main.py | 95 + mex/py.typed | 0 pdm.lock | 2402 ++++++++++++++++++++++ pyproject.toml | 146 ++ renovate.json | 29 + requirements.txt | 5 + tests/__init__.py | 0 tests/conftest.py | 11 + tests/test_main.py | 6 + 40 files changed, 5147 insertions(+) create mode 100644 .cruft.json create mode 100644 .dockerignore create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/cookiecutter.yml create mode 100644 .github/workflows/cve-scan.yml create mode 100644 .github/workflows/documentation.yml create mode 100644 .github/workflows/linting.yml create mode 100644 .github/workflows/open-code.yml create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/renovatebot.yml create mode 100644 .github/workflows/reviewing.yml create mode 100644 .github/workflows/testing.yml create mode 100644 .gitignore create mode 100644 .pre-commit-config.yaml create mode 100644 AUTHORS create mode 100644 CHANGELOG.md create mode 100644 CODE_OF_CONDUCT.md create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 100644 SECURITY.md create mode 100644 assets/raw-data/artificial/README.md create mode 100644 assets/raw-data/artificial/asciimesh.bin create mode 100644 compose.yaml create mode 100644 docs/conf.py create mode 100644 docs/index.rst create mode 100644 docs/layout.html create mode 100644 mex.bat create mode 100644 mex/__init__.py create mode 100644 mex/artificial/__init__.py create mode 100644 mex/artificial/main.py create mode 100644 mex/py.typed create mode 100644 pdm.lock create mode 100644 pyproject.toml create mode 100644 renovate.json create mode 100644 requirements.txt create mode 100644 tests/__init__.py create mode 100644 tests/conftest.py create mode 100644 tests/test_main.py diff --git a/.cruft.json b/.cruft.json new file mode 100644 index 0000000..666048e --- /dev/null +++ b/.cruft.json @@ -0,0 +1,14 @@ +{ + "template": "https://github.com/robert-koch-institut/mex-template", + "commit": "a4f25ab84f9e485ad77eb03663a9cf486f7a5826", + "checkout": null, + "context": { + "cookiecutter": { + "project_name": "artificial", + "short_summary": "Create artificial data for the MEx project.", + "long_summary": "Create artificial extracted items, transform them into merged items and write the results into a configured sink.", + "_template": "https://github.com/robert-koch-institut/mex-template" + } + }, + "directory": null +} diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..5d04a72 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,149 @@ +# Byte-compiled files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.eggs/ +.installed.cfg +.pdm-build +.pdm-python +.Python +.web/ +*.egg +*.egg-info/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +lib/ +lib64/ +MANIFEST +parts/ +sdist/ +share/python-wheels/ +var/ +wheels/ + +# PyInstaller +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +tests/ +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +test*.jpeg +test*.png +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ +pytestdebug.log + +# Translations +*.mo +*.pot + +# Scrapy stuff +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# PEP 582; used by e.g. pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# Environments +*.env +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# ruff +.ruff_cache + +# PyCharm +.idea/ +.idea_modules/ + +# VisualStudioCode +.vscode/* +.history/ +*.code-workspace + +# SQLite databases +*.db + +# Default exports +*.ndjson +data/ +identity.csv +schema.json +tmp*/ +work/ + +# Docker specifics +**/.dockerignore +**/.git +**/.github +**/.gitignore +**/compose* +**/docker-compose* +**/Dockerfile* + +# Setup files +.bandit +.isort.cfg +.mypy.ini +.pdm-python +.pre-commit-config.yaml +.pydocstyle +Makefile +mex.bat +*.lock +poetry.toml +pytest.ini +requirements.txt diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..ed2c8a9 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,20 @@ +# PR Context + + +# Added + + +# Changes + + +# Deprecated + + +# Removed + + +# Fixed + + +# Security + diff --git a/.github/workflows/cookiecutter.yml b/.github/workflows/cookiecutter.yml new file mode 100644 index 0000000..9443a66 --- /dev/null +++ b/.github/workflows/cookiecutter.yml @@ -0,0 +1,88 @@ +name: Cookiecutter + +on: + push: + branches: ["main"] + tags: ["**"] + schedule: + - cron: "14 3 * * 1-5" + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }} + cancel-in-progress: true + +env: + PIP_NO_OPTION: on + PIP_NO_CLEAN: on + PIP_PREFER_BINARY: on + +jobs: + cruft: + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Checkout repo + uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.WORKFLOW_TOKEN }} + + - name: Cache requirements + uses: actions/cache@v4 + env: + cache-name: cache-requirements + with: + path: ~/.cache/pip + key: ${{ env.cache-name }}-${{ hashFiles('requirements.txt') }} + restore-keys: | + ${{ env.cache-name }}- + + - name: Setup python + uses: actions/setup-python@v5 + with: + python-version: 3.11 + + - name: Install requirements + run: make setup + + - name: Configure git + env: + MEX_BOT_EMAIL: ${{ vars.MEX_BOT_EMAIL }} + MEX_BOT_USER: ${{ vars.MEX_BOT_USER }} + SIGNING_KEY: ${{ secrets.SIGNING_KEY }} + SIGNING_PUB: ${{ secrets.SIGNING_PUB }} + run: | + eval "$(ssh-agent -s)" + pdm setup-commit-signing + + - name: Update template + env: + GH_TOKEN: ${{ secrets.WORKFLOW_TOKEN }} + run: | + if cruft check; then + echo template is up to date + exit 0 + fi + if [[ $(gh pr list --label cruft | wc -c) -ne 0 ]]; then + echo already seeing pull request + exit 0 + fi + template_url=$(python -c "print(__import__('json').load(open('.cruft.json'))['template'])") + template_ref=$(git ls-remote ${template_url} --heads main --exit-code | cut -c -6) + git checkout main + git checkout -b cruft/cookiecutter-template-${template_ref} + cruft update --skip-apply-ask + printf '# Changes\n\n- bumped cookiecutter template to %s/commit/%s\n' "$template_url" "$template_ref" > .cruft-pr-body + if [[ $(find . -type f -name "*.rej" | wc -l) -ne 0 ]]; then + printf '\n# Conflicts\n' >> .cruft-pr-body + fi + find . -type f -name "*.rej" | while read -r line ; do + printf '\n```' >> .cruft-pr-body + cat ${line} >> .cruft-pr-body + printf '```\n' >> .cruft-pr-body + done + git add --all --verbose + git commit --message "Bump cookiecutter template to $template_ref" --verbose + git push --set-upstream origin cruft/cookiecutter-template-${template_ref} --force --verbose + gh pr create --title "Bump cookiecutter template to $template_ref" --body-file .cruft-pr-body --label cruft --assignee ${{ vars.MEX_BOT_USER }} diff --git a/.github/workflows/cve-scan.yml b/.github/workflows/cve-scan.yml new file mode 100644 index 0000000..48b209c --- /dev/null +++ b/.github/workflows/cve-scan.yml @@ -0,0 +1,77 @@ +name: CVE Scan + +on: + push: + branches: ["main"] + tags: ["**"] + pull_request: + types: + - opened + - reopened + - synchronize + schedule: + - cron: "14 3 * * 1-5" + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + scan: + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Checkout repo + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Cache requirements + uses: actions/cache@v4 + env: + cache-name: cache-requirements + with: + path: ~/.cache/pip + key: ${{ env.cache-name }}-${{ hashFiles('requirements.txt') }} + restore-keys: | + ${{ env.cache-name }}- + + - name: Cache environment + uses: actions/cache@v4 + env: + cache-name: cache-environment + with: + path: ~/.cache/pip + key: ${{ env.cache-name }}-${{ hashFiles('*.lock') }} + restore-keys: | + ${{ env.cache-name }}- + + - name: Setup python + uses: actions/setup-python@v5 + with: + python-version: 3.11 + + - name: Install requirements + run: make setup + + - name: Export dependencies + run: | + mkdir --parents pdm + pdm export-all > pdm/requirements.txt + + - name: Run trivy + uses: aquasecurity/trivy-action@master + with: + format: 'sarif' + list-all-pkgs: 'true' + output: 'trivy-results.sarif' + scan-ref: '.' + scan-type: 'fs' + severity: 'MEDIUM,HIGH,CRITICAL' + + - name: Publish results + uses: github/codeql-action/upload-sarif@v3 + if: always() + with: + sarif_file: 'trivy-results.sarif' diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml new file mode 100644 index 0000000..1b753b9 --- /dev/null +++ b/.github/workflows/documentation.yml @@ -0,0 +1,82 @@ +name: Documentation + +on: + workflow_run: + workflows: [Release] + types: + - completed + workflow_dispatch: + +env: + PIP_NO_OPTION: on + PIP_NO_CLEAN: on + PIP_PREFER_BINARY: on + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: ${{ github.workflow }} + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Checkout repo + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Cache requirements + uses: actions/cache@v4 + env: + cache-name: cache-requirements + with: + path: ~/.cache/pip + key: ${{ env.cache-name }}-${{ hashFiles('requirements.txt') }} + restore-keys: | + ${{ env.cache-name }}- + + - name: Cache environment + uses: actions/cache@v4 + env: + cache-name: cache-environment + with: + path: ~/.cache/pip + key: ${{ env.cache-name }}-${{ hashFiles('*.lock') }} + restore-keys: | + ${{ env.cache-name }}- + + - name: Setup python + uses: actions/setup-python@v5 + with: + python-version: 3.11 + + - name: Setup pages + uses: actions/configure-pages@v5 + + - name: Install requirements + run: make install + + - name: Run sphinx + run: make docs + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: ./docs/dist + + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml new file mode 100644 index 0000000..4ce2650 --- /dev/null +++ b/.github/workflows/linting.yml @@ -0,0 +1,62 @@ +name: Linting + +on: + push: + branches: ["main"] + tags: ["**"] + pull_request: + types: + - opened + - reopened + - synchronize + workflow_dispatch: + +env: + PIP_NO_OPTION: on + PIP_NO_CLEAN: on + PIP_PREFER_BINARY: on + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + lint: + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Checkout repo + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Cache requirements + uses: actions/cache@v4 + env: + cache-name: cache-requirements + with: + path: ~/.cache/pip + key: ${{ env.cache-name }}-${{ hashFiles('requirements.txt') }} + restore-keys: | + ${{ env.cache-name }}- + + - name: Cache environment + uses: actions/cache@v4 + env: + cache-name: cache-environment + with: + path: ~/.cache/pip + key: ${{ env.cache-name }}-${{ hashFiles('*.lock') }} + restore-keys: | + ${{ env.cache-name }}- + + - name: Setup python + uses: actions/setup-python@v5 + with: + python-version: 3.11 + + - name: Install requirements + run: make install + + - name: Run linters + run: make linter diff --git a/.github/workflows/open-code.yml b/.github/workflows/open-code.yml new file mode 100644 index 0000000..a9fdf9f --- /dev/null +++ b/.github/workflows/open-code.yml @@ -0,0 +1,27 @@ +name: OpenCoDE + +on: + push: + branches: ["main"] + tags: ["**"] + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }} + cancel-in-progress: true + +jobs: + sync: + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Checkout repo + uses: actions/checkout@v4 + with: + ref: 'main' + fetch-depth: 0 + - name: Push main branch + run: | + git remote add opencode https://${{ secrets.OPENCODE_USER }}:${{ secrets.OPENCODE_TOKEN }}@gitlab.opencode.de/robert-koch-institut/mex/mex-artificial.git + git push opencode -f + git push opencode -f --tags diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..49d4eaa --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,162 @@ +name: Release + +run-name: bump ${{ inputs.version }} version by @${{ github.actor }} + +on: + workflow_dispatch: + inputs: + version: + type: choice + description: 'part of the project version to update' + options: + - major + - minor + - patch + required: true + +env: + PIP_NO_OPTION: on + PIP_NO_CLEAN: on + PIP_PREFER_BINARY: on + +permissions: + contents: write + packages: write + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: false + +jobs: + release: + runs-on: ubuntu-latest + timeout-minutes: 10 + outputs: + tag: ${{ steps.release.outputs.tag }} + steps: + - name: Checkout repo + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Cache requirements + uses: actions/cache@v4 + env: + cache-name: cache-requirements + with: + path: ~/.cache/pip + key: ${{ env.cache-name }}-${{ hashFiles('requirements.txt') }} + restore-keys: | + ${{ env.cache-name }}- + + - name: Setup python + uses: actions/setup-python@v5 + with: + python-version: 3.11 + + - name: Install requirements + run: make setup + + - name: Configure git + env: + MEX_BOT_EMAIL: ${{ vars.MEX_BOT_EMAIL }} + MEX_BOT_USER: ${{ vars.MEX_BOT_USER }} + SIGNING_KEY: ${{ secrets.SIGNING_KEY }} + SIGNING_PUB: ${{ secrets.SIGNING_PUB }} + run: | + eval "$(ssh-agent -s)" + pdm setup-commit-signing + + - name: Release new version + id: release + env: + GH_TOKEN: ${{ secrets.WORKFLOW_TOKEN }} + run: | + pdm release ${{ inputs.version }} + echo "tag=$(git describe --abbrev=0 --tags)" >> "$GITHUB_OUTPUT" + + containerize: + runs-on: ubuntu-latest + timeout-minutes: 10 + needs: release + steps: + - name: Checkout repo + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Cache requirements + uses: actions/cache@v4 + env: + cache-name: cache-requirements + with: + path: ~/.cache/pip + key: ${{ env.cache-name }}-${{ hashFiles('requirements.txt') }} + restore-keys: | + ${{ env.cache-name }}- + + - name: Setup python + uses: actions/setup-python@v5 + with: + python-version: 3.11 + + - name: Install requirements + run: make setup + + - name: Generate locked requirements.txt + run: | + pdm export --self --output locked-requirements.txt --no-hashes --without dev + + - name: Login to container registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{github.actor}} + password: ${{secrets.GITHUB_TOKEN}} + + - name: Build, tag and push docker image + run: | + docker build . \ + --tag ghcr.io/robert-koch-institut/mex-artificial:latest \ + --tag ghcr.io/robert-koch-institut/mex-artificial:${{ github.sha }} \ + --tag ghcr.io/robert-koch-institut/mex-artificial:${{ needs.release.outputs.tag }} + docker push --all-tags ghcr.io/robert-koch-institut/mex-artificial + + distribute: + runs-on: ubuntu-latest + timeout-minutes: 10 + needs: release + steps: + - name: Checkout repo + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Cache requirements + uses: actions/cache@v4 + env: + cache-name: cache-requirements + with: + path: ~/.cache/pip + key: ${{ env.cache-name }}-${{ hashFiles('requirements.txt') }} + restore-keys: | + ${{ env.cache-name }}- + + - name: Setup python + uses: actions/setup-python@v5 + with: + python-version: 3.11 + + - name: Install requirements + run: make setup + + - name: Build wheel and sdist distros and create a github release + env: + GH_TOKEN: ${{ secrets.WORKFLOW_TOKEN }} + PDM_CHECK_UPDATE: False + run: | + gh release create ${{ needs.release.outputs.tag }} --generate-notes --latest --verify-tag + pdm build --dest dist + for filename in dist/*; do + gh release upload ${{ needs.release.outputs.tag }} ${filename}; + done diff --git a/.github/workflows/renovatebot.yml b/.github/workflows/renovatebot.yml new file mode 100644 index 0000000..d31360a --- /dev/null +++ b/.github/workflows/renovatebot.yml @@ -0,0 +1,31 @@ +name: Renovate + +on: + push: + branches: ["main"] + schedule: + - cron: "14 3 * * 1-5" + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }} + cancel-in-progress: true + +jobs: + renovate: + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Checkout repo + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Run renovatebot + uses: renovatebot/github-action@v41.0.2 + env: + RENOVATE_GIT_PRIVATE_KEY: ${{ secrets.GPG_SIGNING_KEY }} + RENOVATE_REPOSITORIES: "robert-koch-institut/mex-artificial" + with: + configurationFile: renovate.json + token: ${{ secrets.WORKFLOW_TOKEN }} diff --git a/.github/workflows/reviewing.yml b/.github/workflows/reviewing.yml new file mode 100644 index 0000000..31fda00 --- /dev/null +++ b/.github/workflows/reviewing.yml @@ -0,0 +1,31 @@ +name: Reviewing + +on: + pull_request: + types: + - opened + - reopened + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + assignee: + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Add assignee + env: + GH_TOKEN: ${{ secrets.WORKFLOW_TOKEN }} + run: | + user_name="${{ github.event.pull_request.user.login }}" + user_type=$(gh api "users/${user_name}" --jq ".type") + echo $user_name is a $user_type + if [[ "$user_type" != "User" ]]; then + user_name="${{ vars.MEX_BOT_USER }}" + echo using $user_name instead + fi + if [[ -z "${{ github.event.pull_request.assignee.login }}" ]]; then + gh pr edit ${{ github.event.pull_request.html_url }} --add-assignee "${user_name}" + fi diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml new file mode 100644 index 0000000..e0b66f8 --- /dev/null +++ b/.github/workflows/testing.yml @@ -0,0 +1,62 @@ +name: Testing + +on: + push: + branches: ["main"] + tags: ["**"] + pull_request: + types: + - opened + - reopened + - synchronize + workflow_dispatch: + +env: + PIP_NO_OPTION: on + PIP_NO_CLEAN: on + PIP_PREFER_BINARY: on + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + test: + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Checkout repo + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Cache requirements + uses: actions/cache@v4 + env: + cache-name: cache-requirements + with: + path: ~/.cache/pip + key: ${{ env.cache-name }}-${{ hashFiles('requirements.txt') }} + restore-keys: | + ${{ env.cache-name }}- + + - name: Cache environment + uses: actions/cache@v4 + env: + cache-name: cache-environment + with: + path: ~/.cache/pip + key: ${{ env.cache-name }}-${{ hashFiles('*.lock') }} + restore-keys: | + ${{ env.cache-name }}- + + - name: Setup python + uses: actions/setup-python@v5 + with: + python-version: 3.11 + + - name: Install requirements + run: make install + + - name: Run test suite + run: make pytest diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ca0a6cd --- /dev/null +++ b/.gitignore @@ -0,0 +1,130 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.eggs/ +.installed.cfg +.pdm-build +.pdm-python +.Python +.web/ +*.egg +*.egg-info/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +lib/ +lib64/ +MANIFEST +parts/ +sdist/ +share/python-wheels/ +var/ +wheels/ + +# PyInstaller +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Testing / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +test*.jpeg +test*.png +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ +pytestdebug.log + +# Translations +*.mo +*.pot + +# Scrapy stuff +.scrapy + +# Sphinx documentation +docs/_build/ +docs/source/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# PEP 582 +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# Environments +*.env +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# ruff +.ruff_cache + +# cruft +.cruft-pr-body +*.rej + +# PyCharm +.idea/ +.idea_modules/ + +# VisualStudioCode +.vscode/* +.history/ +*.code-workspace + +# SQLite databases +*.db + +# Default exports +*.ndjson +data/ +identity.csv +schema.json +tmp*/ +work/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..ee8e3f2 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,40 @@ +fail_fast: false +default_language_version: + python: python3.11 +repos: + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.7.3 + hooks: + - id: ruff + args: [--fix, --exit-non-zero-on-fix] + - id: ruff-format + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 + hooks: + - id: pretty-format-json + name: json + args: [--autofix, --indent=4, --no-ensure-ascii] + exclude: .cruft.json + - id: check-yaml + name: yaml + exclude: templates\/[a-z_-]+.yaml + - id: end-of-file-fixer + name: eof + - id: trailing-whitespace + name: whitespaces + - id: fix-byte-order-marker + name: byte-order + - repo: https://github.com/pdm-project/pdm + rev: 2.20.1 + hooks: + - id: pdm-lock-check + name: pdm + - repo: local + hooks: + - id: mypy + name: mypy + entry: pdm mypy-daemon + files: ^mex/ + language: system + pass_filenames: false + types: [python] diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..be8c65e --- /dev/null +++ b/AUTHORS @@ -0,0 +1 @@ +@robert-koch-institut/mex-metadata-exchange diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..dbbd467 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,20 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +### Added + +### Changes + +### Deprecated + +### Removed + +### Fixed + +### Security diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..66cfe10 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,74 @@ +# Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and +maintainers pledge to make participation in our project and our community a +harassment-free experience for everyone, regardless of age, body size, disability, +ethnicity, sex characteristics, gender identity and expression, level of experience, +education, socio-economic status, nationality, personal appearance, race, religion, +or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery and unwelcome sexual attention or + advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic + address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project team members are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in response to +any instances of unacceptable behavior. + +Project team members have the right and responsibility to remove, edit, or reject +comments, commits, code, and other contributions that are not aligned to this +Code of Conduct, or to ban temporarily or permanently any contributor for other +behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies within all project spaces, and it also applies when an +individual is representing the project or its community in public spaces. Examples of +representing a project or community include using an official project e-mail address, +appearing as a project maintainer, or acting as an appointed representative at an online +or offline event. Representation of a project may be further defined and clarified by +the project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by +contacting the project team at mex@rki.de. All complaints will be reviewed and +investigated and will result in a response that is deemed necessary and appropriate to +the circumstances. The project team is obligated to maintain confidentiality with regard +to the reporter of an incident. Further details of specific enforcement policies may be +posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may +face temporary or permanent repercussions as determined by project, departmental +or organizational leadership roles. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..c87c6c4 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,34 @@ +# syntax=docker/dockerfile:1 + +FROM python:3.11 AS base + +LABEL org.opencontainers.image.authors="mex@rki.de" +LABEL org.opencontainers.image.description="Create artificial data for the MEx project." +LABEL org.opencontainers.image.licenses="MIT" +LABEL org.opencontainers.image.url="https://github.com/robert-koch-institut/mex-artificial" +LABEL org.opencontainers.image.vendor="robert-koch-institut" + +ENV PYTHONUNBUFFERED=1 +ENV PYTHONOPTIMIZE=1 + +ENV PIP_PROGRESS_BAR=off +ENV PIP_PREFER_BINARY=on +ENV PIP_DISABLE_PIP_VERSION_CHECK=on + +WORKDIR /app + +RUN adduser \ + --disabled-password \ + --gecos "" \ + --shell "/sbin/nologin" \ + --no-create-home \ + --uid "10001" \ + mex + +COPY . . + +RUN --mount=type=cache,target=/root/.cache/pip pip install -r locked-requirements.txt --no-deps + +USER mex + +CMD [ "artificial" ] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..25955ae --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Robert Koch-Institut + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..de91f0d --- /dev/null +++ b/Makefile @@ -0,0 +1,65 @@ +.PHONY: all test setup hooks install linter pytest wheel image run start docs +all: install test +test: linter pytest + +LATEST = $(shell git describe --tags $(shell git rev-list --tags --max-count=1)) +PWD = $(shell pwd) + +setup: + # install meta requirements system-wide + @ echo installing requirements; \ + pip --disable-pip-version-check install --force-reinstall -r requirements.txt; \ + +hooks: + # install pre-commit hooks when not in CI + @ if [ -z "$$CI" ]; then \ + pre-commit install; \ + fi; \ + +install: setup hooks + # install packages from lock file in local virtual environment + @ echo installing package; \ + pdm install-all; \ + +linter: + # run the linter hooks from pre-commit on all files + @ echo linting all files; \ + pdm lint; \ + +pytest: + # run the pytest test suite with all unit tests + @ echo running unit tests; \ + pdm unit; \ + +wheel: + # build the python package + @ echo building wheel; \ + pdm wheel; \ + +image: + # build the docker image + @ echo building docker image mex-artificial:${LATEST}; \ + export DOCKER_BUILDKIT=1; \ + docker build \ + --tag rki/mex-artificial:${LATEST} \ + --tag rki/mex-artificial:latest .; \ + +run: image + # run the service as a docker container + @ echo running docker container mex-artificial:${LATEST}; \ + docker run \ + --env MEX_ARTIFICIAL_HOST=0.0.0.0 \ + --publish 8081:8081 \ + rki/mex-artificial:${LATEST}; \ + +start: image + # start the service using docker compose + @ echo start mex-artificial:${LATEST} with compose; \ + export DOCKER_BUILDKIT=1; \ + export COMPOSE_DOCKER_CLI_BUILD=1; \ + docker compose up --remove-orphans; \ + +docs: + # use sphinx to auto-generate html docs from code + @ echo generating docs; \ + pdm doc; \ diff --git a/README.md b/README.md new file mode 100644 index 0000000..97eb565 --- /dev/null +++ b/README.md @@ -0,0 +1,106 @@ +# MEx artificial + +Create artificial data for the MEx project. + +[![cookiecutter](https://github.com/robert-koch-institut/mex-artificial/actions/workflows/cookiecutter.yml/badge.svg)](https://github.com/robert-koch-institut/mex-template) +[![cve-scan](https://github.com/robert-koch-institut/mex-artificial/actions/workflows/cve-scan.yml/badge.svg)](https://github.com/robert-koch-institut/mex-artificial/actions/workflows/cve-scan.yml) +[![documentation](https://github.com/robert-koch-institut/mex-artificial/actions/workflows/documentation.yml/badge.svg)](https://robert-koch-institut.github.io/mex-artificial) +[![linting](https://github.com/robert-koch-institut/mex-artificial/actions/workflows/linting.yml/badge.svg)](https://github.com/robert-koch-institut/mex-artificial/actions/workflows/linting.yml) +[![open-code](https://github.com/robert-koch-institut/mex-artificial/actions/workflows/open-code.yml/badge.svg)](https://gitlab.opencode.de/robert-koch-institut/mex/mex-artificial) +[![testing](https://github.com/robert-koch-institut/mex-artificial/actions/workflows/testing.yml/badge.svg)](https://github.com/robert-koch-institut/mex-artificial/actions/workflows/testing.yml) + +## Project + +The Metadata Exchange (MEx) project is committed to improve the retrieval of RKI +research data and projects. How? By focusing on metadata: instead of providing the +actual research data directly, the MEx metadata catalog captures descriptive information +about research data and activities. On this basis, we want to make the data FAIR[^1] so +that it can be shared with others. + +Via MEx, metadata will be made findable, accessible and shareable, as well as available +for further research. The goal is to get an overview of what research data is available, +understand its context, and know what needs to be considered for subsequent use. + +RKI cooperated with D4L data4life gGmbH for a pilot phase where the vision of a +FAIR metadata catalog was explored and concepts and prototypes were developed. +The partnership has ended with the successful conclusion of the pilot phase. + +After an internal launch, the metadata will also be made publicly available and thus be +available to external researchers as well as the interested (professional) public to +find research data from the RKI. + +For further details, please consult our +[project page](https://www.rki.de/DE/Content/Forsch/MEx/MEx_node.html). + +[^1]: FAIR is referencing the so-called +[FAIR data principles](https://www.go-fair.org/fair-principles/) – guidelines to make +data Findable, Accessible, Interoperable and Reusable. + +**Contact** \ +For more information, please feel free to email us at [mex@rki.de](mailto:mex@rki.de). + +### Publisher + +**Robert Koch-Institut** \ +Nordufer 20 \ +13353 Berlin \ +Germany + +## Package + +Create artificial extracted items, transform them into merged items and write the +results into a configured sink. + +## License + +This package is licensed under the [MIT license](/LICENSE). All other software +components of the MEx project are open-sourced under the same license as well. + +## Development + +### Installation + +- on unix, consider using pyenv https://github.com/pyenv/pyenv + - get pyenv `curl https://pyenv.run | bash` + - install 3.11 `pyenv install 3.11` + - switch version `pyenv global 3.11` + - run `make install` +- on windows, consider using pyenv-win https://pyenv-win.github.io/pyenv-win/ + - follow https://pyenv-win.github.io/pyenv-win/#quick-start + - install 3.11 `pyenv install 3.11` + - switch version `pyenv global 3.11` + - run `.\mex.bat install` + +### Linting and testing + +- run all linters with `pdm lint` +- run only unit tests with `pdm unit` +- run unit and integration tests with `pdm test` + +### Updating dependencies + +- update boilerplate files with `cruft update` +- update global requirements in `requirements.txt` manually +- update git hooks with `pre-commit autoupdate` +- update package dependencies using `pdm update-all` +- update github actions in `.github/workflows/*.yml` manually + +### Creating release + +- run `pdm release RULE` to release a new version where RULE determines which part of + the version to update and is one of `major`, `minor`, `patch`. + +### Container workflow + +- build image with `make image` +- run directly using docker `make run` +- start with docker compose `make start` + +## Commands + +- run `pdm run {command} --help` to print instructions +- run `pdm run {command} --debug` for interactive debugging + +### artificial + +- `artificial` starts the artificial service diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..571b2ba --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,14 @@ +# Security Policy + +## Supported Versions + +This software package is currently in pre-release state. That means changes can +occur frequently and only the latest released version will be supported with +security and bug fixes. It is therefore not recommended to use this package in +productive environments. + +## Reporting a Vulnerability + +If you discover a vulnerability, please contact the author team directly via +[email](mailto:mex@rki.de). Pull-requests with proposed solutions are explicitly +welcomed as well. diff --git a/assets/raw-data/artificial/README.md b/assets/raw-data/artificial/README.md new file mode 100644 index 0000000..0b337f0 --- /dev/null +++ b/assets/raw-data/artificial/README.md @@ -0,0 +1,9 @@ +# mesh + +The file `asciimesh.bin` is an excerpt of the ASCII distribution of +Medical Subject Headings by the United States National Library of Medicine +obtained from: https://nlmpubs.nlm.nih.gov/projects/mesh/2023/asciimesh/d2023.bin + +This file is incomplete and only provided here for demonstration and testing purposes. +You can learn about MeSH and obtain a complete and current version of the file here: +https://www.nlm.nih.gov/databases/download/mesh.html diff --git a/assets/raw-data/artificial/asciimesh.bin b/assets/raw-data/artificial/asciimesh.bin new file mode 100644 index 0000000..4c6cb19 --- /dev/null +++ b/assets/raw-data/artificial/asciimesh.bin @@ -0,0 +1,1004 @@ +*NEWRECORD +RECTYPE = D +MH = Calcimycin +AQ = AA AD AE AG AI AN BI BL CF CH CL CS EC HI IM IP ME PD PK PO RE SD ST TO TU UR +ENTRY = A-23187|T109|T195|LAB|NRW|NLM (1991)|900308|abbcdef +ENTRY = A23187|T109|T195|LAB|NRW|UNK (19XX)|741111|abbcdef +ENTRY = Antibiotic A23187|T109|T195|NON|NRW|NLM (1991)|900308|abbcdef +ENTRY = A 23187 +ENTRY = A23187, Antibiotic +MN = D03.633.100.221.173 +PA = Anti-Bacterial Agents +PA = Calcium Ionophores +MH_TH = FDA SRS (2014) +MH_TH = NLM (1975) +ST = T109 +ST = T195 +N1 = 4-Benzoxazolecarboxylic acid, 5-(methylamino)-2-((3,9,11-trimethyl-8-(1-methyl-2-oxo-2-(1H-pyrrol-2-yl)ethyl)-1,7-dioxaspiro(5.5)undec-2-yl)methyl)-, (6S-(6alpha(2S*,3S*),8beta(R*),9beta,11alpha))- +RN = 37H9VM9WZL +RR = 52665-69-7 (Calcimycin) +PI = Antibiotics (1973-1974) +PI = Carboxylic Acids (1973-1974) +MS = An ionophorous, polyether antibiotic from Streptomyces chartreusensis. It binds and transports CALCIUM and other divalent cations across membranes and uncouples oxidative phosphorylation while inhibiting ATPase of rat liver mitochondria. The substance is used mostly as a biochemical tool to study the role of divalent cations in various biological systems. +OL = use CALCIMYCIN to search A 23187 1975-90 +PM = 91; was A 23187 1975-90 (see under ANTIBIOTICS 1975-83) +HN = 91(75); was A 23187 1975-90 (see under ANTIBIOTICS 1975-83) +MR = 20160527 +DA = 19741119 +DC = 1 +DX = 19840101 +UI = D000001 + +*NEWRECORD +RECTYPE = D +MH = Temefos +AQ = AA AD AE AG AI AN BL CF CH CL CS EC HI IM IP ME PD PK RE SD ST TO TU UR +ENTRY = Abate|T109|T131|TRD|NRW|NLM (1996)|941114|abbcdef +ENTRY = Difos|T109|T131|TRD|NRW|UNK (19XX)|861007|abbcdef +ENTRY = Temephos|T109|T131|TRD|EQV|NLM (1996)|941201|abbcdef +MN = D02.705.400.625.800 +MN = D02.705.539.345.800 +MN = D02.886.300.692.800 +PA = Insecticides +MH_TH = FDA SRS (2014) +MH_TH = INN (19XX) +MH_TH = USAN (1974) +ST = T109 +ST = T131 +N1 = Phosphorothioic acid, O,O'-(thiodi-4,1-phenylene) O,O,O',O'-tetramethyl ester +RN = ONP3ME32DL +RR = 3383-96-8 (Temefos) +AN = for use to kill or control insects, use no qualifiers on the insecticide or the insect; appropriate qualifiers may be used when other aspects of the insecticide are discussed such as the effect on a physiologic process or behavioral aspect of the insect; for poisoning, coordinate with ORGANOPHOSPHATE POISONING +PI = Insecticides (1966-1971) +MS = An organothiophosphate insecticide. +PM = 96; was ABATE 1972-95 (see under INSECTICIDES, ORGANOTHIOPHOSPHATE 1972-90) +HN = 96; was ABATE 1972-95 (see under INSECTICIDES, ORGANOTHIOPHOSPHATE 1972-90) +MR = 20130708 +DA = 19990101 +DC = 1 +DX = 19910101 +UI = D000002 + +*NEWRECORD +RECTYPE = D +MH = Abattoirs +AQ = CL EC ES HI LJ OG SD SN ST TD +PRINT ENTRY = Slaughterhouses|T073|NON|EQV|UNK (19XX)|740329|abcdef +ENTRY = Slaughter House|T073|NON|EQV|NLM (2017)|160525|abcdef +ENTRY = Slaughter Houses|T073|NON|EQV|NLM (2017)|160525|abcdef +ENTRY = Abattoir +ENTRY = House, Slaughter +ENTRY = Houses, Slaughter +ENTRY = Slaughterhouse +MN = J01.576.423.200.700.100 +MN = J03.540.020 +MH_TH = NLM (1966) +ST = T073 +MS = Places where animals are slaughtered and dressed for market. +MR = 20160608 +DA = 19990101 +DC = 1 +DX = 19660101 +UI = D000003 + +*NEWRECORD +RECTYPE = D +MH = Abbreviations as Topic +ENTRY = Acronyms as Topic|T170|NON|NRW|NLM (2008)|070629|abcdef +MN = L01.559.598.400.556.131 +MH_TH = NLM (2008) +ST = T170 +AN = includes acronyms; do not confuse with Publication Type ABBREVIATIONS +MS = Works about shortened forms of written words or phrases used for brevity. +PM = 2008; see ABBREVIATIONS 1963-2007 +HN = 2008(1963) +MR = 20170630 +DA = 19990101 +DC = 1 +DX = 19600101 +UI = D000004 + +*NEWRECORD +RECTYPE = D +MH = Abdomen +AQ = AB AH BS DG EM GD IR MI PA PH PP PS RE SU VI +ENTRY = Abdomens +MN = A01.923.047 +EC = injuries:Abdominal Injuries +MH_TH = NLM (1966) +ST = T029 +AN = general or unspecified; prefer specifics; ABDOMINAL MUSCLES and specifics are available; abrupt disease requiring emergency surgery equals ABDOMEN, ACUTE +MS = That portion of the body that lies between the THORAX and the PELVIS. +MR = 20160809 +DA = 19990101 +DC = 1 +DX = 19660101 +UI = D000005 + +*NEWRECORD +RECTYPE = D +MH = Abdomen, Acute +AQ = BL CF CI CL CN CO DG DH DI DT EC EH EM EN EP ET GE HI IM ME MI MO NU PA PC PP PS PX RH RT SU TH UR VE VI +ENTRY = Abdomens, Acute +ENTRY = Acute Abdomen +ENTRY = Acute Abdomens +MN = C23.888.592.612.054.200 +MN = C23.888.821.030.249 +MH_TH = NLM (1966) +ST = T184 +MS = A clinical syndrome with acute abdominal pain that is severe, localized, and rapid in onset. Acute abdomen may be caused by a variety of disorders, injuries, or diseases. +CATSH = CAT LIST +MR = 20170620 +DA = 19990101 +DC = 1 +DX = 19660101 +UI = D000006 + +*NEWRECORD +RECTYPE = D +MH = Abdominal Injuries +DE = ABDOMINAL INJ +AQ = BL CF CI CL CN CO DG DH DI DT EC EH EM EN EP ET GE HI IM ME MI MO NU PA PC PP PS PX RH RT SU TH UR VE VI +ENTRY = Injuries, Abdominal|T037|NON|EQV|UNK (19XX)|860101|INJ ABDOMINAL|abcdefv +ENTRY = Abdominal Injury +ENTRY = Injury, Abdominal +MN = C26.017 +MH_TH = NLM (1966) +ST = T037 +AN = general term for inj of organs in the abdom cavity; prefer specific organs /inj +MS = General or unspecified injuries involving organs in the abdominal cavity. +CATSH = CAT LIST +MR = 20100625 +DA = 19990101 +DC = 1 +DX = 19660101 +UI = D000007 + +*NEWRECORD +RECTYPE = D +MH = Abdominal Neoplasms +DE = ABDOMINAL NEOPL +AQ = BL BS CF CH CI CL CN CO DG DH DI DT EC EH EM EN EP ET GE HI IM ME MI MO NU PA PC PP PS PX RH RT SC SU TH UL UR VE VI +ENTRY = Abdominal Neoplasm +ENTRY = Neoplasm, Abdominal +ENTRY = Neoplasms, Abdominal +MN = C04.588.033 +MH_TH = NLM (1966) +ST = T191 +AN = general term for neoplasms of organs in the abdominal cavity; prefer specific organ/neoplasm terms; coordinate IM with histological type of neoplasm if given (IM) +MS = New abnormal growth of tissue in the ABDOMEN. +CATSH = CAT LIST +MR = 20151124 +DA = 19990101 +DC = 1 +DX = 19660101 +UI = D000008 + +*NEWRECORD +RECTYPE = D +MH = Abdominal Muscles +AQ = AB AH BS CH CY DE DG EM EN GD IM IN IR ME MI PA PH PP PS RE SU TR UL VI +ENTRY = Cremaster Muscle|T023|NON|NRW|NLM (2017)|160302|abcdef +ENTRY = Pyramidalis Muscle|T024|NON|NRW|NLM (2017)|160229|abcdef +ENTRY = Quadratus Abdominis|T023|NON|NRW|NLM (2017)|160415|abcdef +ENTRY = Transverse Abdominal|T023|NON|NRW|NLM (2017)|160229|abcdef +ENTRY = Transversus Abdominis|T023|NON|NRW|NLM (2017)|160229|abcdef +ENTRY = Abdominal Muscle +ENTRY = Abdominal, Transverse +ENTRY = Abdominals, Transverse +ENTRY = Abdomini, Quadratus +ENTRY = Abdominis, Quadratus +ENTRY = Cremaster Muscles +ENTRY = Muscle, Abdominal +ENTRY = Muscle, Cremaster +ENTRY = Muscle, Pyramidalis +ENTRY = Muscles, Abdominal +ENTRY = Muscles, Cremaster +ENTRY = Muscles, Pyramidalis +ENTRY = Pyramidalis Muscles +ENTRY = Quadratus Abdomini +ENTRY = Transverse Abdominals +MN = A02.633.567.050 +FX = Abdominal Wall +MH_TH = NLM (1966) +ST = T023 +AN = /growth: coordinate with MUSCLE DEVELOPMENT; /embryol: coordinate with MUSCLE DEVELOPMENT if pertinent +MS = Muscles forming the ABDOMINAL WALL including RECTUS ABDOMINIS; ABDOMINAL OBLIQUE MUSCLES, transversus abdominis, pyramidalis muscles and quadratus abdominis. +OL = use ABDOMINAL MUSCLES to search ABDOMINAL WALL 1966-92 +PM = 93; was ABDOMINAL WALL 1963-92 +HN = 93; was ABDOMINAL WALL 1966-92 +MR = 20160531 +DA = 19990101 +DC = 1 +DX = 19930101 +UI = D000009 + +*NEWRECORD +RECTYPE = D +MH = Abducens Nerve +AQ = AB AH BS CH CY DE DG EM EN GD IM ME MI PA PH PP PS RE SU TR UL VI +PRINT ENTRY = Cranial Nerve VI|T023|NON|EQV|NLM (1998)|960731|abcdef +PRINT ENTRY = Sixth Cranial Nerve|T023|NON|EQV|NLM (1998)|960731|abcdef +ENTRY = Abducent Nerve|T023|NON|EQV|UNK (19XX)|760526|abcdef +ENTRY = Nerve VI|T023|NON|EQV|NLM (2015)|140314|abcdef +ENTRY = Nervus Abducens|T023|NON|EQV|NLM (2015)|140314|abcdef +ENTRY = Abducen, Nervus +ENTRY = Abducens, Nervus +ENTRY = Abducent Nerves +ENTRY = Cranial Nerve VIs +ENTRY = Cranial Nerve, Sixth +ENTRY = Nerve VI, Cranial +ENTRY = Nerve VIs +ENTRY = Nerve VIs, Cranial +ENTRY = Nerve, Abducens +ENTRY = Nerve, Abducent +ENTRY = Nerve, Sixth Cranial +ENTRY = Nerves, Sixth Cranial +ENTRY = Nervus Abducen +ENTRY = Sixth Cranial Nerves +MN = A08.800.800.120.030 +FX = Abducens Nucleus +EC = injuries:Abducens Nerve Injury +MH_TH = NLM (1966) +ST = T023 +AN = neoplasms = ABDUCENS NERVE DISEASES (IM) + CRANIAL NERVE NEOPLASMS (IM) + histological type of neoplasm (IM) +MS = The 6th cranial nerve which originates in the ABDUCENS NUCLEUS of the PONS and sends motor fibers to the lateral rectus muscles of the EYE. Damage to the nerve or its nucleus disrupts horizontal eye movement control. +OL = use ABDUCENS NERVE to search ABDUCENT NERVE 1966-76 +PM = 77; was ABDUCENT NERVE 1963-76 +HN = 77; was ABDUCENT NERVE 1963-76 +MR = 20140620 +DA = 19990101 +DC = 1 +DX = 19660101 +UI = D000010 + +*NEWRECORD +RECTYPE = D +MH = Abelson murine leukemia virus +AQ = CH CL DE EN GD GE IM IP ME PH PY RE UL +PRINT ENTRY = Abelson Leukemia Virus|T005|EPO|EQV|NLM (1980)|990101|abcdef +ENTRY = Leukemia Virus, Abelson +ENTRY = Virus, Abelson Leukemia +MN = B04.613.807.375.525.020 +MN = B04.820.650.375.525.020 +MH_TH = NLM (2002) +ST = T005 +RN = txid11788 +AN = infection: coordinate with RETROVIRIDAE INFECTIONS + TUMOR VIRUS INFECTIONS + LEUKEMIA, EXPERIMENTAL +PI = Mouse Leukemia Viruses (1966-1979) +MS = A replication-defective strain of Murine leukemia virus (LEUKEMIA VIRUS, MURINE) capable of transforming lymphoid cells and producing a rapidly progressing lymphoid leukemia after superinfection with FRIEND MURINE LEUKEMIA VIRUS; MOLONEY MURINE LEUKEMIA VIRUS; or RAUSCHER VIRUS. +PM = 2002; see ABELSON LEUKEMIA VIRUS 1991-2001, see MOUSE LEUKEMIA VIRUSES 1980-1990 +HN = 2002 (1980) +MR = 20200813 +DA = 19790416 +DC = 1 +DX = 19910101 +UI = D000011 + +*NEWRECORD +RECTYPE = D +MH = Abetalipoproteinemia +AQ = BL CF CI CL CO DG DH DI DT EC EH EM EN EP ET GE HI IM ME MI MO NU PA PC PP PS PX RH RT SU TH UR VE VI +PRINT ENTRY = Bassen-Kornzweig Syndrome|T047|EPO|EQV|GHR (2014)|OMIM (2013)|ORD (2010)|UNK (19XX)|740329|abcdeeeef +PRINT ENTRY = Microsomal Triglyceride Transfer Protein Deficiency|T047|NON|EQV|NLM (2007)|OMIM (2013)|050720|MICROSOMAL TRIGLYCERIDE TRANSFER PROTEIN DEFIC|abcdeefv +ENTRY = Acanthocytosis|T047|NON|EQV|GHR (2014)|OMIM (2013)|111115|abcdeef +ENTRY = Bassen-Kornzweig Disease|T047|EPO|EQV|NLM (2000)|991104|BASSEN KORNZWEIG DIS|abcdefv +ENTRY = Betalipoprotein Deficiency Disease|T047|NON|EQV|GHR (2014)|NLM (2010)|ORD (2010)|090514|abcdeeef +ENTRY = Microsomal Triglyceride Transfer Protein Deficiency Disease|T047|NON|EQV|GHR (2014)|NLM (2000)|ORD (2010)|991104|MICROSOMAL TRIGLYCERIDE TRANSFER PROTEIN DEFIC DIS|abcdeeefv +ENTRY = Acanthocytoses +ENTRY = Bassen Kornzweig Disease +ENTRY = Bassen Kornzweig Syndrome +ENTRY = Betalipoprotein Deficiency Diseases +ENTRY = Deficiency Disease, Betalipoprotein +ENTRY = Deficiency Diseases, Betalipoprotein +ENTRY = Disease, Betalipoprotein Deficiency +ENTRY = Diseases, Betalipoprotein Deficiency +MN = C16.320.565.398.500.440.500 +MN = C18.452.584.500.875.440.500 +MN = C18.452.584.563.500.440.500 +MN = C18.452.648.398.500.440.500 +MH_TH = GHR (2014) +MH_TH = NLM (1964) +MH_TH = OMIM (2013) +MH_TH = ORD (2010) +ST = T047 +MS = An autosomal recessive disorder of lipid metabolism. It is caused by mutation of the microsomal triglyceride transfer protein that catalyzes the transport of lipids (TRIGLYCERIDES; CHOLESTEROL ESTERS; PHOSPHOLIPIDS) and is required in the secretion of BETA-LIPOPROTEINS (low density lipoproteins or LDL). Features include defective intestinal lipid absorption, very low serum cholesterol level, and near absent LDL. +PM = 1966 +HN = 1966(1964) +CATSH = CAT LIST +MR = 20210630 +DA = 19990101 +DC = 1 +DX = 19660101 +UI = D000012 + +*NEWRECORD +RECTYPE = D +MH = Congenital Abnormalities +DE = CONGEN ABNORM +AQ = BL CF CL DG DH DI DT EC EH EM EN EP ET GE HI IM ME MI MO NU PA PC PP PS PX RH RT SU TH UR VE VI +PRINT ENTRY = Birth Defects|T019|NON|EQV|UNK (19XX)|760508|abcdef +PRINT ENTRY = Congenital Defects|T019|NON|EQV|UNK (19XX)|770322|CONGEN DEFECTS|abcdefv +PRINT ENTRY = Deformities|T019|NON|EQV|UNK (19XX)|740329|abcdef +PRINT ENTRY = Fetal Anomalies|T019|NON|REL|NLM (2021)|191122|abcdef +PRINT ENTRY = Fetal Malformations|T019|NON|REL|NLM (2021)|191122|abcdef +ENTRY = Abnormalities, Congenital|T019|NON|EQV|UNK (19XX)|781218|ABNORM CONGEN|abcdefv +ENTRY = Defects, Congenital|T019|NON|EQV|UNK (19XX)|770322|DEFECTS CONGEN|abcdefv +ENTRY = Abnormality, Congenital +ENTRY = Anomaly, Fetal +ENTRY = Birth Defect +ENTRY = Congenital Abnormality +ENTRY = Congenital Defect +ENTRY = Defect, Birth +ENTRY = Defect, Congenital +ENTRY = Deformity +ENTRY = Fetal Anomaly +ENTRY = Fetal Malformation +ENTRY = Malformation, Fetal +MN = C16.131 +EC = chemically induced:Abnormalities, Drug-Induced +MH_TH = NLM (1980) +ST = T019 +AN = general only; prefer specifics or /abnorm with specific anatomical term or specific animal +MS = Malformations of organs or body parts during development in utero. +PM = 2008; see ABNORMALITIES 1963-2007 +HN = 2008 (1963) +CATSH = CAT LIST +MR = 20200116 +DA = 19990101 +DC = 1 +DX = 20080101 +UI = D000013 + +*NEWRECORD +RECTYPE = D +MH = Abnormalities, Drug-Induced +DE = ABNORM DRUG IND +AQ = BL CF CL DG DH DI DT EC EH EM EN EP ET GE HI IM ME MI MO NU PA PC PP PS PX RH RT SU TH UR VE VI +ENTRY = Drug-Induced Abnormalities|T019|NON|EQV|UNK (19XX)|771207|DRUG IND ABNORM|abcdefv +ENTRY = Abnormalities, Drug Induced +ENTRY = Abnormality, Drug-Induced +ENTRY = Drug Induced Abnormalities +ENTRY = Drug-Induced Abnormality +MN = C16.131.042 +FX = Teratogenesis +FX = Teratogens +MH_TH = NLM (1964) +ST = T019 +AN = IM; do not use /chem ind /compl /congen & do not coord with INFANT, NEWBORN, DISEASES; coord IM with specific chem /adv eff-pois-tox (IM) + specific organ /abnorm or specific abnorm /chem ind (IM); Manual 23.20.3 +MS = Congenital abnormalities caused by medicinal substances or drugs of abuse given to or taken by the mother, or to which she is inadvertently exposed during the manufacture of such substances. The concept excludes abnormalities resulting from exposure to non-medicinal chemicals in the environment. +PM = 64 +HN = 64 +CATSH = CAT LIST +MR = 20130708 +DA = 19990101 +DC = 1 +DX = 19640101 +UI = D000014 + +*NEWRECORD +RECTYPE = D +MH = Abnormalities, Multiple +DE = ABNORM MULTIPLE +AQ = BL CF CI CL DG DH DI DT EC EH EM EN EP ET GE HI IM ME MI MO NU PA PC PP PS PX RH RT SU TH UR VE VI +ENTRY = Multiple Abnormalities|T019|NON|EQV|UNK (19XX)|860101|MULTIPLE ABNORM|abcdefv +MN = C16.131.077 +FX = Intellectual Disability +MH_TH = NLM (1968) +ST = T019 +AN = coordinate with specific abnormalities +PI = Abnormalities (1966-1967) +MS = Congenital abnormalities that affect more than one organ or body structure. +PM = 68 +HN = 68 +CATSH = CAT LIST +MR = 20151201 +DA = 19990101 +DC = 1 +DX = 19680101 +UI = D000015 + +*NEWRECORD +RECTYPE = D +MH = Abnormalities, Radiation-Induced +DE = ABNORM RAD IND +AQ = BL CF CL DG DH DI DT EC EH EM EN EP ET GE HI IM ME MI MO NU PA PC PP PS PX RH RT SU TH UR VE VI +ENTRY = Radiation-Induced Abnormalities|T019|NON|EQV|UNK (19XX)|780320|RAD IND ABNORM|abcdefv +ENTRY = Abnormalities, Radiation Induced +ENTRY = Abnormality, Radiation-Induced +ENTRY = Radiation Induced Abnormalities +ENTRY = Radiation-Induced Abnormality +MN = C16.131.080 +MN = C26.733.031 +MN = G01.750.748.500.031 +MN = N06.850.460.350.850.500.031 +MN = N06.850.810.300.360.031 +FX = Teratogenesis +MH_TH = NLM (1979) +ST = T019 +AN = coordinate with specific abnormality +PI = Abnormalities (1966-1978) +PI = Radiation Injuries (1966-1978) +MS = Congenital changes in the morphology of organs produced by exposure to ionizing or non-ionizing radiation. +PM = 79 +HN = 79 +CATSH = CAT LIST +MR = 20150622 +DA = 19780320 +DC = 1 +DX = 19790101 +UI = D000016 + +*NEWRECORD +RECTYPE = D +MH = ABO Blood-Group System +AQ = AD AE AN BI BL CF CH CL EC GE HI IM IP ME PD PH PO TO TU UL UR +PRINT ENTRY = ABH Blood Group|T022|NON|EQV|UNK (19XX)|880607|abcdef +PRINT ENTRY = ABO Blood Group|T022|NON|EQV|NLM (2023)|210826|abcdef +PRINT ENTRY = ABO Factors|T129|NON|NRW|UNK (19XX)|750722|abcdef +ENTRY = Blood Group H Type 1 Antigen|T129|NON|NRW|UNK (19XX)|840305|abcdef +ENTRY = H Blood Group|T022|NON|EQV|UNK (19XX)|800804|abcdef +ENTRY = H Blood Group System|T022|NON|EQV|UNK (19XX)|840920|abcdef +ENTRY = ABO Blood Group System +ENTRY = Blood Group, ABH +ENTRY = Blood Group, ABO +ENTRY = Blood Group, H +ENTRY = Blood-Group System, ABO +ENTRY = Factors, ABO +ENTRY = System, ABO Blood-Group +MN = D23.050.301.290.031 +MN = D23.050.705.230.031 +MH_TH = NLM (1976) +ST = T022 +RN = 0 +AN = IM; coord with disease /blood (IM), not /immunol nor /genet; TN 230 +MS = The major human blood type system which depends on the presence or absence of two antigens A and B. Type O occurs when neither A nor B is present and AB when both are present. A and B are genetic factors that determine the presence of enzymes for the synthesis of certain glycoproteins mainly in the red cell membrane. +OL = use ABO BLOOD-GROUP SYSTEM to search ABO FACTORS 1966-75 +PM = 76; was ABO FACTORS 1963-75 +HN = 76; was ABO FACTORS 1963-75 +CATSH = CAT LIST +MR = 20211018 +DA = 19750725 +DC = 1 +DX = 19760101 +UI = D000017 + +*NEWRECORD +RECTYPE = D +MH = Abomasum +AQ = AB AH BS CH CY DE DG EM EN GD IM IN IR ME MI PA PH PP PS RE SU TR UL VI +ENTRY = Abomasums +MN = A13.869.106 +MH_TH = NLM (1968) +ST = T023 +AN = a ruminant's 4th stomach; dis: coord IM with STOMACH DISEASES /vet (IM); neopl: coord IM with STOMACH NEOPLASMS /vet (IM) + histol type /vet (IM); ulcer: coord IM with STOMACH ULCER /vet (IM) +PI = Stomach (1966-1967) +MS = The fourth stomach of ruminating animals. It is also called the "true" stomach. It is an elongated pear-shaped sac lying on the floor of the abdomen, on the right-hand side, and roughly between the seventh and twelfth ribs. It leads to the beginning of the small intestine. (From Black's Veterinary Dictionary, 17th ed) +PM = 68 +HN = 68 +MR = 19950518 +DA = 19990101 +DC = 1 +DX = 19680101 +UI = D000018 + +*NEWRECORD +RECTYPE = D +MH = Abortifacient Agents +AQ = AD AE AN BL CF CH CL CS EC HI IM IP ME PD PK PO RE SD ST TO TU UR +ENTRY = Abortifacient Effect|T039|NON|REL|NLM (2012)|110331|abcdef +ENTRY = Abortifacient Effects|T039|NON|REL|NLM (2012)|110331|abcdef +ENTRY = Abortifacients|T121|NON|EQV|NLM (1993)|911009|abcdef +ENTRY = Contraceptive Agents, Postconception|T121|NON|EQV|POPLINE (1978)|781218|abcdef +ENTRY = Agents, Abortifacient +ENTRY = Agents, Postconception Contraceptive +ENTRY = Effect, Abortifacient +ENTRY = Effects, Abortifacient +ENTRY = Postconception Contraceptive Agents +MN = D27.505.696.875.131 +MN = D27.505.954.705.131 +FX = Oxytocics +MH_TH = POPLINE (1978) +ST = T121 +RN = 0 +AN = use no qualifiers for abortifacients when used to interrupt pregnancy; note entry term ABORTIFACIENT EFFECT: use only for the abortifacient effect of a chemical substance +PI = Abortion, Induced (1970-1974) +MS = Chemical substances that interrupt pregnancy after implantation. +PM = 75 +HN = 75 +MR = 20140625 +DA = 19990101 +DC = 1 +DX = 19750101 +UI = D000019 + +*NEWRECORD +RECTYPE = D +MH = Abortifacient Agents, Nonsteroidal +AQ = AD AE AN BL CF CH CL CS EC HI IM IP ME PD PK PO RE SD ST TO TU UR +ENTRY = Abortifacient Agents, Non-Steroidal|T121|NON|EQV|UNK (19XX)|771207|abcdef +ENTRY = Abortifacient Agents, Non Steroidal +ENTRY = Agents, Non-Steroidal Abortifacient +ENTRY = Agents, Nonsteroidal Abortifacient +ENTRY = Non-Steroidal Abortifacient Agents +ENTRY = Nonsteroidal Abortifacient Agents +MN = D27.505.696.875.131.100 +MN = D27.505.954.705.131.100 +MH_TH = NLM (1975) +ST = T121 +RN = 0 +AN = do not use /ther use for use of the abortifacients as abortifacients +PI = Abortion, Induced (1970-1974) +PI = specific chemical (1971-1974) +MS = Non-steroidal chemical compounds with abortifacient activity. +PM = 91; was see under ABORTIFACIENT AGENTS 1975-90 +HN = 91(75); was see under ABORTIFACIENT AGENTS 1975-90 +MR = 20140625 +DA = 19741111 +DC = 1 +DX = 19910101 +UI = D000020 + +*NEWRECORD +RECTYPE = D +MH = Abortifacient Agents, Steroidal +AQ = AD AE AG AI AN BL CF CH CL CS EC HI IM IP ME PD PK PO RE SD ST TO TU UR +ENTRY = Steroid Abortifacients|T109|T121|NON|EQV|POPLINE (1978)|781218|abbcdef +ENTRY = Abortifacients, Steroid +ENTRY = Agents, Steroidal Abortifacient +ENTRY = Steroidal Abortifacient Agents +MN = D27.505.696.875.131.200 +MN = D27.505.954.705.131.200 +MH_TH = NLM (1975) +ST = T109 +ST = T121 +RN = 0 +AN = do not use /ther use for use of the abortifacients as abortifacients +PI = Abortion, Induced (1970-1974) +PI = specific chemical (1970-1974) +MS = Steroidal compounds with abortifacient activity. +PM = 91; was see under ABORTIFACIENT AGENTS 1975-90 +HN = 91(75); was see under ABORTIFACIENT AGENTS 1975-90 +MR = 20050630 +DA = 19741111 +DC = 1 +DX = 19910101 +UI = D000021 + +*NEWRECORD +RECTYPE = D +MH = Abortion, Spontaneous +AQ = BL CF CI CL DG DH DI DT EC EH EN EP ET GE HI IM ME MI MO NU PA PC PP PS PX RH RT SU TH UR VI +ENTRY = Abortion, Tubal|T047|NON|NRW|NLM (1980)|781218|abcdef +ENTRY = Early Pregnancy Loss|T047|NON|NRW|NLM (2018)|171204|abcdef +ENTRY = Miscarriage|T047|NON|NRW|NLM (1975)|171204|abcdef +ENTRY = Spontaneous Abortion|T047|NON|EQV|NLM (2003)|020304|abcdef +ENTRY = Abortions, Spontaneous +ENTRY = Abortions, Tubal +ENTRY = Early Pregnancy Losses +ENTRY = Loss, Early Pregnancy +ENTRY = Losses, Early Pregnancy +ENTRY = Miscarriages +ENTRY = Pregnancy Loss, Early +ENTRY = Pregnancy Losses, Early +ENTRY = Spontaneous Abortions +ENTRY = Tubal Abortion +ENTRY = Tubal Abortions +MN = C12.050.703.039 +MN = G08.686.784.769.496.125 +FX = Aborted Fetus +FX = Abortifacient Agents +EC = veterinary:Abortion, Veterinary +MH_TH = NLM (1999) +ST = T047 +AN = /chem ind permitted but do not confuse with ABORTION, INDUCED; check the tags HUMANS & FEMALE & PREGNANCY +MS = Expulsion of the product of FERTILIZATION before completing the term of GESTATION and without deliberate interference. +PM = 99; see ABORTION 1966-98; for ABORTION, SPONTANEOUS see ABORTION 1992-98 +HN = 99(63) +CATSH = CAT LIST +MR = 20210630 +DA = 19990101 +DC = 1 +DX = 19990101 +UI = D000022 + +*NEWRECORD +RECTYPE = D +MH = Abortion Applicants +AQ = CL ED HI LJ PX SN +PRINT ENTRY = Abortion Seekers|T101|NON|EQV|POPLINE (1978)|741111|abcdef +ENTRY = Abortion Seekers, Refused|T101|NON|NRW|POPLINE (1978)|781218|abcdef +ENTRY = Abortion Seekers, Repeated|T101|NON|NRW|POPLINE (1978)|781218|abcdef +ENTRY = Abortion Applicant +ENTRY = Abortion Seeker +ENTRY = Abortion Seeker, Refused +ENTRY = Abortion Seeker, Repeated +ENTRY = Applicant, Abortion +ENTRY = Applicants, Abortion +ENTRY = Refused Abortion Seeker +ENTRY = Refused Abortion Seekers +ENTRY = Repeated Abortion Seeker +ENTRY = Repeated Abortion Seekers +ENTRY = Seeker, Abortion +ENTRY = Seeker, Refused Abortion +ENTRY = Seeker, Repeated Abortion +ENTRY = Seekers, Abortion +ENTRY = Seekers, Refused Abortion +ENTRY = Seekers, Repeated Abortion +MN = M01.050 +MH_TH = NLM (1975) +ST = T101 +AN = don't forget also check tags HUMANS & FEMALE & PREGNANCY +PI = Abortion, Induced (1970-1974) +PI = Abortion, Therapeutic (1966-1974) +MS = Individuals requesting induced abortions. +PM = 76; was see under ABORTION 1975 +HN = 76(75); was see under ABORTION 1975 +MR = 20150623 +DA = 19741119 +DC = 1 +DX = 19760101 +UI = D000023 + +*NEWRECORD +RECTYPE = D +MH = Abortion, Criminal +AQ = AE CL EC EH ES HI LJ MO PC PX SN TD +PRINT ENTRY = Abortion, Illegal|T033|NON|EQV|POPLINE (1978)|770317|abcdef +ENTRY = Illegal Abortion|T033|NON|EQV|BIOETHICS (1989)|770317|abcdef +ENTRY = Abortions, Criminal +ENTRY = Abortions, Illegal +ENTRY = Criminal Abortion +ENTRY = Criminal Abortions +ENTRY = Illegal Abortions +MN = I01.198.240.089 +MH_TH = NLM (1966) +ST = T033 +AN = don't forget also check tags HUMANS & FEMALE & PREGNANCY; for abortifacients in crim abort see note on ABORTION, INDUCED +MS = Illegal termination of pregnancy. +MR = 20150623 +DA = 19990101 +DC = 1 +DX = 19660101 +UI = D000024 + +*NEWRECORD +RECTYPE = D +MH = Abortion, Eugenic +AQ = AE CL EC ED ES HI IS LJ MO MT NU PX RH SN ST TD VE +PRINT ENTRY = Eugenic Abortion|T061|NON|EQV|UNK (19XX)|741111|abcdef +ENTRY = Abortion, Selective|T061|NON|NRW|POPLINE (1994)|950322|abcdef +ENTRY = Selective Abortion|T061|NON|NRW|BIOETHICS (1974)|770317|abcdef +ENTRY = Abortions, Eugenic +ENTRY = Abortions, Selective +ENTRY = Eugenic Abortions +ENTRY = Selective Abortions +MN = E04.520.050.050 +MH_TH = NLM (1975) +ST = T061 +AN = add HUMANS or ANIMALS & FEMALE & PREGNANCY +MS = Abortion performed because of possible fetal defects. +PM = 91; was see under ABORTION, INDUCED 1975-90 +HN = 91(75); was see under ABORTION, INDUCED 1975-90 +CATSH = CAT LIST +MR = 20150623 +DA = 19741119 +DC = 1 +DX = 19910101 +UI = D000025 + +*NEWRECORD +RECTYPE = D +MH = Abortion, Habitual +AQ = BL CF CI CL DG DH DI DT EC EH EN EP ET GE HI IM ME MI MO NU PA PC PP PS PX RH RT SU TH UR VE VI +PRINT ENTRY = Abortion, Recurrent|T047|NON|EQV|NLM (1998)|960725|abcdef +PRINT ENTRY = Miscarriage, Recurrent|T047|NON|EQV|NLM (1999)|971008|abcdef +ENTRY = Recurrent Early Pregnancy Loss|T047|NON|EQV|NLM (2018)|170504|abcdef +ENTRY = Habitual Abortion +ENTRY = Habitual Abortions +ENTRY = Recurrent Abortion +ENTRY = Recurrent Abortions +ENTRY = Recurrent Miscarriage +ENTRY = Recurrent Miscarriages +MN = C12.050.703.039.089 +FX = Embryo Loss +FX = Fetal Death +MH_TH = NLM (1963) +ST = T047 +MS = Three or more consecutive spontaneous abortions. +CATSH = CAT LIST +MR = 20210630 +DA = 19990101 +DC = 1 +DX = 19660101 +UI = D000026 + +*NEWRECORD +RECTYPE = D +MH = Abortion, Incomplete +AQ = BL CF CI CL DG DH DI DT EC EH EN EP ET GE HI IM ME MI MO NU PA PP PS PX RH RT SU TH UR VE VI +ENTRY = Abortions, Incomplete +ENTRY = Incomplete Abortion +ENTRY = Incomplete Abortions +MN = C12.050.703.039.093 +MH_TH = NLM (1975) +ST = T047 +AN = restrict to spontaneous, not induced abortions; check the tags FEMALE & PREGNANCY +PI = Abortion, Spontaneous (1966-1974) +MS = Premature loss of PREGNANCY in which not all the products of CONCEPTION have been expelled. +PM = 75 +HN = 75 +CATSH = CAT LIST +MR = 20210630 +DA = 19741111 +DC = 1 +DX = 19750901 +UI = D000027 + +*NEWRECORD +RECTYPE = D +MH = Abortion, Induced +DE = ABORTION IND +AQ = AE CL EC ED ES HI IS LJ MO MT NU PX RH SN ST TD VE +PRINT ENTRY = Embryotomy|T061|NON|NRW|UNK (19XX)|850606|abcdef +ENTRY = Abortion (Induced)|T061|NON|EQV|NLM (2000)|991109|abcdef +ENTRY = Abortion Failure|T046|T068|NON|REL|POPLINE (1994)|950322|abbcdef +ENTRY = Abortion History|T184|NON|REL|POPLINE (1978)|781218|ABORTION HIST|abcdefv +ENTRY = Abortion Rate|T081|NON|REL|POPLINE (1978)|781218|abcdef +ENTRY = Abortion Technics|T061|NON|REL|NLM (1979)|781218|abcdef +ENTRY = Abortion Techniques|T061|NON|REL|NLM (1991)|900110|abcdef +ENTRY = Abortion, Drug-Induced|T061|NON|NRW|POPLINE (1978)|781218|ABORTION DRUG IND|abcdefv +ENTRY = Abortion, Rivanol|T061|NON|NRW|POPLINE (1978)|790927|abcdef +ENTRY = Abortion, Saline-Solution|T061|NON|NRW|POPLINE (1978)|781218|ABORTION SALINE SOL|abcdefv +ENTRY = Abortion, Soap-Solution|T061|NON|NRW|POPLINE (1978)|781218|ABORTION SOAP SOL|abcdefv +ENTRY = Anti-Abortion Groups|T093|NON|REL|POPLINE (1986)|850808|abcdef +ENTRY = Fertility Control, Postconception|T061|NON|BRD|POPLINE (1978)|781218|abcdef +ENTRY = Induced Abortion|T061|NON|EQV|UNK (19XX)|810826|IND ABORTION|abcdefv +ENTRY = Previous Abortion|T184|NON|REL|POPLINE (1978)|781218|abcdef +ENTRY = Abortion Failures +ENTRY = Abortion Histories +ENTRY = Abortion Rates +ENTRY = Abortion Technic +ENTRY = Abortion Technique +ENTRY = Abortion, Drug Induced +ENTRY = Abortion, Previous +ENTRY = Abortion, Saline Solution +ENTRY = Abortion, Soap Solution +ENTRY = Abortions (Induced) +ENTRY = Abortions, Drug-Induced +ENTRY = Abortions, Induced +ENTRY = Abortions, Previous +ENTRY = Abortions, Rivanol +ENTRY = Abortions, Saline-Solution +ENTRY = Abortions, Soap-Solution +ENTRY = Anti Abortion Groups +ENTRY = Anti-Abortion Group +ENTRY = Drug-Induced Abortion +ENTRY = Drug-Induced Abortions +ENTRY = Embryotomies +ENTRY = Failure, Abortion +ENTRY = Failures, Abortion +ENTRY = Group, Anti-Abortion +ENTRY = Groups, Anti-Abortion +ENTRY = Histories, Abortion +ENTRY = History, Abortion +ENTRY = Induced Abortions +ENTRY = Postconception Fertility Control +ENTRY = Previous Abortions +ENTRY = Rate, Abortion +ENTRY = Rates, Abortion +ENTRY = Rivanol Abortion +ENTRY = Rivanol Abortions +ENTRY = Saline-Solution Abortion +ENTRY = Saline-Solution Abortions +ENTRY = Soap-Solution Abortion +ENTRY = Soap-Solution Abortions +ENTRY = Technic, Abortion +ENTRY = Technics, Abortion +ENTRY = Technique, Abortion +ENTRY = Techniques, Abortion +MN = E04.520.050 +FX = Aborted Fetus +MH_TH = BIOETHICS (1999) +MH_TH = POPLINE (1978) +ST = T061 +AN = for use of an abortifacient, coordinate with abortifacient agent with no qualifiers, not ‌/‌adv ‌eff unless text specifically discusses adverse effects; check the tags FEMALE & PREGNANCY +PI = Abortion, Criminal (1966-1970) +PI = Abortion, Legal (1966-1970) +PI = Abortion, Therapeutic (1966-1970) +MS = Intentional removal of a fetus from the uterus by any of a number of techniques. (POPLINE, 1978) +OL = use ABORTION, INDUCED to search EMBRYOTOMY 1966-85; search ABORTION, CRIMINAL & ABORTION, LEGAL & ABORTION, THERAPEUTIC 1966-70 +PM = 71; was see under ABORTION, CRIMINAL & ABORTION, THERAPEUTIC 1963-70, was see under ABORTION, LEGAL 1964-70; EMBRYOTOMY was heading 1963-85 +HN = 71; was see under ABORTION, CRIMINAL & ABORTION, THERAPEUTIC 1963-70, was see under ABORTION, LEGAL 1964-70; EMBRYOTOMY was heading 1963-85 +CATSH = CAT LIST +MR = 20020702 +DA = 19990101 +DC = 1 +DX = 19710101 +UI = D000028 + +*NEWRECORD +RECTYPE = D +MH = Abortion, Legal +AQ = AE CL EC ED ES HI IS LJ MO MT NU PX RH SN ST TD VE +PRINT ENTRY = Abortion on Demand|T061|NON|NRW|BIOETHICS (1989)|770317|abcdef +ENTRY = Abortions, Legal +ENTRY = Legal Abortion +ENTRY = Legal Abortions +MN = E04.520.050.055 +MH_TH = POPLINE (1978) +ST = T061 +AN = add HUMANS & FEMALE & PREGNANCY +MS = Termination of pregnancy under conditions allowed under local laws. (POPLINE Thesaurus, 1991) +PM = 64 +HN = 64 +CATSH = CAT LIST +MR = 20150623 +DA = 19990101 +DC = 1 +DX = 19640101 +UI = D000029 + +*NEWRECORD +RECTYPE = D +MH = Abortion, Missed +AQ = BL CF CI CL DG DH DI DT EC EH EN EP ET GE HI IM ME MI MO NU PA PC PP PS PX RH RT SU TH UR VE VI +ENTRY = Abortions, Missed +ENTRY = Missed Abortion +ENTRY = Missed Abortions +MN = C12.050.703.039.173 +MH_TH = NLM (1966) +ST = T047 +AN = check the tags FEMALE & PREGNANCY +MS = The retention in the UTERUS of a dead FETUS two months or more after its DEATH. +CATSH = CAT LIST +MR = 20210630 +DA = 19990101 +DC = 1 +DX = 19660101 +UI = D000030 + +*NEWRECORD +RECTYPE = D +MH = Abortion, Septic +AQ = BL CF CI CL DG DH DI DT EC EH EN EP ET GE HI IM ME MI MO NU PA PC PP PS PX RH RT SU TH UR VE VI +ENTRY = Septic Abortion|T047|NON|EQV|NLM (2006)|050420|abcdef +ENTRY = Abortions, Septic +ENTRY = Septic Abortions +MN = C01.674.173 +MN = C12.050.703.039.256 +MN = C12.050.703.700.173 +MH_TH = NLM (1963) +ST = T047 +AN = /vet permitted only if discussed as "septic" abortion: do not use automatically for animal abortion in brucellosis, vibriosis, trichomoniasis, etc; check the tags FEMALE & PREGNANCY +MS = Any type of abortion, induced or spontaneous, that is associated with infection of the UTERUS and its appendages. It is characterized by FEVER, uterine tenderness, and foul discharge. +CATSH = CAT LIST +MR = 20210630 +DA = 19990101 +DC = 1 +DX = 19660101 +UI = D000031 + +*NEWRECORD +RECTYPE = D +MH = Abortion, Therapeutic +DE = ABORTION THER +AQ = AE CL EC ED ES HI IS LJ MO MT NU PX RH SN ST TD VE +ENTRY = Therapeutic Abortion|T061|NON|EQV|BIOETHICS (1974)|770317|THER ABORTION|abcdefv +ENTRY = Abortions, Therapeutic +ENTRY = Therapeutic Abortions +MN = E04.520.050.060 +MH_TH = POPLINE (1978) +ST = T061 +AN = check the tags FEMALE & PREGNANCY +MS = Abortion induced to save the life or health of a pregnant woman. (From Dorland, 28th ed) +CATSH = CAT LIST +MR = 19970620 +DA = 19990101 +DC = 1 +DX = 19660101 +UI = D000032 + +*NEWRECORD +RECTYPE = D +MH = Abortion, Threatened +AQ = BL CF CI CL DG DH DI DT EC EH EN EP ET GE HI IM ME MI MO NU PA PC PP PS PX RH RT SU TH UR VE VI +ENTRY = Threatened Miscarriage|T047|NON|EQV|NLM (2018)|170504|abcdef +ENTRY = Miscarriage, Threatened +ENTRY = Threatened Abortion +ENTRY = Threatened Abortions +ENTRY = Threatened Miscarriages +MN = C12.050.703.090 +MH_TH = NLM (1966) +ST = T047 +AN = check the tags FEMALE & PREGNANCY +MS = UTERINE BLEEDING from a GESTATION of less than 20 weeks without any CERVICAL DILATATION. It is characterized by vaginal bleeding, lower back discomfort, or midline pelvic cramping and a risk factor for MISCARRIAGE. +CATSH = CAT LIST +MR = 20210630 +DA = 19990101 +DC = 1 +DX = 19660101 +UI = D000033 + +*NEWRECORD +RECTYPE = D +MH = Abortion, Veterinary +DE = ABORTION VET +AQ = BL CF CI CL DG DH DI DT EC EH EN EP ET GE HI IM ME MI MO NU PA PC PP PS PX RH RT SU TH UR VI +ENTRY = Veterinary Abortion|T047|NON|EQV|UNK (19XX)|860101|VET ABORTION|abcdefv +ENTRY = Abortions, Veterinary +ENTRY = Veterinary Abortions +MN = C12.050.703.039.422 +MN = C22.021 +MH_TH = NLM (1966) +ST = T047 +AN = coordinate IM with specific type of abortion /vet (IM); check the tags ANIMALS & FEMALE & PREGNANCY +MS = Premature expulsion of the FETUS in animals. +CATSH = CAT LIST +MR = 20210630 +DA = 19990101 +DC = 1 +DX = 19660101 +UI = D000034 + +*NEWRECORD +RECTYPE = D +MH = Abreaction +ENTRY = Abreactions +MN = F04.754.720.107 +MH_TH = NLM (1968) +ST = T041 +MS = A process in psychotherapy in which the patient is "desensitized" to emotionally painful, often forgotten (repressed) memories by recalling and reacting to them in the "safety" of the treatment setting. +PM = 68 +HN = 68 +CATSH = CAT LIST +MR = 19970620 +DA = 19990101 +DC = 1 +DX = 19680101 +UI = D000035 + +*NEWRECORD +RECTYPE = D +MH = Abrin +AQ = AD AE AG AI AN BI BL CF CH CL CS DE DF EC GE HI IM IP ME PD PK PO RE SD ST TO TU UL UR +ENTRY = Abrin A|T116|T123|NON|NRW|UNK (19XX)|810608|abbcdef +ENTRY = Abrin C|T116|T123|NON|NRW|UNK (19XX)|810608|abbcdef +MN = D08.811.277.450.430.700.750.111 +MN = D12.776.503.499.249 +MN = D12.776.765.678.906.111 +MH_TH = NLM (1975) +ST = T116 +ST = T123 +N1 = Abrins +RN = 1393-62-0 +PI = Disulfides (1973-1974) +PI = Plant Proteins (1971-1975) +MS = A toxic lectin from the seeds of jequirity, Abrus precatorius L. Very active poison. Five different proteins have so far been isolated: Abrus agglutinin, the component responsible for: hemagglutinating activity, & abrins a-d, the toxic principals each consisting of two peptide chains are held together by disulfide bonds. +PM = 91; was see under PLANT PROTEINS 1975-90 +HN = 91(75); was see under PLANT PROTEINS 1975-90 +MR = 20070709 +DA = 19741119 +DC = 1 +DX = 19910101 +UI = D000036 + +*NEWRECORD +RECTYPE = D +MH = Abruptio Placentae +AQ = BL CF CI CL DG DH DI DT EC EH EN EP ET GE HI IM ME MI MO NU PA PC PP PS PX RH RT SU TH UR VE VI +PRINT ENTRY = Placental Abruption|T047|NON|EQV|NLM (2006)|050303|abcdef +ENTRY = Abruption, Placental +ENTRY = Abruptions, Placental +ENTRY = Placental Abruptions +MN = C12.050.703.420.078 +MN = C12.050.703.590.132 +MH_TH = NLM (1966) +ST = T047 +MS = Premature separation of the normally implanted PLACENTA from the UTERUS. Signs of varying degree of severity include UTERINE BLEEDING, uterine MUSCLE HYPERTONIA, and FETAL DISTRESS or FETAL DEATH. +CATSH = CAT LIST +MR = 20210630 +DA = 19990101 +DC = 1 +DX = 19660101 +UI = D000037 diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000..29cb5e1 --- /dev/null +++ b/compose.yaml @@ -0,0 +1,21 @@ +version: "3.8" +services: + mex-artificial: + build: + context: . + ports: + - 8081:8081 + environment: + - MEX_ARTIFICIAL_HOST=0.0.0.0 + - MEX_ARTIFICIAL_PORT=8080 + expose: + - 8081 + healthcheck: + test: [ "CMD", "curl", "http://0.0.0.0:8080/_system/check" ] + interval: 60s + timeout: 5s + retries: 5 + volumes: + - data:/app/data +volumes: + data: diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..5013b4f --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,9 @@ +# sphinx configuration + +extensions = ["sphinx.ext.napoleon"] +html_theme = "alabaster" +napoleon_google_docstring = True +napoleon_include_init_with_doc = True +napoleon_include_private_with_doc = True +project = "mex-artificial" +templates_path = ["."] diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000..d145bb7 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,10 @@ +Documentation +============= + +Create artificial data for the MEx project. + +.. toctree:: + :maxdepth: 2 + :glob: + + source/* diff --git a/docs/layout.html b/docs/layout.html new file mode 100644 index 0000000..b949cb4 --- /dev/null +++ b/docs/layout.html @@ -0,0 +1,18 @@ +{% extends '!layout.html' %} + +{% block footer %} + +{% endblock %} diff --git a/mex.bat b/mex.bat new file mode 100644 index 0000000..75a4075 --- /dev/null +++ b/mex.bat @@ -0,0 +1,46 @@ +@echo off + +set target=%1 + +if "%target%"=="install" goto install +if "%target%"=="test" goto test +if "%target%"=="docs" goto docs +echo invalid argument %target% +exit /b 1 + + +:install +@REM install meta requirements system-wide +echo installing requirements +pip --disable-pip-version-check install --force-reinstall -r requirements.txt +if %errorlevel% neq 0 exit /b %errorlevel% + +@REM install pre-commit hooks when not in CI +if "%CI%"=="" ( + pre-commit install + if %errorlevel% neq 0 exit /b %errorlevel% +) + +@REM install packages from lock file in local virtual environment +echo installing package +pdm install-all +exit /b %errorlevel% + + +:test +@REM run the linter hooks from pre-commit on all files +echo linting all files +pdm lint +if %errorlevel% neq 0 exit /b %errorlevel% + +@REM run the pytest test suite with unit and integration tests +echo running all tests +pdm test +exit /b %errorlevel% + + +:docs +@REM use sphinx to auto-generate html docs from code +echo generating docs +pdm doc +exit /b %errorlevel% diff --git a/mex/__init__.py b/mex/__init__.py new file mode 100644 index 0000000..b36383a --- /dev/null +++ b/mex/__init__.py @@ -0,0 +1,3 @@ +from pkgutil import extend_path + +__path__ = extend_path(__path__, __name__) diff --git a/mex/artificial/__init__.py b/mex/artificial/__init__.py new file mode 100644 index 0000000..5b42c01 --- /dev/null +++ b/mex/artificial/__init__.py @@ -0,0 +1,23 @@ +from dagster import ( + AssetSelection, + Definitions, + FilesystemIOManager, + define_asset_job, + load_assets_from_package_module, +) + +from mex.extractors.pipeline import load_job_definitions + +defs = Definitions( + assets=[ + *(load_job_definitions().assets or ()), + *load_assets_from_package_module(__import__("mex.artificial")), + ], + jobs=[ + define_asset_job( + "merged_artificial", + AssetSelection.groups("merged_artificial").upstream(), + ) + ], + resources={"io_manager": FilesystemIOManager()}, +) diff --git a/mex/artificial/main.py b/mex/artificial/main.py new file mode 100644 index 0000000..0277ca6 --- /dev/null +++ b/mex/artificial/main.py @@ -0,0 +1,95 @@ +from pathlib import Path +from typing import Annotated + +import typer +from faker import Faker + +from mex.backend.merged.helpers import create_merged_item +from mex.common.backend_api.models import ExtractedItemsRequest, MergedItemsResponse +from mex.common.logging import logger +from mex.common.models import EXTRACTED_MODEL_CLASSES +from mex.extractors.artificial.identity import IdentityMap, restore_identities +from mex.extractors.pipeline import asset, run_job_in_process +from mex.extractors.publisher.filter import filter_merged_items +from mex.extractors.publisher.load import write_merged_items +from mex.extractors.settings import Settings + + +@asset(group_name="merged_artificial") +def extracted_items(factories: Faker, identities: IdentityMap) -> ExtractedItemsRequest: + """Create artificial extracted items.""" + restore_identities(identities) # restore state of memory identity provider + return ExtractedItemsRequest( + items=[m for c in EXTRACTED_MODEL_CLASSES for m in factories.extracted_data(c)] + ) + + +@asset(group_name="merged_artificial") +def merged_items(extracted_items: ExtractedItemsRequest) -> MergedItemsResponse: + """Transform artificial extracted items into merged items.""" + return MergedItemsResponse( + items=[ + create_merged_item(m.stableTargetId, [m], None) + for m in extracted_items.items + ], + total=len(extracted_items.items), + ) + + +@asset(group_name="merged_artificial") +def filtered_items(merged_items: MergedItemsResponse) -> MergedItemsResponse: + """Filter to be published items by allow list.""" + return MergedItemsResponse( + items=list(filter_merged_items(merged_items.items)), + total=len(merged_items.items), + ) + + +@asset(group_name="merged_artificial") +def load(filtered_items: MergedItemsResponse) -> None: + """Write the filtered items into a new-line delimited JSON file.""" + write_merged_items(filtered_items.items) + + +def artificial( + count: Annotated[ + int, + typer.Option( + help="Number of artificial items to approximately create.", + min=len(EXTRACTED_MODEL_CLASSES) * 2, + max=int(10e6 - 1), + ), + ] = 100, + chattiness: Annotated[ + int, + typer.Option( + help="Maximum number of words to approximately produce for text fields.", + min=2, + max=100, + ), + ] = 10, + path: Annotated[ + Path | None, + typer.Option( + help="Where to write the resulting `publisher.ndjson` file.", + show_default=str(Path.cwd()), + file_okay=False, + dir_okay=True, + writable=True, + resolve_path=True, + ), + ] = None, +) -> None: # pragma: no cover + """Generate merged artificial items.""" + settings = Settings.get() + settings.artificial.count = count + settings.artificial.chattiness = chattiness + settings.work_dir = path or Path.cwd() + logger.info("starting artificial data generation") + run_job_in_process("merged_artificial") + logger.info("artificial data generation done") + + +def cli() -> None: # pragma: no cover + """Wrap cli in typer.""" + typer.run(artificial) diff --git a/mex/py.typed b/mex/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/pdm.lock b/pdm.lock new file mode 100644 index 0000000..8842a2e --- /dev/null +++ b/pdm.lock @@ -0,0 +1,2402 @@ +# This file is @generated by PDM. +# It is not intended for manual editing. + +[metadata] +groups = ["default", "dev"] +strategy = ["inherit_metadata"] +lock_version = "4.5.0" +content_hash = "sha256:0c40fb16490732dff2daeb384c1c1e510841616a2388103007bdb97236d642cb" + +[[metadata.targets]] +requires_python = "==3.11.*" + +[[package]] +name = "alabaster" +version = "1.0.0" +requires_python = ">=3.10" +summary = "A light, configurable Sphinx theme" +groups = ["dev"] +marker = "python_version == \"3.11\"" +files = [ + {file = "alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b"}, + {file = "alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e"}, +] + +[[package]] +name = "alembic" +version = "1.14.0" +requires_python = ">=3.8" +summary = "A database migration tool for SQLAlchemy." +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "Mako", + "SQLAlchemy>=1.3.0", + "importlib-metadata; python_version < \"3.9\"", + "importlib-resources; python_version < \"3.9\"", + "typing-extensions>=4", +] +files = [ + {file = "alembic-1.14.0-py3-none-any.whl", hash = "sha256:99bd884ca390466db5e27ffccff1d179ec5c05c965cfefc0607e69f9e411cb25"}, + {file = "alembic-1.14.0.tar.gz", hash = "sha256:b00892b53b3642d0b8dbedba234dbf1924b69be83a9a769d5a624b01094e304b"}, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +requires_python = ">=3.8" +summary = "Reusable constraint types to use with typing.Annotated" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "typing-extensions>=4.0.0; python_version < \"3.9\"", +] +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + +[[package]] +name = "anyio" +version = "4.6.2.post1" +requires_python = ">=3.9" +summary = "High level compatibility layer for multiple asynchronous event loop implementations" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "exceptiongroup>=1.0.2; python_version < \"3.11\"", + "idna>=2.8", + "sniffio>=1.1", + "typing-extensions>=4.1; python_version < \"3.11\"", +] +files = [ + {file = "anyio-4.6.2.post1-py3-none-any.whl", hash = "sha256:6d170c36fba3bdd840c73d3868c1e777e33676a69c3a72cf0a0d5d6d8009b61d"}, + {file = "anyio-4.6.2.post1.tar.gz", hash = "sha256:4c8bc31ccdb51c7f7bd251f51c609e038d63e34219b44aa86e47576389880b4c"}, +] + +[[package]] +name = "asttokens" +version = "2.4.1" +summary = "Annotate AST trees with source code positions" +groups = ["dev"] +marker = "python_version == \"3.11\"" +dependencies = [ + "six>=1.12.0", + "typing; python_version < \"3.5\"", +] +files = [ + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, +] + +[[package]] +name = "babel" +version = "2.16.0" +requires_python = ">=3.8" +summary = "Internationalization utilities" +groups = ["dev"] +marker = "python_version == \"3.11\"" +dependencies = [ + "pytz>=2015.7; python_version < \"3.9\"", +] +files = [ + {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, + {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, +] + +[[package]] +name = "backoff" +version = "2.2.1" +requires_python = ">=3.7,<4.0" +summary = "Function decoration for backoff and retry" +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, + {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, +] + +[[package]] +name = "beautifulsoup4" +version = "4.12.3" +requires_python = ">=3.6.0" +summary = "Screen-scraping library" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "soupsieve>1.2", +] +files = [ + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, +] + +[[package]] +name = "certifi" +version = "2024.8.30" +requires_python = ">=3.6" +summary = "Python package for providing Mozilla's CA Bundle." +groups = ["default", "dev"] +marker = "python_version == \"3.11\"" +files = [ + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, +] + +[[package]] +name = "cffi" +version = "1.17.1" +requires_python = ">=3.8" +summary = "Foreign Function Interface for Python calling C code." +groups = ["default"] +marker = "platform_python_implementation != \"PyPy\" and python_version == \"3.11\"" +dependencies = [ + "pycparser", +] +files = [ + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.0" +requires_python = ">=3.7.0" +summary = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +groups = ["default", "dev"] +marker = "python_version == \"3.11\"" +files = [ + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, +] + +[[package]] +name = "click" +version = "8.1.7" +requires_python = ">=3.7" +summary = "Composable command line interface toolkit" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "colorama; platform_system == \"Windows\"", + "importlib-metadata; python_version < \"3.8\"", +] +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +summary = "Cross-platform colored terminal text." +groups = ["default", "dev"] +marker = "sys_platform == \"win32\" and python_version == \"3.11\" or platform_system == \"Windows\" and python_version == \"3.11\"" +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 = "coloredlogs" +version = "14.0" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +summary = "Colored terminal output for Python's logging module" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "humanfriendly>=7.1", +] +files = [ + {file = "coloredlogs-14.0-py2.py3-none-any.whl", hash = "sha256:346f58aad6afd48444c2468618623638dadab76e4e70d5e10822676f2d32226a"}, + {file = "coloredlogs-14.0.tar.gz", hash = "sha256:a1fab193d2053aa6c0a97608c4342d031f1f93a3d1218432c59322441d31a505"}, +] + +[[package]] +name = "coverage" +version = "7.6.7" +requires_python = ">=3.9" +summary = "Code coverage measurement for Python" +groups = ["dev"] +marker = "python_version == \"3.11\"" +files = [ + {file = "coverage-7.6.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7e61b0e77ff4dddebb35a0e8bb5a68bf0f8b872407d8d9f0c726b65dfabe2469"}, + {file = "coverage-7.6.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1a5407a75ca4abc20d6252efeb238377a71ce7bda849c26c7a9bece8680a5d99"}, + {file = "coverage-7.6.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df002e59f2d29e889c37abd0b9ee0d0e6e38c24f5f55d71ff0e09e3412a340ec"}, + {file = "coverage-7.6.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:673184b3156cba06154825f25af33baa2671ddae6343f23175764e65a8c4c30b"}, + {file = "coverage-7.6.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e69ad502f1a2243f739f5bd60565d14a278be58be4c137d90799f2c263e7049a"}, + {file = "coverage-7.6.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:60dcf7605c50ea72a14490d0756daffef77a5be15ed1b9fea468b1c7bda1bc3b"}, + {file = "coverage-7.6.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9c2eb378bebb2c8f65befcb5147877fc1c9fbc640fc0aad3add759b5df79d55d"}, + {file = "coverage-7.6.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c0317288f032221d35fa4cbc35d9f4923ff0dfd176c79c9b356e8ef8ef2dff4"}, + {file = "coverage-7.6.7-cp311-cp311-win32.whl", hash = "sha256:951aade8297358f3618a6e0660dc74f6b52233c42089d28525749fc8267dccd2"}, + {file = "coverage-7.6.7-cp311-cp311-win_amd64.whl", hash = "sha256:5e444b8e88339a2a67ce07d41faabb1d60d1004820cee5a2c2b54e2d8e429a0f"}, + {file = "coverage-7.6.7.tar.gz", hash = "sha256:d79d4826e41441c9a118ff045e4bccb9fdbdcb1d02413e7ea6eb5c87b5439d24"}, +] + +[[package]] +name = "coverage" +version = "7.6.7" +extras = ["toml"] +requires_python = ">=3.9" +summary = "Code coverage measurement for Python" +groups = ["dev"] +marker = "python_version == \"3.11\"" +dependencies = [ + "coverage==7.6.7", + "tomli; python_full_version <= \"3.11.0a6\"", +] +files = [ + {file = "coverage-7.6.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7e61b0e77ff4dddebb35a0e8bb5a68bf0f8b872407d8d9f0c726b65dfabe2469"}, + {file = "coverage-7.6.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1a5407a75ca4abc20d6252efeb238377a71ce7bda849c26c7a9bece8680a5d99"}, + {file = "coverage-7.6.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df002e59f2d29e889c37abd0b9ee0d0e6e38c24f5f55d71ff0e09e3412a340ec"}, + {file = "coverage-7.6.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:673184b3156cba06154825f25af33baa2671ddae6343f23175764e65a8c4c30b"}, + {file = "coverage-7.6.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e69ad502f1a2243f739f5bd60565d14a278be58be4c137d90799f2c263e7049a"}, + {file = "coverage-7.6.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:60dcf7605c50ea72a14490d0756daffef77a5be15ed1b9fea468b1c7bda1bc3b"}, + {file = "coverage-7.6.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9c2eb378bebb2c8f65befcb5147877fc1c9fbc640fc0aad3add759b5df79d55d"}, + {file = "coverage-7.6.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c0317288f032221d35fa4cbc35d9f4923ff0dfd176c79c9b356e8ef8ef2dff4"}, + {file = "coverage-7.6.7-cp311-cp311-win32.whl", hash = "sha256:951aade8297358f3618a6e0660dc74f6b52233c42089d28525749fc8267dccd2"}, + {file = "coverage-7.6.7-cp311-cp311-win_amd64.whl", hash = "sha256:5e444b8e88339a2a67ce07d41faabb1d60d1004820cee5a2c2b54e2d8e429a0f"}, + {file = "coverage-7.6.7.tar.gz", hash = "sha256:d79d4826e41441c9a118ff045e4bccb9fdbdcb1d02413e7ea6eb5c87b5439d24"}, +] + +[[package]] +name = "croniter" +version = "3.0.4" +requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.6" +summary = "croniter provides iteration for datetime object with cron like format" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "python-dateutil", + "pytz>2021.1", +] +files = [ + {file = "croniter-3.0.4-py2.py3-none-any.whl", hash = "sha256:96e14cdd5dcb479dd48d7db14b53d8434b188dfb9210448bef6f65663524a6f0"}, + {file = "croniter-3.0.4.tar.gz", hash = "sha256:f9dcd4bdb6c97abedb6f09d6ed3495b13ede4d4544503fa580b6372a56a0c520"}, +] + +[[package]] +name = "cryptography" +version = "43.0.3" +requires_python = ">=3.7" +summary = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "cffi>=1.12; platform_python_implementation != \"PyPy\"", +] +files = [ + {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73"}, + {file = "cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2"}, + {file = "cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd"}, + {file = "cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73"}, + {file = "cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995"}, + {file = "cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362"}, + {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, +] + +[[package]] +name = "dagster" +version = "1.9.2" +requires_python = "<3.13,>=3.9" +summary = "Dagster is an orchestration platform for the development, production, and observation of data assets." +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "Jinja2", + "PyYAML>=5.1", + "alembic!=1.11.0,!=1.6.3,!=1.7.0,>=1.2.1", + "click>=5.0", + "coloredlogs<=14.0,>=6.1", + "croniter<4,>=0.3.34", + "dagster-pipes==1.9.2", + "docstring-parser", + "filelock", + "grpcio-health-checking>=1.44.0", + "grpcio>=1.44.0", + "packaging>=20.9", + "protobuf<5,>=3.20.0; python_version < \"3.11\"", + "protobuf<5,>=4; python_version >= \"3.11\"", + "psutil>=1.0; platform_system == \"Windows\"", + "pydantic<2.10,>=2", + "python-dotenv", + "pytz", + "pywin32!=226; platform_system == \"Windows\"", + "requests", + "rich", + "setuptools", + "sqlalchemy<3,>=1.0", + "structlog", + "tabulate", + "tomli<3", + "toposort>=1.0", + "tqdm<5", + "typing-extensions<5,>=4.4.0", + "tzdata; platform_system == \"Windows\"", + "universal-pathlib; python_version < \"3.12\"", + "universal-pathlib>=0.2.0; python_version >= \"3.12\"", + "watchdog<6,>=0.8.3", +] +files = [ + {file = "dagster-1.9.2-py3-none-any.whl", hash = "sha256:fb6732882469e32168ebaf47f014e9007ba3c6d41350f0cf43c9b943dedb56f7"}, + {file = "dagster-1.9.2.tar.gz", hash = "sha256:fdb98dabd953586c295e315541b690802934150b6638006fa8cef9d7cb2e44f4"}, +] + +[[package]] +name = "dagster-graphql" +version = "1.9.2" +requires_python = "<3.13,>=3.9" +summary = "The GraphQL frontend to python dagster." +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "dagster==1.9.2", + "gql[requests]<4,>=3", + "graphene<4,>=3", + "requests", + "starlette", +] +files = [ + {file = "dagster-graphql-1.9.2.tar.gz", hash = "sha256:23d824ca8cdf411607dedbad68e81e19a28cb498cbc1ea8ec9ee48c5fbd479e1"}, + {file = "dagster_graphql-1.9.2-py3-none-any.whl", hash = "sha256:22388d13c257166759ef161b8e15f65a101a8a2f59c606b056703418349af5fa"}, +] + +[[package]] +name = "dagster-pipes" +version = "1.9.2" +requires_python = "<3.13,>=3.9" +summary = "Toolkit for Dagster integrations with transform logic outside of Dagster" +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "dagster-pipes-1.9.2.tar.gz", hash = "sha256:63c64123b3826c099d2b9fe09604c3d755fcfaeaf08d0920628c54cba5123e47"}, + {file = "dagster_pipes-1.9.2-py3-none-any.whl", hash = "sha256:3e18a82617e7287450d740bab0dbae4d8210c9e1b08c33cc395550eb58206007"}, +] + +[[package]] +name = "dagster-postgres" +version = "0.25.2" +requires_python = "<3.13,>=3.9" +summary = "A Dagster integration for postgres" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "dagster==1.9.2", + "psycopg2-binary", +] +files = [ + {file = "dagster-postgres-0.25.2.tar.gz", hash = "sha256:b8b076b7c2c8b94c6b0f971ec9cb586448fe8605f7e819cb1adb6cf333ee583a"}, + {file = "dagster_postgres-0.25.2-py3-none-any.whl", hash = "sha256:f267f40b9360c022c7494f386e0087113204f4e7bc9b1feaa0398d3d782f3f86"}, +] + +[[package]] +name = "dagster-webserver" +version = "1.9.2" +requires_python = "<3.13,>=3.9" +summary = "Web UI for dagster." +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "click<9.0,>=7.0", + "dagster-graphql==1.9.2", + "dagster==1.9.2", + "starlette!=0.36.0", + "uvicorn[standard]", +] +files = [ + {file = "dagster-webserver-1.9.2.tar.gz", hash = "sha256:34d3252c571c3ed7024dda6684f89dae672b35b820098b490f186100fffcf3b9"}, + {file = "dagster_webserver-1.9.2-py3-none-any.whl", hash = "sha256:7d8346aa99b96a2e40da79a22e7851898e1dc7ed430002cfd5015d4f2906a2ac"}, +] + +[[package]] +name = "decorator" +version = "5.1.1" +requires_python = ">=3.5" +summary = "Decorators for Humans" +groups = ["dev"] +marker = "python_version == \"3.11\"" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + +[[package]] +name = "docstring-parser" +version = "0.16" +requires_python = ">=3.6,<4.0" +summary = "Parse Python docstrings in reST, Google and Numpydoc format" +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "docstring_parser-0.16-py3-none-any.whl", hash = "sha256:bf0a1387354d3691d102edef7ec124f219ef639982d096e26e3b60aeffa90637"}, + {file = "docstring_parser-0.16.tar.gz", hash = "sha256:538beabd0af1e2db0146b6bd3caa526c35a34d61af9fd2887f3a8a27a739aa6e"}, +] + +[[package]] +name = "docutils" +version = "0.21.2" +requires_python = ">=3.9" +summary = "Docutils -- Python Documentation Utilities" +groups = ["dev"] +marker = "python_version == \"3.11\"" +files = [ + {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, + {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, +] + +[[package]] +name = "et-xmlfile" +version = "2.0.0" +requires_python = ">=3.8" +summary = "An implementation of lxml.xmlfile for the standard library" +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa"}, + {file = "et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54"}, +] + +[[package]] +name = "execnet" +version = "2.1.1" +requires_python = ">=3.8" +summary = "execnet: rapid multi-Python deployment" +groups = ["dev"] +marker = "python_version == \"3.11\"" +files = [ + {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, + {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, +] + +[[package]] +name = "executing" +version = "2.1.0" +requires_python = ">=3.8" +summary = "Get the currently executing AST node of a frame, and other information" +groups = ["dev"] +marker = "python_version == \"3.11\"" +files = [ + {file = "executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf"}, + {file = "executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab"}, +] + +[[package]] +name = "faker" +version = "32.1.0" +requires_python = ">=3.8" +summary = "Faker is a Python package that generates fake data for you." +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "python-dateutil>=2.4", + "typing-extensions", +] +files = [ + {file = "Faker-32.1.0-py3-none-any.whl", hash = "sha256:c77522577863c264bdc9dad3a2a750ad3f7ee43ff8185072e482992288898814"}, + {file = "faker-32.1.0.tar.gz", hash = "sha256:aac536ba04e6b7beb2332c67df78485fc29c1880ff723beac6d1efd45e2f10f5"}, +] + +[[package]] +name = "fastapi" +version = "0.115.5" +requires_python = ">=3.8" +summary = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "pydantic!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0,>=1.7.4", + "starlette<0.42.0,>=0.40.0", + "typing-extensions>=4.8.0", +] +files = [ + {file = "fastapi-0.115.5-py3-none-any.whl", hash = "sha256:596b95adbe1474da47049e802f9a65ab2ffa9c2b07e7efee70eb8a66c9f2f796"}, + {file = "fastapi-0.115.5.tar.gz", hash = "sha256:0e7a4d0dc0d01c68df21887cce0945e72d3c48b9f4f79dfe7a7d53aa08fbb289"}, +] + +[[package]] +name = "filelock" +version = "3.16.1" +requires_python = ">=3.8" +summary = "A platform independent file lock." +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, + {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, +] + +[[package]] +name = "fsspec" +version = "2024.10.0" +requires_python = ">=3.8" +summary = "File-system specification" +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "fsspec-2024.10.0-py3-none-any.whl", hash = "sha256:03b9a6785766a4de40368b88906366755e2819e758b83705c88cd7cb5fe81871"}, + {file = "fsspec-2024.10.0.tar.gz", hash = "sha256:eda2d8a4116d4f2429db8550f2457da57279247dd930bb12f821b58391359493"}, +] + +[[package]] +name = "gql" +version = "3.5.0" +summary = "GraphQL client for Python" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "anyio<5,>=3.0", + "backoff<3.0,>=1.11.1", + "graphql-core<3.3,>=3.2", + "yarl<2.0,>=1.6", +] +files = [ + {file = "gql-3.5.0-py2.py3-none-any.whl", hash = "sha256:70dda5694a5b194a8441f077aa5fb70cc94e4ec08016117523f013680901ecb7"}, + {file = "gql-3.5.0.tar.gz", hash = "sha256:ccb9c5db543682b28f577069950488218ed65d4ac70bb03b6929aaadaf636de9"}, +] + +[[package]] +name = "gql" +version = "3.5.0" +extras = ["requests"] +summary = "GraphQL client for Python" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "gql==3.5.0", + "requests-toolbelt<2,>=1.0.0", + "requests<3,>=2.26", +] +files = [ + {file = "gql-3.5.0-py2.py3-none-any.whl", hash = "sha256:70dda5694a5b194a8441f077aa5fb70cc94e4ec08016117523f013680901ecb7"}, + {file = "gql-3.5.0.tar.gz", hash = "sha256:ccb9c5db543682b28f577069950488218ed65d4ac70bb03b6929aaadaf636de9"}, +] + +[[package]] +name = "graphene" +version = "3.4.3" +summary = "GraphQL Framework for Python" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "graphql-core<3.3,>=3.1", + "graphql-relay<3.3,>=3.1", + "python-dateutil<3,>=2.7.0", + "typing-extensions<5,>=4.7.1", +] +files = [ + {file = "graphene-3.4.3-py2.py3-none-any.whl", hash = "sha256:820db6289754c181007a150db1f7fff544b94142b556d12e3ebc777a7bf36c71"}, + {file = "graphene-3.4.3.tar.gz", hash = "sha256:2a3786948ce75fe7e078443d37f609cbe5bb36ad8d6b828740ad3b95ed1a0aaa"}, +] + +[[package]] +name = "graphql-core" +version = "3.2.5" +requires_python = "<4,>=3.6" +summary = "GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL." +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "typing-extensions<5,>=4; python_version < \"3.10\"", +] +files = [ + {file = "graphql_core-3.2.5-py3-none-any.whl", hash = "sha256:2f150d5096448aa4f8ab26268567bbfeef823769893b39c1a2e1409590939c8a"}, + {file = "graphql_core-3.2.5.tar.gz", hash = "sha256:e671b90ed653c808715645e3998b7ab67d382d55467b7e2978549111bbabf8d5"}, +] + +[[package]] +name = "graphql-relay" +version = "3.2.0" +requires_python = ">=3.6,<4" +summary = "Relay library for graphql-core" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "graphql-core<3.3,>=3.2", + "typing-extensions<5,>=4.1; python_version < \"3.8\"", +] +files = [ + {file = "graphql-relay-3.2.0.tar.gz", hash = "sha256:1ff1c51298356e481a0be009ccdff249832ce53f30559c1338f22a0e0d17250c"}, + {file = "graphql_relay-3.2.0-py3-none-any.whl", hash = "sha256:c9b22bd28b170ba1fe674c74384a8ff30a76c8e26f88ac3aa1584dd3179953e5"}, +] + +[[package]] +name = "greenlet" +version = "3.1.1" +requires_python = ">=3.7" +summary = "Lightweight in-process concurrent programming" +groups = ["default"] +marker = "(platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\") and python_version == \"3.11\"" +files = [ + {file = "greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395"}, + {file = "greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39"}, + {file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"}, +] + +[[package]] +name = "grpcio" +version = "1.68.0" +requires_python = ">=3.8" +summary = "HTTP/2-based RPC framework" +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "grpcio-1.68.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:3b2b559beb2d433129441783e5f42e3be40a9e1a89ec906efabf26591c5cd415"}, + {file = "grpcio-1.68.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e46541de8425a4d6829ac6c5d9b16c03c292105fe9ebf78cb1c31e8d242f9155"}, + {file = "grpcio-1.68.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:c1245651f3c9ea92a2db4f95d37b7597db6b246d5892bca6ee8c0e90d76fb73c"}, + {file = "grpcio-1.68.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f1931c7aa85be0fa6cea6af388e576f3bf6baee9e5d481c586980c774debcb4"}, + {file = "grpcio-1.68.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b0ff09c81e3aded7a183bc6473639b46b6caa9c1901d6f5e2cba24b95e59e30"}, + {file = "grpcio-1.68.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8c73f9fbbaee1a132487e31585aa83987ddf626426d703ebcb9a528cf231c9b1"}, + {file = "grpcio-1.68.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6b2f98165ea2790ea159393a2246b56f580d24d7da0d0342c18a085299c40a75"}, + {file = "grpcio-1.68.0-cp311-cp311-win32.whl", hash = "sha256:e1e7ed311afb351ff0d0e583a66fcb39675be112d61e7cfd6c8269884a98afbc"}, + {file = "grpcio-1.68.0-cp311-cp311-win_amd64.whl", hash = "sha256:e0d2f68eaa0a755edd9a47d40e50dba6df2bceda66960dee1218da81a2834d27"}, + {file = "grpcio-1.68.0.tar.gz", hash = "sha256:7e7483d39b4a4fddb9906671e9ea21aaad4f031cdfc349fec76bdfa1e404543a"}, +] + +[[package]] +name = "grpcio-health-checking" +version = "1.62.3" +requires_python = ">=3.6" +summary = "Standard Health Checking Service for gRPC" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "grpcio>=1.62.3", + "protobuf>=4.21.6", +] +files = [ + {file = "grpcio-health-checking-1.62.3.tar.gz", hash = "sha256:5074ba0ce8f0dcfe328408ec5c7551b2a835720ffd9b69dade7fa3e0dc1c7a93"}, + {file = "grpcio_health_checking-1.62.3-py3-none-any.whl", hash = "sha256:f29da7dd144d73b4465fe48f011a91453e9ff6c8af0d449254cf80021cab3e0d"}, +] + +[[package]] +name = "h11" +version = "0.14.0" +requires_python = ">=3.7" +summary = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "typing-extensions; python_version < \"3.8\"", +] +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.7" +requires_python = ">=3.8" +summary = "A minimal low-level HTTP client." +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "certifi", + "h11<0.15,>=0.13", +] +files = [ + {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, + {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, +] + +[[package]] +name = "httptools" +version = "0.6.4" +requires_python = ">=3.8.0" +summary = "A collection of framework independent HTTP protocol utils." +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "httptools-0.6.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f47f8ed67cc0ff862b84a1189831d1d33c963fb3ce1ee0c65d3b0cbe7b711069"}, + {file = "httptools-0.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0614154d5454c21b6410fdf5262b4a3ddb0f53f1e1721cfd59d55f32138c578a"}, + {file = "httptools-0.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8787367fbdfccae38e35abf7641dafc5310310a5987b689f4c32cc8cc3ee975"}, + {file = "httptools-0.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40b0f7fe4fd38e6a507bdb751db0379df1e99120c65fbdc8ee6c1d044897a636"}, + {file = "httptools-0.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40a5ec98d3f49904b9fe36827dcf1aadfef3b89e2bd05b0e35e94f97c2b14721"}, + {file = "httptools-0.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dacdd3d10ea1b4ca9df97a0a303cbacafc04b5cd375fa98732678151643d4988"}, + {file = "httptools-0.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:288cd628406cc53f9a541cfaf06041b4c71d751856bab45e3702191f931ccd17"}, + {file = "httptools-0.6.4.tar.gz", hash = "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c"}, +] + +[[package]] +name = "httpx" +version = "0.27.2" +requires_python = ">=3.8" +summary = "The next generation HTTP client." +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "anyio", + "certifi", + "httpcore==1.*", + "idna", + "sniffio", +] +files = [ + {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"}, + {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"}, +] + +[[package]] +name = "humanfriendly" +version = "10.0" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +summary = "Human friendly output for text interfaces using Python" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "monotonic; python_version == \"2.7\"", + "pyreadline3; sys_platform == \"win32\" and python_version >= \"3.8\"", + "pyreadline; sys_platform == \"win32\" and python_version < \"3.8\"", +] +files = [ + {file = "humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477"}, + {file = "humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc"}, +] + +[[package]] +name = "idna" +version = "3.10" +requires_python = ">=3.6" +summary = "Internationalized Domain Names in Applications (IDNA)" +groups = ["default", "dev"] +marker = "python_version == \"3.11\"" +files = [ + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, +] + +[[package]] +name = "imagesize" +version = "1.4.1" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +summary = "Getting image size from png/jpeg/jpeg2000/gif file" +groups = ["dev"] +marker = "python_version == \"3.11\"" +files = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +requires_python = ">=3.7" +summary = "brain-dead simple config-ini parsing" +groups = ["dev"] +marker = "python_version == \"3.11\"" +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 = "ipdb" +version = "0.13.13" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +summary = "IPython-enabled pdb" +groups = ["dev"] +marker = "python_version == \"3.11\"" +dependencies = [ + "decorator; python_version == \"3.5\"", + "decorator; python_version == \"3.6\"", + "decorator; python_version > \"3.6\" and python_version < \"3.11\"", + "decorator; python_version >= \"3.11\"", + "decorator<5.0.0; python_version == \"2.7\"", + "decorator<5.0.0; python_version == \"3.4\"", + "ipython<6.0.0,>=5.1.0; python_version == \"2.7\"", + "ipython<7.0.0,>=6.0.0; python_version == \"3.4\"", + "ipython<7.10.0,>=7.0.0; python_version == \"3.5\"", + "ipython<7.17.0,>=7.16.3; python_version == \"3.6\"", + "ipython>=7.31.1; python_version > \"3.6\" and python_version < \"3.11\"", + "ipython>=7.31.1; python_version >= \"3.11\"", + "pathlib; python_version == \"2.7\"", + "toml>=0.10.2; python_version == \"2.7\"", + "toml>=0.10.2; python_version == \"3.4\"", + "toml>=0.10.2; python_version == \"3.5\"", + "tomli; python_version == \"3.6\"", + "tomli; python_version > \"3.6\" and python_version < \"3.11\"", +] +files = [ + {file = "ipdb-0.13.13-py3-none-any.whl", hash = "sha256:45529994741c4ab6d2388bfa5d7b725c2cf7fe9deffabdb8a6113aa5ed449ed4"}, + {file = "ipdb-0.13.13.tar.gz", hash = "sha256:e3ac6018ef05126d442af680aad863006ec19d02290561ac88b8b1c0b0cfc726"}, +] + +[[package]] +name = "ipython" +version = "8.29.0" +requires_python = ">=3.10" +summary = "IPython: Productive Interactive Computing" +groups = ["dev"] +marker = "python_version == \"3.11\"" +dependencies = [ + "colorama; sys_platform == \"win32\"", + "decorator", + "exceptiongroup; python_version < \"3.11\"", + "jedi>=0.16", + "matplotlib-inline", + "pexpect>4.3; sys_platform != \"win32\" and sys_platform != \"emscripten\"", + "prompt-toolkit<3.1.0,>=3.0.41", + "pygments>=2.4.0", + "stack-data", + "traitlets>=5.13.0", + "typing-extensions>=4.6; python_version < \"3.12\"", +] +files = [ + {file = "ipython-8.29.0-py3-none-any.whl", hash = "sha256:0188a1bd83267192123ccea7f4a8ed0a78910535dbaa3f37671dca76ebd429c8"}, + {file = "ipython-8.29.0.tar.gz", hash = "sha256:40b60e15b22591450eef73e40a027cf77bd652e757523eebc5bd7c7c498290eb"}, +] + +[[package]] +name = "jedi" +version = "0.19.2" +requires_python = ">=3.6" +summary = "An autocompletion tool for Python that can be used for text editors." +groups = ["dev"] +marker = "python_version == \"3.11\"" +dependencies = [ + "parso<0.9.0,>=0.8.4", +] +files = [ + {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, + {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, +] + +[[package]] +name = "jinja2" +version = "3.1.4" +requires_python = ">=3.7" +summary = "A very fast and expressive template engine." +groups = ["default", "dev"] +marker = "python_version == \"3.11\"" +dependencies = [ + "MarkupSafe>=2.0", +] +files = [ + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, +] + +[[package]] +name = "langdetect" +version = "1.0.9" +summary = "Language detection library ported from Google's language-detection." +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "six", +] +files = [ + {file = "langdetect-1.0.9.tar.gz", hash = "sha256:cbc1fef89f8d062739774bd51eda3da3274006b3661d199c2655f6b3f6d605a0"}, +] + +[[package]] +name = "ldap3" +version = "2.9.1" +summary = "A strictly RFC 4510 conforming LDAP V3 pure Python client library" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "pyasn1>=0.4.6", +] +files = [ + {file = "ldap3-2.9.1-py2.py3-none-any.whl", hash = "sha256:5869596fc4948797020d3f03b7939da938778a0f9e2009f7a072ccf92b8e8d70"}, + {file = "ldap3-2.9.1.tar.gz", hash = "sha256:f3e7fc4718e3f09dda568b57100095e0ce58633bcabbed8667ce3f8fbaa4229f"}, +] + +[[package]] +name = "mako" +version = "1.3.6" +requires_python = ">=3.8" +summary = "A super-fast templating language that borrows the best ideas from the existing templating languages." +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "MarkupSafe>=0.9.2", +] +files = [ + {file = "Mako-1.3.6-py3-none-any.whl", hash = "sha256:a91198468092a2f1a0de86ca92690fb0cfc43ca90ee17e15d93662b4c04b241a"}, + {file = "mako-1.3.6.tar.gz", hash = "sha256:9ec3a1583713479fae654f83ed9fa8c9a4c16b7bb0daba0e6bbebff50c0d983d"}, +] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +requires_python = ">=3.8" +summary = "Python port of markdown-it. Markdown parsing, done right!" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "mdurl~=0.1", +] +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[[package]] +name = "markupsafe" +version = "3.0.2" +requires_python = ">=3.9" +summary = "Safely add untrusted strings to HTML/XML markup." +groups = ["default", "dev"] +marker = "python_version == \"3.11\"" +files = [ + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, +] + +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +requires_python = ">=3.8" +summary = "Inline Matplotlib backend for Jupyter" +groups = ["dev"] +marker = "python_version == \"3.11\"" +dependencies = [ + "traitlets", +] +files = [ + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +requires_python = ">=3.7" +summary = "Markdown URL utilities" +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "mex-backend" +version = "0.23.0" +requires_python = ">=3.11,<3.13" +git = "https://github.com/robert-koch-institut/mex-backend.git" +ref = "0.23.0" +revision = "fa1de5dcf765938c4e944eb1bfe3dac2d16e4238" +summary = "Backend server for the RKI metadata exchange." +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "fastapi<1,>=0.115", + "httpx<1,>=0.27", + "jinja2<4,>=3", + "mex-common @ git+https://github.com/robert-koch-institut/mex-common.git@0.40.0", + "neo4j<6,>=5", + "pydantic<3,>=2", + "starlette<1,>=0.41", + "uvicorn[standard]<1,>=0.30", +] + +[[package]] +name = "mex-common" +version = "0.40.0" +requires_python = ">=3.11,<3.13" +git = "https://github.com/robert-koch-institut/mex-common.git" +ref = "0.40.0" +revision = "402bfd513270659047bc8364179d7ed759685c93" +summary = "Common library for MEx python projects." +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "backoff<3,>=2.2.1", + "click<9,>=8.1.7", + "langdetect<2,>=1.0.9", + "ldap3<3,>=2.9.1", + "mex-model @ git+https://github.com/robert-koch-institut/mex-model.git@3.1.0", + "numpy<3,>=2.1.2", + "pandas<3,>=2.2.3", + "pyarrow<18,>=17.0.0", + "pydantic-settings<3,>=2.5.2", + "pydantic<3,>=2.9.2", + "pytz<2024.2,>=2024.1", + "requests<3,>=2.32.3", +] + +[[package]] +name = "mex-extractors" +version = "0.21.0" +requires_python = ">=3.11,<3.13" +git = "https://github.com/robert-koch-institut/mex-extractors.git" +ref = "0.21.0" +revision = "9199274fd632fd2cd4768693105304da28857e9e" +summary = "ETL pipelines for the RKI Metadata Exchange." +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "beautifulsoup4<5,>=4", + "dagster-postgres<1,>=0.23", + "dagster-webserver<2,>=1", + "dagster<2,>=1", + "faker<33,>=30", + "mex-common @ git+https://github.com/robert-koch-institut/mex-common.git@0.41.0", + "numpy<3,>=2", + "openpyxl<4,>=3", + "pandas<3,>=2", + "pydantic<3,>=2", + "pyodbc<6,>=5", + "pyyaml<7,>=6", + "requests-ntlm<2,>=1", + "requests<3,>=2", + "xlrd<3,>=2", +] + +[[package]] +name = "mex-model" +version = "3.1.0" +requires_python = "<3.13,>=3.11" +git = "https://github.com/robert-koch-institut/mex-model.git" +ref = "3.1.0" +revision = "61283bbb386573e18db79ec86dbc03363b4348ce" +summary = "JSON schema files defining the MEx metadata model." +groups = ["default"] +marker = "python_version == \"3.11\"" + +[[package]] +name = "multidict" +version = "6.1.0" +requires_python = ">=3.8" +summary = "multidict implementation" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "typing-extensions>=4.1.0; python_version < \"3.11\"", +] +files = [ + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"}, + {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"}, + {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"}, + {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"}, + {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"}, +] + +[[package]] +name = "mypy" +version = "1.13.0" +requires_python = ">=3.8" +summary = "Optional static typing for Python" +groups = ["dev"] +marker = "python_version == \"3.11\"" +dependencies = [ + "mypy-extensions>=1.0.0", + "tomli>=1.1.0; python_version < \"3.11\"", + "typing-extensions>=4.6.0", +] +files = [ + {file = "mypy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d"}, + {file = "mypy-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d"}, + {file = "mypy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b"}, + {file = "mypy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73"}, + {file = "mypy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca"}, + {file = "mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a"}, + {file = "mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e"}, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +requires_python = ">=3.5" +summary = "Type system extensions for programs checked with the mypy type checker." +groups = ["dev"] +marker = "python_version == \"3.11\"" +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 = "neo4j" +version = "5.26.0" +requires_python = ">=3.7" +summary = "Neo4j Bolt driver for Python" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "pytz", +] +files = [ + {file = "neo4j-5.26.0-py3-none-any.whl", hash = "sha256:511a6a9468ca89b521bf686f885a2070acc462b1d09821d43710bd477acdf11e"}, + {file = "neo4j-5.26.0.tar.gz", hash = "sha256:51b25ba127b7b9fdae1ddf48ae697ddfab331e60f4b6d8488d1fc1f74ec60dcc"}, +] + +[[package]] +name = "numpy" +version = "2.1.3" +requires_python = ">=3.10" +summary = "Fundamental package for array computing in Python" +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "numpy-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4d1167c53b93f1f5d8a139a742b3c6f4d429b54e74e6b57d0eff40045187b15d"}, + {file = "numpy-2.1.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c80e4a09b3d95b4e1cac08643f1152fa71a0a821a2d4277334c88d54b2219a41"}, + {file = "numpy-2.1.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:576a1c1d25e9e02ed7fa5477f30a127fe56debd53b8d2c89d5578f9857d03ca9"}, + {file = "numpy-2.1.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:973faafebaae4c0aaa1a1ca1ce02434554d67e628b8d805e61f874b84e136b09"}, + {file = "numpy-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:762479be47a4863e261a840e8e01608d124ee1361e48b96916f38b119cfda04a"}, + {file = "numpy-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc6f24b3d1ecc1eebfbf5d6051faa49af40b03be1aaa781ebdadcbc090b4539b"}, + {file = "numpy-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:17ee83a1f4fef3c94d16dc1802b998668b5419362c8a4f4e8a491de1b41cc3ee"}, + {file = "numpy-2.1.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:15cb89f39fa6d0bdfb600ea24b250e5f1a3df23f901f51c8debaa6a5d122b2f0"}, + {file = "numpy-2.1.3-cp311-cp311-win32.whl", hash = "sha256:d9beb777a78c331580705326d2367488d5bc473b49a9bc3036c154832520aca9"}, + {file = "numpy-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:d89dd2b6da69c4fff5e39c28a382199ddedc3a5be5390115608345dec660b9e2"}, + {file = "numpy-2.1.3.tar.gz", hash = "sha256:aa08e04e08aaf974d4458def539dece0d28146d866a39da5639596f4921fd761"}, +] + +[[package]] +name = "openpyxl" +version = "3.1.5" +requires_python = ">=3.8" +summary = "A Python library to read/write Excel 2010 xlsx/xlsm files" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "et-xmlfile", +] +files = [ + {file = "openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2"}, + {file = "openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050"}, +] + +[[package]] +name = "packaging" +version = "24.2" +requires_python = ">=3.8" +summary = "Core utilities for Python packages" +groups = ["default", "dev"] +marker = "python_version == \"3.11\"" +files = [ + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, +] + +[[package]] +name = "pandas" +version = "2.2.3" +requires_python = ">=3.9" +summary = "Powerful data structures for data analysis, time series, and statistics" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "numpy>=1.22.4; python_version < \"3.11\"", + "numpy>=1.23.2; python_version == \"3.11\"", + "numpy>=1.26.0; python_version >= \"3.12\"", + "python-dateutil>=2.8.2", + "pytz>=2020.1", + "tzdata>=2022.7", +] +files = [ + {file = "pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32"}, + {file = "pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5"}, + {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"}, +] + +[[package]] +name = "parso" +version = "0.8.4" +requires_python = ">=3.6" +summary = "A Python Parser" +groups = ["dev"] +marker = "python_version == \"3.11\"" +files = [ + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +summary = "Pexpect allows easy control of interactive console applications." +groups = ["dev"] +marker = "(sys_platform != \"win32\" and sys_platform != \"emscripten\") and python_version == \"3.11\"" +dependencies = [ + "ptyprocess>=0.5", +] +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[[package]] +name = "pluggy" +version = "1.5.0" +requires_python = ">=3.8" +summary = "plugin and hook calling mechanisms for python" +groups = ["dev"] +marker = "python_version == \"3.11\"" +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.48" +requires_python = ">=3.7.0" +summary = "Library for building powerful interactive command lines in Python" +groups = ["dev"] +marker = "python_version == \"3.11\"" +dependencies = [ + "wcwidth", +] +files = [ + {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"}, + {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"}, +] + +[[package]] +name = "propcache" +version = "0.2.0" +requires_python = ">=3.8" +summary = "Accelerated property cache" +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:63f13bf09cc3336eb04a837490b8f332e0db41da66995c9fd1ba04552e516354"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608cce1da6f2672a56b24a015b42db4ac612ee709f3d29f27a00c943d9e851de"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:466c219deee4536fbc83c08d09115249db301550625c7fef1c5563a584c9bc87"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc2db02409338bf36590aa985a461b2c96fce91f8e7e0f14c50c5fcc4f229016"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6ed8db0a556343d566a5c124ee483ae113acc9a557a807d439bcecc44e7dfbb"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91997d9cb4a325b60d4e3f20967f8eb08dfcb32b22554d5ef78e6fd1dda743a2"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c7dde9e533c0a49d802b4f3f218fa9ad0a1ce21f2c2eb80d5216565202acab4"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffcad6c564fe6b9b8916c1aefbb37a362deebf9394bd2974e9d84232e3e08504"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:97a58a28bcf63284e8b4d7b460cbee1edaab24634e82059c7b8c09e65284f178"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:945db8ee295d3af9dbdbb698cce9bbc5c59b5c3fe328bbc4387f59a8a35f998d"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39e104da444a34830751715f45ef9fc537475ba21b7f1f5b0f4d71a3b60d7fe2"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c5ecca8f9bab618340c8e848d340baf68bcd8ad90a8ecd7a4524a81c1764b3db"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c436130cc779806bdf5d5fae0d848713105472b8566b75ff70048c47d3961c5b"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:191db28dc6dcd29d1a3e063c3be0b40688ed76434622c53a284e5427565bbd9b"}, + {file = "propcache-0.2.0-cp311-cp311-win32.whl", hash = "sha256:5f2564ec89058ee7c7989a7b719115bdfe2a2fb8e7a4543b8d1c0cc4cf6478c1"}, + {file = "propcache-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e2e54267980349b723cff366d1e29b138b9a60fa376664a157a342689553f71"}, + {file = "propcache-0.2.0-py3-none-any.whl", hash = "sha256:2ccc28197af5313706511fab3a8b66dcd6da067a1331372c82ea1cb74285e036"}, + {file = "propcache-0.2.0.tar.gz", hash = "sha256:df81779732feb9d01e5d513fad0122efb3d53bbc75f61b2a4f29a020bc985e70"}, +] + +[[package]] +name = "protobuf" +version = "4.25.5" +requires_python = ">=3.8" +summary = "" +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "protobuf-4.25.5-cp310-abi3-win32.whl", hash = "sha256:5e61fd921603f58d2f5acb2806a929b4675f8874ff5f330b7d6f7e2e784bbcd8"}, + {file = "protobuf-4.25.5-cp310-abi3-win_amd64.whl", hash = "sha256:4be0571adcbe712b282a330c6e89eae24281344429ae95c6d85e79e84780f5ea"}, + {file = "protobuf-4.25.5-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:b2fde3d805354df675ea4c7c6338c1aecd254dfc9925e88c6d31a2bcb97eb173"}, + {file = "protobuf-4.25.5-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:919ad92d9b0310070f8356c24b855c98df2b8bd207ebc1c0c6fcc9ab1e007f3d"}, + {file = "protobuf-4.25.5-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:fe14e16c22be926d3abfcb500e60cab068baf10b542b8c858fa27e098123e331"}, + {file = "protobuf-4.25.5-py3-none-any.whl", hash = "sha256:0aebecb809cae990f8129ada5ca273d9d670b76d9bfc9b1809f0a9c02b7dbf41"}, + {file = "protobuf-4.25.5.tar.gz", hash = "sha256:7f8249476b4a9473645db7f8ab42b02fe1488cbe5fb72fddd445e0665afd8584"}, +] + +[[package]] +name = "psutil" +version = "6.1.0" +requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +summary = "Cross-platform lib for process and system monitoring in Python." +groups = ["default"] +marker = "platform_system == \"Windows\" and python_version == \"3.11\"" +files = [ + {file = "psutil-6.1.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6e2dcd475ce8b80522e51d923d10c7871e45f20918e027ab682f94f1c6351688"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0895b8414afafc526712c498bd9de2b063deaac4021a3b3c34566283464aff8e"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dcbfce5d89f1d1f2546a2090f4fcf87c7f669d1d90aacb7d7582addece9fb38"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:498c6979f9c6637ebc3a73b3f87f9eb1ec24e1ce53a7c5173b8508981614a90b"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d905186d647b16755a800e7263d43df08b790d709d575105d419f8b6ef65423a"}, + {file = "psutil-6.1.0-cp37-abi3-win32.whl", hash = "sha256:1ad45a1f5d0b608253b11508f80940985d1d0c8f6111b5cb637533a0e6ddc13e"}, + {file = "psutil-6.1.0-cp37-abi3-win_amd64.whl", hash = "sha256:a8fb3752b491d246034fa4d279ff076501588ce8cbcdbb62c32fd7a377d996be"}, + {file = "psutil-6.1.0.tar.gz", hash = "sha256:353815f59a7f64cdaca1c0307ee13558a0512f6db064e92fe833784f08539c7a"}, +] + +[[package]] +name = "psycopg2-binary" +version = "2.9.10" +requires_python = ">=3.8" +summary = "psycopg2 - Python-PostgreSQL Database Adapter" +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "psycopg2-binary-2.9.10.tar.gz", hash = "sha256:4b3df0e6990aa98acda57d983942eff13d824135fe2250e6522edaa782a06de2"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:04392983d0bb89a8717772a193cfaac58871321e3ec69514e1c4e0d4957b5aff"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:1a6784f0ce3fec4edc64e985865c17778514325074adf5ad8f80636cd029ef7c"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5f86c56eeb91dc3135b3fd8a95dc7ae14c538a2f3ad77a19645cf55bab1799c"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b3d2491d4d78b6b14f76881905c7a8a8abcf974aad4a8a0b065273a0ed7a2cb"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2286791ececda3a723d1910441c793be44625d86d1a4e79942751197f4d30341"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:512d29bb12608891e349af6a0cccedce51677725a921c07dba6342beaf576f9a"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5a507320c58903967ef7384355a4da7ff3f28132d679aeb23572753cbf2ec10b"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6d4fa1079cab9018f4d0bd2db307beaa612b0d13ba73b5c6304b9fe2fb441ff7"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:851485a42dbb0bdc1edcdabdb8557c09c9655dfa2ca0460ff210522e073e319e"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:35958ec9e46432d9076286dda67942ed6d968b9c3a6a2fd62b48939d1d78bf68"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-win32.whl", hash = "sha256:ecced182e935529727401b24d76634a357c71c9275b356efafd8a2a91ec07392"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-win_amd64.whl", hash = "sha256:ee0e8c683a7ff25d23b55b11161c2663d4b099770f6085ff0a20d4505778d6b4"}, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +summary = "Run a subprocess in a pseudo terminal" +groups = ["dev"] +marker = "(sys_platform != \"win32\" and sys_platform != \"emscripten\") and python_version == \"3.11\"" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +summary = "Safely evaluate AST nodes without side effects" +groups = ["dev"] +marker = "python_version == \"3.11\"" +files = [ + {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, + {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, +] + +[[package]] +name = "pyarrow" +version = "17.0.0" +requires_python = ">=3.8" +summary = "Python library for Apache Arrow" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "numpy>=1.16.6", +] +files = [ + {file = "pyarrow-17.0.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:1c8856e2ef09eb87ecf937104aacfa0708f22dfeb039c363ec99735190ffb977"}, + {file = "pyarrow-17.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e19f569567efcbbd42084e87f948778eb371d308e137a0f97afe19bb860ccb3"}, + {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b244dc8e08a23b3e352899a006a26ae7b4d0da7bb636872fa8f5884e70acf15"}, + {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b72e87fe3e1db343995562f7fff8aee354b55ee83d13afba65400c178ab2597"}, + {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dc5c31c37409dfbc5d014047817cb4ccd8c1ea25d19576acf1a001fe07f5b420"}, + {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:e3343cb1e88bc2ea605986d4b94948716edc7a8d14afd4e2c097232f729758b4"}, + {file = "pyarrow-17.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:a27532c38f3de9eb3e90ecab63dfda948a8ca859a66e3a47f5f42d1e403c4d03"}, + {file = "pyarrow-17.0.0.tar.gz", hash = "sha256:4beca9521ed2c0921c1023e68d097d0299b62c362639ea315572a58f3f50fd28"}, +] + +[[package]] +name = "pyasn1" +version = "0.6.1" +requires_python = ">=3.8" +summary = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, + {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, +] + +[[package]] +name = "pycparser" +version = "2.22" +requires_python = ">=3.8" +summary = "C parser in Python" +groups = ["default"] +marker = "platform_python_implementation != \"PyPy\" and python_version == \"3.11\"" +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + +[[package]] +name = "pydantic" +version = "2.9.2" +requires_python = ">=3.8" +summary = "Data validation using Python type hints" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "annotated-types>=0.6.0", + "pydantic-core==2.23.4", + "typing-extensions>=4.12.2; python_version >= \"3.13\"", + "typing-extensions>=4.6.1; python_version < \"3.13\"", +] +files = [ + {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, + {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, +] + +[[package]] +name = "pydantic-core" +version = "2.23.4" +requires_python = ">=3.8" +summary = "Core functionality for Pydantic validation and serialization" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "typing-extensions!=4.7.0,>=4.6.0", +] +files = [ + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"}, + {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"}, + {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"}, + {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, +] + +[[package]] +name = "pydantic-settings" +version = "2.6.1" +requires_python = ">=3.8" +summary = "Settings management using Pydantic" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "pydantic>=2.7.0", + "python-dotenv>=0.21.0", +] +files = [ + {file = "pydantic_settings-2.6.1-py3-none-any.whl", hash = "sha256:7fb0637c786a558d3103436278a7c4f1cfd29ba8973238a50c5bb9a55387da87"}, + {file = "pydantic_settings-2.6.1.tar.gz", hash = "sha256:e0f92546d8a9923cb8941689abf85d6601a8c19a23e97a34b2964a2e3f813ca0"}, +] + +[[package]] +name = "pygments" +version = "2.18.0" +requires_python = ">=3.8" +summary = "Pygments is a syntax highlighting package written in Python." +groups = ["default", "dev"] +marker = "python_version == \"3.11\"" +files = [ + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, +] + +[[package]] +name = "pyodbc" +version = "5.2.0" +requires_python = ">=3.8" +summary = "DB API module for ODBC" +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "pyodbc-5.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4627779f0a608b51ce2d2fe6d1d395384e65ca36248bf9dbb6d7cf2c8fda1cab"}, + {file = "pyodbc-5.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4d997d3b6551273647825c734158ca8a6f682df269f6b3975f2499c01577ddec"}, + {file = "pyodbc-5.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5102007a8c78dd2fc1c1b6f6147de8cfc020f81013e4b46c33e66aaa7d1bf7b1"}, + {file = "pyodbc-5.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e3cbc7075a46c411b531ada557c4aef13d034060a70077717124cabc1717e2d"}, + {file = "pyodbc-5.2.0-cp311-cp311-win32.whl", hash = "sha256:de1ee7ec2eb326b7be5e2c4ce20d472c5ef1a6eb838d126d1d26779ff5486e49"}, + {file = "pyodbc-5.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:113f904b9852c12f10c7a3288f5a3563ecdbbefe3ccc829074a9eb8255edcd29"}, + {file = "pyodbc-5.2.0.tar.gz", hash = "sha256:de8be39809c8ddeeee26a4b876a6463529cd487a60d1393eb2a93e9bcd44a8f5"}, +] + +[[package]] +name = "pyreadline3" +version = "3.5.4" +requires_python = ">=3.8" +summary = "A python implementation of GNU readline." +groups = ["default"] +marker = "sys_platform == \"win32\" and python_version == \"3.11\"" +files = [ + {file = "pyreadline3-3.5.4-py3-none-any.whl", hash = "sha256:eaf8e6cc3c49bcccf145fc6067ba8643d1df34d604a1ec0eccbf7a18e6d3fae6"}, + {file = "pyreadline3-3.5.4.tar.gz", hash = "sha256:8d57d53039a1c75adba8e50dd3d992b28143480816187ea5efbd5c78e6c885b7"}, +] + +[[package]] +name = "pyspnego" +version = "0.11.2" +requires_python = ">=3.8" +summary = "Windows Negotiate Authentication Client and Server" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "cryptography", + "sspilib>=0.1.0; sys_platform == \"win32\"", +] +files = [ + {file = "pyspnego-0.11.2-py3-none-any.whl", hash = "sha256:74abc1fb51e59360eb5c5c9086e5962174f1072c7a50cf6da0bda9a4bcfdfbd4"}, + {file = "pyspnego-0.11.2.tar.gz", hash = "sha256:994388d308fb06e4498365ce78d222bf4f3570b6df4ec95738431f61510c971b"}, +] + +[[package]] +name = "pytest" +version = "8.3.3" +requires_python = ">=3.8" +summary = "pytest: simple powerful testing with Python" +groups = ["dev"] +marker = "python_version == \"3.11\"" +dependencies = [ + "colorama; sys_platform == \"win32\"", + "exceptiongroup>=1.0.0rc8; python_version < \"3.11\"", + "iniconfig", + "packaging", + "pluggy<2,>=1.5", + "tomli>=1; python_version < \"3.11\"", +] +files = [ + {file = "pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"}, + {file = "pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181"}, +] + +[[package]] +name = "pytest-cov" +version = "5.0.0" +requires_python = ">=3.8" +summary = "Pytest plugin for measuring coverage." +groups = ["dev"] +marker = "python_version == \"3.11\"" +dependencies = [ + "coverage[toml]>=5.2.1", + "pytest>=4.6", +] +files = [ + {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, + {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, +] + +[[package]] +name = "pytest-random-order" +version = "1.1.1" +requires_python = ">=3.5.0" +summary = "Randomise the order in which pytest tests are run with some control over the randomness" +groups = ["dev"] +marker = "python_version == \"3.11\"" +dependencies = [ + "pytest>=3.0.0", +] +files = [ + {file = "pytest-random-order-1.1.1.tar.gz", hash = "sha256:4472d7d34f1f1c5f3a359c4ffc5c13ed065232f31eca19c8844c1ab406e79080"}, + {file = "pytest_random_order-1.1.1-py3-none-any.whl", hash = "sha256:882727a8b597ecd06ede28654ffeb8a6d511a1e4abe1054cca7982f2e42008cd"}, +] + +[[package]] +name = "pytest-xdist" +version = "3.6.1" +requires_python = ">=3.8" +summary = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" +groups = ["dev"] +marker = "python_version == \"3.11\"" +dependencies = [ + "execnet>=2.1", + "pytest>=7.0.0", +] +files = [ + {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, + {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +summary = "Extensions to the standard Python datetime module" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "six>=1.5", +] +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[[package]] +name = "python-dotenv" +version = "1.0.1" +requires_python = ">=3.8" +summary = "Read key-value pairs from a .env file and set them as environment variables" +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, +] + +[[package]] +name = "pytz" +version = "2024.1" +summary = "World timezone definitions, modern and historical" +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, +] + +[[package]] +name = "pywin32" +version = "308" +summary = "Python for Window Extensions" +groups = ["default"] +marker = "platform_system == \"Windows\" and python_version == \"3.11\"" +files = [ + {file = "pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a"}, + {file = "pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b"}, + {file = "pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +requires_python = ">=3.8" +summary = "YAML parser and emitter for Python" +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +] + +[[package]] +name = "requests" +version = "2.32.3" +requires_python = ">=3.8" +summary = "Python HTTP for Humans." +groups = ["default", "dev"] +marker = "python_version == \"3.11\"" +dependencies = [ + "certifi>=2017.4.17", + "charset-normalizer<4,>=2", + "idna<4,>=2.5", + "urllib3<3,>=1.21.1", +] +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[[package]] +name = "requests-ntlm" +version = "1.3.0" +requires_python = ">=3.8" +summary = "This package allows for HTTP NTLM authentication using the requests library." +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "cryptography>=1.3", + "pyspnego>=0.4.0", + "requests>=2.0.0", +] +files = [ + {file = "requests_ntlm-1.3.0-py3-none-any.whl", hash = "sha256:4c7534a7d0e482bb0928531d621be4b2c74ace437e88c5a357ceb7452d25a510"}, + {file = "requests_ntlm-1.3.0.tar.gz", hash = "sha256:b29cc2462623dffdf9b88c43e180ccb735b4007228a542220e882c58ae56c668"}, +] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +summary = "A utility belt for advanced users of python-requests" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "requests<3.0.0,>=2.0.1", +] +files = [ + {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, + {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, +] + +[[package]] +name = "rich" +version = "13.9.4" +requires_python = ">=3.8.0" +summary = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "markdown-it-py>=2.2.0", + "pygments<3.0.0,>=2.13.0", + "typing-extensions<5.0,>=4.0.0; python_version < \"3.11\"", +] +files = [ + {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"}, + {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"}, +] + +[[package]] +name = "ruff" +version = "0.7.4" +requires_python = ">=3.7" +summary = "An extremely fast Python linter and code formatter, written in Rust." +groups = ["dev"] +marker = "python_version == \"3.11\"" +files = [ + {file = "ruff-0.7.4-py3-none-linux_armv6l.whl", hash = "sha256:a4919925e7684a3f18e18243cd6bea7cfb8e968a6eaa8437971f681b7ec51478"}, + {file = "ruff-0.7.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:cfb365c135b830778dda8c04fb7d4280ed0b984e1aec27f574445231e20d6c63"}, + {file = "ruff-0.7.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:63a569b36bc66fbadec5beaa539dd81e0527cb258b94e29e0531ce41bacc1f20"}, + {file = "ruff-0.7.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d06218747d361d06fd2fdac734e7fa92df36df93035db3dc2ad7aa9852cb109"}, + {file = "ruff-0.7.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e0cea28d0944f74ebc33e9f934238f15c758841f9f5edd180b5315c203293452"}, + {file = "ruff-0.7.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80094ecd4793c68b2571b128f91754d60f692d64bc0d7272ec9197fdd09bf9ea"}, + {file = "ruff-0.7.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:997512325c6620d1c4c2b15db49ef59543ef9cd0f4aa8065ec2ae5103cedc7e7"}, + {file = "ruff-0.7.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00b4cf3a6b5fad6d1a66e7574d78956bbd09abfd6c8a997798f01f5da3d46a05"}, + {file = "ruff-0.7.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7dbdc7d8274e1422722933d1edddfdc65b4336abf0b16dfcb9dedd6e6a517d06"}, + {file = "ruff-0.7.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e92dfb5f00eaedb1501b2f906ccabfd67b2355bdf117fea9719fc99ac2145bc"}, + {file = "ruff-0.7.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3bd726099f277d735dc38900b6a8d6cf070f80828877941983a57bca1cd92172"}, + {file = "ruff-0.7.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:2e32829c429dd081ee5ba39aef436603e5b22335c3d3fff013cd585806a6486a"}, + {file = "ruff-0.7.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:662a63b4971807623f6f90c1fb664613f67cc182dc4d991471c23c541fee62dd"}, + {file = "ruff-0.7.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:876f5e09eaae3eb76814c1d3b68879891d6fde4824c015d48e7a7da4cf066a3a"}, + {file = "ruff-0.7.4-py3-none-win32.whl", hash = "sha256:75c53f54904be42dd52a548728a5b572344b50d9b2873d13a3f8c5e3b91f5cac"}, + {file = "ruff-0.7.4-py3-none-win_amd64.whl", hash = "sha256:745775c7b39f914238ed1f1b0bebed0b9155a17cd8bc0b08d3c87e4703b990d6"}, + {file = "ruff-0.7.4-py3-none-win_arm64.whl", hash = "sha256:11bff065102c3ae9d3ea4dc9ecdfe5a5171349cdd0787c1fc64761212fc9cf1f"}, + {file = "ruff-0.7.4.tar.gz", hash = "sha256:cd12e35031f5af6b9b93715d8c4f40360070b2041f81273d0527683d5708fce2"}, +] + +[[package]] +name = "setuptools" +version = "75.6.0" +requires_python = ">=3.9" +summary = "Easily download, build, install, upgrade, and uninstall Python packages" +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "setuptools-75.6.0-py3-none-any.whl", hash = "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d"}, + {file = "setuptools-75.6.0.tar.gz", hash = "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6"}, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +requires_python = ">=3.7" +summary = "Tool to Detect Surrounding Shell" +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, + {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, +] + +[[package]] +name = "six" +version = "1.16.0" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +summary = "Python 2 and 3 compatibility utilities" +groups = ["default", "dev"] +marker = "python_version == \"3.11\"" +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.1" +requires_python = ">=3.7" +summary = "Sniff out which async library your code is running under" +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "snowballstemmer" +version = "2.2.0" +summary = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +groups = ["dev"] +marker = "python_version == \"3.11\"" +files = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] + +[[package]] +name = "soupsieve" +version = "2.6" +requires_python = ">=3.8" +summary = "A modern CSS selector implementation for Beautiful Soup." +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, + {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, +] + +[[package]] +name = "sphinx" +version = "8.1.3" +requires_python = ">=3.10" +summary = "Python documentation generator" +groups = ["dev"] +marker = "python_version == \"3.11\"" +dependencies = [ + "Jinja2>=3.1", + "Pygments>=2.17", + "alabaster>=0.7.14", + "babel>=2.13", + "colorama>=0.4.6; sys_platform == \"win32\"", + "docutils<0.22,>=0.20", + "imagesize>=1.3", + "packaging>=23.0", + "requests>=2.30.0", + "snowballstemmer>=2.2", + "sphinxcontrib-applehelp>=1.0.7", + "sphinxcontrib-devhelp>=1.0.6", + "sphinxcontrib-htmlhelp>=2.0.6", + "sphinxcontrib-jsmath>=1.0.1", + "sphinxcontrib-qthelp>=1.0.6", + "sphinxcontrib-serializinghtml>=1.1.9", + "tomli>=2; python_version < \"3.11\"", +] +files = [ + {file = "sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2"}, + {file = "sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927"}, +] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "2.0.0" +requires_python = ">=3.9" +summary = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" +groups = ["dev"] +marker = "python_version == \"3.11\"" +files = [ + {file = "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5"}, + {file = "sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1"}, +] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "2.0.0" +requires_python = ">=3.9" +summary = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" +groups = ["dev"] +marker = "python_version == \"3.11\"" +files = [ + {file = "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2"}, + {file = "sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad"}, +] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.1.0" +requires_python = ">=3.9" +summary = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +groups = ["dev"] +marker = "python_version == \"3.11\"" +files = [ + {file = "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8"}, + {file = "sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9"}, +] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +requires_python = ">=3.5" +summary = "A sphinx extension which renders display math in HTML via JavaScript" +groups = ["dev"] +marker = "python_version == \"3.11\"" +files = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "2.0.0" +requires_python = ">=3.9" +summary = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" +groups = ["dev"] +marker = "python_version == \"3.11\"" +files = [ + {file = "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb"}, + {file = "sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab"}, +] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "2.0.0" +requires_python = ">=3.9" +summary = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" +groups = ["dev"] +marker = "python_version == \"3.11\"" +files = [ + {file = "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331"}, + {file = "sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d"}, +] + +[[package]] +name = "sqlalchemy" +version = "2.0.36" +requires_python = ">=3.7" +summary = "Database Abstraction Library" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "greenlet!=0.4.17; (platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\") and python_version < \"3.13\"", + "importlib-metadata; python_version < \"3.8\"", + "typing-extensions>=4.6.0", +] +files = [ + {file = "SQLAlchemy-2.0.36-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fd3a55deef00f689ce931d4d1b23fa9f04c880a48ee97af488fd215cf24e2a6c"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4f5e9cd989b45b73bd359f693b935364f7e1f79486e29015813c338450aa5a71"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ddd9db6e59c44875211bc4c7953a9f6638b937b0a88ae6d09eb46cced54eff"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2519f3a5d0517fc159afab1015e54bb81b4406c278749779be57a569d8d1bb0d"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59b1ee96617135f6e1d6f275bbe988f419c5178016f3d41d3c0abb0c819f75bb"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:39769a115f730d683b0eb7b694db9789267bcd027326cccc3125e862eb03bfd8"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-win32.whl", hash = "sha256:66bffbad8d6271bb1cc2f9a4ea4f86f80fe5e2e3e501a5ae2a3dc6a76e604e6f"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-win_amd64.whl", hash = "sha256:23623166bfefe1487d81b698c423f8678e80df8b54614c2bf4b4cfcd7c711959"}, + {file = "SQLAlchemy-2.0.36-py3-none-any.whl", hash = "sha256:fddbe92b4760c6f5d48162aef14824add991aeda8ddadb3c31d56eb15ca69f8e"}, + {file = "sqlalchemy-2.0.36.tar.gz", hash = "sha256:7f2767680b6d2398aea7082e45a774b2b0767b5c8d8ffb9c8b683088ea9b29c5"}, +] + +[[package]] +name = "sspilib" +version = "0.2.0" +requires_python = ">=3.8" +summary = "SSPI API bindings for Python" +groups = ["default"] +marker = "sys_platform == \"win32\" and python_version == \"3.11\"" +files = [ + {file = "sspilib-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e0943204c8ba732966fdc5b69e33cf61d8dc6b24e6ed875f32055d9d7e2f76cd"}, + {file = "sspilib-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d1cdfc5ec2f151f26e21aa50ccc7f9848c969d6f78264ae4f38347609f6722df"}, + {file = "sspilib-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a6c33495a3de1552120c4a99219ebdd70e3849717867b8cae3a6a2f98fef405"}, + {file = "sspilib-0.2.0-cp311-cp311-win32.whl", hash = "sha256:400d5922c2c2261009921157c4b43d868e84640ad86e4dc84c95b07e5cc38ac6"}, + {file = "sspilib-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3e7d19c16ba9189ef8687b591503db06cfb9c5eb32ab1ca3bb9ebc1a8a5f35c"}, + {file = "sspilib-0.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:f65c52ead8ce95eb78a79306fe4269ee572ef3e4dcc108d250d5933da2455ecc"}, + {file = "sspilib-0.2.0.tar.gz", hash = "sha256:4d6cd4290ca82f40705efeb5e9107f7abcd5e647cb201a3d04371305938615b8"}, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +summary = "Extract data from python stack frames and tracebacks for informative displays" +groups = ["dev"] +marker = "python_version == \"3.11\"" +dependencies = [ + "asttokens>=2.1.0", + "executing>=1.2.0", + "pure-eval", +] +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[[package]] +name = "starlette" +version = "0.41.3" +requires_python = ">=3.8" +summary = "The little ASGI library that shines." +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "anyio<5,>=3.4.0", + "typing-extensions>=3.10.0; python_version < \"3.10\"", +] +files = [ + {file = "starlette-0.41.3-py3-none-any.whl", hash = "sha256:44cedb2b7c77a9de33a8b74b2b90e9f50d11fcf25d8270ea525ad71a25374ff7"}, + {file = "starlette-0.41.3.tar.gz", hash = "sha256:0e4ab3d16522a255be6b28260b938eae2482f98ce5cc934cb08dce8dc3ba5835"}, +] + +[[package]] +name = "structlog" +version = "24.4.0" +requires_python = ">=3.8" +summary = "Structured Logging for Python" +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "structlog-24.4.0-py3-none-any.whl", hash = "sha256:597f61e80a91cc0749a9fd2a098ed76715a1c8a01f73e336b746504d1aad7610"}, + {file = "structlog-24.4.0.tar.gz", hash = "sha256:b27bfecede327a6d2da5fbc96bd859f114ecc398a6389d664f62085ee7ae6fc4"}, +] + +[[package]] +name = "tabulate" +version = "0.9.0" +requires_python = ">=3.7" +summary = "Pretty-print tabular data" +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, + {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, +] + +[[package]] +name = "tomli" +version = "2.1.0" +requires_python = ">=3.8" +summary = "A lil' TOML parser" +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "tomli-2.1.0-py3-none-any.whl", hash = "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391"}, + {file = "tomli-2.1.0.tar.gz", hash = "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8"}, +] + +[[package]] +name = "toposort" +version = "1.10" +summary = "Implements a topological sort algorithm." +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "toposort-1.10-py3-none-any.whl", hash = "sha256:cbdbc0d0bee4d2695ab2ceec97fe0679e9c10eab4b2a87a9372b929e70563a87"}, + {file = "toposort-1.10.tar.gz", hash = "sha256:bfbb479c53d0a696ea7402601f4e693c97b0367837c8898bc6471adfca37a6bd"}, +] + +[[package]] +name = "tqdm" +version = "4.67.0" +requires_python = ">=3.7" +summary = "Fast, Extensible Progress Meter" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "colorama; platform_system == \"Windows\"", +] +files = [ + {file = "tqdm-4.67.0-py3-none-any.whl", hash = "sha256:0cd8af9d56911acab92182e88d763100d4788bdf421d251616040cc4d44863be"}, + {file = "tqdm-4.67.0.tar.gz", hash = "sha256:fe5a6f95e6fe0b9755e9469b77b9c3cf850048224ecaa8293d7d2d31f97d869a"}, +] + +[[package]] +name = "traitlets" +version = "5.14.3" +requires_python = ">=3.8" +summary = "Traitlets Python configuration system" +groups = ["dev"] +marker = "python_version == \"3.11\"" +files = [ + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, +] + +[[package]] +name = "typer" +version = "0.13.1" +requires_python = ">=3.7" +summary = "Typer, build great CLIs. Easy to code. Based on Python type hints." +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "click>=8.0.0", + "rich>=10.11.0", + "shellingham>=1.3.0", + "typing-extensions>=3.7.4.3", +] +files = [ + {file = "typer-0.13.1-py3-none-any.whl", hash = "sha256:5b59580fd925e89463a29d363e0a43245ec02765bde9fb77d39e5d0f29dd7157"}, + {file = "typer-0.13.1.tar.gz", hash = "sha256:9d444cb96cc268ce6f8b94e13b4335084cef4c079998a9f4851a90229a3bd25c"}, +] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +requires_python = ">=3.8" +summary = "Backported and Experimental Type Hints for Python 3.8+" +groups = ["default", "dev"] +marker = "python_version == \"3.11\"" +files = [ + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] + +[[package]] +name = "tzdata" +version = "2024.2" +requires_python = ">=2" +summary = "Provider of IANA time zone data" +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, + {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, +] + +[[package]] +name = "universal-pathlib" +version = "0.2.5" +requires_python = ">=3.8" +summary = "pathlib api extended to use fsspec backends" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "fsspec!=2024.3.1,>=2022.1.0", +] +files = [ + {file = "universal_pathlib-0.2.5-py3-none-any.whl", hash = "sha256:a634f700eca827b4ad03bfa0267e51161560dd1de83b051cf0fccf39b3e56b32"}, + {file = "universal_pathlib-0.2.5.tar.gz", hash = "sha256:ea5d4fb8178c2ab469cf4fa46d0ceb16ccb378da46dbbc28a8b9c1eebdccc655"}, +] + +[[package]] +name = "urllib3" +version = "2.2.3" +requires_python = ">=3.8" +summary = "HTTP library with thread-safe connection pooling, file post, and more." +groups = ["default", "dev"] +marker = "python_version == \"3.11\"" +files = [ + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, +] + +[[package]] +name = "uvicorn" +version = "0.32.1" +requires_python = ">=3.8" +summary = "The lightning-fast ASGI server." +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "click>=7.0", + "h11>=0.8", + "typing-extensions>=4.0; python_version < \"3.11\"", +] +files = [ + {file = "uvicorn-0.32.1-py3-none-any.whl", hash = "sha256:82ad92fd58da0d12af7482ecdb5f2470a04c9c9a53ced65b9bbb4a205377602e"}, + {file = "uvicorn-0.32.1.tar.gz", hash = "sha256:ee9519c246a72b1c084cea8d3b44ed6026e78a4a309cbedae9c37e4cb9fbb175"}, +] + +[[package]] +name = "uvicorn" +version = "0.32.1" +extras = ["standard"] +requires_python = ">=3.8" +summary = "The lightning-fast ASGI server." +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "colorama>=0.4; sys_platform == \"win32\"", + "httptools>=0.6.3", + "python-dotenv>=0.13", + "pyyaml>=5.1", + "uvicorn==0.32.1", + "uvloop!=0.15.0,!=0.15.1,>=0.14.0; (sys_platform != \"cygwin\" and sys_platform != \"win32\") and platform_python_implementation != \"PyPy\"", + "watchfiles>=0.13", + "websockets>=10.4", +] +files = [ + {file = "uvicorn-0.32.1-py3-none-any.whl", hash = "sha256:82ad92fd58da0d12af7482ecdb5f2470a04c9c9a53ced65b9bbb4a205377602e"}, + {file = "uvicorn-0.32.1.tar.gz", hash = "sha256:ee9519c246a72b1c084cea8d3b44ed6026e78a4a309cbedae9c37e4cb9fbb175"}, +] + +[[package]] +name = "uvloop" +version = "0.21.0" +requires_python = ">=3.8.0" +summary = "Fast implementation of asyncio event loop on top of libuv" +groups = ["default"] +marker = "(sys_platform != \"cygwin\" and sys_platform != \"win32\") and platform_python_implementation != \"PyPy\" and python_version == \"3.11\"" +files = [ + {file = "uvloop-0.21.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c0f3fa6200b3108919f8bdabb9a7f87f20e7097ea3c543754cabc7d717d95cf8"}, + {file = "uvloop-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0878c2640cf341b269b7e128b1a5fed890adc4455513ca710d77d5e93aa6d6a0"}, + {file = "uvloop-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9fb766bb57b7388745d8bcc53a359b116b8a04c83a2288069809d2b3466c37e"}, + {file = "uvloop-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a375441696e2eda1c43c44ccb66e04d61ceeffcd76e4929e527b7fa401b90fb"}, + {file = "uvloop-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:baa0e6291d91649c6ba4ed4b2f982f9fa165b5bbd50a9e203c416a2797bab3c6"}, + {file = "uvloop-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4509360fcc4c3bd2c70d87573ad472de40c13387f5fda8cb58350a1d7475e58d"}, + {file = "uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3"}, +] + +[[package]] +name = "watchdog" +version = "5.0.3" +requires_python = ">=3.9" +summary = "Filesystem events monitoring" +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f01f4a3565a387080dc49bdd1fefe4ecc77f894991b88ef927edbfa45eb10818"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:91b522adc25614cdeaf91f7897800b82c13b4b8ac68a42ca959f992f6990c490"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d52db5beb5e476e6853da2e2d24dbbbed6797b449c8bf7ea118a4ee0d2c9040e"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dd021efa85970bd4824acacbb922066159d0f9e546389a4743d56919b6758b91"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_armv7l.whl", hash = "sha256:78864cc8f23dbee55be34cc1494632a7ba30263951b5b2e8fc8286b95845f82c"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_i686.whl", hash = "sha256:1e9679245e3ea6498494b3028b90c7b25dbb2abe65c7d07423ecfc2d6218ff7c"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64.whl", hash = "sha256:9413384f26b5d050b6978e6fcd0c1e7f0539be7a4f1a885061473c5deaa57221"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:294b7a598974b8e2c6123d19ef15de9abcd282b0fbbdbc4d23dfa812959a9e05"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_s390x.whl", hash = "sha256:26dd201857d702bdf9d78c273cafcab5871dd29343748524695cecffa44a8d97"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:0f9332243355643d567697c3e3fa07330a1d1abf981611654a1f2bf2175612b7"}, + {file = "watchdog-5.0.3-py3-none-win32.whl", hash = "sha256:c66f80ee5b602a9c7ab66e3c9f36026590a0902db3aea414d59a2f55188c1f49"}, + {file = "watchdog-5.0.3-py3-none-win_amd64.whl", hash = "sha256:f00b4cf737f568be9665563347a910f8bdc76f88c2970121c86243c8cfdf90e9"}, + {file = "watchdog-5.0.3-py3-none-win_ia64.whl", hash = "sha256:49f4d36cb315c25ea0d946e018c01bb028048023b9e103d3d3943f58e109dd45"}, + {file = "watchdog-5.0.3.tar.gz", hash = "sha256:108f42a7f0345042a854d4d0ad0834b741d421330d5f575b81cb27b883500176"}, +] + +[[package]] +name = "watchfiles" +version = "0.24.0" +requires_python = ">=3.8" +summary = "Simple, modern and high performance file watching and code reload in python." +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "anyio>=3.0.0", +] +files = [ + {file = "watchfiles-0.24.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:bdcd5538e27f188dd3c804b4a8d5f52a7fc7f87e7fd6b374b8e36a4ca03db428"}, + {file = "watchfiles-0.24.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2dadf8a8014fde6addfd3c379e6ed1a981c8f0a48292d662e27cabfe4239c83c"}, + {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6509ed3f467b79d95fc62a98229f79b1a60d1b93f101e1c61d10c95a46a84f43"}, + {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8360f7314a070c30e4c976b183d1d8d1585a4a50c5cb603f431cebcbb4f66327"}, + {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:316449aefacf40147a9efaf3bd7c9bdd35aaba9ac5d708bd1eb5763c9a02bef5"}, + {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73bde715f940bea845a95247ea3e5eb17769ba1010efdc938ffcb967c634fa61"}, + {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3770e260b18e7f4e576edca4c0a639f704088602e0bc921c5c2e721e3acb8d15"}, + {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa0fd7248cf533c259e59dc593a60973a73e881162b1a2f73360547132742823"}, + {file = "watchfiles-0.24.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d7a2e3b7f5703ffbd500dabdefcbc9eafeff4b9444bbdd5d83d79eedf8428fab"}, + {file = "watchfiles-0.24.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d831ee0a50946d24a53821819b2327d5751b0c938b12c0653ea5be7dea9c82ec"}, + {file = "watchfiles-0.24.0-cp311-none-win32.whl", hash = "sha256:49d617df841a63b4445790a254013aea2120357ccacbed00253f9c2b5dc24e2d"}, + {file = "watchfiles-0.24.0-cp311-none-win_amd64.whl", hash = "sha256:d3dcb774e3568477275cc76554b5a565024b8ba3a0322f77c246bc7111c5bb9c"}, + {file = "watchfiles-0.24.0-cp311-none-win_arm64.whl", hash = "sha256:9301c689051a4857d5b10777da23fafb8e8e921bcf3abe6448a058d27fb67633"}, + {file = "watchfiles-0.24.0.tar.gz", hash = "sha256:afb72325b74fa7a428c009c1b8be4b4d7c2afedafb2982827ef2156646df2fe1"}, +] + +[[package]] +name = "wcwidth" +version = "0.2.13" +summary = "Measures the displayed width of unicode strings in a terminal" +groups = ["dev"] +marker = "python_version == \"3.11\"" +dependencies = [ + "backports-functools-lru-cache>=1.2.1; python_version < \"3.2\"", +] +files = [ + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, +] + +[[package]] +name = "websockets" +version = "14.1" +requires_python = ">=3.9" +summary = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "websockets-14.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:449d77d636f8d9c17952628cc7e3b8faf6e92a17ec581ec0c0256300717e1512"}, + {file = "websockets-14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a35f704be14768cea9790d921c2c1cc4fc52700410b1c10948511039be824aac"}, + {file = "websockets-14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b1f3628a0510bd58968c0f60447e7a692933589b791a6b572fcef374053ca280"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c3deac3748ec73ef24fc7be0b68220d14d47d6647d2f85b2771cb35ea847aa1"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7048eb4415d46368ef29d32133134c513f507fff7d953c18c91104738a68c3b3"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cf0ad281c979306a6a34242b371e90e891bce504509fb6bb5246bbbf31e7b6"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cc1fc87428c1d18b643479caa7b15db7d544652e5bf610513d4a3478dbe823d0"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f95ba34d71e2fa0c5d225bde3b3bdb152e957150100e75c86bc7f3964c450d89"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9481a6de29105d73cf4515f2bef8eb71e17ac184c19d0b9918a3701c6c9c4f23"}, + {file = "websockets-14.1-cp311-cp311-win32.whl", hash = "sha256:368a05465f49c5949e27afd6fbe0a77ce53082185bbb2ac096a3a8afaf4de52e"}, + {file = "websockets-14.1-cp311-cp311-win_amd64.whl", hash = "sha256:6d24fc337fc055c9e83414c94e1ee0dee902a486d19d2a7f0929e49d7d604b09"}, + {file = "websockets-14.1-py3-none-any.whl", hash = "sha256:4d4fc827a20abe6d544a119896f6b78ee13fe81cbfef416f3f2ddf09a03f0e2e"}, + {file = "websockets-14.1.tar.gz", hash = "sha256:398b10c77d471c0aab20a845e7a60076b6390bfdaac7a6d2edb0d2c59d75e8d8"}, +] + +[[package]] +name = "xlrd" +version = "2.0.1" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +summary = "Library for developers to extract data from Microsoft Excel (tm) .xls spreadsheet files" +groups = ["default"] +marker = "python_version == \"3.11\"" +files = [ + {file = "xlrd-2.0.1-py2.py3-none-any.whl", hash = "sha256:6a33ee89877bd9abc1158129f6e94be74e2679636b8a205b43b85206c3f0bbdd"}, + {file = "xlrd-2.0.1.tar.gz", hash = "sha256:f72f148f54442c6b056bf931dbc34f986fd0c3b0b6b5a58d013c9aef274d0c88"}, +] + +[[package]] +name = "yarl" +version = "1.17.2" +requires_python = ">=3.9" +summary = "Yet another URL library" +groups = ["default"] +marker = "python_version == \"3.11\"" +dependencies = [ + "idna>=2.0", + "multidict>=4.0", + "propcache>=0.2.0", +] +files = [ + {file = "yarl-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:792155279dc093839e43f85ff7b9b6493a8eaa0af1f94f1f9c6e8f4de8c63500"}, + {file = "yarl-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:38bc4ed5cae853409cb193c87c86cd0bc8d3a70fd2268a9807217b9176093ac6"}, + {file = "yarl-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4a8c83f6fcdc327783bdc737e8e45b2e909b7bd108c4da1892d3bc59c04a6d84"}, + {file = "yarl-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c6d5fed96f0646bfdf698b0a1cebf32b8aae6892d1bec0c5d2d6e2df44e1e2d"}, + {file = "yarl-1.17.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:782ca9c58f5c491c7afa55518542b2b005caedaf4685ec814fadfcee51f02493"}, + {file = "yarl-1.17.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ff6af03cac0d1a4c3c19e5dcc4c05252411bf44ccaa2485e20d0a7c77892ab6e"}, + {file = "yarl-1.17.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a3f47930fbbed0f6377639503848134c4aa25426b08778d641491131351c2c8"}, + {file = "yarl-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1fa68a3c921365c5745b4bd3af6221ae1f0ea1bf04b69e94eda60e57958907f"}, + {file = "yarl-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:187df91395c11e9f9dc69b38d12406df85aa5865f1766a47907b1cc9855b6303"}, + {file = "yarl-1.17.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:93d1c8cc5bf5df401015c5e2a3ce75a5254a9839e5039c881365d2a9dcfc6dc2"}, + {file = "yarl-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:11d86c6145ac5c706c53d484784cf504d7d10fa407cb73b9d20f09ff986059ef"}, + {file = "yarl-1.17.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c42774d1d1508ec48c3ed29e7b110e33f5e74a20957ea16197dbcce8be6b52ba"}, + {file = "yarl-1.17.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8e589379ef0407b10bed16cc26e7392ef8f86961a706ade0a22309a45414d7"}, + {file = "yarl-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1056cadd5e850a1c026f28e0704ab0a94daaa8f887ece8dfed30f88befb87bb0"}, + {file = "yarl-1.17.2-cp311-cp311-win32.whl", hash = "sha256:be4c7b1c49d9917c6e95258d3d07f43cfba2c69a6929816e77daf322aaba6628"}, + {file = "yarl-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:ac8eda86cc75859093e9ce390d423aba968f50cf0e481e6c7d7d63f90bae5c9c"}, + {file = "yarl-1.17.2-py3-none-any.whl", hash = "sha256:dd7abf4f717e33b7487121faf23560b3a50924f80e4bef62b22dab441ded8f3b"}, + {file = "yarl-1.17.2.tar.gz", hash = "sha256:753eaaa0c7195244c84b5cc159dc8204b7fd99f716f11198f999f2332a86b178"}, +] diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..df65d10 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,146 @@ +[project] +name = "mex-artificial" +version = "0.1.0" +description = "Create artificial data for the MEx project." +authors = [{ name = "MEx Team", email = "mex@rki.de" }] +readme = { file = "README.md", content-type = "text/markdown" } +license = { file = "LICENSE" } +urls = { Repository = "https://github.com/robert-koch-institut/mex-artificial" } +requires-python = ">=3.11,<3.13" +dependencies = [ + "mex-backend@git+https://github.com/robert-koch-institut/mex-backend.git@0.23.0", + "mex-extractors@git+https://github.com/robert-koch-institut/mex-extractors.git@0.21.0", + "typer>=0.13,<1" +] +optional-dependencies.dev = [ + "ipdb>=0.13,<1", + "mypy>=1,<2", + "pytest-cov>=5,<6", + "pytest-random-order>=1,<2", + "pytest-xdist>=3,<4", + "pytest>=8,<9", + "ruff>=0.7,<1", + "sphinx>=8,<9", +] + +[project.scripts] +artificial = "mex.artificial.main:cli" + +[tool.cruft] +template = "https://github.com/robert-koch-institut/mex-template" +skip = ["CHANGELOG.md", "mex", "tests"] + +[tool.ipdb] +context = 5 + +[tool.mypy] +python_version = "3.11" +show_error_codes = true +strict = true +plugins = ["pydantic.mypy"] + +[tool.pdm] +distribution = true + +[tool.pdm.scripts] +update-all = { cmd = "pdm update --group :all --update-all --save-compatible" } +lock-all = { cmd = "pdm lock --group :all --python='==3.11.*'" } +install-all = { cmd = "pdm install --group :all --frozen-lockfile" } +export-all = { cmd = "pdm export --group :all --no-hashes -f requirements" } +apidoc = { cmd = "pdm run sphinx-apidoc -f -o docs/source mex" } +sphinx = { cmd = "pdm run sphinx-build -aE -b dirhtml docs docs/dist" } +doc = { composite = ["apidoc", "sphinx"] } +wheel = { cmd = "pdm build --no-sdist" } +mypy-daemon = { cmd = "pdm run dmypy run --timeout 7200 -- mex" } +lint = { cmd = "pre-commit run --all-files" } +unit = { cmd = "pdm run pytest -m 'not integration'" } +test = { cmd = "pdm run pytest --numprocesses=auto --dist=worksteal" } +all = { composite = ["install-all", "lint", "test", "doc"] } + +[tool.pydantic-mypy] +warn_untyped_fields = true + +[tool.pytest.ini_options] +addopts = [ + "--verbose", + "--cov", + "--no-cov-on-fail", + "--cov-report=term-missing:skip-covered", + "--cov-fail-under=95", + "--cov-branch", + "--pdbcls=IPython.terminal.debugger:TerminalPdb", + "--random-order-bucket=global", +] +markers = "integration: mark a test as integration test" + +[tool.ruff] +fix = true +line-length = 88 +show-fixes = true + +[tool.ruff.format] +docstring-code-format = true + +[tool.ruff.lint] +ignore = [ + "AIR", # Disable airflow specific rules (we are not using airflow) + "ANN", # Disable all annotations checks (handled by mypy) + "COM", # Disable flake8-commas checks (let ruff format handle that) + "CPY", # Disable copyright notice checks (we have LICENSE files) + "D100", # Allow missing module docstring (for brevity and speed) + "D104", # Allow missing package docstring (for brevity and speed) + "D203", # Disallow blank line before class docstring (inverse of D211) + "D213", # Disallow multi-line docstring starting at second line (inverse of D212) + "D406", # Allow section name ending with newline (google style compat) + "D407", # Allow missing dashed underline after section (google style compat) + "D413", # Allow missing blank line after last section (google style compat) + "DJ", # Disable django specific checks (we are not using django) + "FBT", # Disable boolean type hint checks (for more flexibility) + "FIX", # Allow committing with open TODOs (don't punish committers) + "ISC001", # Disable checks for implicitly concatenated strings (formatter compat) + "N805", # Allow first argument of a method to be non-self (pydantic compat) + "N815", # Allow mixedCase variables in class scope (model compat) + "PTH123", # Allow using builtin open method (simpler than pathlib) + "RUF012", # Allow mutable class attributes (pydantic compat) + "SIM108", # Allow explicit if-else instead of ternary (easier to read) + "TD003", # Allow TODOs without ticket link (don't punish TODO writers) + "TRY003", # Allow long exception message at the raise site (for pydantic) +] +select = ["ALL"] + +[tool.ruff.lint.per-file-ignores] +"docs/**" = [ + "INP001", # Docs folder does not need to be a package +] +"scripts/**" = [ + "INP001", # Scripts folder does not need to be a package +] +"tests/**" = [ + "ARG005", # Allow unused lambda arguments for mocking + "D101", # Allow missing docstring in public class + "D102", # Allow missing docstring in public method + "D103", # Allow missing docstring in public function + "D107", # Allow missing docstring in `__init__` + "E501", # Allow longer lines with test data + "ISC", # Allow implicitly concatenated strings + "N807", # Allow mocking `__init__` + "PLR0915", # Allow functions with many statements + "PLR2004", # Allow comparing with static values + "PT004", # Allow public fixtures without returns + "PT013", # Allow more flexible pytest imports + "S101", # Allow use of `assert` in tests + "SLF", # Allow private member access +] + +[tool.ruff.lint.flake8-import-conventions.extend-aliases] +"reflex" = "rx" + +[tool.ruff.lint.isort] +known-first-party = ["mex", "tests"] + +[tool.ruff.lint.pydocstyle] +convention = "google" + +[build-system] +requires = ["pdm-backend==2.4.1"] +build-backend = "pdm.backend" diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000..51ce8b8 --- /dev/null +++ b/renovate.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "enabledManagers": [ + "github-actions", + "html", + "pep621", + "pip_requirements" + ], + "gitAuthor": "RKIMetadataExchange ", + "lockFileMaintenance": { + "enabled": true, + "schedule": [ + "before 4am on monday" + ] + }, + "packageRules": [ + { + "matchUpdateTypes": [ + "digest", + "lockFileMaintenance", + "major", + "minor", + "patch", + "pin" + ], + "minimumReleaseAge": "7 days" + } + ] +} diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..7470a61 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +cruft==2.15.0 +mex-release==0.3.0 +pdm==2.20.1 +pre-commit==4.0.1 +wheel==0.45.0 diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..b245e97 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,11 @@ +import pytest + +from mex.extractors.settings import Settings + +pytest_plugins = ("mex.common.testing.plugin",) + + +@pytest.fixture(autouse=True) +def settings() -> Settings: + """Load the settings for this pytest session.""" + return Settings.get() diff --git a/tests/test_main.py b/tests/test_main.py new file mode 100644 index 0000000..bba9754 --- /dev/null +++ b/tests/test_main.py @@ -0,0 +1,6 @@ +from mex.extractors.pipeline import run_job_in_process + + +def test_job() -> None: + result = run_job_in_process("merged_artificial") + assert result.success