Skip to content

Commit 25766a3

Browse files
author
salabi
committed
param utils and tests restructure
1 parent f1bc63c commit 25766a3

File tree

3 files changed

+61
-90
lines changed

3 files changed

+61
-90
lines changed

digital_land/plugins/arcgis.py

Lines changed: 20 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,24 @@
11
import json
22
import logging
33
import time
4-
from utils.validate_parameter_utils import validate_parameters
54
from esridump.dumper import EsriDumper
5+
from utils.validate_parameter_utils import non_negative_int
6+
from utils.validate_parameter_utils import positive_int
7+
from utils.validate_parameter_utils import validate_plugin_parameters
68

79
DEFAULT_TIMEOUT = 60
810
DEFAULT_RETRIES = 2
911
DEFAULT_RETRY_BACKOFF_SECONDS = 2
10-
ALLOWED_ARCGIS_PARAMETERS = {
11-
"max_page_size",
12-
"timeout",
13-
"retries",
14-
"retry_backoff_seconds",
12+
ARCGIS_PARAMETER_DEFAULTS = {
13+
"timeout": DEFAULT_TIMEOUT,
14+
"retries": DEFAULT_RETRIES,
15+
"retry_backoff_seconds": DEFAULT_RETRY_BACKOFF_SECONDS,
16+
}
17+
ARCGIS_PARAMETER_VALIDATORS = {
18+
"max_page_size": positive_int,
19+
"timeout": positive_int,
20+
"retries": non_negative_int,
21+
"retry_backoff_seconds": positive_int,
1522
}
1623

1724

@@ -89,50 +96,10 @@ def get(collector, url, log={}, plugin="arcgis", parameters=None):
8996
return log, content
9097

9198

92-
# def validate_parameters(parameters):
93-
# if parameters is None:
94-
# parameters = {}
95-
96-
# if not isinstance(parameters, dict):
97-
# raise ValueError("ArcGIS parameters must be a dictionary")
98-
99-
# unknown = set(parameters) - ALLOWED_ARCGIS_PARAMETERS
100-
# if unknown:
101-
# raise ValueError(
102-
# f"Unsupported ArcGIS parameters: {sorted(unknown)}. "
103-
# f"Allowed parameters: {sorted(ALLOWED_ARCGIS_PARAMETERS)}"
104-
# )
105-
106-
# validated = {
107-
# "timeout": DEFAULT_TIMEOUT,
108-
# "retries": DEFAULT_RETRIES,
109-
# "retry_backoff_seconds": DEFAULT_RETRY_BACKOFF_SECONDS,
110-
# }
111-
112-
# if "max_page_size" in parameters:
113-
# value = parameters["max_page_size"]
114-
# if not isinstance(value, int) or value <= 0:
115-
# raise ValueError("ArcGIS parameter 'max_page_size' must be a positive integer")
116-
# validated["max_page_size"] = value
117-
118-
# if "timeout" in parameters:
119-
# value = parameters["timeout"]
120-
# if not isinstance(value, int) or value <= 0:
121-
# raise ValueError("ArcGIS parameter 'timeout' must be a positive integer")
122-
# validated["timeout"] = value
123-
124-
# if "retries" in parameters:
125-
# value = parameters["retries"]
126-
# if not isinstance(value, int) or value < 0:
127-
# raise ValueError("ArcGIS parameter 'retries' must be a non-negative integer")
128-
# validated["retries"] = value
129-
130-
# if "retry_backoff_seconds" in parameters:
131-
# value = parameters["retry_backoff_seconds"]
132-
# if not isinstance(value, int) or value <= 0:
133-
# raise ValueError(
134-
# "ArcGIS parameter 'retry_backoff_seconds' must be a positive integer"
135-
# )
136-
# validated["retry_backoff_seconds"] = value
137-
138-
# return validated
99+
def validate_parameters(parameters):
100+
return validate_plugin_parameters(
101+
parameters=parameters,
102+
plugin_name="ArcGIS",
103+
defaults=ARCGIS_PARAMETER_DEFAULTS,
104+
validators=ARCGIS_PARAMETER_VALIDATORS,
105+
)
Lines changed: 28 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,40 @@
1-
def validate_parameters(parameters):
1+
def positive_int(value, plugin_name, parameter_name):
2+
if not isinstance(value, int) or value <= 0:
3+
raise ValueError(
4+
f"{plugin_name} parameter '{parameter_name}' must be a positive integer"
5+
)
6+
return value
7+
8+
9+
def non_negative_int(value, plugin_name, parameter_name):
10+
if not isinstance(value, int) or value < 0:
11+
raise ValueError(
12+
f"{plugin_name} parameter '{parameter_name}' must be a non-negative integer"
13+
)
14+
return value
15+
16+
17+
def validate_plugin_parameters(parameters, plugin_name, defaults, validators):
218
if parameters is None:
319
parameters = {}
420

521
if not isinstance(parameters, dict):
6-
raise ValueError("ArcGIS parameters must be a dictionary")
22+
raise ValueError(f"{plugin_name} parameters must be a dictionary")
723

8-
unknown = set(parameters) - ALLOWED_ARCGIS_PARAMETERS
24+
allowed_parameters = set(validators)
25+
unknown = set(parameters) - allowed_parameters
926
if unknown:
1027
raise ValueError(
11-
f"Unsupported ArcGIS parameters: {sorted(unknown)}. "
12-
f"Allowed parameters: {sorted(ALLOWED_ARCGIS_PARAMETERS)}"
28+
f"Unsupported {plugin_name} parameters: {sorted(unknown)}. "
29+
f"Allowed parameters: {sorted(allowed_parameters)}"
1330
)
1431

15-
validated = {
16-
"timeout": DEFAULT_TIMEOUT,
17-
"retries": DEFAULT_RETRIES,
18-
"retry_backoff_seconds": DEFAULT_RETRY_BACKOFF_SECONDS,
19-
}
20-
21-
if "max_page_size" in parameters:
22-
value = parameters["max_page_size"]
23-
if not isinstance(value, int) or value <= 0:
24-
raise ValueError("ArcGIS parameter 'max_page_size' must be a positive integer")
25-
validated["max_page_size"] = value
26-
27-
if "timeout" in parameters:
28-
value = parameters["timeout"]
29-
if not isinstance(value, int) or value <= 0:
30-
raise ValueError("ArcGIS parameter 'timeout' must be a positive integer")
31-
validated["timeout"] = value
32-
33-
if "retries" in parameters:
34-
value = parameters["retries"]
35-
if not isinstance(value, int) or value < 0:
36-
raise ValueError("ArcGIS parameter 'retries' must be a non-negative integer")
37-
validated["retries"] = value
38-
39-
if "retry_backoff_seconds" in parameters:
40-
value = parameters["retry_backoff_seconds"]
41-
if not isinstance(value, int) or value <= 0:
42-
raise ValueError(
43-
"ArcGIS parameter 'retry_backoff_seconds' must be a positive integer"
32+
validated = defaults.copy()
33+
34+
for parameter_name, validator in validators.items():
35+
if parameter_name in parameters:
36+
validated[parameter_name] = validator(
37+
parameters[parameter_name], plugin_name, parameter_name
4438
)
45-
validated["retry_backoff_seconds"] = value
4639

4740
return validated

tests/unit/test_collect.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import hashlib
2-
import io
32
import json
43
import csv
54
import os
@@ -14,6 +13,8 @@
1413
from digital_land.collect import Collector, FetchStatus
1514
from digital_land.plugins.arcgis import get as arcgis_get
1615
from digital_land.plugins.arcgis import validate_parameters as validate_arcgis_parameters
16+
from digital_land.utils.validate_parameter_utils import positive_int
17+
from digital_land.utils.validate_parameter_utils import validate_plugin_parameters
1718

1819

1920
@pytest.fixture
@@ -258,6 +259,16 @@ def test_arcgis_validate_parameters_defaults():
258259
}
259260

260261

262+
def test_validate_plugin_parameters_rejects_unknown_parameters():
263+
with pytest.raises(ValueError, match="Unsupported Example parameters"):
264+
validate_plugin_parameters(
265+
parameters={"unknown": 1},
266+
plugin_name="Example",
267+
defaults={},
268+
validators={"page_size": positive_int},
269+
)
270+
271+
261272
def test_arcgis_get_retries_and_logs_failed_step(monkeypatch):
262273
attempts = {"count": 0}
263274
sleep_calls = []
@@ -299,7 +310,7 @@ def __iter__(self):
299310
assert log["arcgis-timeout-seconds"] == 90
300311
assert log["arcgis-retries"] == 1
301312
assert log["arcgis-retry-backoff-seconds"] == 3
302-
assert "exception" not in log
313+
assert "exception" not in log
303314

304315
def test_fetch_passes_parameters_to_arcgis_plugin(collector, monkeypatch):
305316
captured = {}

0 commit comments

Comments
 (0)