diff --git a/.env.development b/.env.development index 61d83162..59c48d6e 100644 --- a/.env.development +++ b/.env.development @@ -1,2 +1,2 @@ -DB_HOST="" -DB_URL="sqlite:///chowda.development.sqlite" \ No newline at end of file + +DB_URL="postgresql://postgres:postgres@localhost:5432/chowda-development" \ No newline at end of file diff --git a/.env.test b/.env.test index 45c7cb58..97f59bc1 100644 --- a/.env.test +++ b/.env.test @@ -1 +1 @@ -DB_URL="sqlite:///chowda.test.sqlite" \ No newline at end of file +DB_URL='postgresql://postgres:postgres@localhost/chowda-test' \ No newline at end of file diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 93f6e020..59eb015f 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -2,15 +2,18 @@ name: ๐Ÿงช Integration Tests on: [push, pull_request, workflow_dispatch] +env: + DB_URL: postgresql://postgres:postgres@postgres:5432/chowda-test + jobs: tests: name: โš—๏ธ Application Tests - uses: WGBH-MLA/.github/.github/workflows/pytest-with-postgres.yml@pytest-with-postgres + uses: WGBH-MLA/.github/.github/workflows/pytest-with-postgres.yml@main secrets: inherit with: pdm_args: -G test,ci pytest_args: -n auto --nbmake -ra -s - pg_db: chowda + pg_db: chowda-test lint: name: ๐Ÿ‘• Lint diff --git a/Dockerfile b/Dockerfile index bc96a160..5ac2b89f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,13 +2,19 @@ # 'base' build stage, common to all build stages ########################### FROM python as base + # Set working dir to /app, where all Chowda code lives. WORKDIR /app RUN pip install -U pip + # Copy app code to container COPY pyproject.toml pdm.lock README.md ./ COPY chowda chowda +# Copy migration files +COPY alembic.ini ./ +COPY migrations migrations + ########################### # 'dev' build stage diff --git a/chowda/db.py b/chowda/db.py index 5e381895..80f50497 100644 --- a/chowda/db.py +++ b/chowda/db.py @@ -1,23 +1,10 @@ from sqlalchemy import create_engine from sqlmodel import SQLModel -# NOTE: models must be imported prior to calling SQL.metadata.create_all(engine) -# Using this method to create the database schems is only temporary until we -# replace it with a proper migration tool, e.g. Alembic. Disable Ruff linting -# that flags unused imports: this import *is* used in the sense that once it's -# imported, it lets SQLModel know about the schema behind the scenes, so that -# the SQLModel.metadata.create_all(engine) command will actually create the db -# tables. -from chowda import models # noqa: F401 from chowda.config import DB_URL, DEBUG -print('\n\nabout to create all!\n\n') - engine = create_engine(DB_URL, echo=DEBUG) -# Create database from SQLModel schema -SQLModel.metadata.create_all(engine) - # TODO: implement async engine def create_async_engine(): @@ -31,4 +18,11 @@ def init_db(): from chowda import models # noqa: F401 + # NOTE: models must be imported prior to calling SQL.metadata.create_all(engine) + # Using this method to create the database schems is only temporary until we + # replace it with a proper migration tool, e.g. Alembic. Disable Ruff linting + # that flags unused imports: this import *is* used in the sense that once it's + # imported, it lets SQLModel know about the schema behind the scenes, so that + # the SQLModel.metadata.create_all(engine) command will actually create the db + # tables. SQLModel.metadata.create_all(engine) diff --git a/docs/install.md b/docs/install.md index a1fbc61c..92918191 100644 --- a/docs/install.md +++ b/docs/install.md @@ -1,5 +1,6 @@ # Install + ### Clone the repository:: ```shell @@ -40,12 +41,44 @@ Install the package pip install . ``` +### Create PostgreSQL database and start the database server +Chowda needs to have a PostgreSQL server running and database named `chowda-development` (tests use a database `chowda-test`). + +There are many ways to do this, but an easy way is to use docker. After starting Docker on your local machine, the following command will start a container using the `postgres` image in Dockerhub. + +```shell +docker run --rm --name pg -p 5432:5432 -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=chowda-development postgres +``` +#### Command explained +* `docker run` runs a docker container +* `--rm` option will remove the docker container once it exits. +* `--name pg` will name the running container `pg` so it can be identified when listing running containers. +* `-p 5432:5432` forwards port 5432 on your local machine to port 5432 (default postgres port) on the running container. +* `-e POSTGRES_USER=postgres` sets ENV var on container for the postgres username +* `-e POSTGRES_PASSWORD=postgres` sets ENV var on container for postgres password + + !!! note + + Not a secure password, but that's ok for test and development environments. + +* `-e POSTGRES_DB=chowda-development` sets ENV var on container for the name of postgres database to use + + !!! note + + The `postgres` image will create the database when starting the container. + +* `postgres` is the name of the Docker image to use when starting the container. + +!!! note + + the environment variables values in the command must match the values that are part of the `DB_URL` environment variable specified in `.env.development`. + + ## Run database migrations with Alembic ```shell alembic upgrade head ``` - ## Run the application ```shell @@ -64,6 +97,23 @@ python tests/seeds.py **Optional:** Customize the number of records created by changing the `num_*` variables in the `seed` function. + +## Running tests +Chowda uses `pytest` for testing. + +### Creating the test database and running a postgres server +This is done the same way as in the development environment (see above), only the database name is changed. +```shell +docker run --rm --name pg -p 5432:5432 -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=chowda-development postgres +``` + + +### Running the tests from terminal +```shell +pytest --vcr-record=none --nbmake +``` + + ## Deactivate the virtual environment Run the `deactivate` command to return to your normal shell environment. diff --git a/pdm.lock b/pdm.lock index 5e42a08e..f59d1eea 100644 --- a/pdm.lock +++ b/pdm.lock @@ -16,7 +16,7 @@ dependencies = [ [[package]] name = "anyio" -version = "3.7.0" +version = "3.7.1" requires_python = ">=3.7" summary = "High level compatibility layer for multiple asynchronous event loop implementations" dependencies = [ @@ -393,8 +393,8 @@ summary = "Lightweight in-process concurrent programming" [[package]] name = "griffe" -version = "0.28.0" -requires_python = ">=3.7" +version = "0.31.0" +requires_python = ">=3.8" summary = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." dependencies = [ "colorama>=0.4", @@ -549,14 +549,26 @@ dependencies = [ [[package]] name = "jsonschema" -version = "4.17.3" -requires_python = ">=3.7" +version = "4.18.0" +requires_python = ">=3.8" summary = "An implementation of JSON Schema validation for Python" dependencies = [ - "attrs>=17.4.0", + "attrs>=22.2.0", "importlib-resources>=1.4.0; python_version < \"3.9\"", + "jsonschema-specifications>=2023.03.6", "pkgutil-resolve-name>=1.3.10; python_version < \"3.9\"", - "pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0", + "referencing>=0.28.4", + "rpds-py>=0.7.1", +] + +[[package]] +name = "jsonschema-specifications" +version = "2023.6.1" +requires_python = ">=3.8" +summary = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +dependencies = [ + "importlib-resources>=1.4.0; python_version < \"3.9\"", + "referencing>=0.28.0", ] [[package]] @@ -823,7 +835,7 @@ dependencies = [ [[package]] name = "mkdocstrings-python" -version = "1.0.0" +version = "1.1.2" requires_python = ">=3.7" summary = "A Python handler for mkdocstrings." dependencies = [ @@ -1096,12 +1108,6 @@ dependencies = [ "pyyaml", ] -[[package]] -name = "pyrsistent" -version = "0.19.3" -requires_python = ">=3.7" -summary = "Persistent/Functional/Immutable data structures" - [[package]] name = "pytest" version = "7.4.0" @@ -1210,6 +1216,16 @@ dependencies = [ "cffi; implementation_name == \"pypy\"", ] +[[package]] +name = "referencing" +version = "0.29.1" +requires_python = ">=3.8" +summary = "JSON Referencing + Python" +dependencies = [ + "attrs>=22.2.0", + "rpds-py>=0.7.0", +] + [[package]] name = "regex" version = "2023.6.3" @@ -1245,6 +1261,12 @@ name = "roundrobin" version = "0.0.4" summary = "Collection of roundrobin utilities" +[[package]] +name = "rpds-py" +version = "0.8.8" +requires_python = ">=3.8" +summary = "Python bindings to Rust's persistent data structures (rpds)" + [[package]] name = "ruff" version = "0.0.277" @@ -1555,16 +1577,16 @@ dependencies = [ lock_version = "4.2" cross_platform = true groups = ["default", "ci", "dev", "docs", "locust", "production", "test"] -content_hash = "sha256:ee4ac8a31c516af52209e818f901df25445efcd51a4c09b95a471aeac1ee738c" +content_hash = "sha256:cc50ff66bdaacb7281a75e59027f5d9cefa6c3c780e606e4a74d8a23e64fbd2d" [metadata.files] "alembic 1.11.1" = [ {url = "https://files.pythonhosted.org/packages/11/00/46a4f66ad54c661350a1cd5daae4b4ab2232486c55635ee12ff12958b03f/alembic-1.11.1-py3-none-any.whl", hash = "sha256:dc871798a601fab38332e38d6ddb38d5e734f60034baeb8e2db5b642fccd8ab8"}, {url = "https://files.pythonhosted.org/packages/c6/e3/3d9b95470606b93bd6e6d5c899ed9d0049dfa10246ecca25b18c2c708cdf/alembic-1.11.1.tar.gz", hash = "sha256:6a810a6b012c88b33458fceb869aef09ac75d6ace5291915ba7fae44de372c01"}, ] -"anyio 3.7.0" = [ - {url = "https://files.pythonhosted.org/packages/68/fe/7ce1926952c8a403b35029e194555558514b365ad77d75125f521a2bec62/anyio-3.7.0-py3-none-any.whl", hash = "sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0"}, - {url = "https://files.pythonhosted.org/packages/c6/b3/fefbf7e78ab3b805dec67d698dc18dd505af7a18a8dd08868c9b4fa736b5/anyio-3.7.0.tar.gz", hash = "sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce"}, +"anyio 3.7.1" = [ + {url = "https://files.pythonhosted.org/packages/19/24/44299477fe7dcc9cb58d0a57d5a7588d6af2ff403fdd2d47a246c91a3246/anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, + {url = "https://files.pythonhosted.org/packages/28/99/2dfd53fd55ce9838e6ff2d4dac20ce58263798bd1a0dbe18b3a9af3fcfce/anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, ] "appnope 0.1.3" = [ {url = "https://files.pythonhosted.org/packages/41/4a/381783f26df413dde4c70c734163d88ca0550a1361cb74a1c68f47550619/appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, @@ -2274,9 +2296,9 @@ content_hash = "sha256:ee4ac8a31c516af52209e818f901df25445efcd51a4c09b95a471aeac {url = "https://files.pythonhosted.org/packages/fa/9a/e0e99a4aa93b16dd58881acb55ac1e2fb011475f2e46cf87843970001882/greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, {url = "https://files.pythonhosted.org/packages/fc/80/0ed0da38bbb978f39128d7e53ee51c36bed2e4a7460eff92981a3d07f1d4/greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, ] -"griffe 0.28.0" = [ - {url = "https://files.pythonhosted.org/packages/8e/a2/7575a5a369ef34778f79fd7d2ddd6fbb588ed09288dc562cb77b243243dd/griffe-0.28.0.tar.gz", hash = "sha256:f2253359bdf84427a46c04c28d59680195863f94cc9453af2a7728cb3d92b7d6"}, - {url = "https://files.pythonhosted.org/packages/f6/3e/5037192c977b81a00f6d56ec81162d29dbca0a9959894704e0d0c2c2f6ec/griffe-0.28.0-py3-none-any.whl", hash = "sha256:42823aafa666e38bc14d6ab3c955e5eccadd5ada61a8b780f580c8e763a34327"}, +"griffe 0.31.0" = [ + {url = "https://files.pythonhosted.org/packages/4b/84/4cfc745603a0577878181a388c0f48377e7ba1eeff9752486e15dfc7bab4/griffe-0.31.0-py3-none-any.whl", hash = "sha256:de6e659487497c0e73459d370f40bfda7d6f9f6cec43a687de8a110ec72a2c4f"}, + {url = "https://files.pythonhosted.org/packages/ee/6b/60cc577c0e4cf43f5a8f035adf84d1597729948ac76fb07a2a9d3f04c183/griffe-0.31.0.tar.gz", hash = "sha256:b51f6e9541ce9cb9c08580917971cd4b76b6d88e2469822d612b614fb96be776"}, ] "gunicorn 20.1.0" = [ {url = "https://files.pythonhosted.org/packages/28/5b/0d1f0296485a6af03366604142ea8f19f0833894db3512a40ed07b2a56dd/gunicorn-20.1.0.tar.gz", hash = "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8"}, @@ -2377,9 +2399,13 @@ content_hash = "sha256:ee4ac8a31c516af52209e818f901df25445efcd51a4c09b95a471aeac {url = "https://files.pythonhosted.org/packages/7a/ff/75c28576a1d900e87eb6335b063fab47a8ef3c8b4d88524c4bf78f670cce/Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, {url = "https://files.pythonhosted.org/packages/bc/c3/f068337a370801f372f2f8f6bad74a5c140f6fda3d9de154052708dd3c65/Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, ] -"jsonschema 4.17.3" = [ - {url = "https://files.pythonhosted.org/packages/36/3d/ca032d5ac064dff543aa13c984737795ac81abc9fb130cd2fcff17cfabc7/jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, - {url = "https://files.pythonhosted.org/packages/c1/97/c698bd9350f307daad79dd740806e1a59becd693bd11443a0f531e3229b3/jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, +"jsonschema 4.18.0" = [ + {url = "https://files.pythonhosted.org/packages/79/01/ce65847f79de9594d436b7ef295e374dfcc0ff3ee884bf61cf896f970ddb/jsonschema-4.18.0.tar.gz", hash = "sha256:8caf5b57a990a98e9b39832ef3cb35c176fe331414252b6e1b26fd5866f891a4"}, + {url = "https://files.pythonhosted.org/packages/8a/38/2c55180702a637be0fbb8aa95358213a750d25cad3e59869726a54309996/jsonschema-4.18.0-py3-none-any.whl", hash = "sha256:b508dd6142bd03f4c3670534c80af68cd7bbff9ea830b9cf2625d4a3c49ddf60"}, +] +"jsonschema-specifications 2023.6.1" = [ + {url = "https://files.pythonhosted.org/packages/9a/8c/3d028449ac15cba52db3e1c95ca53b9240b4707fbe17f43e01cc73dd9336/jsonschema_specifications-2023.6.1.tar.gz", hash = "sha256:ca1c4dd059a9e7b34101cf5b3ab7ff1d18b139f35950d598d629837ef66e8f28"}, + {url = "https://files.pythonhosted.org/packages/a9/e9/856737e6b58e5be1778e73f7bcfe655041cfd2b16ff3c51fde76d8c6b69a/jsonschema_specifications-2023.6.1-py3-none-any.whl", hash = "sha256:3d2b82663aff01815f744bb5c7887e2121a63399b49b104a3c96145474d091d7"}, ] "jupyter-client 8.3.0" = [ {url = "https://files.pythonhosted.org/packages/29/24/0491f7837cedf39ae0f96d9b3e4db2fae31cc4dd5eac00a98ab0db996c9b/jupyter_client-8.3.0-py3-none-any.whl", hash = "sha256:7441af0c0672edc5d28035e92ba5e32fadcfa8a4e608a434c228836a89df6158"}, @@ -2525,9 +2551,9 @@ content_hash = "sha256:ee4ac8a31c516af52209e818f901df25445efcd51a4c09b95a471aeac {url = "https://files.pythonhosted.org/packages/90/89/39b7da1cd3d7bc9d3626a2030349443276bd4c8428b676b010ffb96ec9be/mkdocstrings-0.22.0.tar.gz", hash = "sha256:82a33b94150ebb3d4b5c73bab4598c3e21468c79ec072eff6931c8f3bfc38256"}, {url = "https://files.pythonhosted.org/packages/b6/26/5816407b5dd51821a3d23f53bdbd013ab1878b6246e520dc014d200ee1d2/mkdocstrings-0.22.0-py3-none-any.whl", hash = "sha256:2d4095d461554ff6a778fdabdca3c00c468c2f1459d469f7a7f622a2b23212ba"}, ] -"mkdocstrings-python 1.0.0" = [ - {url = "https://files.pythonhosted.org/packages/78/87/47c8000e1664255c4d0b7868cdef575805a46363de018a7a7ee218def0ff/mkdocstrings_python-1.0.0-py3-none-any.whl", hash = "sha256:c59d67009a7a85172f4da990d8523e95606b6a1ff93a22a2351ad3b5f8cafed1"}, - {url = "https://files.pythonhosted.org/packages/e0/95/a25fb66cc564b584e149982abe461d7cdb7847b6bc2a8a97162faf79e1e5/mkdocstrings_python-1.0.0.tar.gz", hash = "sha256:b89d849df990204f909d5452548b6936a185f912da06208a93909bebe25d6e67"}, +"mkdocstrings-python 1.1.2" = [ + {url = "https://files.pythonhosted.org/packages/4c/81/8c1de2573c4fa5fff7fc20eba1dad2892f43ed22ba145b595243e375c274/mkdocstrings_python-1.1.2-py3-none-any.whl", hash = "sha256:c2b652a850fec8e85034a9cdb3b45f8ad1a558686edc20ed1f40b4e17e62070f"}, + {url = "https://files.pythonhosted.org/packages/7b/22/eaa1ccd8aaeac72953a780f4b6c82650475d241dd953582706db547db004/mkdocstrings_python-1.1.2.tar.gz", hash = "sha256:f28bdcacb9bcdb44b6942a5642c1ea8b36870614d33e29e3c923e204a8d8ed61"}, ] "msgpack 1.0.5" = [ {url = "https://files.pythonhosted.org/packages/0a/04/bc319ba061f6dc9077745988be288705b3f9f18c5a209772a3e8fcd419fd/msgpack-1.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9985b214f33311df47e274eb788a5893a761d025e2b92c723ba4c63936b69b1"}, @@ -2839,35 +2865,6 @@ content_hash = "sha256:ee4ac8a31c516af52209e818f901df25445efcd51a4c09b95a471aeac {url = "https://files.pythonhosted.org/packages/a2/17/607fc71d709c0df9cca39ed57ed6f8b1cb77863073004c7def8a02a45fe2/pymdown_extensions-10.0.1-py3-none-any.whl", hash = "sha256:ae66d84013c5d027ce055693e09a4628b67e9dec5bce05727e45b0918e36f274"}, {url = "https://files.pythonhosted.org/packages/cb/06/5779fe8fa684080bcb0eeabcbcb9bfe2cf14dcf776b687001e7820fba660/pymdown_extensions-10.0.1.tar.gz", hash = "sha256:b44e1093a43b8a975eae17b03c3a77aad4681b3b56fce60ce746dbef1944c8cb"}, ] -"pyrsistent 0.19.3" = [ - {url = "https://files.pythonhosted.org/packages/07/d2/0e72806d668c001d13885e8d7c78fefa5a649c34ad9d77b90eb472096ae7/pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"}, - {url = "https://files.pythonhosted.org/packages/09/0a/cf855eb8b1dc98f20e3223c7262068918f22f5ad452a99588cf2e5e70e82/pyrsistent-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1"}, - {url = "https://files.pythonhosted.org/packages/0b/c0/5ba658ab88966a5a709e17739d1da02615b95e8210d52041d147f11da5da/pyrsistent-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf"}, - {url = "https://files.pythonhosted.org/packages/40/04/f1d7813d4cdb62ed58e75b53e2ef481b47081ab5ad2a104cd284fa507042/pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"}, - {url = "https://files.pythonhosted.org/packages/4a/91/f8e546cbd5aeecce04a5e9d03c32f329c6b97a5514868c824bbe111cd697/pyrsistent-0.19.3-cp38-cp38-win32.whl", hash = "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c"}, - {url = "https://files.pythonhosted.org/packages/57/3e/50aa661939ba1bfc2cc78817ecb37ecb55aef9eda55a193f8da381a8b7a1/pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a"}, - {url = "https://files.pythonhosted.org/packages/59/4b/b6ea0f5c564c40f2c9d05ad3dbe3b8db6a6f1e7153e49eee29674c3c3bbe/pyrsistent-0.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8"}, - {url = "https://files.pythonhosted.org/packages/64/bd/b108e1a288a63871be1cf062176dcd5be922c748f843f316440104a45df3/pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393"}, - {url = "https://files.pythonhosted.org/packages/64/de/375aa14daaee107f987da76ca32f7a907fea00fa8b8afb67dc09bec0de91/pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"}, - {url = "https://files.pythonhosted.org/packages/73/55/1e300772f5c24921a81fc1c8b3de8a06a199c4ebb523d7c5a85f4e74a32e/pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"}, - {url = "https://files.pythonhosted.org/packages/82/5e/037a808341e4464c702eb45e741c69292516d0ac00e64080269a2e98d12d/pyrsistent-0.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c"}, - {url = "https://files.pythonhosted.org/packages/86/0e/33b4cde936d247024c26772dae0a7c93d650d8ec7ee1824d2752d3d8883c/pyrsistent-0.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9"}, - {url = "https://files.pythonhosted.org/packages/86/f2/fda71652a6baa0147891296a99b4145572538417609c164450beebcf8ebc/pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19"}, - {url = "https://files.pythonhosted.org/packages/87/72/e5b2347f136d14f09c8260a2e3a528be94e536d97e6635cc9f22cff2d88c/pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da"}, - {url = "https://files.pythonhosted.org/packages/af/3e/7c94e58ade258179c2e13fb254f040830e97654d76dee8288200d30d575d/pyrsistent-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2"}, - {url = "https://files.pythonhosted.org/packages/b1/46/3f9cfa75c46b8a55d3a235456bc129a26431a65e4922fc9af66aa4e2db7e/pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9"}, - {url = "https://files.pythonhosted.org/packages/b1/8d/bbce2d857ecdefb7170a8a37ade1de0f060052236c07693856ac23f3b1ee/pyrsistent-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7"}, - {url = "https://files.pythonhosted.org/packages/b2/ea/055a9c1884be7c77dd68d9a7891e7a39c776c86946aa4630f8f9f8e48169/pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8"}, - {url = "https://files.pythonhosted.org/packages/b3/e6/43c7f666703506f8d5c5d2c7bc223346c6fa0e0fe392074c2b5788a577f8/pyrsistent-0.19.3-cp39-cp39-win32.whl", hash = "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2"}, - {url = "https://files.pythonhosted.org/packages/bf/90/445a7dbd275c654c268f47fa9452152709134f61f09605cf776407055a89/pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"}, - {url = "https://files.pythonhosted.org/packages/c3/c7/185e37df78c1e34c14961cbd7c89945e27825b5a41bf455e2df2dd46e18e/pyrsistent-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98"}, - {url = "https://files.pythonhosted.org/packages/d5/bf/6ed2d861e3e94c5e92dbb1399eef672fb6add6e824d8c0f4b55d9cd9e733/pyrsistent-0.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc"}, - {url = "https://files.pythonhosted.org/packages/d8/95/374840c28274b2d660a49c81aee980543953c9c13bcfc9c8c22fb7737919/pyrsistent-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b"}, - {url = "https://files.pythonhosted.org/packages/dc/c2/994b3e91f22b040fefbb3058d8622e3b45ab78dd1256599575bf36319b6d/pyrsistent-0.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28"}, - {url = "https://files.pythonhosted.org/packages/de/9e/10c5bf794eec650a3aab1b4fb1f6824f53011d111ddfdce1459dc357408a/pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3"}, - {url = "https://files.pythonhosted.org/packages/ed/7b/7d032130a6838b179b46dff1ee88909c11d518a10ec9bc70c4b72c7c2f80/pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"}, - {url = "https://files.pythonhosted.org/packages/f4/43/183384edb4d2788374aa7663b82ace4afe4a0c1fbfee064875eb40ada95b/pyrsistent-0.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3"}, -] "pytest 7.4.0" = [ {url = "https://files.pythonhosted.org/packages/33/b2/741130cbcf2bbfa852ed95a60dc311c9e232c7ed25bac3d9b8880a8df4ae/pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, {url = "https://files.pythonhosted.org/packages/a7/f3/dadfbdbf6b6c8b5bd02adb1e08bc9fbb45ba51c68b0893fa536378cdf485/pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, @@ -3045,6 +3042,10 @@ content_hash = "sha256:ee4ac8a31c516af52209e818f901df25445efcd51a4c09b95a471aeac {url = "https://files.pythonhosted.org/packages/fd/12/0324dcb2554cd3f2ebb851ddbfbac27c4bb384394ba4a8978dec093fe71d/pyzmq-25.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2b15247c49d8cbea695b321ae5478d47cffd496a2ec5ef47131a9e79ddd7e46c"}, {url = "https://files.pythonhosted.org/packages/ff/19/f027b4b9067a5398cbccc6322ca14a6b2c872b633ed6b2a09bb53c0cf0b7/pyzmq-25.1.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b6b42f7055bbc562f63f3df3b63e3dd1ebe9727ff0f124c3aa7bcea7b3a00f9"}, ] +"referencing 0.29.1" = [ + {url = "https://files.pythonhosted.org/packages/20/93/45213b5b6e3eeab03e3f6eb82cc516a81fbf257586a25f9eb1d21af96e1b/referencing-0.29.1.tar.gz", hash = "sha256:90cb53782d550ba28d2166ef3f55731f38397def8832baac5d45235f1995e35e"}, + {url = "https://files.pythonhosted.org/packages/eb/42/243a3241b1b2b713a8503e1aaeddffbd37e15a86702a0f95129f2b8157a9/referencing-0.29.1-py3-none-any.whl", hash = "sha256:d3c8f323ee1480095da44d55917cfb8278d73d6b4d5f677e3e40eb21314ac67f"}, +] "regex 2023.6.3" = [ {url = "https://files.pythonhosted.org/packages/05/bb/72408a1c713e470abe144bce3622d7b1feadd74fab1f9c7fc5e1e4d5917b/regex-2023.6.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:cf67ca618b4fd34aee78740bea954d7c69fdda419eb208c2c0c7060bb822d747"}, {url = "https://files.pythonhosted.org/packages/09/f5/a9d7f45433797945c3b48e3d19c81378d3d245c5a914a8362351a239e82c/regex-2023.6.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:aad51907d74fc183033ad796dd4c2e080d1adcc4fd3c0fd4fd499f30c03011cd"}, @@ -3146,6 +3147,83 @@ content_hash = "sha256:ee4ac8a31c516af52209e818f901df25445efcd51a4c09b95a471aeac "roundrobin 0.0.4" = [ {url = "https://files.pythonhosted.org/packages/38/97/6508c09e3af7eaee96e7b66a7dc7bbdbe8e6b85b8d2bbbb89612cf621bad/roundrobin-0.0.4.tar.gz", hash = "sha256:7e9d19a5bd6123d99993fb935fa86d25c88bb2096e493885f61737ed0f5e9abd"}, ] +"rpds-py 0.8.8" = [ + {url = "https://files.pythonhosted.org/packages/03/0e/46a9b52ba391b445ed76bb23ecc1956b26923880dfc8fb161f7a4b94f7e3/rpds_py-0.8.8-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:247a1fd9bcdb373380cb8c0041417c9995fc163c9d88a39f5ec3d960114aca22"}, + {url = "https://files.pythonhosted.org/packages/06/6e/b49466606dc4eb0c72418d1b3ef379e8522aaed948238f616223192c7ffb/rpds_py-0.8.8-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bfe98ad05400e7ac7a1df791645db08c66adc92d7a6449a406111303a265b71a"}, + {url = "https://files.pythonhosted.org/packages/07/68/fec6bd2108a314c2ba782bc582d37f5bb603b0e616be6a086f2b22f2eafd/rpds_py-0.8.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d6696c2a002e982e89975063939a2579623d6d6b24634b147848ec9f35dad7d6"}, + {url = "https://files.pythonhosted.org/packages/12/63/54289f76518ea5302ebf001960e1b4cb6da925681bac9333e04b883f8d0b/rpds_py-0.8.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b5cbcbd6451a4af2048fc0b21c15981462f6a378cb039aa53612c6e39958064e"}, + {url = "https://files.pythonhosted.org/packages/12/76/738c2881e637564b28f28bf768a9d4baf6980de1050b9ee339bde476f58b/rpds_py-0.8.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cafbfa8f3a27e592bdcc420497e0c9a957c9f812b6c6ebfb7f961409215ba82d"}, + {url = "https://files.pythonhosted.org/packages/17/cf/ec42d803e6b7c7136f6679e8a866b18503107d16f05d32f4c58afb3102a7/rpds_py-0.8.8-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:36266e2e49b36ec6cc148e36667030d8e7f1c009edd2ca978ab09ed9c5a7589a"}, + {url = "https://files.pythonhosted.org/packages/1a/5d/8895c2a43c89400bdfd6c55ad07cb2fd4b51ee2009f0f0240cf3bcb4e417/rpds_py-0.8.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:246a410e540ce7f635c6ad1b7aa00b7dcfc966c5f97217e41092c3f764dac4bf"}, + {url = "https://files.pythonhosted.org/packages/1b/18/bd89838f9aac2c9084b163836deca049bd88271e028d118452109937d128/rpds_py-0.8.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d6a26953d3b291dd7e79e43bb203ed134ca889e63c8ebbc65e3ff98154303ef"}, + {url = "https://files.pythonhosted.org/packages/1f/4e/0bb2f875e4e02afad9da8295b1b575baee8160869ef7369c050536f4c4db/rpds_py-0.8.8-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e086610118163400a1822af0ee857581c0e047aa50a9c3543d17fbe65183a339"}, + {url = "https://files.pythonhosted.org/packages/1f/a6/eca79f9ec88fb8b32b1520eeaf972943f063dc5ce9f6c158eb5ae9ab0e44/rpds_py-0.8.8-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4c66a5f9ca9c5fcb2527ad969541521f7216db713a7bd63aee52c3f5efa5924a"}, + {url = "https://files.pythonhosted.org/packages/24/54/63a27ffa74e7658abf176a290d661345b6d4d3a7e70022264d023b84fa37/rpds_py-0.8.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b5164fdad37847e90683d3748dca7c4604f47ecd21e2d651dafc80393d1d314"}, + {url = "https://files.pythonhosted.org/packages/28/36/f982d486a6c544ae9e1de0ba08875176f0c222932c8649ca3f97148299fb/rpds_py-0.8.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3660bd2afb23e1ca685df0d3092208fe6c7b2cae8c0be199b3da6d1a4bc91dc5"}, + {url = "https://files.pythonhosted.org/packages/35/a1/bf09e6a47aa9f330a0a9621e00d91304dd3e7b1ba9993f07fcc11b378985/rpds_py-0.8.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:316a66b0379a9e954872593aa2eb6d61949da2ecc8f572b4dafb07aa0e247171"}, + {url = "https://files.pythonhosted.org/packages/36/6c/ee4ec5cb0abf4d987f175e454d798a289afd3edb036457d8ecadd674bf6b/rpds_py-0.8.8-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f8a1cc37e2395002381510a6862c29634acd67edfe5774661a6c48d8617acae7"}, + {url = "https://files.pythonhosted.org/packages/36/bd/bbcc59f06911ee797a14f9b74f7c3f992ffeb859c9b18dff5c58eea617f2/rpds_py-0.8.8-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:f1c84912d77b01651488bbe392df593b4c5852e213477e268ebbb7c799059d78"}, + {url = "https://files.pythonhosted.org/packages/37/d5/0ac25a4492df8ca9f62b6493f480a6220513fb41aa30bece1e1146688b51/rpds_py-0.8.8-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:df3097abf5fd09bfcd8f6fd02d052b25cc3e160b3ee71b6fbd831b2cd516c958"}, + {url = "https://files.pythonhosted.org/packages/3d/42/378b0bc1a87ee1f17729b33c183eb852b7cafb31a69e17a99a10ce22f815/rpds_py-0.8.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1891903e567d728175c0475a1f0ffc1d1580013b0b265b9e2f1b8c93d58b2d05"}, + {url = "https://files.pythonhosted.org/packages/3e/50/e412e20b9b8a13058d206b060506c7a2a5b0a36685f55ea528cc279c219b/rpds_py-0.8.8-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bd8dbc1c63668124e5e48e601d32f1053cfd5a86004ae0e55dc9ba8b1e7de29"}, + {url = "https://files.pythonhosted.org/packages/4b/9b/64a4ed779bccce58113f0fa05da65b186b2a87c7049abcfb801a0e7e39ee/rpds_py-0.8.8-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ac596301c7723809ecb6ec4cb2564b2cadc06f8c07b6348a56fcbf1ae043d751"}, + {url = "https://files.pythonhosted.org/packages/4c/5e/e3a5115c1fca932b8048f11924b280db9479d774db79ba91ad39a72d569f/rpds_py-0.8.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dfec14a64759186153115d987f9e60b1fa7e8e14a00004a02482e696199e554"}, + {url = "https://files.pythonhosted.org/packages/4c/f2/c669f167864d110ae334617d1c39701053da695f95d5a6d111590d84d80d/rpds_py-0.8.8-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5a55fd01f61df19e4f53fd67b63ca9bf47559632c3f7d4037faa06d3a6fed54"}, + {url = "https://files.pythonhosted.org/packages/4d/01/4b5f3ffd31c5056c28c882744dd322246684aef13eb94d1ce07551909748/rpds_py-0.8.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d418d2fd8c0fffe2897bc3e15a2e2ec87abf29076f0c36898cc33fb7881c2cbe"}, + {url = "https://files.pythonhosted.org/packages/4e/fa/4634c103849002b9d4d58e7442af41ee588b6d3933d9f50c6e3378b40f5d/rpds_py-0.8.8-cp310-none-win32.whl", hash = "sha256:e4e11f71673905d9e8735b8dd4ef8fa85a82e6003851fe46f9bdc51aebc2cd5d"}, + {url = "https://files.pythonhosted.org/packages/4f/57/a243eac76274d3fb00238d0af0a0fd44fe347e3a31f57e6404b2a2c7883e/rpds_py-0.8.8-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:c26b1a0425c038cc23cf5770a47d7a7382fe68d6d10fb2a52c2896ca94e72550"}, + {url = "https://files.pythonhosted.org/packages/53/54/0430507405d2408a3e65cec170afc1d7a4b7d9d64489c05fbddb181904e1/rpds_py-0.8.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0fe018430e5e8e1d8b513bcbccdb0ea34b9fd81c32b3a49c41a109fade17cfb"}, + {url = "https://files.pythonhosted.org/packages/59/d2/a4193f5a772c3ee28b3c879c395028d51e0a15011c586d8f872dc5000990/rpds_py-0.8.8-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:961828c668140796c4963edb14cd968666d5414b9b5829997a4f475fd917906e"}, + {url = "https://files.pythonhosted.org/packages/5e/e7/786a14ace23bd190cea8d45a561860b981f6fb7eb20ff35b9bad2719101f/rpds_py-0.8.8-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79ac819182795a2168ed11075c7362de368f360244fb7cea8274c222b2d55365"}, + {url = "https://files.pythonhosted.org/packages/60/be/15ddaab5752a4f6f35cf514f4f3374758de91f82366bcd7b9e97e096d950/rpds_py-0.8.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b189640d59afa8aeff59865fa9d314bca97987c378950f215297e15d64ae1124"}, + {url = "https://files.pythonhosted.org/packages/60/dd/ad4e903816ebc16f931cb1283b9e74159498179e4c9c11bab939f9679b5b/rpds_py-0.8.8-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f64ef5700ff8fded62b12d1ea55463031cc5a353b670ed7146126c6cbf28788"}, + {url = "https://files.pythonhosted.org/packages/63/d0/6b1b5e6e9441453e8df78f693fca1e09b89fe821e2fe4e667d05cc44769c/rpds_py-0.8.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:22afed13c6ad4ccdc650ad44cbc06f835f4f30de201bd4ee2afc09bde06a357a"}, + {url = "https://files.pythonhosted.org/packages/64/25/9059bbb82ec5cf77bcedb7a7a70b51318e2c0bbca661b7a2857fc50fc738/rpds_py-0.8.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ed823997c3300b541da0fcc9eee8fbe6740e07939ffa432824cfca287472d652"}, + {url = "https://files.pythonhosted.org/packages/67/b5/9bd043fb714f54acb52549dc17f9126cd2f01dadf8a2f885bf96ea373605/rpds_py-0.8.8-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:d4334405f6c73c29ff94521f78ad53ebb76a9c1b8dafea75852f9f64c3679cf7"}, + {url = "https://files.pythonhosted.org/packages/6a/13/93b94ee92cf9248208e634fc696e17c7272bf2481cb1b1bb58ed601267d1/rpds_py-0.8.8-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:db71c665fc7ddb9ac53d7b69dc588493c0b71635b28fc8ff64b31eb9db5b3461"}, + {url = "https://files.pythonhosted.org/packages/6e/58/ef427e1f82bb70a4204c16fcd9c282bc6e8b20778731cf1a626a4f9b2ff8/rpds_py-0.8.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f81a570a20f9fce617d728f4e3bdc05bfbb68afa2e795ec0c52544a7923de517"}, + {url = "https://files.pythonhosted.org/packages/72/f6/e5382aa5ac8fdf40216e764ae4ec5e37155b0aa388bd632c9cbdebb5fb10/rpds_py-0.8.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b7c87503843a036f898d44c47326a117d23b6269a9f1574adf83d7bb051b839"}, + {url = "https://files.pythonhosted.org/packages/74/db/c45f7409cb23946ee7a28ab2fc11b734bca57f272fe0a79342c5e7a2fe8a/rpds_py-0.8.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:657348b35a4c2e7c2340bf0bc37597900037bd87e9db7e6282711aaa77256e16"}, + {url = "https://files.pythonhosted.org/packages/75/80/7f76ff5d290a11a8d43653da186def13f293f00baf4927eae1ad128bf9de/rpds_py-0.8.8.tar.gz", hash = "sha256:300b8579740b06e246238b730e636f314a7d8dc475be1868650f5d3ddc29a0d8"}, + {url = "https://files.pythonhosted.org/packages/78/b1/50497831c92408759bfe2382daa8ef0ef367a1f3aaa94bdb0042eb9fdc65/rpds_py-0.8.8-cp39-none-win32.whl", hash = "sha256:ee42ce4ef46ea334ce8ab63d5a57c7fd78238c9c7293b3caa6dfedf11bd28773"}, + {url = "https://files.pythonhosted.org/packages/7d/aa/8d92b6ab7ed47c199d4d133034e6900295dc22f4f89602e29e16870d5b61/rpds_py-0.8.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e85ea159f2d2132d4fcb71abb7df9683314f6073bf8ee9f9bd576440245e59c"}, + {url = "https://files.pythonhosted.org/packages/7e/cb/8d5901a24760da11800d4e257cd1849c95f18778981456b4f5f0ad33d1ce/rpds_py-0.8.8-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a747477838a90b9264f434b5399309f9badb32c80ff3e9c4f6d5b87fddcbaa09"}, + {url = "https://files.pythonhosted.org/packages/80/6e/959524060ac9e4adf6a3cb9eca325164e31800f3620c2c0fb11503ea0348/rpds_py-0.8.8-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ea8c4a1232c7bacf73366b0490dda7f67d25958aec1c2f099b6753c8bfe84427"}, + {url = "https://files.pythonhosted.org/packages/80/ce/5107848cfb18d5ff270ce94d40e3eee78a6820f264442f94d45c95a32d31/rpds_py-0.8.8-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b949e86affe17c8828d82936c51d7aa9b686511f9ac99a4b1de596d7140c8083"}, + {url = "https://files.pythonhosted.org/packages/86/8a/62e1b0ecd4c80d98f8fd85b5cb35d612ae6d46e1b976430d903315094bc8/rpds_py-0.8.8-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:25a4b357ba7540d7cc709915699d67d505c8177cdb30824127092e1b4886b504"}, + {url = "https://files.pythonhosted.org/packages/89/e1/4ec87b9f2575ea6234c6bc75742944b76668ed92b639a0c719acf0884fcc/rpds_py-0.8.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b3ed0d3498b69159db0d5db1393c8bae4df51cf936b2ef5cda53d800acab0019"}, + {url = "https://files.pythonhosted.org/packages/90/b7/e1a36ea5fcf56d92a55c7286097890e96ddb8bb1374d0437eb856b3e38a1/rpds_py-0.8.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ee396f63a1f540fb3aecb8cc698180d30573a661be47fb3fff45cbd2b5d4686"}, + {url = "https://files.pythonhosted.org/packages/98/22/3d8fce5c509354bbd9d72c5a01a3291fdcfc44051040d84e497e94e97177/rpds_py-0.8.8-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:358c7a976482537d26fcbdc7808e7cc25f64816fe89681f9aa8bef13e16c7370"}, + {url = "https://files.pythonhosted.org/packages/98/8a/06fec4c189fb2b69ca8199affc03a52036724cbefb8b997575f37c258943/rpds_py-0.8.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4333b5c2801e44bf342207a7700378a1013f300116c9553ce1ffbc73047d2a02"}, + {url = "https://files.pythonhosted.org/packages/9b/b1/bde879b4273c65c650797cb38ab39f34ae3677e2e53b847283fe627296d3/rpds_py-0.8.8-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:755a837fb7053dbf511fba26343423bd80d3b75a5d7f57f6e407c2fe5ae46682"}, + {url = "https://files.pythonhosted.org/packages/9d/3e/88fe4ed930fcb6dd96abe2b7b3fae26986533231f172e43f9bf3827a0876/rpds_py-0.8.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0df2ae878fd99342415a42659f3bcee34b12441a509033e0ab04c6e301895607"}, + {url = "https://files.pythonhosted.org/packages/9f/c9/ef506612b0c493b1235513d9816b202e4591cec7ccaad3e8d2094cff6401/rpds_py-0.8.8-cp311-none-win_amd64.whl", hash = "sha256:7110854662ccf8db84b90e4624301ef5311cafff7e5f2a63f2d7cc0fc1a75b60"}, + {url = "https://files.pythonhosted.org/packages/a4/63/25491a8aa7564988032e0f37df621ca0f6c6f81037da4c9745b180bf0206/rpds_py-0.8.8-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c62fdb01111da948e8446caaefebf2ca4307a58fcbc10039b48d0db7205397c"}, + {url = "https://files.pythonhosted.org/packages/a5/1b/2241ad69a694c0a8544f47eb8e679091aa6ab062202b606dc6dae8c41427/rpds_py-0.8.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c97e4cbe722474d17c309ee49e09331ceffe345bb72e2b10c6c740788871b122"}, + {url = "https://files.pythonhosted.org/packages/a8/63/1b8921cfd19a9f5ec41e431b41e39908b77db1ae5ea6ffe665f10b0d53a4/rpds_py-0.8.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87d74c2526115daa9d805a66377997602185a837ff7ecceed9d27e625c383572"}, + {url = "https://files.pythonhosted.org/packages/b2/90/e68208a54c8e32a8114822970ddbb9a0ec819751eb138867d35678787d34/rpds_py-0.8.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2f8666fde7cfd9cdbc6c223876b39697d387f0215d12ed25147e9efec2dff5a"}, + {url = "https://files.pythonhosted.org/packages/b5/d4/6949a15e8c87c48f2ae8acdded27e089b181080c06beeae66306c3617980/rpds_py-0.8.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:78c5577f99d2edc9eed9ec39fae27b73d04d1b2462aff6f6b11207e0364fc40d"}, + {url = "https://files.pythonhosted.org/packages/b7/54/a624ce41956e83f740b2e4cd02be0c17203aa171e7b96b2e34b09c46a60c/rpds_py-0.8.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:13aed64f2e0bef04a0eae6d1d1295f901f6c1640d1e20264dc3b19d62ef1721d"}, + {url = "https://files.pythonhosted.org/packages/b8/29/1c2fb5f3bcd51142dca7a8771231ab9c1ee973dd979ce8731834b39fcd14/rpds_py-0.8.8-cp311-none-win32.whl", hash = "sha256:42eb3030665ee7a5c03fd4db6b8db1983aa91bcdffbed0f4687751deb2a94a7c"}, + {url = "https://files.pythonhosted.org/packages/b8/42/d72a8142a7d62b176bd7a7d38125eed76b3103b35acc95cf148bc4a5990f/rpds_py-0.8.8-cp39-none-win_amd64.whl", hash = "sha256:0e8da63b9baa154ec9ddd6dd397893830d17e5812ceb50edbae8122d8ecb9f2e"}, + {url = "https://files.pythonhosted.org/packages/be/4c/6b44ff175cd54c3cc4bbabb76194c4eb1187c0d1f6e5a7c7dfd896c28099/rpds_py-0.8.8-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:fffd98c1fd6b38df35e471549c2486d826af0fda6ca55c0bbbb956b291e7f2ae"}, + {url = "https://files.pythonhosted.org/packages/cc/cc/3fd5090a06a67eab60ed02c056e9b244759a6abe34ffa6f12ddc25bbf36e/rpds_py-0.8.8-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:d7e46f52272ceecc42c05ad869b068b2dbfb6eb5643bcccecd2327d3cded5a2e"}, + {url = "https://files.pythonhosted.org/packages/ce/b7/e43127612a860c050b9fb5af0e9dd8843bd4bdf2a79f1af002bbbeb7b070/rpds_py-0.8.8-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:9b331fa451d725258c1ad0ae6816cf36d55294e5cb68338cf91550b9a448a48f"}, + {url = "https://files.pythonhosted.org/packages/d9/52/ada681ead138438a00e554c548f8304760fd6efb79f22feb6b74eb804cc7/rpds_py-0.8.8-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:c7019b2522af6b835118177b6b53f7ed08da28061aa5d44e06286be09799e7a4"}, + {url = "https://files.pythonhosted.org/packages/d9/99/b23b2728a332d5305c98e31d8a974b05ce0fa7d544514407fcc0836bf459/rpds_py-0.8.8-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:180963bb3e1fcc6ed6313ece5e065f0df4021a7eb7016084d3cbc90cd2a8af3e"}, + {url = "https://files.pythonhosted.org/packages/e1/c8/279faad6ae0c07c79b616a943a797600119388cd749c3752278b8e7d4e68/rpds_py-0.8.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9af40bb89e40932e04c0cc1fb516249d6b3ae68ceebd984fdc592a6673244e50"}, + {url = "https://files.pythonhosted.org/packages/e2/88/0f6bd9e4b17263e51388a59a1c1eb9b75d6374e8bd10e4f0e9a67d2ead92/rpds_py-0.8.8-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:cea42c2f52e37877e6b877bce64d109a6b0213e32545ecc70d4492d2a4641b8f"}, + {url = "https://files.pythonhosted.org/packages/e4/f5/505eccde8bd63438c5997cea7388a9cfd63162d97be88b8a6b7884804832/rpds_py-0.8.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1f60a7eb96fedcc5bf59761d33ac0f2f127d75f8c4b99ed0f138fc0f3601c537"}, + {url = "https://files.pythonhosted.org/packages/e5/d6/ef8c93686757471e2bfd2fbf1ac8b7816b9d55ceec912d5b5454a32fc3f6/rpds_py-0.8.8-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ac1e47ee4cb2dbd714537e63c67086eec63f56b13208fe450ae5be4f3d65671"}, + {url = "https://files.pythonhosted.org/packages/e9/99/6202f1128aa9c6b277233ac46cb360f2d28aba84d52ea2c1eab1dfc9019b/rpds_py-0.8.8-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:681ef7a21e6990583533c3a3038b7176f5e51e5d345fe2d9109b54f6bffcabcd"}, + {url = "https://files.pythonhosted.org/packages/f1/53/3f0296208284c18546685c5d40c51ac73f58490039d786df13424b12de1a/rpds_py-0.8.8-cp310-none-win_amd64.whl", hash = "sha256:6b1b235b890373f785507f8f6a644a4f191b7195939e7f6108dc0e5e4fab57fd"}, + {url = "https://files.pythonhosted.org/packages/f1/ba/87912136c579b834e3f15cb1960237b6ff618e5a07f9c9aa5617834a9914/rpds_py-0.8.8-cp38-none-win32.whl", hash = "sha256:e261fa453ad50fe1d9287fa21d962cdbcd3d495cf1160dd0f893883040c455b6"}, + {url = "https://files.pythonhosted.org/packages/f5/43/a7ea39840dd8baac5fce1b61fdaeab1bcd4dc42e25192386808b5b8ceb82/rpds_py-0.8.8-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:18a97bb7f211b247346983092186927c517153ac155c611f43ca83d5ee93a3e2"}, + {url = "https://files.pythonhosted.org/packages/f8/33/247a88d35b5cd74f753555e4f8e42677df416868f63627c122a38899ab84/rpds_py-0.8.8-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e1251d6690f356a305192089017da83999cded1d7e2405660d14c1dff976af7"}, + {url = "https://files.pythonhosted.org/packages/fa/6a/bfb4c65dad82623fdb19e6788e1a5333532cbd707606ddc8853f86e6b187/rpds_py-0.8.8-cp38-none-win_amd64.whl", hash = "sha256:e1700fba17dd63c9c7d5cb03cf838db23cf938dd5cdb1eecb6ba8b8da62c3e73"}, + {url = "https://files.pythonhosted.org/packages/ff/22/f2e59fa779ea70df14b7134de4b296d3fdd6b4827713cf6b579a3b9630db/rpds_py-0.8.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddb5226b11f4fce98c6e47c07819fbbfdda6d3fd529cd176ad8a1e0b98a70b05"}, + {url = "https://files.pythonhosted.org/packages/ff/8c/fd75c80fafd9cc65fc1687eaae7d6b8492da2b20e463a3985260ba251aff/rpds_py-0.8.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7628b2080538faa4a1243b0002678cae7111af68ae7b5aa6cd8526762cace868"}, +] "ruff 0.0.277" = [ {url = "https://files.pythonhosted.org/packages/07/bc/f557a79b392eb876f486b22fe0f3f7d46f6165f02e460d59580d904a4a05/ruff-0.0.277-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:74e4b206cb24f2e98a615f87dbe0bde18105217cbcc8eb785bb05a644855ba50"}, {url = "https://files.pythonhosted.org/packages/1e/a4/1ba8e37215ab08ca05773948cea81f4fb47dd1ce1126fa26a43ae3bf63dc/ruff-0.0.277-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:3250b24333ef419b7a232080d9724ccc4d2da1dbbe4ce85c4caa2290d83200f8"}, diff --git a/pyproject.toml b/pyproject.toml index ef5e9e00..4b38f7e0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,6 +19,7 @@ dependencies = [ "psycopg2~=2.9", "alembic~=1.11", "python-dotenv~=1.0", + "psycopg2~=2.9", ] requires-python = '>=3.8.1,<4.0' readme = 'README.md' @@ -30,7 +31,10 @@ documentation = 'https://WGBH-MLA.github.io/chowda/' repository = 'https://github.com/WGBH-MLA/chowda' [project.optional-dependencies] -production = ["uvicorn[standard]~=0.22", "gunicorn~=20.1"] +production = [ + "uvicorn[standard]~=0.22", + "gunicorn~=20.1", +] test = [ "factory-boy~=3.2", "pytest~=7.4", diff --git a/tests/conftest.py b/tests/conftest.py index ec1cb3e3..54760a30 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,13 +1,16 @@ from json import dumps, loads from json.decoder import JSONDecodeError from os import environ, path + from pytest import fixture -from chowda.db import init_db # Set CHOWDA_ENV env var to 'test' always. This serves as a flag for anywhere else in # the application where we need to detect whether we are running tests or not. environ['CHOWDA_ENV'] = 'test' +# This import must come *after* setting CHOWDA_ENV to 'test' above. +from chowda.db import init_db # noqa: E402 + # Set CI_CONFIG to use ./test/ci.test.toml *only* if it's not already set. We need to be # able to set the CI_CONFIG to point to a real SonyCi account and workspace when we are # recording our VCR cassette fixtures for testing.