diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..6757fe6 Binary files /dev/null and b/.DS_Store differ diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..f295e07 --- /dev/null +++ b/.flake8 @@ -0,0 +1,3 @@ +[flake8] +max-line-length = 88 +extend-ignore = E203, E704 diff --git a/.github/workflows/pull-request.yaml b/.github/workflows/pull-request.yaml index 8af9858..f5e1668 100644 --- a/.github/workflows/pull-request.yaml +++ b/.github/workflows/pull-request.yaml @@ -14,3 +14,4 @@ jobs: directory: - matomo-api - Library-Notification-Service + - annual-reports diff --git a/.github/workflows/push-main.yaml b/.github/workflows/push-main.yaml index 304943f..4616dc8 100644 --- a/.github/workflows/push-main.yaml +++ b/.github/workflows/push-main.yaml @@ -29,3 +29,5 @@ jobs: image-name: cern-sis/matomo-api - directory: Library-Notification-Service image-name: cern-sis/library-notifications-service + - directory: annual-reports + image-name: cern-sis/annual-reports diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 1634081..35a6b21 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -30,6 +30,9 @@ jobs: if [ ${{ inputs.directory }} == 'matomo-api' ]; then docker-compose -f matomo-api/docker-compose-tests.yaml up -d fi + if [ ${{ inputs.directory }} == 'annual-reports' ]; then + docker-compose -f annual-reports/docker-compose.yml up -d + fi - uses: actions/setup-python@v4 with: python-version: "3.11" diff --git a/.gitignore b/.gitignore index 68bc17f..dbce267 100644 --- a/.gitignore +++ b/.gitignore @@ -158,3 +158,5 @@ cython_debug/ # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ + +.DS_Store diff --git a/.isort.cfg b/.isort.cfg new file mode 100644 index 0000000..faea09e --- /dev/null +++ b/.isort.cfg @@ -0,0 +1,3 @@ +[settings] +profile=black +known_third_party = api,backoff,cli,click,freezegun,models,psycopg2,pytest,requests,sqlalchemy,structlog diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6b053b4..94a466f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -8,15 +8,10 @@ repos: - id: check-added-large-files - id: flake8 - - repo: https://github.com/asottile/seed-isort-config - rev: v1.9.1 + - repo: https://github.com/pycqa/isort + rev: 5.12.0 hooks: - - id: seed-isort-config - - - repo: https://github.com/pre-commit/mirrors-isort - rev: v4.3.20 - hooks: - - id: isort + - id: isort - repo: https://github.com/python/black rev: stable diff --git a/matomo-api/.python-version b/.python-version similarity index 100% rename from matomo-api/.python-version rename to .python-version diff --git a/Library-Notification-Service/.python-version b/Library-Notification-Service/.python-version deleted file mode 100644 index 0c7d5f5..0000000 --- a/Library-Notification-Service/.python-version +++ /dev/null @@ -1 +0,0 @@ -3.11.4 diff --git a/annual-reports/Dockerfile b/annual-reports/Dockerfile new file mode 100644 index 0000000..495d8c0 --- /dev/null +++ b/annual-reports/Dockerfile @@ -0,0 +1,21 @@ +FROM python:3.8 + +WORKDIR /matomo + +ENV PATH="/root/.local/bin:${PATH}" +ENV PYTHONBUFFERED=0 \ + POETRY_VIRTUALENVS_CREATE=false + + +ARG POETRY_VERSION +ENV POETRY_VERSION="${POETRY_VERSION:-1.6.1}" +RUN curl -sSL https://install.python-poetry.org \ + | python3 - --git https://github.com/python-poetry/poetry.git#{$POETRY_VERSION} \ + && poetry --version + + +COPY poetry.lock pyproject.toml ./ +COPY src ./src + +RUN poetry install +CMD poetry run python src/cli.py diff --git a/annual-reports/README.md b/annual-reports/README.md new file mode 100644 index 0000000..1746df9 --- /dev/null +++ b/annual-reports/README.md @@ -0,0 +1,24 @@ +# Annual Reports + +## Installation +``` +poetry install +docker-compose up -d + +export DB_PASSWORD=annual +export DB_USER=annual +export DB_NAME=annual +export DB_HOST=localhost +export DB_PORT=5432 +``` + +## Run +### With specific years +``` +poetry run python src/cli.py -y 2022 -y 2023 +``` + +### For all years +``` +poetry run python src/cli.py +``` diff --git a/annual-reports/docker-compose.yml b/annual-reports/docker-compose.yml new file mode 100644 index 0000000..fba002c --- /dev/null +++ b/annual-reports/docker-compose.yml @@ -0,0 +1,12 @@ +version: '3.1' + +services: + db: + ports: + - "5432:5432" + image: postgres:14 + restart: always + environment: + POSTGRES_PASSWORD: annual + POSTGRES_USER: annual + POSTGRES_DB: annual diff --git a/annual-reports/poetry.lock b/annual-reports/poetry.lock new file mode 100644 index 0000000..7f228a2 --- /dev/null +++ b/annual-reports/poetry.lock @@ -0,0 +1,1183 @@ +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. + +[[package]] +name = "appnope" +version = "0.1.3" +description = "Disable App Nap on macOS >= 10.9" +optional = false +python-versions = "*" +files = [ + {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, + {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, +] + +[[package]] +name = "asttokens" +version = "2.4.1" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = "*" +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.dependencies] +six = ">=1.12.0" + +[package.extras] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] + +[[package]] +name = "backcall" +version = "0.2.0" +description = "Specifications for callback functions passed in to an API" +optional = false +python-versions = "*" +files = [ + {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, + {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, +] + +[[package]] +name = "backoff" +version = "2.2.1" +description = "Function decoration for backoff and retry" +optional = false +python-versions = ">=3.7,<4.0" +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 = "certifi" +version = "2023.7.22" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.2.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.5" +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 = "exceptiongroup" +version = "1.1.3" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, + {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "executing" +version = "2.0.0" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = "*" +files = [ + {file = "executing-2.0.0-py2.py3-none-any.whl", hash = "sha256:06df6183df67389625f4e763921c6cf978944721abf3e714000200aab95b0657"}, + {file = "executing-2.0.0.tar.gz", hash = "sha256:0ff053696fdeef426cda5bd18eacd94f82c91f49823a2e9090124212ceea9b08"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] + +[[package]] +name = "freezegun" +version = "1.2.2" +description = "Let your Python tests travel through time" +optional = false +python-versions = ">=3.6" +files = [ + {file = "freezegun-1.2.2-py3-none-any.whl", hash = "sha256:ea1b963b993cb9ea195adbd893a48d573fda951b0da64f60883d7e988b606c9f"}, + {file = "freezegun-1.2.2.tar.gz", hash = "sha256:cd22d1ba06941384410cd967d8a99d5ae2442f57dfafeff2fda5de8dc5c05446"}, +] + +[package.dependencies] +python-dateutil = ">=2.7" + +[[package]] +name = "greenlet" +version = "2.0.2" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, + {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, + {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, + {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, + {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, + {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d967650d3f56af314b72df7089d96cda1083a7fc2da05b375d2bc48c82ab3f3c"}, + {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, + {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, + {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, + {file = "greenlet-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d4606a527e30548153be1a9f155f4e283d109ffba663a15856089fb55f933e47"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, + {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, + {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, + {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, + {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, + {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, + {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, + {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, + {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, + {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, + {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, + {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, + {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, + {file = "greenlet-2.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1087300cf9700bbf455b1b97e24db18f2f77b55302a68272c56209d5587c12d1"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, + {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, + {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, + {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8512a0c38cfd4e66a858ddd1b17705587900dd760c6003998e9472b77b56d417"}, + {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, + {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, + {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, + {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, +] + +[package.extras] +docs = ["Sphinx", "docutils (<0.18)"] +test = ["objgraph", "psutil"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "ipdb" +version = "0.13.13" +description = "IPython-enabled pdb" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "ipdb-0.13.13-py3-none-any.whl", hash = "sha256:45529994741c4ab6d2388bfa5d7b725c2cf7fe9deffabdb8a6113aa5ed449ed4"}, + {file = "ipdb-0.13.13.tar.gz", hash = "sha256:e3ac6018ef05126d442af680aad863006ec19d02290561ac88b8b1c0b0cfc726"}, +] + +[package.dependencies] +decorator = {version = "*", markers = "python_version > \"3.6\""} +ipython = {version = ">=7.31.1", markers = "python_version > \"3.6\""} +tomli = {version = "*", markers = "python_version > \"3.6\" and python_version < \"3.11\""} + +[[package]] +name = "ipython" +version = "8.12.3" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ipython-8.12.3-py3-none-any.whl", hash = "sha256:b0340d46a933d27c657b211a329d0be23793c36595acf9e6ef4164bc01a1804c"}, + {file = "ipython-8.12.3.tar.gz", hash = "sha256:3910c4b54543c2ad73d06579aa771041b7d5707b033bd488669b4cf544e3b363"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "sys_platform == \"darwin\""} +backcall = "*" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} +pickleshare = "*" +prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5" +typing-extensions = {version = "*", markers = "python_version < \"3.10\""} + +[package.extras] +all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +black = ["black"] +doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] + +[[package]] +name = "jedi" +version = "0.19.1" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, +] + +[package.dependencies] +parso = ">=0.8.3,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + +[[package]] +name = "matplotlib-inline" +version = "0.1.6" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.5" +files = [ + {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, + {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, +] + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "multidict" +version = "6.0.4" +description = "multidict implementation" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, + {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, + {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, + {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, + {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, + {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, + {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, + {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, + {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, + {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, + {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, + {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, + {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, +] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "parso" +version = "0.8.3" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, + {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, +] + +[package.extras] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["docopt", "pytest (<6.0.0)"] + +[[package]] +name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pickleshare" +version = "0.7.5" +description = "Tiny 'shelve'-like database with concurrency support" +optional = false +python-versions = "*" +files = [ + {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, + {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, +] + +[[package]] +name = "pluggy" +version = "1.3.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.39" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, + {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "psycopg2" +version = "2.9.9" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "psycopg2-2.9.9-cp310-cp310-win32.whl", hash = "sha256:38a8dcc6856f569068b47de286b472b7c473ac7977243593a288ebce0dc89516"}, + {file = "psycopg2-2.9.9-cp310-cp310-win_amd64.whl", hash = "sha256:426f9f29bde126913a20a96ff8ce7d73fd8a216cfb323b1f04da402d452853c3"}, + {file = "psycopg2-2.9.9-cp311-cp311-win32.whl", hash = "sha256:ade01303ccf7ae12c356a5e10911c9e1c51136003a9a1d92f7aa9d010fb98372"}, + {file = "psycopg2-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:121081ea2e76729acfb0673ff33755e8703d45e926e416cb59bae3a86c6a4981"}, + {file = "psycopg2-2.9.9-cp37-cp37m-win32.whl", hash = "sha256:5e0d98cade4f0e0304d7d6f25bbfbc5bd186e07b38eac65379309c4ca3193efa"}, + {file = "psycopg2-2.9.9-cp37-cp37m-win_amd64.whl", hash = "sha256:7e2dacf8b009a1c1e843b5213a87f7c544b2b042476ed7755be813eaf4e8347a"}, + {file = "psycopg2-2.9.9-cp38-cp38-win32.whl", hash = "sha256:ff432630e510709564c01dafdbe996cb552e0b9f3f065eb89bdce5bd31fabf4c"}, + {file = "psycopg2-2.9.9-cp38-cp38-win_amd64.whl", hash = "sha256:bac58c024c9922c23550af2a581998624d6e02350f4ae9c5f0bc642c633a2d5e"}, + {file = "psycopg2-2.9.9-cp39-cp39-win32.whl", hash = "sha256:c92811b2d4c9b6ea0285942b2e7cac98a59e166d59c588fe5cfe1eda58e72d59"}, + {file = "psycopg2-2.9.9-cp39-cp39-win_amd64.whl", hash = "sha256:de80739447af31525feddeb8effd640782cf5998e1a4e9192ebdf829717e3913"}, + {file = "psycopg2-2.9.9.tar.gz", hash = "sha256:d1454bde93fb1e224166811694d600e746430c006fbb031ea06ecc2ea41bf156"}, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +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.2" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, +] + +[package.extras] +tests = ["pytest"] + +[[package]] +name = "pygments" +version = "2.16.1" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, + {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, +] + +[package.extras] +plugins = ["importlib-metadata"] + +[[package]] +name = "pytest" +version = "7.4.2" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, + {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-vcr" +version = "1.0.2" +description = "Plugin for managing VCR.py cassettes" +optional = false +python-versions = "*" +files = [ + {file = "pytest-vcr-1.0.2.tar.gz", hash = "sha256:23ee51b75abbcc43d926272773aae4f39f93aceb75ed56852d0bf618f92e1896"}, + {file = "pytest_vcr-1.0.2-py2.py3-none-any.whl", hash = "sha256:2f316e0539399bea0296e8b8401145c62b6f85e9066af7e57b6151481b0d6d9c"}, +] + +[package.dependencies] +pytest = ">=3.6.0" +vcrpy = "*" + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sqlalchemy" +version = "2.0.22" +description = "Database Abstraction Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "SQLAlchemy-2.0.22-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f146c61ae128ab43ea3a0955de1af7e1633942c2b2b4985ac51cc292daf33222"}, + {file = "SQLAlchemy-2.0.22-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:875de9414393e778b655a3d97d60465eb3fae7c919e88b70cc10b40b9f56042d"}, + {file = "SQLAlchemy-2.0.22-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13790cb42f917c45c9c850b39b9941539ca8ee7917dacf099cc0b569f3d40da7"}, + {file = "SQLAlchemy-2.0.22-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e04ab55cf49daf1aeb8c622c54d23fa4bec91cb051a43cc24351ba97e1dd09f5"}, + {file = "SQLAlchemy-2.0.22-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a42c9fa3abcda0dcfad053e49c4f752eef71ecd8c155221e18b99d4224621176"}, + {file = "SQLAlchemy-2.0.22-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:14cd3bcbb853379fef2cd01e7c64a5d6f1d005406d877ed9509afb7a05ff40a5"}, + {file = "SQLAlchemy-2.0.22-cp310-cp310-win32.whl", hash = "sha256:d143c5a9dada696bcfdb96ba2de4a47d5a89168e71d05a076e88a01386872f97"}, + {file = "SQLAlchemy-2.0.22-cp310-cp310-win_amd64.whl", hash = "sha256:ccd87c25e4c8559e1b918d46b4fa90b37f459c9b4566f1dfbce0eb8122571547"}, + {file = "SQLAlchemy-2.0.22-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4f6ff392b27a743c1ad346d215655503cec64405d3b694228b3454878bf21590"}, + {file = "SQLAlchemy-2.0.22-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f776c2c30f0e5f4db45c3ee11a5f2a8d9de68e81eb73ec4237de1e32e04ae81c"}, + {file = "SQLAlchemy-2.0.22-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8f1792d20d2f4e875ce7a113f43c3561ad12b34ff796b84002a256f37ce9437"}, + {file = "SQLAlchemy-2.0.22-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d80eeb5189d7d4b1af519fc3f148fe7521b9dfce8f4d6a0820e8f5769b005051"}, + {file = "SQLAlchemy-2.0.22-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:69fd9e41cf9368afa034e1c81f3570afb96f30fcd2eb1ef29cb4d9371c6eece2"}, + {file = "SQLAlchemy-2.0.22-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:54bcceaf4eebef07dadfde424f5c26b491e4a64e61761dea9459103ecd6ccc95"}, + {file = "SQLAlchemy-2.0.22-cp311-cp311-win32.whl", hash = "sha256:7ee7ccf47aa503033b6afd57efbac6b9e05180f492aeed9fcf70752556f95624"}, + {file = "SQLAlchemy-2.0.22-cp311-cp311-win_amd64.whl", hash = "sha256:b560f075c151900587ade06706b0c51d04b3277c111151997ea0813455378ae0"}, + {file = "SQLAlchemy-2.0.22-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:2c9bac865ee06d27a1533471405ad240a6f5d83195eca481f9fc4a71d8b87df8"}, + {file = "SQLAlchemy-2.0.22-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:625b72d77ac8ac23da3b1622e2da88c4aedaee14df47c8432bf8f6495e655de2"}, + {file = "SQLAlchemy-2.0.22-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b39a6e21110204a8c08d40ff56a73ba542ec60bab701c36ce721e7990df49fb9"}, + {file = "SQLAlchemy-2.0.22-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53a766cb0b468223cafdf63e2d37f14a4757476157927b09300c8c5832d88560"}, + {file = "SQLAlchemy-2.0.22-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0e1ce8ebd2e040357dde01a3fb7d30d9b5736b3e54a94002641dfd0aa12ae6ce"}, + {file = "SQLAlchemy-2.0.22-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:505f503763a767556fa4deae5194b2be056b64ecca72ac65224381a0acab7ebe"}, + {file = "SQLAlchemy-2.0.22-cp312-cp312-win32.whl", hash = "sha256:154a32f3c7b00de3d090bc60ec8006a78149e221f1182e3edcf0376016be9396"}, + {file = "SQLAlchemy-2.0.22-cp312-cp312-win_amd64.whl", hash = "sha256:129415f89744b05741c6f0b04a84525f37fbabe5dc3774f7edf100e7458c48cd"}, + {file = "SQLAlchemy-2.0.22-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3940677d341f2b685a999bffe7078697b5848a40b5f6952794ffcf3af150c301"}, + {file = "SQLAlchemy-2.0.22-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55914d45a631b81a8a2cb1a54f03eea265cf1783241ac55396ec6d735be14883"}, + {file = "SQLAlchemy-2.0.22-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2096d6b018d242a2bcc9e451618166f860bb0304f590d205173d317b69986c95"}, + {file = "SQLAlchemy-2.0.22-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:19c6986cf2fb4bc8e0e846f97f4135a8e753b57d2aaaa87c50f9acbe606bd1db"}, + {file = "SQLAlchemy-2.0.22-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6ac28bd6888fe3c81fbe97584eb0b96804bd7032d6100b9701255d9441373ec1"}, + {file = "SQLAlchemy-2.0.22-cp37-cp37m-win32.whl", hash = "sha256:cb9a758ad973e795267da334a92dd82bb7555cb36a0960dcabcf724d26299db8"}, + {file = "SQLAlchemy-2.0.22-cp37-cp37m-win_amd64.whl", hash = "sha256:40b1206a0d923e73aa54f0a6bd61419a96b914f1cd19900b6c8226899d9742ad"}, + {file = "SQLAlchemy-2.0.22-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3aa1472bf44f61dd27987cd051f1c893b7d3b17238bff8c23fceaef4f1133868"}, + {file = "SQLAlchemy-2.0.22-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:56a7e2bb639df9263bf6418231bc2a92a773f57886d371ddb7a869a24919face"}, + {file = "SQLAlchemy-2.0.22-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccca778c0737a773a1ad86b68bda52a71ad5950b25e120b6eb1330f0df54c3d0"}, + {file = "SQLAlchemy-2.0.22-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c6c3e9350f9fb16de5b5e5fbf17b578811a52d71bb784cc5ff71acb7de2a7f9"}, + {file = "SQLAlchemy-2.0.22-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:564e9f9e4e6466273dbfab0e0a2e5fe819eec480c57b53a2cdee8e4fdae3ad5f"}, + {file = "SQLAlchemy-2.0.22-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:af66001d7b76a3fab0d5e4c1ec9339ac45748bc4a399cbc2baa48c1980d3c1f4"}, + {file = "SQLAlchemy-2.0.22-cp38-cp38-win32.whl", hash = "sha256:9e55dff5ec115316dd7a083cdc1a52de63693695aecf72bc53a8e1468ce429e5"}, + {file = "SQLAlchemy-2.0.22-cp38-cp38-win_amd64.whl", hash = "sha256:4e869a8ff7ee7a833b74868a0887e8462445ec462432d8cbeff5e85f475186da"}, + {file = "SQLAlchemy-2.0.22-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9886a72c8e6371280cb247c5d32c9c8fa141dc560124348762db8a8b236f8692"}, + {file = "SQLAlchemy-2.0.22-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a571bc8ac092a3175a1d994794a8e7a1f2f651e7c744de24a19b4f740fe95034"}, + {file = "SQLAlchemy-2.0.22-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8db5ba8b7da759b727faebc4289a9e6a51edadc7fc32207a30f7c6203a181592"}, + {file = "SQLAlchemy-2.0.22-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b0b3f2686c3f162123adba3cb8b626ed7e9b8433ab528e36ed270b4f70d1cdb"}, + {file = "SQLAlchemy-2.0.22-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0c1fea8c0abcb070ffe15311853abfda4e55bf7dc1d4889497b3403629f3bf00"}, + {file = "SQLAlchemy-2.0.22-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4bb062784f37b2d75fd9b074c8ec360ad5df71f933f927e9e95c50eb8e05323c"}, + {file = "SQLAlchemy-2.0.22-cp39-cp39-win32.whl", hash = "sha256:58a3aba1bfb32ae7af68da3f277ed91d9f57620cf7ce651db96636790a78b736"}, + {file = "SQLAlchemy-2.0.22-cp39-cp39-win_amd64.whl", hash = "sha256:92e512a6af769e4725fa5b25981ba790335d42c5977e94ded07db7d641490a85"}, + {file = "SQLAlchemy-2.0.22-py3-none-any.whl", hash = "sha256:3076740335e4aaadd7deb3fe6dcb96b3015f1613bd190a4e1634e1b99b02ec86"}, + {file = "SQLAlchemy-2.0.22.tar.gz", hash = "sha256:5434cc601aa17570d79e5377f5fd45ff92f9379e2abed0be5e8c2fba8d353d2b"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} +typing-extensions = ">=4.2.0" + +[package.extras] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx-oracle (>=7)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] +sqlcipher = ["sqlcipher3-binary"] + +[[package]] +name = "sqlalchemy-utils" +version = "0.41.1" +description = "Various utility functions for SQLAlchemy." +optional = false +python-versions = ">=3.6" +files = [ + {file = "SQLAlchemy-Utils-0.41.1.tar.gz", hash = "sha256:a2181bff01eeb84479e38571d2c0718eb52042f9afd8c194d0d02877e84b7d74"}, + {file = "SQLAlchemy_Utils-0.41.1-py3-none-any.whl", hash = "sha256:6c96b0768ea3f15c0dc56b363d386138c562752b84f647fb8d31a2223aaab801"}, +] + +[package.dependencies] +SQLAlchemy = ">=1.3" + +[package.extras] +arrow = ["arrow (>=0.3.4)"] +babel = ["Babel (>=1.3)"] +color = ["colour (>=0.0.4)"] +encrypted = ["cryptography (>=0.6)"] +intervals = ["intervals (>=0.7.1)"] +password = ["passlib (>=1.6,<2.0)"] +pendulum = ["pendulum (>=2.0.5)"] +phone = ["phonenumbers (>=5.9.2)"] +test = ["Jinja2 (>=2.3)", "Pygments (>=1.2)", "backports.zoneinfo", "docutils (>=0.10)", "flake8 (>=2.4.0)", "flexmock (>=0.9.7)", "isort (>=4.2.2)", "pg8000 (>=1.12.4)", "psycopg (>=3.1.8)", "psycopg2 (>=2.5.1)", "psycopg2cffi (>=2.8.1)", "pymysql", "pyodbc", "pytest (>=2.7.1)", "python-dateutil (>=2.6)", "pytz (>=2014.2)"] +test-all = ["Babel (>=1.3)", "Jinja2 (>=2.3)", "Pygments (>=1.2)", "arrow (>=0.3.4)", "backports.zoneinfo", "colour (>=0.0.4)", "cryptography (>=0.6)", "docutils (>=0.10)", "flake8 (>=2.4.0)", "flexmock (>=0.9.7)", "furl (>=0.4.1)", "intervals (>=0.7.1)", "isort (>=4.2.2)", "passlib (>=1.6,<2.0)", "pendulum (>=2.0.5)", "pg8000 (>=1.12.4)", "phonenumbers (>=5.9.2)", "psycopg (>=3.1.8)", "psycopg2 (>=2.5.1)", "psycopg2cffi (>=2.8.1)", "pymysql", "pyodbc", "pytest (>=2.7.1)", "python-dateutil", "python-dateutil (>=2.6)", "pytz (>=2014.2)"] +timezone = ["python-dateutil"] +url = ["furl (>=0.4.1)"] + +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +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.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + +[[package]] +name = "structlog" +version = "23.2.0" +description = "Structured Logging for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "structlog-23.2.0-py3-none-any.whl", hash = "sha256:16a167e87b9fa7fae9a972d5d12805ef90e04857a93eba479d4be3801a6a1482"}, + {file = "structlog-23.2.0.tar.gz", hash = "sha256:334666b94707f89dbc4c81a22a8ccd34449f0201d5b1ee097a030b577fa8c858"}, +] + +[package.extras] +dev = ["structlog[tests,typing]"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-mermaid", "twisted"] +tests = ["freezegun (>=0.2.8)", "pretend", "pytest (>=6.0)", "pytest-asyncio (>=0.17)", "simplejson"] +typing = ["mypy (>=1.4)", "rich", "twisted"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "traitlets" +version = "5.12.0" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +files = [ + {file = "traitlets-5.12.0-py3-none-any.whl", hash = "sha256:81539f07f7aebcde2e4b5ab76727f53eabf18ad155c6ed7979a681411602fa47"}, + {file = "traitlets-5.12.0.tar.gz", hash = "sha256:833273bf645d8ce31dcb613c56999e2e055b1ffe6d09168a164bcd91c36d5d35"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.6.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] + +[[package]] +name = "typing-extensions" +version = "4.8.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, + {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, +] + +[[package]] +name = "urllib3" +version = "1.26.7" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" +files = [ + {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, + {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, +] + +[package.extras] +brotli = ["brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "vcrpy" +version = "4.3.0" +description = "Automatically mock your HTTP interactions to simplify and speed up testing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "vcrpy-4.3.0-py2.py3-none-any.whl", hash = "sha256:8fbd4be412e8a7f35f623dd61034e6380a1c8dbd0edf6e87277a3289f6e98093"}, + {file = "vcrpy-4.3.0.tar.gz", hash = "sha256:49c270ce67e826dba027d83e20d25b67a5885487697e97bca6dbdf53d750a0ac"}, +] + +[package.dependencies] +PyYAML = "*" +six = ">=1.5" +wrapt = "*" +yarl = "*" + +[[package]] +name = "wcwidth" +version = "0.2.8" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.8-py2.py3-none-any.whl", hash = "sha256:77f719e01648ed600dfa5402c347481c0992263b81a027344f3e1ba25493a704"}, + {file = "wcwidth-0.2.8.tar.gz", hash = "sha256:8705c569999ffbb4f6a87c6d1b80f324bd6db952f5eb0b95bc07517f4c1813d4"}, +] + +[[package]] +name = "wrapt" +version = "1.15.0" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, + {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, + {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, + {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, + {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, + {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, + {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, + {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, + {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, + {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, + {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, + {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, + {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, + {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, + {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, + {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, + {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, + {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, + {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, +] + +[[package]] +name = "yarl" +version = "1.9.2" +description = "Yet another URL library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, + {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, + {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, + {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, + {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, + {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, + {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, + {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, + {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, + {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, + {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, + {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, + {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[metadata] +lock-version = "2.0" +python-versions = "^3.8" +content-hash = "decf7367f1ac3cbedf0868149100e5f155a27e0381a8a89c6d52a62f8eb13514" diff --git a/annual-reports/pyproject.toml b/annual-reports/pyproject.toml new file mode 100644 index 0000000..fbc5fd5 --- /dev/null +++ b/annual-reports/pyproject.toml @@ -0,0 +1,31 @@ +[tool.poetry] +name = "Annual Reports" +version = "0.1.0" +description = "" +authors = ["CERN SIS TS"] +packages = [ + { include = "*", from = "src" }, +] + +[tool.poetry.dependencies] +python = "^3.8" +requests = "^2.31.0" +click = "^8.1.7" +pytest = "^7.4.2" +pytest-vcr = "^1.0.2" +urllib3 = "1.26.7" +freezegun = "^1.2.2" +sqlalchemy = "^2.0.22" +sqlalchemy-utils = "^0.41.1" +structlog = "^23.2.0" +backoff = "^2.2.1" +psycopg2 = "^2.9.9" + +[tool.poetry.dev-dependencies] + +[tool.poetry.group.dev.dependencies] +ipdb = "^0.13.13" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/annual-reports/src/__init__.py b/annual-reports/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/annual-reports/src/api.py b/annual-reports/src/api.py new file mode 100644 index 0000000..cbabd48 --- /dev/null +++ b/annual-reports/src/api.py @@ -0,0 +1,273 @@ +import datetime +import os +import re + +import backoff +import requests +import structlog +from models import Base, Categories, Journals, Publications +from sqlalchemy import create_engine +from sqlalchemy.orm import Session + +# noqa: E501 +PUBLICATIONS_PER_YEAR = "https://cds.cern.ch/search?p=(980:ARTICLE+or+980:BOOK+or+980:PROCEEDINGS+or+690:'YELLOW+REPORT'+or+980:REPORT)+and+year:{year}+and+(affiliation:CERN+or+260:CERN+or+595:'For+annual+report')+not+595:'Not+for+annual+report'&of=xm&rg=1" # noqa: E501 +JOURNALS_PER_YEAR = "https://cds.cern.ch/search?ln=en&cc=Published+Articles&p=(affiliation:CERN+or+595:'For+annual+report')+and+year:{year}+not+980:ConferencePaper+not+980:BookChapter+not+595:'Not+for+annual+report'&action_search=Search&op1=a&m1=a&p1=&f1=&c=Published+Articles&c=&sf=&so=d&rm=&rg=2000&sc=0&of=tb&ot=773__p" # noqa: E501 +PUBLISHED_ARTICLES_PER_YEAR = "https://cds.cern.ch/search?ln=en&cc=Published+Articles&p=%28affiliation%3ACERN+or+595%3A%27For+annual+report%27%29+and+year%3A{year}+not+980%3AConferencePaper+not+980%3ABookChapter+not+595%3A%27Not+for+annual+report%27&action_search=Search&op1=a&m1=a&p1=&f1=&c=Published+Articles&c=&sf=&so=d&rm=&rg=1&sc=0&of=xm" # noqa: E501 +CONTRIBUTIONS_TO_CONFERENCE_PROCEEDINGS_PER_YEAR = "https://cds.cern.ch/search?wl=0&ln=en&cc=Published+Articles&p=980%3AARTICLE+and+%28affiliation%3ACERN+or+595%3A%27For+annual+report%27%29+and+year%3A{year}+and+980%3AConferencePaper+not+595%3A%27Not+for+annual+report%27&f=&action_search=Search&c=Published+Articles&c=&sf=author&so=a&rm=&rg=1&sc=1&of=xm" # noqa: E501 +REPORTS_BOOKS_AND_BOOK_CHAPTERS_PER_YEAR = "https://cds.cern.ch/search?ln=en&p=affiliation%3ACERN+or+260%3ACERN+and+260%3A{year}++and+%28980%3ABOOK+or+980%3APROCEEDINGS+or+690%3A%27YELLOW+REPORT%27+or+980%3ABookChapter+or+980%3AREPORT%29+not+595%3A%27Not+for+annual+report%27&action_search=Search&op1=a&m1=a&p1=&f1=&c=Articles+%26+Preprints&c=Books+%26+Proceedings&sf=&so=d&rm=&rg=1&sc=1&of=xm" # noqa: E501 +THESES_PER_YEAR = "https://cds.cern.ch/search?wl=0&ln=en&cc=CERN+Theses&p=502%3A%27{year}%27+and+502%3Aphd&f=&action_search=Search&c=CERN+Theses&c=&sf=&so=d&rm=&rg=1&sc=1&of=xm" # noqa: E501,E261 +SUBJECT_CATEGORIES_PER_YEAR = "https://cds.cern.ch/search?ln=en&cc=Published+Articles&p=(affiliation:CERN+or+595:'For+annual+report')+and+year:{year}+not+980:ConferencePaper+not+980:BookChapter+not+595:'Not+for+annual+report'&action_search=Search&op1=a&m1=a&p1=&f1=&c=Published+Articles&c=&sf=&so=d&rm=&rg=2000&sc=0&of=tb&ot=65017" # noqa: E501 + + +LOGGING = structlog.get_logger("Annual_Report_API") + + +def _backoff_handler(details): + LOGGING.info( + "Backing off {wait:0.1f} seconds after {tries} tries " + "calling function {target} with args {args} and kwargs " + "{kwargs}".format(**details) + ) + + +def get_number_of_records(url): + # Get the response from the URL + response = requests.get(url) + # Raise exception if HTTP error + response.raise_for_status() + match = re.search(r"Search-Engine-Total-Number-Of-Results: (\d+)", response.text) + # Return the number of records + if match: + return int(match.group(1)) + return None + + +@backoff.on_exception( + backoff.expo, + requests.exceptions.RequestException, + max_tries=5, + on_backoff=_backoff_handler, +) +def get_publications_per_year(year): + """ + Get the number of publications for each publication type for a given year. + + Parameters + ---------- + year : int + The year to get the number of publications for. + + Returns + ------- + dict + The number of publications for each publication type for the given year. + """ + publications_per_year = get_number_of_records( + PUBLICATIONS_PER_YEAR.format(year=year) + ) + published_articles_per_year = get_number_of_records( + PUBLISHED_ARTICLES_PER_YEAR.format(year=year) + ) + contributions_to_conference_proceedings_per_year = get_number_of_records( + CONTRIBUTIONS_TO_CONFERENCE_PROCEEDINGS_PER_YEAR.format(year=year) + ) + reports_books_and_book_chapters_per_year = get_number_of_records( + REPORTS_BOOKS_AND_BOOK_CHAPTERS_PER_YEAR.format(year=year) + ) + theses_per_year = get_number_of_records(THESES_PER_YEAR.format(year=year)) + + return { + "publications": publications_per_year, + "published_articles": published_articles_per_year, + "contributions_to_conference_proceedings": contributions_to_conference_proceedings_per_year, # noqa: E501,E261 + "reports_books_and_book_chapters": reports_books_and_book_chapters_per_year, + "theses": theses_per_year, + } + + +@backoff.on_exception( + backoff.expo, + requests.exceptions.RequestException, + max_tries=5, + on_backoff=_backoff_handler, +) +def get_journals_per_year(year): + """ + Get the number of publications for each journal for a given year. + + Parameters + ---------- + year : int + The year to get the number of publications for. + + Returns + ------- + dict + The number of publications for each journal for the given year. + """ + url = JOURNALS_PER_YEAR.format(year=year) + + response = requests.get(url) + + response.raise_for_status() + journals = response.text.split("\n") + + journal_to_count = {} + for journal in journals: + journal_name = journal + if journal_name in journal_to_count: + journal_to_count[journal_name] += 1 + else: + if journal_name: + journal_to_count[journal_name] = 1 + return journal_to_count + + +@backoff.on_exception( + backoff.expo, + requests.exceptions.RequestException, + max_tries=5, + on_backoff=_backoff_handler, +) +def get_subject_categories_per_year(year): + """ + Get the number of publications for each subject category for a given year. + + Parameters + ---------- + year : int + The year to get the number of categories for. + + Returns + ------- + dict + The number of categories for the given year. + """ + + url = SUBJECT_CATEGORIES_PER_YEAR.format(year=year) + + response = requests.get(url) + response.raise_for_status() + + categories = response.text.split("\n") + + categories_to_count = {} + + for category in categories: + if "SzGeCERN" not in category: + continue + + try: + category_name = category.split("$$a")[1].split("$$")[0] + except IndexError: + # Skip this category since it's malformed + continue + + if category_name in categories_to_count: + categories_to_count[category_name] += 1 + else: + categories_to_count[category_name] = 1 + + return categories_to_count + + +class AnnualReportsAPI: + def __init__( + self, + db_user: str = "", + db_password: str = "", + db_host: str = "", + db_name: str = "", + db_port: str = "", + years: list = None, + ) -> None: + self.db_user = db_user or os.environ.get("DB_USER") + self.db_password = db_password or os.environ.get("DB_PASSWORD") + self.db_host = db_host or os.environ.get("DB_HOST") + self.db_name = db_name or os.environ.get("DB_NAME") + self.db_port = db_port or os.environ.get("DB_PORT") + if not all( + [ + self.db_user, + self.db_password, + self.db_host, + self.db_name, + self.db_port, + ] + ): + raise ValueError("All the required attributes must be passed!") + self.years = years + if not self.years: + current_year = datetime.datetime.now().year + self.years = list(range(2004, current_year + 1)) + database_url = f"postgresql://{self.db_name}:{self.db_password}@{self.db_host}:{self.db_port}/{self.db_name}" # noqa: E501 + self.engine = create_engine(database_url) + + def create_tables(self): + Base.metadata.create_all(self.engine, checkfirst=True) + + def get_categories(self): + for year in self.years: + year = int(year) + LOGGING.info("Getting categories", year=year) + results = get_subject_categories_per_year(year) + with Session(self.engine) as session: + try: + LOGGING.info("Deleting categories", year=year) + session.query(Categories).filter_by(year=year).delete() + records = [ + Categories(year=year, category=key, count=value) + for key, value in results.items() + ] + LOGGING.info( + "Populate categories", count=len(records), categories=results + ) + session.add_all(records) + session.commit() + except Exception as e: + print("ERROR: " + str(e)) + LOGGING.exception("Populate categories") + else: + LOGGING.info("Populate categories success") + + def get_journals(self): + for year in self.years: + year = int(year) + LOGGING.info("Getting journals", year=year) + results = get_journals_per_year(year) + with Session(self.engine) as session: + try: + LOGGING.info("Deleting journals", year=year) + session.query(Journals).filter_by(year=year).delete() + records = [ + Journals(year=year, journal=key, count=value) + for key, value in results.items() + ] + LOGGING.info( + "Populate journals", count=len(records), journals=results + ) + session.add_all(records) + session.commit() + except Exception as e: # noqa: F841 + LOGGING.exception("Populate journals") + else: + LOGGING.info("Populate journals success") + + def get_publications(self): + for year in self.years: + year = int(year) + LOGGING.info("Getting publications", year=year) + results = get_publications_per_year(year) + with Session(self.engine) as session: + try: + LOGGING.info("Deleting publications", year=year) + session.query(Publications).filter_by(year=year).delete() + LOGGING.info("Populate publications", publications=results) + records = Publications(year=year, **results) + session.add(records) + session.commit() + except Exception as e: + print("ERROR: " + str(e)) + LOGGING.exception("Populate publications") + else: + LOGGING.info("Populate publications success") diff --git a/annual-reports/src/cli.py b/annual-reports/src/cli.py new file mode 100644 index 0000000..7c21314 --- /dev/null +++ b/annual-reports/src/cli.py @@ -0,0 +1,26 @@ +import click +from api import AnnualReportsAPI + + +@click.command() +@click.option("--years", "-y", multiple=True, default=[]) +def fetch_annual_reports(years: list[int]): + annual_reports = AnnualReportsAPI(years=years) + + click.echo("Create tables if missing") + annual_reports.create_tables() + + click.echo("Fetching categories") + annual_reports.get_categories() + + click.echo("Fetching journals") + annual_reports.get_journals() + + click.echo("Fetching publications") + annual_reports.get_publications() + + click.echo("Done") + + +if __name__ == "__main__": + fetch_annual_reports() diff --git a/annual-reports/src/models.py b/annual-reports/src/models.py new file mode 100644 index 0000000..eea6061 --- /dev/null +++ b/annual-reports/src/models.py @@ -0,0 +1,34 @@ +from sqlalchemy import Column, Integer, String +from sqlalchemy.orm import declarative_base + +Base = declarative_base() + + +class Publications(Base): + __tablename__ = "annual_reports_publications" + + id = Column(Integer, primary_key=True) + publications = Column(Integer, nullable=False) + published_articles = Column(Integer, nullable=False) + contributions_to_conference_proceedings = Column(Integer, nullable=False) + reports_books_and_book_chapters = Column(Integer, nullable=False) + theses = Column(Integer, nullable=False) + year = Column(Integer, nullable=False) + + +class Categories(Base): + __tablename__ = "annual_reports_categories" + + id = Column(Integer, primary_key=True) + category = Column(String, nullable=False) + count = Column(Integer, nullable=False) + year = Column(Integer, nullable=False) + + +class Journals(Base): + __tablename__ = "annual_reports_journals" + + id = Column(Integer, primary_key=True) + journal = Column(String, nullable=False) + count = Column(Integer, nullable=False) + year = Column(Integer, nullable=False) diff --git a/annual-reports/tests/cassettes/TestAPI.test_categories.yaml b/annual-reports/tests/cassettes/TestAPI.test_categories.yaml new file mode 100644 index 0000000..06396cc --- /dev/null +++ b/annual-reports/tests/cassettes/TestAPI.test_categories.yaml @@ -0,0 +1,83 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.31.0 + method: GET + uri: https://cds.cern.ch/search?ln=en&cc=Published+Articles&p=(affiliation:CERN+or+595:'For+annual+report')+and+year:2022+not+980:ConferencePaper+not+980:BookChapter+not+595:'Not+for+annual+report'&action_search=Search&op1=a&m1=a&p1=&f1=&c=Published+Articles&c=&sf=&so=d&rm=&rg=2000&sc=0&of=tb&ot=65017 + response: + body: + string: !!binary | + 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 + headers: + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - public, max-age=3600, no-cache="set-cookie" + Connection: + - Keep-Alive + Content-Encoding: + - gzip + Content-Length: + - '2044' + Content-Type: + - text/plain; charset=utf-8 + Date: + - Fri, 27 Oct 2023 10:00:56 GMT + Keep-Alive: + - timeout=15, max=100 + Server: + - Apache + Set-Cookie: + - INVENIOSESSIONstub=NO; path=/; HttpOnly + - INVENIOSESSION=59bf15054e31b9da5fc59b7266740c8c; path=/; HttpOnly + Vary: + - ETag,Cache-Control,Accept-Encoding + Via: + - 1.1 cds.cern.ch + status: + code: 200 + message: OK +version: 1 diff --git a/annual-reports/tests/cassettes/TestAPI.test_journals.yaml b/annual-reports/tests/cassettes/TestAPI.test_journals.yaml new file mode 100644 index 0000000..390957c --- /dev/null +++ b/annual-reports/tests/cassettes/TestAPI.test_journals.yaml @@ -0,0 +1,68 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.31.0 + method: GET + uri: https://cds.cern.ch/search?ln=en&cc=Published+Articles&p=(affiliation:CERN+or+595:'For+annual+report')+and+year:2022+not+980:ConferencePaper+not+980:BookChapter+not+595:'Not+for+annual+report'&action_search=Search&op1=a&m1=a&p1=&f1=&c=Published+Articles&c=&sf=&so=d&rm=&rg=2000&sc=0&of=tb&ot=773__p + response: + body: + string: !!binary | + H4sIAAAAAAAAA6VWy5biNhDd6yv0AWl/QHbGmIw5wDiYk6zVshrrxJaIHnD89yk9jBENM/RkBZJL + Vbeqbl1pXTUHUqOqLEt8UEToDOenU5/hxp6YolK0GTp0DG+Z1kwcmULVKi/eagJf9Xex4YKhlTVW + gQmnSr5z2cvjiFZKCsPBBnMBh1tOneU6w3vSgkmGayVNhsr1brutcN2NmlONdsR7Kjo2QFgH5ySV + cS5qqaTV3hMJaHNKARPaEsMUJ71GpThziArQKc/wgdFOQKAkNQgOkXuiB+JcBVNUlHmDmxOhDK+z + yc3AhNHJ4Zoo0vesx0uujeLvcHrUJgZwf9mgnQNI0ifgs/JLwNhluBKthYMjqsQZCsNcCcBJNZAj + F0dUd9IA+mdpFB0X0SUuUC37cQAnPpgcTtZMffOxUGlVhldcEEHdliDHDCp1FMzIb2OrZDuKVyoT + wpWtpRnKzSB1mlr43BjomsaN7HnL8QLlxTZ4JdRwKTSW0D7Fz4SOmIgWN4xaxc2IJuAxKTkMFlAV + Ckrp+nn9k1NDsO+zKwMbnL37nS2aC9dQe2mVID2WH/gPJjXlTABFHjj05JyS2Mt3aTz5LO1dl6BH + FlLcMtPJVkd0e6az33COptU58wSEAwtGhpQooV6+7xT6vmFEieDBbVbCMJgjKMO/NgBcEOM47KBC + RULktJ11R9QA/LQe6ApmQtNOXRn2rUwnOPbRt/ALWQHBoSrhwIYZoHbenoFBrMXXKfPw1QdxuLfL + eh7dZOER3ZRqicp6c7tRoJDe95PJXhqyqAw5bLohWVe75oDyqsYAEZZFXiOXDN5JwzTO8yYGaCYW + rKeKXqcywMnDrISFM0IxRoh18taxfJ8k4U9LhLEDLgXMl1M2YqKy4aXUHERsYXuIubfahaIkDtYE + wmeR1CmICRNaKi8mlSPqOp4CYmVoxaEODflgZnQGkctBMm+F8YeSfiNyMDCxSL9jP+OnjinX3Vvy + XrXIzcsIa0ld85iYdCJqV70OVlfC3VW37q2OigjTHFHHFBb8iJfEEBTTT7Jxd1Bkl58vYqS6rdzC + ef2L0DvZhHbO1I1sBrlwJnt2mjoQ6Cqbp9P90hB5L4m0PCjH3IM7ffdB/dbVNoB71oeENmE80Fa2 + DnTDBws/npWTyDbyw1xCkX3LEqBxnDxLJhpX2l3QzyoS9r1KQO1vrMooxv7OB279zdg//fjUz6cR + eBAlKsb0eIDbrJ9kKhDox86DZbDZscv8yogXzqO0I6xDKmPPsJWfY9x89cKfZJK27ufcWiDwiSfJ + es4hsNjwY2cu5Mzm3ST0TP2EAK81YFb1qfFOv+Nd0YzDwNzzplZkgB7htxnxbSN+kumKXd4W8D6J + un+n4k9Tv1W7EMez/Kn9XIfXZ/sly1Tvii+c9JbXe+klYiTvkdCGB3o7X2RuK5j5YPdY/9cL6Nfg + /kJNQ04pL+IDxr977h5jPaPuPsdLdubO1L90l8xEHQ2vrUf18HHSK+ZVGudf6PinkiTqkCz+A6RY + jiWtDQAA + headers: + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - public, max-age=3600, no-cache="set-cookie" + Connection: + - Keep-Alive + Content-Encoding: + - gzip + Content-Length: + - '1146' + Content-Type: + - text/plain; charset=utf-8 + Date: + - Fri, 27 Oct 2023 10:01:05 GMT + Keep-Alive: + - timeout=15, max=100 + Server: + - Apache + Set-Cookie: + - INVENIOSESSIONstub=NO; path=/; HttpOnly + - INVENIOSESSION=a38f49d8b513f0b38a28a7a96fc4b900; path=/; HttpOnly + Vary: + - ETag,Cache-Control,Accept-Encoding + Via: + - 1.1 cds.cern.ch + status: + code: 200 + message: OK +version: 1 diff --git a/annual-reports/tests/cassettes/TestAPI.test_publications.yaml b/annual-reports/tests/cassettes/TestAPI.test_publications.yaml new file mode 100644 index 0000000..f6af08c --- /dev/null +++ b/annual-reports/tests/cassettes/TestAPI.test_publications.yaml @@ -0,0 +1,428 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.31.0 + method: GET + uri: https://cds.cern.ch/search?p=(980:ARTICLE+or+980:BOOK+or+980:PROCEEDINGS+or+690:'YELLOW+REPORT'+or+980:REPORT)+and+year:2022+and+(affiliation:CERN+or+260:CERN+or+595:'For+annual+report')+not+595:'Not+for+annual+report'&of=xm&rg=1 + response: + body: + string: !!binary | + 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 + ihkAAA== + headers: + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - public, max-age=3600, no-cache="set-cookie" + Connection: + - Keep-Alive + Content-Encoding: + - gzip + Content-Length: + - '1885' + Content-Type: + - text/xml + Date: + - Fri, 27 Oct 2023 09:56:07 GMT + Keep-Alive: + - timeout=15, max=100 + Server: + - Apache + Set-Cookie: + - INVENIOSESSIONstub=NO; path=/; HttpOnly + - INVENIOSESSION=8fa27cd668cadd98aa9485a3d8175105; path=/; HttpOnly + Vary: + - ETag,Cache-Control,Accept-Encoding + Via: + - 1.1 cds.cern.ch + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.31.0 + method: GET + uri: https://cds.cern.ch/search?ln=en&cc=Published+Articles&p=%28affiliation%3ACERN+or+595%3A%27For+annual+report%27%29+and+year%3A2022+not+980%3AConferencePaper+not+980%3ABookChapter+not+595%3A%27Not+for+annual+report%27&action_search=Search&op1=a&m1=a&p1=&f1=&c=Published+Articles&c=&sf=&so=d&rm=&rg=1&sc=0&of=xm + response: + body: + string: !!binary | + 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 + headers: + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - public, max-age=3600, no-cache="set-cookie" + Connection: + - Keep-Alive + Content-Encoding: + - gzip + Content-Length: + - '1920' + Content-Type: + - text/xml + Date: + - Fri, 27 Oct 2023 09:56:30 GMT + Keep-Alive: + - timeout=15, max=100 + Server: + - Apache + Set-Cookie: + - INVENIOSESSIONstub=NO; path=/; HttpOnly + - INVENIOSESSION=959ba56e61a34f27f8d6a1411e8c2e12; path=/; HttpOnly + Vary: + - ETag,Cache-Control,Accept-Encoding + Via: + - 1.1 cds.cern.ch + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.31.0 + method: GET + uri: https://cds.cern.ch/search?wl=0&ln=en&cc=Published+Articles&p=980%3AARTICLE+and+%28affiliation%3ACERN+or+595%3A%27For+annual+report%27%29+and+year%3A2022+and+980%3AConferencePaper+not+595%3A%27Not+for+annual+report%27&f=&action_search=Search&c=Published+Articles&c=&sf=author&so=a&rm=&rg=1&sc=1&of=xm + response: + body: + string: !!binary | + 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 + pxsAAA== + headers: + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - public, max-age=3600, no-cache="set-cookie" + Connection: + - Keep-Alive + Content-Encoding: + - gzip + Content-Length: + - '1657' + Content-Type: + - text/xml + Date: + - Fri, 27 Oct 2023 09:56:35 GMT + Keep-Alive: + - timeout=15, max=100 + Server: + - Apache + Set-Cookie: + - INVENIOSESSIONstub=NO; path=/; HttpOnly + - INVENIOSESSION=8c0fd77f19beeb63afce8eb5382ff660; path=/; HttpOnly + Vary: + - ETag,Cache-Control,Accept-Encoding + Via: + - 1.1 cds.cern.ch + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.31.0 + method: GET + uri: https://cds.cern.ch/search?ln=en&p=affiliation%3ACERN+or+260%3ACERN+and+260%3A2022++and+%28980%3ABOOK+or+980%3APROCEEDINGS+or+690%3A%27YELLOW+REPORT%27+or+980%3ABookChapter+or+980%3AREPORT%29+not+595%3A%27Not+for+annual+report%27&action_search=Search&op1=a&m1=a&p1=&f1=&c=Articles+%26+Preprints&c=Books+%26+Proceedings&sf=&so=d&rm=&rg=1&sc=1&of=xm + response: + body: + string: !!binary | + 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 + headers: + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - public, max-age=3600, no-cache="set-cookie" + Connection: + - Keep-Alive + Content-Encoding: + - gzip + Content-Length: + - '4086' + Content-Type: + - text/xml + Date: + - Fri, 27 Oct 2023 09:56:47 GMT + Keep-Alive: + - timeout=15, max=100 + Server: + - Apache + Set-Cookie: + - INVENIOSESSIONstub=NO; path=/; HttpOnly + - INVENIOSESSION=272d1ea3220a01d558eeef2803b4be0e; path=/; HttpOnly + Vary: + - ETag,Cache-Control,Accept-Encoding + Via: + - 1.1 cds.cern.ch + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python-requests/2.31.0 + method: GET + uri: https://cds.cern.ch/search?wl=0&ln=en&cc=CERN+Theses&p=502%3A%272022%27+and+502%3Aphd&f=&action_search=Search&c=CERN+Theses&c=&sf=&so=d&rm=&rg=1&sc=1&of=xm + response: + body: + string: !!binary | + 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 + 9BV2d5sc/gGIxdAPhhYAAA== + headers: + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - public, max-age=3600, no-cache="set-cookie" + Connection: + - Keep-Alive + Content-Encoding: + - gzip + Content-Length: + - '1726' + Content-Type: + - text/xml + Date: + - Fri, 27 Oct 2023 09:56:53 GMT + Keep-Alive: + - timeout=15, max=100 + Server: + - Apache + Set-Cookie: + - INVENIOSESSIONstub=NO; path=/; HttpOnly + - INVENIOSESSION=695ef8278edc799c9856114d95d00572; path=/; HttpOnly + Vary: + - ETag,Cache-Control,Accept-Encoding + Via: + - 1.1 cds.cern.ch + status: + code: 200 + message: OK +version: 1 diff --git a/annual-reports/tests/test_api.py b/annual-reports/tests/test_api.py new file mode 100644 index 0000000..78e79f5 --- /dev/null +++ b/annual-reports/tests/test_api.py @@ -0,0 +1,222 @@ +import pytest +from api import AnnualReportsAPI +from models import Categories, Journals, Publications +from sqlalchemy.orm import Session + + +class TestAPI: + def setup_class(self): + self.annual_reports = AnnualReportsAPI( + years=[2022], + db_user="annual", + db_password="annual", + db_host="localhost", + db_port="5432", + db_name="annual", + ) + self.annual_reports.create_tables() + + @pytest.mark.vcr() + def test_publications(self): + with Session(self.annual_reports.engine) as session: + publications = session.query(Publications).all() + assert len(publications) == 0 + + self.annual_reports.get_publications() + + with Session(self.annual_reports.engine) as session: + publications = session.query(Publications).all() + assert len(publications) == 1 + assert publications[0].publications == 2127 + assert publications[0].published_articles == 982 + assert publications[0].contributions_to_conference_proceedings == 1118 + assert publications[0].reports_books_and_book_chapters == 26 + assert publications[0].theses == 275 + assert publications[0].year == 2022 + + with Session(self.annual_reports.engine) as session: + session.query(Publications).delete() + session.commit() + + @pytest.mark.vcr() + def test_categories(self): + with Session(self.annual_reports.engine) as session: + categories = session.query(Categories).all() + assert len(categories) == 0 + + self.annual_reports.get_categories() + + with Session(self.annual_reports.engine) as session: + categories = session.query(Categories).all() + assert len(categories) == 19 + + expected = { + "Computing and Computers": 16, + "Accelerators and Storage Rings": 38, + "Astrophysics and Astronomy": 16, + "Nuclear Physics - Experiment": 15, + "Health Physics and Radiation Effects": 1, + "Detectors and Experimental Techniques": 44, + "Quantum Technology": 7, + "Mathematical Physics and Mathematics": 5, + "Education and Outreach": 3, + "Physics in General": 6, + "Particle Physics - Experiment": 18, + "General Theoretical Physics": 2, + "Other Fields of Physics": 3, + "Particle Physics - Phenomenology": 22, + "General Relativity and Cosmology": 6, + "Particle Physics - Theory": 6, + "Particle Physics - Lattice": 2, + "Nuclear Physics - Theory": 6, + "Engineering": 1, + } + for category in categories: + assert category.category in expected + assert category.count == expected[category.category] + assert category.year == 2022 + + with Session(self.annual_reports.engine) as session: + session.query(Categories).delete() + session.commit() + + @pytest.mark.vcr() + def test_journals(self): + with Session(self.annual_reports.engine) as session: + journals = session.query(Journals).all() + assert len(journals) == 0 + + self.annual_reports.get_journals() + + with Session(self.annual_reports.engine) as session: + journals = session.query(Journals).all() + + assert len(journals) == 117 + + expected = { + "JISTaP": 1, + "IEEE Trans. Appl. Supercond.": 2, + "The Messenger": 1, + "IFAC-PapersOnLine": 1, + "Future Microbiology": 1, + "Frontiers in Medicine": 1, + "J. Radiol. Prot.": 1, + "EJNMMI Physics": 1, + "Nature Chem.": 1, + "Transport in Porous Media": 1, + "IEEE Access": 3, + "Materials": 1, + "Environ. Sci. Technol.": 2, + "IEEE Trans. Rad. Plasma Med. Sci.": 2, + "CEAS Space J.": 1, + "Environments": 1, + "IEEE Trans. Parallel Distrib. Syst.": 2, + "IEEE Systems J.": 1, + "J. Chem. Phys.": 1, + "J. Math. Industry": 1, + "Inverse Prob. Imaging": 1, + "Photon.": 2, + "Chin. Phys. C": 1, + "Polymers": 1, + "J. Comput. Appl. Math.": 1, + "Eur. Financ. Manag.": 1, + "MagnetoHydrodyn.": 1, + "Phys. Educ.": 1, + "Atmos. Chem. Phys.": 1, + "Phys. Status Solidi B": 1, + "ACM Transactions on Privacy and Security": 1, + "Comput. Phys. Commun.": 1, + "Crystals": 5, + "Acta Mater.": 1, + "ChemPhysChem": 1, + "Swiss Journal of Geosciences": 1, + "Front. Phys.": 4, + "Robotics": 1, + "Nucl. Instrum. Methods Phys. Res., A": 12, + "Phys. Rev. Accel. Beams": 9, + "IEEE Trans. Educ.": 1, + "J. Mach. Learn. Res.": 1, + "J. Integer Sequences": 1, + "Batteries": 1, + "Comp. Meth. Appl. Math.": 1, + "Pharmaceutics": 1, + "Fortschr. Phys.": 1, + "JHEP": 11, + "IEEE Trans. Plasma Sci.": 1, + "Phys. Part. Nucl. Lett.": 1, + "Advanced Materials Interfaces": 1, + "MDPI Physics": 2, + "Phys. Rev. D": 6, + "EPL": 1, + "Phys. Rev. C": 5, + "Appl. Opt.": 1, + "Nature Astron.": 1, + "JINST": 10, + "AIP Adv.": 1, + "JCAP": 1, + "Res. Notes AAS": 1, + "Appl. Sciences": 3, + "J. Appl. Phys.": 1, + "J. Phys. A": 1, + "Eur. Phys. J. A": 1, + "Astron. Astrophys.": 1, + "Instruments": 1, + "IEEE Trans. Quantum Eng.": 1, + "Radiat. Prot. Dosim.": 1, + "Bull. Russ. Acad. Sci. Phys.": 1, + "IEEE Sensors J.": 1, + "Int. J. Sci. Edu.": 1, + "Fire Safety J.": 1, + "Front. Chem.": 1, + "Environmental Science: Atmospheres": 1, + "Mach. Learn. Sci. Tech.": 2, + "Roy. Soc. Open Sci.": 1, + "EPJ Tech. Instrum.": 2, + "Eur. Phys. J. Plus": 4, + "J. Mater. Chem.": 1, + "Front. Big Data": 1, + "Sensors": 1, + "The Physics Educator": 1, + "Phys. Rev. B": 2, + "J. Vac. Sci. Technol. A": 1, + "Materials Advances": 1, + "Sci. Rep.": 3, + "PoS": 1, + "Supercond. Sci. Technol.": 4, + "Rev. Sci. Instrum.": 1, + "Nature": 1, + "Model. Simul. Eng.": 1, + "Comput. Softw. Big Sci.": 1, + "Appl. Radiat. Isot.": 2, + "Phys. Lett. B": 2, + "Phys. Rev. E": 2, + "Swiss Medical Weekly": 1, + "J. Radioanal. Nucl. Chem.": 1, + "Nucl. Phys. News": 2, + "Nature Commun.": 1, + "PTEP": 1, + "Phys. Rev. Res.": 1, + "Nucl. Instrum. Methods Phys. Res., B": 2, + "New J. Phys.": 1, + "J. Lightwave Technol.": 1, + "Opt. Lett.": 1, + "Symmetry": 1, + "Pramana - J. Phys.": 1, + "Few-Body Syst.": 1, + "IEEE Trans. Nucl. Sci.": 1, + "Eur. Phys. J. C": 2, + "J. Phys. D": 1, + "Phys. Rev. Lett.": 3, + "Astrophys. J. Lett.": 1, + "Phys. Plasmas": 1, + "IEEE Trans. Electron Devices": 1, + "Rad. Det. Tech. Meth.": 1, + } + for journal in journals: + assert journal.journal in expected + assert journal.count == expected[journal.journal] + assert journal.year == 2022 + + with Session(self.annual_reports.engine) as session: + session.query(Journals).delete() + session.commit()