From 3bec14cbe41e6fedecad6ea0279e94e70d44182a Mon Sep 17 00:00:00 2001 From: John Chilton Date: Mon, 12 Dec 2022 16:46:47 -0500 Subject: [PATCH 1/3] More schema linting in order to get Python client working. I find the YAML version more readable - is this okay? --- .redocly.lint-ignore.yaml | 4 +- Makefile | 8 ++-- client/src/schema/schema.ts | 14 +++--- .../webapps/galaxy/api/history_contents.py | 44 +++++++++++++------ 4 files changed, 43 insertions(+), 27 deletions(-) diff --git a/.redocly.lint-ignore.yaml b/.redocly.lint-ignore.yaml index 20d62aa9d24..9e1e054ef42 100644 --- a/.redocly.lint-ignore.yaml +++ b/.redocly.lint-ignore.yaml @@ -1,6 +1,6 @@ # This file instructs Redocly's linter to ignore the rules contained for specific parts of your API. # See https://redoc.ly/docs/cli/ for more information. -_schema.json: +_schema.yaml: no-empty-servers: - '#/openapi' no-identical-paths: @@ -23,7 +23,5 @@ _schema.json: - '#/paths/~1api~1histories~1{history_id}~1contents~1{id}~1validate' - '#/paths/~1api~1histories~1{history_id}~1contents~1{type}s~1{id}' path-parameters-defined: - - >- - #/paths/~1api~1dataset_collections~1{id}~1prepare_download/post/parameters/0/name - >- #/paths/~1api~1histories~1{history_id}~1contents~1archive~1{id}/get/parameters diff --git a/Makefile b/Makefile index 8c39ede1a82..551b9e467ea 100644 --- a/Makefile +++ b/Makefile @@ -171,17 +171,17 @@ endif build-api-schema: - $(IN_VENV) python scripts/dump_openapi_schema.py _schema.json + $(IN_VENV) python scripts/dump_openapi_schema.py _schema.yaml remove-api-schema: - rm _schema.json + rm _schema.yaml update-client-api-schema: node-deps build-api-schema - $(IN_VENV) cd client && node openapi_to_schema.mjs ../_schema.json > src/schema/schema.ts && npx prettier --write src/schema/schema.ts + $(IN_VENV) cd client && node openapi_to_schema.mjs ../_schema.yaml > src/schema/schema.ts && npx prettier --write src/schema/schema.ts $(MAKE) remove-api-schema lint-api-schema: build-api-schema - $(IN_VENV) npx --yes @redocly/cli lint _schema.json + $(IN_VENV) npx --yes @redocly/cli lint _schema.yaml $(MAKE) remove-api-schema client: node-deps ## Rebuild client-side artifacts for local development. diff --git a/client/src/schema/schema.ts b/client/src/schema/schema.ts index 9143d2eabf1..5e473995714 100644 --- a/client/src/schema/schema.ts +++ b/client/src/schema/schema.ts @@ -78,7 +78,7 @@ export interface paths { * returned short term storage object. Progress tracking this file's creation * can be tracked with the short_term_storage API. */ - post: operations["prepare_collection_download_api_dataset_collections__id__prepare_download_post"]; + post: operations["dataset_collections__prepare_download"]; }; "/api/dataset_collections/{id}/suitable_converters": { /** Returns a list of applicable converters for all datatypes in the given collection. */ @@ -498,7 +498,7 @@ export interface paths { * returned short term storage object. Progress tracking this file's creation * can be tracked with the short_term_storage API. */ - post: operations["prepare_collection_download_api_histories__history_id__contents_dataset_collections__id__prepare_download_post"]; + post: operations["history_contents__prepare_download_dataset_collection"]; }; "/api/histories/{history_id}/contents/datasets/{id}/materialize": { /** Materialize a deferred dataset into real, usable dataset. */ @@ -7819,7 +7819,7 @@ export interface operations { }; }; }; - prepare_collection_download_api_dataset_collections__id__prepare_download_post: { + dataset_collections__prepare_download: { /** * Prepare an short term storage object that the collection will be downloaded to. * @description The history dataset collection will be written as a `zip` archive to the @@ -7831,15 +7831,13 @@ export interface operations { header?: { "run-as"?: string; }; - /** @description The ID of the History. */ /** @description The ID of the `HDCA` contained in the history. */ path: { - history_id: string; id: string; }; }; responses: { - /** @description Successful Response */ + /** @description Short term storage reference for async monitoring of this download. */ 200: { content: { "application/json": components["schemas"]["AsyncFile"]; @@ -7851,6 +7849,8 @@ export interface operations { "application/json": components["schemas"]["HTTPValidationError"]; }; }; + /** @description Required asynchronous tasks required for this operation not available. */ + 501: never; }; }; suitable_converters_api_dataset_collections__id__suitable_converters_get: { @@ -10329,7 +10329,7 @@ export interface operations { }; }; }; - prepare_collection_download_api_histories__history_id__contents_dataset_collections__id__prepare_download_post: { + history_contents__prepare_download_dataset_collection: { /** * Prepare an short term storage object that the collection will be downloaded to. * @description The history dataset collection will be written as a `zip` archive to the diff --git a/lib/galaxy/webapps/galaxy/api/history_contents.py b/lib/galaxy/webapps/galaxy/api/history_contents.py index f6849e7a948..1f6dcc5fafa 100644 --- a/lib/galaxy/webapps/galaxy/api/history_contents.py +++ b/lib/galaxy/webapps/galaxy/api/history_contents.py @@ -295,6 +295,15 @@ def parse_index_jobs_summary_params( return HistoryContentsIndexJobsSummaryParams(ids=util.listify(ids), types=util.listify(types)) +STORE_DOWNLOAD_DESCRIPTION = "Prepare an short term storage object that the collection will be downloaded to." +STORE_DOWNLOAD_RESPONSES = { + 200: { + "description": "Short term storage reference for async monitoring of this download.", + }, + 501: {"description": "Required asynchronous tasks required for this operation not available."}, +} + + @router.cbv class FastAPIHistoryContents: service: HistoriesContentsService = depends(HistoriesContentsService) @@ -510,20 +519,11 @@ class FastAPIHistoryContents: @router.post( "/api/histories/{history_id}/contents/dataset_collections/{id}/prepare_download", - summary="Prepare an short term storage object that the collection will be downloaded to.", - responses={ - 200: { - "description": "Short term storage reference for async monitoring of this download.", - }, - 501: {"description": "Required asynchronous tasks required for this operation not available."}, - }, + summary=STORE_DOWNLOAD_DESCRIPTION, + responses=STORE_DOWNLOAD_RESPONSES, + operation_id="history_contents__prepare_download_dataset_collection", ) - @router.post( - "/api/dataset_collections/{id}/prepare_download", - summary="Prepare an short term storage object that the collection will be downloaded to.", - tags=["dataset collections"], - ) - def prepare_collection_download( + def prepare_collection_download_hc( self, trans: ProvidesHistoryContext = DependsOnTrans, history_id: DecodedDatabaseIdField = HistoryIDPathParam, @@ -535,6 +535,24 @@ class FastAPIHistoryContents: """ return self.service.prepare_collection_download(trans, id) + @router.post( + "/api/dataset_collections/{id}/prepare_download", + summary=STORE_DOWNLOAD_DESCRIPTION, + responses=STORE_DOWNLOAD_RESPONSES, + operation_id="dataset_collections__prepare_download", + tags=["dataset collections"], + ) + def prepare_collection_download_dc( + self, + trans: ProvidesHistoryContext = DependsOnTrans, + id: DecodedDatabaseIdField = HistoryHDCAIDPathParam, + ) -> AsyncFile: + """The history dataset collection will be written as a `zip` archive to the + returned short term storage object. Progress tracking this file's creation + can be tracked with the short_term_storage API. + """ + return self.service.prepare_collection_download(trans, id) + @router.post( "/api/histories/{history_id}/contents/{type}s", summary="Create a new `HDA` or `HDCA` in the given History.", From f65c1be2b8f2828f795d3c9493dcece319d13add Mon Sep 17 00:00:00 2001 From: John Chilton Date: Tue, 13 Dec 2022 10:53:23 -0500 Subject: [PATCH 2/3] Work off the YAML schema. --- .redocly.lint-ignore.yaml | 2 + client/src/schema/schema.ts | 14 +++--- .../webapps/galaxy/api/history_contents.py | 44 ++++++------------- 3 files changed, 22 insertions(+), 38 deletions(-) diff --git a/.redocly.lint-ignore.yaml b/.redocly.lint-ignore.yaml index 9e1e054ef42..47ab23ab397 100644 --- a/.redocly.lint-ignore.yaml +++ b/.redocly.lint-ignore.yaml @@ -23,5 +23,7 @@ _schema.yaml: - '#/paths/~1api~1histories~1{history_id}~1contents~1{id}~1validate' - '#/paths/~1api~1histories~1{history_id}~1contents~1{type}s~1{id}' path-parameters-defined: + - >- + #/paths/~1api~1dataset_collections~1{id}~1prepare_download/post/parameters/0/name - >- #/paths/~1api~1histories~1{history_id}~1contents~1archive~1{id}/get/parameters diff --git a/client/src/schema/schema.ts b/client/src/schema/schema.ts index 5e473995714..9143d2eabf1 100644 --- a/client/src/schema/schema.ts +++ b/client/src/schema/schema.ts @@ -78,7 +78,7 @@ export interface paths { * returned short term storage object. Progress tracking this file's creation * can be tracked with the short_term_storage API. */ - post: operations["dataset_collections__prepare_download"]; + post: operations["prepare_collection_download_api_dataset_collections__id__prepare_download_post"]; }; "/api/dataset_collections/{id}/suitable_converters": { /** Returns a list of applicable converters for all datatypes in the given collection. */ @@ -498,7 +498,7 @@ export interface paths { * returned short term storage object. Progress tracking this file's creation * can be tracked with the short_term_storage API. */ - post: operations["history_contents__prepare_download_dataset_collection"]; + post: operations["prepare_collection_download_api_histories__history_id__contents_dataset_collections__id__prepare_download_post"]; }; "/api/histories/{history_id}/contents/datasets/{id}/materialize": { /** Materialize a deferred dataset into real, usable dataset. */ @@ -7819,7 +7819,7 @@ export interface operations { }; }; }; - dataset_collections__prepare_download: { + prepare_collection_download_api_dataset_collections__id__prepare_download_post: { /** * Prepare an short term storage object that the collection will be downloaded to. * @description The history dataset collection will be written as a `zip` archive to the @@ -7831,13 +7831,15 @@ export interface operations { header?: { "run-as"?: string; }; + /** @description The ID of the History. */ /** @description The ID of the `HDCA` contained in the history. */ path: { + history_id: string; id: string; }; }; responses: { - /** @description Short term storage reference for async monitoring of this download. */ + /** @description Successful Response */ 200: { content: { "application/json": components["schemas"]["AsyncFile"]; @@ -7849,8 +7851,6 @@ export interface operations { "application/json": components["schemas"]["HTTPValidationError"]; }; }; - /** @description Required asynchronous tasks required for this operation not available. */ - 501: never; }; }; suitable_converters_api_dataset_collections__id__suitable_converters_get: { @@ -10329,7 +10329,7 @@ export interface operations { }; }; }; - history_contents__prepare_download_dataset_collection: { + prepare_collection_download_api_histories__history_id__contents_dataset_collections__id__prepare_download_post: { /** * Prepare an short term storage object that the collection will be downloaded to. * @description The history dataset collection will be written as a `zip` archive to the diff --git a/lib/galaxy/webapps/galaxy/api/history_contents.py b/lib/galaxy/webapps/galaxy/api/history_contents.py index 1f6dcc5fafa..f6849e7a948 100644 --- a/lib/galaxy/webapps/galaxy/api/history_contents.py +++ b/lib/galaxy/webapps/galaxy/api/history_contents.py @@ -295,15 +295,6 @@ def parse_index_jobs_summary_params( return HistoryContentsIndexJobsSummaryParams(ids=util.listify(ids), types=util.listify(types)) -STORE_DOWNLOAD_DESCRIPTION = "Prepare an short term storage object that the collection will be downloaded to." -STORE_DOWNLOAD_RESPONSES = { - 200: { - "description": "Short term storage reference for async monitoring of this download.", - }, - 501: {"description": "Required asynchronous tasks required for this operation not available."}, -} - - @router.cbv class FastAPIHistoryContents: service: HistoriesContentsService = depends(HistoriesContentsService) @@ -519,11 +510,20 @@ class FastAPIHistoryContents: @router.post( "/api/histories/{history_id}/contents/dataset_collections/{id}/prepare_download", - summary=STORE_DOWNLOAD_DESCRIPTION, - responses=STORE_DOWNLOAD_RESPONSES, - operation_id="history_contents__prepare_download_dataset_collection", + summary="Prepare an short term storage object that the collection will be downloaded to.", + responses={ + 200: { + "description": "Short term storage reference for async monitoring of this download.", + }, + 501: {"description": "Required asynchronous tasks required for this operation not available."}, + }, ) - def prepare_collection_download_hc( + @router.post( + "/api/dataset_collections/{id}/prepare_download", + summary="Prepare an short term storage object that the collection will be downloaded to.", + tags=["dataset collections"], + ) + def prepare_collection_download( self, trans: ProvidesHistoryContext = DependsOnTrans, history_id: DecodedDatabaseIdField = HistoryIDPathParam, @@ -535,24 +535,6 @@ class FastAPIHistoryContents: """ return self.service.prepare_collection_download(trans, id) - @router.post( - "/api/dataset_collections/{id}/prepare_download", - summary=STORE_DOWNLOAD_DESCRIPTION, - responses=STORE_DOWNLOAD_RESPONSES, - operation_id="dataset_collections__prepare_download", - tags=["dataset collections"], - ) - def prepare_collection_download_dc( - self, - trans: ProvidesHistoryContext = DependsOnTrans, - id: DecodedDatabaseIdField = HistoryHDCAIDPathParam, - ) -> AsyncFile: - """The history dataset collection will be written as a `zip` archive to the - returned short term storage object. Progress tracking this file's creation - can be tracked with the short_term_storage API. - """ - return self.service.prepare_collection_download(trans, id) - @router.post( "/api/histories/{history_id}/contents/{type}s", summary="Create a new `HDA` or `HDCA` in the given History.", From dedd624fe3da868f076fe16094593eed17f7f5ac Mon Sep 17 00:00:00 2001 From: John Chilton Date: Mon, 12 Dec 2022 20:06:03 -0500 Subject: [PATCH 3/3] Improve API linting to include spell checking. --- .ci/ignore-spelling.txt | 1 + Makefile | 1 + client/src/schema/schema.ts | 12 ++++++------ lib/galaxy/dependencies/dev-requirements.txt | 1 + lib/galaxy/schema/drs/ContentsObject.py | 2 +- lib/galaxy/schema/drs/DrsObject.py | 4 ++-- lib/galaxy/schema/schema.py | 2 +- lib/galaxy/webapps/galaxy/api/__init__.py | 2 +- lib/galaxy/webapps/galaxy/api/datasets.py | 2 +- pyproject.toml | 1 + 10 files changed, 16 insertions(+), 12 deletions(-) create mode 100644 .ci/ignore-spelling.txt diff --git a/.ci/ignore-spelling.txt b/.ci/ignore-spelling.txt new file mode 100644 index 00000000000..62397276eda --- /dev/null +++ b/.ci/ignore-spelling.txt @@ -0,0 +1 @@ +hda diff --git a/Makefile b/Makefile index 551b9e467ea..a243e170359 100644 --- a/Makefile +++ b/Makefile @@ -182,6 +182,7 @@ update-client-api-schema: node-deps build-api-schema lint-api-schema: build-api-schema $(IN_VENV) npx --yes @redocly/cli lint _schema.yaml + $(IN_VENV) codespell -I .ci/ignore-spelling.txt _schema.yaml $(MAKE) remove-api-schema client: node-deps ## Rebuild client-side artifacts for local development. diff --git a/client/src/schema/schema.ts b/client/src/schema/schema.ts index 9143d2eabf1..c41536239d3 100644 --- a/client/src/schema/schema.ts +++ b/client/src/schema/schema.ts @@ -1724,7 +1724,7 @@ export interface components { id?: string; /** * Name - * @description A name declared by the bundle author that must be used when materialising this object, overriding any name directly associated with the object itself. The name must be unique with the containing bundle. This string is made up of uppercase and lowercase letters, decimal digits, hypen, period, and underscore [A-Za-z0-9.-_]. See http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282[portable filenames]. + * @description A name declared by the bundle author that must be used when materialising this object, overriding any name directly associated with the object itself. The name must be unique with the containing bundle. This string is made up of uppercase and lowercase letters, decimal digits, hyphen, period, and underscore [A-Za-z0-9.-_]. See http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282[portable filenames]. */ name: string; }; @@ -4565,7 +4565,7 @@ export interface components { InstalledRepositoryToolShedStatus: { /** * Latest installed revision - * @description Most recent version avialable on the tool shed + * @description Most recent version available on the tool shed */ latest_installable_revision: string; /** @@ -5573,7 +5573,7 @@ export interface components { /** * Name * @description A string that can be used to name a `DrsObject`. - * This string is made up of uppercase and lowercase letters, decimal digits, hypen, period, and underscore [A-Za-z0-9.-_]. See http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282[portable filenames]. + * This string is made up of uppercase and lowercase letters, decimal digits, hyphen, period, and underscore [A-Za-z0-9.-_]. See http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282[portable filenames]. */ name?: string; /** @@ -7887,7 +7887,7 @@ export interface operations { index_api_datasets_get: { /** Search datasets or collections using a query system. */ parameters?: { - /** @description Optional identifier of a History. Use it to restrict the search whithin a particular History. */ + /** @description Optional identifier of a History. Use it to restrict the search within a particular History. */ /** @description View to be passed to the serializer */ /** @description Comma-separated list of keys to be passed to the serializer */ /** @@ -12008,7 +12008,7 @@ export interface operations { * generally a partial match will be used to filter the query (i.e. in terms of the implementation * this means the database operation `ILIKE` will typically be used). * - * Once the tagged filters are extracted from the search query, the remaing text is just + * Once the tagged filters are extracted from the search query, the remaining text is just * used to search various documented attributes of the object. * * ## GitHub-style Tags Available @@ -14158,7 +14158,7 @@ export interface operations { * generally a partial match will be used to filter the query (i.e. in terms of the implementation * this means the database operation `ILIKE` will typically be used). * - * Once the tagged filters are extracted from the search query, the remaing text is just + * Once the tagged filters are extracted from the search query, the remaining text is just * used to search various documented attributes of the object. * * ## GitHub-style Tags Available diff --git a/lib/galaxy/dependencies/dev-requirements.txt b/lib/galaxy/dependencies/dev-requirements.txt index 5f38dae3d95..50f5f7a3798 100644 --- a/lib/galaxy/dependencies/dev-requirements.txt +++ b/lib/galaxy/dependencies/dev-requirements.txt @@ -15,6 +15,7 @@ cachecontrol[filecache]==0.12.11 ; python_version >= "3.7" and python_version < cached-property==1.5.2 ; python_version >= "3.7" and python_version < "3.8" celery==5.2.7 ; python_version >= "3.7" and python_version < "3.11" certifi==2022.9.24 ; python_version >= "3.7" and python_version < "3.11" +codespell==2.2.2 ; python_version >= "3.7" and python_version < "3.11" cffi==1.15.1 ; python_version >= "3.7" and python_version < "3.11" charset-normalizer==2.1.1 ; python_version >= "3.7" and python_version < "3.11" click-didyoumean==0.3.0 ; python_version >= "3.7" and python_version < "3.11" diff --git a/lib/galaxy/schema/drs/ContentsObject.py b/lib/galaxy/schema/drs/ContentsObject.py index 9383e53f9ab..55c93a9520e 100644 --- a/lib/galaxy/schema/drs/ContentsObject.py +++ b/lib/galaxy/schema/drs/ContentsObject.py @@ -18,7 +18,7 @@ from pydantic import ( class Model(BaseModel): name: str = Field( ..., - description="A name declared by the bundle author that must be used when materialising this object, overriding any name directly associated with the object itself. The name must be unique with the containing bundle. This string is made up of uppercase and lowercase letters, decimal digits, hypen, period, and underscore [A-Za-z0-9.-_]. See http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282[portable filenames].", + description="A name declared by the bundle author that must be used when materialising this object, overriding any name directly associated with the object itself. The name must be unique with the containing bundle. This string is made up of uppercase and lowercase letters, decimal digits, hyphen, period, and underscore [A-Za-z0-9.-_]. See http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282[portable filenames].", ) id: Optional[str] = Field( None, diff --git a/lib/galaxy/schema/drs/DrsObject.py b/lib/galaxy/schema/drs/DrsObject.py index 9e680194307..98c98ba3633 100644 --- a/lib/galaxy/schema/drs/DrsObject.py +++ b/lib/galaxy/schema/drs/DrsObject.py @@ -49,7 +49,7 @@ class AccessURL(BaseModel): class ContentsObject(BaseModel): name: str = Field( ..., - description="A name declared by the bundle author that must be used when materialising this object, overriding any name directly associated with the object itself. The name must be unique with the containing bundle. This string is made up of uppercase and lowercase letters, decimal digits, hypen, period, and underscore [A-Za-z0-9.-_]. See http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282[portable filenames].", + description="A name declared by the bundle author that must be used when materialising this object, overriding any name directly associated with the object itself. The name must be unique with the containing bundle. This string is made up of uppercase and lowercase letters, decimal digits, hyphen, period, and underscore [A-Za-z0-9.-_]. See http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282[portable filenames].", ) id: Optional[str] = Field( None, @@ -87,7 +87,7 @@ class Model(BaseModel): id: str = Field(..., description="An identifier unique to this `DrsObject`") name: Optional[str] = Field( None, - description="A string that can be used to name a `DrsObject`.\nThis string is made up of uppercase and lowercase letters, decimal digits, hypen, period, and underscore [A-Za-z0-9.-_]. See http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282[portable filenames].", + description="A string that can be used to name a `DrsObject`.\nThis string is made up of uppercase and lowercase letters, decimal digits, hyphen, period, and underscore [A-Za-z0-9.-_]. See http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282[portable filenames].", ) self_uri: str = Field( ..., diff --git a/lib/galaxy/schema/schema.py b/lib/galaxy/schema/schema.py index 81937d437c8..f239e1a147c 100644 --- a/lib/galaxy/schema/schema.py +++ b/lib/galaxy/schema/schema.py @@ -2288,7 +2288,7 @@ class ToolShedRepositoryChangeset(ToolShedRepository): class InstalledRepositoryToolShedStatus(Model): # See https://github.com/galaxyproject/galaxy/issues/10453 latest_installable_revision: str = Field( - title="Latest installed revision", description="Most recent version avialable on the tool shed" + title="Latest installed revision", description="Most recent version available on the tool shed" ) revision_update: str revision_upgrade: Optional[str] diff --git a/lib/galaxy/webapps/galaxy/api/__init__.py b/lib/galaxy/webapps/galaxy/api/__init__.py index d1d998f4828..84e88aa0468 100644 --- a/lib/galaxy/webapps/galaxy/api/__init__.py +++ b/lib/galaxy/webapps/galaxy/api/__init__.py @@ -452,7 +452,7 @@ If the tag is quoted, the attribute will be filtered exactly. If the tag is unqu generally a partial match will be used to filter the query (i.e. in terms of the implementation this means the database operation `ILIKE` will typically be used). -Once the tagged filters are extracted from the search query, the remaing text is just +Once the tagged filters are extracted from the search query, the remaining text is just used to search various documented attributes of the object. ## GitHub-style Tags Available diff --git a/lib/galaxy/webapps/galaxy/api/datasets.py b/lib/galaxy/webapps/galaxy/api/datasets.py index da9af193565..6efb453f51e 100644 --- a/lib/galaxy/webapps/galaxy/api/datasets.py +++ b/lib/galaxy/webapps/galaxy/api/datasets.py @@ -88,7 +88,7 @@ class FastAPIDatasets: trans=DependsOnTrans, history_id: Optional[DecodedDatabaseIdField] = Query( default=None, - description="Optional identifier of a History. Use it to restrict the search whithin a particular History.", + description="Optional identifier of a History. Use it to restrict the search within a particular History.", ), serialization_params: SerializationParams = Depends(query_serialization_params), filter_query_params: FilterQueryParams = Depends(get_filter_query_params), diff --git a/pyproject.toml b/pyproject.toml index e2448b6d4d7..d17f8ccce67 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -115,6 +115,7 @@ zipstream-new = "*" [tool.poetry.group.dev.dependencies] ase = ">=3.18.1" black = "^22.1.0" +codespell = "*" cwltest = "2.2.20210901154959" darker = "*" fluent-logger = "*"