diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index be855ef..9b81a41 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -17,6 +17,8 @@ jobs: run: python -m pip install poetry - name: Install dependencies run: python -m poetry install --only dev + - name: Run black + run: python -m poetry run black --check bento_service_registry tests - name: Run linter run: python -m poetry run flake8 ./bento_service_registry ./tests - name: Run type checker diff --git a/bento_service_registry/app.py b/bento_service_registry/app.py index b2e9228..00aa651 100644 --- a/bento_service_registry/app.py +++ b/bento_service_registry/app.py @@ -37,7 +37,8 @@ def create_app(config_override: Callable[[], Config] | None = None) -> FastAPI: authz_middleware.attach(app) app.exception_handler(StarletteHTTPException)( - http_exception_handler_factory(get_logger(config_for_setup), authz_middleware)) + http_exception_handler_factory(get_logger(config_for_setup), authz_middleware) + ) app.exception_handler(RequestValidationError)(validation_exception_handler_factory(authz_middleware)) return app diff --git a/bento_service_registry/bento_services_json.py b/bento_service_registry/bento_services_json.py index b210391..e760391 100644 --- a/bento_service_registry/bento_services_json.py +++ b/bento_service_registry/bento_services_json.py @@ -54,7 +54,7 @@ async def get_bento_services_by_compose_id(config: ConfigDependency) -> BentoSer async def get_bento_services_by_kind( - bento_services_by_compose_id: BentoServicesByComposeIDDependency + bento_services_by_compose_id: BentoServicesByComposeIDDependency, ) -> BentoServicesByKind: services_by_kind: BentoServicesByKind = {} diff --git a/bento_service_registry/data_types.py b/bento_service_registry/data_types.py index bc5d4a8..a6f25d5 100644 --- a/bento_service_registry/data_types.py +++ b/bento_service_registry/data_types.py @@ -41,7 +41,8 @@ async def get_data_types_from_service( async with http_session.get(urljoin(service_url_norm, "data-types"), headers=authz_header) as res: if res.status != status.HTTP_200_OK: logger.error( - f"Got non-200 response from data type service ({service_url=}): {res.status=}; body={await res.json()}") + f"Got non-200 response from data type service ({service_url=}): {res.status=}; body={await res.json()}" + ) return () dts: list[DataTypeWithServiceURL] = [] diff --git a/bento_service_registry/routes.py b/bento_service_registry/routes.py index e3a8c23..3b2549a 100644 --- a/bento_service_registry/routes.py +++ b/bento_service_registry/routes.py @@ -65,7 +65,8 @@ async def get_service_by_id( if service_data is None: raise HTTPException( status.HTTP_500_INTERNAL_SERVER_ERROR, - f"An internal error was encountered with service with ID {service_id}") + f"An internal error was encountered with service with ID {service_id}", + ) return service_data diff --git a/bento_service_registry/services.py b/bento_service_registry/services.py index 83c1292..298e0f8 100644 --- a/bento_service_registry/services.py +++ b/bento_service_registry/services.py @@ -91,7 +91,8 @@ async def get_service( # TypeError can happen if None is received self._logger.error( f"{service_info_url}: Encountered invalid response ({str(e)}) - {await r.text()} " - f"(Took {(datetime.now() - dt).total_seconds():.1f}s)") + f"(Took {(datetime.now() - dt).total_seconds():.1f}s)" + ) except asyncio.TimeoutError: self._logger.error(f"Encountered timeout with {service_info_url}") @@ -109,10 +110,12 @@ async def get_services( service_info: GA4GHServiceInfo, ) -> tuple[dict, ...]: if not self._co: - self._co = asyncio.gather(*( - self.get_service(authz_header, http_session, service_info, s) - for s in bento_services_by_kind.values() - )) + self._co = asyncio.gather( + *( + self.get_service(authz_header, http_session, service_info, s) + for s in bento_services_by_kind.values() + ) + ) service_list: list[dict | None] = await self._co self._co = None diff --git a/bento_service_registry/types.py b/bento_service_registry/types.py index 98faef3..dfac84e 100644 --- a/bento_service_registry/types.py +++ b/bento_service_registry/types.py @@ -3,6 +3,7 @@ # TODO: py3.11(?): optional TypedDict props + # required props for chord_services.json entries class BaseBentoService(TypedDict): url_template: str diff --git a/bento_service_registry/workflows.py b/bento_service_registry/workflows.py index 8e5b4ea..6162095 100644 --- a/bento_service_registry/workflows.py +++ b/bento_service_registry/workflows.py @@ -45,7 +45,8 @@ async def get_workflows_from_service( if res.status != status.HTTP_200_OK: logger.error( f"Got non-200 response from data type service ({service_url=}): {res.status=}; body={data}; " - f"took {time_taken:.1f}s") + f"took {time_taken:.1f}s" + ) return {} logger.debug(f"{workflows_url}: took {time_taken:.1f}s") @@ -70,7 +71,8 @@ async def get_workflows( logger.debug("Collecting workflows from workflow-providing services") workflow_services = [ - s for s in services_tuple + s + for s in services_tuple if (b := s.get("bento", {})).get("dataService", False) or b.get("workflowProvider", False) ] diff --git a/poetry.lock b/poetry.lock index c338c3a..0d4d732 100644 --- a/poetry.lock +++ b/poetry.lock @@ -241,6 +241,52 @@ django = ["django (>=4.2.7,<5.1)", "djangorestframework (>=3.14.0,<3.16)"] fastapi = ["fastapi (>=0.104,<0.112)"] flask = ["flask (>=2.2.5,<4)"] +[[package]] +name = "black" +version = "24.4.2" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.8" +files = [ + {file = "black-24.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce"}, + {file = "black-24.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021"}, + {file = "black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063"}, + {file = "black-24.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96"}, + {file = "black-24.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474"}, + {file = "black-24.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c"}, + {file = "black-24.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb"}, + {file = "black-24.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1"}, + {file = "black-24.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d"}, + {file = "black-24.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04"}, + {file = "black-24.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc"}, + {file = "black-24.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0"}, + {file = "black-24.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7"}, + {file = "black-24.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94"}, + {file = "black-24.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8"}, + {file = "black-24.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c"}, + {file = "black-24.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1"}, + {file = "black-24.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741"}, + {file = "black-24.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e"}, + {file = "black-24.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7"}, + {file = "black-24.4.2-py3-none-any.whl", hash = "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c"}, + {file = "black-24.4.2.tar.gz", hash = "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + [[package]] name = "cachetools" version = "5.3.3" @@ -1298,6 +1344,17 @@ files = [ {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, ] +[[package]] +name = "pathspec" +version = "0.12.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] + [[package]] name = "platformdirs" version = "4.2.2" @@ -2598,4 +2655,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = "^3.10.0" -content-hash = "6e5202fa745baec580a637b9e5ca430c78ec80357e3c36ea93791e9b1dafe964" +content-hash = "0b72ccf3d179cdad0dbbd1ac954a8b33f6655897d723d504e28ac9b626ff1775" diff --git a/pyproject.toml b/pyproject.toml index fd5fd21..6240717 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -40,3 +40,7 @@ pytest-asyncio = "^0.23.6" pytest-cov = "^4.1.0" tox = "^4.15.0" types-aiofiles = "^23.2.0" +black = "^24.4.2" + +[tool.black] +line_length = 120 diff --git a/tests/conftest.py b/tests/conftest.py index 1c04dd0..ceef0ab 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -35,6 +35,7 @@ def get_config_inner(): def client(): tgc = test_get_config(debug_mode=False) from bento_service_registry.app import create_app + app = create_app(tgc) yield TestClient(app) @@ -43,12 +44,14 @@ def client(): def client_debug_mode(): tgc = test_get_config(debug_mode=True) from bento_service_registry.app import create_app + app = create_app(tgc) yield TestClient(app) async def _service_info_fixt(config: Config): from bento_service_registry.service_info import get_service_info + return await get_service_info(config, test_logger) diff --git a/tox.ini b/tox.ini index c85b06f..0f38e25 100644 --- a/tox.ini +++ b/tox.ini @@ -9,5 +9,6 @@ allowlist_externals = commands = poetry install --sync poetry run pytest -svv --cov=bento_service_registry --cov-branch {posargs} + poetry run black --check bento_service_registry tests poetry run flake8 ./bento_service_registry ./tests poetry run mypy bento_service_registry