Skip to content

Commit f64ddb7

Browse files
authored
Fix missing types to core pygeoapi (#2143)
* Fix API types * Fix more signatures
1 parent 0626bc5 commit f64ddb7

File tree

15 files changed

+175
-120
lines changed

15 files changed

+175
-120
lines changed

pygeoapi/api/__init__.py

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,9 @@
4949
import logging
5050
import re
5151
import sys
52-
from typing import Any, Tuple, Union, Optional
52+
from typing import Any, Tuple, Union, Optional, Self
5353

54+
from babel import Locale
5455
from dateutil.parser import parse as dateparse
5556
import pytz
5657

@@ -286,7 +287,8 @@ def _get_params(request):
286287
LOGGER.debug('No query parameters found')
287288
return {}
288289

289-
def _get_locale(self, headers, supported_locales):
290+
def _get_locale(self, headers: dict,
291+
supported_locales: Union[list, Locale]) -> tuple:
290292
"""
291293
Detects locale from "lang=<language>" param or `Accept-Language`
292294
header. Returns a tuple of (raw, locale) if found in params or headers.
@@ -325,7 +327,7 @@ def _get_locale(self, headers, supported_locales):
325327

326328
return raw, default_locale
327329

328-
def _get_format(self, headers) -> Union[str, None]:
330+
def _get_format(self, headers: dict) -> Union[str, None]:
329331
"""
330332
Get `Request` format type from query parameters or headers.
331333
@@ -464,9 +466,9 @@ def is_valid(self, additional_formats=None) -> bool:
464466
return True
465467
return False
466468

467-
def get_response_headers(self, force_lang: l10n.Locale = None,
468-
force_type: str = None,
469-
force_encoding: str = None,
469+
def get_response_headers(self, force_lang: l10n.Locale | None = None,
470+
force_type: str | None = None,
471+
force_encoding: str | None = None,
470472
**custom_headers) -> dict:
471473
"""
472474
Prepares and returns a dictionary with Response object headers.
@@ -512,7 +514,7 @@ def get_response_headers(self, force_lang: l10n.Locale = None,
512514

513515
return headers
514516

515-
def get_request_headers(self, headers) -> dict:
517+
def get_request_headers(self, headers: dict) -> dict:
516518
"""
517519
Obtains and returns a dictionary with Request object headers.
518520
@@ -529,7 +531,7 @@ def get_request_headers(self, headers) -> dict:
529531
class API:
530532
"""API object"""
531533

532-
def __init__(self, config, openapi):
534+
def __init__(self, config: dict, openapi: dict) -> Self | None:
533535
"""
534536
constructor
535537
@@ -571,8 +573,8 @@ def __init__(self, config, openapi):
571573
self.manager = get_manager(self.config)
572574
LOGGER.info('Process manager plugin loaded')
573575

574-
def get_exception(self, status, headers, format_, code,
575-
description) -> Tuple[dict, int, str]:
576+
def get_exception(self, status: int, headers: dict, format_: str | None,
577+
code: str, description: str) -> Tuple[dict, int, str]:
576578
"""
577579
Exception handler
578580
@@ -610,7 +612,8 @@ def get_exception(self, status, headers, format_, code,
610612

611613
return headers, status, content
612614

613-
def get_format_exception(self, request) -> Tuple[dict, int, str]:
615+
def get_format_exception(self,
616+
request: APIRequest) -> Tuple[dict, int, str]:
614617
"""
615618
Returns a format exception.
616619
@@ -631,7 +634,7 @@ def get_format_exception(self, request) -> Tuple[dict, int, str]:
631634
def get_collections_url(self) -> str:
632635
return f"{self.base_url}/collections"
633636

634-
def get_dataset_templates(self, dataset) -> dict:
637+
def get_dataset_templates(self, dataset: str) -> dict:
635638
templates = self.config['resources'][dataset].get('templates')
636639

637640
return templates or self.tpl_config['server']['templates']
@@ -884,7 +887,7 @@ def openapi_(api: API, request: APIRequest) -> Tuple[dict, int, str]:
884887
return headers, HTTPStatus.OK, api.openapi
885888

886889

887-
def conformance(api, request: APIRequest) -> Tuple[dict, int, str]:
890+
def conformance(api: API, request: APIRequest) -> Tuple[dict, int, str]:
888891
"""
889892
Provide conformance definition
890893
@@ -930,7 +933,7 @@ def conformance(api, request: APIRequest) -> Tuple[dict, int, str]:
930933

931934
@jsonldify
932935
def describe_collections(api: API, request: APIRequest,
933-
dataset=None) -> Tuple[dict, int, str]:
936+
dataset: str | None = None) -> Tuple[dict, int, str]:
934937
"""
935938
Provide collection metadata
936939
@@ -1377,7 +1380,7 @@ def describe_collections(api: API, request: APIRequest,
13771380

13781381

13791382
def get_collection_schema(api: API, request: Union[APIRequest, Any],
1380-
dataset) -> Tuple[dict, int, str]:
1383+
dataset: str) -> Tuple[dict, int, str]:
13811384
"""
13821385
Returns a collection schema
13831386
@@ -1462,7 +1465,7 @@ def get_collection_schema(api: API, request: Union[APIRequest, Any],
14621465
return headers, HTTPStatus.OK, to_json(schema, api.pretty_print)
14631466

14641467

1465-
def validate_bbox(value=None) -> list:
1468+
def validate_bbox(value: list | None = None) -> list:
14661469
"""
14671470
Helper function to validate bbox parameter
14681471
@@ -1510,7 +1513,8 @@ def validate_bbox(value=None) -> list:
15101513
return bbox
15111514

15121515

1513-
def validate_datetime(resource_def, datetime_=None) -> str:
1516+
def validate_datetime(resource_def: dict,
1517+
datetime_: str | None = None) -> str:
15141518
"""
15151519
Helper function to validate temporal parameter
15161520

pygeoapi/api/admin.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class Admin(API):
5454
PYGEOAPI_CONFIG = os.environ.get('PYGEOAPI_CONFIG')
5555
PYGEOAPI_OPENAPI = os.environ.get('PYGEOAPI_OPENAPI')
5656

57-
def __init__(self, config, openapi):
57+
def __init__(self, config: dict, openapi: dict):
5858
"""
5959
constructor
6060
@@ -66,7 +66,7 @@ def __init__(self, config, openapi):
6666

6767
super().__init__(config, openapi)
6868

69-
def merge(self, obj1, obj2):
69+
def merge(self, obj1: dict, obj2: dict):
7070
"""
7171
Merge two dictionaries
7272
@@ -89,7 +89,7 @@ def merge(self, obj1, obj2):
8989
else:
9090
return obj2
9191

92-
def validate(self, config):
92+
def validate(self, config: dict):
9393
"""
9494
Validate pygeoapi configuration and OpenAPI to file
9595
@@ -105,7 +105,7 @@ def validate(self, config):
105105
# validate_openapi_document(oas)
106106
return True
107107

108-
def write(self, config):
108+
def write(self, config: dict):
109109
"""
110110
Write pygeoapi configuration and OpenAPI to file
111111
@@ -115,7 +115,7 @@ def write(self, config):
115115
self.write_config(config)
116116
self.write_oas(config)
117117

118-
def write_config(self, config):
118+
def write_config(self, config: dict):
119119
"""
120120
Write pygeoapi configuration file
121121
@@ -140,7 +140,7 @@ def write_config(self, config):
140140
yaml_dump(config, self.PYGEOAPI_CONFIG)
141141
LOGGER.debug('Finished writing pygeoapi configuration')
142142

143-
def write_oas(self, config):
143+
def write_oas(self, config: dict):
144144
"""
145145
Write pygeoapi OpenAPI document
146146

pygeoapi/api/coverages.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@
6969

7070

7171
def get_collection_coverage(
72-
api: API, request: APIRequest, dataset) -> Tuple[dict, int, str]:
72+
api: API, request: APIRequest,
73+
dataset: str) -> Tuple[dict, int, str]:
7374
"""
7475
Returns a subset of a collection coverage
7576

pygeoapi/api/environmental_data_retrieval.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,10 @@
6666
]
6767

6868

69-
def get_collection_edr_instances(api: API, request: APIRequest, dataset,
70-
instance_id=None) -> Tuple[dict, int, str]:
69+
def get_collection_edr_instances(api: API, request: APIRequest,
70+
dataset: str,
71+
instance_id: str | None = None
72+
) -> Tuple[dict, int, str]:
7173
"""
7274
Queries collection EDR instances
7375
@@ -233,8 +235,10 @@ def get_collection_edr_instances(api: API, request: APIRequest, dataset,
233235

234236

235237
def get_collection_edr_query(api: API, request: APIRequest,
236-
dataset, instance, query_type,
237-
location_id=None) -> Tuple[dict, int, str]:
238+
dataset: str, instance: str,
239+
query_type: str,
240+
location_id: str | None = None
241+
) -> Tuple[dict, int, str]:
238242
"""
239243
Queries collection EDR
240244

pygeoapi/api/itemtypes.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,8 @@
101101

102102

103103
def get_collection_queryables(api: API, request: Union[APIRequest, Any],
104-
dataset=None) -> Tuple[dict, int, str]:
104+
dataset: str | None = None
105+
) -> Tuple[dict, int, str]:
105106
"""
106107
Provide collection queryables
107108
@@ -235,7 +236,7 @@ def get_collection_queryables(api: API, request: Union[APIRequest, Any],
235236

236237
def get_collection_items(
237238
api: API, request: Union[APIRequest, Any],
238-
dataset) -> Tuple[dict, int, str]:
239+
dataset: str | None = None) -> Tuple[dict, int, str]:
239240
"""
240241
Queries collection
241242
@@ -703,7 +704,8 @@ def get_collection_items(
703704

704705
def manage_collection_item(
705706
api: API, request: APIRequest,
706-
action, dataset, identifier=None) -> Tuple[dict, int, str]:
707+
action: str, dataset: str,
708+
identifier: str | None = None) -> Tuple[dict, int, str]:
707709
"""
708710
Adds an item to a collection
709711
@@ -813,7 +815,8 @@ def manage_collection_item(
813815

814816

815817
def get_collection_item(api: API, request: APIRequest,
816-
dataset, identifier) -> Tuple[dict, int, str]:
818+
dataset: str, identifier: str
819+
) -> Tuple[dict, int, str]:
817820
"""
818821
Get a single collection item
819822
@@ -986,7 +989,8 @@ def get_collection_item(api: API, request: APIRequest,
986989

987990

988991
def create_crs_transform_spec(
989-
config: dict, query_crs_uri: Optional[str] = None) -> Union[None, CrsTransformSpec]: # noqa
992+
config: dict,
993+
query_crs_uri: Optional[str] = None) -> Union[None, CrsTransformSpec]: # noqa
990994
"""
991995
Create a `CrsTransformSpec` instance based on provider config and
992996
*crs* query parameter.

pygeoapi/api/maps.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@
6464

6565

6666
def get_collection_map(api: API, request: APIRequest,
67-
dataset, style=None) -> Tuple[dict, int, str]:
67+
dataset: str, style: str | None = None
68+
) -> Tuple[dict, int, str]:
6869
"""
6970
Returns a subset of a collection map
7071
@@ -194,7 +195,8 @@ def get_collection_map(api: API, request: APIRequest,
194195

195196

196197
def get_collection_map_legend(api: API, request: APIRequest,
197-
dataset, style=None) -> Tuple[dict, int, str]:
198+
dataset: str, style: str | None = None
199+
) -> Tuple[dict, int, str]:
198200
"""
199201
Returns a subset of a collection map legend
200202

pygeoapi/api/processes.py

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,20 @@
4040
# =================================================================
4141

4242

43+
import json
44+
import logging
45+
import urllib.parse
4346
from copy import deepcopy
4447
from datetime import datetime, timezone
4548
from http import HTTPStatus
46-
import json
47-
import logging
4849
from typing import Tuple
49-
import urllib.parse
5050

5151
from pygeoapi import l10n
5252
from pygeoapi.api import evaluate_limit
5353
from pygeoapi.process.base import (
54-
JobNotFoundError, JobResultNotFoundError, ProcessorExecuteError
54+
JobNotFoundError,
55+
JobResultNotFoundError,
56+
ProcessorExecuteError,
5557
)
5658
from pygeoapi.process.manager.base import get_manager, Subscriber
5759
from pygeoapi.util import (
@@ -74,7 +76,8 @@
7476

7577

7678
def describe_processes(api: API, request: APIRequest,
77-
process=None) -> Tuple[dict, int, str]:
79+
process: str | None = None
80+
) -> Tuple[dict, int, str]:
7881
"""
7982
Provide processes metadata
8083
@@ -227,7 +230,7 @@ def describe_processes(api: API, request: APIRequest,
227230

228231
# TODO: get_jobs doesn't have tests
229232
def get_jobs(api: API, request: APIRequest,
230-
job_id=None) -> Tuple[dict, int, str]:
233+
job_id: str | None = None) -> Tuple[dict, int, str]:
231234
"""
232235
Get process jobs
233236
@@ -405,7 +408,7 @@ def get_jobs(api: API, request: APIRequest,
405408

406409

407410
def execute_process(api: API, request: APIRequest,
408-
process_id) -> Tuple[dict, int, str]:
411+
process_id: str) -> Tuple[dict, int, str]:
409412
"""
410413
Execute process
411414
@@ -532,7 +535,7 @@ def execute_process(api: API, request: APIRequest,
532535

533536

534537
def get_job_result(api: API, request: APIRequest,
535-
job_id) -> Tuple[dict, int, str]:
538+
job_id: str) -> Tuple[dict, int, str]:
536539
"""
537540
Get result of job (instance of a process)
538541
@@ -602,7 +605,8 @@ def get_job_result(api: API, request: APIRequest,
602605
return headers, HTTPStatus.OK, content
603606

604607

605-
def delete_job(api: API, request: APIRequest, job_id) -> Tuple[dict, int, str]:
608+
def delete_job(api: API, request: APIRequest,
609+
job_id: str) -> Tuple[dict, int, str]:
606610
"""
607611
Delete a process job
608612
@@ -647,7 +651,8 @@ def delete_job(api: API, request: APIRequest, job_id) -> Tuple[dict, int, str]:
647651
return {}, http_status, to_json(response, api.pretty_print)
648652

649653

650-
def get_oas_30(cfg: dict, locale: str) -> tuple[list[dict[str, str]], dict[str, dict]]: # noqa
654+
def get_oas_30(cfg: dict, locale: str
655+
) -> tuple[list[dict[str, str]], dict[str, dict]]: # noqa
651656
"""
652657
Get OpenAPI fragments
653658

pygeoapi/api/stac.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ def get_stac_root(api: API, request: APIRequest) -> Tuple[dict, int, str]:
134134

135135
# TODO: no tests for this?
136136
def get_stac_path(api: API, request: APIRequest,
137-
path) -> Tuple[dict, int, str]:
137+
path: str) -> Tuple[dict, int, str]:
138138
"""
139139
Provide STAC resource path
140140

0 commit comments

Comments
 (0)