From 424061c9c087948878868301679fec88d9bba8a1 Mon Sep 17 00:00:00 2001 From: Paul Hallett Date: Tue, 3 Feb 2026 09:33:35 +0000 Subject: [PATCH 1/6] Use UV package manager Context: - Far more modern, easier environment management - I have tested all makefile commands work --- .circleci/config.yml | 2 +- .python-version | 1 + Makefile | 25 +-- README.md | 4 +- pyproject.toml | 19 ++ requirements.txt | 10 -- test-requirements.txt | 2 - uv.lock | 401 ++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 434 insertions(+), 30 deletions(-) create mode 100644 .python-version create mode 100644 pyproject.toml delete mode 100644 requirements.txt delete mode 100644 test-requirements.txt create mode 100644 uv.lock diff --git a/.circleci/config.yml b/.circleci/config.yml index 6e6b5411b..e6a77e720 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -13,7 +13,7 @@ jobs: git submodule update --remote - run: name: Install deps - command: make dev-install + command: make install - run: name: Linting command: make format-check diff --git a/.python-version b/.python-version new file mode 100644 index 000000000..6324d401a --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.14 diff --git a/Makefile b/Makefile index 3f772660d..fd55b7318 100755 --- a/Makefile +++ b/Makefile @@ -4,10 +4,6 @@ docker_config = --settings=config.docker-compose gql_compose_config = -f docker-compose.yml -f Resources/compose/docker-compose-prod-graphql.yml gqlv1beta_compose_config = -f docker-compose.yml -f Resources/compose/docker-compose-prod-graphql.yml -f Resources/compose/docker-compose-prod-graphql-v1beta.yml -# Auto-detect Python and pip commands -PYTHON := $(shell which python3 2>/dev/null || which python 2>/dev/null || echo python3) -PIP := $(shell which pip3 2>/dev/null || which pip 2>/dev/null || echo pip3) - .PHONY: help .SILENT: @@ -15,40 +11,37 @@ help: @grep -E '^[a-zA-Z_-]+:.*?# .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?# "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' install: # Install base requirements to run project - $(PIP) install -r requirements.txt - -dev-install: # Install developer requirements + base requirements - $(PIP) install -r test-requirements.txt + uv sync setup: # Set up the project database - $(PYTHON) manage.py migrate ${local_config} + uv run manage.py migrate ${local_config} build-db: # Build database - echo "from data.v2.build import build_all; build_all()" | $(PYTHON) manage.py shell ${local_config} + echo "from data.v2.build import build_all; build_all()" | uv run manage.py shell ${local_config} wipe-sqlite-db: # Delete's the project database rm -rf db.sqlite3 serve: # Run the project locally - $(PYTHON) manage.py runserver ${local_config} + uv run manage.py runserver ${local_config} test: # Run tests - $(PYTHON) manage.py test ${local_config} + uv run manage.py test ${local_config} clean: # Remove any pyc files find . -type f -name '*.pyc' -delete migrate: # Run any outstanding migrations - $(PYTHON) manage.py migrate ${local_config} + uv run manage.py migrate ${local_config} make-migrations: # Create migrations files if schema has changed - $(PYTHON) manage.py makemigrations ${local_config} + uv run manage.py makemigrations ${local_config} shell: # Load a shell - $(PYTHON) manage.py shell ${local_config} + uv run manage.py shell ${local_config} openapi-generate: - $(PYTHON) manage.py spectacular --color --file openapi.yml ${local_config} + uv run manage.py spectacular --color --file openapi.yml ${local_config} docker-up: # (Docker) Create services/volumes/networks docker compose up -d diff --git a/README.md b/README.md index 41a113475..b12b9e422 100755 --- a/README.md +++ b/README.md @@ -37,7 +37,9 @@ A RESTful API for Pokémon - [pokeapi.co](https://pokeapi.co) - Download this source code into a working directory, be sure to use the flag `--recurse-submodules` to clone also our submodules. -- Install the requirements using pip: +- Install [uv](https://docs.astral.sh/uv/getting-started/installation/) for Python environment management. + +- Install the requirements using the Makefile commands: ```sh make install diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 000000000..327a32ec6 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,19 @@ +[project] +name = "pokeapi" +version = "0.1.0" +description = "The Pokemon API" +readme = "README.md" +requires-python = ">=3.14" +dependencies = [ + "coverage==7.13.1", + "django==5.2.10", + "django-cachalot==2.8.0", + "django-cors-headers==4.9.0", + "django-redis==6.0.0", + "djangorestframework==3.16.1", + "drf-spectacular==0.29.0", + "gunicorn==23.0.0", + "psycopg==3.3.2", + "ruff>=0.14.14", + "ty>=0.0.14", +] diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index c67da81c0..000000000 --- a/requirements.txt +++ /dev/null @@ -1,10 +0,0 @@ -Django==5.2.10 -coverage==7.13.1 -django-cors-headers==4.9.0 -django-redis==6.0.0 -django-cachalot==2.8.0 -djangorestframework==3.16.1 -gunicorn==23.0.0 -psycopg[binary]==3.3.2 -drf-spectacular==0.29.0 -legacy-cgi; python_version >= '3.13' diff --git a/test-requirements.txt b/test-requirements.txt deleted file mode 100644 index 10f13eba6..000000000 --- a/test-requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ --r requirements.txt -black==26.1.0 diff --git a/uv.lock b/uv.lock new file mode 100644 index 000000000..c45a95a06 --- /dev/null +++ b/uv.lock @@ -0,0 +1,401 @@ +version = 1 +revision = 2 +requires-python = ">=3.14" + +[[package]] +name = "asgiref" +version = "3.11.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/b9/4db2509eabd14b4a8c71d1b24c8d5734c52b8560a7b1e1a8b56c8d25568b/asgiref-3.11.0.tar.gz", hash = "sha256:13acff32519542a1736223fb79a715acdebe24286d98e8b164a73085f40da2c4", size = 37969, upload-time = "2025-11-19T15:32:20.106Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/be/317c2c55b8bbec407257d45f5c8d1b6867abc76d12043f2d3d58c538a4ea/asgiref-3.11.0-py3-none-any.whl", hash = "sha256:1db9021efadb0d9512ce8ffaf72fcef601c7b73a8807a1bb2ef143dc6b14846d", size = 24096, upload-time = "2025-11-19T15:32:19.004Z" }, +] + +[[package]] +name = "attrs" +version = "25.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251, upload-time = "2025-10-06T13:54:44.725Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, +] + +[[package]] +name = "coverage" +version = "7.13.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/23/f9/e92df5e07f3fc8d4c7f9a0f146ef75446bf870351cd37b788cf5897f8079/coverage-7.13.1.tar.gz", hash = "sha256:b7593fe7eb5feaa3fbb461ac79aac9f9fc0387a5ca8080b0c6fe2ca27b091afd", size = 825862, upload-time = "2025-12-28T15:42:56.969Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/aa/8e/ba0e597560c6563fc0adb902fda6526df5d4aa73bb10adf0574d03bd2206/coverage-7.13.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:97ab3647280d458a1f9adb85244e81587505a43c0c7cff851f5116cd2814b894", size = 218996, upload-time = "2025-12-28T15:42:04.978Z" }, + { url = "https://files.pythonhosted.org/packages/6b/8e/764c6e116f4221dc7aa26c4061181ff92edb9c799adae6433d18eeba7a14/coverage-7.13.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8f572d989142e0908e6acf57ad1b9b86989ff057c006d13b76c146ec6a20216a", size = 219326, upload-time = "2025-12-28T15:42:06.691Z" }, + { url = "https://files.pythonhosted.org/packages/4f/a6/6130dc6d8da28cdcbb0f2bf8865aeca9b157622f7c0031e48c6cf9a0e591/coverage-7.13.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d72140ccf8a147e94274024ff6fd8fb7811354cf7ef88b1f0a988ebaa5bc774f", size = 250374, upload-time = "2025-12-28T15:42:08.786Z" }, + { url = "https://files.pythonhosted.org/packages/82/2b/783ded568f7cd6b677762f780ad338bf4b4750205860c17c25f7c708995e/coverage-7.13.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d3c9f051b028810f5a87c88e5d6e9af3c0ff32ef62763bf15d29f740453ca909", size = 252882, upload-time = "2025-12-28T15:42:10.515Z" }, + { url = "https://files.pythonhosted.org/packages/cd/b2/9808766d082e6a4d59eb0cc881a57fc1600eb2c5882813eefff8254f71b5/coverage-7.13.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f398ba4df52d30b1763f62eed9de5620dcde96e6f491f4c62686736b155aa6e4", size = 254218, upload-time = "2025-12-28T15:42:12.208Z" }, + { url = "https://files.pythonhosted.org/packages/44/ea/52a985bb447c871cb4d2e376e401116520991b597c85afdde1ea9ef54f2c/coverage-7.13.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:132718176cc723026d201e347f800cd1a9e4b62ccd3f82476950834dad501c75", size = 250391, upload-time = "2025-12-28T15:42:14.21Z" }, + { url = "https://files.pythonhosted.org/packages/7f/1d/125b36cc12310718873cfc8209ecfbc1008f14f4f5fa0662aa608e579353/coverage-7.13.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9e549d642426e3579b3f4b92d0431543b012dcb6e825c91619d4e93b7363c3f9", size = 252239, upload-time = "2025-12-28T15:42:16.292Z" }, + { url = "https://files.pythonhosted.org/packages/6a/16/10c1c164950cade470107f9f14bbac8485f8fb8515f515fca53d337e4a7f/coverage-7.13.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:90480b2134999301eea795b3a9dbf606c6fbab1b489150c501da84a959442465", size = 250196, upload-time = "2025-12-28T15:42:18.54Z" }, + { url = "https://files.pythonhosted.org/packages/2a/c6/cd860fac08780c6fd659732f6ced1b40b79c35977c1356344e44d72ba6c4/coverage-7.13.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e825dbb7f84dfa24663dd75835e7257f8882629fc11f03ecf77d84a75134b864", size = 250008, upload-time = "2025-12-28T15:42:20.365Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/a8c58d3d38f82a5711e1e0a67268362af48e1a03df27c03072ac30feefcf/coverage-7.13.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:623dcc6d7a7ba450bbdbeedbaa0c42b329bdae16491af2282f12a7e809be7eb9", size = 251671, upload-time = "2025-12-28T15:42:22.114Z" }, + { url = "https://files.pythonhosted.org/packages/f0/bc/fd4c1da651d037a1e3d53e8cb3f8182f4b53271ffa9a95a2e211bacc0349/coverage-7.13.1-cp314-cp314-win32.whl", hash = "sha256:6e73ebb44dca5f708dc871fe0b90cf4cff1a13f9956f747cc87b535a840386f5", size = 221777, upload-time = "2025-12-28T15:42:23.919Z" }, + { url = "https://files.pythonhosted.org/packages/4b/50/71acabdc8948464c17e90b5ffd92358579bd0910732c2a1c9537d7536aa6/coverage-7.13.1-cp314-cp314-win_amd64.whl", hash = "sha256:be753b225d159feb397bd0bf91ae86f689bad0da09d3b301478cd39b878ab31a", size = 222592, upload-time = "2025-12-28T15:42:25.619Z" }, + { url = "https://files.pythonhosted.org/packages/f7/c8/a6fb943081bb0cc926499c7907731a6dc9efc2cbdc76d738c0ab752f1a32/coverage-7.13.1-cp314-cp314-win_arm64.whl", hash = "sha256:228b90f613b25ba0019361e4ab81520b343b622fc657daf7e501c4ed6a2366c0", size = 221169, upload-time = "2025-12-28T15:42:27.629Z" }, + { url = "https://files.pythonhosted.org/packages/16/61/d5b7a0a0e0e40d62e59bc8c7aa1afbd86280d82728ba97f0673b746b78e2/coverage-7.13.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:60cfb538fe9ef86e5b2ab0ca8fc8d62524777f6c611dcaf76dc16fbe9b8e698a", size = 219730, upload-time = "2025-12-28T15:42:29.306Z" }, + { url = "https://files.pythonhosted.org/packages/a3/2c/8881326445fd071bb49514d1ce97d18a46a980712b51fee84f9ab42845b4/coverage-7.13.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:57dfc8048c72ba48a8c45e188d811e5efd7e49b387effc8fb17e97936dde5bf6", size = 220001, upload-time = "2025-12-28T15:42:31.319Z" }, + { url = "https://files.pythonhosted.org/packages/b5/d7/50de63af51dfa3a7f91cc37ad8fcc1e244b734232fbc8b9ab0f3c834a5cd/coverage-7.13.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3f2f725aa3e909b3c5fdb8192490bdd8e1495e85906af74fe6e34a2a77ba0673", size = 261370, upload-time = "2025-12-28T15:42:32.992Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2c/d31722f0ec918fd7453b2758312729f645978d212b410cd0f7c2aed88a94/coverage-7.13.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9ee68b21909686eeb21dfcba2c3b81fee70dcf38b140dcd5aa70680995fa3aa5", size = 263485, upload-time = "2025-12-28T15:42:34.759Z" }, + { url = "https://files.pythonhosted.org/packages/fa/7a/2c114fa5c5fc08ba0777e4aec4c97e0b4a1afcb69c75f1f54cff78b073ab/coverage-7.13.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:724b1b270cb13ea2e6503476e34541a0b1f62280bc997eab443f87790202033d", size = 265890, upload-time = "2025-12-28T15:42:36.517Z" }, + { url = "https://files.pythonhosted.org/packages/65/d9/f0794aa1c74ceabc780fe17f6c338456bbc4e96bd950f2e969f48ac6fb20/coverage-7.13.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:916abf1ac5cf7eb16bc540a5bf75c71c43a676f5c52fcb9fe75a2bd75fb944e8", size = 260445, upload-time = "2025-12-28T15:42:38.646Z" }, + { url = "https://files.pythonhosted.org/packages/49/23/184b22a00d9bb97488863ced9454068c79e413cb23f472da6cbddc6cfc52/coverage-7.13.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:776483fd35b58d8afe3acbd9988d5de592ab6da2d2a865edfdbc9fdb43e7c486", size = 263357, upload-time = "2025-12-28T15:42:40.788Z" }, + { url = "https://files.pythonhosted.org/packages/7d/bd/58af54c0c9199ea4190284f389005779d7daf7bf3ce40dcd2d2b2f96da69/coverage-7.13.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:b6f3b96617e9852703f5b633ea01315ca45c77e879584f283c44127f0f1ec564", size = 260959, upload-time = "2025-12-28T15:42:42.808Z" }, + { url = "https://files.pythonhosted.org/packages/4b/2a/6839294e8f78a4891bf1df79d69c536880ba2f970d0ff09e7513d6e352e9/coverage-7.13.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:bd63e7b74661fed317212fab774e2a648bc4bb09b35f25474f8e3325d2945cd7", size = 259792, upload-time = "2025-12-28T15:42:44.818Z" }, + { url = "https://files.pythonhosted.org/packages/ba/c3/528674d4623283310ad676c5af7414b9850ab6d55c2300e8aa4b945ec554/coverage-7.13.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:933082f161bbb3e9f90d00990dc956120f608cdbcaeea15c4d897f56ef4fe416", size = 262123, upload-time = "2025-12-28T15:42:47.108Z" }, + { url = "https://files.pythonhosted.org/packages/06/c5/8c0515692fb4c73ac379d8dc09b18eaf0214ecb76ea6e62467ba7a1556ff/coverage-7.13.1-cp314-cp314t-win32.whl", hash = "sha256:18be793c4c87de2965e1c0f060f03d9e5aff66cfeae8e1dbe6e5b88056ec153f", size = 222562, upload-time = "2025-12-28T15:42:49.144Z" }, + { url = "https://files.pythonhosted.org/packages/05/0e/c0a0c4678cb30dac735811db529b321d7e1c9120b79bd728d4f4d6b010e9/coverage-7.13.1-cp314-cp314t-win_amd64.whl", hash = "sha256:0e42e0ec0cd3e0d851cb3c91f770c9301f48647cb2877cb78f74bdaa07639a79", size = 223670, upload-time = "2025-12-28T15:42:51.218Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5f/b177aa0011f354abf03a8f30a85032686d290fdeed4222b27d36b4372a50/coverage-7.13.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eaecf47ef10c72ece9a2a92118257da87e460e113b83cc0d2905cbbe931792b4", size = 221707, upload-time = "2025-12-28T15:42:53.034Z" }, + { url = "https://files.pythonhosted.org/packages/cc/48/d9f421cb8da5afaa1a64570d9989e00fb7955e6acddc5a12979f7666ef60/coverage-7.13.1-py3-none-any.whl", hash = "sha256:2016745cb3ba554469d02819d78958b571792bb68e31302610e898f80dd3a573", size = 210722, upload-time = "2025-12-28T15:42:54.901Z" }, +] + +[[package]] +name = "django" +version = "5.2.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asgiref" }, + { name = "sqlparse" }, + { name = "tzdata", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e6/e5/2671df24bf0ded831768ef79532e5a7922485411a5696f6d979568591a37/django-5.2.10.tar.gz", hash = "sha256:74df100784c288c50a2b5cad59631d71214f40f72051d5af3fdf220c20bdbbbe", size = 10880754, upload-time = "2026-01-06T18:55:26.817Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/de/f1a7cd896daec85832136ab509d9b2a6daed4939dbe26313af3e95fc5f5e/django-5.2.10-py3-none-any.whl", hash = "sha256:cf85067a64250c95d5f9067b056c5eaa80591929f7e16fbcd997746e40d6c45c", size = 8290820, upload-time = "2026-01-06T18:55:20.009Z" }, +] + +[[package]] +name = "django-cachalot" +version = "2.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f5/53/1f781e58028a43028d6c799f2eab15eff65e841e3e288d6f2953e36f01a4/django_cachalot-2.8.0.tar.gz", hash = "sha256:30456720ac9f3fabeb90ce898530fe01130c25a1eca911cd016cfaeab251d627", size = 74673, upload-time = "2025-04-17T00:05:36.387Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/05/f5846fd186189ac0a1deddb9c67450c838e5c8ceceb35b5260c61f622599/django_cachalot-2.8.0-py3-none-any.whl", hash = "sha256:315da766a5356c7968318326f7b0579f64571ad909f64cad0601f38153ca4e16", size = 55671, upload-time = "2025-04-17T00:05:34.641Z" }, +] + +[[package]] +name = "django-cors-headers" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asgiref" }, + { name = "django" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/21/39/55822b15b7ec87410f34cd16ce04065ff390e50f9e29f31d6d116fc80456/django_cors_headers-4.9.0.tar.gz", hash = "sha256:fe5d7cb59fdc2c8c646ce84b727ac2bca8912a247e6e68e1fb507372178e59e8", size = 21458, upload-time = "2025-09-18T10:40:52.326Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/d8/19ed1e47badf477d17fb177c1c19b5a21da0fd2d9f093f23be3fb86c5fab/django_cors_headers-4.9.0-py3-none-any.whl", hash = "sha256:15c7f20727f90044dcee2216a9fd7303741a864865f0c3657e28b7056f61b449", size = 12809, upload-time = "2025-09-18T10:40:50.843Z" }, +] + +[[package]] +name = "django-redis" +version = "6.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, + { name = "redis" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/08/53/dbcfa1e528e0d6c39947092625b2c89274b5d88f14d357cee53c4d6dbbd4/django_redis-6.0.0.tar.gz", hash = "sha256:2d9cb12a20424a4c4dde082c6122f486628bae2d9c2bee4c0126a4de7fda00dd", size = 56904, upload-time = "2025-06-17T18:15:46.376Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/79/055dfcc508cfe9f439d9f453741188d633efa9eab90fc78a67b0ab50b137/django_redis-6.0.0-py3-none-any.whl", hash = "sha256:20bf0063a8abee567eb5f77f375143c32810c8700c0674ced34737f8de4e36c0", size = 33687, upload-time = "2025-06-17T18:15:34.165Z" }, +] + +[[package]] +name = "djangorestframework" +version = "3.16.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/95/5376fe618646fde6899b3cdc85fd959716bb67542e273a76a80d9f326f27/djangorestframework-3.16.1.tar.gz", hash = "sha256:166809528b1aced0a17dc66c24492af18049f2c9420dbd0be29422029cfc3ff7", size = 1089735, upload-time = "2025-08-06T17:50:53.251Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/ce/bf8b9d3f415be4ac5588545b5fcdbbb841977db1c1d923f7568eeabe1689/djangorestframework-3.16.1-py3-none-any.whl", hash = "sha256:33a59f47fb9c85ede792cbf88bde71893bcda0667bc573f784649521f1102cec", size = 1080442, upload-time = "2025-08-06T17:50:50.667Z" }, +] + +[[package]] +name = "drf-spectacular" +version = "0.29.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, + { name = "djangorestframework" }, + { name = "inflection" }, + { name = "jsonschema" }, + { name = "pyyaml" }, + { name = "uritemplate" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5e/0e/a4f50d83e76cbe797eda88fc0083c8ca970cfa362b5586359ef06ec6f70a/drf_spectacular-0.29.0.tar.gz", hash = "sha256:0a069339ea390ce7f14a75e8b5af4a0860a46e833fd4af027411a3e94fc1a0cc", size = 241722, upload-time = "2025-11-02T03:40:26.348Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/d9/502c56fc3ca960075d00956283f1c44e8cafe433dada03f9ed2821f3073b/drf_spectacular-0.29.0-py3-none-any.whl", hash = "sha256:d1ee7c9535d89848affb4427347f7c4a22c5d22530b8842ef133d7b72e19b41a", size = 105433, upload-time = "2025-11-02T03:40:24.823Z" }, +] + +[[package]] +name = "gunicorn" +version = "23.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/34/72/9614c465dc206155d93eff0ca20d42e1e35afc533971379482de953521a4/gunicorn-23.0.0.tar.gz", hash = "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec", size = 375031, upload-time = "2024-08-10T20:25:27.378Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/7d/6dac2a6e1eba33ee43f318edbed4ff29151a49b5d37f080aad1e6469bca4/gunicorn-23.0.0-py3-none-any.whl", hash = "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d", size = 85029, upload-time = "2024-08-10T20:25:24.996Z" }, +] + +[[package]] +name = "inflection" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/7e/691d061b7329bc8d54edbf0ec22fbfb2afe61facb681f9aaa9bff7a27d04/inflection-0.5.1.tar.gz", hash = "sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417", size = 15091, upload-time = "2020-08-22T08:16:29.139Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/91/aa6bde563e0085a02a435aa99b49ef75b0a4b062635e606dab23ce18d720/inflection-0.5.1-py2.py3-none-any.whl", hash = "sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2", size = 9454, upload-time = "2020-08-22T08:16:27.816Z" }, +] + +[[package]] +name = "jsonschema" +version = "4.26.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "jsonschema-specifications" }, + { name = "referencing" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2025.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "referencing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, +] + +[[package]] +name = "packaging" +version = "26.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, +] + +[[package]] +name = "pokeapi" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "coverage" }, + { name = "django" }, + { name = "django-cachalot" }, + { name = "django-cors-headers" }, + { name = "django-redis" }, + { name = "djangorestframework" }, + { name = "drf-spectacular" }, + { name = "gunicorn" }, + { name = "psycopg" }, + { name = "ruff" }, + { name = "ty" }, +] + +[package.metadata] +requires-dist = [ + { name = "coverage", specifier = "==7.13.1" }, + { name = "django", specifier = "==5.2.10" }, + { name = "django-cachalot", specifier = "==2.8.0" }, + { name = "django-cors-headers", specifier = "==4.9.0" }, + { name = "django-redis", specifier = "==6.0.0" }, + { name = "djangorestframework", specifier = "==3.16.1" }, + { name = "drf-spectacular", specifier = "==0.29.0" }, + { name = "gunicorn", specifier = "==23.0.0" }, + { name = "psycopg", specifier = "==3.3.2" }, + { name = "ruff", specifier = ">=0.14.14" }, + { name = "ty", specifier = ">=0.0.14" }, +] + +[[package]] +name = "psycopg" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tzdata", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e0/1a/7d9ef4fdc13ef7f15b934c393edc97a35c281bb7d3c3329fbfcbe915a7c2/psycopg-3.3.2.tar.gz", hash = "sha256:707a67975ee214d200511177a6a80e56e654754c9afca06a7194ea6bbfde9ca7", size = 165630, upload-time = "2025-12-06T17:34:53.899Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/51/2779ccdf9305981a06b21a6b27e8547c948d85c41c76ff434192784a4c93/psycopg-3.3.2-py3-none-any.whl", hash = "sha256:3e94bc5f4690247d734599af56e51bae8e0db8e4311ea413f801fef82b14a99b", size = 212774, upload-time = "2025-12-06T17:31:41.414Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + +[[package]] +name = "redis" +version = "7.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/c8/983d5c6579a411d8a99bc5823cc5712768859b5ce2c8afe1a65b37832c81/redis-7.1.0.tar.gz", hash = "sha256:b1cc3cfa5a2cb9c2ab3ba700864fb0ad75617b41f01352ce5779dabf6d5f9c3c", size = 4796669, upload-time = "2025-11-19T15:54:39.961Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/f0/8956f8a86b20d7bb9d6ac0187cf4cd54d8065bc9a1a09eb8011d4d326596/redis-7.1.0-py3-none-any.whl", hash = "sha256:23c52b208f92b56103e17c5d06bdc1a6c2c0b3106583985a76a18f83b265de2b", size = 354159, upload-time = "2025-11-19T15:54:38.064Z" }, +] + +[[package]] +name = "referencing" +version = "0.37.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, +] + +[[package]] +name = "rpds-py" +version = "0.30.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", size = 69469, upload-time = "2025-11-30T20:24:38.837Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/81/dad16382ebbd3d0e0328776d8fd7ca94220e4fa0798d1dc5e7da48cb3201/rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0", size = 362099, upload-time = "2025-11-30T20:23:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/2b/60/19f7884db5d5603edf3c6bce35408f45ad3e97e10007df0e17dd57af18f8/rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be", size = 353192, upload-time = "2025-11-30T20:23:29.151Z" }, + { url = "https://files.pythonhosted.org/packages/bf/c4/76eb0e1e72d1a9c4703c69607cec123c29028bff28ce41588792417098ac/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f", size = 384080, upload-time = "2025-11-30T20:23:30.785Z" }, + { url = "https://files.pythonhosted.org/packages/72/87/87ea665e92f3298d1b26d78814721dc39ed8d2c74b86e83348d6b48a6f31/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f", size = 394841, upload-time = "2025-11-30T20:23:32.209Z" }, + { url = "https://files.pythonhosted.org/packages/77/ad/7783a89ca0587c15dcbf139b4a8364a872a25f861bdb88ed99f9b0dec985/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87", size = 516670, upload-time = "2025-11-30T20:23:33.742Z" }, + { url = "https://files.pythonhosted.org/packages/5b/3c/2882bdac942bd2172f3da574eab16f309ae10a3925644e969536553cb4ee/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18", size = 408005, upload-time = "2025-11-30T20:23:35.253Z" }, + { url = "https://files.pythonhosted.org/packages/ce/81/9a91c0111ce1758c92516a3e44776920b579d9a7c09b2b06b642d4de3f0f/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad", size = 382112, upload-time = "2025-11-30T20:23:36.842Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8e/1da49d4a107027e5fbc64daeab96a0706361a2918da10cb41769244b805d/rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07", size = 399049, upload-time = "2025-11-30T20:23:38.343Z" }, + { url = "https://files.pythonhosted.org/packages/df/5a/7ee239b1aa48a127570ec03becbb29c9d5a9eb092febbd1699d567cae859/rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f", size = 415661, upload-time = "2025-11-30T20:23:40.263Z" }, + { url = "https://files.pythonhosted.org/packages/70/ea/caa143cf6b772f823bc7929a45da1fa83569ee49b11d18d0ada7f5ee6fd6/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65", size = 565606, upload-time = "2025-11-30T20:23:42.186Z" }, + { url = "https://files.pythonhosted.org/packages/64/91/ac20ba2d69303f961ad8cf55bf7dbdb4763f627291ba3d0d7d67333cced9/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f", size = 591126, upload-time = "2025-11-30T20:23:44.086Z" }, + { url = "https://files.pythonhosted.org/packages/21/20/7ff5f3c8b00c8a95f75985128c26ba44503fb35b8e0259d812766ea966c7/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53", size = 553371, upload-time = "2025-11-30T20:23:46.004Z" }, + { url = "https://files.pythonhosted.org/packages/72/c7/81dadd7b27c8ee391c132a6b192111ca58d866577ce2d9b0ca157552cce0/rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed", size = 215298, upload-time = "2025-11-30T20:23:47.696Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d2/1aaac33287e8cfb07aab2e6b8ac1deca62f6f65411344f1433c55e6f3eb8/rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950", size = 228604, upload-time = "2025-11-30T20:23:49.501Z" }, + { url = "https://files.pythonhosted.org/packages/e8/95/ab005315818cc519ad074cb7784dae60d939163108bd2b394e60dc7b5461/rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6", size = 222391, upload-time = "2025-11-30T20:23:50.96Z" }, + { url = "https://files.pythonhosted.org/packages/9e/68/154fe0194d83b973cdedcdcc88947a2752411165930182ae41d983dcefa6/rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb", size = 364868, upload-time = "2025-11-30T20:23:52.494Z" }, + { url = "https://files.pythonhosted.org/packages/83/69/8bbc8b07ec854d92a8b75668c24d2abcb1719ebf890f5604c61c9369a16f/rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8", size = 353747, upload-time = "2025-11-30T20:23:54.036Z" }, + { url = "https://files.pythonhosted.org/packages/ab/00/ba2e50183dbd9abcce9497fa5149c62b4ff3e22d338a30d690f9af970561/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7", size = 383795, upload-time = "2025-11-30T20:23:55.556Z" }, + { url = "https://files.pythonhosted.org/packages/05/6f/86f0272b84926bcb0e4c972262f54223e8ecc556b3224d281e6598fc9268/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898", size = 393330, upload-time = "2025-11-30T20:23:57.033Z" }, + { url = "https://files.pythonhosted.org/packages/cb/e9/0e02bb2e6dc63d212641da45df2b0bf29699d01715913e0d0f017ee29438/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e", size = 518194, upload-time = "2025-11-30T20:23:58.637Z" }, + { url = "https://files.pythonhosted.org/packages/ee/ca/be7bca14cf21513bdf9c0606aba17d1f389ea2b6987035eb4f62bd923f25/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419", size = 408340, upload-time = "2025-11-30T20:24:00.2Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c7/736e00ebf39ed81d75544c0da6ef7b0998f8201b369acf842f9a90dc8fce/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551", size = 383765, upload-time = "2025-11-30T20:24:01.759Z" }, + { url = "https://files.pythonhosted.org/packages/4a/3f/da50dfde9956aaf365c4adc9533b100008ed31aea635f2b8d7b627e25b49/rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8", size = 396834, upload-time = "2025-11-30T20:24:03.687Z" }, + { url = "https://files.pythonhosted.org/packages/4e/00/34bcc2565b6020eab2623349efbdec810676ad571995911f1abdae62a3a0/rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5", size = 415470, upload-time = "2025-11-30T20:24:05.232Z" }, + { url = "https://files.pythonhosted.org/packages/8c/28/882e72b5b3e6f718d5453bd4d0d9cf8df36fddeb4ddbbab17869d5868616/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404", size = 565630, upload-time = "2025-11-30T20:24:06.878Z" }, + { url = "https://files.pythonhosted.org/packages/3b/97/04a65539c17692de5b85c6e293520fd01317fd878ea1995f0367d4532fb1/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856", size = 591148, upload-time = "2025-11-30T20:24:08.445Z" }, + { url = "https://files.pythonhosted.org/packages/85/70/92482ccffb96f5441aab93e26c4d66489eb599efdcf96fad90c14bbfb976/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40", size = 556030, upload-time = "2025-11-30T20:24:10.956Z" }, + { url = "https://files.pythonhosted.org/packages/20/53/7c7e784abfa500a2b6b583b147ee4bb5a2b3747a9166bab52fec4b5b5e7d/rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0", size = 211570, upload-time = "2025-11-30T20:24:12.735Z" }, + { url = "https://files.pythonhosted.org/packages/d0/02/fa464cdfbe6b26e0600b62c528b72d8608f5cc49f96b8d6e38c95d60c676/rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3", size = 226532, upload-time = "2025-11-30T20:24:14.634Z" }, +] + +[[package]] +name = "ruff" +version = "0.14.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/06/f71e3a86b2df0dfa2d2f72195941cd09b44f87711cb7fa5193732cb9a5fc/ruff-0.14.14.tar.gz", hash = "sha256:2d0f819c9a90205f3a867dbbd0be083bee9912e170fd7d9704cc8ae45824896b", size = 4515732, upload-time = "2026-01-22T22:30:17.527Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/89/20a12e97bc6b9f9f68343952da08a8099c57237aef953a56b82711d55edd/ruff-0.14.14-py3-none-linux_armv6l.whl", hash = "sha256:7cfe36b56e8489dee8fbc777c61959f60ec0f1f11817e8f2415f429552846aed", size = 10467650, upload-time = "2026-01-22T22:30:08.578Z" }, + { url = "https://files.pythonhosted.org/packages/a3/b1/c5de3fd2d5a831fcae21beda5e3589c0ba67eec8202e992388e4b17a6040/ruff-0.14.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6006a0082336e7920b9573ef8a7f52eec837add1265cc74e04ea8a4368cd704c", size = 10883245, upload-time = "2026-01-22T22:30:04.155Z" }, + { url = "https://files.pythonhosted.org/packages/b8/7c/3c1db59a10e7490f8f6f8559d1db8636cbb13dccebf18686f4e3c9d7c772/ruff-0.14.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:026c1d25996818f0bf498636686199d9bd0d9d6341c9c2c3b62e2a0198b758de", size = 10231273, upload-time = "2026-01-22T22:30:34.642Z" }, + { url = "https://files.pythonhosted.org/packages/a1/6e/5e0e0d9674be0f8581d1f5e0f0a04761203affce3232c1a1189d0e3b4dad/ruff-0.14.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f666445819d31210b71e0a6d1c01e24447a20b85458eea25a25fe8142210ae0e", size = 10585753, upload-time = "2026-01-22T22:30:31.781Z" }, + { url = "https://files.pythonhosted.org/packages/23/09/754ab09f46ff1884d422dc26d59ba18b4e5d355be147721bb2518aa2a014/ruff-0.14.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c0f18b922c6d2ff9a5e6c3ee16259adc513ca775bcf82c67ebab7cbd9da5bc8", size = 10286052, upload-time = "2026-01-22T22:30:24.827Z" }, + { url = "https://files.pythonhosted.org/packages/c8/cc/e71f88dd2a12afb5f50733851729d6b571a7c3a35bfdb16c3035132675a0/ruff-0.14.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1629e67489c2dea43e8658c3dba659edbfd87361624b4040d1df04c9740ae906", size = 11043637, upload-time = "2026-01-22T22:30:13.239Z" }, + { url = "https://files.pythonhosted.org/packages/67/b2/397245026352494497dac935d7f00f1468c03a23a0c5db6ad8fc49ca3fb2/ruff-0.14.14-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:27493a2131ea0f899057d49d303e4292b2cae2bb57253c1ed1f256fbcd1da480", size = 12194761, upload-time = "2026-01-22T22:30:22.542Z" }, + { url = "https://files.pythonhosted.org/packages/5b/06/06ef271459f778323112c51b7587ce85230785cd64e91772034ddb88f200/ruff-0.14.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01ff589aab3f5b539e35db38425da31a57521efd1e4ad1ae08fc34dbe30bd7df", size = 12005701, upload-time = "2026-01-22T22:30:20.499Z" }, + { url = "https://files.pythonhosted.org/packages/41/d6/99364514541cf811ccc5ac44362f88df66373e9fec1b9d1c4cc830593fe7/ruff-0.14.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc12d74eef0f29f51775f5b755913eb523546b88e2d733e1d701fe65144e89b", size = 11282455, upload-time = "2026-01-22T22:29:59.679Z" }, + { url = "https://files.pythonhosted.org/packages/ca/71/37daa46f89475f8582b7762ecd2722492df26421714a33e72ccc9a84d7a5/ruff-0.14.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb8481604b7a9e75eff53772496201690ce2687067e038b3cc31aaf16aa0b974", size = 11215882, upload-time = "2026-01-22T22:29:57.032Z" }, + { url = "https://files.pythonhosted.org/packages/2c/10/a31f86169ec91c0705e618443ee74ede0bdd94da0a57b28e72db68b2dbac/ruff-0.14.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:14649acb1cf7b5d2d283ebd2f58d56b75836ed8c6f329664fa91cdea19e76e66", size = 11180549, upload-time = "2026-01-22T22:30:27.175Z" }, + { url = "https://files.pythonhosted.org/packages/fd/1e/c723f20536b5163adf79bdd10c5f093414293cdf567eed9bdb7b83940f3f/ruff-0.14.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e8058d2145566510790eab4e2fad186002e288dec5e0d343a92fe7b0bc1b3e13", size = 10543416, upload-time = "2026-01-22T22:30:01.964Z" }, + { url = "https://files.pythonhosted.org/packages/3e/34/8a84cea7e42c2d94ba5bde1d7a4fae164d6318f13f933d92da6d7c2041ff/ruff-0.14.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e651e977a79e4c758eb807f0481d673a67ffe53cfa92209781dfa3a996cf8412", size = 10285491, upload-time = "2026-01-22T22:30:29.51Z" }, + { url = "https://files.pythonhosted.org/packages/55/ef/b7c5ea0be82518906c978e365e56a77f8de7678c8bb6651ccfbdc178c29f/ruff-0.14.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:cc8b22da8d9d6fdd844a68ae937e2a0adf9b16514e9a97cc60355e2d4b219fc3", size = 10733525, upload-time = "2026-01-22T22:30:06.499Z" }, + { url = "https://files.pythonhosted.org/packages/6a/5b/aaf1dfbcc53a2811f6cc0a1759de24e4b03e02ba8762daabd9b6bd8c59e3/ruff-0.14.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:16bc890fb4cc9781bb05beb5ab4cd51be9e7cb376bf1dd3580512b24eb3fda2b", size = 11315626, upload-time = "2026-01-22T22:30:36.848Z" }, + { url = "https://files.pythonhosted.org/packages/2c/aa/9f89c719c467dfaf8ad799b9bae0df494513fb21d31a6059cb5870e57e74/ruff-0.14.14-py3-none-win32.whl", hash = "sha256:b530c191970b143375b6a68e6f743800b2b786bbcf03a7965b06c4bf04568167", size = 10502442, upload-time = "2026-01-22T22:30:38.93Z" }, + { url = "https://files.pythonhosted.org/packages/87/44/90fa543014c45560cae1fffc63ea059fb3575ee6e1cb654562197e5d16fb/ruff-0.14.14-py3-none-win_amd64.whl", hash = "sha256:3dde1435e6b6fe5b66506c1dff67a421d0b7f6488d466f651c07f4cab3bf20fd", size = 11630486, upload-time = "2026-01-22T22:30:10.852Z" }, + { url = "https://files.pythonhosted.org/packages/9e/6a/40fee331a52339926a92e17ae748827270b288a35ef4a15c9c8f2ec54715/ruff-0.14.14-py3-none-win_arm64.whl", hash = "sha256:56e6981a98b13a32236a72a8da421d7839221fa308b223b9283312312e5ac76c", size = 10920448, upload-time = "2026-01-22T22:30:15.417Z" }, +] + +[[package]] +name = "sqlparse" +version = "0.5.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/90/76/437d71068094df0726366574cf3432a4ed754217b436eb7429415cf2d480/sqlparse-0.5.5.tar.gz", hash = "sha256:e20d4a9b0b8585fdf63b10d30066c7c94c5d7a7ec47c889a2d83a3caa93ff28e", size = 120815, upload-time = "2025-12-19T07:17:45.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/4b/359f28a903c13438ef59ebeee215fb25da53066db67b305c125f1c6d2a25/sqlparse-0.5.5-py3-none-any.whl", hash = "sha256:12a08b3bf3eec877c519589833aed092e2444e68240a3577e8e26148acc7b1ba", size = 46138, upload-time = "2025-12-19T07:17:46.573Z" }, +] + +[[package]] +name = "ty" +version = "0.0.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/57/22c3d6bf95c2229120c49ffc2f0da8d9e8823755a1c3194da56e51f1cc31/ty-0.0.14.tar.gz", hash = "sha256:a691010565f59dd7f15cf324cdcd1d9065e010c77a04f887e1ea070ba34a7de2", size = 5036573, upload-time = "2026-01-27T00:57:31.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/cb/cc6d1d8de59beb17a41f9a614585f884ec2d95450306c173b3b7cc090d2e/ty-0.0.14-py3-none-linux_armv6l.whl", hash = "sha256:32cf2a7596e693094621d3ae568d7ee16707dce28c34d1762947874060fdddaa", size = 10034228, upload-time = "2026-01-27T00:57:53.133Z" }, + { url = "https://files.pythonhosted.org/packages/f3/96/dd42816a2075a8f31542296ae687483a8d047f86a6538dfba573223eaf9a/ty-0.0.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:f971bf9805f49ce8c0968ad53e29624d80b970b9eb597b7cbaba25d8a18ce9a2", size = 9939162, upload-time = "2026-01-27T00:57:43.857Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b4/73c4859004e0f0a9eead9ecb67021438b2e8e5fdd8d03e7f5aca77623992/ty-0.0.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:45448b9e4806423523268bc15e9208c4f3f2ead7c344f615549d2e2354d6e924", size = 9418661, upload-time = "2026-01-27T00:58:03.411Z" }, + { url = "https://files.pythonhosted.org/packages/58/35/839c4551b94613db4afa20ee555dd4f33bfa7352d5da74c5fa416ffa0fd2/ty-0.0.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee94a9b747ff40114085206bdb3205a631ef19a4d3fb89e302a88754cbbae54c", size = 9837872, upload-time = "2026-01-27T00:57:23.718Z" }, + { url = "https://files.pythonhosted.org/packages/41/2b/bbecf7e2faa20c04bebd35fc478668953ca50ee5847ce23e08acf20ea119/ty-0.0.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6756715a3c33182e9ab8ffca2bb314d3c99b9c410b171736e145773ee0ae41c3", size = 9848819, upload-time = "2026-01-27T00:57:58.501Z" }, + { url = "https://files.pythonhosted.org/packages/be/60/3c0ba0f19c0f647ad9d2b5b5ac68c0f0b4dc899001bd53b3a7537fb247a2/ty-0.0.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89d0038a2f698ba8b6fec5cf216a4e44e2f95e4a5095a8c0f57fe549f87087c2", size = 10324371, upload-time = "2026-01-27T00:57:29.291Z" }, + { url = "https://files.pythonhosted.org/packages/24/32/99d0a0b37d0397b0a989ffc2682493286aa3bc252b24004a6714368c2c3d/ty-0.0.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c64a83a2d669b77f50a4957039ca1450626fb474619f18f6f8a3eb885bf7544", size = 10865898, upload-time = "2026-01-27T00:57:33.542Z" }, + { url = "https://files.pythonhosted.org/packages/1a/88/30b583a9e0311bb474269cfa91db53350557ebec09002bfc3fb3fc364e8c/ty-0.0.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:242488bfb547ef080199f6fd81369ab9cb638a778bb161511d091ffd49c12129", size = 10555777, upload-time = "2026-01-27T00:58:05.853Z" }, + { url = "https://files.pythonhosted.org/packages/cd/a2/cb53fb6325dcf3d40f2b1d0457a25d55bfbae633c8e337bde8ec01a190eb/ty-0.0.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4790c3866f6c83a4f424fc7d09ebdb225c1f1131647ba8bdc6fcdc28f09ed0ff", size = 10412913, upload-time = "2026-01-27T00:57:38.834Z" }, + { url = "https://files.pythonhosted.org/packages/42/8f/f2f5202d725ed1e6a4e5ffaa32b190a1fe70c0b1a2503d38515da4130b4c/ty-0.0.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:950f320437f96d4ea9a2332bbfb5b68f1c1acd269ebfa4c09b6970cc1565bd9d", size = 9837608, upload-time = "2026-01-27T00:57:55.898Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ba/59a2a0521640c489dafa2c546ae1f8465f92956fede18660653cce73b4c5/ty-0.0.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:4a0ec3ee70d83887f86925bbc1c56f4628bd58a0f47f6f32ddfe04e1f05466df", size = 9884324, upload-time = "2026-01-27T00:57:46.786Z" }, + { url = "https://files.pythonhosted.org/packages/03/95/8d2a49880f47b638743212f011088552ecc454dd7a665ddcbdabea25772a/ty-0.0.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a1a4e6b6da0c58b34415955279eff754d6206b35af56a18bb70eb519d8d139ef", size = 10033537, upload-time = "2026-01-27T00:58:01.149Z" }, + { url = "https://files.pythonhosted.org/packages/e9/40/4523b36f2ce69f92ccf783855a9e0ebbbd0f0bb5cdce6211ee1737159ed3/ty-0.0.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:dc04384e874c5de4c5d743369c277c8aa73d1edea3c7fc646b2064b637db4db3", size = 10495910, upload-time = "2026-01-27T00:57:26.691Z" }, + { url = "https://files.pythonhosted.org/packages/08/d5/655beb51224d1bfd4f9ddc0bb209659bfe71ff141bcf05c418ab670698f0/ty-0.0.14-py3-none-win32.whl", hash = "sha256:b20e22cf54c66b3e37e87377635da412d9a552c9bf4ad9fc449fed8b2e19dad2", size = 9507626, upload-time = "2026-01-27T00:57:41.43Z" }, + { url = "https://files.pythonhosted.org/packages/b6/d9/c569c9961760e20e0a4bc008eeb1415754564304fd53997a371b7cf3f864/ty-0.0.14-py3-none-win_amd64.whl", hash = "sha256:e312ff9475522d1a33186657fe74d1ec98e4a13e016d66f5758a452c90ff6409", size = 10437980, upload-time = "2026-01-27T00:57:36.422Z" }, + { url = "https://files.pythonhosted.org/packages/ad/0c/186829654f5bfd9a028f6648e9caeb11271960a61de97484627d24443f91/ty-0.0.14-py3-none-win_arm64.whl", hash = "sha256:b6facdbe9b740cb2c15293a1d178e22ffc600653646452632541d01c36d5e378", size = 9885831, upload-time = "2026-01-27T00:57:49.747Z" }, +] + +[[package]] +name = "tzdata" +version = "2025.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772, upload-time = "2025-12-13T17:45:35.667Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" }, +] + +[[package]] +name = "uritemplate" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/60/f174043244c5306c9988380d2cb10009f91563fc4b31293d27e17201af56/uritemplate-4.2.0.tar.gz", hash = "sha256:480c2ed180878955863323eea31b0ede668795de182617fef9c6ca09e6ec9d0e", size = 33267, upload-time = "2025-06-02T15:12:06.318Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/99/3ae339466c9183ea5b8ae87b34c0b897eda475d2aec2307cae60e5cd4f29/uritemplate-4.2.0-py3-none-any.whl", hash = "sha256:962201ba1c4edcab02e60f9a0d3821e82dfc5d2d6662a21abd533879bdb8a686", size = 11488, upload-time = "2025-06-02T15:12:03.405Z" }, +] From a1170b49dfd52c5cfb9e73e1b603b804814a09b7 Mon Sep 17 00:00:00 2001 From: Paul Hallett Date: Tue, 3 Feb 2026 09:34:49 +0000 Subject: [PATCH 2/6] Use Ruff auto formatter Context: - This commit includes automatic formatting additions --- Makefile | 2 +- Resources/scripts/data/gen8/read_swsh.py | 3 +-- data/v2/build.py | 1 - pokemon_v2/serializers.py | 1 - 4 files changed, 2 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index fd55b7318..28c9e3a0f 100755 --- a/Makefile +++ b/Makefile @@ -80,7 +80,7 @@ docker-prod: docker-setup: docker-up docker-migrate docker-build-db # (Docker) Start services, prepare the latest DB schema, populate the DB format: # Format the source code - black . --extend-exclude '.+/scripts/.+' + uv run ruff check . --fix --extend-exclude '.+/scripts/.+' format-check: # Check the source code has been formatted black . --check --extend-exclude '.+/scripts/.+' diff --git a/Resources/scripts/data/gen8/read_swsh.py b/Resources/scripts/data/gen8/read_swsh.py index acb134ac1..6f5347f52 100644 --- a/Resources/scripts/data/gen8/read_swsh.py +++ b/Resources/scripts/data/gen8/read_swsh.py @@ -1,7 +1,6 @@ import copy import os import struct -import sys class TextLine(): offset = None @@ -142,7 +141,7 @@ def __GetLineString(this, data): # Cast 2 bytes to figure out what to do next value = struct.unpack_from(" Date: Tue, 3 Feb 2026 11:06:40 +0000 Subject: [PATCH 3/6] Implement Ruff formatting for entire codebase Context: - This is a big change, but it is functionality identical - Explicit imports for some files make the diff very large - I set line length to 120 which is standard in Python - Some files used tabs instead of spaces (!) - now fixed --- Makefile | 2 +- Resources/scripts/data/gen8/ability_names.py | 1 + Resources/scripts/data/gen8/move_names.py | 1 + Resources/scripts/data/gen8/read_swsh.py | 420 ++-- Resources/scripts/data/gen8/to_csv.py | 149 +- config/docker-compose.py | 3 +- config/docker.py | 2 +- config/local.py | 4 +- config/settings.py | 59 +- config/urls.py | 3 +- data/v2/__init__.py | 1 - data/v2/build.py | 851 +++----- pokemon_v2/__init__.py | 1 + pokemon_v2/api.py | 393 +++- pokemon_v2/apps.py | 5 + .../0001_squashed_0002_auto_20160301_1408.py | 2 +- .../migrations/0003_auto_20160530_1132.py | 2 +- .../migrations/0004_iso639length_20191217.py | 2 +- pokemon_v2/migrations/0009_pokemontypepast.py | 2 +- pokemon_v2/migrations/0010_pokemonformtype.py | 2 +- .../migrations/0011_typeefficacypast.py | 2 +- .../migrations/0013_pokemonabilitypast.py | 2 +- pokemon_v2/migrations/0015_pokemoncries.py | 2 +- pokemon_v2/migrations/0016_typesprites.py | 2 +- .../0020_add_regional_evolution_fields.py | 2 +- .../0021_add_evolution_methods_and_fields.py | 2 +- pokemon_v2/models.py | 76 +- pokemon_v2/serializers.py | 940 +++----- pokemon_v2/test_models.py | 3 +- pokemon_v2/tests.py | 1913 +++++------------ pokemon_v2/urls.py | 54 +- pyproject.toml | 15 + 32 files changed, 2045 insertions(+), 2873 deletions(-) create mode 100644 pokemon_v2/apps.py diff --git a/Makefile b/Makefile index 28c9e3a0f..b99a8acd1 100755 --- a/Makefile +++ b/Makefile @@ -83,7 +83,7 @@ format: # Format the source code uv run ruff check . --fix --extend-exclude '.+/scripts/.+' format-check: # Check the source code has been formatted - black . --check --extend-exclude '.+/scripts/.+' + uv run ruff check . --extend-exclude '.+/scripts/.+' pull: git checkout master diff --git a/Resources/scripts/data/gen8/ability_names.py b/Resources/scripts/data/gen8/ability_names.py index c15dc4693..251dc02b1 100644 --- a/Resources/scripts/data/gen8/ability_names.py +++ b/Resources/scripts/data/gen8/ability_names.py @@ -1,5 +1,6 @@ import csv import os + from read_swsh import TextFile # data_path contains the countents of the `message` folder found in sword/shield's romfs:/bin/ diff --git a/Resources/scripts/data/gen8/move_names.py b/Resources/scripts/data/gen8/move_names.py index e56fbe739..23761cf1f 100644 --- a/Resources/scripts/data/gen8/move_names.py +++ b/Resources/scripts/data/gen8/move_names.py @@ -1,5 +1,6 @@ import csv import os + from read_swsh import TextFile # data_path contains the countents of the `message` folder found in sword/shield's romfs:/bin/ diff --git a/Resources/scripts/data/gen8/read_swsh.py b/Resources/scripts/data/gen8/read_swsh.py index 6f5347f52..6d8670901 100644 --- a/Resources/scripts/data/gen8/read_swsh.py +++ b/Resources/scripts/data/gen8/read_swsh.py @@ -2,212 +2,214 @@ import os import struct -class TextLine(): - offset = None - length = None - -class TextFile(): - def __init__(this, path1, path2): - this.__dictEntries = {} - this.__magic = 0x42544841 - this.__KEY_BASE = 0x7C89 - this.__KEY_ADVANCE = 0x2983 - this.__KEY_VARIABLE = 0x0010 - this.__KEY_TERMINATOR = 0x0000 - - # Load dex labels - if (os.path.splitext(path1)[1] == ".tbl"): - this.__OpenTbl(path1) - elif (os.path.splitext(path2)[1] == ".tbl"): - this.__OpenTbl(path2) - else: - raise UserWarning("Error: a .tbl was not given") - - # Load dex entries - if (os.path.splitext(path1)[1] == ".dat"): - this.__OpenDat(path1) - elif (os.path.splitext(path2)[1] == ".dat"): - this.__OpenDat(path2) - else: - raise UserWarning("Error: a .dat was not given") - - # The table has 1 more entry than the dat to show when the table ends - if (len(this.__labels) == len(this.__lines) + 1): - for i in range(0, len(this.__lines)): - this.__dictEntries[this.__labels[i]] = this.__lines[i] - - @property - def __TextSections(this): - """(2 bytes) Gets the number of text sections""" - return struct.unpack_from("> 8) % 256) - # Bit-shift and OR key, then cast to 16-bits (otherwise things break) - key = (key << 3 | key >> 13) % 2**16 - - return result - - def __GetLineString(this, data): - """Turns the given list of bytes into a finished string""" - if (data is None): - return None - - string = "" - i = 0 - while (i < len(data)): - # Cast 2 bytes to figure out what to do next - value = struct.unpack_from("> 8) % 256) + # Bit-shift and OR key, then cast to 16-bits (otherwise things break) + key = (key << 3 | key >> 13) % 2**16 + + return result + + def __GetLineString(this, data): + """Turns the given list of bytes into a finished string""" + if data is None: + return None + + string = "" + i = 0 + while i < len(data): + # Cast 2 bytes to figure out what to do next + value = struct.unpack_from(" 1 and "[VAR]" not in flavor_text): - species = int(label[0][14:17]) - entriesList.append([species, version, language, flavor_text]) + # Loop through the text file's dictionary and append the parsed data into the list + for label, flavor_text in dictionary.items(): + if len(flavor_text) > 1 and "[VAR]" not in flavor_text: + species = int(label[0][14:17]) + entriesList.append([species, version, language, flavor_text]) - # Append a duplicate entry for Let's Go Eevee (both games use the same table) - if (dupe): - entriesList.append([species, 32, language, flavor_text]) + # Append a duplicate entry for Let's Go Eevee (both games use the same table) + if dupe: + entriesList.append([species, 32, language, flavor_text]) - except UserWarning as error: - print(error) - except Exception as error: - print(error) + except UserWarning as error: + print(error) + except Exception as error: + print(error) - with open(path + "\\pokemon_species_flavor_text.csv", "r", encoding = "utf-8", newline = "") as fPoke: - reader = csv.reader(fPoke, delimiter = ",") + with open(path + "\\pokemon_species_flavor_text.csv", "r", encoding="utf-8", newline="") as fPoke: + reader = csv.reader(fPoke, delimiter=",") - currentEntries = [] - # Get first line (info on what each column represents) - header = next(reader) - for row in reader: - # species_id, version_id, language_id, flavor_text - row = [int(row[0]), int(row[1]), int(row[2]), row[3]] - entriesList.append(row) + currentEntries = [] + # Get first line (info on what each column represents) + header = next(reader) + for row in reader: + # species_id, version_id, language_id, flavor_text + row = [int(row[0]), int(row[1]), int(row[2]), row[3]] + entriesList.append(row) - # Sort the list based on species id - writer.writerow(header) - entriesList.sort() - writer.writerows(entriesList) - print("Done") \ No newline at end of file + # Sort the list based on species id + writer.writerow(header) + entriesList.sort() + writer.writerows(entriesList) + print("Done") diff --git a/config/docker-compose.py b/config/docker-compose.py index 158a698ed..dd3442d55 100644 --- a/config/docker-compose.py +++ b/config/docker-compose.py @@ -1,6 +1,7 @@ # Docker settings import os -from .settings import * + +from .settings import * # noqa DATABASES = { "default": { diff --git a/config/docker.py b/config/docker.py index e8be3ed0f..71c03d1d3 100755 --- a/config/docker.py +++ b/config/docker.py @@ -1,5 +1,5 @@ # Docker settings -from .settings import * +from .settings import * # noqa DATABASES = { "default": { diff --git a/config/local.py b/config/local.py index d181da646..a5408803c 100755 --- a/config/local.py +++ b/config/local.py @@ -1,9 +1,9 @@ -from .settings import * +from .settings import * # noqa DATABASES = { "default": { "ENGINE": "django.db.backends.sqlite3", - "NAME": BASE_DIR / "db.sqlite3", + "NAME": BASE_DIR / "db.sqlite3", # noqa } } diff --git a/config/settings.py b/config/settings.py index 160d904b8..b0f5ec7ec 100755 --- a/config/settings.py +++ b/config/settings.py @@ -77,11 +77,7 @@ } } -SECRET_KEY = os.environ.get( - "SECRET_KEY", "django-insecure-a(!_5+l3$#l1f4n!x+&ns_+8$4q@df*3rh$n#2h@l$2gti7!7-" -) - -CUSTOM_APPS = ("pokemon_v2",) +SECRET_KEY = os.environ.get("SECRET_KEY", "django-insecure-a(!_5+l3$#l1f4n!x+&ns_+8$4q@df*3rh$n#2h@l$2gti7!7-") INSTALLED_APPS = ( "django.contrib.admin", @@ -93,7 +89,8 @@ "rest_framework", "cachalot", "drf_spectacular", -) + CUSTOM_APPS + "pokemon_v2.apps.Pokemon2Config", +) CORS_ORIGIN_ALLOW_ALL = True @@ -130,7 +127,8 @@ SPECTACULAR_SETTINGS = { "TITLE": "PokéAPI", - "DESCRIPTION": """All the Pokémon data you'll ever need in one place, easily accessible through a modern free open-source RESTful API. + "DESCRIPTION": """All the Pokémon data you'll ever need in one place, easily accessible through a modern \ +free open-source RESTful API. ## What is this? @@ -140,11 +138,14 @@ ## Where do I start? -We have awesome [documentation](https://pokeapi.co/docs/v2) on how to use this API. It takes minutes to get started. +We have awesome [documentation](https://pokeapi.co/docs/v2) on how to use this API. It takes minutes to get \ +started. This API will always be publicly available and will never require any extensive setup process to consume. -Created by [**Paul Hallett**](https://github.com/phalt) and other [**PokéAPI contributors**](https://github.com/PokeAPI/pokeapi#contributing) around the world. Pokémon and Pokémon character names are trademarks of Nintendo. +Created by [**Paul Hallett**](https://github.com/phalt) and other [**PokéAPI contributors**](\ +https://github.com/PokeAPI/pokeapi#contributing) around the world. Pokémon and Pokémon character names are \ +trademarks of Nintendo. """, "SORT_OPERATIONS": False, "SERVERS": [{"url": "https://pokeapi.co"}], @@ -156,7 +157,13 @@ "TAGS": [ { "name": "pokemon", - "description": "Pokémon are the creatures that inhabit the world of the Pokémon games. They can be caught using Pokéballs and trained by battling with other Pokémon. Each Pokémon belongs to a specific species but may take on a variant which makes it differ from other Pokémon of the same species, such as base stats, available abilities and typings. See [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Pok%C3%A9mon_(species)) for greater detail.", + "description": ( + "Pokémon are the creatures that inhabit the world of the Pokémon games. They can be caught using " + "Pokéballs and trained by battling with other Pokémon. Each Pokémon belongs to a specific species " + "but may take on a variant which makes it differ from other Pokémon of the same species, such as base " + "stats, available abilities and typings. See [Bulbapedia](" + "http://bulbapedia.bulbagarden.net/wiki/Pok%C3%A9mon_(species)) for greater detail." + ), "externalDocs": { "description": "Find more info here", "url": "https://bulbapedia.bulbagarden.net/wiki/Pok%C3%A9mon", @@ -172,7 +179,10 @@ }, { "name": "berries", - "description": "Berries can be soft or hard. Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Category:Berries_by_firmness) for greater detail.", + "description": ( + "Berries can be soft or hard. Check out [Bulbapedia](" + "http://bulbapedia.bulbagarden.net/wiki/Category:Berries_by_firmness) for greater detail." + ), "externalDocs": { "description": "Find more info here", "url": "https://bulbapedia.bulbagarden.net/wiki/Berry", @@ -180,7 +190,11 @@ }, { "name": "items", - "description": "An item is an object in the games which the player can pick up, keep in their bag, and use in some manner. They have various uses, including healing, powering up, helping catch Pokémon, or to access a new area.", + "description": ( + "An item is an object in the games which the player can pick up, keep in their bag, and use in some " + "manner. They have various uses, including healing, powering up, helping catch Pokémon, or to access " + "a new area." + ), "externalDocs": { "description": "Find more info here", "url": "https://bulbapedia.bulbagarden.net/wiki/Item", @@ -188,7 +202,10 @@ }, { "name": "machines", - "description": "Machines are the representation of items that teach moves to Pokémon. They vary from version to version, so it is not certain that one specific TM or HM corresponds to a single Machine.", + "description": ( + "Machines are the representation of items that teach moves to Pokémon. They vary from version to " + "version, so it is not certain that one specific TM or HM corresponds to a single Machine." + ), "externalDocs": { "description": "Find more info here", "url": "https://bulbapedia.bulbagarden.net/wiki/TM", @@ -196,7 +213,10 @@ }, { "name": "location", - "description": "Locations that can be visited within the games. Locations make up sizable portions of regions, like cities or routes.", + "description": ( + "Locations that can be visited within the games. Locations make up sizable portions of regions, " + "like cities or routes." + ), "externalDocs": { "description": "Find more info here", "url": "https://bulbapedia.bulbagarden.net/wiki/List_of_locations_by_index_number", @@ -204,7 +224,10 @@ }, { "name": "contest", - "description": "Pokémon Contests are a type of competition often contrasted with Pokémon battles and held in Contest Halls", + "description": ( + "Pokémon Contests are a type of competition often contrasted with Pokémon battles and held in " + "Contest Halls" + ), "externalDocs": { "description": "Find more info here", "url": "https://bulbapedia.bulbagarden.net/wiki/Pok%C3%A9mon_Contest", @@ -212,7 +235,11 @@ }, { "name": "moves", - "description": "Moves are the skills of Pokémon in battle. In battle, a Pokémon uses one move each turn. Some moves (including those learned by Hidden Machine) can be used outside of battle as well, usually for the purpose of removing obstacles or exploring new areas.", + "description": ( + "Moves are the skills of Pokémon in battle. In battle, a Pokémon uses one move each turn. Some moves " + "(including those learned by Hidden Machine) can be used outside of battle as well, usually for the " + "purpose of removing obstacles or exploring new areas." + ), "externalDocs": { "description": "Find more info here", "url": "https://bulbapedia.bulbagarden.net/wiki/List_of_locations_by_name", diff --git a/config/urls.py b/config/urls.py index 51fc6fc9f..70d969a27 100755 --- a/config/urls.py +++ b/config/urls.py @@ -1,7 +1,6 @@ from django.urls import include, path -from pokemon_v2 import urls as pokemon_v2_urls -# pylint: disable=invalid-name +from pokemon_v2 import urls as pokemon_v2_urls urlpatterns = [ path("", include(pokemon_v2_urls)), diff --git a/data/v2/__init__.py b/data/v2/__init__.py index 39496a2f6..e69de29bb 100644 --- a/data/v2/__init__.py +++ b/data/v2/__init__.py @@ -1 +0,0 @@ -from .build import * diff --git a/data/v2/build.py b/data/v2/build.py index 29270f32f..0b675f23a 100644 --- a/data/v2/build.py +++ b/data/v2/build.py @@ -15,8 +15,166 @@ import os import os.path import re + from django.db import connection -from pokemon_v2.models import * + +from pokemon_v2.models import ( + Ability, + AbilityChange, + AbilityChangeEffectText, + AbilityEffectText, + AbilityFlavorText, + AbilityName, + Berry, + BerryFirmness, + BerryFirmnessName, + BerryFlavor, + BerryFlavorMap, + BerryFlavorName, + Characteristic, + CharacteristicDescription, + ContestCombo, + ContestEffect, + ContestEffectEffectText, + ContestEffectFlavorText, + ContestType, + ContestTypeName, + EggGroup, + EggGroupName, + Encounter, + EncounterCondition, + EncounterConditionName, + EncounterConditionValue, + EncounterConditionValueMap, + EncounterConditionValueName, + EncounterMethod, + EncounterMethodName, + EncounterSlot, + EvolutionChain, + EvolutionTrigger, + EvolutionTriggerName, + Experience, + Gender, + Generation, + GenerationName, + GrowthRate, + GrowthRateDescription, + Item, + ItemAttribute, + ItemAttributeDescription, + ItemAttributeMap, + ItemAttributeName, + ItemCategory, + ItemCategoryName, + ItemEffectText, + ItemFlavorText, + ItemFlingEffect, + ItemFlingEffectEffectText, + ItemGameIndex, + ItemName, + ItemPocket, + ItemPocketName, + ItemSprites, + Language, + LanguageName, + Location, + LocationArea, + LocationAreaEncounterRate, + LocationAreaName, + LocationGameIndex, + LocationName, + Machine, + Move, + MoveAttribute, + MoveAttributeDescription, + MoveAttributeMap, + MoveAttributeName, + MoveBattleStyle, + MoveBattleStyleName, + MoveChange, + MoveDamageClass, + MoveDamageClassDescription, + MoveDamageClassName, + MoveEffect, + MoveEffectChange, + MoveEffectChangeEffectText, + MoveEffectEffectText, + MoveFlavorText, + MoveLearnMethod, + MoveLearnMethodDescription, + MoveLearnMethodName, + MoveMeta, + MoveMetaAilment, + MoveMetaAilmentName, + MoveMetaCategory, + MoveMetaCategoryDescription, + MoveMetaStatChange, + MoveName, + MoveTarget, + MoveTargetDescription, + MoveTargetName, + Nature, + NatureBattleStylePreference, + NatureName, + NaturePokeathlonStat, + PalPark, + PalParkArea, + PalParkAreaName, + PokeathlonStat, + PokeathlonStatName, + Pokedex, + PokedexDescription, + PokedexName, + PokedexVersionGroup, + Pokemon, + PokemonAbility, + PokemonAbilityPast, + PokemonColor, + PokemonColorName, + PokemonCries, + PokemonDexNumber, + PokemonEggGroup, + PokemonEvolution, + PokemonForm, + PokemonFormGeneration, + PokemonFormName, + PokemonFormSprites, + PokemonFormType, + PokemonGameIndex, + PokemonHabitat, + PokemonHabitatName, + PokemonItem, + PokemonMove, + PokemonShape, + PokemonShapeName, + PokemonSpecies, + PokemonSpeciesDescription, + PokemonSpeciesFlavorText, + PokemonSpeciesName, + PokemonSprites, + PokemonStat, + PokemonStatPast, + PokemonType, + PokemonTypePast, + Region, + RegionName, + Stat, + StatName, + SuperContestCombo, + SuperContestEffect, + SuperContestEffectFlavorText, + Type, + TypeEfficacy, + TypeEfficacyPast, + TypeGameIndex, + TypeName, + TypeSprites, + Version, + VersionGroup, + VersionGroupMoveLearnMethod, + VersionGroupRegion, + VersionName, +) # why this way? how about use `__file__` DATA_LOCATION = "data/v2/csv/" @@ -60,14 +218,8 @@ def file_path_or_none(file_name, image_file=True): if not image_file: - return ( - SOUND_DIR.format(file_name=file_name) - if file_name in RESOURCE_CRIES - else None - ) - return ( - MEDIA_DIR.format(file_name=file_name) if file_name in RESOURCE_IMAGES else None - ) + return SOUND_DIR.format(file_name=file_name) if file_name in RESOURCE_CRIES else None + return MEDIA_DIR.format(file_name=file_name) if file_name in RESOURCE_IMAGES else None def with_iter(context, iterable=None): @@ -80,9 +232,7 @@ def with_iter(context, iterable=None): def load_data(file_name): # with_iter closes the file when it has finished - return csv.reader( - with_iter(open(DATA_LOCATION + file_name, "rt", encoding="utf8")), delimiter="," - ) + return csv.reader(with_iter(open(DATA_LOCATION + file_name, "rt", encoding="utf8")), delimiter=",") def clear_table(model): @@ -91,17 +241,9 @@ def clear_table(model): print("building " + table_name) # Reset DB auto increments to start at 1 if DB_VENDOR == "sqlite": - DB_CURSOR.execute( - "DELETE FROM sqlite_sequence WHERE name = " + "'" + table_name + "'" - ) + DB_CURSOR.execute("DELETE FROM sqlite_sequence WHERE name = " + "'" + table_name + "'") else: - DB_CURSOR.execute( - "SELECT setval(pg_get_serial_sequence(" - + "'" - + table_name - + "'" - + ",'id'), 1, false);" - ) + DB_CURSOR.execute("SELECT setval(pg_get_serial_sequence(" + "'" + table_name + "'" + ",'id'), 1, false);") def build_generic(model_classes, file_name, csv_record_to_objects): @@ -172,9 +314,7 @@ def csv_record_to_objects(info): build_generic((Language,), "languages.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield LanguageName( - language_id=int(info[0]), local_language_id=int(info[1]), name=info[2] - ) + yield LanguageName(language_id=int(info[0]), local_language_id=int(info[1]), name=info[2]) build_generic((LanguageName,), "language_names.csv", csv_record_to_objects) @@ -208,9 +348,7 @@ def csv_record_to_objects(info): build_generic((Generation,), "generations.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield GenerationName( - generation_id=int(info[0]), language_id=int(info[1]), name=info[2] - ) + yield GenerationName(generation_id=int(info[0]), language_id=int(info[1]), name=info[2]) build_generic((GenerationName,), "generation_names.csv", csv_record_to_objects) @@ -234,9 +372,7 @@ def csv_record_to_objects(info): def csv_record_to_objects(info): yield VersionGroupRegion(version_group_id=int(info[0]), region_id=int(info[1])) - build_generic( - (VersionGroupRegion,), "version_group_regions.csv", csv_record_to_objects - ) + build_generic((VersionGroupRegion,), "version_group_regions.csv", csv_record_to_objects) def csv_record_to_objects(info): yield Version(id=int(info[0]), version_group_id=int(info[1]), name=info[2]) @@ -244,9 +380,7 @@ def csv_record_to_objects(info): build_generic((Version,), "versions.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield VersionName( - version_id=int(info[0]), language_id=int(info[1]), name=info[2] - ) + yield VersionName(version_id=int(info[0]), language_id=int(info[1]), name=info[2]) build_generic((VersionName,), "version_names.csv", csv_record_to_objects) @@ -263,9 +397,7 @@ def csv_record_to_objects(info): build_generic((MoveDamageClass,), "move_damage_classes.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield MoveDamageClassName( - move_damage_class_id=int(info[0]), language_id=int(info[1]), name=info[2] - ) + yield MoveDamageClassName(move_damage_class_id=int(info[0]), language_id=int(info[1]), name=info[2]) yield MoveDamageClassDescription( move_damage_class_id=int(info[0]), language_id=int(info[1]), @@ -307,13 +439,9 @@ def csv_record_to_objects(info): build_generic((PokeathlonStat,), "pokeathlon_stats.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield PokeathlonStatName( - pokeathlon_stat_id=int(info[0]), language_id=int(info[1]), name=info[2] - ) + yield PokeathlonStatName(pokeathlon_stat_id=int(info[0]), language_id=int(info[1]), name=info[2]) - build_generic( - (PokeathlonStatName,), "pokeathlon_stat_names.csv", csv_record_to_objects - ) + build_generic((PokeathlonStatName,), "pokeathlon_stat_names.csv", csv_record_to_objects) # ############### @@ -333,16 +461,12 @@ def csv_record_to_objects(info): build_generic((Ability,), "abilities.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield AbilityName( - ability_id=int(info[0]), language_id=int(info[1]), name=info[2] - ) + yield AbilityName(ability_id=int(info[0]), language_id=int(info[1]), name=info[2]) build_generic((AbilityName,), "ability_names.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield AbilityChange( - id=int(info[0]), ability_id=int(info[1]), version_group_id=int(info[2]) - ) + yield AbilityChange(id=int(info[0]), ability_id=int(info[1]), version_group_id=int(info[2])) build_generic((AbilityChange,), "ability_changelog.csv", csv_record_to_objects) @@ -363,9 +487,7 @@ def csv_record_to_objects(info): effect=scrub_str(info[2]), ) - build_generic( - (AbilityChangeEffectText,), "ability_changelog_prose.csv", csv_record_to_objects - ) + build_generic((AbilityChangeEffectText,), "ability_changelog_prose.csv", csv_record_to_objects) def csv_record_to_objects(info): yield AbilityFlavorText( @@ -375,9 +497,7 @@ def csv_record_to_objects(info): flavor_text=info[3], ) - build_generic( - (AbilityFlavorText,), "ability_flavor_text.csv", csv_record_to_objects - ) + build_generic((AbilityFlavorText,), "ability_flavor_text.csv", csv_record_to_objects) #################### @@ -387,9 +507,7 @@ def csv_record_to_objects(info): def _build_characteristics(): def csv_record_to_objects(info): - yield Characteristic( - id=int(info[0]), stat_id=int(info[1]), gene_mod_5=int(info[2]) - ) + yield Characteristic(id=int(info[0]), stat_id=int(info[1]), gene_mod_5=int(info[2])) build_generic((Characteristic,), "characteristics.csv", csv_record_to_objects) @@ -400,9 +518,7 @@ def csv_record_to_objects(info): description=info[2], ) - build_generic( - (CharacteristicDescription,), "characteristic_text.csv", csv_record_to_objects - ) + build_generic((CharacteristicDescription,), "characteristic_text.csv", csv_record_to_objects) ############### @@ -417,9 +533,7 @@ def csv_record_to_objects(info): build_generic((EggGroup,), "egg_groups.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield EggGroupName( - egg_group_id=int(info[0]), language_id=int(info[1]), name=info[2] - ) + yield EggGroupName(egg_group_id=int(info[0]), language_id=int(info[1]), name=info[2]) build_generic((EggGroupName,), "egg_group_prose.csv", csv_record_to_objects) @@ -436,13 +550,9 @@ def csv_record_to_objects(info): build_generic((GrowthRate,), "growth_rates.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield GrowthRateDescription( - growth_rate_id=int(info[0]), language_id=int(info[1]), description=info[2] - ) + yield GrowthRateDescription(growth_rate_id=int(info[0]), language_id=int(info[1]), description=info[2]) - build_generic( - (GrowthRateDescription,), "growth_rate_prose.csv", csv_record_to_objects - ) + build_generic((GrowthRateDescription,), "growth_rate_prose.csv", csv_record_to_objects) # ########### @@ -457,9 +567,7 @@ def csv_record_to_objects(info): build_generic((ItemPocket,), "item_pockets.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield ItemPocketName( - item_pocket_id=int(info[0]), language_id=int(info[1]), name=info[2] - ) + yield ItemPocketName(item_pocket_id=int(info[0]), language_id=int(info[1]), name=info[2]) build_generic((ItemPocketName,), "item_pocket_names.csv", csv_record_to_objects) @@ -487,9 +595,7 @@ def csv_record_to_objects(info): build_generic((ItemCategory,), "item_categories.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield ItemCategoryName( - item_category_id=int(info[0]), language_id=int(info[1]), name=info[2] - ) + yield ItemCategoryName(item_category_id=int(info[0]), language_id=int(info[1]), name=info[2]) build_generic((ItemCategoryName,), "item_category_prose.csv", csv_record_to_objects) @@ -537,9 +643,7 @@ def csv_record_to_objects(info): build_generic((ItemEffectText,), "item_prose.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield ItemGameIndex( - item_id=int(info[0]), generation_id=int(info[1]), game_index=int(info[2]) - ) + yield ItemGameIndex(item_id=int(info[0]), generation_id=int(info[1]), game_index=int(info[2])) build_generic((ItemGameIndex,), "item_game_indices.csv", csv_record_to_objects) @@ -559,9 +663,7 @@ def csv_record_to_objects(info): build_generic((ItemAttribute,), "item_flags.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield ItemAttributeName( - item_attribute_id=int(info[0]), language_id=int(info[1]), name=info[2] - ) + yield ItemAttributeName(item_attribute_id=int(info[0]), language_id=int(info[1]), name=info[2]) yield ItemAttributeDescription( item_attribute_id=int(info[0]), language_id=int(info[1]), @@ -602,9 +704,7 @@ def csv_record_to_objects(info): build_generic((TypeName,), "type_names.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield TypeGameIndex( - type_id=int(info[0]), generation_id=int(info[1]), game_index=int(info[2]) - ) + yield TypeGameIndex(type_id=int(info[0]), generation_id=int(info[1]), game_index=int(info[2])) build_generic((TypeGameIndex,), "type_game_indices.csv", csv_record_to_objects) @@ -656,11 +756,7 @@ def csv_record_to_objects(info): for game in game_map[generation]: if generation not in sprites: sprites[generation] = {} - sprites[generation][game] = { - "name_icon": file_path_or_none( - f"types/{generation}/{game}/{info[0]}.png" - ) - } + sprites[generation][game] = {"name_icon": file_path_or_none(f"types/{generation}/{game}/{info[0]}.png")} yield TypeSprites(type_id=int(info[0]), sprites=sprites) @@ -695,9 +791,7 @@ def csv_record_to_objects(info): build_generic((ContestEffect,), "contest_effects.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield ContestEffectEffectText( - contest_effect_id=int(info[0]), language_id=int(info[1]), effect=info[3] - ) + yield ContestEffectEffectText(contest_effect_id=int(info[0]), language_id=int(info[1]), effect=info[3]) yield ContestEffectFlavorText( contest_effect_id=int(info[0]), language_id=int(info[1]), @@ -713,9 +807,7 @@ def csv_record_to_objects(info): def csv_record_to_objects(info): yield SuperContestEffect(id=int(info[0]), appeal=int(info[1])) - build_generic( - (SuperContestEffect,), "super_contest_effects.csv", csv_record_to_objects - ) + build_generic((SuperContestEffect,), "super_contest_effects.csv", csv_record_to_objects) def csv_record_to_objects(info): yield SuperContestEffectFlavorText( @@ -750,18 +842,12 @@ def csv_record_to_objects(info): effect=scrub_str(info[3]), ) - build_generic( - (MoveEffectEffectText,), "move_effect_prose.csv", csv_record_to_objects - ) + build_generic((MoveEffectEffectText,), "move_effect_prose.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield MoveEffectChange( - id=int(info[0]), move_effect_id=int(info[1]), version_group_id=int(info[2]) - ) + yield MoveEffectChange(id=int(info[0]), move_effect_id=int(info[1]), version_group_id=int(info[2])) - build_generic( - (MoveEffectChange,), "move_effect_changelog.csv", csv_record_to_objects - ) + build_generic((MoveEffectChange,), "move_effect_changelog.csv", csv_record_to_objects) def csv_record_to_objects(info): yield MoveEffectChangeEffectText( @@ -782,9 +868,7 @@ def csv_record_to_objects(info): build_generic((MoveLearnMethod,), "pokemon_move_methods.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield VersionGroupMoveLearnMethod( - version_group_id=int(info[0]), move_learn_method_id=int(info[1]) - ) + yield VersionGroupMoveLearnMethod(version_group_id=int(info[0]), move_learn_method_id=int(info[1])) build_generic( (VersionGroupMoveLearnMethod,), @@ -793,9 +877,7 @@ def csv_record_to_objects(info): ) def csv_record_to_objects(info): - yield MoveLearnMethodName( - move_learn_method_id=int(info[0]), language_id=int(info[1]), name=info[2] - ) + yield MoveLearnMethodName(move_learn_method_id=int(info[0]), language_id=int(info[1]), name=info[2]) yield MoveLearnMethodDescription( move_learn_method_id=int(info[0]), language_id=int(info[1]), @@ -814,12 +896,8 @@ def csv_record_to_objects(info): build_generic((MoveTarget,), "move_targets.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield MoveTargetName( - move_target_id=int(info[0]), language_id=int(info[1]), name=info[2] - ) - yield MoveTargetDescription( - move_target_id=int(info[0]), language_id=int(info[1]), description=info[3] - ) + yield MoveTargetName(move_target_id=int(info[0]), language_id=int(info[1]), name=info[2]) + yield MoveTargetDescription(move_target_id=int(info[0]), language_id=int(info[1]), description=info[3]) build_generic( (MoveTargetName, MoveTargetDescription), @@ -866,10 +944,8 @@ def csv_record_to_objects(info): def csv_record_to_objects(info): _move_effect = None try: - _move_effect = ( - MoveEffect.objects.get(pk=int(info[6])) if info[6] != "" else None - ) - except: + _move_effect = MoveEffect.objects.get(pk=int(info[6])) if info[6] != "" else None + except Exception: pass yield MoveChange( @@ -891,13 +967,9 @@ def csv_record_to_objects(info): build_generic((MoveBattleStyle,), "move_battle_styles.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield MoveBattleStyleName( - move_battle_style_id=int(info[0]), language_id=int(info[1]), name=info[2] - ) + yield MoveBattleStyleName(move_battle_style_id=int(info[0]), language_id=int(info[1]), name=info[2]) - build_generic( - (MoveBattleStyleName,), "move_battle_style_prose.csv", csv_record_to_objects - ) + build_generic((MoveBattleStyleName,), "move_battle_style_prose.csv", csv_record_to_objects) def csv_record_to_objects(info): yield MoveAttribute(id=int(info[0]), name=info[1]) @@ -910,9 +982,7 @@ def csv_record_to_objects(info): build_generic((MoveAttributeMap,), "move_flag_map.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield MoveAttributeName( - move_attribute_id=int(info[0]), language_id=int(info[1]), name=info[2] - ) + yield MoveAttributeName(move_attribute_id=int(info[0]), language_id=int(info[1]), name=info[2]) yield MoveAttributeDescription( move_attribute_id=int(info[0]), language_id=int(info[1]), @@ -931,20 +1001,14 @@ def csv_record_to_objects(info): build_generic((MoveMetaAilment,), "move_meta_ailments.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield MoveMetaAilmentName( - move_meta_ailment_id=int(info[0]), language_id=int(info[1]), name=info[2] - ) + yield MoveMetaAilmentName(move_meta_ailment_id=int(info[0]), language_id=int(info[1]), name=info[2]) - build_generic( - (MoveMetaAilmentName,), "move_meta_ailment_names.csv", csv_record_to_objects - ) + build_generic((MoveMetaAilmentName,), "move_meta_ailment_names.csv", csv_record_to_objects) def csv_record_to_objects(info): yield MoveMetaCategory(id=int(info[0]), name=info[1]) - build_generic( - (MoveMetaCategory,), "move_meta_categories.csv", csv_record_to_objects - ) + build_generic((MoveMetaCategory,), "move_meta_categories.csv", csv_record_to_objects) def csv_record_to_objects(info): yield MoveMetaCategoryDescription( @@ -979,13 +1043,9 @@ def csv_record_to_objects(info): build_generic((MoveMeta,), "move_meta.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield MoveMetaStatChange( - move_id=int(info[0]), stat_id=int(info[1]), change=int(info[2]) - ) + yield MoveMetaStatChange(move_id=int(info[0]), stat_id=int(info[1]), change=int(info[2])) - build_generic( - (MoveMetaStatChange,), "move_meta_stat_changes.csv", csv_record_to_objects - ) + build_generic((MoveMetaStatChange,), "move_meta_stat_changes.csv", csv_record_to_objects) def csv_record_to_objects(info): yield ContestCombo(first_move_id=int(info[0]), second_move_id=int(info[1])) @@ -995,9 +1055,7 @@ def csv_record_to_objects(info): def csv_record_to_objects(info): yield SuperContestCombo(first_move_id=int(info[0]), second_move_id=int(info[1])) - build_generic( - (SuperContestCombo,), "super_contest_combos.csv", csv_record_to_objects - ) + build_generic((SuperContestCombo,), "super_contest_combos.csv", csv_record_to_objects) ############# @@ -1012,13 +1070,9 @@ def csv_record_to_objects(info): build_generic((BerryFirmness,), "berry_firmness.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield BerryFirmnessName( - berry_firmness_id=int(info[0]), language_id=int(info[1]), name=info[2] - ) + yield BerryFirmnessName(berry_firmness_id=int(info[0]), language_id=int(info[1]), name=info[2]) - build_generic( - (BerryFirmnessName,), "berry_firmness_names.csv", csv_record_to_objects - ) + build_generic((BerryFirmnessName,), "berry_firmness_names.csv", csv_record_to_objects) def csv_record_to_objects(info): item = Item.objects.get(pk=int(info[1])) @@ -1040,9 +1094,7 @@ def csv_record_to_objects(info): def csv_record_to_objects(info): # Get the english name for this contest type - contest_type_name = ContestTypeName.objects.get( - contest_type_id=int(info[0]), language_id=9 - ) + contest_type_name = ContestTypeName.objects.get(contest_type_id=int(info[0]), language_id=9) yield BerryFlavor( id=int(info[0]), name=contest_type_name.flavor.lower(), @@ -1053,17 +1105,13 @@ def csv_record_to_objects(info): build_generic((BerryFlavor,), "contest_types.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield BerryFlavorName( - berry_flavor_id=int(info[0]), language_id=int(info[1]), name=info[3] - ) + yield BerryFlavorName(berry_flavor_id=int(info[0]), language_id=int(info[1]), name=info[3]) # This is not an error build_generic((BerryFlavorName,), "contest_type_names.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield BerryFlavorMap( - berry_id=int(info[0]), berry_flavor_id=int(info[1]), potency=int(info[2]) - ) + yield BerryFlavorMap(berry_id=int(info[0]), berry_flavor_id=int(info[1]), potency=int(info[2])) # This is not an error build_generic((BerryFlavorMap,), "berry_flavors.csv", csv_record_to_objects) @@ -1107,13 +1155,9 @@ def csv_record_to_objects(info): build_generic((NatureName,), "nature_names.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield NaturePokeathlonStat( - nature_id=(info[0]), pokeathlon_stat_id=(info[1]), max_change=info[2] - ) + yield NaturePokeathlonStat(nature_id=(info[0]), pokeathlon_stat_id=(info[1]), max_change=info[2]) - build_generic( - (NaturePokeathlonStat,), "nature_pokeathlon_stats.csv", csv_record_to_objects - ) + build_generic((NaturePokeathlonStat,), "nature_pokeathlon_stats.csv", csv_record_to_objects) def csv_record_to_objects(info): yield NatureBattleStylePreference( @@ -1149,9 +1193,7 @@ def csv_record_to_objects(info): def _build_experiences(): def csv_record_to_objects(info): - yield Experience( - growth_rate_id=int(info[0]), level=int(info[1]), experience=int(info[2]) - ) + yield Experience(growth_rate_id=int(info[0]), level=int(info[1]), experience=int(info[2])) build_generic((Experience,), "experience.csv", csv_record_to_objects) @@ -1193,13 +1235,9 @@ def csv_record_to_objects(info): build_generic((EvolutionTrigger,), "evolution_triggers.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield EvolutionTriggerName( - evolution_trigger_id=int(info[0]), language_id=int(info[1]), name=info[2] - ) + yield EvolutionTriggerName(evolution_trigger_id=int(info[0]), language_id=int(info[1]), name=info[2]) - build_generic( - (EvolutionTriggerName,), "evolution_trigger_prose.csv", csv_record_to_objects - ) + build_generic((EvolutionTriggerName,), "evolution_trigger_prose.csv", csv_record_to_objects) ############# @@ -1219,25 +1257,15 @@ def csv_record_to_objects(info): build_generic((Pokedex,), "pokedexes.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield PokedexName( - pokedex_id=int(info[0]), language_id=int(info[1]), name=info[2] - ) - yield PokedexDescription( - pokedex_id=int(info[0]), language_id=int(info[1]), description=info[3] - ) + yield PokedexName(pokedex_id=int(info[0]), language_id=int(info[1]), name=info[2]) + yield PokedexDescription(pokedex_id=int(info[0]), language_id=int(info[1]), description=info[3]) - build_generic( - (PokedexName, PokedexDescription), "pokedex_prose.csv", csv_record_to_objects - ) + build_generic((PokedexName, PokedexDescription), "pokedex_prose.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield PokedexVersionGroup( - pokedex_id=int(info[0]), version_group_id=int(info[1]) - ) + yield PokedexVersionGroup(pokedex_id=int(info[0]), version_group_id=int(info[1])) - build_generic( - (PokedexVersionGroup,), "pokedex_version_groups.csv", csv_record_to_objects - ) + build_generic((PokedexVersionGroup,), "pokedex_version_groups.csv", csv_record_to_objects) ############## @@ -1256,9 +1284,7 @@ def csv_record_to_objects(info): build_generic((Location,), "locations.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield LocationName( - location_id=int(info[0]), language_id=int(info[1]), name=info[2] - ) + yield LocationName(location_id=int(info[0]), language_id=int(info[1]), name=info[2]) build_generic((LocationName,), "location_names.csv", csv_record_to_objects) @@ -1269,9 +1295,7 @@ def csv_record_to_objects(info): game_index=int(info[2]), ) - build_generic( - (LocationGameIndex,), "location_game_indices.csv", csv_record_to_objects - ) + build_generic((LocationGameIndex,), "location_game_indices.csv", csv_record_to_objects) def csv_record_to_objects(info): location = Location.objects.get(pk=int(info[1])) @@ -1279,19 +1303,13 @@ def csv_record_to_objects(info): id=int(info[0]), location_id=int(info[1]), game_index=int(info[2]), - name=( - "{}-{}".format(location.name, info[3]) - if info[3] - else "{}-{}".format(location.name, "area") - ), + name=("{}-{}".format(location.name, info[3]) if info[3] else "{}-{}".format(location.name, "area")), ) build_generic((LocationArea,), "location_areas.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield LocationAreaName( - location_area_id=int(info[0]), language_id=int(info[1]), name=info[2] - ) + yield LocationAreaName(location_area_id=int(info[0]), language_id=int(info[1]), name=info[2]) build_generic((LocationAreaName,), "location_area_prose.csv", csv_record_to_objects) @@ -1308,9 +1326,7 @@ def csv_record_to_objects(info): build_generic((PokemonColor,), "pokemon_colors.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield PokemonColorName( - pokemon_color_id=int(info[0]), language_id=int(info[1]), name=info[2] - ) + yield PokemonColorName(pokemon_color_id=int(info[0]), language_id=int(info[1]), name=info[2]) build_generic((PokemonColorName,), "pokemon_color_names.csv", csv_record_to_objects) @@ -1363,9 +1379,7 @@ def csv_record_to_objects(info): data = load_data("pokemon_species.csv") for index, info in enumerate(data): if index > 0: - evolves = ( - PokemonSpecies.objects.get(pk=int(info[3])) if info[3] != "" else None - ) + evolves = PokemonSpecies.objects.get(pk=int(info[3])) if info[3] != "" else None if evolves: species = PokemonSpecies.objects.get(pk=int(info[0])) species.evolves_from_species = evolves @@ -1379,9 +1393,7 @@ def csv_record_to_objects(info): genus=info[3], ) - build_generic( - (PokemonSpeciesName,), "pokemon_species_names.csv", csv_record_to_objects - ) + build_generic((PokemonSpeciesName,), "pokemon_species_names.csv", csv_record_to_objects) def csv_record_to_objects(info): yield PokemonSpeciesDescription( @@ -1390,9 +1402,7 @@ def csv_record_to_objects(info): description=scrub_str(info[2]), ) - build_generic( - (PokemonSpeciesDescription,), "pokemon_species_prose.csv", csv_record_to_objects - ) + build_generic((PokemonSpeciesDescription,), "pokemon_species_prose.csv", csv_record_to_objects) def csv_record_to_objects(info): yield PokemonSpeciesFlavorText( @@ -1433,11 +1443,7 @@ def try_image_names(path, info, extension): extension, ) id_file_name = "%s.%s" % (pokemon_id, extension) - file_name = ( - id_file_name - if file_path_or_none(path + id_file_name) - else form_file_name - ) + file_name = id_file_name if file_path_or_none(path + id_file_name) else form_file_name else: file_name = "%s.%s" % (info[0], extension) return file_path_or_none(path + file_name) @@ -1461,86 +1467,44 @@ def csv_record_to_objects(info): "front_default": try_image_names(poke_sprites, info, "png"), "front_female": try_image_names(poke_sprites + "female/", info, "png"), "front_shiny": try_image_names(poke_sprites + "shiny/", info, "png"), - "front_shiny_female": try_image_names( - poke_sprites + "shiny/female/", info, "png" - ), + "front_shiny_female": try_image_names(poke_sprites + "shiny/female/", info, "png"), "back_default": try_image_names(poke_sprites + "back/", info, "png"), "back_female": try_image_names(poke_sprites + "back/female/", info, "png"), "back_shiny": try_image_names(poke_sprites + "back/shiny/", info, "png"), - "back_shiny_female": try_image_names( - poke_sprites + "back/shiny/female/", info, "png" - ), + "back_shiny_female": try_image_names(poke_sprites + "back/shiny/female/", info, "png"), "other": { "dream_world": { - "front_default": try_image_names( - poke_sprites + dream_world, info, "svg" - ), - "front_female": try_image_names( - poke_sprites + dream_world + "female/", info, "svg" - ), + "front_default": try_image_names(poke_sprites + dream_world, info, "svg"), + "front_female": try_image_names(poke_sprites + dream_world + "female/", info, "svg"), }, "home": { "front_default": try_image_names(poke_sprites + home, info, "png"), - "front_female": try_image_names( - poke_sprites + home + "female/", info, "png" - ), - "front_shiny": try_image_names( - poke_sprites + home + "shiny/", info, "png" - ), - "front_shiny_female": try_image_names( - poke_sprites + home + "shiny/female/", info, "png" - ), + "front_female": try_image_names(poke_sprites + home + "female/", info, "png"), + "front_shiny": try_image_names(poke_sprites + home + "shiny/", info, "png"), + "front_shiny_female": try_image_names(poke_sprites + home + "shiny/female/", info, "png"), }, "official-artwork": { - "front_default": try_image_names( - poke_sprites + official_art, info, "png" - ), - "front_shiny": try_image_names( - poke_sprites + official_art + "shiny/", info, "png" - ), + "front_default": try_image_names(poke_sprites + official_art, info, "png"), + "front_shiny": try_image_names(poke_sprites + official_art + "shiny/", info, "png"), }, "showdown": { - "front_default": try_image_names( - poke_sprites + showdown, info, "gif" - ), - "front_shiny": try_image_names( - poke_sprites + showdown + "shiny/", info, "gif" - ), - "front_female": try_image_names( - poke_sprites + showdown + "female/", info, "gif" - ), - "front_shiny_female": try_image_names( - poke_sprites + showdown + "shiny/female/", info, "gif" - ), - "back_default": try_image_names( - poke_sprites + showdown + "back/", info, "gif" - ), - "back_shiny": try_image_names( - poke_sprites + showdown + "back/shiny/", info, "gif" - ), - "back_female": try_image_names( - poke_sprites + showdown + "back/female/", info, "gif" - ), - "back_shiny_female": try_image_names( - poke_sprites + showdown + "back/shiny/female", info, "gif" - ), + "front_default": try_image_names(poke_sprites + showdown, info, "gif"), + "front_shiny": try_image_names(poke_sprites + showdown + "shiny/", info, "gif"), + "front_female": try_image_names(poke_sprites + showdown + "female/", info, "gif"), + "front_shiny_female": try_image_names(poke_sprites + showdown + "shiny/female/", info, "gif"), + "back_default": try_image_names(poke_sprites + showdown + "back/", info, "gif"), + "back_shiny": try_image_names(poke_sprites + showdown + "back/shiny/", info, "gif"), + "back_female": try_image_names(poke_sprites + showdown + "back/female/", info, "gif"), + "back_shiny_female": try_image_names(poke_sprites + showdown + "back/shiny/female", info, "gif"), }, }, "versions": { "generation-i": { "red-blue": { - "front_default": try_image_names( - poke_sprites + gen_i + "red-blue/", info, "png" - ), - "front_gray": try_image_names( - poke_sprites + gen_i + "red-blue/gray/", info, "png" - ), - "back_default": try_image_names( - poke_sprites + gen_i + "red-blue/back/", info, "png" - ), - "back_gray": try_image_names( - poke_sprites + gen_i + "red-blue/back/gray/", info, "png" - ), + "front_default": try_image_names(poke_sprites + gen_i + "red-blue/", info, "png"), + "front_gray": try_image_names(poke_sprites + gen_i + "red-blue/gray/", info, "png"), + "back_default": try_image_names(poke_sprites + gen_i + "red-blue/back/", info, "png"), + "back_gray": try_image_names(poke_sprites + gen_i + "red-blue/back/gray/", info, "png"), "front_transparent": try_image_names( poke_sprites + gen_i + "red-blue/transparent/", info, "png" ), @@ -1551,21 +1515,11 @@ def csv_record_to_objects(info): ), }, "yellow": { - "front_default": try_image_names( - poke_sprites + gen_i + "yellow/", info, "png" - ), - "front_gray": try_image_names( - poke_sprites + gen_i + "yellow/gray/", info, "png" - ), - "back_default": try_image_names( - poke_sprites + gen_i + "yellow/back/", info, "png" - ), - "back_gray": try_image_names( - poke_sprites + gen_i + "yellow/back/gray/", info, "png" - ), - "front_transparent": try_image_names( - poke_sprites + gen_i + "yellow/transparent/", info, "png" - ), + "front_default": try_image_names(poke_sprites + gen_i + "yellow/", info, "png"), + "front_gray": try_image_names(poke_sprites + gen_i + "yellow/gray/", info, "png"), + "back_default": try_image_names(poke_sprites + gen_i + "yellow/back/", info, "png"), + "back_gray": try_image_names(poke_sprites + gen_i + "yellow/back/gray/", info, "png"), + "front_transparent": try_image_names(poke_sprites + gen_i + "yellow/transparent/", info, "png"), "back_transparent": try_image_names( poke_sprites + gen_i + "yellow/transparent/back/", info, @@ -1575,18 +1529,10 @@ def csv_record_to_objects(info): }, "generation-ii": { "crystal": { - "front_default": try_image_names( - poke_sprites + gen_ii + "crystal/", info, "png" - ), - "front_shiny": try_image_names( - poke_sprites + gen_ii + "crystal/shiny/", info, "png" - ), - "back_default": try_image_names( - poke_sprites + gen_ii + "crystal/back/", info, "png" - ), - "back_shiny": try_image_names( - poke_sprites + gen_ii + "crystal/back/shiny/", info, "png" - ), + "front_default": try_image_names(poke_sprites + gen_ii + "crystal/", info, "png"), + "front_shiny": try_image_names(poke_sprites + gen_ii + "crystal/shiny/", info, "png"), + "back_default": try_image_names(poke_sprites + gen_ii + "crystal/back/", info, "png"), + "back_shiny": try_image_names(poke_sprites + gen_ii + "crystal/back/shiny/", info, "png"), "front_transparent": try_image_names( poke_sprites + gen_ii + "crystal/transparent/", info, "png" ), @@ -1607,35 +1553,17 @@ def csv_record_to_objects(info): ), }, "gold": { - "front_default": try_image_names( - poke_sprites + gen_ii + "gold/", info, "png" - ), - "front_shiny": try_image_names( - poke_sprites + gen_ii + "gold/shiny/", info, "png" - ), - "back_default": try_image_names( - poke_sprites + gen_ii + "gold/back/", info, "png" - ), - "back_shiny": try_image_names( - poke_sprites + gen_ii + "gold/back/shiny/", info, "png" - ), - "front_transparent": try_image_names( - poke_sprites + gen_ii + "gold/transparent/", info, "png" - ), + "front_default": try_image_names(poke_sprites + gen_ii + "gold/", info, "png"), + "front_shiny": try_image_names(poke_sprites + gen_ii + "gold/shiny/", info, "png"), + "back_default": try_image_names(poke_sprites + gen_ii + "gold/back/", info, "png"), + "back_shiny": try_image_names(poke_sprites + gen_ii + "gold/back/shiny/", info, "png"), + "front_transparent": try_image_names(poke_sprites + gen_ii + "gold/transparent/", info, "png"), }, "silver": { - "front_default": try_image_names( - poke_sprites + gen_ii + "silver/", info, "png" - ), - "front_shiny": try_image_names( - poke_sprites + gen_ii + "silver/shiny/", info, "png" - ), - "back_default": try_image_names( - poke_sprites + gen_ii + "silver/back/", info, "png" - ), - "back_shiny": try_image_names( - poke_sprites + gen_ii + "silver/back/shiny/", info, "png" - ), + "front_default": try_image_names(poke_sprites + gen_ii + "silver/", info, "png"), + "front_shiny": try_image_names(poke_sprites + gen_ii + "silver/shiny/", info, "png"), + "back_default": try_image_names(poke_sprites + gen_ii + "silver/back/", info, "png"), + "back_shiny": try_image_names(poke_sprites + gen_ii + "silver/back/shiny/", info, "png"), "front_transparent": try_image_names( poke_sprites + gen_ii + "silver/transparent/", info, "png" ), @@ -1643,17 +1571,11 @@ def csv_record_to_objects(info): }, "generation-iii": { "emerald": { - "front_default": try_image_names( - poke_sprites + gen_iii + "emerald/", info, "png" - ), - "front_shiny": try_image_names( - poke_sprites + gen_iii + "emerald/shiny/", info, "png" - ), + "front_default": try_image_names(poke_sprites + gen_iii + "emerald/", info, "png"), + "front_shiny": try_image_names(poke_sprites + gen_iii + "emerald/shiny/", info, "png"), }, "firered-leafgreen": { - "front_default": try_image_names( - poke_sprites + gen_iii + "firered-leafgreen/", info, "png" - ), + "front_default": try_image_names(poke_sprites + gen_iii + "firered-leafgreen/", info, "png"), "front_shiny": try_image_names( poke_sprites + gen_iii + "firered-leafgreen/shiny/", info, @@ -1671,9 +1593,7 @@ def csv_record_to_objects(info): ), }, "ruby-sapphire": { - "front_default": try_image_names( - poke_sprites + gen_iii + "ruby-sapphire/", info, "png" - ), + "front_default": try_image_names(poke_sprites + gen_iii + "ruby-sapphire/", info, "png"), "front_shiny": try_image_names( poke_sprites + gen_iii + "ruby-sapphire/shiny/", info, @@ -1693,9 +1613,7 @@ def csv_record_to_objects(info): }, "generation-iv": { "diamond-pearl": { - "front_default": try_image_names( - poke_sprites + gen_iv + "diamond-pearl/", info, "png" - ), + "front_default": try_image_names(poke_sprites + gen_iv + "diamond-pearl/", info, "png"), "front_female": try_image_names( poke_sprites + gen_iv + "diamond-pearl/female/", info, @@ -1711,9 +1629,7 @@ def csv_record_to_objects(info): info, "png", ), - "back_default": try_image_names( - poke_sprites + gen_iv + "diamond-pearl/back/", info, "png" - ), + "back_default": try_image_names(poke_sprites + gen_iv + "diamond-pearl/back/", info, "png"), "back_female": try_image_names( poke_sprites + gen_iv + "diamond-pearl/back/female/", info, @@ -1747,9 +1663,7 @@ def csv_record_to_objects(info): "png", ), "front_shiny_female": try_image_names( - poke_sprites - + gen_iv - + "heartgold-soulsilver/shiny/female/", + poke_sprites + gen_iv + "heartgold-soulsilver/shiny/female/", info, "png", ), @@ -1769,31 +1683,21 @@ def csv_record_to_objects(info): "png", ), "back_shiny_female": try_image_names( - poke_sprites - + gen_iv - + "heartgold-soulsilver/back/shiny/female/", + poke_sprites + gen_iv + "heartgold-soulsilver/back/shiny/female/", info, "png", ), }, "platinum": { - "front_default": try_image_names( - poke_sprites + gen_iv + "platinum/", info, "png" - ), - "front_female": try_image_names( - poke_sprites + gen_iv + "platinum/female/", info, "png" - ), - "front_shiny": try_image_names( - poke_sprites + gen_iv + "platinum/shiny/", info, "png" - ), + "front_default": try_image_names(poke_sprites + gen_iv + "platinum/", info, "png"), + "front_female": try_image_names(poke_sprites + gen_iv + "platinum/female/", info, "png"), + "front_shiny": try_image_names(poke_sprites + gen_iv + "platinum/shiny/", info, "png"), "front_shiny_female": try_image_names( poke_sprites + gen_iv + "platinum/shiny/female/", info, "png", ), - "back_default": try_image_names( - poke_sprites + gen_iv + "platinum/back/", info, "png" - ), + "back_default": try_image_names(poke_sprites + gen_iv + "platinum/back/", info, "png"), "back_female": try_image_names( poke_sprites + gen_iv + "platinum/back/female/", info, @@ -1813,23 +1717,15 @@ def csv_record_to_objects(info): }, "generation-v": { "black-white": { - "front_default": try_image_names( - poke_sprites + gen_v + "black-white/", info, "png" - ), - "front_female": try_image_names( - poke_sprites + gen_v + "black-white/female/", info, "png" - ), - "front_shiny": try_image_names( - poke_sprites + gen_v + "black-white/shiny/", info, "png" - ), + "front_default": try_image_names(poke_sprites + gen_v + "black-white/", info, "png"), + "front_female": try_image_names(poke_sprites + gen_v + "black-white/female/", info, "png"), + "front_shiny": try_image_names(poke_sprites + gen_v + "black-white/shiny/", info, "png"), "front_shiny_female": try_image_names( poke_sprites + gen_v + "black-white/shiny/female/", info, "png", ), - "back_default": try_image_names( - poke_sprites + gen_v + "black-white/back/", info, "png" - ), + "back_default": try_image_names(poke_sprites + gen_v + "black-white/back/", info, "png"), "back_female": try_image_names( poke_sprites + gen_v + "black-white/back/female/", info, @@ -1862,9 +1758,7 @@ def csv_record_to_objects(info): "gif", ), "front_shiny_female": try_image_names( - poke_sprites - + gen_v - + "black-white/animated/shiny/female/", + poke_sprites + gen_v + "black-white/animated/shiny/female/", info, "gif", ), @@ -1874,23 +1768,17 @@ def csv_record_to_objects(info): "gif", ), "back_female": try_image_names( - poke_sprites - + gen_v - + "black-white/animated/back/female/", + poke_sprites + gen_v + "black-white/animated/back/female/", info, "gif", ), "back_shiny": try_image_names( - poke_sprites - + gen_v - + "black-white/animated/back/shiny/", + poke_sprites + gen_v + "black-white/animated/back/shiny/", info, "gif", ), "back_shiny_female": try_image_names( - poke_sprites - + gen_v - + "black-white/animated/back/shiny/female/", + poke_sprites + gen_v + "black-white/animated/back/shiny/female/", info, "gif", ), @@ -1915,26 +1803,16 @@ def csv_record_to_objects(info): "png", ), "front_shiny_female": try_image_names( - poke_sprites - + gen_vi - + "omegaruby-alphasapphire/shiny/female/", + poke_sprites + gen_vi + "omegaruby-alphasapphire/shiny/female/", info, "png", ), }, "x-y": { - "front_default": try_image_names( - poke_sprites + gen_vi + "x-y/", info, "png" - ), - "front_female": try_image_names( - poke_sprites + gen_vi + "x-y/female/", info, "png" - ), - "front_shiny": try_image_names( - poke_sprites + gen_vi + "x-y/shiny/", info, "png" - ), - "front_shiny_female": try_image_names( - poke_sprites + gen_vi + "x-y/shiny/female/", info, "png" - ), + "front_default": try_image_names(poke_sprites + gen_vi + "x-y/", info, "png"), + "front_female": try_image_names(poke_sprites + gen_vi + "x-y/female/", info, "png"), + "front_shiny": try_image_names(poke_sprites + gen_vi + "x-y/shiny/", info, "png"), + "front_shiny_female": try_image_names(poke_sprites + gen_vi + "x-y/shiny/female/", info, "png"), }, }, "generation-vii": { @@ -1955,43 +1833,29 @@ def csv_record_to_objects(info): "png", ), "front_shiny_female": try_image_names( - poke_sprites - + gen_vii - + "ultra-sun-ultra-moon/shiny/female/", + poke_sprites + gen_vii + "ultra-sun-ultra-moon/shiny/female/", info, "png", ), }, "icons": { - "front_default": try_image_names( - poke_sprites + gen_vii + "icons/", info, "png" - ), - "front_female": try_image_names( - poke_sprites + gen_vii + "icons/female/", info, "png" - ), + "front_default": try_image_names(poke_sprites + gen_vii + "icons/", info, "png"), + "front_female": try_image_names(poke_sprites + gen_vii + "icons/female/", info, "png"), }, }, "generation-viii": { "icons": { - "front_default": try_image_names( - poke_sprites + gen_viii + "icons/", info, "png" - ), - "front_female": try_image_names( - poke_sprites + gen_viii + "icons/female/", info, "png" - ), + "front_default": try_image_names(poke_sprites + gen_viii + "icons/", info, "png"), + "front_female": try_image_names(poke_sprites + gen_viii + "icons/female/", info, "png"), }, "brilliant-diamond-shining-pearl": { "front_default": try_image_names( - poke_sprites - + gen_viii - + "brilliant-diamond-shining-pearl/", + poke_sprites + gen_viii + "brilliant-diamond-shining-pearl/", info, "png", ), "front_female": try_image_names( - poke_sprites - + gen_viii - + "brilliant-diamond-shining-pearl/female/", + poke_sprites + gen_viii + "brilliant-diamond-shining-pearl/female/", info, "png", ), @@ -1999,9 +1863,7 @@ def csv_record_to_objects(info): }, "generation-ix": { "scarlet-violet": { - "front_default": try_image_names( - poke_sprites + gen_ix + "scarlet-violet/", info, "png" - ), + "front_default": try_image_names(poke_sprites + gen_ix + "scarlet-violet/", info, "png"), "front_female": try_image_names( poke_sprites + gen_ix + "scarlet-violet/female/", info, @@ -2058,9 +1920,7 @@ def csv_record_to_objects(info): slot=int(info[4]), ) - build_generic( - (PokemonAbilityPast,), "pokemon_abilities_past.csv", csv_record_to_objects - ) + build_generic((PokemonAbilityPast,), "pokemon_abilities_past.csv", csv_record_to_objects) def csv_record_to_objects(info): yield PokemonDexNumber( @@ -2072,9 +1932,7 @@ def csv_record_to_objects(info): build_generic((PokemonDexNumber,), "pokemon_dex_numbers.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield PokemonEggGroup( - pokemon_species_id=int(info[0]), egg_group_id=int(info[1]) - ) + yield PokemonEggGroup(pokemon_species_id=int(info[0]), egg_group_id=int(info[1])) build_generic((PokemonEggGroup,), "pokemon_egg_groups.csv", csv_record_to_objects) @@ -2127,7 +1985,7 @@ def csv_record_to_objects(info): build_generic((PokemonForm,), "pokemon_forms.csv", csv_record_to_objects) - def try_image_names(path, info, extension): + def try_image_names_form(path, info, extension): form_identifier = info[2] pokemon_id = info[3] pokemon = Pokemon.objects.get(pk=int(pokemon_id)) @@ -2136,11 +1994,7 @@ def try_image_names(path, info, extension): if form_identifier: form_file_name = "%s-%s.%s" % (species_id, form_identifier, extension) id_file_name = "%s.%s" % (pokemon_id, extension) - file_name = ( - id_file_name - if file_path_or_none(path + id_file_name) - else form_file_name - ) + file_name = id_file_name if file_path_or_none(path + id_file_name) else form_file_name if id_file_name and form_file_name and (not is_default): file_name = form_file_name else: @@ -2150,30 +2004,24 @@ def try_image_names(path, info, extension): def csv_record_to_objects(info): poke_sprites = "pokemon/" sprites = { - "front_default": try_image_names(poke_sprites, info, "png"), - "front_shiny": try_image_names(poke_sprites + "shiny/", info, "png"), - "back_default": try_image_names(poke_sprites + "back/", info, "png"), - "back_shiny": try_image_names(poke_sprites + "back/shiny/", info, "png"), - "front_female": try_image_names(poke_sprites + "female/", info, "png"), - "front_shiny_female": try_image_names( - poke_sprites + "shiny/female/", info, "png" - ), - "back_female": try_image_names(poke_sprites + "back/female/", info, "png"), - "back_shiny_female": try_image_names( - poke_sprites + "back/shiny/female/", info, "png" - ), + "front_default": try_image_names_form(poke_sprites, info, "png"), + "front_shiny": try_image_names_form(poke_sprites + "shiny/", info, "png"), + "back_default": try_image_names_form(poke_sprites + "back/", info, "png"), + "back_shiny": try_image_names_form(poke_sprites + "back/shiny/", info, "png"), + "front_female": try_image_names_form(poke_sprites + "female/", info, "png"), + "front_shiny_female": try_image_names_form(poke_sprites + "shiny/female/", info, "png"), + "back_female": try_image_names_form(poke_sprites + "back/female/", info, "png"), + "back_shiny_female": try_image_names_form(poke_sprites + "back/shiny/female/", info, "png"), "versions": { "generation-viii": { "brilliant-diamond-shining-pearl": { - "front_default": try_image_names( - poke_sprites - + "versions/generation-viii/brilliant-diamond-shining-pearl/", + "front_default": try_image_names_form( + poke_sprites + "versions/generation-viii/brilliant-diamond-shining-pearl/", info, "png", ), - "front_female": try_image_names( - poke_sprites - + "versions/generation-viii/brilliant-diamond-shining-pearl/female/", + "front_female": try_image_names_form( + poke_sprites + "versions/generation-viii/brilliant-diamond-shining-pearl/female/", info, "png", ), @@ -2181,14 +2029,13 @@ def csv_record_to_objects(info): }, "generation-ix": { "scarlet-violet": { - "front_default": try_image_names( + "front_default": try_image_names_form( poke_sprites + "versions/generation-ix/scarlet-violet/", info, "png", ), - "front_female": try_image_names( - poke_sprites - + "versions/generation-ix/scarlet-violet/female/", + "front_female": try_image_names_form( + poke_sprites + "versions/generation-ix/scarlet-violet/female/", info, "png", ), @@ -2196,9 +2043,7 @@ def csv_record_to_objects(info): }, }, } - yield PokemonFormSprites( - id=int(info[0]), pokemon_form_id=int(info[0]), sprites=sprites - ) + yield PokemonFormSprites(id=int(info[0]), pokemon_form_id=int(info[0]), sprites=sprites) build_generic((PokemonFormSprites,), "pokemon_forms.csv", csv_record_to_objects) @@ -2219,34 +2064,22 @@ def csv_record_to_objects(info): game_index=int(info[2]), ) - build_generic( - (PokemonFormGeneration,), "pokemon_form_generations.csv", csv_record_to_objects - ) + build_generic((PokemonFormGeneration,), "pokemon_form_generations.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield PokemonFormType( - pokemon_form_id=int(info[0]), type_id=int(info[1]), slot=int(info[2]) - ) + yield PokemonFormType(pokemon_form_id=int(info[0]), type_id=int(info[1]), slot=int(info[2])) build_generic((PokemonFormType,), "pokemon_form_types.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield PokemonGameIndex( - pokemon_id=int(info[0]), version_id=int(info[1]), game_index=int(info[2]) - ) + yield PokemonGameIndex(pokemon_id=int(info[0]), version_id=int(info[1]), game_index=int(info[2])) - build_generic( - (PokemonGameIndex,), "pokemon_game_indices.csv", csv_record_to_objects - ) + build_generic((PokemonGameIndex,), "pokemon_game_indices.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield PokemonHabitatName( - pokemon_habitat_id=int(info[0]), language_id=int(info[1]), name=info[2] - ) + yield PokemonHabitatName(pokemon_habitat_id=int(info[0]), language_id=int(info[1]), name=info[2]) - build_generic( - (PokemonHabitatName,), "pokemon_habitat_names.csv", csv_record_to_objects - ) + build_generic((PokemonHabitatName,), "pokemon_habitat_names.csv", csv_record_to_objects) def csv_record_to_objects(info): yield PokemonItem( @@ -2292,9 +2125,7 @@ def csv_record_to_objects(info): build_generic((PokemonStatPast,), "pokemon_stats_past.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield PokemonType( - pokemon_id=int(info[0]), type_id=int(info[1]), slot=int(info[2]) - ) + yield PokemonType(pokemon_id=int(info[0]), type_id=int(info[1]), slot=int(info[2])) build_generic((PokemonType,), "pokemon_types.csv", csv_record_to_objects) @@ -2335,25 +2166,17 @@ def csv_record_to_objects(info): ) def csv_record_to_objects(info): - yield EncounterMethodName( - encounter_method_id=int(info[0]), language_id=int(info[1]), name=info[2] - ) + yield EncounterMethodName(encounter_method_id=int(info[0]), language_id=int(info[1]), name=info[2]) - build_generic( - (EncounterMethodName,), "encounter_method_prose.csv", csv_record_to_objects - ) + build_generic((EncounterMethodName,), "encounter_method_prose.csv", csv_record_to_objects) def csv_record_to_objects(info): yield EncounterCondition(id=int(info[0]), name=info[1]) - build_generic( - (EncounterCondition,), "encounter_conditions.csv", csv_record_to_objects - ) + build_generic((EncounterCondition,), "encounter_conditions.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield EncounterConditionName( - encounter_condition_id=int(info[0]), language_id=int(info[1]), name=info[2] - ) + yield EncounterConditionName(encounter_condition_id=int(info[0]), language_id=int(info[1]), name=info[2]) build_generic( (EncounterConditionName,), @@ -2413,9 +2236,7 @@ def csv_record_to_objects(info): ) def csv_record_to_objects(info): - yield EncounterConditionValueMap( - encounter_id=int(info[0]), encounter_condition_value_id=int(info[1]) - ) + yield EncounterConditionValueMap(encounter_id=int(info[0]), encounter_condition_value_id=int(info[1])) build_generic( (EncounterConditionValueMap,), @@ -2436,9 +2257,7 @@ def csv_record_to_objects(info): build_generic((PalParkArea,), "pal_park_areas.csv", csv_record_to_objects) def csv_record_to_objects(info): - yield PalParkAreaName( - pal_park_area_id=int(info[0]), language_id=int(info[1]), name=info[2] - ) + yield PalParkAreaName(pal_park_area_id=int(info[0]), language_id=int(info[1]), name=info[2]) build_generic((PalParkAreaName,), "pal_park_area_names.csv", csv_record_to_objects) diff --git a/pokemon_v2/__init__.py b/pokemon_v2/__init__.py index e69de29bb..8b1378917 100644 --- a/pokemon_v2/__init__.py +++ b/pokemon_v2/__init__.py @@ -0,0 +1 @@ + diff --git a/pokemon_v2/api.py b/pokemon_v2/api.py index 590721839..4c6942385 100644 --- a/pokemon_v2/api.py +++ b/pokemon_v2/api.py @@ -1,15 +1,166 @@ import re + +from django.db.models import Q +from django.http import Http404 +from django.shortcuts import get_object_or_404 +from drf_spectacular.types import OpenApiTypes +from drf_spectacular.utils import OpenApiParameter, extend_schema, extend_schema_view from rest_framework import viewsets from rest_framework.response import Response from rest_framework.views import APIView -from django.shortcuts import get_object_or_404 -from django.http import Http404 -from django.db.models import Q -from drf_spectacular.utils import extend_schema, extend_schema_view, OpenApiParameter -from drf_spectacular.types import OpenApiTypes -from .models import * -from .serializers import * +from .models import ( + Ability, + Berry, + BerryFirmness, + BerryFlavor, + Characteristic, + ContestEffect, + ContestType, + EggGroup, + Encounter, + EncounterCondition, + EncounterConditionValue, + EncounterMethod, + EncounterSlot, + EvolutionChain, + EvolutionTrigger, + Gender, + Generation, + GrowthRate, + Item, + ItemAttribute, + ItemCategory, + ItemFlingEffect, + ItemPocket, + Language, + Location, + LocationArea, + Machine, + Move, + MoveBattleStyle, + MoveDamageClass, + MoveLearnMethod, + MoveMetaAilment, + MoveMetaCategory, + MoveTarget, + Nature, + PalParkArea, + PokeathlonStat, + Pokedex, + Pokemon, + PokemonColor, + PokemonForm, + PokemonHabitat, + PokemonShape, + PokemonSpecies, + Region, + Stat, + SuperContestEffect, + Type, + Version, + VersionGroup, +) +from .serializers import ( + AbilityDetailSerializer, + AbilitySummarySerializer, + BerryDetailSerializer, + BerryFirmnessDetailSerializer, + BerryFirmnessSummarySerializer, + BerryFlavorDetailSerializer, + BerryFlavorSummarySerializer, + BerrySummarySerializer, + CharacteristicDetailSerializer, + CharacteristicSummarySerializer, + ContestEffectDetailSerializer, + ContestEffectSummarySerializer, + ContestTypeDetailSerializer, + ContestTypeSummarySerializer, + EggGroupDetailSerializer, + EggGroupSummarySerializer, + EncounterConditionDetailSerializer, + EncounterConditionSummarySerializer, + EncounterConditionValueDetailSerializer, + EncounterConditionValueSummarySerializer, + EncounterDetailSerializer, + EncounterMethodDetailSerializer, + EncounterMethodSummarySerializer, + EncounterSlotSerializer, + EvolutionChainDetailSerializer, + EvolutionChainSummarySerializer, + EvolutionTriggerDetailSerializer, + EvolutionTriggerSummarySerializer, + GenderDetailSerializer, + GenderSummarySerializer, + GenerationDetailSerializer, + GenerationSummarySerializer, + GrowthRateDetailSerializer, + GrowthRateSummarySerializer, + ItemAttributeDetailSerializer, + ItemAttributeSummarySerializer, + ItemCategoryDetailSerializer, + ItemCategorySummarySerializer, + ItemDetailSerializer, + ItemFlingEffectDetailSerializer, + ItemFlingEffectSummarySerializer, + ItemPocketDetailSerializer, + ItemPocketSummarySerializer, + ItemSummarySerializer, + LanguageDetailSerializer, + LanguageSummarySerializer, + LocationAreaDetailSerializer, + LocationAreaSummarySerializer, + LocationDetailSerializer, + LocationSummarySerializer, + MachineDetailSerializer, + MachineSummarySerializer, + MoveBattleStyleDetailSerializer, + MoveBattleStyleSummarySerializer, + MoveDamageClassDetailSerializer, + MoveDamageClassSummarySerializer, + MoveDetailSerializer, + MoveLearnMethodDetailSerializer, + MoveLearnMethodSummarySerializer, + MoveMetaAilmentDetailSerializer, + MoveMetaAilmentSummarySerializer, + MoveMetaCategoryDetailSerializer, + MoveMetaCategorySummarySerializer, + MoveSummarySerializer, + MoveTargetDetailSerializer, + MoveTargetSummarySerializer, + NatureDetailSerializer, + NatureSummarySerializer, + PalParkAreaDetailSerializer, + PalParkAreaSummarySerializer, + PokeathlonStatDetailSerializer, + PokeathlonStatSummarySerializer, + PokedexDetailSerializer, + PokedexSummarySerializer, + PokemonColorDetailSerializer, + PokemonColorSummarySerializer, + PokemonDetailSerializer, + PokemonFormDetailSerializer, + PokemonFormSummarySerializer, + PokemonHabitatDetailSerializer, + PokemonHabitatSummarySerializer, + PokemonShapeDetailSerializer, + PokemonShapeSummarySerializer, + PokemonSpeciesDetailSerializer, + PokemonSpeciesSummarySerializer, + PokemonSummarySerializer, + RegionDetailSerializer, + RegionSummarySerializer, + StatDetailSerializer, + StatSummarySerializer, + SuperContestEffectDetailSerializer, + SuperContestEffectSummarySerializer, + TypeDetailSerializer, + TypeSummarySerializer, + VersionDetailSerializer, + VersionGroupDetailSerializer, + VersionGroupSummarySerializer, + VersionSummarySerializer, +) # pylint: disable=no-member, attribute-defined-outside-init @@ -74,7 +225,10 @@ def get_object(self): q_query_string_parameter = OpenApiParameter( name="q", - description="> Only available locally and not at [pokeapi.co](https://pokeapi.co/docs/v2)\nCase-insensitive query applied on the `name` property. ", + description=( + "> Only available locally and not at [pokeapi.co](https://pokeapi.co/docs/v2)\n" + "Case-insensitive query applied on the `name` property. " + ), location=OpenApiParameter.QUERY, type=OpenApiTypes.STR, ) @@ -89,9 +243,7 @@ def get_object(self): @extend_schema_view(list=extend_schema(parameters=[q_query_string_parameter])) -class PokeapiCommonViewset( - ListOrDetailSerialRelation, NameOrIdRetrieval, viewsets.ReadOnlyModelViewSet -): +class PokeapiCommonViewset(ListOrDetailSerialRelation, NameOrIdRetrieval, viewsets.ReadOnlyModelViewSet): @extend_schema(parameters=[retrieve_path_parameter]) def retrieve(self, request, pk=None): return super().retrieve(request, pk) @@ -105,7 +257,11 @@ def retrieve(self, request, pk=None): @extend_schema( - description="Abilities provide passive effects for Pokémon in battle or in the overworld. Pokémon have multiple possible abilities but can have only one ability at a time. Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Ability) for greater detail.", + description=( + "Abilities provide passive effects for Pokémon in battle or in the overworld. " + "Pokémon have multiple possible abilities but can have only one ability at a time. " + "Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Ability) for greater detail." + ), tags=["pokemon"], ) class AbilityResource(PokeapiCommonViewset): @@ -115,7 +271,11 @@ class AbilityResource(PokeapiCommonViewset): @extend_schema( - description="Berries are small fruits that can provide HP and status condition restoration, stat enhancement, and even damage negation when eaten by Pokémon. Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Berry) for greater detail.", + description=( + "Berries are small fruits that can provide HP and status condition restoration, " + "stat enhancement, and even damage negation when eaten by Pokémon. " + "Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Berry) for greater detail." + ), tags=["berries"], summary="Get a berry", ) @@ -131,7 +291,11 @@ class BerryResource(PokeapiCommonViewset): @extend_schema( - description="Berries can be soft or hard. Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Category:Berries_by_firmness) for greater detail.", + description=( + "Berries can be soft or hard. " + "Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Category:Berries_by_firmness) " + "for greater detail." + ), tags=["berries"], summary="Get berry by firmness", ) @@ -147,7 +311,11 @@ class BerryFirmnessResource(PokeapiCommonViewset): @extend_schema( - description="Flavors determine whether a Pokémon will benefit or suffer from eating a berry based on their **nature**. Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Flavor) for greater detail.", + description=( + "Flavors determine whether a Pokémon will benefit or suffer from eating a berry " + "based on their **nature**. Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Flavor) " + "for greater detail." + ), summary="Get berries by flavor", tags=["berries"], ) @@ -163,7 +331,11 @@ class BerryFlavorResource(PokeapiCommonViewset): @extend_schema( - description="Characteristics indicate which stat contains a Pokémon's highest IV. A Pokémon's Characteristic is determined by the remainder of its highest IV divided by 5 (gene_modulo). Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Characteristic) for greater detail.", + description=( + "Characteristics indicate which stat contains a Pokémon's highest IV. " + "A Pokémon's Characteristic is determined by the remainder of its highest IV divided by 5 (gene_modulo). " + "Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Characteristic) for greater detail." + ), summary="Get characteristic", tags=["pokemon"], ) @@ -195,7 +367,10 @@ class ContestEffectResource(PokeapiCommonViewset): @extend_schema( - description="Contest types are categories judges used to weigh a Pokémon's condition in Pokémon contests. Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Contest_condition) for greater detail.", + description=( + "Contest types are categories judges used to weigh a Pokémon's condition in Pokémon contests. " + "Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Contest_condition) for greater detail." + ), summary="Get contest type", tags=["contests"], ) @@ -211,7 +386,11 @@ class ContestTypeResource(PokeapiCommonViewset): @extend_schema( - description="Egg Groups are categories which determine which Pokémon are able to interbreed. Pokémon may belong to either one or two Egg Groups. Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Egg_Group) for greater detail.", + description=( + "Egg Groups are categories which determine which Pokémon are able to interbreed. " + "Pokémon may belong to either one or two Egg Groups. " + "Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Egg_Group) for greater detail." + ), summary="Get egg group", tags=["pokemon"], ) @@ -243,7 +422,10 @@ class EncounterConditionResource(PokeapiCommonViewset): @extend_schema( - description="Encounter condition values are the various states that an encounter condition can have, i.e., time of day can be either day or night.", + description=( + "Encounter condition values are the various states that an encounter condition can have, " + "i.e., time of day can be either day or night." + ), summary="Get encounter condition value", tags=["encounters"], ) @@ -259,7 +441,10 @@ class EncounterConditionValueResource(PokeapiCommonViewset): @extend_schema( - description="Methods by which the player might can encounter Pokémon in the wild, e.g., walking in tall grass. Check out Bulbapedia for greater detail.", + description=( + "Methods by which the player might can encounter Pokémon in the wild, " + "e.g., walking in tall grass. Check out Bulbapedia for greater detail." + ), summary="Get encounter method", tags=["encounters"], ) @@ -275,7 +460,10 @@ class EncounterMethodResource(PokeapiCommonViewset): @extend_schema( - description="Evolution chains are essentially family trees. They start with the lowest stage within a family and detail evolution conditions for each as well as Pokémon they can evolve into up through the hierarchy.", + description=( + "Evolution chains are essentially family trees. They start with the lowest stage within a family " + "and detail evolution conditions for each as well as Pokémon they can evolve into up through the hierarchy." + ), summary="Get evolution chain", tags=["evolution"], ) @@ -291,7 +479,10 @@ class EvolutionChainResource(PokeapiCommonViewset): @extend_schema( - description="Evolution triggers are the events and conditions that cause a Pokémon to evolve. Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Methods_of_evolution) for greater detail.", + description=( + "Evolution triggers are the events and conditions that cause a Pokémon to evolve. " + "Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Methods_of_evolution) for greater detail." + ), summary="Get evolution trigger", tags=["evolution"], ) @@ -307,7 +498,11 @@ class EvolutionTriggerResource(PokeapiCommonViewset): @extend_schema( - description="A generation is a grouping of the Pokémon games that separates them based on the Pokémon they include. In each generation, a new set of Pokémon, Moves, Abilities and Types that did not exist in the previous generation are released.", + description=( + "A generation is a grouping of the Pokémon games that separates them based on the Pokémon they include. " + "In each generation, a new set of Pokémon, Moves, Abilities and Types that did not exist in the " + "previous generation are released." + ), summary="Get genration", tags=["games"], ) @@ -323,7 +518,11 @@ class GenerationResource(PokeapiCommonViewset): @extend_schema( - description="Genders were introduced in Generation II for the purposes of breeding Pokémon but can also result in visual differences or even different evolutionary lines. Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Gender) for greater detail.", + description=( + "Genders were introduced in Generation II for the purposes of breeding Pokémon but can also result in " + "visual differences or even different evolutionary lines. " + "Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Gender) for greater detail." + ), summary="Get gender", tags=["pokemon"], ) @@ -339,7 +538,10 @@ class GenderResource(PokeapiCommonViewset): @extend_schema( - description="Growth rates are the speed with which Pokémon gain levels through experience. Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Experience) for greater detail.", + description=( + "Growth rates are the speed with which Pokémon gain levels through experience. " + "Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Experience) for greater detail." + ), summary="Get growth rate", tags=["pokemon"], ) @@ -355,7 +557,10 @@ class GrowthRateResource(PokeapiCommonViewset): @extend_schema( - description="An item is an object in the games which the player can pick up, keep in their bag, and use in some manner. They have various uses, including healing, powering up, helping catch Pokémon, or to access a new area.", + description=( + "An item is an object in the games which the player can pick up, keep in their bag, and use in some manner. " + "They have various uses, including healing, powering up, helping catch Pokémon, or to access a new area." + ), summary="Get item", tags=["items"], ) @@ -451,7 +656,10 @@ class LanguageResource(PokeapiCommonViewset): @extend_schema( - description="Locations that can be visited within the games. Locations make up sizable portions of regions, like cities or routes.", + description=( + "Locations that can be visited within the games. " + "Locations make up sizable portions of regions, like cities or routes." + ), summary="Get location", tags=["location"], ) @@ -467,7 +675,10 @@ class LocationResource(PokeapiCommonViewset): @extend_schema( - description="Location areas are sections of areas, such as floors in a building or cave. Each area has its own set of possible Pokémon encounters.", + description=( + "Location areas are sections of areas, such as floors in a building or cave. " + "Each area has its own set of possible Pokémon encounters." + ), summary="Get location area", tags=["location"], ) @@ -483,7 +694,11 @@ class LocationAreaResource(ListOrDetailSerialRelation, viewsets.ReadOnlyModelVie @extend_schema( - description="Machines are the representation of items that teach moves to Pokémon. They vary from version to version, so it is not certain that one specific TM or HM corresponds to a single Machine.", + description=( + "Machines are the representation of items that teach moves to Pokémon. " + "They vary from version to version, so it is not certain that one specific TM or HM " + "corresponds to a single Machine." + ), summary="Get machine", tags=["machines"], ) @@ -499,7 +714,11 @@ class MachineResource(PokeapiCommonViewset): @extend_schema( - description="Moves are the skills of Pokémon in battle. In battle, a Pokémon uses one move each turn. Some moves (including those learned by Hidden Machine) can be used outside of battle as well, usually for the purpose of removing obstacles or exploring new areas.", + description=( + "Moves are the skills of Pokémon in battle. In battle, a Pokémon uses one move each turn. " + "Some moves (including those learned by Hidden Machine) can be used outside of battle as well, " + "usually for the purpose of removing obstacles or exploring new areas." + ), summary="Get move", tags=["moves"], ) @@ -531,7 +750,10 @@ class MoveDamageClassResource(PokeapiCommonViewset): @extend_schema( - description="Move Ailments are status conditions caused by moves used during battle. See [Bulbapedia](https://bulbapedia.bulbagarden.net/wiki/Status_condition) for greater detail.", + description=( + "Move Ailments are status conditions caused by moves used during battle. " + "See [Bulbapedia](https://bulbapedia.bulbagarden.net/wiki/Status_condition) for greater detail." + ), summary="Get move meta ailment", tags=["moves"], ) @@ -547,7 +769,10 @@ class MoveMetaAilmentResource(PokeapiCommonViewset): @extend_schema( - description="Styles of moves when used in the Battle Palace. See [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Battle_Frontier_(Generation_III)) for greater detail.", + description=( + "Styles of moves when used in the Battle Palace. " + "See [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Battle_Frontier_(Generation_III)) for greater detail." + ), summary="Get move battle style", tags=["moves"], ) @@ -595,7 +820,9 @@ class MoveLearnMethodResource(PokeapiCommonViewset): @extend_schema( - description="Targets moves can be directed at during battle. Targets can be Pokémon, environments or even other moves.", + description=( + "Targets moves can be directed at during battle. Targets can be Pokémon, environments or even other moves." + ), summary="Get move target", tags=["moves"], ) @@ -611,7 +838,10 @@ class MoveTargetResource(PokeapiCommonViewset): @extend_schema( - description="Natures influence how a Pokémon's stats grow. See [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Nature) for greater detail.", + description=( + "Natures influence how a Pokémon's stats grow. " + "See [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Nature) for greater detail." + ), summary="Get nature", tags=["pokemon"], ) @@ -627,7 +857,9 @@ class NatureResource(PokeapiCommonViewset): @extend_schema( - description="Areas used for grouping Pokémon encounters in Pal Park. They're like habitats that are specific to Pal Park.", + description=( + "Areas used for grouping Pokémon encounters in Pal Park. They're like habitats that are specific to Pal Park." + ), summary="Get pal park area", tags=["location"], ) @@ -643,7 +875,12 @@ class PalParkAreaResource(PokeapiCommonViewset): @extend_schema( - description="Pokeathlon Stats are different attributes of a Pokémon's performance in Pokéathlons. In Pokéathlons, competitions happen on different courses; one for each of the different Pokéathlon stats. See [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Pok%C3%A9athlon) for greater detail.", + description=( + "Pokeathlon Stats are different attributes of a Pokémon's performance in Pokéathlons. " + "In Pokéathlons, competitions happen on different courses; " + "one for each of the different Pokéathlon stats. " + "See [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Pok%C3%A9athlon) for greater detail." + ), summary="Get pokeathlon stat", tags=["pokemon"], ) @@ -659,7 +896,12 @@ class PokeathlonStatResource(PokeapiCommonViewset): @extend_schema( - description="A Pokédex is a handheld electronic encyclopedia device; one which is capable of recording and retaining information of the various Pokémon in a given region with the exception of the national dex and some smaller dexes related to portions of a region. See [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Pokedex) for greater detail.", + description=( + "A Pokédex is a handheld electronic encyclopedia device; " + "one which is capable of recording and retaining information of the various Pokémon in a given region " + "with the exception of the national dex and some smaller dexes related to portions of a region. " + "See [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Pokedex) for greater detail." + ), summary="Get pokedex", tags=["games"], ) @@ -675,7 +917,11 @@ class PokedexResource(PokeapiCommonViewset): @extend_schema( - description="Colors used for sorting Pokémon in a Pokédex. The color listed in the Pokédex is usually the color most apparent or covering each Pokémon's body. No orange category exists; Pokémon that are primarily orange are listed as red or brown.", + description=( + "Colors used for sorting Pokémon in a Pokédex. " + "The color listed in the Pokédex is usually the color most apparent or covering each Pokémon's body. " + "No orange category exists; Pokémon that are primarily orange are listed as red or brown." + ), summary="Get pokemon color", tags=["pokemon"], ) @@ -691,7 +937,12 @@ class PokemonColorResource(PokeapiCommonViewset): @extend_schema( - description="Some Pokémon may appear in one of multiple, visually different forms. These differences are purely cosmetic. For variations within a Pokémon species, which do differ in more than just visuals, the 'Pokémon' entity is used to represent such a variety.", + description=( + "Some Pokémon may appear in one of multiple, visually different forms. " + "These differences are purely cosmetic. " + "For variations within a Pokémon species, which do differ in more than just visuals, " + "the 'Pokémon' entity is used to represent such a variety." + ), summary="Get pokemon form", tags=["pokemon"], ) @@ -707,7 +958,10 @@ class PokemonFormResource(PokeapiCommonViewset): @extend_schema( - description="Habitats are generally different terrain Pokémon can be found in but can also be areas designated for rare or legendary Pokémon.", + description=( + "Habitats are generally different terrain Pokémon can be found in but can also be areas " + "designated for rare or legendary Pokémon." + ), summary="Get pokemom habita", tags=["pokemon"], ) @@ -739,7 +993,13 @@ class PokemonShapeResource(PokeapiCommonViewset): @extend_schema( - description="Pokémon are the creatures that inhabit the world of the Pokémon games. They can be caught using Pokéballs and trained by battling with other Pokémon. Each Pokémon belongs to a specific species but may take on a variant which makes it differ from other Pokémon of the same species, such as base stats, available abilities and typings. See [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Pok%C3%A9mon_(species)) for greater detail.", + description=( + "Pokémon are the creatures that inhabit the world of the Pokémon games. " + "They can be caught using Pokéballs and trained by battling with other Pokémon. " + "Each Pokémon belongs to a specific species but may take on a variant which makes it differ from other " + "Pokémon of the same species, such as base stats, available abilities and typings. " + "See [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Pok%C3%A9mon_(species)) for greater detail." + ), summary="Get pokemon", tags=["pokemon"], ) @@ -755,7 +1015,12 @@ class PokemonResource(PokeapiCommonViewset): @extend_schema( - description="A Pokémon Species forms the basis for at least one Pokémon. Attributes of a Pokémon species are shared across all varieties of Pokémon within the species. A good example is Wormadam; Wormadam is the species which can be found in three different varieties, Wormadam-Trash, Wormadam-Sandy and Wormadam-Plant.", + description=( + "A Pokémon Species forms the basis for at least one Pokémon. " + "Attributes of a Pokémon species are shared across all varieties of Pokémon within the species. " + "A good example is Wormadam; Wormadam is the species which can be found in three different varieties, " + "Wormadam-Trash, Wormadam-Sandy and Wormadam-Plant." + ), summary="Get pokemon species", tags=["pokemon"], ) @@ -771,7 +1036,10 @@ class PokemonSpeciesResource(PokeapiCommonViewset): @extend_schema( - description="A region is an organized area of the Pokémon world. Most often, the main difference between regions is the species of Pokémon that can be encountered within them.", + description=( + "A region is an organized area of the Pokémon world. " + "Most often, the main difference between regions is the species of Pokémon that can be encountered within them." + ), summary="Get region", tags=["location"], ) @@ -787,7 +1055,10 @@ class RegionResource(PokeapiCommonViewset): @extend_schema( - description="Stats determine certain aspects of battles. Each Pokémon has a value for each stat which grows as they gain levels and can be altered momentarily by effects in battles.", + description=""" + Stats determine certain aspects of battles. + Each Pokémon has a value for each stat which grows as they gain + levels and can be altered momentarily by effects in battles.""", summary="Get stat", tags=["pokemon"], ) @@ -819,7 +1090,11 @@ class SuperContestEffectResource(PokeapiCommonViewset): @extend_schema( - description="Types are properties for Pokémon and their moves. Each type has three properties: which types of Pokémon it is super effective against, which types of Pokémon it is not very effective against, and which types of Pokémon it is completely ineffective against.", + description=""" + Types are properties for Pokémon and their moves. + Each type has three properties: which types of Pokémon it is super effective against, + which types of Pokémon it is not very effective against, + and which types of Pokémon it is completely ineffective against.""", summary="Get types", tags=["pokemon"], ) @@ -987,11 +1262,7 @@ def get(self, request, pokemon_id): encounter_objects = Encounter.objects.filter(pokemon=pokemon) - area_ids = ( - encounter_objects.values_list("location_area", flat=True) - .distinct() - .order_by("location_area") - ) + area_ids = encounter_objects.values_list("location_area", flat=True).distinct().order_by("location_area") location_area_objects = LocationArea.objects.filter(pk__in=area_ids) version_objects = Version.objects @@ -1003,23 +1274,15 @@ def get(self, request, pokemon_id): area_encounters = encounter_objects.filter(location_area_id=area_id) - version_ids = ( - area_encounters.values_list("version_id", flat=True) - .distinct() - .order_by("version_id") - ) + version_ids = area_encounters.values_list("version_id", flat=True).distinct().order_by("version_id") version_details_list = [] for version_id in version_ids: version = version_objects.get(pk=version_id) - version_encounters = area_encounters.filter( - version_id=version_id - ).order_by("encounter_slot_id") + version_encounters = area_encounters.filter(version_id=version_id).order_by("encounter_slot_id") - encounters_data = EncounterDetailSerializer( - version_encounters, many=True, context=self.context - ).data + encounters_data = EncounterDetailSerializer(version_encounters, many=True, context=self.context).data max_chance = 0 encounter_details_list = [] @@ -1040,9 +1303,7 @@ def get(self, request, pokemon_id): version_details_list.append( { - "version": VersionSummarySerializer( - version, context=self.context - ).data, + "version": VersionSummarySerializer(version, context=self.context).data, "max_chance": max_chance, "encounter_details": encounter_details_list, } @@ -1050,9 +1311,7 @@ def get(self, request, pokemon_id): encounters_list.append( { - "location_area": LocationAreaSummarySerializer( - location_area, context=self.context - ).data, + "location_area": LocationAreaSummarySerializer(location_area, context=self.context).data, "version_details": version_details_list, } ) diff --git a/pokemon_v2/apps.py b/pokemon_v2/apps.py new file mode 100644 index 000000000..3840eb3a3 --- /dev/null +++ b/pokemon_v2/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class Pokemon2Config(AppConfig): + name = "pokemon_v2" diff --git a/pokemon_v2/migrations/0001_squashed_0002_auto_20160301_1408.py b/pokemon_v2/migrations/0001_squashed_0002_auto_20160301_1408.py index 15c60c610..e441f22d2 100644 --- a/pokemon_v2/migrations/0001_squashed_0002_auto_20160301_1408.py +++ b/pokemon_v2/migrations/0001_squashed_0002_auto_20160301_1408.py @@ -1,4 +1,4 @@ -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/pokemon_v2/migrations/0003_auto_20160530_1132.py b/pokemon_v2/migrations/0003_auto_20160530_1132.py index a5f27cf9d..b70b66aa8 100644 --- a/pokemon_v2/migrations/0003_auto_20160530_1132.py +++ b/pokemon_v2/migrations/0003_auto_20160530_1132.py @@ -1,4 +1,4 @@ -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/pokemon_v2/migrations/0004_iso639length_20191217.py b/pokemon_v2/migrations/0004_iso639length_20191217.py index bff709f2c..ff9cdaf78 100644 --- a/pokemon_v2/migrations/0004_iso639length_20191217.py +++ b/pokemon_v2/migrations/0004_iso639length_20191217.py @@ -1,4 +1,4 @@ -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/pokemon_v2/migrations/0009_pokemontypepast.py b/pokemon_v2/migrations/0009_pokemontypepast.py index a9351a893..0a8a22ca7 100644 --- a/pokemon_v2/migrations/0009_pokemontypepast.py +++ b/pokemon_v2/migrations/0009_pokemontypepast.py @@ -1,7 +1,7 @@ # Generated by Django 2.1.11 on 2021-02-06 22:03 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/pokemon_v2/migrations/0010_pokemonformtype.py b/pokemon_v2/migrations/0010_pokemonformtype.py index 91046acbf..3b577d58c 100644 --- a/pokemon_v2/migrations/0010_pokemonformtype.py +++ b/pokemon_v2/migrations/0010_pokemonformtype.py @@ -1,7 +1,7 @@ # Generated by Django 2.1.11 on 2021-02-18 20:45 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/pokemon_v2/migrations/0011_typeefficacypast.py b/pokemon_v2/migrations/0011_typeefficacypast.py index 7f96f04e3..3ea6362f1 100644 --- a/pokemon_v2/migrations/0011_typeefficacypast.py +++ b/pokemon_v2/migrations/0011_typeefficacypast.py @@ -1,7 +1,7 @@ # Generated by Django 2.1.11 on 2021-02-24 13:42 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/pokemon_v2/migrations/0013_pokemonabilitypast.py b/pokemon_v2/migrations/0013_pokemonabilitypast.py index 421b1f97c..eb74b2e2a 100644 --- a/pokemon_v2/migrations/0013_pokemonabilitypast.py +++ b/pokemon_v2/migrations/0013_pokemonabilitypast.py @@ -1,7 +1,7 @@ # Generated by Django 2.1.15 on 2023-02-27 15:33 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/pokemon_v2/migrations/0015_pokemoncries.py b/pokemon_v2/migrations/0015_pokemoncries.py index 05099ce1c..edae3ce23 100644 --- a/pokemon_v2/migrations/0015_pokemoncries.py +++ b/pokemon_v2/migrations/0015_pokemoncries.py @@ -1,7 +1,7 @@ # Generated by Django 3.2.23 on 2024-02-02 18:02 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/pokemon_v2/migrations/0016_typesprites.py b/pokemon_v2/migrations/0016_typesprites.py index a9e752d63..195e52139 100644 --- a/pokemon_v2/migrations/0016_typesprites.py +++ b/pokemon_v2/migrations/0016_typesprites.py @@ -1,7 +1,7 @@ # Generated by Django 3.2.23 on 2024-07-29 02:09 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/pokemon_v2/migrations/0020_add_regional_evolution_fields.py b/pokemon_v2/migrations/0020_add_regional_evolution_fields.py index 3834f8865..8f4f94737 100644 --- a/pokemon_v2/migrations/0020_add_regional_evolution_fields.py +++ b/pokemon_v2/migrations/0020_add_regional_evolution_fields.py @@ -1,7 +1,7 @@ # Generated migration for regional evolution metadata -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/pokemon_v2/migrations/0021_add_evolution_methods_and_fields.py b/pokemon_v2/migrations/0021_add_evolution_methods_and_fields.py index 65f59d430..bc19607be 100644 --- a/pokemon_v2/migrations/0021_add_evolution_methods_and_fields.py +++ b/pokemon_v2/migrations/0021_add_evolution_methods_and_fields.py @@ -1,7 +1,7 @@ # Generated by Django 3.2.25 on 2025-12-31 17:47 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/pokemon_v2/models.py b/pokemon_v2/models.py index 5fd7c2ae5..a583f853d 100644 --- a/pokemon_v2/models.py +++ b/pokemon_v2/models.py @@ -346,18 +346,14 @@ class Meta: class HasMoveEffect(models.Model): - move_effect = models.ForeignKey( - "MoveEffect", blank=True, null=True, on_delete=models.CASCADE - ) + move_effect = models.ForeignKey("MoveEffect", blank=True, null=True, on_delete=models.CASCADE) class Meta: abstract = True class HasMoveAttribute(models.Model): - move_attribute = models.ForeignKey( - "MoveAttribute", blank=True, null=True, on_delete=models.CASCADE - ) + move_attribute = models.ForeignKey("MoveAttribute", blank=True, null=True, on_delete=models.CASCADE) class Meta: abstract = True @@ -1009,9 +1005,7 @@ class BerryFlavorName(IsName): class BerryFlavorMap(models.Model): - berry = models.ForeignKey( - Berry, blank=True, null=True, related_name="%(class)s", on_delete=models.CASCADE - ) + berry = models.ForeignKey(Berry, blank=True, null=True, related_name="%(class)s", on_delete=models.CASCADE) berry_flavor = models.ForeignKey( BerryFlavor, @@ -1043,13 +1037,9 @@ class GrowthRateDescription(HasGrowthRate, IsDescription): class Nature(HasName): - decreased_stat = models.ForeignKey( - Stat, blank=True, null=True, related_name="decreased", on_delete=models.CASCADE - ) + decreased_stat = models.ForeignKey(Stat, blank=True, null=True, related_name="decreased", on_delete=models.CASCADE) - increased_stat = models.ForeignKey( - Stat, blank=True, null=True, related_name="increased", on_delete=models.CASCADE - ) + increased_stat = models.ForeignKey(Stat, blank=True, null=True, related_name="increased", on_delete=models.CASCADE) hates_flavor = models.ForeignKey( BerryFlavor, @@ -1141,9 +1131,7 @@ class EncounterSlot(HasVersionGroup, HasEncounterMethod): class Encounter(HasVersion, HasLocationArea, HasPokemon): - encounter_slot = models.ForeignKey( - EncounterSlot, blank=True, null=True, on_delete=models.CASCADE - ) + encounter_slot = models.ForeignKey(EncounterSlot, blank=True, null=True, on_delete=models.CASCADE) min_level = models.IntegerField() @@ -1173,9 +1161,7 @@ class EncounterConditionValueName(IsName): class EncounterConditionValueMap(models.Model): - encounter = models.ForeignKey( - Encounter, blank=True, null=True, on_delete=models.CASCADE - ) + encounter = models.ForeignKey(Encounter, blank=True, null=True, on_delete=models.CASCADE) encounter_condition_value = models.ForeignKey( EncounterConditionValue, blank=True, null=True, on_delete=models.CASCADE @@ -1411,9 +1397,7 @@ class Gender(HasName): class Machine(HasGrowthRate, HasItem): machine_number = models.IntegerField() - version_group = models.ForeignKey( - VersionGroup, blank=True, null=True, on_delete=models.CASCADE - ) + version_group = models.ForeignKey(VersionGroup, blank=True, null=True, on_delete=models.CASCADE) move = models.ForeignKey(Move, blank=True, null=True, on_delete=models.CASCADE) @@ -1478,13 +1462,9 @@ class SuperContestEffectFlavorText(IsFlavorText, HasSuperContestEffect): class SuperContestCombo(models.Model): - first_move = models.ForeignKey( - Move, blank=True, null=True, related_name="first", on_delete=models.CASCADE - ) + first_move = models.ForeignKey(Move, blank=True, null=True, related_name="first", on_delete=models.CASCADE) - second_move = models.ForeignKey( - Move, blank=True, null=True, related_name="second", on_delete=models.CASCADE - ) + second_move = models.ForeignKey(Move, blank=True, null=True, related_name="second", on_delete=models.CASCADE) ###################### @@ -1493,9 +1473,7 @@ class SuperContestCombo(models.Model): class EvolutionChain(models.Model): - baby_trigger_item = models.ForeignKey( - Item, blank=True, null=True, on_delete=models.CASCADE - ) + baby_trigger_item = models.ForeignKey(Item, blank=True, null=True, on_delete=models.CASCADE) class EvolutionTrigger(HasName): @@ -1532,16 +1510,10 @@ class PokedexVersionGroup(HasPokedex, HasVersionGroup): #################### -class PokemonSpecies( - HasName, HasGeneration, HasPokemonColor, HasPokemonShape, HasGrowthRate, HasOrder -): - evolves_from_species = models.ForeignKey( - "self", blank=True, null=True, on_delete=models.CASCADE - ) +class PokemonSpecies(HasName, HasGeneration, HasPokemonColor, HasPokemonShape, HasGrowthRate, HasOrder): + evolves_from_species = models.ForeignKey("self", blank=True, null=True, on_delete=models.CASCADE) - evolution_chain = models.ForeignKey( - EvolutionChain, blank=True, null=True, on_delete=models.CASCADE - ) + evolution_chain = models.ForeignKey(EvolutionChain, blank=True, null=True, on_delete=models.CASCADE) pokemon_habitat = models.ForeignKey( "PokemonHabitat", @@ -1648,15 +1620,11 @@ class PokemonEvolution(HasEvolutionTrigger, HasGender): on_delete=models.CASCADE, ) - held_item = models.ForeignKey( - Item, blank=True, null=True, related_name="held_item", on_delete=models.CASCADE - ) + held_item = models.ForeignKey(Item, blank=True, null=True, related_name="held_item", on_delete=models.CASCADE) time_of_day = models.CharField(max_length=10, blank=True, null=True) - known_move = models.ForeignKey( - Move, blank=True, null=True, on_delete=models.CASCADE - ) + known_move = models.ForeignKey(Move, blank=True, null=True, on_delete=models.CASCADE) known_move_type = models.ForeignKey( Type, related_name="known_move", blank=True, null=True, on_delete=models.CASCADE @@ -1678,9 +1646,7 @@ class PokemonEvolution(HasEvolutionTrigger, HasGender): on_delete=models.CASCADE, ) - party_type = models.ForeignKey( - Type, related_name="party_type", blank=True, null=True, on_delete=models.CASCADE - ) + party_type = models.ForeignKey(Type, related_name="party_type", blank=True, null=True, on_delete=models.CASCADE) trade_species = models.ForeignKey( PokemonSpecies, @@ -1714,9 +1680,7 @@ class PokemonEvolution(HasEvolutionTrigger, HasGender): help_text="Specific form required for evolution (null = any form)", ) - used_move = models.ForeignKey( - Move, related_name="used_move", blank=True, null=True, on_delete=models.CASCADE - ) + used_move = models.ForeignKey(Move, related_name="used_move", blank=True, null=True, on_delete=models.CASCADE) min_move_count = models.IntegerField(blank=True, null=True) @@ -1728,9 +1692,7 @@ class PokemonEvolution(HasEvolutionTrigger, HasGender): class PokemonForm(HasName, HasPokemon, HasOrder): form_name = models.CharField(max_length=30) - version_group = models.ForeignKey( - VersionGroup, blank=True, null=True, on_delete=models.CASCADE - ) + version_group = models.ForeignKey(VersionGroup, blank=True, null=True, on_delete=models.CASCADE) is_default = models.BooleanField(default=False) diff --git a/pokemon_v2/serializers.py b/pokemon_v2/serializers.py index 766e2f25c..7029977b5 100644 --- a/pokemon_v2/serializers.py +++ b/pokemon_v2/serializers.py @@ -1,13 +1,158 @@ from collections import OrderedDict + from django.urls import reverse -from rest_framework import serializers from drf_spectacular.utils import extend_schema_field - -# pylint: disable=redefined-builtin +from rest_framework import serializers # PokeAPI v2 serializers in order of dependency - -from .models import * +from .models import ( + Ability, + AbilityChange, + AbilityChangeEffectText, + AbilityEffectText, + AbilityFlavorText, + AbilityName, + Berry, + BerryFirmness, + BerryFirmnessName, + BerryFlavor, + BerryFlavorMap, + BerryFlavorName, + Characteristic, + CharacteristicDescription, + ContestCombo, + ContestEffect, + ContestEffectEffectText, + ContestEffectFlavorText, + ContestType, + ContestTypeName, + EggGroup, + EggGroupName, + Encounter, + EncounterCondition, + EncounterConditionName, + EncounterConditionValue, + EncounterConditionValueMap, + EncounterConditionValueName, + EncounterMethod, + EncounterMethodName, + EncounterSlot, + EvolutionChain, + EvolutionTrigger, + EvolutionTriggerName, + Experience, + Gender, + Generation, + GenerationName, + GrowthRate, + GrowthRateDescription, + Item, + ItemAttribute, + ItemAttributeDescription, + ItemAttributeMap, + ItemAttributeName, + ItemCategory, + ItemEffectText, + ItemFlavorText, + ItemFlingEffect, + ItemFlingEffectEffectText, + ItemGameIndex, + ItemName, + ItemPocket, + ItemSprites, + Language, + LanguageName, + Location, + LocationArea, + LocationAreaEncounterRate, + LocationAreaName, + LocationGameIndex, + LocationName, + Machine, + Move, + MoveBattleStyle, + MoveBattleStyleName, + MoveChange, + MoveDamageClass, + MoveDamageClassDescription, + MoveDamageClassName, + MoveEffectChange, + MoveEffectChangeEffectText, + MoveEffectEffectText, + MoveFlavorText, + MoveLearnMethod, + MoveLearnMethodDescription, + MoveLearnMethodName, + MoveMeta, + MoveMetaAilment, + MoveMetaAilmentName, + MoveMetaCategory, + MoveMetaCategoryDescription, + MoveMetaStatChange, + MoveTarget, + MoveTargetDescription, + MoveTargetName, + Nature, + NatureBattleStylePreference, + NatureName, + NaturePokeathlonStat, + PalPark, + PalParkArea, + PalParkAreaName, + PokeathlonStat, + PokeathlonStatName, + Pokedex, + PokedexDescription, + PokedexName, + PokedexVersionGroup, + Pokemon, + PokemonAbility, + PokemonAbilityPast, + PokemonColor, + PokemonColorName, + PokemonCries, + PokemonDexNumber, + PokemonEggGroup, + PokemonEvolution, + PokemonForm, + PokemonFormName, + PokemonFormSprites, + PokemonFormType, + PokemonGameIndex, + PokemonHabitat, + PokemonHabitatName, + PokemonItem, + PokemonMove, + PokemonShape, + PokemonShapeName, + PokemonSpecies, + PokemonSpeciesDescription, + PokemonSpeciesFlavorText, + PokemonSpeciesName, + PokemonSprites, + PokemonStat, + PokemonStatPast, + PokemonType, + PokemonTypePast, + Region, + RegionName, + Stat, + StatName, + SuperContestCombo, + SuperContestEffect, + SuperContestEffectFlavorText, + Type, + TypeEfficacy, + TypeEfficacyPast, + TypeGameIndex, + TypeName, + TypeSprites, + Version, + VersionGroup, + VersionGroupMoveLearnMethod, + VersionGroupRegion, + VersionName, +) ######################### # SUMMARY SERIALIZERS # @@ -436,9 +581,7 @@ class Meta: class EncounterConditionValueMapSerializer(serializers.ModelSerializer): - condition_value = EncounterConditionValueSummarySerializer( - source="encounter_condition_value" - ) + condition_value = EncounterConditionValueSummarySerializer(source="encounter_condition_value") class Meta: model = EncounterConditionValueMap @@ -459,9 +602,7 @@ class Meta: class CharacteristicDetailSerializer(serializers.ModelSerializer): - descriptions = CharacteristicDescriptionSerializer( - many=True, read_only=True, source="characteristicdescription" - ) + descriptions = CharacteristicDescriptionSerializer(many=True, read_only=True, source="characteristicdescription") highest_stat = StatSummarySerializer(source="stat") gene_modulo = serializers.IntegerField(source="gene_mod_5") possible_values = serializers.SerializerMethodField("get_values") @@ -537,12 +678,8 @@ class Meta: class ContestEffectDetailSerializer(serializers.ModelSerializer): - effect_entries = ContestEffectEffectTextSerializer( - many=True, read_only=True, source="contesteffecteffecttext" - ) - flavor_text_entries = ContestEffectFlavorTextSerializer( - many=True, read_only=True, source="contesteffectflavortext" - ) + effect_entries = ContestEffectEffectTextSerializer(many=True, read_only=True, source="contesteffecteffecttext") + flavor_text_entries = ContestEffectFlavorTextSerializer(many=True, read_only=True, source="contesteffectflavortext") class Meta: model = ContestEffect @@ -558,9 +695,7 @@ class Meta: class ContestTypeDetailSerializer(serializers.ModelSerializer): - names = ContestTypeNameSerializer( - many=True, read_only=True, source="contesttypename" - ) + names = ContestTypeNameSerializer(many=True, read_only=True, source="contesttypename") berry_flavor = BerryFlavorSummarySerializer(read_only=True, source="berryflavor") class Meta: @@ -637,9 +772,7 @@ class Meta: ) def get_region_version_groups(self, obj): vg_regions = VersionGroupRegion.objects.filter(region=obj) - data = VersionGroupRegionSerializer( - vg_regions, many=True, context=self.context - ).data + data = VersionGroupRegionSerializer(vg_regions, many=True, context=self.context).data groups = [] for group in data: @@ -666,13 +799,9 @@ class GenerationDetailSerializer(serializers.ModelSerializer): names = GenerationNameSerializer(many=True, read_only=True, source="generationname") abilities = AbilitySummarySerializer(many=True, read_only=True, source="ability") moves = MoveSummarySerializer(many=True, read_only=True, source="move") - pokemon_species = PokemonSpeciesSummarySerializer( - many=True, read_only=True, source="pokemonspecies" - ) + pokemon_species = PokemonSpeciesSummarySerializer(many=True, read_only=True, source="pokemonspecies") types = TypeSummarySerializer(many=True, read_only=True, source="type") - version_groups = VersionGroupSummarySerializer( - many=True, read_only=True, source="versiongroup" - ) + version_groups = VersionGroupSummarySerializer(many=True, read_only=True, source="versiongroup") class Meta: model = Generation @@ -718,9 +847,7 @@ class Meta: "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/pokemon-species/1/" - ], + "examples": ["https://pokeapi.co/api/v2/pokemon-species/1/"], }, }, }, @@ -743,9 +870,7 @@ def get_species(self, obj): for species in species_objects: detail = OrderedDict() detail["rate"] = species.gender_rate - detail["pokemon_species"] = PokemonSpeciesSummarySerializer( - species, context=self.context - ).data + detail["pokemon_species"] = PokemonSpeciesSummarySerializer(species, context=self.context).data details.append(detail) return details @@ -772,9 +897,7 @@ def get_required(self, obj): species_list = [] for evo in evo_objects: - species = PokemonSpeciesSummarySerializer( - evo.evolved_species, context=self.context - ).data + species = PokemonSpeciesSummarySerializer(evo.evolved_species, context=self.context).data species_list.append(species) return species_list @@ -800,13 +923,9 @@ class Meta: class GrowthRateDetailSerializer(serializers.ModelSerializer): - descriptions = GrowthRateDescriptionSerializer( - many=True, read_only=True, source="growthratedescription" - ) + descriptions = GrowthRateDescriptionSerializer(many=True, read_only=True, source="growthratedescription") levels = ExperienceSerializer(many=True, read_only=True, source="experience") - pokemon_species = PokemonSpeciesSummarySerializer( - many=True, read_only=True, source="pokemonspecies" - ) + pokemon_species = PokemonSpeciesSummarySerializer(many=True, read_only=True, source="pokemonspecies") class Meta: model = GrowthRate @@ -827,9 +946,7 @@ class Meta: class LanguageDetailSerializer(serializers.ModelSerializer): - names = LanguageNameSerializer( - many=True, read_only=True, source="languagename_language" - ) + names = LanguageNameSerializer(many=True, read_only=True, source="languagename_language") class Meta: model = Language @@ -850,12 +967,8 @@ class Meta: class EncounterConditionDetailSerializer(serializers.ModelSerializer): - names = EncounterConditionNameSerializer( - many=True, read_only=True, source="encounterconditionname" - ) - values = EncounterConditionValueSummarySerializer( - many=True, read_only=True, source="encounterconditionvalue" - ) + names = EncounterConditionNameSerializer(many=True, read_only=True, source="encounterconditionname") + values = EncounterConditionValueSummarySerializer(many=True, read_only=True, source="encounterconditionvalue") class Meta: model = EncounterCondition @@ -872,9 +985,7 @@ class Meta: class EncounterConditionValueDetailSerializer(serializers.ModelSerializer): condition = EncounterConditionSummarySerializer(source="encounter_condition") - names = EncounterConditionValueNameSerializer( - many=True, read_only=True, source="encounterconditionvaluename" - ) + names = EncounterConditionValueNameSerializer(many=True, read_only=True, source="encounterconditionvaluename") class Meta: model = EncounterConditionValue @@ -890,9 +1001,7 @@ class Meta: class EncounterMethodDetailSerializer(serializers.ModelSerializer): - names = EncounterMethodNameSerializer( - many=True, read_only=True, source="encountermethodname" - ) + names = EncounterMethodNameSerializer(many=True, read_only=True, source="encountermethodname") class Meta: model = EncounterMethod @@ -928,9 +1037,7 @@ class Meta: def get_encounter_conditions(self, obj): condition_values = EncounterConditionValueMap.objects.filter(encounter=obj) - data = EncounterConditionValueMapSerializer( - condition_values, many=True, context=self.context - ).data + data = EncounterConditionValueMapSerializer(condition_values, many=True, context=self.context).data values = [] for map in data: @@ -960,9 +1067,7 @@ class LocationAreaDetailSerializer(serializers.ModelSerializer): location = LocationSummarySerializer() encounter_method_rates = serializers.SerializerMethodField("get_method_rates") pokemon_encounters = serializers.SerializerMethodField("get_encounters") - names = LocationAreaNameSerializer( - many=True, read_only=True, source="locationareaname" - ) + names = LocationAreaNameSerializer(many=True, read_only=True, source="locationareaname") class Meta: model = LocationArea @@ -991,9 +1096,7 @@ class Meta: "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/encounter-method/2/" - ], + "examples": ["https://pokeapi.co/api/v2/encounter-method/2/"], }, }, }, @@ -1019,9 +1122,7 @@ class Meta: "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/version/14/" - ], + "examples": ["https://pokeapi.co/api/v2/version/14/"], }, }, }, @@ -1034,9 +1135,7 @@ class Meta: ) def get_method_rates(self, obj): # Get encounters related to this area and pull out unique encounter methods - encounter_rates = LocationAreaEncounterRate.objects.filter( - location_area=obj - ).order_by("encounter_method_id") + encounter_rates = LocationAreaEncounterRate.objects.filter(location_area=obj).order_by("encounter_method_id") method_ids = encounter_rates.values("encounter_method_id").distinct() encounter_rate_list = [] @@ -1044,21 +1143,13 @@ def get_method_rates(self, obj): encounter_rate_details = OrderedDict() # Get each Unique Item by ID - encounter_method_object = EncounterMethod.objects.get( - pk=id["encounter_method_id"] - ) - encounter_method_data = EncounterMethodSummarySerializer( - encounter_method_object, context=self.context - ).data + encounter_method_object = EncounterMethod.objects.get(pk=id["encounter_method_id"]) + encounter_method_data = EncounterMethodSummarySerializer(encounter_method_object, context=self.context).data encounter_rate_details["encounter_method"] = encounter_method_data # Get Versions associated with each unique item - area_encounter_objects = encounter_rates.filter( - encounter_method_id=id["encounter_method_id"] - ) - serializer = LocationAreaEncounterRateSerializer( - area_encounter_objects, many=True, context=self.context - ) + area_encounter_objects = encounter_rates.filter(encounter_method_id=id["encounter_method_id"]) + serializer = LocationAreaEncounterRateSerializer(area_encounter_objects, many=True, context=self.context) encounter_rate_details["version_details"] = [] for area_encounter in serializer.data: @@ -1109,9 +1200,7 @@ def get_method_rates(self, obj): "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/version/12/" - ], + "examples": ["https://pokeapi.co/api/v2/version/12/"], }, }, }, @@ -1173,9 +1262,7 @@ def get_method_rates(self, obj): "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/encounter-method/5/" - ], + "examples": ["https://pokeapi.co/api/v2/encounter-method/5/"], }, }, }, @@ -1191,9 +1278,7 @@ def get_method_rates(self, obj): def get_encounters(self, obj): # get versions for later use version_objects = Version.objects.all() - version_data = VersionSummarySerializer( - version_objects, many=True, context=self.context - ).data + version_data = VersionSummarySerializer(version_objects, many=True, context=self.context).data # all encounters associated with location area all_encounters = Encounter.objects.filter(location_area=obj).order_by("pokemon") @@ -1204,14 +1289,10 @@ def get_encounters(self, obj): pokemon_object = Pokemon.objects.get(pk=poke["pokemon"]) pokemon_detail = OrderedDict() - pokemon_detail["pokemon"] = PokemonSummarySerializer( - pokemon_object, context=self.context - ).data + pokemon_detail["pokemon"] = PokemonSummarySerializer(pokemon_object, context=self.context).data pokemon_detail["version_details"] = [] - poke_encounters = all_encounters.filter(pokemon=poke["pokemon"]).order_by( - "version" - ) + poke_encounters = all_encounters.filter(pokemon=poke["pokemon"]).order_by("version") # each pokemon has multiple versions it could be encountered in for ver in poke_encounters.values("version").distinct(): @@ -1266,12 +1347,8 @@ class Meta: class LocationDetailSerializer(serializers.ModelSerializer): region = RegionSummarySerializer() names = LocationNameSerializer(many=True, read_only=True, source="locationname") - game_indices = LocationGameIndexSerializer( - many=True, read_only=True, source="locationgameindex" - ) - areas = LocationAreaSummarySerializer( - many=True, read_only=True, source="locationarea" - ) + game_indices = LocationGameIndexSerializer(many=True, read_only=True, source="locationgameindex") + areas = LocationAreaSummarySerializer(many=True, read_only=True, source="locationarea") class Meta: model = Location @@ -1314,9 +1391,7 @@ class Meta: class AbilityChangeSerializer(serializers.ModelSerializer): version_group = VersionGroupSummarySerializer() - effect_entries = AbilityChangeEffectTextSerializer( - many=True, read_only=True, source="abilitychangeeffecttext" - ) + effect_entries = AbilityChangeEffectTextSerializer(many=True, read_only=True, source="abilitychangeeffecttext") class Meta: model = AbilityChange @@ -1332,17 +1407,11 @@ class Meta: class AbilityDetailSerializer(serializers.ModelSerializer): - effect_entries = AbilityEffectTextSerializer( - many=True, read_only=True, source="abilityeffecttext" - ) - flavor_text_entries = AbilityFlavorTextSerializer( - many=True, read_only=True, source="abilityflavortext" - ) + effect_entries = AbilityEffectTextSerializer(many=True, read_only=True, source="abilityeffecttext") + flavor_text_entries = AbilityFlavorTextSerializer(many=True, read_only=True, source="abilityflavortext") names = AbilityNameSerializer(many=True, read_only=True, source="abilityname") generation = GenerationSummarySerializer() - effect_changes = AbilityChangeSerializer( - many=True, read_only=True, source="abilitychange" - ) + effect_changes = AbilityChangeSerializer(many=True, read_only=True, source="abilitychange") pokemon = serializers.SerializerMethodField("get_ability_pokemon") class Meta: @@ -1386,9 +1455,7 @@ class Meta: ) def get_ability_pokemon(self, obj): pokemon_ability_objects = PokemonAbility.objects.filter(ability=obj) - data = PokemonAbilitySerializer( - pokemon_ability_objects, many=True, context=self.context - ).data + data = PokemonAbilitySerializer(pokemon_ability_objects, many=True, context=self.context).data pokemon = [] for poke in data: @@ -1414,9 +1481,7 @@ class Meta: class StatDetailSerializer(serializers.ModelSerializer): names = StatNameSerializer(many=True, read_only=True, source="statname") move_damage_class = MoveDamageClassSummarySerializer() - characteristics = CharacteristicSummarySerializer( - many=True, read_only=True, source="characteristic" - ) + characteristics = CharacteristicSummarySerializer(many=True, read_only=True, source="characteristic") affecting_moves = serializers.SerializerMethodField("get_moves_that_affect") affecting_natures = serializers.SerializerMethodField("get_natures_that_affect") affecting_items = serializers.SerializerMethodField("get_items_that_affect") @@ -1463,9 +1528,7 @@ class Meta: "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/move/14/" - ], + "examples": ["https://pokeapi.co/api/v2/move/14/"], }, }, }, @@ -1491,9 +1554,7 @@ class Meta: "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/move/45/" - ], + "examples": ["https://pokeapi.co/api/v2/move/45/"], }, }, }, @@ -1505,9 +1566,7 @@ class Meta: ) def get_moves_that_affect(self, obj): stat_change_objects = MoveMetaStatChange.objects.filter(stat=obj) - stat_changes = MoveMetaStatChangeSerializer( - stat_change_objects, many=True, context=self.context - ).data + stat_changes = MoveMetaStatChangeSerializer(stat_change_objects, many=True, context=self.context).data changes = OrderedDict([("increase", []), ("decrease", [])]) for change in stat_changes: @@ -1559,13 +1618,9 @@ def get_moves_that_affect(self, obj): ) def get_natures_that_affect(self, obj): increase_objects = Nature.objects.filter(increased_stat=obj) - increases = NatureSummarySerializer( - increase_objects, many=True, context=self.context - ).data + increases = NatureSummarySerializer(increase_objects, many=True, context=self.context).data decrease_objects = Nature.objects.filter(decreased_stat=obj) - decreases = NatureSummarySerializer( - decrease_objects, many=True, context=self.context - ).data + decreases = NatureSummarySerializer(decrease_objects, many=True, context=self.context).data return OrderedDict([("increase", increases), ("decrease", decreases)]) @@ -1614,9 +1669,7 @@ def get_items_that_affect(self, obj): for item_identifier in stat_item_mapping[stat_name]: try: item = Item.objects.get(name=item_identifier) - affecting_items.append( - ItemSummarySerializer(item, context=self.context).data - ) + affecting_items.append(ItemSummarySerializer(item, context=self.context).data) except Item.DoesNotExist: pass @@ -1635,9 +1688,7 @@ def get_items_that_affect(self, obj): for item_identifier in x_item_mapping[stat_name]: try: item = Item.objects.get(name=item_identifier) - affecting_items.append( - ItemSummarySerializer(item, context=self.context).data - ) + affecting_items.append(ItemSummarySerializer(item, context=self.context).data) except Item.DoesNotExist: pass @@ -1659,9 +1710,7 @@ class Meta: class ItemPocketDetailSerializer(serializers.ModelSerializer): names = ItemPocketNameSerializer(many=True, read_only=True, source="itempocketname") - categories = ItemCategorySummarySerializer( - many=True, read_only=True, source="itemcategory" - ) + categories = ItemCategorySummarySerializer(many=True, read_only=True, source="itemcategory") class Meta: model = ItemPocket @@ -1680,9 +1729,7 @@ class Meta: class ItemCategoryDetailSerializer(serializers.ModelSerializer): - names = ItemCategoryNameSerializer( - many=True, read_only=True, source="itemcategoryname" - ) + names = ItemCategoryNameSerializer(many=True, read_only=True, source="itemcategoryname") pocket = ItemPocketSummarySerializer(source="item_pocket") items = ItemSummarySerializer(many=True, read_only=True, source="item") @@ -1713,12 +1760,8 @@ class Meta: class ItemAttributeDetailSerializer(serializers.ModelSerializer): - names = ItemAttributeNameSerializer( - many=True, read_only=True, source="itemattributename" - ) - descriptions = ItemAttributeDescriptionSerializer( - many=True, read_only=True, source="itemattributedescription" - ) + names = ItemAttributeNameSerializer(many=True, read_only=True, source="itemattributename") + descriptions = ItemAttributeDescriptionSerializer(many=True, read_only=True, source="itemattributedescription") items = serializers.SerializerMethodField("get_attribute_items") class Meta: @@ -1766,9 +1809,7 @@ class Meta: class ItemFlingEffectDetailSerializer(serializers.ModelSerializer): - effect_entries = ItemFlingEffectEffectTextSerializer( - many=True, read_only=True, source="itemflingeffecteffecttext" - ) + effect_entries = ItemFlingEffectEffectTextSerializer(many=True, read_only=True, source="itemflingeffecteffecttext") items = ItemSummarySerializer(many=True, read_only=True, source="item") class Meta: @@ -1821,15 +1862,9 @@ class Meta: class ItemDetailSerializer(serializers.ModelSerializer): names = ItemNameSerializer(many=True, read_only=True, source="itemname") - game_indices = ItemGameIndexSerializer( - many=True, read_only=True, source="itemgameindex" - ) - effect_entries = ItemEffectTextSerializer( - many=True, read_only=True, source="itemeffecttext" - ) - flavor_text_entries = ItemFlavorTextSerializer( - many=True, read_only=True, source="itemflavortext" - ) + game_indices = ItemGameIndexSerializer(many=True, read_only=True, source="itemgameindex") + effect_entries = ItemEffectTextSerializer(many=True, read_only=True, source="itemeffecttext") + flavor_text_entries = ItemFlavorTextSerializer(many=True, read_only=True, source="itemflavortext") category = ItemCategorySummarySerializer(source="item_category") attributes = serializers.SerializerMethodField("get_item_attributes") fling_effect = ItemFlingEffectSummarySerializer(source="item_fling_effect") @@ -1878,9 +1913,7 @@ class Meta: "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/version-group/20/" - ], + "examples": ["https://pokeapi.co/api/v2/version-group/20/"], }, }, }, @@ -1894,17 +1927,11 @@ def get_item_machines(self, obj): machines = [] for machine_object in machine_objects: - machine_data = MachineSummarySerializer( - machine_object, context=self.context - ).data + machine_data = MachineSummarySerializer(machine_object, context=self.context).data - version_group_data = VersionGroupSummarySerializer( - machine_object.version_group, context=self.context - ).data + version_group_data = VersionGroupSummarySerializer(machine_object.version_group, context=self.context).data - machines.append( - {"machine": machine_data, "version_group": version_group_data} - ) + machines.append({"machine": machine_data, "version_group": version_group_data}) return machines @@ -1916,9 +1943,7 @@ def get_item_machines(self, obj): "default": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/media/sprites/items/master-ball.png" - ], + "examples": ["https://pokeapi.co/media/sprites/items/master-ball.png"], } }, } @@ -1946,9 +1971,7 @@ def get_item_sprites(self, obj): ) def get_item_attributes(self, obj): item_attribute_maps = ItemAttributeMap.objects.filter(item=obj) - serializer = ItemAttributeMapSerializer( - item_attribute_maps, many=True, context=self.context - ) + serializer = ItemAttributeMapSerializer(item_attribute_maps, many=True, context=self.context) data = serializer.data attributes = [] @@ -2002,9 +2025,7 @@ def get_item_attributes(self, obj): "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/version/7/" - ], + "examples": ["https://pokeapi.co/api/v2/version/7/"], }, }, }, @@ -2025,16 +2046,12 @@ def get_held_by_pokemon(self, obj): # Get each Unique Item by ID pokemon_object = Pokemon.objects.get(pk=id["pokemon_id"]) - pokemon_data = PokemonSummarySerializer( - pokemon_object, context=self.context - ).data + pokemon_data = PokemonSummarySerializer(pokemon_object, context=self.context).data item_pokemon_details["pokemon"] = pokemon_data # Get Versions associated with each unique item pokemon_item_objects = pokemon_items.filter(pokemon_id=id["pokemon_id"]) - serializer = PokemonItemSerializer( - pokemon_item_objects, many=True, context=self.context - ) + serializer = PokemonItemSerializer(pokemon_item_objects, many=True, context=self.context) item_pokemon_details["version_details"] = [] for pokemon in serializer.data: @@ -2063,9 +2080,7 @@ def get_held_by_pokemon(self, obj): def get_baby_trigger_for(self, obj): try: chain_object = EvolutionChain.objects.get(baby_trigger_item=obj) - data = EvolutionChainSummarySerializer( - chain_object, context=self.context - ).data + data = EvolutionChainSummarySerializer(chain_object, context=self.context).data except EvolutionChain.DoesNotExist: data = None @@ -2144,9 +2159,7 @@ class Meta: "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/pokeathlon-stat/2/" - ], + "examples": ["https://pokeapi.co/api/v2/pokeathlon-stat/2/"], }, }, }, @@ -2156,9 +2169,7 @@ class Meta: ) def get_pokeathlon_stats(self, obj): pokeathlon_stat_objects = NaturePokeathlonStat.objects.filter(nature=obj) - pokeathlon_stats = NaturePokeathlonStatSerializer( - pokeathlon_stat_objects, many=True, context=self.context - ).data + pokeathlon_stats = NaturePokeathlonStatSerializer(pokeathlon_stat_objects, many=True, context=self.context).data for stat in pokeathlon_stats: del stat["nature"] @@ -2180,9 +2191,7 @@ class Meta: class BerryFirmnessDetailSerializer(serializers.ModelSerializer): - names = BerryFirmnessNameSerializer( - many=True, read_only=True, source="berryfirmnessname" - ) + names = BerryFirmnessNameSerializer(many=True, read_only=True, source="berryfirmnessname") berries = BerrySummarySerializer(many=True, read_only=True, source="berry") class Meta: @@ -2199,9 +2208,7 @@ class Meta: class BerryFlavorDetailSerializer(serializers.ModelSerializer): - names = BerryFlavorNameSerializer( - many=True, read_only=True, source="berryflavorname" - ) + names = BerryFlavorNameSerializer(many=True, read_only=True, source="berryflavorname") contest_type = ContestTypeSummarySerializer() berries = serializers.SerializerMethodField("get_berries_with_flavor") @@ -2239,12 +2246,8 @@ class Meta: } ) def get_berries_with_flavor(self, obj): - flavor_map_objects = BerryFlavorMap.objects.filter( - berry_flavor=obj, potency__gt=0 - ).order_by("potency") - flavor_maps = BerryFlavorMapSerializer( - flavor_map_objects, many=True, context=self.context - ).data + flavor_map_objects = BerryFlavorMap.objects.filter(berry_flavor=obj, potency__gt=0).order_by("potency") + flavor_maps = BerryFlavorMapSerializer(flavor_map_objects, many=True, context=self.context).data for map in flavor_maps: del map["flavor"] @@ -2296,9 +2299,7 @@ class Meta: "type": "string", "format": "uri", "description": "The URL to get more information about the flavor", - "examples": [ - "https://pokeapi.co/api/v2/berry-flavor/1/" - ], + "examples": ["https://pokeapi.co/api/v2/berry-flavor/1/"], }, }, }, @@ -2308,9 +2309,7 @@ class Meta: ) def get_berry_flavors(self, obj): flavor_map_objects = BerryFlavorMap.objects.filter(berry=obj) - flavor_maps = BerryFlavorMapSerializer( - flavor_map_objects, many=True, context=self.context - ).data + flavor_maps = BerryFlavorMapSerializer(flavor_map_objects, many=True, context=self.context).data flavors = [] for map in flavor_maps: @@ -2427,14 +2426,10 @@ class TypeDetailSerializer(serializers.ModelSerializer): generation = GenerationSummarySerializer() names = AbilityNameSerializer(many=True, read_only=True, source="typename") - game_indices = TypeGameIndexSerializer( - many=True, read_only=True, source="typegameindex" - ) + game_indices = TypeGameIndexSerializer(many=True, read_only=True, source="typegameindex") move_damage_class = MoveDamageClassSummarySerializer() damage_relations = serializers.SerializerMethodField("get_type_relationships") - past_damage_relations = serializers.SerializerMethodField( - "get_type_past_relationships" - ) + past_damage_relations = serializers.SerializerMethodField("get_type_past_relationships") pokemon = serializers.SerializerMethodField("get_type_pokemon") moves = MoveSummarySerializer(many=True, read_only=True, source="move") sprites = serializers.SerializerMethodField("get_type_sprites") @@ -2523,17 +2518,11 @@ def get_type_sprites(self, obj): def add_type_entry(self, relations, type, damage_factor, direction="_damage_to"): if damage_factor == 200: - relations["double" + direction].append( - TypeSummarySerializer(type, context=self.context).data - ) + relations["double" + direction].append(TypeSummarySerializer(type, context=self.context).data) elif damage_factor == 50: - relations["half" + direction].append( - TypeSummarySerializer(type, context=self.context).data - ) + relations["half" + direction].append(TypeSummarySerializer(type, context=self.context).data) elif damage_factor == 0: - relations["no" + direction].append( - TypeSummarySerializer(type, context=self.context).data - ) + relations["no" + direction].append(TypeSummarySerializer(type, context=self.context).data) @extend_schema_field( field={ @@ -2666,9 +2655,7 @@ def get_type_relationships(self, obj): for relation in serializer.data: type = Type.objects.get(pk=relation["damage_type"]) damage_factor = relation["damage_factor"] - self.add_type_entry( - relations, type, damage_factor, direction="_damage_from" - ) + self.add_type_entry(relations, type, damage_factor, direction="_damage_from") return relations @@ -2747,9 +2734,7 @@ def remove_type_entry(self, relations, type, direction="_damage_to"): "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/type/3/" - ], + "examples": ["https://pokeapi.co/api/v2/type/3/"], }, }, }, @@ -2764,9 +2749,7 @@ def remove_type_entry(self, relations, type, direction="_damage_to"): "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/type/7/" - ], + "examples": ["https://pokeapi.co/api/v2/type/7/"], }, }, }, @@ -2784,9 +2767,7 @@ def remove_type_entry(self, relations, type, direction="_damage_to"): "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/type/4/" - ], + "examples": ["https://pokeapi.co/api/v2/type/4/"], }, }, }, @@ -2804,9 +2785,7 @@ def remove_type_entry(self, relations, type, direction="_damage_to"): "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/type/13/" - ], + "examples": ["https://pokeapi.co/api/v2/type/13/"], }, }, }, @@ -2824,9 +2803,7 @@ def remove_type_entry(self, relations, type, direction="_damage_to"): "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/type/4/" - ], + "examples": ["https://pokeapi.co/api/v2/type/4/"], }, }, }, @@ -2844,9 +2821,7 @@ def remove_type_entry(self, relations, type, direction="_damage_to"): "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/type/11/" - ], + "examples": ["https://pokeapi.co/api/v2/type/11/"], }, }, }, @@ -2887,24 +2862,12 @@ def get_type_past_relationships(self, obj): # remove types not yet introduced # e.g. Poison has no effect on Steel, but Steel was not present in generation I # so it should be absent from the list - relations["no_damage_to"] = self.remove_newer_types( - relations["no_damage_to"], current_gen - ) - relations["half_damage_to"] = self.remove_newer_types( - relations["half_damage_to"], current_gen - ) - relations["double_damage_to"] = self.remove_newer_types( - relations["double_damage_to"], current_gen - ) - relations["no_damage_from"] = self.remove_newer_types( - relations["no_damage_from"], current_gen - ) - relations["half_damage_from"] = self.remove_newer_types( - relations["half_damage_from"], current_gen - ) - relations["double_damage_from"] = self.remove_newer_types( - relations["double_damage_from"], current_gen - ) + relations["no_damage_to"] = self.remove_newer_types(relations["no_damage_to"], current_gen) + relations["half_damage_to"] = self.remove_newer_types(relations["half_damage_to"], current_gen) + relations["double_damage_to"] = self.remove_newer_types(relations["double_damage_to"], current_gen) + relations["no_damage_from"] = self.remove_newer_types(relations["no_damage_from"], current_gen) + relations["half_damage_from"] = self.remove_newer_types(relations["half_damage_from"], current_gen) + relations["double_damage_from"] = self.remove_newer_types(relations["double_damage_from"], current_gen) # populate offensive relations results = list(filter(lambda x: x["damage_type"] == obj.id, gen_data)) @@ -2916,9 +2879,7 @@ def get_type_past_relationships(self, obj): # add entry damage_factor = relation["damage_factor"] - self.add_type_entry( - relations, type, damage_factor, direction="_damage_to" - ) + self.add_type_entry(relations, type, damage_factor, direction="_damage_to") del relation["generation"] @@ -2932,9 +2893,7 @@ def get_type_past_relationships(self, obj): # add entry damage_factor = relation["damage_factor"] - self.add_type_entry( - relations, type, damage_factor, direction="_damage_from" - ) + self.add_type_entry(relations, type, damage_factor, direction="_damage_from") del relation["generation"] @@ -2982,9 +2941,7 @@ def type_is_present(self, type, current_gen): ) def get_type_pokemon(self, obj): poke_type_objects = PokemonType.objects.filter(type=obj) - poke_types = PokemonTypeSerializer( - poke_type_objects, many=True, context=self.context - ).data + poke_types = PokemonTypeSerializer(poke_type_objects, many=True, context=self.context).data for poke_type in poke_types: del poke_type["type"] @@ -3017,9 +2974,7 @@ class Meta: class MoveBattleStyleDetailSerializer(serializers.ModelSerializer): - names = MoveBattleStyleNameSerializer( - many=True, read_only=True, source="movebattlestylename" - ) + names = MoveBattleStyleNameSerializer(many=True, read_only=True, source="movebattlestylename") class Meta: model = MoveBattleStyle @@ -3046,12 +3001,8 @@ class Meta: class MoveDamageClassDetailSerializer(serializers.ModelSerializer): - names = MoveDamageClassNameSerializer( - many=True, read_only=True, source="movedamageclassname" - ) - descriptions = MoveDamageClassDescriptionSerializer( - many=True, read_only=True, source="movedamageclassdescription" - ) + names = MoveDamageClassNameSerializer(many=True, read_only=True, source="movedamageclassname") + descriptions = MoveDamageClassDescriptionSerializer(many=True, read_only=True, source="movedamageclassdescription") moves = MoveSummarySerializer(many=True, read_only=True, source="move") class Meta: @@ -3077,9 +3028,7 @@ class Meta: class MoveMetaAilmentDetailSerializer(serializers.ModelSerializer): - names = MoveMetaAilmentNameSerializer( - many=True, read_only=True, source="movemetaailmentname" - ) + names = MoveMetaAilmentNameSerializer(many=True, read_only=True, source="movemetaailmentname") moves = serializers.SerializerMethodField("get_ailment_moves") class Meta: @@ -3205,9 +3154,7 @@ class Meta: class MoveTargetDetailSerializer(serializers.ModelSerializer): names = MoveTargetNameSerializer(many=True, read_only=True, source="movetargetname") - descriptions = MoveTargetDescriptionSerializer( - many=True, read_only=True, source="movetargetdescription" - ) + descriptions = MoveTargetDescriptionSerializer(many=True, read_only=True, source="movetargetdescription") moves = MoveSummarySerializer(many=True, read_only=True, source="move") class Meta: @@ -3253,15 +3200,11 @@ class Meta: "properties": { "effect": { "type": "string", - "examples": [ - "Inflicts [regular damage]{mechanic:regular-damage}." - ], + "examples": ["Inflicts [regular damage]{mechanic:regular-damage}."], }, "short_effect": { "type": "string", - "examples": [ - "Inflicts regular damage with no additional effect." - ], + "examples": ["Inflicts regular damage with no additional effect."], }, "language": { "type": "object", @@ -3281,9 +3224,7 @@ class Meta: ) def get_effects(self, obj): effect_texts = MoveEffectEffectText.objects.filter(move_effect=obj.move_effect) - data = MoveEffectEffectTextSerializer( - effect_texts, many=True, context=self.context - ).data + data = MoveEffectEffectTextSerializer(effect_texts, many=True, context=self.context).data return data @@ -3342,9 +3283,7 @@ class MoveDetailSerializer(serializers.ModelSerializer): past_values = MoveChangeSerializer(many=True, read_only=True, source="movechange") effect_changes = serializers.SerializerMethodField("get_effect_change_text") machines = serializers.SerializerMethodField("get_move_machines") - flavor_text_entries = MoveFlavorTextSerializer( - many=True, read_only=True, source="moveflavortext" - ) + flavor_text_entries = MoveFlavorTextSerializer(many=True, read_only=True, source="moveflavortext") learned_by_pokemon = serializers.SerializerMethodField() class Meta: @@ -3402,9 +3341,7 @@ def get_learned_by_pokemon(self, obj): for id in pokemon_ids: pokemon_object = Pokemon.objects.get(pk=id["pokemon_id"]) - pokemon_data = PokemonSummarySerializer( - pokemon_object, context=self.context - ).data + pokemon_data = PokemonSummarySerializer(pokemon_object, context=self.context).data pokemon_list.append(pokemon_data) @@ -3436,9 +3373,7 @@ def get_learned_by_pokemon(self, obj): "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/version-group/1/" - ], + "examples": ["https://pokeapi.co/api/v2/version-group/1/"], }, }, }, @@ -3452,17 +3387,11 @@ def get_move_machines(self, obj): machines = [] for machine_object in machine_objects: - machine_data = MachineSummarySerializer( - machine_object, context=self.context - ).data + machine_data = MachineSummarySerializer(machine_object, context=self.context).data - version_group_data = VersionGroupSummarySerializer( - machine_object.version_group, context=self.context - ).data + version_group_data = VersionGroupSummarySerializer(machine_object.version_group, context=self.context).data - machines.append( - {"machine": machine_data, "version_group": version_group_data} - ) + machines.append({"machine": machine_data, "version_group": version_group_data}) return machines @@ -3489,9 +3418,7 @@ def get_move_machines(self, obj): "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/move/7/" - ], + "examples": ["https://pokeapi.co/api/v2/move/7/"], }, }, }, @@ -3510,9 +3437,7 @@ def get_move_machines(self, obj): "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/move/8/" - ], + "examples": ["https://pokeapi.co/api/v2/move/8/"], }, }, }, @@ -3537,9 +3462,7 @@ def get_move_machines(self, obj): "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/move/400/" - ], + "examples": ["https://pokeapi.co/api/v2/move/400/"], }, }, }, @@ -3558,9 +3481,7 @@ def get_move_machines(self, obj): "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/move/116/" - ], + "examples": ["https://pokeapi.co/api/v2/move/116/"], }, }, }, @@ -3572,31 +3493,18 @@ def get_move_machines(self, obj): ) def get_combos(self, obj): normal_before_objects = ContestCombo.objects.filter(first_move=obj) - normal_before_data = ContestComboSerializer( - normal_before_objects, many=True, context=self.context - ).data + normal_before_data = ContestComboSerializer(normal_before_objects, many=True, context=self.context).data normal_after_objects = ContestCombo.objects.filter(second_move=obj) - normal_after_data = ContestComboSerializer( - normal_after_objects, many=True, context=self.context - ).data + normal_after_data = ContestComboSerializer(normal_after_objects, many=True, context=self.context).data super_before_objects = SuperContestCombo.objects.filter(first_move=obj) - super_before_data = SuperContestComboSerializer( - super_before_objects, many=True, context=self.context - ).data + super_before_data = SuperContestComboSerializer(super_before_objects, many=True, context=self.context).data super_after_objects = SuperContestCombo.objects.filter(second_move=obj) - super_after_data = SuperContestComboSerializer( - super_after_objects, many=True, context=self.context - ).data + super_after_data = SuperContestComboSerializer(super_after_objects, many=True, context=self.context).data details = None - if ( - normal_before_data - or normal_after_data - or super_before_data - or super_after_data - ): + if normal_before_data or normal_after_data or super_before_data or super_after_data: details = OrderedDict() details["normal"] = OrderedDict() details["normal"]["use_before"] = None @@ -3636,15 +3544,11 @@ def get_combos(self, obj): "properties": { "effect": { "type": "string", - "examples": [ - "Inflicts [regular damage]{mechanic:regular-damage}." - ], + "examples": ["Inflicts [regular damage]{mechanic:regular-damage}."], }, "short_effect": { "type": "string", - "examples": [ - "Inflicts regular damage with no additional effect." - ], + "examples": ["Inflicts regular damage with no additional effect."], }, "language": { "type": "object", @@ -3664,15 +3568,11 @@ def get_combos(self, obj): ) def get_effect_text(self, obj): effect_texts = MoveEffectEffectText.objects.filter(move_effect=obj.move_effect) - data = MoveEffectEffectTextSerializer( - effect_texts, many=True, context=self.context - ).data + data = MoveEffectEffectTextSerializer(effect_texts, many=True, context=self.context).data if len(data) > 0: for key, value in data[0].items(): if "$effect_chance%" in value: - data[0][key] = value.replace( - "$effect_chance", f"{obj.move_effect_chance}" - ) + data[0][key] = value.replace("$effect_chance", f"{obj.move_effect_chance}") return data @@ -3691,9 +3591,7 @@ def get_effect_text(self, obj): "properties": { "effect": { "type": "string", - "examples": [ - "Hits Pokémon under the effects of dig and fly." - ], + "examples": ["Hits Pokémon under the effects of dig and fly."], }, "language": { "type": "object", @@ -3703,9 +3601,7 @@ def get_effect_text(self, obj): "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/language/9/" - ], + "examples": ["https://pokeapi.co/api/v2/language/9/"], }, }, }, @@ -3720,9 +3616,7 @@ def get_effect_text(self, obj): "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/version-group/3/" - ], + "examples": ["https://pokeapi.co/api/v2/version-group/3/"], }, }, }, @@ -3732,9 +3626,7 @@ def get_effect_text(self, obj): ) def get_effect_change_text(self, obj): effect_changes = MoveEffectChange.objects.filter(move_effect=obj.move_effect) - data = MoveEffectChangeSerializer( - effect_changes, many=True, context=self.context - ).data + data = MoveEffectChangeSerializer(effect_changes, many=True, context=self.context).data return data @@ -3764,9 +3656,7 @@ def get_effect_change_text(self, obj): ) def get_move_stat_change(self, obj): stat_change_objects = MoveMetaStatChange.objects.filter(move=obj) - stat_changes = MoveMetaStatChangeSerializer( - stat_change_objects, many=True, context=self.context - ).data + stat_changes = MoveMetaStatChangeSerializer(stat_change_objects, many=True, context=self.context).data for change in stat_changes: del change["move"] @@ -3797,9 +3687,7 @@ class Meta: class PalParkAreaDetailSerializer(serializers.ModelSerializer): - names = PalParkAreaNameSerializer( - many=True, read_only=True, source="palparkareaname" - ) + names = PalParkAreaNameSerializer(many=True, read_only=True, source="palparkareaname") pokemon_encounters = serializers.SerializerMethodField("get_encounters") class Meta: @@ -3826,9 +3714,7 @@ class Meta: "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/pokemon-species/1/" - ], + "examples": ["https://pokeapi.co/api/v2/pokemon-species/1/"], }, }, }, @@ -3839,9 +3725,7 @@ class Meta: ) def get_encounters(self, obj): pal_park_objects = PalPark.objects.filter(pal_park_area=obj) - parks = PalParkSerializer( - pal_park_objects, many=True, context=self.context - ).data + parks = PalParkSerializer(pal_park_objects, many=True, context=self.context).data encounters = [] for encounter in parks: @@ -3865,12 +3749,8 @@ class Meta: class PokemonColorDetailSerializer(serializers.ModelSerializer): - names = PokemonColorNameSerializer( - many=True, read_only=True, source="pokemoncolorname" - ) - pokemon_species = PokemonSpeciesSummarySerializer( - many=True, read_only=True, source="pokemonspecies" - ) + names = PokemonColorNameSerializer(many=True, read_only=True, source="pokemoncolorname") + pokemon_species = PokemonSpeciesSummarySerializer(many=True, read_only=True, source="pokemonspecies") class Meta: model = PokemonColor @@ -3946,12 +3826,8 @@ class Meta: } ) def get_pokemon_form_names(self, obj): - form_results = PokemonFormName.objects.filter( - pokemon_form=obj, name__regex=".+" - ) - form_serializer = PokemonFormNameSerializer( - form_results, many=True, context=self.context - ) + form_results = PokemonFormName.objects.filter(pokemon_form=obj, name__regex=".+") + form_serializer = PokemonFormNameSerializer(form_results, many=True, context=self.context) data = form_serializer.data @@ -3985,12 +3861,8 @@ def get_pokemon_form_names(self, obj): } ) def get_pokemon_form_pokemon_names(self, obj): - form_results = PokemonFormName.objects.filter( - pokemon_form=obj, pokemon_name__regex=".+" - ) - form_serializer = PokemonFormNameSerializer( - form_results, many=True, context=self.context - ) + form_results = PokemonFormName.objects.filter(pokemon_form=obj, pokemon_name__regex=".+") + form_serializer = PokemonFormNameSerializer(form_results, many=True, context=self.context) data = form_serializer.data @@ -4064,9 +3936,7 @@ def get_pokemon_form_sprites(self, obj): ) def get_pokemon_form_types(self, obj): form_type_objects = PokemonFormType.objects.filter(pokemon_form=obj) - form_types = PokemonFormTypeSerializer( - form_type_objects, many=True, context=self.context - ).data + form_types = PokemonFormTypeSerializer(form_type_objects, many=True, context=self.context).data for form_type in form_types: del form_type["pokemon_form"] @@ -4075,9 +3945,7 @@ def get_pokemon_form_types(self, obj): if form_types == []: pokemon_object = Pokemon.objects.get(id=obj.pokemon_id) pokemon_type_objects = PokemonType.objects.filter(pokemon=pokemon_object) - form_types = PokemonTypeSerializer( - pokemon_type_objects, many=True, context=self.context - ).data + form_types = PokemonTypeSerializer(pokemon_type_objects, many=True, context=self.context).data for form_type in form_types: del form_type["pokemon"] @@ -4099,12 +3967,8 @@ class Meta: class PokemonHabitatDetailSerializer(serializers.ModelSerializer): - names = PokemonHabitatNameSerializer( - many=True, read_only=True, source="pokemonhabitatname" - ) - pokemon_species = PokemonSpeciesSummarySerializer( - many=True, read_only=True, source="pokemonspecies" - ) + names = PokemonHabitatNameSerializer(many=True, read_only=True, source="pokemonhabitatname") + pokemon_species = PokemonSpeciesSummarySerializer(many=True, read_only=True, source="pokemonspecies") class Meta: model = PokemonHabitat @@ -4133,12 +3997,8 @@ class Meta: class MoveLearnMethodDetailSerializer(serializers.ModelSerializer): - names = MoveLearnMethodNameSerializer( - many=True, read_only=True, source="movelearnmethodname" - ) - descriptions = MoveLearnMethodDescriptionSerializer( - many=True, read_only=True, source="movelearnmethoddescription" - ) + names = MoveLearnMethodNameSerializer(many=True, read_only=True, source="movelearnmethodname") + descriptions = MoveLearnMethodDescriptionSerializer(many=True, read_only=True, source="movelearnmethoddescription") version_groups = serializers.SerializerMethodField("get_method_version_groups") class Meta: @@ -4169,9 +4029,7 @@ class Meta: } ) def get_method_version_groups(self, obj): - version_group_objects = VersionGroupMoveLearnMethod.objects.filter( - move_learn_method=obj - ) + version_group_objects = VersionGroupMoveLearnMethod.objects.filter(move_learn_method=obj) version_group_data = VersionGroupMoveLearnMethodSerializer( version_group_objects, many=True, context=self.context ).data @@ -4204,9 +4062,7 @@ class Meta: class PokemonShapeDetailSerializer(serializers.ModelSerializer): names = serializers.SerializerMethodField("get_shape_names") awesome_names = serializers.SerializerMethodField("get_shape_awesome_names") - pokemon_species = PokemonSpeciesSummarySerializer( - many=True, read_only=True, source="pokemonspecies" - ) + pokemon_species = PokemonSpeciesSummarySerializer(many=True, read_only=True, source="pokemonspecies") class Meta: model = PokemonShape @@ -4231,9 +4087,7 @@ class Meta: ) def get_shape_names(self, obj): results = PokemonShapeName.objects.filter(pokemon_shape_id=obj) - serializer = PokemonShapeNameSerializer( - results, many=True, context=self.context - ) + serializer = PokemonShapeNameSerializer(results, many=True, context=self.context) data = serializer.data for entry in data: @@ -4283,9 +4137,7 @@ def get_shape_names(self, obj): ) def get_shape_awesome_names(self, obj): results = PokemonShapeName.objects.filter(pokemon_shape_id=obj) - serializer = PokemonShapeNameSerializer( - results, many=True, context=self.context - ) + serializer = PokemonShapeNameSerializer(results, many=True, context=self.context) data = serializer.data for entry in data: @@ -4342,18 +4194,14 @@ class Meta: class PokemonDetailSerializer(serializers.ModelSerializer): abilities = serializers.SerializerMethodField("get_pokemon_abilities") past_abilities = serializers.SerializerMethodField("get_past_pokemon_abilities") - game_indices = PokemonGameIndexSerializer( - many=True, read_only=True, source="pokemongameindex" - ) + game_indices = PokemonGameIndexSerializer(many=True, read_only=True, source="pokemongameindex") moves = serializers.SerializerMethodField("get_pokemon_moves") species = PokemonSpeciesSummarySerializer(source="pokemon_species") stats = PokemonStatSerializer(many=True, read_only=True, source="pokemonstat") past_stats = serializers.SerializerMethodField("get_past_pokemon_stats") types = serializers.SerializerMethodField("get_pokemon_types") past_types = serializers.SerializerMethodField("get_past_pokemon_types") - forms = PokemonFormSummarySerializer( - many=True, read_only=True, source="pokemonform" - ) + forms = PokemonFormSummarySerializer(many=True, read_only=True, source="pokemonform") held_items = serializers.SerializerMethodField("get_pokemon_held_items") location_area_encounters = serializers.SerializerMethodField("get_encounters") sprites = serializers.SerializerMethodField("get_pokemon_sprites") @@ -4429,16 +4277,12 @@ def get_pokemon_sprites(self, obj): "latest": { "type": "string", "format": "uri", - "examples": [ - "https://raw.githubusercontent.com/PokeAPI/cries/main/cries/pokemon/latest/50.ogg" - ], + "examples": ["https://raw.githubusercontent.com/PokeAPI/cries/main/cries/pokemon/latest/50.ogg"], }, "legacy": { "type": "string", "format": "uri", - "examples": [ - "https://raw.githubusercontent.com/PokeAPI/cries/main/cries/pokemon/legacy/50.ogg" - ], + "examples": ["https://raw.githubusercontent.com/PokeAPI/cries/main/cries/pokemon/legacy/50.ogg"], }, }, } @@ -4759,9 +4603,7 @@ def get_pokemon_cries(self, obj): "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/move-learn-method/1/" - ], + "examples": ["https://pokeapi.co/api/v2/move-learn-method/1/"], }, }, }, @@ -4776,9 +4618,7 @@ def get_pokemon_cries(self, obj): "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/version-group/1/" - ], + "examples": ["https://pokeapi.co/api/v2/version-group/1/"], }, }, }, @@ -4791,13 +4631,9 @@ def get_pokemon_cries(self, obj): ) def get_pokemon_moves(self, obj): version_objects = VersionGroup.objects.all() - version_data = VersionGroupSummarySerializer( - version_objects, many=True, context=self.context - ).data + version_data = VersionGroupSummarySerializer(version_objects, many=True, context=self.context).data method_objects = MoveLearnMethod.objects.all() - method_data = MoveLearnMethodSummarySerializer( - method_objects, many=True, context=self.context - ).data + method_data = MoveLearnMethodSummarySerializer(method_objects, many=True, context=self.context).data # Get moves related to this pokemon and pull out unique Move IDs. # Note that it's important to order by the same column we're using to @@ -4818,21 +4654,15 @@ def get_pokemon_moves(self, obj): # Get Versions and Move Methods associated with each unique move pokemon_move_objects = pokemon_moves.filter(move_id=id["move_id"]) - serializer = PokemonMoveSerializer( - pokemon_move_objects, many=True, context=self.context - ) + serializer = PokemonMoveSerializer(pokemon_move_objects, many=True, context=self.context) pokemon_move_details["version_group_details"] = [] for move in serializer.data: version_detail = OrderedDict() version_detail["level_learned_at"] = move["level"] - version_detail["version_group"] = version_data[ - move["version_group"] - 1 - ] - version_detail["move_learn_method"] = method_data[ - move["move_learn_method"] - 1 - ] + version_detail["version_group"] = version_data[move["version_group"] - 1] + version_detail["move_learn_method"] = method_data[move["move_learn_method"] - 1] version_detail["order"] = move["order"] pokemon_move_details["version_group_details"].append(version_detail) @@ -4895,9 +4725,7 @@ def get_pokemon_moves(self, obj): "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/version/12/" - ], + "examples": ["https://pokeapi.co/api/v2/version/12/"], }, }, }, @@ -4924,9 +4752,7 @@ def get_pokemon_held_items(self, obj): # Get Versions associated with each unique item pokemon_item_objects = pokemon_items.filter(item_id=id["item_id"]) - serializer = PokemonItemSerializer( - pokemon_item_objects, many=True, context=self.context - ) + serializer = PokemonItemSerializer(pokemon_item_objects, many=True, context=self.context) pokemon_item_details["version_details"] = [] for item in serializer.data: @@ -4976,9 +4802,7 @@ def get_pokemon_held_items(self, obj): ) def get_pokemon_abilities(self, obj): pokemon_ability_objects = PokemonAbility.objects.filter(pokemon=obj) - data = PokemonAbilitySerializer( - pokemon_ability_objects, many=True, context=self.context - ).data + data = PokemonAbilitySerializer(pokemon_ability_objects, many=True, context=self.context).data abilities = [] for ability in data: @@ -5027,9 +4851,7 @@ def get_pokemon_abilities(self, obj): "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/ability/26/" - ], + "examples": ["https://pokeapi.co/api/v2/ability/26/"], }, }, }, @@ -5095,9 +4917,7 @@ def get_past_pokemon_abilities(self, obj): def get_past_pokemon_stats(self, obj): pokemon_past_stat_objects = PokemonStatPast.objects.filter(pokemon=obj) - pokemon_past_stats = PokemonStatPastSerializer( - pokemon_past_stat_objects, many=True, context=self.context - ).data + pokemon_past_stats = PokemonStatPastSerializer(pokemon_past_stat_objects, many=True, context=self.context).data # post-process to the form we want current_generation = "" @@ -5159,9 +4979,7 @@ def get_past_pokemon_stats(self, obj): ) def get_pokemon_types(self, obj): poke_type_objects = PokemonType.objects.filter(pokemon=obj) - poke_types = PokemonTypeSerializer( - poke_type_objects, many=True, context=self.context - ).data + poke_types = PokemonTypeSerializer(poke_type_objects, many=True, context=self.context).data for poke_type in poke_types: del poke_type["pokemon"] @@ -5226,9 +5044,7 @@ def get_pokemon_types(self, obj): "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/type/1/" - ], + "examples": ["https://pokeapi.co/api/v2/type/1/"], }, }, }, @@ -5241,9 +5057,7 @@ def get_pokemon_types(self, obj): ) def get_past_pokemon_types(self, obj): poke_past_type_objects = PokemonTypePast.objects.filter(pokemon=obj) - poke_past_types = PokemonTypePastSerializer( - poke_past_type_objects, many=True, context=self.context - ).data + poke_past_types = PokemonTypePastSerializer(poke_past_type_objects, many=True, context=self.context).data # post-process to the form we want current_generation = "" @@ -5296,9 +5110,7 @@ class Meta: class EvolutionTriggerDetailSerializer(serializers.HyperlinkedModelSerializer): - names = EvolutionTriggerNameSerializer( - many=True, read_only=True, source="evolutiontriggername" - ) + names = EvolutionTriggerNameSerializer(many=True, read_only=True, source="evolutiontriggername") pokemon_species = serializers.SerializerMethodField("get_species") class Meta: @@ -5328,9 +5140,7 @@ def get_species(self, obj): species_names = set() for evo in evo_objects: - species = PokemonSpeciesSummarySerializer( - evo.evolved_species, context=self.context - ).data + species = PokemonSpeciesSummarySerializer(evo.evolved_species, context=self.context).data if species["name"] not in species_names: species_list.append(species) species_names.add(species["name"]) @@ -5379,9 +5189,7 @@ class PokemonSpeciesDetailSerializer(serializers.ModelSerializer): form_descriptions = PokemonSpeciesDescriptionSerializer( many=True, read_only=True, source="pokemonspeciesdescription" ) - pokedex_numbers = PokemonDexEntrySerializer( - many=True, read_only=True, source="pokemondexnumber" - ) + pokedex_numbers = PokemonDexEntrySerializer(many=True, read_only=True, source="pokemondexnumber") egg_groups = serializers.SerializerMethodField("get_pokemon_egg_groups") flavor_text_entries = PokemonSpeciesFlavorTextSerializer( many=True, read_only=True, source="pokemonspeciesflavortext" @@ -5455,9 +5263,7 @@ class Meta: ) def get_pokemon_names(self, obj): species_results = PokemonSpeciesName.objects.filter(pokemon_species=obj) - species_serializer = PokemonSpeciesNameSerializer( - species_results, many=True, context=self.context - ) + species_serializer = PokemonSpeciesNameSerializer(species_results, many=True, context=self.context) data = species_serializer.data @@ -5499,9 +5305,7 @@ def get_pokemon_names(self, obj): ) def get_pokemon_genera(self, obj): results = PokemonSpeciesName.objects.filter(pokemon_species=obj) - serializer = PokemonSpeciesNameSerializer( - results, many=True, context=self.context - ) + serializer = PokemonSpeciesNameSerializer(results, many=True, context=self.context) data = serializer.data genera = [] @@ -5564,12 +5368,8 @@ def get_pokemon_egg_groups(self, obj): ) def get_pokemon_varieties(self, obj): results = Pokemon.objects.filter(pokemon_species=obj) - summary_data = PokemonSummarySerializer( - results, many=True, context=self.context - ).data - detail_data = PokemonDetailSerializer( - results, many=True, context=self.context - ).data + summary_data = PokemonSummarySerializer(results, many=True, context=self.context).data + detail_data = PokemonDetailSerializer(results, many=True, context=self.context).data varieties = [] @@ -5596,9 +5396,7 @@ def get_pokemon_varieties(self, obj): "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/pal-park-area/2/" - ], + "examples": ["https://pokeapi.co/api/v2/pal-park-area/2/"], }, }, }, @@ -5614,9 +5412,7 @@ def get_pokemon_varieties(self, obj): ) def get_encounters(self, obj): pal_park_objects = PalPark.objects.filter(pokemon_species=obj) - parks = PalParkSerializer( - pal_park_objects, many=True, context=self.context - ).data + parks = PalParkSerializer(pal_park_objects, many=True, context=self.context).data encounters = [] for encounter in parks: @@ -5732,7 +5528,7 @@ class Meta: "gender": { "type": "", "nullable": True, - "type": "object", + "type": "object", # noqa: F601 "required": ["name", "url"], "properties": { "name": { @@ -5914,9 +5710,7 @@ class Meta: "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/pokemon-species/440/" - ], + "examples": ["https://pokeapi.co/api/v2/pokemon-species/440/"], }, }, }, @@ -5932,9 +5726,7 @@ class Meta: "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/pokemon-species/440/" - ], + "examples": ["https://pokeapi.co/api/v2/pokemon-species/440/"], }, }, }, @@ -5944,15 +5736,9 @@ class Meta: def build_chain(self, obj): chain_id = obj.id - pokemon_objects = PokemonSpecies.objects.filter( - evolution_chain_id=chain_id - ).order_by("order") - summary_data = PokemonSpeciesSummarySerializer( - pokemon_objects, many=True, context=self.context - ).data - ref_data = PokemonSpeciesEvolutionSerializer( - pokemon_objects, many=True, context=self.context - ).data + pokemon_objects = PokemonSpecies.objects.filter(evolution_chain_id=chain_id).order_by("order") + summary_data = PokemonSpeciesSummarySerializer(pokemon_objects, many=True, context=self.context).data + ref_data = PokemonSpeciesEvolutionSerializer(pokemon_objects, many=True, context=self.context).data # convert evolution data list to tree evolution_tree = self.build_evolution_tree(ref_data) @@ -5980,13 +5766,13 @@ def build_evolution_tree(self, species_evolution_data): search_stack = [parent_link] while len(search_stack) > 0: - l = search_stack.pop() - if l["species"]["id"] == evolves_from_species_id: - parent_link = l + lnk = search_stack.pop() + if lnk["species"]["id"] == evolves_from_species_id: + parent_link = lnk break # "left" to "right" requires reversing the list of children - search_stack += reversed(l["children"]) + search_stack += reversed(lnk["children"]) parent_link["children"].append(chain_link) @@ -6000,13 +5786,9 @@ def build_chain_link_entry(self, chain_link, summary_data): species = chain_link["species"] if species["evolves_from_species"]: - evolution_object = PokemonEvolution.objects.filter( - evolved_species=species["id"] - ) + evolution_object = PokemonEvolution.objects.filter(evolved_species=species["id"]) - evolution_data = PokemonEvolutionSerializer( - evolution_object, many=True, context=self.context - ).data + evolution_data = PokemonEvolutionSerializer(evolution_object, many=True, context=self.context).data entry["is_baby"] = species["is_baby"] @@ -6015,9 +5797,7 @@ def build_chain_link_entry(self, chain_link, summary_data): entry["evolution_details"] = evolution_data or [] - evolves_to = [ - self.build_chain_link_entry(c, summary_data) for c in chain_link["children"] - ] + evolves_to = [self.build_chain_link_entry(c, summary_data) for c in chain_link["children"]] entry["evolves_to"] = evolves_to return entry @@ -6044,9 +5824,7 @@ class Meta: class PokeathlonStatDetailSerializer(serializers.HyperlinkedModelSerializer): - names = PokeathlonStatNameSerializer( - many=True, read_only=True, source="pokeathlonstatname" - ) + names = PokeathlonStatNameSerializer(many=True, read_only=True, source="pokeathlonstatname") affecting_natures = serializers.SerializerMethodField("get_natures_that_affect") class Meta: @@ -6078,9 +5856,7 @@ class Meta: "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/nature/1/" - ], + "examples": ["https://pokeapi.co/api/v2/nature/1/"], }, }, }, @@ -6107,9 +5883,7 @@ class Meta: "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/nature/1/" - ], + "examples": ["https://pokeapi.co/api/v2/nature/1/"], }, }, }, @@ -6121,9 +5895,7 @@ class Meta: ) def get_natures_that_affect(self, obj): stat_change_objects = NaturePokeathlonStat.objects.filter(pokeathlon_stat=obj) - stat_changes = NaturePokeathlonStatSerializer( - stat_change_objects, many=True, context=self.context - ).data + stat_changes = NaturePokeathlonStatSerializer(stat_change_objects, many=True, context=self.context).data changes = OrderedDict([("increase", []), ("decrease", [])]) for change in stat_changes: @@ -6158,9 +5930,7 @@ class Meta: class PokedexDetailSerializer(serializers.ModelSerializer): region = RegionSummarySerializer() names = PokedexNameSerializer(many=True, read_only=True, source="pokedexname") - descriptions = PokedexDescriptionSerializer( - many=True, read_only=True, source="pokedexdescription" - ) + descriptions = PokedexDescriptionSerializer(many=True, read_only=True, source="pokedexdescription") pokemon_entries = serializers.SerializerMethodField("get_pokedex_entries") version_groups = serializers.SerializerMethodField("get_pokedex_version_groups") @@ -6197,9 +5967,7 @@ class Meta: "url": { "type": "string", "format": "uri", - "examples": [ - "https://pokeapi.co/api/v2/pokemon-species/1/" - ], + "examples": ["https://pokeapi.co/api/v2/pokemon-species/1/"], }, }, }, @@ -6208,12 +5976,8 @@ class Meta: } ) def get_pokedex_entries(self, obj): - results = PokemonDexNumber.objects.filter(pokedex=obj).order_by( - "pokedex_number" - ) - serializer = PokemonDexNumberSerializer( - results, many=True, context=self.context - ) + results = PokemonDexNumber.objects.filter(pokedex=obj).order_by("pokedex_number") + serializer = PokemonDexNumberSerializer(results, many=True, context=self.context) data = serializer.data for entry in data: @@ -6240,9 +6004,7 @@ def get_pokedex_entries(self, obj): ) def get_pokedex_version_groups(self, obj): dex_group_objects = PokedexVersionGroup.objects.filter(pokedex=obj) - dex_groups = PokedexVersionGroupSerializer( - dex_group_objects, many=True, context=self.context - ).data + dex_groups = PokedexVersionGroupSerializer(dex_group_objects, many=True, context=self.context).data results = [] for dex_group in dex_groups: @@ -6316,9 +6078,7 @@ class Meta: ) def get_version_group_regions(self, obj): vg_regions = VersionGroupRegion.objects.filter(version_group=obj) - data = VersionGroupRegionSerializer( - vg_regions, many=True, context=self.context - ).data + data = VersionGroupRegionSerializer(vg_regions, many=True, context=self.context).data regions = [] for region in data: @@ -6346,9 +6106,7 @@ def get_version_group_regions(self, obj): } ) def get_learn_methods(self, obj): - learn_method_objects = VersionGroupMoveLearnMethod.objects.filter( - version_group=obj - ) + learn_method_objects = VersionGroupMoveLearnMethod.objects.filter(version_group=obj) learn_method_data = VersionGroupMoveLearnMethodSerializer( learn_method_objects, many=True, context=self.context ).data @@ -6378,9 +6136,7 @@ def get_learn_methods(self, obj): ) def get_version_groups_pokedexes(self, obj): dex_group_objects = PokedexVersionGroup.objects.filter(version_group=obj) - dex_groups = PokedexVersionGroupSerializer( - dex_group_objects, many=True, context=self.context - ).data + dex_groups = PokedexVersionGroupSerializer(dex_group_objects, many=True, context=self.context).data results = [] for dex_group in dex_groups: diff --git a/pokemon_v2/test_models.py b/pokemon_v2/test_models.py index 84f2dbf72..383724cef 100644 --- a/pokemon_v2/test_models.py +++ b/pokemon_v2/test_models.py @@ -1,5 +1,6 @@ from django.test import TestCase -from pokemon_v2.models import * + +from pokemon_v2.models import Ability class AbilityTestCase(TestCase): diff --git a/pokemon_v2/tests.py b/pokemon_v2/tests.py index 6bed79fcd..8b7b82d60 100644 --- a/pokemon_v2/tests.py +++ b/pokemon_v2/tests.py @@ -1,7 +1,157 @@ import json + from rest_framework import status from rest_framework.test import APITestCase -from pokemon_v2.models import * + +from pokemon_v2.models import ( + Ability, + AbilityChange, + AbilityChangeEffectText, + AbilityEffectText, + AbilityFlavorText, + AbilityName, + Berry, + BerryFirmness, + BerryFirmnessName, + BerryFlavor, + BerryFlavorMap, + BerryFlavorName, + Characteristic, + CharacteristicDescription, + ContestCombo, + ContestEffect, + ContestEffectEffectText, + ContestEffectFlavorText, + ContestType, + ContestTypeName, + EggGroup, + EggGroupName, + Encounter, + EncounterCondition, + EncounterConditionName, + EncounterConditionValue, + EncounterConditionValueName, + EncounterMethod, + EncounterMethodName, + EncounterSlot, + EvolutionChain, + EvolutionTrigger, + EvolutionTriggerName, + Experience, + Gender, + Generation, + GenerationName, + GrowthRate, + GrowthRateDescription, + Item, + ItemAttribute, + ItemAttributeDescription, + ItemAttributeMap, + ItemAttributeName, + ItemCategory, + ItemCategoryName, + ItemEffectText, + ItemFlavorText, + ItemFlingEffect, + ItemFlingEffectEffectText, + ItemGameIndex, + ItemName, + ItemPocket, + ItemPocketName, + ItemSprites, + Language, + LanguageName, + Location, + LocationArea, + LocationAreaEncounterRate, + LocationAreaName, + LocationGameIndex, + LocationName, + Move, + MoveBattleStyle, + MoveBattleStyleName, + MoveChange, + MoveDamageClass, + MoveDamageClassDescription, + MoveDamageClassName, + MoveEffect, + MoveEffectChange, + MoveEffectChangeEffectText, + MoveEffectEffectText, + MoveFlavorText, + MoveLearnMethod, + MoveLearnMethodDescription, + MoveLearnMethodName, + MoveMeta, + MoveMetaAilment, + MoveMetaAilmentName, + MoveMetaCategory, + MoveMetaCategoryDescription, + MoveMetaStatChange, + MoveName, + MoveTarget, + MoveTargetDescription, + MoveTargetName, + Nature, + NatureBattleStylePreference, + NatureName, + NaturePokeathlonStat, + PalPark, + PalParkArea, + PalParkAreaName, + PokeathlonStat, + PokeathlonStatName, + Pokedex, + PokedexDescription, + PokedexName, + PokedexVersionGroup, + Pokemon, + PokemonAbility, + PokemonAbilityPast, + PokemonColor, + PokemonColorName, + PokemonCries, + PokemonDexNumber, + PokemonEggGroup, + PokemonEvolution, + PokemonForm, + PokemonFormSprites, + PokemonFormType, + PokemonGameIndex, + PokemonHabitat, + PokemonHabitatName, + PokemonItem, + PokemonMove, + PokemonShape, + PokemonShapeName, + PokemonSpecies, + PokemonSpeciesDescription, + PokemonSpeciesFlavorText, + PokemonSpeciesName, + PokemonSprites, + PokemonStat, + PokemonStatPast, + PokemonType, + PokemonTypePast, + Region, + RegionName, + Stat, + StatName, + SuperContestCombo, + SuperContestEffect, + SuperContestEffectFlavorText, + Type, + TypeEfficacy, + TypeEfficacyPast, + TypeGameIndex, + TypeName, + TypeSprites, + Version, + VersionGroup, + VersionGroupMoveLearnMethod, + VersionGroupRegion, + VersionName, +) # pylint: disable=redefined-builtin @@ -40,9 +190,7 @@ def setup_language_data(cls, name="lang"): def setup_language_name_data(cls, language, name="lang nm"): local_language = cls.setup_language_data(name="lang for " + name) - language_name = LanguageName.objects.create( - language=language, local_language=local_language, name=name - ) + language_name = LanguageName.objects.create(language=language, local_language=local_language, name=name) language_name.save() return language_name @@ -59,9 +207,7 @@ def setup_region_data(cls, name="reg"): def setup_region_name_data(cls, region, name="reg nm"): language = cls.setup_language_data(name="lang for " + name) - region_name = RegionName.objects.create( - region=region, language=language, name=name - ) + region_name = RegionName.objects.create(region=region, language=language, name=name) region_name.save() return region_name @@ -80,9 +226,7 @@ def setup_generation_data(cls, region=None, name="gen"): def setup_generation_name_data(cls, generation, name="gen nm"): language = cls.setup_language_data(name="lang for " + name) - generation_name = GenerationName.objects.create( - generation=generation, language=language, name=name - ) + generation_name = GenerationName.objects.create(generation=generation, language=language, name=name) generation_name.save() return generation_name @@ -92,18 +236,14 @@ def setup_generation_name_data(cls, generation, name="gen nm"): def setup_version_group_data(cls, name="ver grp", generation=None): generation = generation or cls.setup_generation_data(name="gen for " + name) - version_group = VersionGroup.objects.create( - name=name, generation=generation, order=1 - ) + version_group = VersionGroup.objects.create(name=name, generation=generation, order=1) version_group.save() return version_group @classmethod def setup_version_group_region_data(cls, version_group=None, region=None): - version_group_region = VersionGroupRegion.objects.create( - version_group=version_group, region=region - ) + version_group_region = VersionGroupRegion.objects.create(version_group=version_group, region=region) version_group_region.save() return version_group_region @@ -122,9 +262,7 @@ def setup_version_data(cls, version_group=None, name="ver"): def setup_version_name_data(cls, version, name="ver nm"): language = cls.setup_language_data(name="lang for " + name) - version_name = VersionName.objects.create( - version=version, language=language, name=name - ) + version_name = VersionName.objects.create(version=version, language=language, name=name) version_name.save() return version_name @@ -134,9 +272,7 @@ def setup_version_name_data(cls, version, name="ver nm"): def setup_ability_data(cls, name="ablty", generation=None): generation = generation or cls.setup_generation_data(name="gen for " + name) - ability = Ability.objects.create( - name=name, generation=generation, is_main_series=False - ) + ability = Ability.objects.create(name=name, generation=generation, is_main_series=False) ability.save() return ability @@ -145,17 +281,13 @@ def setup_ability_data(cls, name="ablty", generation=None): def setup_ability_name_data(cls, ability, name="ablty nm"): language = cls.setup_language_data(name="lang for " + name) - ability_name = AbilityName.objects.create( - ability=ability, language=language, name=name - ) + ability_name = AbilityName.objects.create(ability=ability, language=language, name=name) ability_name.save() return ability_name @classmethod - def setup_ability_effect_text_data( - cls, ability, short_effect="ablty shrt efct", effect="ablty efct" - ): + def setup_ability_effect_text_data(cls, ability, short_effect="ablty shrt efct", effect="ablty efct"): language = cls.setup_language_data(name="lang for " + effect) ability_effect_text = AbilityEffectText.objects.create( @@ -169,17 +301,13 @@ def setup_ability_effect_text_data( def setup_ability_change_data(cls, ability): version_group = cls.setup_version_group_data(name="ver grp for ablty chng") - ability_change = AbilityChange.objects.create( - ability=ability, version_group=version_group - ) + ability_change = AbilityChange.objects.create(ability=ability, version_group=version_group) ability_change.save() return ability_change @classmethod - def setup_ability_change_effect_text_data( - cls, ability_change, effect="ablty change efct" - ): + def setup_ability_change_effect_text_data(cls, ability_change, effect="ablty change efct"): language = cls.setup_language_data(name="lang for " + effect) ability_change_effect_text = AbilityChangeEffectText.objects.create( @@ -227,9 +355,7 @@ def setup_item_attribute_name_data(cls, item_attribute, name="itm attr nm"): return item_attribute_name @classmethod - def setup_item_attribute_description_data( - cls, item_attribute, description="itm attr desc" - ): + def setup_item_attribute_description_data(cls, item_attribute, description="itm attr desc"): language = cls.setup_language_data(name="lang for " + description) item_attribute_description = ItemAttributeDescription.objects.create( @@ -256,9 +382,7 @@ def setup_item_fling_effect_data(cls, name="itm flng efct"): return item_fling_effect @classmethod - def setup_item_fling_effect_effect_text_data( - cls, item_fling_effect, effect="itm flng efct efct txt" - ): + def setup_item_fling_effect_effect_text_data(cls, item_fling_effect, effect="itm flng efct efct txt"): language = cls.setup_language_data(name="lang for " + effect) item_fling_effect_effect_text = ItemFlingEffectEffectText.objects.create( @@ -281,18 +405,14 @@ def setup_item_pocket_data(cls, name="itm pkt"): def setup_item_pocket_name_data(cls, item_pocket, name="itm pkt nm"): language = cls.setup_language_data(name="lang for " + name) - item_pocket_name = ItemPocketName.objects.create( - item_pocket=item_pocket, name=name, language=language - ) + item_pocket_name = ItemPocketName.objects.create(item_pocket=item_pocket, name=name, language=language) item_pocket_name.save() return item_pocket_name @classmethod def setup_item_category_data(cls, name="itm ctgry", item_pocket=None): - item_pocket = item_pocket or cls.setup_item_pocket_data( - name="itm pkt for " + name - ) + item_pocket = item_pocket or cls.setup_item_pocket_data(name="itm pkt for " + name) item_category = ItemCategory.objects.create(name=name, item_pocket=item_pocket) item_category.save() @@ -303,9 +423,7 @@ def setup_item_category_data(cls, name="itm ctgry", item_pocket=None): def setup_item_category_name_data(cls, item_category, name="itm ctgry nm"): language = cls.setup_language_data(name="lang for " + name) - item_category_name = ItemCategoryName.objects.create( - item_category=item_category, name=name, language=language - ) + item_category_name = ItemCategoryName.objects.create(item_category=item_category, name=name, language=language) item_category_name.save() return item_category_name @@ -318,9 +436,7 @@ def setup_item_sprites_data(cls, item, default=True): "default": sprite_path % item.id if default else None, } - item_sprites = ItemSprites.objects.create( - item=item, sprites=json.dumps(sprites) - ) + item_sprites = ItemSprites.objects.create(item=item, sprites=json.dumps(sprites)) item_sprites.save() return item_sprites @@ -355,9 +471,7 @@ def setup_item_name_data(cls, item, name="itm nm"): return item_name @classmethod - def setup_item_effect_text_data( - cls, item, short_effect="ablty shrt efct", effect="ablty efct" - ): + def setup_item_effect_text_data(cls, item, short_effect="ablty shrt efct", effect="ablty efct"): language = cls.setup_language_data(name="lang for " + effect) item_effect_text = ItemEffectText.objects.create( @@ -387,9 +501,7 @@ def setup_item_flavor_text_data(cls, item, flavor_text="itm flvr txt"): def setup_item_game_index_data(cls, item, game_index=0): generation = cls.setup_generation_data(name="gen for itm gm indx") - item_game_index = ItemGameIndex.objects.create( - item=item, game_index=game_index, generation=generation - ) + item_game_index = ItemGameIndex.objects.create(item=item, game_index=game_index, generation=generation) item_game_index.save() return item_game_index @@ -408,9 +520,7 @@ def setup_contest_type_data(cls, name="cntst tp"): def setup_contest_type_name_data(cls, contest_type, name="cntst tp nm"): language = cls.setup_language_data(name="lang for " + name) - contest_type_name = ContestTypeName.objects.create( - language=language, name=name, contest_type=contest_type - ) + contest_type_name = ContestTypeName.objects.create(language=language, name=name, contest_type=contest_type) contest_type_name.save() return contest_type_name @@ -423,9 +533,7 @@ def setup_contest_effect_data(cls, appeal=2, jam=0): return contest_effect @classmethod - def setup_contest_effect_flavor_text_data( - cls, contest_effect, flavor_text="cntst efct flvr txt" - ): + def setup_contest_effect_flavor_text_data(cls, contest_effect, flavor_text="cntst efct flvr txt"): language = cls.setup_language_data(name="lang for " + flavor_text) contest_effect_flavor_text = ContestEffectFlavorText.objects.create( @@ -436,9 +544,7 @@ def setup_contest_effect_flavor_text_data( return contest_effect_flavor_text @classmethod - def setup_contest_effect_effect_text_data( - cls, contest_effect, effect="cntst efct efct txt" - ): + def setup_contest_effect_effect_text_data(cls, contest_effect, effect="cntst efct efct txt"): language = cls.setup_language_data(name="lang for " + effect) contest_effect_effect_text = ContestEffectEffectText.objects.create( @@ -458,9 +564,7 @@ def setup_super_contest_effect_data(cls, appeal=2): return super_contest_effect @classmethod - def setup_super_contest_effect_flavor_text_data( - cls, super_contest_effect, flavor_text="spr cntst efct flvr txt" - ): + def setup_super_contest_effect_flavor_text_data(cls, super_contest_effect, flavor_text="spr cntst efct flvr txt"): language = cls.setup_language_data(name="lang for " + flavor_text) super_contest_effect_flavor_text = SuperContestEffectFlavorText.objects.create( @@ -475,9 +579,7 @@ def setup_super_contest_effect_flavor_text_data( # Berry Data @classmethod def setup_berry_flavor_data(cls, contest_type=None, name="bry flvr"): - contest_type = contest_type or cls.setup_contest_type_data( - name="cntst tp for bry flvr" - ) + contest_type = contest_type or cls.setup_contest_type_data(name="cntst tp for bry flvr") berry_flavor = BerryFlavor.objects.create(name=name, contest_type=contest_type) berry_flavor.save() @@ -488,9 +590,7 @@ def setup_berry_flavor_data(cls, contest_type=None, name="bry flvr"): def setup_berry_flavor_name_data(cls, berry_flavor, name="bry flvr nm"): language = cls.setup_language_data(name="lang for " + name) - berry_flavor_name = BerryFlavorName.objects.create( - language=language, name=name, berry_flavor=berry_flavor - ) + berry_flavor_name = BerryFlavorName.objects.create(language=language, name=name, berry_flavor=berry_flavor) berry_flavor_name.save() return berry_flavor_name @@ -517,9 +617,7 @@ def setup_berry_firmness_name_data(cls, berry_firmness, name="bry frmns nm"): @classmethod def setup_berry_flavor_map_data(cls, berry, berry_flavor, potency=20): - berry_flavor_map = BerryFlavorMap( - berry=berry, berry_flavor=berry_flavor, potency=potency - ) + berry_flavor_map = BerryFlavorMap(berry=berry, berry_flavor=berry_flavor, potency=potency) berry_flavor_map.save() return berry_flavor_map @@ -540,9 +638,7 @@ def setup_berry_data( ): item = item or cls.setup_item_data(name="itm for " + name) - berry_firmness = berry_firmness or cls.setup_berry_firmness_data( - name="bry frmns for " + name - ) + berry_firmness = berry_firmness or cls.setup_berry_firmness_data(name="bry frmns for " + name) berry = Berry.objects.create( name=name, @@ -574,9 +670,7 @@ def setup_egg_group_data(cls, name="egg grp"): def setup_egg_group_name_data(cls, egg_group, name="ntr nm"): language = cls.setup_language_data(name="lang for " + name) - egg_group_name = EggGroupName.objects.create( - egg_group=egg_group, language=language, name=name - ) + egg_group_name = EggGroupName.objects.create(egg_group=egg_group, language=language, name=name) egg_group_name.save() return egg_group_name @@ -590,9 +684,7 @@ def setup_growth_rate_data(cls, name="grth rt", formula="pie*1000"): return growth_rate @classmethod - def setup_growth_rate_description_data( - cls, growth_rate, description="grth rt desc" - ): + def setup_growth_rate_description_data(cls, growth_rate, description="grth rt desc"): language = cls.setup_language_data(name="lang for " + description) growth_rate_description = GrowthRateDescription.objects.create( @@ -627,9 +719,7 @@ def setup_location_game_index_data(cls, location, game_index=0): def setup_location_name_data(cls, location, name="lctn nm"): language = cls.setup_language_data(name="lang for " + name) - location_name = LocationName.objects.create( - language=language, name=name, location=location - ) + location_name = LocationName.objects.create(language=language, name=name, location=location) location_name.save() return location_name @@ -638,9 +728,7 @@ def setup_location_name_data(cls, location, name="lctn nm"): def setup_location_area_data(cls, location=None, name="lctn area", game_index=0): location = location or cls.setup_location_data(name="lctn for " + name) - location_area = LocationArea( - location=location, name=name, game_index=game_index - ) + location_area = LocationArea(location=location, name=name, game_index=game_index) location_area.save() return location_area @@ -649,9 +737,7 @@ def setup_location_area_data(cls, location=None, name="lctn area", game_index=0) def setup_location_area_name_data(cls, location_area, name="lctn area nm"): language = cls.setup_language_data(name="lang for " + name) - location_area_name = LocationAreaName.objects.create( - language=language, name=name, location_area=location_area - ) + location_area_name = LocationAreaName.objects.create(language=language, name=name, location_area=location_area) location_area_name.save() return location_area_name @@ -659,15 +745,11 @@ def setup_location_area_name_data(cls, location_area, name="lctn area nm"): # Type Data @classmethod def setup_type_data(cls, name="tp", move_damage_class=None, generation=None): - move_damage_class = move_damage_class or cls.setup_move_damage_class_data( - name="mv dmg cls for " + name - ) + move_damage_class = move_damage_class or cls.setup_move_damage_class_data(name="mv dmg cls for " + name) generation = generation or cls.setup_generation_data(name="rgn for " + name) - type = Type( - name=name, generation=generation, move_damage_class=move_damage_class - ) + type = Type(name=name, generation=generation, move_damage_class=move_damage_class) type.save() return type @@ -685,9 +767,7 @@ def setup_type_name_data(cls, type, name="tp nm"): def setup_type_game_index_data(cls, type, game_index=0): generation = cls.setup_generation_data(name="gen for tp gm indx") - type_game_index = TypeGameIndex.objects.create( - type=type, game_index=game_index, generation=generation - ) + type_game_index = TypeGameIndex.objects.create(type=type, game_index=game_index, generation=generation) type_game_index.save() return type_game_index @@ -724,18 +804,14 @@ def setup_type_sprites_data(cls, type): if type.id == 18 and generation.endswith(("-iii", "-iv", "-v")): sprites[generation][game] = None - elif type.id == 19 and generation.endswith( - ("-iii", "-iv", "-v", "-vi", "-vii", "-viii") - ): + elif type.id == 19 and generation.endswith(("-iii", "-iv", "-v", "-vi", "-vii", "-viii")): sprites[generation][game] = None else: sprites[generation][game] = { "name_icon": f"https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/types/{generation}/{game}/{type.id}.png" } - type_sprites = TypeSprites.objects.create( - type=type, sprites=json.dumps(sprites) - ) + type_sprites = TypeSprites.objects.create(type=type, sprites=json.dumps(sprites)) type_sprites.save() return type_sprites, game_map @@ -785,9 +861,7 @@ def setup_move_category_data(cls, name="mv ctgry"): return move_category @classmethod - def setup_move_category_description_data( - cls, move_category, description="mv ctgry desc" - ): + def setup_move_category_description_data(cls, move_category, description="mv ctgry desc"): language = cls.setup_language_data(name="lang for " + description) move_category_description = MoveMetaCategoryDescription.objects.create( @@ -842,9 +916,7 @@ def setup_move_damage_class_name_data(cls, move_damage_class, name="mv dmg cls n return move_damage_class_name @classmethod - def setup_move_damage_class_description_data( - cls, move_damage_class, description="mv dmg cls desc" - ): + def setup_move_damage_class_description_data(cls, move_damage_class, description="mv dmg cls desc"): language = cls.setup_language_data(name="lang for " + description) move_damage_class_description = MoveDamageClassDescription.objects.create( @@ -864,9 +936,7 @@ def setup_move_learn_method_data(cls, name="mv lrn mthd"): return move_learn_method @classmethod - def setup_move_learn_method_name_data( - cls, move_learn_method, name="mv lrn mthd nm" - ): + def setup_move_learn_method_name_data(cls, move_learn_method, name="mv lrn mthd nm"): language = cls.setup_language_data(name="lang for " + name) move_learn_method_name = MoveLearnMethodName.objects.create( @@ -877,9 +947,7 @@ def setup_move_learn_method_name_data( return move_learn_method_name @classmethod - def setup_move_learn_method_description_data( - cls, move_learn_method, description="mv lrn mthd desc" - ): + def setup_move_learn_method_description_data(cls, move_learn_method, description="mv lrn mthd desc"): language = cls.setup_language_data(name="lang for " + description) move_learn_method_description = MoveLearnMethodDescription.objects.create( @@ -902,17 +970,13 @@ def setup_move_target_data(cls, name="mv trgt"): def setup_move_target_name_data(cls, move_target, name="mv trgt nm"): language = cls.setup_language_data(name="lang for " + name) - move_target_name = MoveTargetName.objects.create( - move_target=move_target, language=language, name=name - ) + move_target_name = MoveTargetName.objects.create(move_target=move_target, language=language, name=name) move_target_name.save() return move_target_name @classmethod - def setup_move_target_description_data( - cls, move_target, description="mv trgt desc" - ): + def setup_move_target_description_data(cls, move_target, description="mv trgt desc"): language = cls.setup_language_data(name="lang for " + description) move_target_description = MoveTargetDescription.objects.create( @@ -924,17 +988,13 @@ def setup_move_target_description_data( @classmethod def setup_contest_combo_data(cls, first_move, second_move): - contest_combo = ContestCombo.objects.create( - first_move=first_move, second_move=second_move - ) + contest_combo = ContestCombo.objects.create(first_move=first_move, second_move=second_move) contest_combo.save() return contest_combo @classmethod - def setup_version_group_move_learn_method_data( - cls, version_group=None, move_learn_method=None - ): + def setup_version_group_move_learn_method_data(cls, version_group=None, move_learn_method=None): version_group_move_learn_method = VersionGroupMoveLearnMethod.objects.create( version_group=version_group, move_learn_method=move_learn_method ) @@ -944,9 +1004,7 @@ def setup_version_group_move_learn_method_data( @classmethod def setup_super_contest_combo_data(cls, first_move, second_move): - super_contest_combo = SuperContestCombo.objects.create( - first_move=first_move, second_move=second_move - ) + super_contest_combo = SuperContestCombo.objects.create(first_move=first_move, second_move=second_move) super_contest_combo.save() return super_contest_combo @@ -985,27 +1043,19 @@ def setup_move_data( priority=0, effect_chance=50, ): - contest_type = contest_type or cls.setup_contest_type_data( - name="cntst tp for " + name - ) + contest_type = contest_type or cls.setup_contest_type_data(name="cntst tp for " + name) contest_effect = contest_effect or cls.setup_contest_effect_data() - super_contest_effect = ( - super_contest_effect or cls.setup_super_contest_effect_data() - ) + super_contest_effect = super_contest_effect or cls.setup_super_contest_effect_data() generation = generation or cls.setup_generation_data(name="gen for " + name) type = type or cls.setup_type_data(name="tp for " + name) - move_target = move_target or cls.setup_move_target_data( - name="mv trgt for " + name - ) + move_target = move_target or cls.setup_move_target_data(name="mv trgt for " + name) - move_damage_class = move_damage_class or cls.setup_move_damage_class_data( - name="mv dmg cls for " + name - ) + move_damage_class = move_damage_class or cls.setup_move_damage_class_data(name="mv dmg cls for " + name) move = Move.objects.create( name=name, @@ -1088,9 +1138,7 @@ def setup_move_change_data( accuracy=80, effect_chance=50, ): - version_group = version_group or cls.setup_version_group_data( - name="ver grp for mv chng" - ) + version_group = version_group or cls.setup_version_group_data(name="ver grp for mv chng") move_change = MoveChange.objects.create( move=move, @@ -1110,17 +1158,13 @@ def setup_move_change_data( def setup_move_effect_change_data(cls, move_effect=None): version_group = cls.setup_version_group_data(name="ver grp for mv chng") - move_effect_change = MoveEffectChange.objects.create( - move_effect=move_effect, version_group=version_group - ) + move_effect_change = MoveEffectChange.objects.create(move_effect=move_effect, version_group=version_group) move_effect_change.save() return move_effect_change @classmethod - def setup_move_effect_change_effect_text_data( - cls, move_effect_change=None, effect="mv efct chng efct txt" - ): + def setup_move_effect_change_effect_text_data(cls, move_effect_change=None, effect="mv efct chng efct txt"): language = cls.setup_language_data(name="lang for " + effect) move_effect_change_effect_text = MoveEffectChangeEffectText.objects.create( @@ -1133,9 +1177,7 @@ def setup_move_effect_change_effect_text_data( # Stat Data @classmethod def setup_stat_data(cls, name="stt", is_battle_only=True, game_index=1): - move_damage_class = cls.setup_move_damage_class_data( - name="mv dmg cls for " + name - ) + move_damage_class = cls.setup_move_damage_class_data(name="mv dmg cls for " + name) stat = Stat.objects.create( name=name, @@ -1160,9 +1202,7 @@ def setup_stat_name_data(cls, stat, name="stt nm"): def setup_move_stat_change_data(cls, move, stat=None, change=1): stat = stat or cls.setup_stat_data(name="stt for mv") - move_stat_change = MoveMetaStatChange.objects.create( - move=move, stat=stat, change=change - ) + move_stat_change = MoveMetaStatChange.objects.create(move=move, stat=stat, change=change) move_stat_change.save() return move_stat_change @@ -1196,9 +1236,7 @@ def setup_characteristic_data(cls, gene_mod_5=0, stat=None): return characteristic @classmethod - def setup_characteristic_description_data( - cls, characteristic, description="char desc" - ): + def setup_characteristic_description_data(cls, characteristic, description="char desc"): language = cls.setup_language_data(name="lang for " + description) characteristic_description = CharacteristicDescription.objects.create( @@ -1235,17 +1273,13 @@ def setup_nature_data( def setup_nature_name_data(cls, nature, name="ntr nm"): language = cls.setup_language_data(name="lang for " + name) - nature_name = NatureName.objects.create( - nature=nature, language=language, name=name - ) + nature_name = NatureName.objects.create(nature=nature, language=language, name=name) nature_name.save() return nature_name @classmethod - def setup_nature_pokeathlon_stat_data( - cls, nature=None, pokeathlon_stat=None, max_change=1 - ): + def setup_nature_pokeathlon_stat_data(cls, nature=None, pokeathlon_stat=None, max_change=1): nature_pokeathlon_stat = NaturePokeathlonStat.objects.create( nature=nature, pokeathlon_stat=pokeathlon_stat, @@ -1290,9 +1324,7 @@ def setup_pokedex_data(cls, region=None, name="pkdx"): def setup_pokedex_name_data(cls, pokedex, name="pkdx nm"): language = cls.setup_language_data(name="lang for " + name) - pokedex_name = PokedexName.objects.create( - pokedex=pokedex, language=language, name=name - ) + pokedex_name = PokedexName.objects.create(pokedex=pokedex, language=language, name=name) pokedex_name.save() return pokedex_name @@ -1310,13 +1342,9 @@ def setup_pokedex_description_data(cls, pokedex, description="pkdx desc"): @classmethod def setup_pokedex_version_group_data(cls, pokedex, version_group=None): - version_group = version_group or cls.setup_language_data( - name="ver grp for pkdx" - ) + version_group = version_group or cls.setup_language_data(name="ver grp for pkdx") - pokedex_version_group = PokedexVersionGroup.objects.create( - pokedex=pokedex, version_group=version_group - ) + pokedex_version_group = PokedexVersionGroup.objects.create(pokedex=pokedex, version_group=version_group) pokedex_version_group.save() return pokedex_version_group @@ -1355,9 +1383,7 @@ def setup_pokemon_color_data(cls, name="pkm clr"): def setup_pokemon_color_name_data(cls, pokemon_color, name="pkm clr nm"): language = cls.setup_language_data(name="lang for " + name) - pokemon_color_name = PokemonColorName.objects.create( - pokemon_color=pokemon_color, language=language, name=name - ) + pokemon_color_name = PokemonColorName.objects.create(pokemon_color=pokemon_color, language=language, name=name) pokemon_color_name.save() return pokemon_color_name @@ -1372,9 +1398,7 @@ def setup_pokemon_shape_data(cls, name="pkm shp"): return pokemon_shape @classmethod - def setup_pokemon_shape_name_data( - cls, pokemon_shape, name="pkm shp nm", awesome_name="pkm shp awsm nm" - ): + def setup_pokemon_shape_name_data(cls, pokemon_shape, name="pkm shp nm", awesome_name="pkm shp awsm nm"): language = cls.setup_language_data(name="lang for " + name) pokemon_shape_name = PokemonShapeName.objects.create( @@ -1388,9 +1412,7 @@ def setup_pokemon_shape_name_data( return pokemon_shape_name @classmethod - def setup_pokemon_species_form_description_data( - cls, pokemon_species=None, description="pkm spcs frm dscr" - ): + def setup_pokemon_species_form_description_data(cls, pokemon_species=None, description="pkm spcs frm dscr"): language = cls.setup_language_data(name="lang for " + description) pokemon_species_form_description = PokemonSpeciesDescription.objects.create( @@ -1401,9 +1423,7 @@ def setup_pokemon_species_form_description_data( return pokemon_species_form_description @classmethod - def setup_pokemon_species_flavor_text_data( - cls, pokemon_species, flavor_text="pkmn spcs flvr txt" - ): + def setup_pokemon_species_flavor_text_data(cls, pokemon_species, flavor_text="pkmn spcs flvr txt"): version = cls.setup_version_data(name="ver for " + flavor_text) language = cls.setup_language_data(name="lang for " + flavor_text) @@ -1442,21 +1462,13 @@ def setup_pokemon_species_data( ): generation = generation or cls.setup_generation_data(name="gen for " + name) - growth_rate = growth_rate or cls.setup_growth_rate_data( - name="grth rt for " + name - ) + growth_rate = growth_rate or cls.setup_growth_rate_data(name="grth rt for " + name) - pokemon_shape = pokemon_shape or cls.setup_pokemon_shape_data( - name="pkmn shp for " + name - ) + pokemon_shape = pokemon_shape or cls.setup_pokemon_shape_data(name="pkmn shp for " + name) - pokemon_color = pokemon_color or cls.setup_pokemon_color_data( - name="pkmn clr for " + name - ) + pokemon_color = pokemon_color or cls.setup_pokemon_color_data(name="pkmn clr for " + name) - pokemon_habitat = pokemon_habitat or cls.setup_pokemon_habitat_data( - name="pkm hbtt for " + name - ) + pokemon_habitat = pokemon_habitat or cls.setup_pokemon_habitat_data(name="pkm hbtt for " + name) pokemon_species = PokemonSpecies.objects.create( name=name, @@ -1483,9 +1495,7 @@ def setup_pokemon_species_data( return pokemon_species @classmethod - def setup_pokemon_species_name_data( - cls, pokemon_species, name="pkmn spcs nm", genus="pkmn spcs gns" - ): + def setup_pokemon_species_name_data(cls, pokemon_species, name="pkmn spcs nm", genus="pkmn spcs gns"): language = cls.setup_language_data(name="lang for " + name) pokemon_species_name = PokemonSpeciesName.objects.create( @@ -1508,9 +1518,7 @@ def setup_pokemon_dex_entry_data(cls, pokemon_species, pokedex, entry_number=100 @classmethod def setup_pokemon_egg_group_data(cls, pokemon_species, egg_group): - pokemon_egg_group = PokemonEggGroup( - pokemon_species=pokemon_species, egg_group=egg_group - ) + pokemon_egg_group = PokemonEggGroup(pokemon_species=pokemon_species, egg_group=egg_group) pokemon_egg_group.save() return pokemon_egg_group @@ -1526,9 +1534,7 @@ def setup_pokemon_data( order=1, is_default=False, ): - pokemon_species = pokemon_species or cls.setup_pokemon_species_data( - name="pkmn spcs for " + name - ) + pokemon_species = pokemon_species or cls.setup_pokemon_species_data(name="pkmn spcs for " + name) pokemon = Pokemon.objects.create( name=name, @@ -1547,9 +1553,7 @@ def setup_pokemon_data( def setup_pokemon_game_index_data(cls, pokemon, game_index=0): version = cls.setup_version_data(name="ver for pkmn gm indx") - pokemon_game_index = PokemonGameIndex.objects.create( - pokemon=pokemon, game_index=game_index, version=version - ) + pokemon_game_index = PokemonGameIndex.objects.create(pokemon=pokemon, game_index=game_index, version=version) pokemon_game_index.save() return pokemon_game_index @@ -1572,9 +1576,7 @@ def setup_pokemon_form_sprites_data( "back_shiny": sprite_path % pokemon_form.id if back_shiny else None, } - pokemon_form_sprites = PokemonFormSprites.objects.create( - pokemon_form=pokemon_form, sprites=json.dumps(sprites) - ) + pokemon_form_sprites = PokemonFormSprites.objects.create(pokemon_form=pokemon_form, sprites=json.dumps(sprites)) pokemon_form_sprites.save() return pokemon_form_sprites @@ -1621,17 +1623,13 @@ def setup_pokemon_form_data( def setup_pokemon_ability_data(cls, pokemon, ability=None, is_hidden=False, slot=1): ability = ability or cls.setup_ability_data(name="ablty for pkmn") - pokemon_ability = PokemonAbility( - pokemon=pokemon, ability=ability, is_hidden=is_hidden, slot=slot - ) + pokemon_ability = PokemonAbility(pokemon=pokemon, ability=ability, is_hidden=is_hidden, slot=slot) pokemon_ability.save() return pokemon_ability @classmethod - def setup_pokemon_past_ability_data( - cls, pokemon, generation, ability=None, is_hidden=False, slot=1 - ): + def setup_pokemon_past_ability_data(cls, pokemon, generation, ability=None, is_hidden=False, slot=1): ability = ability or cls.setup_ability_data(name="ablty for pkmn") pokemon_ability_past = PokemonAbilityPast( @@ -1649,9 +1647,7 @@ def setup_pokemon_past_ability_data( def setup_pokemon_stat_data(cls, pokemon, base_stat=10, effort=10): stat = cls.setup_stat_data(name="stt for pkmn") - pokemon_stat = PokemonStat( - pokemon=pokemon, stat=stat, base_stat=base_stat, effort=effort - ) + pokemon_stat = PokemonStat(pokemon=pokemon, stat=stat, base_stat=base_stat, effort=effort) pokemon_stat.save() return pokemon_stat @@ -1684,9 +1680,7 @@ def setup_pokemon_type_data(cls, pokemon, type=None, slot=1): def setup_pokemon_past_type_data(cls, pokemon, generation, type=None, slot=1): type = type or cls.setup_type_data(name="tp for pkmn") - pokemon_type_past = PokemonTypePast( - pokemon=pokemon, generation=generation, type=type, slot=slot - ) + pokemon_type_past = PokemonTypePast(pokemon=pokemon, generation=generation, type=type, slot=slot) pokemon_type_past.save() return pokemon_type_past @@ -1699,18 +1693,14 @@ def setup_pokemon_item_data(cls, pokemon=None, item=None, version=None, rarity=5 version = version or cls.setup_version_data(name="ver grp for pkmn itm") - pokemon_item = PokemonItem( - pokemon=pokemon, version=version, item=item, rarity=rarity - ) + pokemon_item = PokemonItem(pokemon=pokemon, version=version, item=item, rarity=rarity) pokemon_item.save() return pokemon_item @classmethod def setup_pokemon_move_data(cls, pokemon, move, version_group, level=0, order=1): - move_learn_method = cls.setup_move_learn_method_data( - name="mv lrn mthd for pkmn" - ) + move_learn_method = cls.setup_move_learn_method_data(name="mv lrn mthd for pkmn") pokemon_move = PokemonMove.objects.create( pokemon=pokemon, @@ -1742,46 +1732,24 @@ def setup_pokemon_sprites_data( showdown = { "front_default": showdown_path % pokemon.id if front_default else None, - "front_female": ( - showdown_path % f"female/{pokemon.id}" if front_female else None - ), - "front_shiny": ( - showdown_path % f"shiny/{pokemon.id}" if front_shiny else None - ), - "front_shiny_female": ( - showdown_path % f"shiny/female/{pokemon.id}" - if front_shiny_female - else None - ), - "back_default": ( - showdown_path % f"back/{pokemon.id}" if back_default else None - ), - "back_female": ( - showdown_path % f"back/female/{pokemon.id}" if back_female else None - ), - "back_shiny": ( - showdown_path % f"back/shiny/{pokemon.id}" if back_shiny else None - ), - "back_shiny_female": ( - showdown_path % f"back/shiny/female/{pokemon.id}" - if back_shiny_female - else None - ), + "front_female": (showdown_path % f"female/{pokemon.id}" if front_female else None), + "front_shiny": (showdown_path % f"shiny/{pokemon.id}" if front_shiny else None), + "front_shiny_female": (showdown_path % f"shiny/female/{pokemon.id}" if front_shiny_female else None), + "back_default": (showdown_path % f"back/{pokemon.id}" if back_default else None), + "back_female": (showdown_path % f"back/female/{pokemon.id}" if back_female else None), + "back_shiny": (showdown_path % f"back/shiny/{pokemon.id}" if back_shiny else None), + "back_shiny_female": (showdown_path % f"back/shiny/female/{pokemon.id}" if back_shiny_female else None), } sprites = { "front_default": sprite_path % pokemon.id if front_default else None, "front_female": sprite_path % pokemon.id if front_female else None, "front_shiny": sprite_path % pokemon.id if front_shiny else None, - "front_shiny_female": ( - sprite_path % pokemon.id if front_shiny_female else None - ), + "front_shiny_female": (sprite_path % pokemon.id if front_shiny_female else None), "back_default": sprite_path % pokemon.id if back_default else None, "back_female": sprite_path % pokemon.id if back_female else None, "back_shiny": sprite_path % pokemon.id if back_shiny else None, - "back_shiny_female": ( - sprite_path % pokemon.id if back_shiny_female else None - ), + "back_shiny_female": (sprite_path % pokemon.id if back_shiny_female else None), } pokemon_sprites = PokemonSprites.objects.create( @@ -1794,16 +1762,12 @@ def setup_pokemon_sprites_data( @classmethod def setup_pokemon_cries_data(cls, pokemon, latest=True, legacy=False): - cries_path = ( - "https://raw.githubusercontent.com/PokeAPI/cries/main/cries/pokemon/%s.ogg" - ) + cries_path = "https://raw.githubusercontent.com/PokeAPI/cries/main/cries/pokemon/%s.ogg" cries = { "latest": cries_path % f"latest/{pokemon.id}" if latest else None, "legacy": cries_path % f"legacy/{pokemon.id}" if legacy else None, } - pokemon_cries = PokemonCries.objects.create( - pokemon=pokemon, cries=json.dumps(cries) - ) + pokemon_cries = PokemonCries.objects.create(pokemon=pokemon, cries=json.dumps(cries)) pokemon_cries.save() return pokemon_cries @@ -1865,13 +1829,9 @@ def setup_pokemon_evolution_data( min_steps=None, min_damage_taken=None, ): - evolved_species = evolved_species or cls.setup_pokemon_species_data( - name="pkmn spcs for pkmn evltn" - ) + evolved_species = evolved_species or cls.setup_pokemon_species_data(name="pkmn spcs for pkmn evltn") - evolution_trigger = evolution_trigger or cls.setup_evolution_trigger_data( - name="evltn trgr for pkmn evltn" - ) + evolution_trigger = evolution_trigger or cls.setup_evolution_trigger_data(name="evltn trgr for pkmn evltn") pokemon_evolution = PokemonEvolution.objects.create( evolved_species=evolved_species, @@ -1930,9 +1890,7 @@ def setup_encounter_condition_data(cls, name="encntr cndtn"): return encounter_condition @classmethod - def setup_encounter_condition_name_data( - cls, encounter_condition, name="encntr cndtn nm" - ): + def setup_encounter_condition_name_data(cls, encounter_condition, name="encntr cndtn nm"): language = cls.setup_language_data(name="lang for " + name) encounter_condition_name = EncounterConditionName.objects.create( @@ -1943,9 +1901,7 @@ def setup_encounter_condition_name_data( return encounter_condition_name @classmethod - def setup_encounter_condition_value_data( - cls, encounter_condition, name="encntr cndtn vlu", is_default=False - ): + def setup_encounter_condition_value_data(cls, encounter_condition, name="encntr cndtn vlu", is_default=False): encounter_condition_value = EncounterConditionValue.objects.create( encounter_condition=encounter_condition, name=name, is_default=is_default ) @@ -1954,9 +1910,7 @@ def setup_encounter_condition_value_data( return encounter_condition_value @classmethod - def setup_encounter_condition_value_name_data( - cls, encounter_condition_value, name="encntr cndtn vlu nm" - ): + def setup_encounter_condition_value_name_data(cls, encounter_condition_value, name="encntr cndtn vlu nm"): language = cls.setup_language_data(name="lang for " + name) encounter_condition_value_name = EncounterConditionValueName.objects.create( @@ -1969,9 +1923,7 @@ def setup_encounter_condition_value_name_data( return encounter_condition_value_name @classmethod - def setup_encounter_condition_value_map_data( - cls, encounter, encounter_condition_value - ): + def setup_encounter_condition_value_map_data(cls, encounter, encounter_condition_value): encounter_condition_value_map = EncounterConditionValue.objects.create( encounter=encounter, encounter_condition_value=encounter_condition_value ) @@ -1981,9 +1933,7 @@ def setup_encounter_condition_value_map_data( @classmethod def setup_encounter_slot_data(cls, encounter_method=None, slot=0, rarity=0): - encounter_method = encounter_method or cls.setup_encounter_method_data( - name="encntr mthd for encntr slt" - ) + encounter_method = encounter_method or cls.setup_encounter_method_data(name="encntr mthd for encntr slt") version_group = cls.setup_version_group_data(name="ver grp for encntr slt") @@ -1998,9 +1948,7 @@ def setup_encounter_slot_data(cls, encounter_method=None, slot=0, rarity=0): return encounter_slot @classmethod - def setup_location_area_encounter_rate_data( - cls, location_area, encounter_method, rate=0 - ): + def setup_location_area_encounter_rate_data(cls, location_area, encounter_method, rate=0): version = cls.setup_version_data(name="ver for lctn area") location_area_encounter_rate = LocationAreaEncounterRate.objects.create( @@ -2023,9 +1971,7 @@ def setup_encounter_data( min_level=10, max_level=15, ): - location_area = location_area or cls.setup_location_area_data( - name="ver for encntr" - ) + location_area = location_area or cls.setup_location_area_data(name="ver for encntr") encounter_slot = encounter_slot or cls.setup_encounter_slot_data() @@ -2057,20 +2003,14 @@ def setup_pal_park_area_data(cls, name="pl prk area"): def setup_pal_park_area_name_data(cls, pal_park_area, name="pl prk area nm"): language = cls.setup_language_data(name="lang for " + name) - pal_park_area_name = PalParkAreaName.objects.create( - pal_park_area=pal_park_area, language=language, name=name - ) + pal_park_area_name = PalParkAreaName.objects.create(pal_park_area=pal_park_area, language=language, name=name) pal_park_area_name.save() return pal_park_area_name @classmethod - def setup_pal_park_data( - cls, pokemon_species=None, pal_park_area=None, base_score=10, rate=10 - ): - pal_park_area = pal_park_area or cls.setup_pal_park_area_data( - name="pl prk area" - ) + def setup_pal_park_data(cls, pokemon_species=None, pal_park_area=None, base_score=10, rate=10): + pal_park_area = pal_park_area or cls.setup_pal_park_area_data(name="pl prk area") pal_park = PalPark.objects.create( base_score=base_score, @@ -2088,15 +2028,9 @@ class APITests(APIData, APITestCase): # Gender Tests def test_gender_api(self): gender = self.setup_gender_data(name="female") - pokemon_species = self.setup_pokemon_species_data( - name="pkmn spcs for gndr", gender_rate=8 - ) - evolved_species = self.setup_pokemon_species_data( - name="evlvd pkmn spcs for gndr" - ) - self.setup_pokemon_evolution_data( - evolved_species=evolved_species, gender=gender - ) + pokemon_species = self.setup_pokemon_species_data(name="pkmn spcs for gndr", gender_rate=8) + evolved_species = self.setup_pokemon_species_data(name="evlvd pkmn spcs for gndr") + self.setup_pokemon_evolution_data(evolved_species=evolved_species, gender=gender) response = self.client.get("{}/gender/{}/".format(API_V2, gender.pk)) @@ -2118,9 +2052,7 @@ def test_gender_api(self): response.data["pokemon_species_details"][0]["pokemon_species"]["url"], "{}{}/pokemon-species/{}/".format(TEST_HOST, API_V2, pokemon_species.pk), ) - self.assertEqual( - response.data["required_for_evolution"][0]["name"], evolved_species.name - ) + self.assertEqual(response.data["required_for_evolution"][0]["name"], evolved_species.name) self.assertEqual( response.data["required_for_evolution"][0]["url"], "{}{}/pokemon-species/{}/".format(TEST_HOST, API_V2, evolved_species.pk), @@ -2149,9 +2081,7 @@ def test_language_api(self): ) self.assertEqual( response.data["names"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, language_name.local_language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, language_name.local_language.pk), ) # Region Tests @@ -2159,9 +2089,7 @@ def test_region_api(self): region = self.setup_region_data(name="base reg") region_name = self.setup_region_name_data(region, name="base reg name") location = self.setup_location_data(region=region, name="lctn for base rgn") - generation = self.setup_generation_data( - region=region, name="gnrtn for base rgn" - ) + generation = self.setup_generation_data(region=region, name="gnrtn for base rgn") pokedex = self.setup_pokedex_data(region=region, name="pkdx for base rgn") version_group = self.setup_version_group_data(name="ver grp for base rgn") self.setup_version_group_region_data(region=region, version_group=version_group) @@ -2175,9 +2103,7 @@ def test_region_api(self): self.assertEqual(response.data["name"], region.name) # name params self.assertEqual(response.data["names"][0]["name"], region_name.name) - self.assertEqual( - response.data["names"][0]["language"]["name"], region_name.language.name - ) + self.assertEqual(response.data["names"][0]["language"]["name"], region_name.language.name) self.assertEqual( response.data["names"][0]["language"]["url"], "{}{}/language/{}/".format(TEST_HOST, API_V2, region_name.language.pk), @@ -2210,20 +2136,12 @@ def test_region_api(self): # Generation Tests def test_generation_api(self): generation = self.setup_generation_data(name="base gen") - generation_name = self.setup_generation_name_data( - generation, name="base reg name" - ) - ability = self.setup_ability_data( - name="ablty for base gen", generation=generation - ) + generation_name = self.setup_generation_name_data(generation, name="base reg name") + ability = self.setup_ability_data(name="ablty for base gen", generation=generation) move = self.setup_move_data(name="mv for base gen", generation=generation) - pokemon_species = self.setup_pokemon_species_data( - name="pkmn spcs for base gen", generation=generation - ) + pokemon_species = self.setup_pokemon_species_data(name="pkmn spcs for base gen", generation=generation) type = self.setup_type_data(name="tp for base gen", generation=generation) - version_group = self.setup_version_group_data( - name="ver grp for base gen", generation=generation - ) + version_group = self.setup_version_group_data(name="ver grp for base gen", generation=generation) response = self.client.get("{}/generation/{}/".format(API_V2, generation.pk)) @@ -2232,9 +2150,7 @@ def test_generation_api(self): self.assertEqual(response.data["name"], generation.name) # name params self.assertEqual(response.data["names"][0]["name"], generation_name.name) - self.assertEqual( - response.data["names"][0]["language"]["name"], generation_name.language.name - ) + self.assertEqual(response.data["names"][0]["language"]["name"], generation_name.language.name) self.assertEqual( response.data["names"][0]["language"]["url"], "{}{}/language/{}/".format(TEST_HOST, API_V2, generation_name.language.pk), @@ -2264,9 +2180,7 @@ def test_generation_api(self): "{}{}/type/{}/".format(TEST_HOST, API_V2, type.pk), ) # species params - self.assertEqual( - response.data["pokemon_species"][0]["name"], pokemon_species.name - ) + self.assertEqual(response.data["pokemon_species"][0]["name"], pokemon_species.name) self.assertEqual( response.data["pokemon_species"][0]["url"], "{}{}/pokemon-species/{}/".format(TEST_HOST, API_V2, pokemon_species.pk), @@ -2291,22 +2205,16 @@ def test_version_api(self): self.assertEqual(response.data["name"], version.name) # name params self.assertEqual(response.data["names"][0]["name"], version_name.name) - self.assertEqual( - response.data["names"][0]["language"]["name"], version_name.language.name - ) + self.assertEqual(response.data["names"][0]["language"]["name"], version_name.language.name) self.assertEqual( response.data["names"][0]["language"]["url"], "{}{}/language/{}/".format(TEST_HOST, API_V2, version_name.language.pk), ) # version group params - self.assertEqual( - response.data["version_group"]["name"], version.version_group.name - ) + self.assertEqual(response.data["version_group"]["name"], version.version_group.name) self.assertEqual( response.data["version_group"]["url"], - "{}{}/version-group/{}/".format( - TEST_HOST, API_V2, version.version_group.pk - ), + "{}{}/version-group/{}/".format(TEST_HOST, API_V2, version.version_group.pk), ) def test_version_group_api(self): @@ -2316,18 +2224,12 @@ def test_version_group_api(self): version_group=version_group, move_learn_method=move_learn_method ) region = self.setup_region_data(name="rgn for ver grp") - version = self.setup_version_data( - name="ver for base ver grp", version_group=version_group - ) + version = self.setup_version_data(name="ver for base ver grp", version_group=version_group) self.setup_version_group_region_data(version_group=version_group, region=region) pokedex = self.setup_pokedex_data(name="pkdx for base ver group") - self.setup_pokedex_version_group_data( - pokedex=pokedex, version_group=version_group - ) + self.setup_pokedex_version_group_data(pokedex=pokedex, version_group=version_group) - response = self.client.get( - "{}/version-group/{}/".format(API_V2, version_group.pk) - ) + response = self.client.get("{}/version-group/{}/".format(API_V2, version_group.pk)) # base params self.assertEqual(response.data["id"], version_group.pk) @@ -2340,14 +2242,10 @@ def test_version_group_api(self): "{}{}/version/{}/".format(TEST_HOST, API_V2, version.pk), ) # generation params - self.assertEqual( - response.data["generation"]["name"], version_group.generation.name - ) + self.assertEqual(response.data["generation"]["name"], version_group.generation.name) self.assertEqual( response.data["generation"]["url"], - "{}{}/generation/{}/".format( - TEST_HOST, API_V2, version_group.generation.pk - ), + "{}{}/generation/{}/".format(TEST_HOST, API_V2, version_group.generation.pk), ) # region params self.assertEqual(response.data["regions"][0]["name"], region.name) @@ -2356,14 +2254,10 @@ def test_version_group_api(self): "{}{}/region/{}/".format(TEST_HOST, API_V2, region.pk), ) # move learn method params - self.assertEqual( - response.data["move_learn_methods"][0]["name"], move_learn_method.name - ) + self.assertEqual(response.data["move_learn_methods"][0]["name"], move_learn_method.name) self.assertEqual( response.data["move_learn_methods"][0]["url"], - "{}{}/move-learn-method/{}/".format( - TEST_HOST, API_V2, move_learn_method.pk - ), + "{}{}/move-learn-method/{}/".format(TEST_HOST, API_V2, move_learn_method.pk), ) # pokedex group self.assertEqual(response.data["pokedexes"][0]["name"], pokedex.name) @@ -2375,13 +2269,9 @@ def test_version_group_api(self): # Egg Group Tests def test_egg_group_api(self): egg_group = self.setup_egg_group_data(name="base egg grp") - egg_group_name = self.setup_egg_group_name_data( - egg_group, name="base egg grp name" - ) + egg_group_name = self.setup_egg_group_name_data(egg_group, name="base egg grp name") pokemon_species = self.setup_pokemon_species_data() - self.setup_pokemon_egg_group_data( - pokemon_species=pokemon_species, egg_group=egg_group - ) + self.setup_pokemon_egg_group_data(pokemon_species=pokemon_species, egg_group=egg_group) response = self.client.get("{}/egg-group/{}/".format(API_V2, egg_group.pk)) @@ -2392,17 +2282,13 @@ def test_egg_group_api(self): self.assertEqual(response.data["name"], egg_group.name) # name params self.assertEqual(response.data["names"][0]["name"], egg_group_name.name) - self.assertEqual( - response.data["names"][0]["language"]["name"], egg_group_name.language.name - ) + self.assertEqual(response.data["names"][0]["language"]["name"], egg_group_name.language.name) self.assertEqual( response.data["names"][0]["language"]["url"], "{}{}/language/{}/".format(TEST_HOST, API_V2, egg_group_name.language.pk), ) # species params - self.assertEqual( - response.data["pokemon_species"][0]["name"], pokemon_species.name - ) + self.assertEqual(response.data["pokemon_species"][0]["name"], pokemon_species.name) self.assertEqual( response.data["pokemon_species"][0]["url"], "{}{}/pokemon-species/{}/".format(TEST_HOST, API_V2, pokemon_species.pk), @@ -2412,20 +2298,14 @@ def test_egg_group_api(self): def test_ability_api(self): ability = self.setup_ability_data(name="base ablty") ability_name = self.setup_ability_name_data(ability, name="base ablty name") - ability_effect_text = self.setup_ability_effect_text_data( - ability, effect="base ablty efct" - ) - ability_flavor_text = self.setup_ability_flavor_text_data( - ability, flavor_text="base flvr txt" - ) + ability_effect_text = self.setup_ability_effect_text_data(ability, effect="base ablty efct") + ability_flavor_text = self.setup_ability_flavor_text_data(ability, flavor_text="base flvr txt") ability_change = self.setup_ability_change_data(ability) ability_change_effect_text = self.setup_ability_change_effect_text_data( ability_change, effect="base ablty chng efct" ) pokemon = self.setup_pokemon_data(name="pkmn for ablty") - pokemon_ability = self.setup_pokemon_ability_data( - ability=ability, pokemon=pokemon - ) + pokemon_ability = self.setup_pokemon_ability_data(ability=ability, pokemon=pokemon) response = self.client.get("{}/ability/{}/".format(API_V2, ability.pk)) @@ -2435,17 +2315,13 @@ def test_ability_api(self): self.assertEqual(response.data["is_main_series"], ability.is_main_series) # name params self.assertEqual(response.data["names"][0]["name"], ability_name.name) - self.assertEqual( - response.data["names"][0]["language"]["name"], ability_name.language.name - ) + self.assertEqual(response.data["names"][0]["language"]["name"], ability_name.language.name) self.assertEqual( response.data["names"][0]["language"]["url"], "{}{}/language/{}/".format(TEST_HOST, API_V2, ability_name.language.pk), ) # description params - self.assertEqual( - response.data["effect_entries"][0]["effect"], ability_effect_text.effect - ) + self.assertEqual(response.data["effect_entries"][0]["effect"], ability_effect_text.effect) self.assertEqual( response.data["effect_entries"][0]["short_effect"], ability_effect_text.short_effect, @@ -2456,9 +2332,7 @@ def test_ability_api(self): ) self.assertEqual( response.data["effect_entries"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, ability_effect_text.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, ability_effect_text.language.pk), ) # flavor text params self.assertEqual( @@ -2475,9 +2349,7 @@ def test_ability_api(self): ) self.assertEqual( response.data["flavor_text_entries"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, ability_flavor_text.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, ability_flavor_text.language.pk), ) # generation params self.assertEqual(response.data["generation"]["name"], ability.generation.name) @@ -2492,9 +2364,7 @@ def test_ability_api(self): ) self.assertEqual( response.data["effect_changes"][0]["version_group"]["url"], - "{}{}/version-group/{}/".format( - TEST_HOST, API_V2, ability_change.version_group.pk - ), + "{}{}/version-group/{}/".format(TEST_HOST, API_V2, ability_change.version_group.pk), ) self.assertEqual( response.data["effect_changes"][0]["effect_entries"][0]["effect"], @@ -2506,14 +2376,10 @@ def test_ability_api(self): ) self.assertEqual( response.data["effect_changes"][0]["effect_entries"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, ability_change_effect_text.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, ability_change_effect_text.language.pk), ) # pokemon params - self.assertEqual( - response.data["pokemon"][0]["is_hidden"], pokemon_ability.is_hidden - ) + self.assertEqual(response.data["pokemon"][0]["is_hidden"], pokemon_ability.is_hidden) self.assertEqual(response.data["pokemon"][0]["slot"], pokemon_ability.slot) self.assertEqual(response.data["pokemon"][0]["pokemon"]["name"], pokemon.name) self.assertEqual( @@ -2525,18 +2391,14 @@ def test_ability_api(self): def test_item_attribute_api(self): # item attribute data item_attribute = self.setup_item_attribute_data(name="base itm attr") - item_attribute_name = self.setup_item_attribute_name_data( - item_attribute, name="base itm attr nm" - ) + item_attribute_name = self.setup_item_attribute_name_data(item_attribute, name="base itm attr nm") item_attribute_description = self.setup_item_attribute_description_data( item_attribute, description="base itm attr desc" ) item = self.setup_item_data(name="itm fr base itm attr") self.setup_item_attribute_map_data(item_attribute=item_attribute, item=item) - response = self.client.get( - "{}/item-attribute/{}/".format(API_V2, item_attribute.pk) - ) + response = self.client.get("{}/item-attribute/{}/".format(API_V2, item_attribute.pk)) # base params self.assertEqual(response.data["id"], item_attribute.pk) @@ -2549,9 +2411,7 @@ def test_item_attribute_api(self): ) self.assertEqual( response.data["names"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, item_attribute_name.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, item_attribute_name.language.pk), ) # description params self.assertEqual( @@ -2564,9 +2424,7 @@ def test_item_attribute_api(self): ) self.assertEqual( response.data["descriptions"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, item_attribute_description.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, item_attribute_description.language.pk), ) # item params self.assertEqual(response.data["items"][0]["name"], item.name) @@ -2578,16 +2436,10 @@ def test_item_attribute_api(self): def test_item_category_api(self): # item category data item_category = self.setup_item_category_data(name="base itm ctgry") - item_category_name = self.setup_item_category_name_data( - item_category, name="base itm ctgry nm" - ) - item = self.setup_item_data( - item_category=item_category, name="itm fr base itm ctgry" - ) + item_category_name = self.setup_item_category_name_data(item_category, name="base itm ctgry nm") + item = self.setup_item_data(item_category=item_category, name="itm fr base itm ctgry") - response = self.client.get( - "{}/item-category/{}/".format(API_V2, item_category.pk) - ) + response = self.client.get("{}/item-category/{}/".format(API_V2, item_category.pk)) # base params self.assertEqual(response.data["id"], item_category.pk) @@ -2600,19 +2452,13 @@ def test_item_category_api(self): ) self.assertEqual( response.data["names"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, item_category_name.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, item_category_name.language.pk), ) # pocket params - self.assertEqual( - response.data["pocket"]["name"], item_category.item_pocket.name - ) + self.assertEqual(response.data["pocket"]["name"], item_category.item_pocket.name) self.assertEqual( response.data["pocket"]["url"], - "{}{}/item-pocket/{}/".format( - TEST_HOST, API_V2, item_category.item_pocket.pk - ), + "{}{}/item-pocket/{}/".format(TEST_HOST, API_V2, item_category.item_pocket.pk), ) # item params self.assertEqual(response.data["items"][0]["name"], item.name) @@ -2627,13 +2473,9 @@ def test_item_fling_effect_api(self): item_fling_effect_effect_text = self.setup_item_fling_effect_effect_text_data( item_fling_effect, effect="base itm flng efct nm" ) - item = self.setup_item_data( - item_fling_effect=item_fling_effect, name="itm fr base itm attr" - ) + item = self.setup_item_data(item_fling_effect=item_fling_effect, name="itm fr base itm attr") - response = self.client.get( - "{}/item-fling-effect/{}/".format(API_V2, item_fling_effect.pk) - ) + response = self.client.get("{}/item-fling-effect/{}/".format(API_V2, item_fling_effect.pk)) # base params self.assertEqual(response.data["id"], item_fling_effect.pk) @@ -2649,9 +2491,7 @@ def test_item_fling_effect_api(self): ) self.assertEqual( response.data["effect_entries"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, item_fling_effect_effect_text.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, item_fling_effect_effect_text.language.pk), ) # item params self.assertEqual(response.data["items"][0]["name"], item.name) @@ -2663,9 +2503,7 @@ def test_item_fling_effect_api(self): def test_item_pocket_api(self): # item pocket data item_pocket = self.setup_item_pocket_data(name="base itm pkt") - item_pocket_name = self.setup_item_pocket_name_data( - item_pocket, name="base itm pkt nm" - ) + item_pocket_name = self.setup_item_pocket_name_data(item_pocket, name="base itm pkt nm") response = self.client.get("{}/item-pocket/{}/".format(API_V2, item_pocket.pk)) @@ -2685,14 +2523,10 @@ def test_item_pocket_api(self): def test_item_api(self): item_category = self.setup_item_category_data(name="itm ctgry for base itm") - item_fling_effect = self.setup_item_fling_effect_data( - name="itm flng efct for base itm" - ) + item_fling_effect = self.setup_item_fling_effect_data(name="itm flng efct for base itm") item = self.setup_item_data(item_category, item_fling_effect, name="base itm") item_name = self.setup_item_name_data(item, name="base itm name") - item_flavor_text = self.setup_item_flavor_text_data( - item, flavor_text="base itm flvr txt" - ) + item_flavor_text = self.setup_item_flavor_text_data(item, flavor_text="base itm flvr txt") item_effect_text = self.setup_item_effect_text_data( item, effect="base nrml efct", short_effect="base shrt efct" ) @@ -2707,9 +2541,7 @@ def test_item_api(self): item_attribute_map = ItemAttributeMap(item=item, item_attribute=item_attribute) item_attribute_map.save() - response = self.client.get( - "{}/item/{}/".format(API_V2, item.pk), headers={"host": "testserver"} - ) + response = self.client.get("{}/item/{}/".format(API_V2, item.pk), headers={"host": "testserver"}) # base params self.assertEqual(response.data["id"], item.pk) @@ -2718,9 +2550,7 @@ def test_item_api(self): self.assertEqual(response.data["fling_power"], item.fling_power) # name params self.assertEqual(response.data["names"][0]["name"], item_name.name) - self.assertEqual( - response.data["names"][0]["language"]["name"], item_name.language.name - ) + self.assertEqual(response.data["names"][0]["language"]["name"], item_name.language.name) self.assertEqual( response.data["names"][0]["language"]["url"], "{}{}/language/{}/".format(TEST_HOST, API_V2, item_name.language.pk), @@ -2736,9 +2566,7 @@ def test_item_api(self): ) self.assertEqual( response.data["flavor_text_entries"][0]["version_group"]["url"], - "{}{}/version-group/{}/".format( - TEST_HOST, API_V2, item_flavor_text.version_group.pk - ), + "{}{}/version-group/{}/".format(TEST_HOST, API_V2, item_flavor_text.version_group.pk), ) self.assertEqual( response.data["flavor_text_entries"][0]["language"]["name"], @@ -2749,9 +2577,7 @@ def test_item_api(self): "{}{}/language/{}/".format(TEST_HOST, API_V2, item_flavor_text.language.pk), ) # effect text params - self.assertEqual( - response.data["effect_entries"][0]["effect"], item_effect_text.effect - ) + self.assertEqual(response.data["effect_entries"][0]["effect"], item_effect_text.effect) self.assertEqual( response.data["effect_entries"][0]["short_effect"], item_effect_text.short_effect, @@ -2774,9 +2600,7 @@ def test_item_api(self): self.assertEqual(response.data["fling_effect"]["name"], item_fling_effect.name) self.assertEqual( response.data["fling_effect"]["url"], - "{}{}/item-fling-effect/{}/".format( - TEST_HOST, API_V2, item_fling_effect.pk - ), + "{}{}/item-fling-effect/{}/".format(TEST_HOST, API_V2, item_fling_effect.pk), ) # attribute params self.assertEqual(response.data["attributes"][0]["name"], item_attribute.name) @@ -2785,23 +2609,17 @@ def test_item_api(self): "{}{}/item-attribute/{}/".format(TEST_HOST, API_V2, item_attribute.pk), ) # game indices params - self.assertEqual( - response.data["game_indices"][0]["game_index"], item_game_index.game_index - ) + self.assertEqual(response.data["game_indices"][0]["game_index"], item_game_index.game_index) self.assertEqual( response.data["game_indices"][0]["generation"]["name"], item_game_index.generation.name, ) self.assertEqual( response.data["game_indices"][0]["generation"]["url"], - "{}{}/generation/{}/".format( - TEST_HOST, API_V2, item_game_index.generation.pk - ), + "{}{}/generation/{}/".format(TEST_HOST, API_V2, item_game_index.generation.pk), ) # held by params - self.assertEqual( - response.data["held_by_pokemon"][0]["pokemon"]["name"], pokemon.name - ) + self.assertEqual(response.data["held_by_pokemon"][0]["pokemon"]["name"], pokemon.name) self.assertEqual( response.data["held_by_pokemon"][0]["pokemon"]["url"], "{}{}/pokemon/{}/".format(TEST_HOST, API_V2, pokemon.pk), @@ -2811,9 +2629,7 @@ def test_item_api(self): pokemon_item.rarity, ) self.assertEqual( - response.data["held_by_pokemon"][0]["version_details"][0]["version"][ - "name" - ], + response.data["held_by_pokemon"][0]["version_details"][0]["version"]["name"], pokemon_item.version.name, ) self.assertEqual( @@ -2842,16 +2658,10 @@ def test_item_api(self): # Berry Tests def test_berry_firmness_api(self): berry_firmness = self.setup_berry_firmness_data(name="base bry frmns") - berry_firmness_name = self.setup_berry_firmness_name_data( - berry_firmness, name="base bry frmns nm" - ) - berry = self.setup_berry_data( - berry_firmness=berry_firmness, name="bry for base frmns" - ) + berry_firmness_name = self.setup_berry_firmness_name_data(berry_firmness, name="base bry frmns nm") + berry = self.setup_berry_data(berry_firmness=berry_firmness, name="bry for base frmns") - response = self.client.get( - "{}/berry-firmness/{}/".format(API_V2, berry_firmness.pk) - ) + response = self.client.get("{}/berry-firmness/{}/".format(API_V2, berry_firmness.pk)) # base params self.assertEqual(response.data["id"], berry_firmness.pk) @@ -2864,9 +2674,7 @@ def test_berry_firmness_api(self): ) self.assertEqual( response.data["names"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, berry_firmness_name.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, berry_firmness_name.language.pk), ) # berry params self.assertEqual(response.data["berries"][0]["name"], berry.name) @@ -2877,17 +2685,11 @@ def test_berry_firmness_api(self): def test_berry_flavor_api(self): berry_flavor = self.setup_berry_flavor_data(name="base bry flvr") - berry_flavor_name = self.setup_berry_flavor_name_data( - berry_flavor, name="base bry flvr nm" - ) + berry_flavor_name = self.setup_berry_flavor_name_data(berry_flavor, name="base bry flvr nm") berry = self.setup_berry_data(name="bry for base bry flvr") - berry_flavor_map = self.setup_berry_flavor_map_data( - berry=berry, berry_flavor=berry_flavor, potency=50 - ) + berry_flavor_map = self.setup_berry_flavor_map_data(berry=berry, berry_flavor=berry_flavor, potency=50) - response = self.client.get( - "{}/berry-flavor/{}/".format(API_V2, berry_flavor.pk) - ) + response = self.client.get("{}/berry-flavor/{}/".format(API_V2, berry_flavor.pk)) # base params self.assertEqual(response.data["id"], berry_flavor.pk) @@ -2900,24 +2702,16 @@ def test_berry_flavor_api(self): ) self.assertEqual( response.data["names"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, berry_flavor_name.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, berry_flavor_name.language.pk), ) # contest type params - self.assertEqual( - response.data["contest_type"]["name"], berry_flavor.contest_type.name - ) + self.assertEqual(response.data["contest_type"]["name"], berry_flavor.contest_type.name) self.assertEqual( response.data["contest_type"]["url"], - "{}{}/contest-type/{}/".format( - TEST_HOST, API_V2, berry_flavor.contest_type.pk - ), + "{}{}/contest-type/{}/".format(TEST_HOST, API_V2, berry_flavor.contest_type.pk), ) # berry params - self.assertEqual( - response.data["berries"][0]["potency"], berry_flavor_map.potency - ) + self.assertEqual(response.data["berries"][0]["potency"], berry_flavor_map.potency) self.assertEqual(response.data["berries"][0]["berry"]["name"], berry.name) self.assertEqual( response.data["berries"][0]["berry"]["url"], @@ -2928,9 +2722,7 @@ def test_berry_api(self): type = self.setup_type_data(name="tp fr base bry") berry = self.setup_berry_data(name="base bry", natural_gift_type=type) berry_flavor = self.setup_berry_flavor_data(name="bry flvr for base bry") - berry_flavor_map = self.setup_berry_flavor_map_data( - berry=berry, berry_flavor=berry_flavor - ) + berry_flavor_map = self.setup_berry_flavor_map_data(berry=berry, berry_flavor=berry_flavor) response = self.client.get("{}/berry/{}/".format(API_V2, berry.pk)) @@ -2947,9 +2739,7 @@ def test_berry_api(self): self.assertEqual(response.data["firmness"]["name"], berry.berry_firmness.name) self.assertEqual( response.data["firmness"]["url"], - "{}{}/berry-firmness/{}/".format( - TEST_HOST, API_V2, berry.berry_firmness.pk - ), + "{}{}/berry-firmness/{}/".format(TEST_HOST, API_V2, berry.berry_firmness.pk), ) # item params self.assertEqual(response.data["item"]["name"], berry.item.name) @@ -2958,12 +2748,8 @@ def test_berry_api(self): "{}{}/item/{}/".format(TEST_HOST, API_V2, berry.item.pk), ) # flavor params - self.assertEqual( - response.data["flavors"][0]["potency"], berry_flavor_map.potency - ) - self.assertEqual( - response.data["flavors"][0]["flavor"]["name"], berry_flavor.name - ) + self.assertEqual(response.data["flavors"][0]["potency"], berry_flavor_map.potency) + self.assertEqual(response.data["flavors"][0]["flavor"]["name"], berry_flavor.name) self.assertEqual( response.data["flavors"][0]["flavor"]["url"], "{}{}/berry-flavor/{}/".format(TEST_HOST, API_V2, berry_flavor.pk), @@ -2979,12 +2765,8 @@ def test_berry_api(self): def test_growth_rate_api(self): # item pocket data growth_rate = self.setup_growth_rate_data(name="base grth rt") - growth_rate_description = self.setup_growth_rate_description_data( - growth_rate, description="base grth rt desc" - ) - pokemon_species = self.setup_pokemon_species_data( - name="pkmn spcs for grth rt", growth_rate=growth_rate - ) + growth_rate_description = self.setup_growth_rate_description_data(growth_rate, description="base grth rt desc") + pokemon_species = self.setup_pokemon_species_data(name="pkmn spcs for grth rt", growth_rate=growth_rate) # map item attribute to item experience = Experience(growth_rate=growth_rate, level=10, experience=3000) @@ -3007,19 +2789,13 @@ def test_growth_rate_api(self): ) self.assertEqual( response.data["descriptions"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, growth_rate_description.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, growth_rate_description.language.pk), ) # experience params self.assertEqual(response.data["levels"][0]["level"], experience.level) - self.assertEqual( - response.data["levels"][0]["experience"], experience.experience - ) + self.assertEqual(response.data["levels"][0]["experience"], experience.experience) # species params - self.assertEqual( - response.data["pokemon_species"][0]["name"], pokemon_species.name - ) + self.assertEqual(response.data["pokemon_species"][0]["name"], pokemon_species.name) self.assertEqual( response.data["pokemon_species"][0]["url"], "{}{}/pokemon-species/{}/".format(TEST_HOST, API_V2, pokemon_species.pk), @@ -3029,9 +2805,7 @@ def test_growth_rate_api(self): def test_location_api(self): location = self.setup_location_data(name="base lctn") location_name = self.setup_location_name_data(location, name="base lctn name") - location_game_index = self.setup_location_game_index_data( - location, game_index=10 - ) + location_game_index = self.setup_location_game_index_data(location, game_index=10) response = self.client.get("{}/location/{}/".format(API_V2, location.pk)) @@ -3042,9 +2816,7 @@ def test_location_api(self): self.assertEqual(response.data["name"], location.name) # name params self.assertEqual(response.data["names"][0]["name"], location_name.name) - self.assertEqual( - response.data["names"][0]["language"]["name"], location_name.language.name - ) + self.assertEqual(response.data["names"][0]["language"]["name"], location_name.language.name) self.assertEqual( response.data["names"][0]["language"]["url"], "{}{}/language/{}/".format(TEST_HOST, API_V2, location_name.language.pk), @@ -3066,32 +2838,22 @@ def test_location_api(self): ) self.assertEqual( response.data["game_indices"][0]["generation"]["url"], - "{}{}/generation/{}/".format( - TEST_HOST, API_V2, location_game_index.generation.pk - ), + "{}{}/generation/{}/".format(TEST_HOST, API_V2, location_game_index.generation.pk), ) def test_location_area_api(self): location = self.setup_location_data(name="lctn for base lctn area") location_area = self.setup_location_area_data(location, name="base lctn area") - location_area_name = self.setup_location_area_name_data( - location_area, name="base lctn area name" - ) + location_area_name = self.setup_location_area_name_data(location_area, name="base lctn area name") - encounter_method = self.setup_encounter_method_data( - name="encntr mthd for lctn area" - ) + encounter_method = self.setup_encounter_method_data(name="encntr mthd for lctn area") location_area_encounter_rate = self.setup_location_area_encounter_rate_data( location_area, encounter_method, rate=20 ) pokemon_species1 = self.setup_pokemon_species_data(name="spcs for pkmn1") - pokemon1 = self.setup_pokemon_data( - name="pkmn1 for base encntr", pokemon_species=pokemon_species1 - ) - encounter_slot1 = self.setup_encounter_slot_data( - encounter_method, slot=1, rarity=30 - ) + pokemon1 = self.setup_pokemon_data(name="pkmn1 for base encntr", pokemon_species=pokemon_species1) + encounter_slot1 = self.setup_encounter_slot_data(encounter_method, slot=1, rarity=30) encounter1 = self.setup_encounter_data( pokemon=pokemon1, location_area=location_area, @@ -3101,12 +2863,8 @@ def test_location_area_api(self): ) pokemon_species2 = self.setup_pokemon_species_data(name="spcs for pkmn2") - pokemon2 = self.setup_pokemon_data( - name="pkmn2 for base encntr", pokemon_species=pokemon_species2 - ) - encounter_slot2 = self.setup_encounter_slot_data( - encounter_method, slot=2, rarity=40 - ) + pokemon2 = self.setup_pokemon_data(name="pkmn2 for base encntr", pokemon_species=pokemon_species2) + encounter_slot2 = self.setup_encounter_slot_data(encounter_method, slot=2, rarity=40) encounter2 = self.setup_encounter_data( pokemon=pokemon2, location_area=location_area, @@ -3115,9 +2873,7 @@ def test_location_area_api(self): max_level=36, ) - response = self.client.get( - "{}/location-area/{}/".format(API_V2, location_area.pk) - ) + response = self.client.get("{}/location-area/{}/".format(API_V2, location_area.pk)) self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -3133,9 +2889,7 @@ def test_location_area_api(self): ) self.assertEqual( response.data["names"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, location_area_name.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, location_area_name.language.pk), ) # location params self.assertEqual(response.data["location"]["name"], location.name) @@ -3157,23 +2911,15 @@ def test_location_area_api(self): location_area_encounter_rate.rate, ) self.assertEqual( - response.data["encounter_method_rates"][0]["version_details"][0]["version"][ - "name" - ], + response.data["encounter_method_rates"][0]["version_details"][0]["version"]["name"], location_area_encounter_rate.version.name, ) self.assertEqual( - response.data["encounter_method_rates"][0]["version_details"][0]["version"][ - "url" - ], - "{}{}/version/{}/".format( - TEST_HOST, API_V2, location_area_encounter_rate.version.pk - ), + response.data["encounter_method_rates"][0]["version_details"][0]["version"]["url"], + "{}{}/version/{}/".format(TEST_HOST, API_V2, location_area_encounter_rate.version.pk), ) # encounter params - self.assertEqual( - response.data["pokemon_encounters"][0]["pokemon"]["name"], pokemon1.name - ) + self.assertEqual(response.data["pokemon_encounters"][0]["pokemon"]["name"], pokemon1.name) self.assertEqual( response.data["pokemon_encounters"][0]["pokemon"]["url"], "{}{}/pokemon/{}/".format(TEST_HOST, API_V2, pokemon1.pk), @@ -3183,41 +2929,27 @@ def test_location_area_api(self): encounter_slot1.rarity, ) self.assertEqual( - response.data["pokemon_encounters"][0]["version_details"][0]["version"][ - "name" - ], + response.data["pokemon_encounters"][0]["version_details"][0]["version"]["name"], encounter1.version.name, ) self.assertEqual( - response.data["pokemon_encounters"][0]["version_details"][0]["version"][ - "url" - ], + response.data["pokemon_encounters"][0]["version_details"][0]["version"]["url"], "{}{}/version/{}/".format(TEST_HOST, API_V2, encounter1.version.pk), ) self.assertEqual( - response.data["pokemon_encounters"][0].get("version_details")[0][ - "encounter_details" - ][0]["chance"], + response.data["pokemon_encounters"][0].get("version_details")[0]["encounter_details"][0]["chance"], encounter_slot1.rarity, ) self.assertEqual( - response.data["pokemon_encounters"][0].get("version_details")[0][ - "encounter_details" - ][0]["method"]["name"], + response.data["pokemon_encounters"][0].get("version_details")[0]["encounter_details"][0]["method"]["name"], encounter_slot1.encounter_method.name, ) self.assertEqual( - response.data["pokemon_encounters"][0]["version_details"][0].get( - "encounter_details" - )[0]["method"]["url"], - "{}{}/encounter-method/{}/".format( - TEST_HOST, API_V2, encounter_slot1.encounter_method.pk - ), + response.data["pokemon_encounters"][0]["version_details"][0].get("encounter_details")[0]["method"]["url"], + "{}{}/encounter-method/{}/".format(TEST_HOST, API_V2, encounter_slot1.encounter_method.pk), ) - self.assertEqual( - response.data["pokemon_encounters"][1]["pokemon"]["name"], pokemon2.name - ) + self.assertEqual(response.data["pokemon_encounters"][1]["pokemon"]["name"], pokemon2.name) self.assertEqual( response.data["pokemon_encounters"][1]["pokemon"]["url"], "{}{}/pokemon/{}/".format(TEST_HOST, API_V2, pokemon2.pk), @@ -3227,51 +2959,33 @@ def test_location_area_api(self): encounter_slot2.rarity, ) self.assertEqual( - response.data["pokemon_encounters"][1]["version_details"][0]["version"][ - "name" - ], + response.data["pokemon_encounters"][1]["version_details"][0]["version"]["name"], encounter2.version.name, ) self.assertEqual( - response.data["pokemon_encounters"][1]["version_details"][0]["version"][ - "url" - ], + response.data["pokemon_encounters"][1]["version_details"][0]["version"]["url"], "{}{}/version/{}/".format(TEST_HOST, API_V2, encounter2.version.pk), ) self.assertEqual( - response.data["pokemon_encounters"][1].get("version_details")[0][ - "encounter_details" - ][0]["chance"], + response.data["pokemon_encounters"][1].get("version_details")[0]["encounter_details"][0]["chance"], encounter_slot2.rarity, ) self.assertEqual( - response.data["pokemon_encounters"][1]["version_details"][0].get( - "encounter_details" - )[0]["method"]["name"], + response.data["pokemon_encounters"][1]["version_details"][0].get("encounter_details")[0]["method"]["name"], encounter_slot2.encounter_method.name, ) self.assertEqual( - response.data["pokemon_encounters"][1]["version_details"][0].get( - "encounter_details" - )[0]["method"]["url"], - "{}{}/encounter-method/{}/".format( - TEST_HOST, API_V2, encounter_slot2.encounter_method.pk - ), + response.data["pokemon_encounters"][1]["version_details"][0].get("encounter_details")[0]["method"]["url"], + "{}{}/encounter-method/{}/".format(TEST_HOST, API_V2, encounter_slot2.encounter_method.pk), ) # Contest Tests def test_contest_type_api(self): contest_type = self.setup_contest_type_data(name="base cntst tp") - contest_type_name = self.setup_contest_type_name_data( - contest_type, name="base cntst tp name" - ) - berry_flavor = self.setup_berry_flavor_data( - name="bry for base cntst tp", contest_type=contest_type - ) + contest_type_name = self.setup_contest_type_name_data(contest_type, name="base cntst tp name") + berry_flavor = self.setup_berry_flavor_data(name="bry for base cntst tp", contest_type=contest_type) - response = self.client.get( - "{}/contest-type/{}/".format(API_V2, contest_type.pk) - ) + response = self.client.get("{}/contest-type/{}/".format(API_V2, contest_type.pk)) self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -3286,9 +3000,7 @@ def test_contest_type_api(self): ) self.assertEqual( response.data["names"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, contest_type_name.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, contest_type_name.language.pk), ) # berry params self.assertEqual(response.data["berry_flavor"]["name"], berry_flavor.name) @@ -3306,9 +3018,7 @@ def test_contest_effect_api(self): contest_effect, effect="base cntst efct eftc txt" ) - response = self.client.get( - "{}/contest-effect/{}/".format(API_V2, contest_effect.pk) - ) + response = self.client.get("{}/contest-effect/{}/".format(API_V2, contest_effect.pk)) self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -3327,9 +3037,7 @@ def test_contest_effect_api(self): ) self.assertEqual( response.data["effect_entries"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, contest_effect_effect_text.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, contest_effect_effect_text.language.pk), ) # flavor text params self.assertEqual( @@ -3342,25 +3050,17 @@ def test_contest_effect_api(self): ) self.assertEqual( response.data["flavor_text_entries"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, contest_effect_flavor_text.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, contest_effect_flavor_text.language.pk), ) def test_super_contest_effect_api(self): super_contest_effect = self.setup_super_contest_effect_data(appeal=10) - super_contest_effect_flavor_text = ( - self.setup_super_contest_effect_flavor_text_data( - super_contest_effect, flavor_text="base spr cntst efct flvr txt" - ) - ) - move = self.setup_move_data( - name="mv for base spr cntst efct", super_contest_effect=super_contest_effect + super_contest_effect_flavor_text = self.setup_super_contest_effect_flavor_text_data( + super_contest_effect, flavor_text="base spr cntst efct flvr txt" ) + move = self.setup_move_data(name="mv for base spr cntst efct", super_contest_effect=super_contest_effect) - response = self.client.get( - "{}/super-contest-effect/{}/".format(API_V2, super_contest_effect.pk) - ) + response = self.client.get("{}/super-contest-effect/{}/".format(API_V2, super_contest_effect.pk)) self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -3378,9 +3078,7 @@ def test_super_contest_effect_api(self): ) self.assertEqual( response.data["flavor_text_entries"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, super_contest_effect_flavor_text.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, super_contest_effect_flavor_text.language.pk), ) # move params self.assertEqual(response.data["moves"][0]["name"], move.name) @@ -3400,24 +3098,12 @@ def test_type_api(self): generation = self.setup_generation_data(name="past gen") - no_damage_to = self.setup_type_data( - name="no damage to tp", generation=generation - ) - half_damage_to = self.setup_type_data( - name="half damage to tp", generation=generation - ) - double_damage_to = self.setup_type_data( - name="double damage to tp", generation=generation - ) - no_damage_from = self.setup_type_data( - name="no damage from tp", generation=generation - ) - half_damage_from = self.setup_type_data( - name="half damage from tp", generation=generation - ) - double_damage_from = self.setup_type_data( - name="double damage from tp", generation=generation - ) + no_damage_to = self.setup_type_data(name="no damage to tp", generation=generation) + half_damage_to = self.setup_type_data(name="half damage to tp", generation=generation) + double_damage_to = self.setup_type_data(name="double damage to tp", generation=generation) + no_damage_from = self.setup_type_data(name="no damage from tp", generation=generation) + half_damage_from = self.setup_type_data(name="half damage from tp", generation=generation) + double_damage_from = self.setup_type_data(name="double damage from tp", generation=generation) newer_generation = self.setup_generation_data(name="newer_generation") @@ -3426,14 +3112,10 @@ def test_type_api(self): type_sprites, game_map = self.setup_type_sprites_data(type=type_obj) # type relations - no_damage_to_relation = TypeEfficacy( - damage_type=type_obj, target_type=no_damage_to, damage_factor=0 - ) + no_damage_to_relation = TypeEfficacy(damage_type=type_obj, target_type=no_damage_to, damage_factor=0) no_damage_to_relation.save() - half_damage_to_type_relation = TypeEfficacy( - damage_type=type_obj, target_type=half_damage_to, damage_factor=50 - ) + half_damage_to_type_relation = TypeEfficacy(damage_type=type_obj, target_type=half_damage_to, damage_factor=50) half_damage_to_type_relation.save() double_damage_to_type_relation = TypeEfficacy( @@ -3441,9 +3123,7 @@ def test_type_api(self): ) double_damage_to_type_relation.save() - no_damage_from_relation = TypeEfficacy( - damage_type=no_damage_from, target_type=type_obj, damage_factor=0 - ) + no_damage_from_relation = TypeEfficacy(damage_type=no_damage_from, target_type=type_obj, damage_factor=0) no_damage_from_relation.save() half_damage_from_type_relation = TypeEfficacy( @@ -3481,9 +3161,7 @@ def test_type_api(self): self.assertEqual(response.data["name"], type_obj.name) # name params self.assertEqual(response.data["names"][0]["name"], type_name.name) - self.assertEqual( - response.data["names"][0]["language"]["name"], type_name.language.name - ) + self.assertEqual(response.data["names"][0]["language"]["name"], type_name.language.name) self.assertEqual( response.data["names"][0]["language"]["url"], "{}{}/language/{}/".format(TEST_HOST, API_V2, type_name.language.pk), @@ -3495,14 +3173,10 @@ def test_type_api(self): "{}{}/generation/{}/".format(TEST_HOST, API_V2, type_obj.generation.pk), ) # damage class params - self.assertEqual( - response.data["move_damage_class"]["name"], type_obj.move_damage_class.name - ) + self.assertEqual(response.data["move_damage_class"]["name"], type_obj.move_damage_class.name) self.assertEqual( response.data["move_damage_class"]["url"], - "{}{}/move-damage-class/{}/".format( - TEST_HOST, API_V2, type_obj.move_damage_class.pk - ), + "{}{}/move-damage-class/{}/".format(TEST_HOST, API_V2, type_obj.move_damage_class.pk), ) # move params self.assertEqual(response.data["moves"][0]["name"], move.name) @@ -3575,9 +3249,7 @@ def test_type_api(self): self.assertEqual(gen_data["name"], generation.name) self.assertEqual( gen_data["url"], - "{}{}/generation/{}/".format( - TEST_HOST, API_V2, past_no_damage_to_relation.generation.pk - ), + "{}{}/generation/{}/".format(TEST_HOST, API_V2, past_no_damage_to_relation.generation.pk), ) # relations @@ -3587,9 +3259,7 @@ def test_type_api(self): # this list... self.assertEqual(len(gen_relations["no_damage_to"]), 0) - self.assertEqual( - gen_relations["half_damage_to"][0]["name"], half_damage_to.name - ) + self.assertEqual(gen_relations["half_damage_to"][0]["name"], half_damage_to.name) self.assertEqual( gen_relations["half_damage_to"][0]["url"], "{}{}/type/{}/".format(TEST_HOST, API_V2, half_damage_to.pk), @@ -3602,30 +3272,22 @@ def test_type_api(self): "{}{}/type/{}/".format(TEST_HOST, API_V2, no_damage_to.pk), ) - self.assertEqual( - gen_relations["double_damage_to"][0]["name"], double_damage_to.name - ) + self.assertEqual(gen_relations["double_damage_to"][0]["name"], double_damage_to.name) self.assertEqual( gen_relations["double_damage_to"][0]["url"], "{}{}/type/{}/".format(TEST_HOST, API_V2, double_damage_to.pk), ) - self.assertEqual( - gen_relations["no_damage_from"][0]["name"], no_damage_from.name - ) + self.assertEqual(gen_relations["no_damage_from"][0]["name"], no_damage_from.name) self.assertEqual( gen_relations["no_damage_from"][0]["url"], "{}{}/type/{}/".format(TEST_HOST, API_V2, no_damage_from.pk), ) - self.assertEqual( - gen_relations["half_damage_from"][0]["name"], half_damage_from.name - ) + self.assertEqual(gen_relations["half_damage_from"][0]["name"], half_damage_from.name) self.assertEqual( gen_relations["half_damage_from"][0]["url"], "{}{}/type/{}/".format(TEST_HOST, API_V2, half_damage_from.pk), ) - self.assertEqual( - gen_relations["double_damage_from"][0]["name"], double_damage_from.name - ) + self.assertEqual(gen_relations["double_damage_from"][0]["name"], double_damage_from.name) self.assertEqual( gen_relations["double_damage_from"][0]["url"], "{}{}/type/{}/".format(TEST_HOST, API_V2, double_damage_from.pk), @@ -3636,18 +3298,14 @@ def test_type_api(self): self.assertEqual(len(gen_relations["double_damage_from"]), 1) # game indices params - self.assertEqual( - response.data["game_indices"][0]["game_index"], type_game_index.game_index - ) + self.assertEqual(response.data["game_indices"][0]["game_index"], type_game_index.game_index) self.assertEqual( response.data["game_indices"][0]["generation"]["name"], type_game_index.generation.name, ) self.assertEqual( response.data["game_indices"][0]["generation"]["url"], - "{}{}/generation/{}/".format( - TEST_HOST, API_V2, type_game_index.generation.pk - ), + "{}{}/generation/{}/".format(TEST_HOST, API_V2, type_game_index.generation.pk), ) sprites_data = json.loads(type_sprites.sprites) @@ -3663,15 +3321,9 @@ def test_type_api(self): def test_pokedex_api(self): pokedex = self.setup_pokedex_data(name="base pkdx") pokedex_name = self.setup_pokedex_name_data(pokedex, name="base pkdx name") - pokedex_description = self.setup_pokedex_description_data( - pokedex, description="base pkdx desc" - ) - pokemon_species = self.setup_pokemon_species_data( - name="pkmn spcs for base pkdx" - ) - dex_entry = self.setup_pokemon_dex_entry_data( - pokedex=pokedex, pokemon_species=pokemon_species - ) + pokedex_description = self.setup_pokedex_description_data(pokedex, description="base pkdx desc") + pokemon_species = self.setup_pokemon_species_data(name="pkmn spcs for base pkdx") + dex_entry = self.setup_pokemon_dex_entry_data(pokedex=pokedex, pokemon_species=pokemon_species) response = self.client.get("{}/pokedex/{}/".format(API_V2, pokedex.pk)) @@ -3683,9 +3335,7 @@ def test_pokedex_api(self): self.assertEqual(response.data["is_main_series"], pokedex.is_main_series) # name params self.assertEqual(response.data["names"][0]["name"], pokedex_name.name) - self.assertEqual( - response.data["names"][0]["language"]["name"], pokedex_name.language.name - ) + self.assertEqual(response.data["names"][0]["language"]["name"], pokedex_name.language.name) self.assertEqual( response.data["names"][0]["language"]["url"], "{}{}/language/{}/".format(TEST_HOST, API_V2, pokedex_name.language.pk), @@ -3701,9 +3351,7 @@ def test_pokedex_api(self): ) self.assertEqual( response.data["descriptions"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, pokedex_description.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, pokedex_description.language.pk), ) # region params self.assertEqual(response.data["region"]["name"], pokedex.region.name) @@ -3728,15 +3376,11 @@ def test_pokedex_api(self): # Move Tests def test_move_ailment_api(self): move_ailment = self.setup_move_ailment_data(name="base mv almnt") - move_ailment_name = self.setup_move_ailment_name_data( - move_ailment, name="base mv almnt name" - ) + move_ailment_name = self.setup_move_ailment_name_data(move_ailment, name="base mv almnt name") move = self.setup_move_data(name="mv for base mv almnt") self.setup_move_meta_data(move=move, move_ailment=move_ailment) - response = self.client.get( - "{}/move-ailment/{}/".format(API_V2, move_ailment.pk) - ) + response = self.client.get("{}/move-ailment/{}/".format(API_V2, move_ailment.pk)) self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -3751,9 +3395,7 @@ def test_move_ailment_api(self): ) self.assertEqual( response.data["names"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, move_ailment_name.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, move_ailment_name.language.pk), ) # move params self.assertEqual(response.data["moves"][0]["name"], move.name) @@ -3764,13 +3406,9 @@ def test_move_ailment_api(self): def test_move_battle_style_api(self): move_battle_style = self.setup_move_battle_style_data(name="base mv btl stl") - move_battle_style_name = self.setup_move_battle_style_name_data( - move_battle_style, name="base mv btl stl name" - ) + move_battle_style_name = self.setup_move_battle_style_name_data(move_battle_style, name="base mv btl stl name") - response = self.client.get( - "{}/move-battle-style/{}/".format(API_V2, move_battle_style.pk) - ) + response = self.client.get("{}/move-battle-style/{}/".format(API_V2, move_battle_style.pk)) self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -3785,9 +3423,7 @@ def test_move_battle_style_api(self): ) self.assertEqual( response.data["names"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, move_battle_style_name.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, move_battle_style_name.language.pk), ) def test_move_category_api(self): @@ -3798,9 +3434,7 @@ def test_move_category_api(self): move = self.setup_move_data(name="mv for base mv ctgry") self.setup_move_meta_data(move=move, move_category=move_category) - response = self.client.get( - "{}/move-category/{}/".format(API_V2, move_category.pk) - ) + response = self.client.get("{}/move-category/{}/".format(API_V2, move_category.pk)) self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -3818,9 +3452,7 @@ def test_move_category_api(self): ) self.assertEqual( response.data["descriptions"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, move_category_description.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, move_category_description.language.pk), ) # move params self.assertEqual(response.data["moves"][0]["name"], move.name) @@ -3831,19 +3463,13 @@ def test_move_category_api(self): def test_move_damage_class_api(self): move_damage_class = self.setup_move_damage_class_data(name="base mv dmg cls") - move_damage_class_name = self.setup_move_damage_class_name_data( - move_damage_class, name="base mv dmg cls nm" - ) + move_damage_class_name = self.setup_move_damage_class_name_data(move_damage_class, name="base mv dmg cls nm") move_damage_class_description = self.setup_move_damage_class_description_data( move_damage_class, description="base mv dmg cls desc" ) - move = self.setup_move_data( - name="mv for base mv dmg cls", move_damage_class=move_damage_class - ) + move = self.setup_move_data(name="mv for base mv dmg cls", move_damage_class=move_damage_class) - response = self.client.get( - "{}/move-damage-class/{}/".format(API_V2, move_damage_class.pk) - ) + response = self.client.get("{}/move-damage-class/{}/".format(API_V2, move_damage_class.pk)) self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -3858,9 +3484,7 @@ def test_move_damage_class_api(self): ) self.assertEqual( response.data["names"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, move_damage_class_name.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, move_damage_class_name.language.pk), ) # description params self.assertEqual( @@ -3873,9 +3497,7 @@ def test_move_damage_class_api(self): ) self.assertEqual( response.data["descriptions"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, move_damage_class_description.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, move_damage_class_description.language.pk), ) # move params self.assertEqual(response.data["moves"][0]["name"], move.name) @@ -3886,22 +3508,16 @@ def test_move_damage_class_api(self): def test_move_learn_method_api(self): move_learn_method = self.setup_move_learn_method_data(name="base mv lrn mthd") - move_learn_method_name = self.setup_move_learn_method_name_data( - move_learn_method, name="base mv lrn mthd nm" - ) + move_learn_method_name = self.setup_move_learn_method_name_data(move_learn_method, name="base mv lrn mthd nm") move_learn_method_description = self.setup_move_learn_method_description_data( move_learn_method, description="base mv lrn mthd desc" ) - version_group = self.setup_version_group_data( - name="ver grp for base mv lrn mthd" - ) + version_group = self.setup_version_group_data(name="ver grp for base mv lrn mthd") self.setup_version_group_move_learn_method_data( version_group=version_group, move_learn_method=move_learn_method ) - response = self.client.get( - "{}/move-learn-method/{}/".format(API_V2, move_learn_method.pk) - ) + response = self.client.get("{}/move-learn-method/{}/".format(API_V2, move_learn_method.pk)) self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -3916,9 +3532,7 @@ def test_move_learn_method_api(self): ) self.assertEqual( response.data["names"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, move_learn_method_name.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, move_learn_method_name.language.pk), ) # description params self.assertEqual( @@ -3931,9 +3545,7 @@ def test_move_learn_method_api(self): ) self.assertEqual( response.data["descriptions"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, move_learn_method_description.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, move_learn_method_description.language.pk), ) # version group params self.assertEqual(response.data["version_groups"][0]["name"], version_group.name) @@ -3944,12 +3556,8 @@ def test_move_learn_method_api(self): def test_move_target_api(self): move_target = self.setup_move_target_data(name="base mv trgt") - move_target_name = self.setup_move_target_name_data( - move_target, name="base mv trgt nm" - ) - move_target_description = self.setup_move_target_description_data( - move_target, description="base mv trgt desc" - ) + move_target_name = self.setup_move_target_name_data(move_target, name="base mv trgt nm") + move_target_description = self.setup_move_target_description_data(move_target, description="base mv trgt desc") move = self.setup_move_data(name="mv for base mv trgt", move_target=move_target) response = self.client.get("{}/move-target/{}/".format(API_V2, move_target.pk)) @@ -3980,9 +3588,7 @@ def test_move_target_api(self): ) self.assertEqual( response.data["descriptions"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, move_target_description.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, move_target_description.language.pk), ) # move params self.assertEqual(response.data["moves"][0]["name"], move.name) @@ -4015,9 +3621,7 @@ def test_move_api(self): self.setup_contest_combo_data(before_move, move) self.setup_super_contest_combo_data(move, after_move) self.setup_super_contest_combo_data(before_move, move) - move_flavor_text = self.setup_move_flavor_text_data( - move, flavor_text="flvr text for move" - ) + move_flavor_text = self.setup_move_flavor_text_data(move, flavor_text="flvr text for move") response = self.client.get("{}/move/{}/".format(API_V2, move.pk)) @@ -4033,22 +3637,16 @@ def test_move_api(self): self.assertEqual(response.data["priority"], move.priority) # name params self.assertEqual(response.data["names"][0]["name"], move_name.name) - self.assertEqual( - response.data["names"][0]["language"]["name"], move_name.language.name - ) + self.assertEqual(response.data["names"][0]["language"]["name"], move_name.language.name) self.assertEqual( response.data["names"][0]["language"]["url"], "{}{}/language/{}/".format(TEST_HOST, API_V2, move_name.language.pk), ) # damage class params - self.assertEqual( - response.data["damage_class"]["name"], move.move_damage_class.name - ) + self.assertEqual(response.data["damage_class"]["name"], move.move_damage_class.name) self.assertEqual( response.data["damage_class"]["url"], - "{}{}/move-damage-class/{}/".format( - TEST_HOST, API_V2, move.move_damage_class.pk - ), + "{}{}/move-damage-class/{}/".format(TEST_HOST, API_V2, move.move_damage_class.pk), ) # contest type params self.assertEqual(response.data["contest_type"]["name"], move.contest_type.name) @@ -4064,9 +3662,7 @@ def test_move_api(self): # super contest effect params self.assertEqual( response.data["super_contest_effect"]["url"], - "{}{}/super-contest-effect/{}/".format( - TEST_HOST, API_V2, move.super_contest_effect.pk - ), + "{}{}/super-contest-effect/{}/".format(TEST_HOST, API_V2, move.super_contest_effect.pk), ) # generation params self.assertEqual(response.data["generation"]["name"], move.generation.name) @@ -4087,20 +3683,14 @@ def test_move_api(self): "{}{}/type/{}/".format(TEST_HOST, API_V2, move.type.pk), ) # stat change params - self.assertEqual( - response.data["stat_changes"][0]["change"], move_stat_change.change - ) - self.assertEqual( - response.data["stat_changes"][0]["stat"]["name"], move_stat_change.stat.name - ) + self.assertEqual(response.data["stat_changes"][0]["change"], move_stat_change.change) + self.assertEqual(response.data["stat_changes"][0]["stat"]["name"], move_stat_change.stat.name) self.assertEqual( response.data["stat_changes"][0]["stat"]["url"], "{}{}/stat/{}/".format(TEST_HOST, API_V2, move_stat_change.stat.pk), ) # effect entries params - self.assertEqual( - response.data["effect_entries"][0]["effect"], move_effect_effect_text.effect - ) + self.assertEqual(response.data["effect_entries"][0]["effect"], move_effect_effect_text.effect) self.assertEqual( response.data["effect_entries"][0]["short_effect"], move_effect_effect_text.short_effect, @@ -4111,9 +3701,7 @@ def test_move_api(self): ) self.assertEqual( response.data["effect_entries"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, move_effect_effect_text.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, move_effect_effect_text.language.pk), ) # meta data self.assertEqual(response.data["meta"]["min_hits"], move_meta.min_hits) @@ -4123,32 +3711,20 @@ def test_move_api(self): self.assertEqual(response.data["meta"]["drain"], move_meta.drain) self.assertEqual(response.data["meta"]["healing"], move_meta.healing) self.assertEqual(response.data["meta"]["crit_rate"], move_meta.crit_rate) - self.assertEqual( - response.data["meta"]["ailment_chance"], move_meta.ailment_chance - ) - self.assertEqual( - response.data["meta"]["flinch_chance"], move_meta.flinch_chance - ) + self.assertEqual(response.data["meta"]["ailment_chance"], move_meta.ailment_chance) + self.assertEqual(response.data["meta"]["flinch_chance"], move_meta.flinch_chance) self.assertEqual(response.data["meta"]["stat_chance"], move_meta.stat_chance) # ailment params - self.assertEqual( - response.data["meta"]["ailment"]["name"], move_meta.move_meta_ailment.name - ) + self.assertEqual(response.data["meta"]["ailment"]["name"], move_meta.move_meta_ailment.name) self.assertEqual( response.data["meta"]["ailment"]["url"], - "{}{}/move-ailment/{}/".format( - TEST_HOST, API_V2, move_meta.move_meta_ailment.pk - ), + "{}{}/move-ailment/{}/".format(TEST_HOST, API_V2, move_meta.move_meta_ailment.pk), ) # category params - self.assertEqual( - response.data["meta"]["category"]["name"], move_meta.move_meta_category.name - ) + self.assertEqual(response.data["meta"]["category"]["name"], move_meta.move_meta_category.name) self.assertEqual( response.data["meta"]["category"]["url"], - "{}{}/move-category/{}/".format( - TEST_HOST, API_V2, move_meta.move_meta_category.pk - ), + "{}{}/move-category/{}/".format(TEST_HOST, API_V2, move_meta.move_meta_category.pk), ) # combo params self.assertEqual( @@ -4184,9 +3760,7 @@ def test_move_api(self): "{}{}/move/{}/".format(TEST_HOST, API_V2, before_move.pk), ) # change params - self.assertEqual( - response.data["past_values"][0]["accuracy"], move_change.accuracy - ) + self.assertEqual(response.data["past_values"][0]["accuracy"], move_change.accuracy) self.assertEqual(response.data["past_values"][0]["power"], move_change.power) self.assertEqual(response.data["past_values"][0]["pp"], move_change.pp) self.assertEqual( @@ -4199,9 +3773,7 @@ def test_move_api(self): ) self.assertEqual( response.data["past_values"][0]["version_group"]["url"], - "{}{}/version-group/{}/".format( - TEST_HOST, API_V2, move_change.version_group.pk - ), + "{}{}/version-group/{}/".format(TEST_HOST, API_V2, move_change.version_group.pk), ) # effect changes self.assertEqual( @@ -4210,9 +3782,7 @@ def test_move_api(self): ) self.assertEqual( response.data["effect_changes"][0]["version_group"]["url"], - "{}{}/version-group/{}/".format( - TEST_HOST, API_V2, move_effect_change.version_group.pk - ), + "{}{}/version-group/{}/".format(TEST_HOST, API_V2, move_effect_change.version_group.pk), ) self.assertEqual( response.data["effect_changes"][0]["effect_entries"][0]["effect"], @@ -4224,9 +3794,7 @@ def test_move_api(self): ) self.assertEqual( response.data["effect_changes"][0]["effect_entries"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, move_effect_change_effect_text.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, move_effect_change_effect_text.language.pk), ) # flavor text params self.assertEqual( @@ -4247,9 +3815,7 @@ def test_move_api(self): ) self.assertEqual( response.data["flavor_text_entries"][0]["version_group"]["url"], - "{}{}/version-group/{}/".format( - TEST_HOST, API_V2, move_flavor_text.version_group.pk - ), + "{}{}/version-group/{}/".format(TEST_HOST, API_V2, move_flavor_text.version_group.pk), ) # pokemon self.assertEqual(response.data["learned_by_pokemon"][0]["name"], pokemon.name) @@ -4259,19 +3825,11 @@ def test_stat_api(self): stat = self.setup_stat_data(name="base stt") stat_name = self.setup_stat_name_data(stat, name="base stt name") increase_move = self.setup_move_data(name="incrs mv for base stt") - increase_move_stat_change = self.setup_move_stat_change_data( - move=increase_move, stat=stat, change=2 - ) + increase_move_stat_change = self.setup_move_stat_change_data(move=increase_move, stat=stat, change=2) decrease_move = self.setup_move_data(name="dcrs mv for base stt") - decrease_move_stat_change = self.setup_move_stat_change_data( - move=decrease_move, stat=stat, change=(-2) - ) - increase_nature = self.setup_nature_data( - name="incrs ntr for base stt", increased_stat=stat - ) - decrease_nature = self.setup_nature_data( - name="dcrs ntr for base stt", decreased_stat=stat - ) + decrease_move_stat_change = self.setup_move_stat_change_data(move=decrease_move, stat=stat, change=(-2)) + increase_nature = self.setup_nature_data(name="incrs ntr for base stt", increased_stat=stat) + decrease_nature = self.setup_nature_data(name="dcrs ntr for base stt", decreased_stat=stat) characteristic = self.setup_characteristic_data(stat=stat) response = self.client.get("{}/stat/{}/".format(API_V2, stat.pk)) @@ -4285,22 +3843,16 @@ def test_stat_api(self): self.assertEqual(response.data["is_battle_only"], stat.is_battle_only) # name params self.assertEqual(response.data["names"][0]["name"], stat_name.name) - self.assertEqual( - response.data["names"][0]["language"]["name"], stat_name.language.name - ) + self.assertEqual(response.data["names"][0]["language"]["name"], stat_name.language.name) self.assertEqual( response.data["names"][0]["language"]["url"], "{}{}/language/{}/".format(TEST_HOST, API_V2, stat_name.language.pk), ) # move damage class params - self.assertEqual( - response.data["move_damage_class"]["name"], stat.move_damage_class.name - ) + self.assertEqual(response.data["move_damage_class"]["name"], stat.move_damage_class.name) self.assertEqual( response.data["move_damage_class"]["url"], - "{}{}/move-damage-class/{}/".format( - TEST_HOST, API_V2, stat.move_damage_class.pk - ), + "{}{}/move-damage-class/{}/".format(TEST_HOST, API_V2, stat.move_damage_class.pk), ) # nature params self.assertEqual( @@ -4352,13 +3904,9 @@ def test_stat_api(self): def test_pokeathlon_stat_api(self): pokeathlon_stat = self.setup_pokeathlon_stat_data(name="base pkathln stt") - pokeathlon_stat_name = self.setup_pokeathlon_stat_name_data( - pokeathlon_stat, name="base pkathln stt name" - ) + pokeathlon_stat_name = self.setup_pokeathlon_stat_name_data(pokeathlon_stat, name="base pkathln stt name") - response = self.client.get( - "{}/pokeathlon-stat/{}/".format(API_V2, pokeathlon_stat.pk) - ) + response = self.client.get("{}/pokeathlon-stat/{}/".format(API_V2, pokeathlon_stat.pk)) self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -4373,9 +3921,7 @@ def test_pokeathlon_stat_api(self): ) self.assertEqual( response.data["names"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, pokeathlon_stat_name.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, pokeathlon_stat_name.language.pk), ) # Characteristic Tests @@ -4385,9 +3931,7 @@ def test_characteristic_api(self): characteristic, description="base char desc" ) - response = self.client.get( - "{}/characteristic/{}/".format(API_V2, characteristic.pk) - ) + response = self.client.get("{}/characteristic/{}/".format(API_V2, characteristic.pk)) self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -4405,14 +3949,10 @@ def test_characteristic_api(self): ) self.assertEqual( response.data["descriptions"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, characteristic_description.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, characteristic_description.language.pk), ) # stat params - self.assertEqual( - response.data["highest_stat"]["name"], characteristic.stat.name - ) + self.assertEqual(response.data["highest_stat"]["name"], characteristic.stat.name) self.assertEqual( response.data["highest_stat"]["url"], "{}{}/stat/{}/".format(TEST_HOST, API_V2, characteristic.stat.pk), @@ -4424,13 +3964,9 @@ def test_characteristic_values(self): characteristic = self.setup_characteristic_data(gene_mod_5=modulo) # note that 'possible_values' is computed solely from gene_modulo # thus it is fine that our test characteristics are indexed 1-5 - result = self.client.get( - "{}/characteristic/{}/".format(API_V2, characteristic.pk) - ) + result = self.client.get("{}/characteristic/{}/".format(API_V2, characteristic.pk)) for i in range(len(result.data["possible_values"])): - self.assertEqual( - result.data["possible_values"][i], characteristic.gene_mod_5 + i * 5 - ) + self.assertEqual(result.data["possible_values"][i], characteristic.gene_mod_5 + i * 5) # Nature Tests def test_nature_api(self): @@ -4447,16 +3983,12 @@ def test_nature_api(self): ) nature_name = self.setup_nature_name_data(nature, name="base ntr name") - pokeathlon_stat = self.setup_pokeathlon_stat_data( - name="pkeathln stt for ntr stt" - ) + pokeathlon_stat = self.setup_pokeathlon_stat_data(name="pkeathln stt for ntr stt") nature_pokeathlon_stat = self.setup_nature_pokeathlon_stat_data( nature=nature, pokeathlon_stat=pokeathlon_stat, max_change=1 ) - move_battle_style = self.setup_move_battle_style_data( - name="mv btl stl for ntr stt" - ) + move_battle_style = self.setup_move_battle_style_data(name="mv btl stl for ntr stt") nature_battle_style_preference = self.setup_nature_battle_style_preference_data( nature=nature, move_battle_style=move_battle_style ) @@ -4470,9 +4002,7 @@ def test_nature_api(self): self.assertEqual(response.data["name"], nature.name) # name params self.assertEqual(response.data["names"][0]["name"], nature_name.name) - self.assertEqual( - response.data["names"][0]["language"]["name"], nature_name.language.name - ) + self.assertEqual(response.data["names"][0]["language"]["name"], nature_name.language.name) self.assertEqual( response.data["names"][0]["language"]["url"], "{}{}/language/{}/".format(TEST_HOST, API_V2, nature_name.language.pk), @@ -4522,33 +4052,23 @@ def test_nature_api(self): nature_battle_style_preference.high_hp_preference, ) self.assertEqual( - response.data["move_battle_style_preferences"][0]["move_battle_style"][ - "name" - ], + response.data["move_battle_style_preferences"][0]["move_battle_style"]["name"], move_battle_style.name, ) self.assertEqual( - response.data["move_battle_style_preferences"][0]["move_battle_style"][ - "url" - ], - "{}{}/move-battle-style/{}/".format( - TEST_HOST, API_V2, move_battle_style.pk - ), + response.data["move_battle_style_preferences"][0]["move_battle_style"]["url"], + "{}{}/move-battle-style/{}/".format(TEST_HOST, API_V2, move_battle_style.pk), ) # Pokemon Tests def test_pokemon_habitat_api(self): pokemon_habitat = self.setup_pokemon_habitat_data(name="base pkmn hbtt trgr") - pokemon_habitat_name = self.setup_pokemon_habitat_name_data( - pokemon_habitat, name="base pkmn hbtt name" - ) + pokemon_habitat_name = self.setup_pokemon_habitat_name_data(pokemon_habitat, name="base pkmn hbtt name") pokemon_species = self.setup_pokemon_species_data( pokemon_habitat=pokemon_habitat, name="pkmn spcs for pkmn hbtt" ) - response = self.client.get( - "{}/pokemon-habitat/{}/".format(API_V2, pokemon_habitat.pk) - ) + response = self.client.get("{}/pokemon-habitat/{}/".format(API_V2, pokemon_habitat.pk)) self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -4563,14 +4083,10 @@ def test_pokemon_habitat_api(self): ) self.assertEqual( response.data["names"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, pokemon_habitat_name.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, pokemon_habitat_name.language.pk), ) # species params - self.assertEqual( - response.data["pokemon_species"][0]["name"], pokemon_species.name - ) + self.assertEqual(response.data["pokemon_species"][0]["name"], pokemon_species.name) self.assertEqual( response.data["pokemon_species"][0]["url"], "{}{}/pokemon-species/{}/".format(TEST_HOST, API_V2, pokemon_species.pk), @@ -4578,16 +4094,10 @@ def test_pokemon_habitat_api(self): def test_pokemon_color_api(self): pokemon_color = self.setup_pokemon_color_data(name="base pkmn clr trgr") - pokemon_color_name = self.setup_pokemon_color_name_data( - pokemon_color, name="base pkmn clr name" - ) - pokemon_species = self.setup_pokemon_species_data( - pokemon_color=pokemon_color, name="pkmn spcs for pkmn clr" - ) + pokemon_color_name = self.setup_pokemon_color_name_data(pokemon_color, name="base pkmn clr name") + pokemon_species = self.setup_pokemon_species_data(pokemon_color=pokemon_color, name="pkmn spcs for pkmn clr") - response = self.client.get( - "{}/pokemon-color/{}/".format(API_V2, pokemon_color.pk) - ) + response = self.client.get("{}/pokemon-color/{}/".format(API_V2, pokemon_color.pk)) self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -4602,14 +4112,10 @@ def test_pokemon_color_api(self): ) self.assertEqual( response.data["names"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, pokemon_color_name.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, pokemon_color_name.language.pk), ) # species params - self.assertEqual( - response.data["pokemon_species"][0]["name"], pokemon_species.name - ) + self.assertEqual(response.data["pokemon_species"][0]["name"], pokemon_species.name) self.assertEqual( response.data["pokemon_species"][0]["url"], "{}{}/pokemon-species/{}/".format(TEST_HOST, API_V2, pokemon_species.pk), @@ -4617,16 +4123,10 @@ def test_pokemon_color_api(self): def test_pokemon_shape_api(self): pokemon_shape = self.setup_pokemon_shape_data(name="base pkmn shp trgr") - pokemon_shape_name = self.setup_pokemon_shape_name_data( - pokemon_shape, name="base pkmn shp name" - ) - pokemon_species = self.setup_pokemon_species_data( - pokemon_shape=pokemon_shape, name="pkmn spcs for pkmn shp" - ) + pokemon_shape_name = self.setup_pokemon_shape_name_data(pokemon_shape, name="base pkmn shp name") + pokemon_species = self.setup_pokemon_species_data(pokemon_shape=pokemon_shape, name="pkmn spcs for pkmn shp") - response = self.client.get( - "{}/pokemon-shape/{}/".format(API_V2, pokemon_shape.pk) - ) + response = self.client.get("{}/pokemon-shape/{}/".format(API_V2, pokemon_shape.pk)) self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -4641,9 +4141,7 @@ def test_pokemon_shape_api(self): ) self.assertEqual( response.data["names"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, pokemon_shape_name.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, pokemon_shape_name.language.pk), ) # awesome name params self.assertEqual( @@ -4656,33 +4154,23 @@ def test_pokemon_shape_api(self): ) self.assertEqual( response.data["awesome_names"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, pokemon_shape_name.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, pokemon_shape_name.language.pk), ) # species params - self.assertEqual( - response.data["pokemon_species"][0]["name"], pokemon_species.name - ) + self.assertEqual(response.data["pokemon_species"][0]["name"], pokemon_species.name) self.assertEqual( response.data["pokemon_species"][0]["url"], "{}{}/pokemon-species/{}/".format(TEST_HOST, API_V2, pokemon_species.pk), ) def test_pokemon_species_api(self): - evolves_from_species = self.setup_pokemon_species_data( - name="evolves from pkmn spcs" - ) + evolves_from_species = self.setup_pokemon_species_data(name="evolves from pkmn spcs") pokemon_species = self.setup_pokemon_species_data( evolves_from_species=evolves_from_species, name="base pkmn spcs" ) - pokemon_species_name = self.setup_pokemon_species_name_data( - pokemon_species, name="base pkmn shp name" - ) - pokemon_species_form_description = ( - self.setup_pokemon_species_form_description_data( - pokemon_species, description="frm dscr for pkmn spcs" - ) + pokemon_species_name = self.setup_pokemon_species_name_data(pokemon_species, name="base pkmn shp name") + pokemon_species_form_description = self.setup_pokemon_species_form_description_data( + pokemon_species, description="frm dscr for pkmn spcs" ) pokemon_species_flavor_text = self.setup_pokemon_species_flavor_text_data( pokemon_species, flavor_text="flvr txt for pkmn spcs" @@ -4696,13 +4184,9 @@ def test_pokemon_species_api(self): ) egg_group = self.setup_egg_group_data(name="egg grp for pkmn spcs") - self.setup_pokemon_egg_group_data( - pokemon_species=pokemon_species, egg_group=egg_group - ) + self.setup_pokemon_egg_group_data(pokemon_species=pokemon_species, egg_group=egg_group) - pokemon = self.setup_pokemon_data( - pokemon_species=pokemon_species, name="pkm for base pkmn spcs" - ) + pokemon = self.setup_pokemon_data(pokemon_species=pokemon_species, name="pkm for base pkmn spcs") self.setup_pokemon_sprites_data(pokemon) self.setup_pokemon_cries_data(pokemon) @@ -4719,9 +4203,7 @@ def test_pokemon_species_api(self): self.assertEqual(response.data["order"], pokemon_species.order) self.assertEqual(response.data["capture_rate"], pokemon_species.capture_rate) self.assertEqual(response.data["gender_rate"], pokemon_species.gender_rate) - self.assertEqual( - response.data["base_happiness"], pokemon_species.base_happiness - ) + self.assertEqual(response.data["base_happiness"], pokemon_species.base_happiness) self.assertEqual(response.data["is_baby"], pokemon_species.is_baby) self.assertEqual(response.data["is_legendary"], pokemon_species.is_legendary) self.assertEqual(response.data["is_mythical"], pokemon_species.is_mythical) @@ -4731,9 +4213,7 @@ def test_pokemon_species_api(self): response.data["has_gender_differences"], pokemon_species.has_gender_differences, ) - self.assertEqual( - response.data["forms_switchable"], pokemon_species.forms_switchable - ) + self.assertEqual(response.data["forms_switchable"], pokemon_species.forms_switchable) # name params self.assertEqual(response.data["names"][0]["name"], pokemon_species_name.name) self.assertEqual( @@ -4742,28 +4222,20 @@ def test_pokemon_species_api(self): ) self.assertEqual( response.data["names"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, pokemon_species_name.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, pokemon_species_name.language.pk), ) # growth rate params - self.assertEqual( - response.data["growth_rate"]["name"], pokemon_species.growth_rate.name - ) + self.assertEqual(response.data["growth_rate"]["name"], pokemon_species.growth_rate.name) self.assertEqual( response.data["growth_rate"]["url"], - "{}{}/growth-rate/{}/".format( - TEST_HOST, API_V2, pokemon_species.growth_rate.pk - ), + "{}{}/growth-rate/{}/".format(TEST_HOST, API_V2, pokemon_species.growth_rate.pk), ) # dex number params self.assertEqual( response.data["pokedex_numbers"][0]["entry_number"], dex_number.pokedex_number, ) - self.assertEqual( - response.data["pokedex_numbers"][0]["pokedex"]["name"], pokedex.name - ) + self.assertEqual(response.data["pokedex_numbers"][0]["pokedex"]["name"], pokedex.name) self.assertEqual( response.data["pokedex_numbers"][0]["pokedex"]["url"], "{}{}/pokedex/{}/".format(TEST_HOST, API_V2, pokedex.pk), @@ -4775,73 +4247,47 @@ def test_pokemon_species_api(self): "{}{}/egg-group/{}/".format(TEST_HOST, API_V2, egg_group.pk), ) # generation params - self.assertEqual( - response.data["generation"]["name"], pokemon_species.generation.name - ) + self.assertEqual(response.data["generation"]["name"], pokemon_species.generation.name) self.assertEqual( response.data["generation"]["url"], - "{}{}/generation/{}/".format( - TEST_HOST, API_V2, pokemon_species.generation.pk - ), + "{}{}/generation/{}/".format(TEST_HOST, API_V2, pokemon_species.generation.pk), ) # color params - self.assertEqual( - response.data["color"]["name"], pokemon_species.pokemon_color.name - ) + self.assertEqual(response.data["color"]["name"], pokemon_species.pokemon_color.name) self.assertEqual( response.data["color"]["url"], - "{}{}/pokemon-color/{}/".format( - TEST_HOST, API_V2, pokemon_species.pokemon_color.pk - ), + "{}{}/pokemon-color/{}/".format(TEST_HOST, API_V2, pokemon_species.pokemon_color.pk), ) # shape params - self.assertEqual( - response.data["shape"]["name"], pokemon_species.pokemon_shape.name - ) + self.assertEqual(response.data["shape"]["name"], pokemon_species.pokemon_shape.name) self.assertEqual( response.data["shape"]["url"], - "{}{}/pokemon-shape/{}/".format( - TEST_HOST, API_V2, pokemon_species.pokemon_shape.pk - ), + "{}{}/pokemon-shape/{}/".format(TEST_HOST, API_V2, pokemon_species.pokemon_shape.pk), ) # habitat params - self.assertEqual( - response.data["habitat"]["name"], pokemon_species.pokemon_habitat.name - ) + self.assertEqual(response.data["habitat"]["name"], pokemon_species.pokemon_habitat.name) self.assertEqual( response.data["habitat"]["url"], - "{}{}/pokemon-habitat/{}/".format( - TEST_HOST, API_V2, pokemon_species.pokemon_habitat.pk - ), + "{}{}/pokemon-habitat/{}/".format(TEST_HOST, API_V2, pokemon_species.pokemon_habitat.pk), ) # evolves from params - self.assertEqual( - response.data["evolves_from_species"]["name"], evolves_from_species.name - ) + self.assertEqual(response.data["evolves_from_species"]["name"], evolves_from_species.name) self.assertEqual( response.data["evolves_from_species"]["url"], - "{}{}/pokemon-species/{}/".format( - TEST_HOST, API_V2, evolves_from_species.pk - ), + "{}{}/pokemon-species/{}/".format(TEST_HOST, API_V2, evolves_from_species.pk), ) # genus params - self.assertEqual( - response.data["genera"][0]["genus"], pokemon_species_name.genus - ) + self.assertEqual(response.data["genera"][0]["genus"], pokemon_species_name.genus) self.assertEqual( response.data["genera"][0]["language"]["name"], pokemon_species_name.language.name, ) self.assertEqual( response.data["genera"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, pokemon_species_name.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, pokemon_species_name.language.pk), ) # pokemon varieties params - self.assertEqual( - response.data["varieties"][0]["is_default"], pokemon.is_default - ) + self.assertEqual(response.data["varieties"][0]["is_default"], pokemon.is_default) self.assertEqual(response.data["varieties"][0]["pokemon"]["name"], pokemon.name) self.assertEqual( response.data["varieties"][0]["pokemon"]["url"], @@ -4858,9 +4304,7 @@ def test_pokemon_species_api(self): ) self.assertEqual( response.data["form_descriptions"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, pokemon_species_form_description.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, pokemon_species_form_description.language.pk), ) # flavor text params self.assertEqual( @@ -4873,9 +4317,7 @@ def test_pokemon_species_api(self): ) self.assertEqual( response.data["flavor_text_entries"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, pokemon_species_flavor_text.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, pokemon_species_flavor_text.language.pk), ) self.assertEqual( response.data["flavor_text_entries"][0]["version"]["name"], @@ -4883,14 +4325,10 @@ def test_pokemon_species_api(self): ) self.assertEqual( response.data["flavor_text_entries"][0]["version"]["url"], - "{}{}/version/{}/".format( - TEST_HOST, API_V2, pokemon_species_flavor_text.version.pk - ), + "{}{}/version/{}/".format(TEST_HOST, API_V2, pokemon_species_flavor_text.version.pk), ) # pal park params - self.assertEqual( - response.data["pal_park_encounters"][0]["base_score"], pal_park.base_score - ) + self.assertEqual(response.data["pal_park_encounters"][0]["base_score"], pal_park.base_score) self.assertEqual(response.data["pal_park_encounters"][0]["rate"], pal_park.rate) self.assertEqual( response.data["pal_park_encounters"][0]["area"]["name"], @@ -4898,49 +4336,31 @@ def test_pokemon_species_api(self): ) self.assertEqual( response.data["pal_park_encounters"][0]["area"]["url"], - "{}{}/pal-park-area/{}/".format( - TEST_HOST, API_V2, pal_park.pal_park_area.pk - ), + "{}{}/pal-park-area/{}/".format(TEST_HOST, API_V2, pal_park.pal_park_area.pk), ) def test_pokemon_api(self): - pokemon_species = self.setup_pokemon_species_data( - name="pkmn spcs for base pkmn" - ) - pokemon = self.setup_pokemon_data( - pokemon_species=pokemon_species, name="base pkm" - ) - pokemon_form = self.setup_pokemon_form_data( - pokemon=pokemon, name="pkm form for base pkmn" - ) + pokemon_species = self.setup_pokemon_species_data(name="pkmn spcs for base pkmn") + pokemon = self.setup_pokemon_data(pokemon_species=pokemon_species, name="base pkm") + pokemon_form = self.setup_pokemon_form_data(pokemon=pokemon, name="pkm form for base pkmn") generation = self.setup_generation_data(name="base gen") pokemon_ability = self.setup_pokemon_ability_data(pokemon=pokemon) - pokemon_past_ability = self.setup_pokemon_past_ability_data( - pokemon=pokemon, generation=generation - ) + pokemon_past_ability = self.setup_pokemon_past_ability_data(pokemon=pokemon, generation=generation) pokemon_stat = self.setup_pokemon_stat_data(pokemon=pokemon) - pokemon_past_stat = self.setup_pokemon_past_stat_data( - pokemon=pokemon, generation=generation - ) + pokemon_past_stat = self.setup_pokemon_past_stat_data(pokemon=pokemon, generation=generation) pokemon_type = self.setup_pokemon_type_data(pokemon=pokemon) - pokemon_past_type = self.setup_pokemon_past_type_data( - pokemon=pokemon, generation=generation - ) + pokemon_past_type = self.setup_pokemon_past_type_data(pokemon=pokemon, generation=generation) pokemon_item = self.setup_pokemon_item_data(pokemon=pokemon) pokemon_sprites = self.setup_pokemon_sprites_data(pokemon=pokemon) pokemon_cries = self.setup_pokemon_cries_data(pokemon, latest=True, legacy=True) - pokemon_game_index = self.setup_pokemon_game_index_data( - pokemon=pokemon, game_index=10 - ) + pokemon_game_index = self.setup_pokemon_game_index_data(pokemon=pokemon, game_index=10) # To test issue #85, we will create one move that has multiple # learn levels in different version groups. Later, we'll # assert that we only got one move record back. pokemon_move = self.setup_move_data(name="mv for pkmn") pokemon_moves = [] for move in range(0, 4): - version_group = self.setup_version_group_data( - name="ver grp " + str(move) + " for pkmn" - ) + version_group = self.setup_version_group_data(name="ver grp " + str(move) + " for pkmn") new_move = self.setup_pokemon_move_data( pokemon=pokemon, move=pokemon_move, @@ -4949,13 +4369,9 @@ def test_pokemon_api(self): ) pokemon_moves.append(new_move) - encounter_method = self.setup_encounter_method_data( - name="encntr mthd for lctn area" - ) + encounter_method = self.setup_encounter_method_data(name="encntr mthd for lctn area") location_area1 = self.setup_location_area_data(name="lctn1 area for base pkmn") - encounter_slot1 = self.setup_encounter_slot_data( - encounter_method, slot=1, rarity=30 - ) + encounter_slot1 = self.setup_encounter_slot_data(encounter_method, slot=1, rarity=30) self.setup_encounter_data( location_area=location_area1, pokemon=pokemon, @@ -4964,9 +4380,7 @@ def test_pokemon_api(self): max_level=35, ) location_area2 = self.setup_location_area_data(name="lctn2 area for base pkmn") - encounter_slot2 = self.setup_encounter_slot_data( - encounter_method, slot=2, rarity=40 - ) + encounter_slot2 = self.setup_encounter_slot_data(encounter_method, slot=2, rarity=40) self.setup_encounter_data( location_area=location_area2, pokemon=pokemon, @@ -4974,9 +4388,7 @@ def test_pokemon_api(self): min_level=32, max_level=36, ) - response = self.client.get( - "{}/pokemon/{}/".format(API_V2, pokemon.pk), headers={"host": "testserver"} - ) + response = self.client.get("{}/pokemon/{}/".format(API_V2, pokemon.pk), headers={"host": "testserver"}) self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -4995,9 +4407,7 @@ def test_pokemon_api(self): "{}{}/pokemon-species/{}/".format(TEST_HOST, API_V2, pokemon_species.pk), ) # abilities params - self.assertEqual( - response.data["abilities"][0]["is_hidden"], pokemon_ability.is_hidden - ) + self.assertEqual(response.data["abilities"][0]["is_hidden"], pokemon_ability.is_hidden) self.assertEqual(response.data["abilities"][0]["slot"], pokemon_ability.slot) self.assertEqual( response.data["abilities"][0]["ability"]["name"], @@ -5015,34 +4425,24 @@ def test_pokemon_api(self): ) self.assertEqual( past_abilities_obj["generation"]["url"], - "{}{}/generation/{}/".format( - TEST_HOST, API_V2, pokemon_past_ability.generation.pk - ), + "{}{}/generation/{}/".format(TEST_HOST, API_V2, pokemon_past_ability.generation.pk), ) past_abilities_abilities_obj = past_abilities_obj["abilities"][0] - self.assertEqual( - past_abilities_abilities_obj["is_hidden"], pokemon_past_ability.is_hidden - ) - self.assertEqual( - past_abilities_abilities_obj["slot"], pokemon_past_ability.slot - ) + self.assertEqual(past_abilities_abilities_obj["is_hidden"], pokemon_past_ability.is_hidden) + self.assertEqual(past_abilities_abilities_obj["slot"], pokemon_past_ability.slot) self.assertEqual( past_abilities_abilities_obj["ability"]["name"], pokemon_past_ability.ability.name, ) self.assertEqual( past_abilities_abilities_obj["ability"]["url"], - "{}{}/ability/{}/".format( - TEST_HOST, API_V2, pokemon_past_ability.ability.pk - ), + "{}{}/ability/{}/".format(TEST_HOST, API_V2, pokemon_past_ability.ability.pk), ) # stat params self.assertEqual(response.data["stats"][0]["base_stat"], pokemon_stat.base_stat) self.assertEqual(response.data["stats"][0]["effort"], pokemon_stat.effort) - self.assertEqual( - response.data["stats"][0]["stat"]["name"], pokemon_stat.stat.name - ) + self.assertEqual(response.data["stats"][0]["stat"]["name"], pokemon_stat.stat.name) self.assertEqual( response.data["stats"][0]["stat"]["url"], "{}{}/stat/{}/".format(TEST_HOST, API_V2, pokemon_stat.stat.pk), @@ -5055,56 +4455,42 @@ def test_pokemon_api(self): ) self.assertEqual( past_stats_obj["generation"]["url"], - "{}{}/generation/{}/".format( - TEST_HOST, API_V2, pokemon_past_stat.generation.pk - ), + "{}{}/generation/{}/".format(TEST_HOST, API_V2, pokemon_past_stat.generation.pk), ) past_stats_stats_obj = past_stats_obj["stats"][0] self.assertEqual(past_stats_stats_obj["base_stat"], pokemon_past_stat.base_stat) self.assertEqual(past_stats_stats_obj["effort"], pokemon_past_stat.effort) - self.assertEqual( - past_stats_stats_obj["stat"]["name"], pokemon_past_stat.stat.name - ) + self.assertEqual(past_stats_stats_obj["stat"]["name"], pokemon_past_stat.stat.name) self.assertEqual( past_stats_stats_obj["stat"]["url"], "{}{}/stat/{}/".format(TEST_HOST, API_V2, pokemon_past_stat.stat.pk), ) # type params self.assertEqual(response.data["types"][0]["slot"], pokemon_type.slot) - self.assertEqual( - response.data["types"][0]["type"]["name"], pokemon_type.type.name - ) + self.assertEqual(response.data["types"][0]["type"]["name"], pokemon_type.type.name) self.assertEqual( response.data["types"][0]["type"]["url"], "{}{}/type/{}/".format(TEST_HOST, API_V2, pokemon_type.type.pk), ) # past type params past_types_obj = response.data["past_types"][0] - self.assertEqual( - past_types_obj["generation"]["name"], pokemon_past_type.generation.name - ) + self.assertEqual(past_types_obj["generation"]["name"], pokemon_past_type.generation.name) self.assertEqual( past_types_obj["generation"]["url"], - "{}{}/generation/{}/".format( - TEST_HOST, API_V2, pokemon_past_type.generation.pk - ), + "{}{}/generation/{}/".format(TEST_HOST, API_V2, pokemon_past_type.generation.pk), ) past_types_types_obj = past_types_obj["types"][0] self.assertEqual(past_types_types_obj["slot"], pokemon_past_type.slot) - self.assertEqual( - past_types_types_obj["type"]["name"], pokemon_past_type.type.name - ) + self.assertEqual(past_types_types_obj["type"]["name"], pokemon_past_type.type.name) self.assertEqual( past_types_types_obj["type"]["url"], "{}{}/type/{}/".format(TEST_HOST, API_V2, pokemon_past_type.type.pk), ) # items params - self.assertEqual( - response.data["held_items"][0]["item"]["name"], pokemon_item.item.name - ) + self.assertEqual(response.data["held_items"][0]["item"]["name"], pokemon_item.item.name) self.assertEqual( response.data["held_items"][0]["item"]["url"], "{}{}/item/{}/".format(TEST_HOST, API_V2, pokemon_item.item.pk), @@ -5152,9 +4538,7 @@ def test_pokemon_api(self): actual = version["version_group"]["name"] self.assertEqual(expected, actual) # Version Group URL - expected = "{}{}/version-group/{}/".format( - TEST_HOST, API_V2, pokemon_moves[i].version_group.pk - ) + expected = "{}{}/version-group/{}/".format(TEST_HOST, API_V2, pokemon_moves[i].version_group.pk) actual = version["version_group"]["url"] self.assertEqual(expected, actual) # Learn Method Name @@ -5162,9 +4546,7 @@ def test_pokemon_api(self): actual = version["move_learn_method"]["name"] self.assertEqual(expected, actual) # Learn Method URL - expected = "{}{}/move-learn-method/{}/".format( - TEST_HOST, API_V2, pokemon_moves[i].move_learn_method.pk - ) + expected = "{}{}/move-learn-method/{}/".format(TEST_HOST, API_V2, pokemon_moves[i].move_learn_method.pk) actual = version["move_learn_method"]["url"] self.assertEqual(expected, actual) # game indices params @@ -5190,7 +4572,6 @@ def test_pokemon_api(self): sprites_data = json.loads(pokemon_sprites.sprites) cries_data = json.loads(pokemon_cries.cries) response_sprites_data = json.loads(response.data["sprites"]) - response_cries_data = json.loads(response.data["cries"]) # sprite params self.assertEqual( @@ -5240,9 +4621,7 @@ def test_pokemon_api(self): def test_pokemon_form_api(self): pokemon_species = self.setup_pokemon_species_data() pokemon = self.setup_pokemon_data(pokemon_species=pokemon_species) - pokemon_form = self.setup_pokemon_form_data( - pokemon=pokemon, name="pkm form for base pkmn" - ) + pokemon_form = self.setup_pokemon_form_data(pokemon=pokemon, name="pkm form for base pkmn") pokemon_form_sprites = self.setup_pokemon_form_sprites_data(pokemon_form) pokemon_form_type = self.setup_pokemon_form_type_data(pokemon_form) @@ -5269,14 +4648,10 @@ def test_pokemon_form_api(self): "{}{}/pokemon/{}/".format(TEST_HOST, API_V2, pokemon.pk), ) # version group params - self.assertEqual( - response.data["version_group"]["name"], pokemon_form.version_group.name - ) + self.assertEqual(response.data["version_group"]["name"], pokemon_form.version_group.name) self.assertEqual( response.data["version_group"]["url"], - "{}{}/version-group/{}/".format( - TEST_HOST, API_V2, pokemon_form.version_group.pk - ), + "{}{}/version-group/{}/".format(TEST_HOST, API_V2, pokemon_form.version_group.pk), ) sprites_data = json.loads(pokemon_form_sprites.sprites) @@ -5289,9 +4664,7 @@ def test_pokemon_form_api(self): self.assertEqual(sprites_data["back_default"], None) # type params self.assertEqual(response.data["types"][0]["slot"], pokemon_form_type.slot) - self.assertEqual( - response.data["types"][0]["type"]["name"], pokemon_form_type.type.name - ) + self.assertEqual(response.data["types"][0]["type"]["name"], pokemon_form_type.type.name) self.assertEqual( response.data["types"][0]["type"]["url"], "{}{}/type/{}/".format(TEST_HOST, API_V2, pokemon_form_type.type.pk), @@ -5300,19 +4673,11 @@ def test_pokemon_form_api(self): # Evolution test def test_evolution_trigger_api(self): evolution_trigger = self.setup_evolution_trigger_data(name="base evltn trgr") - evolution_trigger_name = self.setup_evolution_trigger_name_data( - evolution_trigger, name="base evltn trgr name" - ) - pokemon_species = self.setup_pokemon_species_data( - name="pkmn spcs for base evltn trgr" - ) - self.setup_pokemon_evolution_data( - evolved_species=pokemon_species, evolution_trigger=evolution_trigger - ) + evolution_trigger_name = self.setup_evolution_trigger_name_data(evolution_trigger, name="base evltn trgr name") + pokemon_species = self.setup_pokemon_species_data(name="pkmn spcs for base evltn trgr") + self.setup_pokemon_evolution_data(evolved_species=pokemon_species, evolution_trigger=evolution_trigger) - response = self.client.get( - "{}/evolution-trigger/{}/".format(API_V2, evolution_trigger.pk) - ) + response = self.client.get("{}/evolution-trigger/{}/".format(API_V2, evolution_trigger.pk)) self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -5327,14 +4692,10 @@ def test_evolution_trigger_api(self): ) self.assertEqual( response.data["names"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, evolution_trigger_name.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, evolution_trigger_name.language.pk), ) # pokemon species params - self.assertEqual( - response.data["pokemon_species"][0]["name"], pokemon_species.name - ) + self.assertEqual(response.data["pokemon_species"][0]["name"], pokemon_species.name) self.assertEqual( response.data["pokemon_species"][0]["url"], "{}{}/pokemon-species/{}/".format(TEST_HOST, API_V2, pokemon_species.pk), @@ -5342,13 +4703,9 @@ def test_evolution_trigger_api(self): def test_evolution_chain_api(self): baby_trigger_item = self.setup_item_data(name="bby itm for evo chn") - evolution_chain = self.setup_evolution_chain_data( - baby_trigger_item=baby_trigger_item - ) + evolution_chain = self.setup_evolution_chain_data(baby_trigger_item=baby_trigger_item) - baby = self.setup_pokemon_species_data( - name="bby for evo chn", is_baby=True, evolution_chain=evolution_chain - ) + baby = self.setup_pokemon_species_data(name="bby for evo chn", is_baby=True, evolution_chain=evolution_chain) basic = self.setup_pokemon_species_data( name="bsc for evo chn", @@ -5356,9 +4713,7 @@ def test_evolution_chain_api(self): evolution_chain=evolution_chain, ) basic_location = self.setup_location_data(name="lctn for bsc evo chn") - basic_evolution = self.setup_pokemon_evolution_data( - evolved_species=basic, min_level=5, location=basic_location - ) + basic_evolution = self.setup_pokemon_evolution_data(evolved_species=basic, min_level=5, location=basic_location) stage_one = self.setup_pokemon_species_data( name="stg one for evo chn", @@ -5394,9 +4749,7 @@ def test_evolution_chain_api(self): party_type=stage_two_second_party_type, ) - response = self.client.get( - "{}/evolution-chain/{}/".format(API_V2, evolution_chain.pk) - ) + response = self.client.get("{}/evolution-chain/{}/".format(API_V2, evolution_chain.pk)) self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -5409,9 +4762,7 @@ def test_evolution_chain_api(self): # base params self.assertEqual(response.data["id"], evolution_chain.pk) # baby trigger params - self.assertEqual( - response.data["baby_trigger_item"]["name"], baby_trigger_item.name - ) + self.assertEqual(response.data["baby_trigger_item"]["name"], baby_trigger_item.name) self.assertEqual( response.data["baby_trigger_item"]["url"], "{}{}/item/{}/".format(TEST_HOST, API_V2, baby_trigger_item.pk), @@ -5430,12 +4781,8 @@ def test_evolution_chain_api(self): basic_data["species"]["url"], "{}{}/pokemon-species/{}/".format(TEST_HOST, API_V2, basic.pk), ) - self.assertEqual( - basic_data["evolution_details"][0]["min_level"], basic_evolution.min_level - ) - self.assertEqual( - basic_data["evolution_details"][0]["location"]["name"], basic_location.name - ) + self.assertEqual(basic_data["evolution_details"][0]["min_level"], basic_evolution.min_level) + self.assertEqual(basic_data["evolution_details"][0]["location"]["name"], basic_location.name) self.assertEqual( basic_data["evolution_details"][0]["location"]["url"], "{}{}/location/{}/".format(TEST_HOST, API_V2, basic_location.pk), @@ -5480,9 +4827,7 @@ def test_evolution_chain_api(self): ) # stage two second params self.assertEqual(stage_two_second_data["is_baby"], stage_two_second.is_baby) - self.assertEqual( - stage_two_second_data["species"]["name"], stage_two_second.name - ) + self.assertEqual(stage_two_second_data["species"]["name"], stage_two_second.name) self.assertEqual( stage_two_second_data["species"]["url"], "{}{}/pokemon-species/{}/".format(TEST_HOST, API_V2, stage_two_second.pk), @@ -5515,40 +4860,30 @@ def test_evolution_chain_api_wurmple_bugfix(self): evolves_from_species=basic, evolution_chain=evolution_chain, ) - stage_one_first_evolution = self.setup_pokemon_evolution_data( - evolved_species=stage_one_first, min_level=7 - ) + self.setup_pokemon_evolution_data(evolved_species=stage_one_first, min_level=7) stage_two_first = self.setup_pokemon_species_data( name="beautifly", evolves_from_species=stage_one_first, evolution_chain=evolution_chain, ) - stage_two_first_evolution = self.setup_pokemon_evolution_data( - evolved_species=stage_two_first, min_level=10 - ) + self.setup_pokemon_evolution_data(evolved_species=stage_two_first, min_level=10) stage_one_second = self.setup_pokemon_species_data( name="cascoon", evolves_from_species=basic, evolution_chain=evolution_chain, ) - stage_one_second_evolution = self.setup_pokemon_evolution_data( - evolved_species=stage_one_second, min_level=7 - ) + self.setup_pokemon_evolution_data(evolved_species=stage_one_second, min_level=7) stage_two_second = self.setup_pokemon_species_data( name="dustox", evolves_from_species=stage_one_second, evolution_chain=evolution_chain, ) - stage_two_second_evolution = self.setup_pokemon_evolution_data( - evolved_species=stage_two_second, min_level=10 - ) + self.setup_pokemon_evolution_data(evolved_species=stage_two_second, min_level=10) - response = self.client.get( - "{}/evolution-chain/{}/".format(API_V2, evolution_chain.pk) - ) + response = self.client.get("{}/evolution-chain/{}/".format(API_V2, evolution_chain.pk)) self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -5568,13 +4903,9 @@ def test_evolution_chain_api_wurmple_bugfix(self): # Encounter Tests def test_encounter_method_api(self): encounter_method = self.setup_encounter_method_data(name="base encntr mthd") - encounter_method_name = self.setup_encounter_method_name_data( - encounter_method, name="base encntr mthd name" - ) + encounter_method_name = self.setup_encounter_method_name_data(encounter_method, name="base encntr mthd name") - response = self.client.get( - "{}/encounter-method/{}/".format(API_V2, encounter_method.pk) - ) + response = self.client.get("{}/encounter-method/{}/".format(API_V2, encounter_method.pk)) self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -5590,15 +4921,11 @@ def test_encounter_method_api(self): ) self.assertEqual( response.data["names"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, encounter_method_name.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, encounter_method_name.language.pk), ) def test_encounter_condition_value_api(self): - encounter_condition = self.setup_encounter_condition_data( - name="encntr cndtn for base encntr cndtn vlu" - ) + encounter_condition = self.setup_encounter_condition_data(name="encntr cndtn for base encntr cndtn vlu") encounter_condition_value = self.setup_encounter_condition_value_data( encounter_condition, name="base encntr cndtn vlu" ) @@ -5606,11 +4933,7 @@ def test_encounter_condition_value_api(self): encounter_condition_value, name="base encntr cndtn vlu name" ) - response = self.client.get( - "{}/encounter-condition-value/{}/".format( - API_V2, encounter_condition_value.pk - ) - ) + response = self.client.get("{}/encounter-condition-value/{}/".format(API_V2, encounter_condition_value.pk)) self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -5618,32 +4941,24 @@ def test_encounter_condition_value_api(self): self.assertEqual(response.data["id"], encounter_condition_value.pk) self.assertEqual(response.data["name"], encounter_condition_value.name) # name params - self.assertEqual( - response.data["names"][0]["name"], encounter_condition_value_name.name - ) + self.assertEqual(response.data["names"][0]["name"], encounter_condition_value_name.name) self.assertEqual( response.data["names"][0]["language"]["name"], encounter_condition_value_name.language.name, ) self.assertEqual( response.data["names"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, encounter_condition_value_name.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, encounter_condition_value_name.language.pk), ) # condition params self.assertEqual(response.data["condition"]["name"], encounter_condition.name) self.assertEqual( response.data["condition"]["url"], - "{}{}/encounter-condition/{}/".format( - TEST_HOST, API_V2, encounter_condition.pk - ), + "{}{}/encounter-condition/{}/".format(TEST_HOST, API_V2, encounter_condition.pk), ) def test_encounter_condition_api(self): - encounter_condition = self.setup_encounter_condition_data( - name="base encntr cndtn" - ) + encounter_condition = self.setup_encounter_condition_data(name="base encntr cndtn") encounter_condition_name = self.setup_encounter_condition_name_data( encounter_condition, name="base encntr cndtn name" ) @@ -5653,9 +4968,7 @@ def test_encounter_condition_api(self): is_default=True, ) - response = self.client.get( - "{}/encounter-condition/{}/".format(API_V2, encounter_condition.pk) - ) + response = self.client.get("{}/encounter-condition/{}/".format(API_V2, encounter_condition.pk)) self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -5663,36 +4976,26 @@ def test_encounter_condition_api(self): self.assertEqual(response.data["id"], encounter_condition.pk) self.assertEqual(response.data["name"], encounter_condition.name) # name params - self.assertEqual( - response.data["names"][0]["name"], encounter_condition_name.name - ) + self.assertEqual(response.data["names"][0]["name"], encounter_condition_name.name) self.assertEqual( response.data["names"][0]["language"]["name"], encounter_condition_name.language.name, ) self.assertEqual( response.data["names"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, encounter_condition_name.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, encounter_condition_name.language.pk), ) # value params - self.assertEqual( - response.data["values"][0]["name"], encounter_condition_value.name - ) + self.assertEqual(response.data["values"][0]["name"], encounter_condition_value.name) self.assertEqual( response.data["values"][0]["url"], - "{}{}/encounter-condition-value/{}/".format( - TEST_HOST, API_V2, encounter_condition_value.pk - ), + "{}{}/encounter-condition-value/{}/".format(TEST_HOST, API_V2, encounter_condition_value.pk), ) # Pal Park Tests def test_pal_park_area_api(self): pal_park_area = self.setup_pal_park_area_data(name="base pl prk area") - pal_park_area_name = self.setup_pal_park_area_name_data( - pal_park_area, name="base pl prk area nm" - ) + pal_park_area_name = self.setup_pal_park_area_name_data(pal_park_area, name="base pl prk area nm") pokemon_species = self.setup_pokemon_species_data(name="pkmn spcs for pl prk") pal_park = self.setup_pal_park_data( pal_park_area=pal_park_area, @@ -5701,9 +5004,7 @@ def test_pal_park_area_api(self): rate=20, ) - response = self.client.get( - "{}/pal-park-area/{}/".format(API_V2, pal_park_area.pk) - ) + response = self.client.get("{}/pal-park-area/{}/".format(API_V2, pal_park_area.pk)) self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -5718,14 +5019,10 @@ def test_pal_park_area_api(self): ) self.assertEqual( response.data["names"][0]["language"]["url"], - "{}{}/language/{}/".format( - TEST_HOST, API_V2, pal_park_area_name.language.pk - ), + "{}{}/language/{}/".format(TEST_HOST, API_V2, pal_park_area_name.language.pk), ) # encounter params - self.assertEqual( - response.data["pokemon_encounters"][0]["base_score"], pal_park.base_score - ) + self.assertEqual(response.data["pokemon_encounters"][0]["base_score"], pal_park.base_score) self.assertEqual(response.data["pokemon_encounters"][0]["rate"], pal_park.rate) self.assertEqual( response.data["pokemon_encounters"][0]["pokemon_species"]["name"], @@ -5745,43 +5042,27 @@ def test_id_range_api(self): # Test if API endpoints are case-insensitive def test_case_insensitive_api(self): # Set up pokemon data - pokemon_species = self.setup_pokemon_species_data( - name="pkmn spcs for base pkmn" - ) - pokemon = self.setup_pokemon_data( - pokemon_species=pokemon_species, name="base pkm" - ) - pokemon_form = self.setup_pokemon_form_data( - pokemon=pokemon, name="pkm form for base pkmn" - ) + pokemon_species = self.setup_pokemon_species_data(name="pkmn spcs for base pkmn") + pokemon = self.setup_pokemon_data(pokemon_species=pokemon_species, name="base pkm") + self.setup_pokemon_form_data(pokemon=pokemon, name="pkm form for base pkmn") generation = self.setup_generation_data(name="base gen") - pokemon_ability = self.setup_pokemon_ability_data(pokemon=pokemon) - pokemon_past_ability = self.setup_pokemon_past_ability_data( - pokemon=pokemon, generation=generation - ) - pokemon_stat = self.setup_pokemon_stat_data(pokemon=pokemon) - pokemon_past_stat = self.setup_pokemon_past_stat_data( - pokemon=pokemon, generation=generation - ) - pokemon_type = self.setup_pokemon_type_data(pokemon=pokemon) - pokemon_past_type = self.setup_pokemon_past_type_data( - pokemon=pokemon, generation=generation - ) - pokemon_item = self.setup_pokemon_item_data(pokemon=pokemon) - pokemon_sprites = self.setup_pokemon_sprites_data(pokemon=pokemon) - pokemon_cries = self.setup_pokemon_cries_data(pokemon, latest=True, legacy=True) - pokemon_game_index = self.setup_pokemon_game_index_data( - pokemon=pokemon, game_index=10 - ) + self.setup_pokemon_ability_data(pokemon=pokemon) + self.setup_pokemon_past_ability_data(pokemon=pokemon, generation=generation) + self.setup_pokemon_stat_data(pokemon=pokemon) + self.setup_pokemon_past_stat_data(pokemon=pokemon, generation=generation) + self.setup_pokemon_type_data(pokemon=pokemon) + self.setup_pokemon_past_type_data(pokemon=pokemon, generation=generation) + self.setup_pokemon_item_data(pokemon=pokemon) + self.setup_pokemon_sprites_data(pokemon=pokemon) + self.setup_pokemon_cries_data(pokemon, latest=True, legacy=True) + self.setup_pokemon_game_index_data(pokemon=pokemon, game_index=10) # To test issue #85, we will create one move that has multiple # learn levels in different version groups. Later, we'll # assert that we only got one move record back. pokemon_move = self.setup_move_data(name="mv for pkmn") pokemon_moves = [] for move in range(0, 4): - version_group = self.setup_version_group_data( - name="ver grp " + str(move) + " for pkmn" - ) + version_group = self.setup_version_group_data(name="ver grp " + str(move) + " for pkmn") new_move = self.setup_pokemon_move_data( pokemon=pokemon, move=pokemon_move, @@ -5790,13 +5071,9 @@ def test_case_insensitive_api(self): ) pokemon_moves.append(new_move) - encounter_method = self.setup_encounter_method_data( - name="encntr mthd for lctn area" - ) + encounter_method = self.setup_encounter_method_data(name="encntr mthd for lctn area") location_area1 = self.setup_location_area_data(name="lctn1 area for base pkmn") - encounter_slot1 = self.setup_encounter_slot_data( - encounter_method, slot=1, rarity=30 - ) + encounter_slot1 = self.setup_encounter_slot_data(encounter_method, slot=1, rarity=30) self.setup_encounter_data( location_area=location_area1, pokemon=pokemon, @@ -5805,9 +5082,7 @@ def test_case_insensitive_api(self): max_level=35, ) location_area2 = self.setup_location_area_data(name="lctn2 area for base pkmn") - encounter_slot2 = self.setup_encounter_slot_data( - encounter_method, slot=2, rarity=40 - ) + encounter_slot2 = self.setup_encounter_slot_data(encounter_method, slot=2, rarity=40) self.setup_encounter_data( location_area=location_area2, pokemon=pokemon, @@ -5837,7 +5112,7 @@ def test_case_insensitive_api(self): # Same test with /language endpoint language = self.setup_language_data(name="base-lang") - language_name = self.setup_language_name_data(language, name="base-lang-name") + self.setup_language_name_data(language, name="base-lang-name") lowercase_name = language.name.lower() uppercase_name = language.name.upper() diff --git a/pokemon_v2/urls.py b/pokemon_v2/urls.py index fdd268419..8ce6c729c 100644 --- a/pokemon_v2/urls.py +++ b/pokemon_v2/urls.py @@ -5,11 +5,59 @@ # V2 API setup using Django Rest # ##################################### - from rest_framework import routers -from pokemon_v2.api import * -# pylint: disable=invalid-name +from pokemon_v2.api import ( + AbilityResource, + BerryFirmnessResource, + BerryFlavorResource, + BerryResource, + CharacteristicResource, + ContestEffectResource, + ContestTypeResource, + EggGroupResource, + EncounterConditionResource, + EncounterConditionValueResource, + EncounterMethodResource, + EvolutionChainResource, + EvolutionTriggerResource, + GenderResource, + GenerationResource, + GrowthRateResource, + ItemAttributeResource, + ItemCategoryResource, + ItemFlingEffectResource, + ItemPocketResource, + ItemResource, + LanguageResource, + LocationAreaResource, + LocationResource, + MachineResource, + MoveBattleStyleResource, + MoveDamageClassResource, + MoveLearnMethodResource, + MoveMetaAilmentResource, + MoveMetaCategoryResource, + MoveResource, + MoveTargetResource, + NatureResource, + PalParkAreaResource, + PokeathlonStatResource, + PokedexResource, + PokemonColorResource, + PokemonEncounterView, + PokemonFormResource, + PokemonHabitatResource, + PokemonResource, + PokemonShapeResource, + PokemonSpeciesResource, + RegionResource, + StatResource, + SuperContestEffectResource, + TypeResource, + VersionGroupResource, + VersionResource, +) router = routers.DefaultRouter() diff --git a/pyproject.toml b/pyproject.toml index 327a32ec6..c0118cb02 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,3 +17,18 @@ dependencies = [ "ruff>=0.14.14", "ty>=0.0.14", ] + +[tool.ruff] +line-length = 120 +exclude = ["data/v2/sprites/**", "data/v2/cries/**"] + +[tool.ruff.lint] +select = [ + # Pyflakes + "F", + # Pycodestyle + "E", + "W", + # isort + "I001", +] From f928e0bcd24a9e73e25e51637644179b0a8cef40 Mon Sep 17 00:00:00 2001 From: Paul Hallett Date: Tue, 3 Feb 2026 11:23:41 +0000 Subject: [PATCH 4/6] Add uv step to ci Configured from https://docs.astral.sh/uv/guides/integration/github/ --- .github/workflows/database.yml | 8 ++++++++ .github/workflows/docker-build-and-push.yml | 2 ++ .github/workflows/docker-k8s.yml | 4 +++- .github/workflows/release.yml | 2 ++ 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/.github/workflows/database.yml b/.github/workflows/database.yml index e22a1811b..667d44be3 100644 --- a/.github/workflows/database.yml +++ b/.github/workflows/database.yml @@ -9,6 +9,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v5 + - name: Install uv + uses: astral-sh/setup-uv@v7 - name: Lint run: | set -e @@ -22,6 +24,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v5 + - name: Install uv + uses: astral-sh/setup-uv@v7 - name: Generate OpenAPI schema run: | make install @@ -33,6 +37,8 @@ jobs: uses: actions/checkout@v5 with: submodules: recursive + - name: Install uv + uses: astral-sh/setup-uv@v7 - name: Start pokeapi run: | make install @@ -51,6 +57,8 @@ jobs: uses: actions/checkout@v5 with: submodules: recursive + - name: Install uv + uses: astral-sh/setup-uv@v7 - name: Build run: | docker compose -f docker-compose.yml -f docker-compose-dev.yml up -d diff --git a/.github/workflows/docker-build-and-push.yml b/.github/workflows/docker-build-and-push.yml index 1408413c0..4887a7be3 100644 --- a/.github/workflows/docker-build-and-push.yml +++ b/.github/workflows/docker-build-and-push.yml @@ -16,6 +16,8 @@ jobs: uses: actions/checkout@v5 with: submodules: recursive + - name: Install uv + uses: astral-sh/setup-uv@v7 - name: Docker meta id: meta uses: docker/metadata-action@v5 diff --git a/.github/workflows/docker-k8s.yml b/.github/workflows/docker-k8s.yml index 628790ff2..b6c8ea249 100644 --- a/.github/workflows/docker-k8s.yml +++ b/.github/workflows/docker-k8s.yml @@ -11,6 +11,8 @@ jobs: uses: actions/checkout@v5 with: submodules: recursive + - name: Install uv + uses: astral-sh/setup-uv@v7 - name: Docker meta id: meta uses: docker/metadata-action@v5 @@ -112,4 +114,4 @@ jobs: - name: Assert containers running run: | last_command=$(docker ps | grep 'pokeapi-' | wc -l) - test "$last_command" -eq 5 \ No newline at end of file + test "$last_command" -eq 5 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6d154f224..3c0386e14 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,6 +13,8 @@ jobs: uses: actions/checkout@v5 with: submodules: recursive + - name: Install uv + uses: astral-sh/setup-uv@v7 - name: Start pokeapi (docker) run: | docker compose -f docker-compose.yml -f docker-compose-dev.yml up -d From 93568a60ec8f5dd6f9bbdfba9a90cc2d0416419c Mon Sep 17 00:00:00 2001 From: Paul Hallett Date: Thu, 5 Feb 2026 12:00:25 +0000 Subject: [PATCH 5/6] Update Docker / k8s to use uv Context: - We needed to explicilty include psycopg-binary here - Rest of the changes are just replacements of python -> uv run --- .github/workflows/docker-k8s.yml | 2 ++ Makefile | 14 +++++++------- README.md | 8 ++++---- Resources/docker/app/Dockerfile | 28 +++++++++++++++++++++++----- Resources/docker/app/README.md | 4 ++-- data/v2/build.py | 2 +- pyproject.toml | 1 + uv.lock | 21 +++++++++++++++++++++ 8 files changed, 61 insertions(+), 19 deletions(-) diff --git a/.github/workflows/docker-k8s.yml b/.github/workflows/docker-k8s.yml index b6c8ea249..9f8adacb7 100644 --- a/.github/workflows/docker-k8s.yml +++ b/.github/workflows/docker-k8s.yml @@ -1,4 +1,6 @@ name: Container +# These workflows are intended to check that the Docker and Kubernetes +# configurations work as expected in a local development environment. on: pull_request: diff --git a/Makefile b/Makefile index b99a8acd1..c8c99fd7b 100755 --- a/Makefile +++ b/Makefile @@ -47,16 +47,16 @@ docker-up: # (Docker) Create services/volumes/networks docker compose up -d docker-migrate: # (Docker) Run any pending migrations - docker compose exec -T app python manage.py migrate ${docker_config} + docker compose --verbose exec -T app uv run manage.py migrate ${docker_config} docker-build-db: # (Docker) Build the database - docker compose exec -T app sh -c 'echo "from data.v2.build import build_all; build_all()" | python manage.py shell ${docker_config}' + docker compose exec -T app sh -c 'echo "from data.v2.build import build_all; build_all()" | uv run manage.py shell ${docker_config}' docker-make-migrations: # (Docker) Create migrations files if schema has changed - docker compose exec -T app sh -c 'python manage.py makemigrations ${docker_config}' + docker compose exec -T app sh -c 'uv run manage.py makemigrations ${docker_config}' docker-flush-db: # (Docker) Removes all the data present in the database but preserves tables and migrations - docker compose exec -T app sh -c 'python manage.py flush --no-input ${docker_config}' + docker compose exec -T app sh -c 'uv run manage.py flush --no-input ${docker_config}' docker-destroy-db: # (Docker) Removes the volume where the database is installed on, alongside to the container itself docker rm -f pokeapi_db_1 @@ -72,7 +72,7 @@ docker-down: # (Docker) Stop and removes containers and networks docker compose down docker-test: # (Docker) Run tests - docker compose exec -T app python manage.py test ${local_config} + docker compose exec -T app uv run manage.py test ${local_config} docker-prod: docker compose -f docker-compose.yml -f docker-compose.override.yml -f Resources/compose/docker-compose-prod-graphql.yml up -d @@ -130,10 +130,10 @@ kustomize-ga-apply: # (Kustomize) Run kubectl apply -k on the connected k8s clu kubectl apply -k Resources/k8s/kustomize/ga/ k8s-migrate: # (k8s) Run any pending migrations - kubectl exec --namespace pokeapi deployment/pokeapi -- python manage.py migrate ${docker_config} + kubectl exec --namespace pokeapi deployment/pokeapi -- uv run manage.py migrate ${docker_config} k8s-build-db: # (k8s) Build the database - kubectl exec --namespace pokeapi deployment/pokeapi -- sh -c 'echo "from data.v2.build import build_all; build_all()" | python manage.py shell ${docker_config}' + kubectl exec --namespace pokeapi deployment/pokeapi -- sh -c 'echo "from data.v2.build import build_all; build_all()" | uv run manage.py shell ${docker_config}' k8s-delete: # (k8s) Delete pokeapi namespace kubectl delete namespace pokeapi diff --git a/README.md b/README.md index b12b9e422..f9eccc0e4 100755 --- a/README.md +++ b/README.md @@ -99,8 +99,8 @@ If you don't have `make` on your machine you can use the following commands ```sh docker compose up -d -docker compose exec -T app python manage.py migrate --settings=config.docker-compose -docker compose exec -T app sh -c 'echo "from data.v2.build import build_all; build_all()" | python manage.py shell --settings=config.docker-compose' +docker compose exec -T app uv run manage.py migrate --settings=config.docker-compose +docker compose exec -T app sh -c 'echo "from data.v2.build import build_all; build_all()" | uv run manage.py shell --settings=config.docker-compose' ``` Browse [localhost/api/v2/](http://localhost/api/v2/) or [localhost/api/v2/pokemon/bulbasaur/](http://localhost/api/v2/pokemon/bulbasaur/) on port `80`. @@ -151,8 +151,8 @@ Configure `kubectl` to point to a cluster and then run the following commands to kubectl apply -k Resources/k8s/kustomize/base/ kubectl config set-context --current --namespace pokeapi # (Optional) Set pokeapi ns as the working ns # Wait for the cluster to spin up -kubectl exec --namespace pokeapi deployment/pokeapi -- python manage.py migrate --settings=config.docker-compose # Migrate the DB -kubectl exec --namespace pokeapi deployment/pokeapi -- sh -c 'echo "from data.v2.build import build_all; build_all()" | python manage.py shell --settings=config.docker-compose' # Build the db +kubectl exec --namespace pokeapi deployment/pokeapi -- uv run manage.py migrate --settings=config.docker-compose # Migrate the DB +kubectl exec --namespace pokeapi deployment/pokeapi -- sh -c 'echo "from data.v2.build import build_all; build_all()" | uv run manage.py shell --settings=config.docker-compose' # Build the db kubectl wait --namespace pokeapi --timeout=120s --for=condition=complete job/load-graphql # Wait for Graphql configuration job to finish ``` diff --git a/Resources/docker/app/Dockerfile b/Resources/docker/app/Dockerfile index 1ce3eb5a6..f21de9019 100644 --- a/Resources/docker/app/Dockerfile +++ b/Resources/docker/app/Dockerfile @@ -5,11 +5,21 @@ ENV PYTHONUNBUFFERED=1 RUN mkdir /code WORKDIR /code -ADD requirements.txt /code/ +# Install UV +RUN apk add --no-cache curl +RUN curl -LsSf https://astral.sh/uv/install.sh | sh + +# Add UV to PATH for this stage +ENV PATH="/root/.local/bin:$PATH" + +# Copy dependency files +ADD pyproject.toml uv.lock* /code/ + +# Install dependencies RUN apk add --no-cache postgresql-libs libstdc++ RUN apk add --no-cache --virtual .build-deps gcc g++ musl-dev \ postgresql-dev binutils rust cargo && \ - python3 -m pip install -r requirements.txt --no-cache-dir + uv sync --frozen FROM python:3.13.7-alpine @@ -19,15 +29,23 @@ ENV DJANGO_SETTINGS_MODULE='config.docker-compose' RUN mkdir /code WORKDIR /code -COPY --from=builder /usr/local/lib/python3.13/site-packages /usr/local/lib/python3.13/site-packages -COPY --from=builder /usr/local/bin /usr/local/bin +# Copy UV and virtual environment from builder +COPY --from=builder /root/.local /root/.local +COPY --from=builder /code/.venv /code/.venv + +# Add UV to PATH +ENV PATH="/root/.local/bin:$PATH" + +# Install runtime dependencies +RUN apk add --no-cache postgresql-libs libstdc++ +# Copy application code ADD . /code/ RUN addgroup -g 1000 -S pokeapi && \ adduser -u 1000 -S pokeapi -G pokeapi USER pokeapi -CMD ["gunicorn", "config.wsgi:application", "-c", "gunicorn.conf.py"] +CMD ["uv", "run", "gunicorn", "config.wsgi:application", "-c", "gunicorn.conf.py"] EXPOSE 80 diff --git a/Resources/docker/app/README.md b/Resources/docker/app/README.md index 285d8d402..c8a0e7cc4 100644 --- a/Resources/docker/app/README.md +++ b/Resources/docker/app/README.md @@ -46,6 +46,6 @@ Pokémon data isn't automatically present in this image. All Pokémon data is pe When the container is up and running, run the following shell commands: ```sh -docker exec pokeapi python manage.py migrate --settings=config.docker-compose -docker exec pokeapi sh -c 'echo "from data.v2.build import build_all; build_all()" | python manage.py shell --settings=config.docker-compose' +docker exec pokeapi uv run manage.py migrate --settings=config.docker-compose +docker exec pokeapi sh -c 'echo "from data.v2.build import build_all; build_all()" | uv run manage.py shell --settings=config.docker-compose' ``` diff --git a/data/v2/build.py b/data/v2/build.py index 0b675f23a..7fd8ba39b 100644 --- a/data/v2/build.py +++ b/data/v2/build.py @@ -1,6 +1,6 @@ # To build out the data you'll need to jump into the Django shell # -# $ python manage.py shell +# $ uv run manage.py shell # # and run the build script with # diff --git a/pyproject.toml b/pyproject.toml index c0118cb02..ac5fb49da 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,6 +14,7 @@ dependencies = [ "drf-spectacular==0.29.0", "gunicorn==23.0.0", "psycopg==3.3.2", + "psycopg2-binary>=2.9.11", "ruff>=0.14.14", "ty>=0.0.14", ] diff --git a/uv.lock b/uv.lock index c45a95a06..dbc8b2778 100644 --- a/uv.lock +++ b/uv.lock @@ -207,6 +207,7 @@ dependencies = [ { name = "drf-spectacular" }, { name = "gunicorn" }, { name = "psycopg" }, + { name = "psycopg2-binary" }, { name = "ruff" }, { name = "ty" }, ] @@ -222,6 +223,7 @@ requires-dist = [ { name = "drf-spectacular", specifier = "==0.29.0" }, { name = "gunicorn", specifier = "==23.0.0" }, { name = "psycopg", specifier = "==3.3.2" }, + { name = "psycopg2-binary", specifier = ">=2.9.11" }, { name = "ruff", specifier = ">=0.14.14" }, { name = "ty", specifier = ">=0.0.14" }, ] @@ -238,6 +240,25 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8c/51/2779ccdf9305981a06b21a6b27e8547c948d85c41c76ff434192784a4c93/psycopg-3.3.2-py3-none-any.whl", hash = "sha256:3e94bc5f4690247d734599af56e51bae8e0db8e4311ea413f801fef82b14a99b", size = 212774, upload-time = "2025-12-06T17:31:41.414Z" }, ] +[[package]] +name = "psycopg2-binary" +version = "2.9.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ac/6c/8767aaa597ba424643dc87348c6f1754dd9f48e80fdc1b9f7ca5c3a7c213/psycopg2-binary-2.9.11.tar.gz", hash = "sha256:b6aed9e096bf63f9e75edf2581aa9a7e7186d97ab5c177aa6c87797cd591236c", size = 379620, upload-time = "2025-10-10T11:14:48.041Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/12/93ef0098590cf51d9732b4f139533732565704f45bdc1ffa741b7c95fb54/psycopg2_binary-2.9.11-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:92e3b669236327083a2e33ccfa0d320dd01b9803b3e14dd986a4fc54aa00f4e1", size = 3756567, upload-time = "2025-10-10T11:13:11.885Z" }, + { url = "https://files.pythonhosted.org/packages/7c/a9/9d55c614a891288f15ca4b5209b09f0f01e3124056924e17b81b9fa054cc/psycopg2_binary-2.9.11-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e0deeb03da539fa3577fcb0b3f2554a97f7e5477c246098dbb18091a4a01c16f", size = 3864755, upload-time = "2025-10-10T11:13:17.727Z" }, + { url = "https://files.pythonhosted.org/packages/13/1e/98874ce72fd29cbde93209977b196a2edae03f8490d1bd8158e7f1daf3a0/psycopg2_binary-2.9.11-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9b52a3f9bb540a3e4ec0f6ba6d31339727b2950c9772850d6545b7eae0b9d7c5", size = 4411646, upload-time = "2025-10-10T11:13:24.432Z" }, + { url = "https://files.pythonhosted.org/packages/5a/bd/a335ce6645334fb8d758cc358810defca14a1d19ffbc8a10bd38a2328565/psycopg2_binary-2.9.11-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:db4fd476874ccfdbb630a54426964959e58da4c61c9feba73e6094d51303d7d8", size = 4468701, upload-time = "2025-10-10T11:13:29.266Z" }, + { url = "https://files.pythonhosted.org/packages/44/d6/c8b4f53f34e295e45709b7568bf9b9407a612ea30387d35eb9fa84f269b4/psycopg2_binary-2.9.11-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:47f212c1d3be608a12937cc131bd85502954398aaa1320cb4c14421a0ffccf4c", size = 4166293, upload-time = "2025-10-10T11:13:33.336Z" }, + { url = "https://files.pythonhosted.org/packages/4b/e0/f8cc36eadd1b716ab36bb290618a3292e009867e5c97ce4aba908cb99644/psycopg2_binary-2.9.11-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e35b7abae2b0adab776add56111df1735ccc71406e56203515e228a8dc07089f", size = 3983184, upload-time = "2025-10-30T02:55:32.483Z" }, + { url = "https://files.pythonhosted.org/packages/53/3e/2a8fe18a4e61cfb3417da67b6318e12691772c0696d79434184a511906dc/psycopg2_binary-2.9.11-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fcf21be3ce5f5659daefd2b3b3b6e4727b028221ddc94e6c1523425579664747", size = 3652650, upload-time = "2025-10-10T11:13:38.181Z" }, + { url = "https://files.pythonhosted.org/packages/76/36/03801461b31b29fe58d228c24388f999fe814dfc302856e0d17f97d7c54d/psycopg2_binary-2.9.11-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:9bd81e64e8de111237737b29d68039b9c813bdf520156af36d26819c9a979e5f", size = 3298663, upload-time = "2025-10-10T11:13:44.878Z" }, + { url = "https://files.pythonhosted.org/packages/97/77/21b0ea2e1a73aa5fa9222b2a6b8ba325c43c3a8d54272839c991f2345656/psycopg2_binary-2.9.11-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:32770a4d666fbdafab017086655bcddab791d7cb260a16679cc5a7338b64343b", size = 3044737, upload-time = "2025-10-30T02:55:35.69Z" }, + { url = "https://files.pythonhosted.org/packages/67/69/f36abe5f118c1dca6d3726ceae164b9356985805480731ac6712a63f24f0/psycopg2_binary-2.9.11-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c3cb3a676873d7506825221045bd70e0427c905b9c8ee8d6acd70cfcbd6e576d", size = 3347643, upload-time = "2025-10-10T11:13:53.499Z" }, + { url = "https://files.pythonhosted.org/packages/e1/36/9c0c326fe3a4227953dfb29f5d0c8ae3b8eb8c1cd2967aa569f50cb3c61f/psycopg2_binary-2.9.11-cp314-cp314-win_amd64.whl", hash = "sha256:4012c9c954dfaccd28f94e84ab9f94e12df76b4afb22331b1f0d3154893a6316", size = 2803913, upload-time = "2025-10-10T11:13:57.058Z" }, +] + [[package]] name = "pyyaml" version = "6.0.3" From 4fcf3a1e2fd3d0fe6195408804b813e754192bf1 Mon Sep 17 00:00:00 2001 From: Paul Hallett Date: Thu, 5 Feb 2026 12:01:26 +0000 Subject: [PATCH 6/6] Migrate postgres job to not use Docker Context: - With the Docker config we hit a memory limit in Github actions - This alternative approach uses "bare metal" and still works --- .github/workflows/database.yml | 53 ++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/.github/workflows/database.yml b/.github/workflows/database.yml index 667d44be3..67866b715 100644 --- a/.github/workflows/database.yml +++ b/.github/workflows/database.yml @@ -1,4 +1,6 @@ name: Database +# These workflows are intended to check that various actions related to the database +# (such as building, exporting, and importing) work as expected. on: pull_request: @@ -52,6 +54,20 @@ jobs: run: curl -Ss http://localhost:8000/api/v2/pokemon/1/ | grep -q 'bulbasaur' postgres: runs-on: ubuntu-latest + services: + postgres: + image: postgres:16 + env: + POSTGRES_USER: pokeapi + POSTGRES_PASSWORD: pokeapi + POSTGRES_DB: pokeapi + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + ports: + - 5432:5432 steps: - name: Checkout uses: actions/checkout@v5 @@ -59,22 +75,29 @@ jobs: submodules: recursive - name: Install uv uses: astral-sh/setup-uv@v7 - - name: Build - run: | - docker compose -f docker-compose.yml -f docker-compose-dev.yml up -d - make docker-migrate - make docker-build-db + - name: Install dependencies + run: make install + - name: Run migrations + run: uv run manage.py migrate --settings=config.local + - name: Build database + run: uv run manage.py shell --settings=config.local -c "from data.v2.build import build_all; build_all(); exit()" - name: Dump DB - run: docker compose exec -T -u postgres db sh -c "cd /tmp && pg_dump -h localhost -Fc -U ash -N 'hdb_*' pokeapi > pokeapi.dump" - - name: Copy dump - run: docker compose cp db:/tmp/pokeapi.dump ./ - - name: Down services - run: docker compose -f docker-compose.yml -f docker-compose-dev.yml down -v - - name: Start services - run: docker compose -f docker-compose.yml -f docker-compose-dev.yml up -d + run: pg_dump -h localhost -U pokeapi -Fc -N 'hdb_*' pokeapi > pokeapi.dump + env: + PGPASSWORD: pokeapi + - name: Drop and recreate database + run: | + psql -h localhost -U pokeapi -d postgres -c "DROP DATABASE pokeapi;" + psql -h localhost -U pokeapi -d postgres -c "CREATE DATABASE pokeapi;" + env: + PGPASSWORD: pokeapi - name: Import database + run: pg_restore -h localhost -U pokeapi -d pokeapi pokeapi.dump + env: + PGPASSWORD: pokeapi + - name: Start server run: | - docker compose cp ./pokeapi.dump db:/tmp/ - docker compose exec -T -u postgres db sh -c "cd /tmp && pg_restore -h localhost -U ash -d pokeapi pokeapi.dump" + nohup uv run manage.py runserver 0.0.0.0:8000 --settings=config.local & + sleep 5 - name: Test data - run: curl -Ss http://localhost/api/v2/pokemon/1/ | grep -q 'bulbasaur' + run: curl -Ss http://localhost:8000/api/v2/pokemon/1/ | grep -q 'bulbasaur'