Skip to content

Commit 6be9be3

Browse files
authored
speed up validation by resuing validators (#777)
* improve performance with validator instances * fix
1 parent 02a554b commit 6be9be3

File tree

6 files changed

+27
-17
lines changed

6 files changed

+27
-17
lines changed

mapillary_tools/authenticate.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ def _prompt(message: str) -> str:
165165

166166
def _validate_profile(user_items: config.UserItem) -> config.UserItem:
167167
try:
168-
jsonschema.validate(user_items, config.UserItemSchema)
168+
config.UserItemSchemaValidator.validate(user_items)
169169
except jsonschema.ValidationError as ex:
170170
raise exceptions.MapillaryBadParameterError(
171171
f"Invalid profile format: {ex.message}"

mapillary_tools/config.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import typing as T
77
from typing import TypedDict
88

9+
import jsonschema
10+
911
if sys.version_info >= (3, 11):
1012
from typing import Required
1113
else:
@@ -50,6 +52,9 @@ class UserItem(TypedDict, total=False):
5052
}
5153

5254

55+
UserItemSchemaValidator = jsonschema.Draft202012Validator(UserItemSchema)
56+
57+
5358
def _load_config(config_path: str) -> configparser.ConfigParser:
5459
config = configparser.ConfigParser()
5560
# Override to not change option names (by default it will lower them)

mapillary_tools/geotag/options.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,8 +173,11 @@ class InterpolationOption:
173173
}
174174

175175

176+
SourceOptionSchemaValidator = jsonschema.Draft202012Validator(SourceOptionSchema)
177+
178+
176179
def validate_option(instance):
177-
jsonschema.validate(instance=instance, schema=SourceOptionSchema)
180+
SourceOptionSchemaValidator.validate(instance=instance)
178181

179182

180183
if __name__ == "__main__":

mapillary_tools/process_geotag_properties.py

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -304,19 +304,12 @@ def _validate_metadatas(
304304
# TypeError: __init__() missing 3 required positional arguments: 'image_time', 'gpx_start_time', and 'gpx_end_time'
305305
# See https://stackoverflow.com/a/61432070
306306
good_metadatas, error_metadatas = types.separate_errors(metadatas)
307-
map_results = utils.mp_map_maybe(
308-
validate_and_fail_metadata,
309-
T.cast(T.Iterable[types.Metadata], good_metadatas),
310-
num_processes=num_processes,
311-
)
312307

313308
validated_metadatas = list(
314-
tqdm(
315-
map_results,
316-
desc="Validating metadatas",
317-
unit="metadata",
318-
disable=LOG.getEffectiveLevel() <= logging.DEBUG,
319-
total=len(good_metadatas),
309+
utils.mp_map_maybe(
310+
validate_and_fail_metadata,
311+
T.cast(T.Iterable[types.Metadata], good_metadatas),
312+
num_processes=num_processes,
320313
)
321314
)
322315

mapillary_tools/serializer/description.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,11 @@ def _merge_schema(*schemas: dict) -> dict:
259259
)
260260

261261

262+
ImageDescriptionFileSchemaValidator = jsonschema.Draft202012Validator(
263+
ImageDescriptionFileSchema
264+
)
265+
266+
262267
VideoDescriptionFileSchema = _merge_schema(
263268
VideoDescriptionSchema,
264269
{
@@ -295,6 +300,11 @@ def _merge_schema(*schemas: dict) -> dict:
295300
)
296301

297302

303+
VideoDescriptionFileSchemaValidator = jsonschema.Draft202012Validator(
304+
VideoDescriptionFileSchema
305+
)
306+
307+
298308
ImageVideoDescriptionFileSchema = {
299309
"oneOf": [VideoDescriptionFileSchema, ImageDescriptionFileSchema]
300310
}
@@ -520,7 +530,7 @@ def parse_capture_time(time: str) -> datetime.datetime:
520530

521531
def validate_image_desc(desc: T.Any) -> None:
522532
try:
523-
jsonschema.validate(instance=desc, schema=ImageDescriptionFileSchema)
533+
ImageDescriptionFileSchemaValidator.validate(desc)
524534
except jsonschema.ValidationError as ex:
525535
# do not use str(ex) which is more verbose
526536
raise exceptions.MapillaryMetadataValidationError(ex.message) from ex
@@ -533,7 +543,7 @@ def validate_image_desc(desc: T.Any) -> None:
533543

534544
def validate_video_desc(desc: T.Any) -> None:
535545
try:
536-
jsonschema.validate(instance=desc, schema=VideoDescriptionFileSchema)
546+
VideoDescriptionFileSchemaValidator.validate(desc)
537547
except jsonschema.ValidationError as ex:
538548
# do not use str(ex) which is more verbose
539549
raise exceptions.MapillaryMetadataValidationError(ex.message) from ex

mapillary_tools/upload.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
from pathlib import Path
1111

1212
import humanize
13-
import jsonschema
1413
import requests
1514
from tqdm import tqdm
1615

@@ -57,7 +56,7 @@ def upload(
5756

5857
metadatas = _load_descs(_metadatas_from_process, import_paths, desc_path)
5958

60-
jsonschema.validate(instance=user_items, schema=config.UserItemSchema)
59+
config.UserItemSchemaValidator.validate(user_items)
6160

6261
# Setup the emitter -- the order matters here
6362

0 commit comments

Comments
 (0)