Skip to content

Commit dcc179d

Browse files
committed
feat: Add more structure to ocdsmerge notes #468
1 parent 05f540e commit dcc179d

File tree

4 files changed

+41
-25
lines changed

4 files changed

+41
-25
lines changed

process/processors/compiler.py

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
import functools
22
import logging
3+
import warnings
4+
from collections import Counter
35

4-
import ocdsmerge_rs.exceptions
56
from django.conf import settings
67
from ocdsextensionregistry import ProfileBuilder
78
from ocdsextensionregistry.exceptions import ExtensionWarning
89
from ocdsmerge_rs import Merger
10+
from ocdsmerge_rs.exceptions import DuplicateIdValueWarning, MergeError, MergeWarning
911

1012
from process.models import CollectionFile, CollectionNote, CompiledRelease, Data
11-
from process.util import create_note, create_warnings_note, get_or_create
13+
from process.util import create_note, get_or_create
1214

1315
logger = logging.getLogger(__name__)
1416

@@ -32,15 +34,37 @@ def save_compiled_release(merged, collection, ocid):
3234

3335

3436
def compile_releases_by_ocdskit(collection, ocid, releases, extensions):
35-
with create_warnings_note(collection, ExtensionWarning):
37+
with warnings.catch_warnings(record=True, action="always", category=ExtensionWarning) as wlist:
3638
merger = _get_merger(frozenset(extensions))
3739

40+
for w in filter_warnings(wlist, ExtensionWarning):
41+
create_note(collection, CollectionNote.Level.WARNING, str(w.message), data={"type": w.category.__name__})
42+
3843
try:
39-
with create_warnings_note(collection, ocdsmerge_rs.exceptions.MergeWarning):
44+
with warnings.catch_warnings(record=True, action="always", category=MergeWarning) as wlist:
4045
return merger.create_compiled_release(releases)
41-
except ocdsmerge_rs.exceptions.MergeError as e:
46+
47+
notes = []
48+
paths = Counter()
49+
for w in filter_warnings(wlist, DuplicateIdValueWarning): # DuplicateIdValueWarning is the only MergeWarning
50+
notes.append(str(w.message))
51+
paths[w.message.path] += 1
52+
53+
if notes:
54+
create_note(
55+
collection,
56+
CollectionNote.Level.WARNING,
57+
notes,
58+
data={"type": "DuplicateIdValueWarning", "paths": dict(paths)},
59+
)
60+
except MergeError as e:
4261
logger.exception("OCID %s can't be compiled, skipping", ocid)
43-
create_note(collection, CollectionNote.Level.ERROR, f"OCID {ocid} can't be compiled", data=str(e))
62+
create_note(
63+
collection,
64+
CollectionNote.Level.ERROR,
65+
f"OCID {ocid} can't be compiled",
66+
data={"type": type(e).__name__, "message": str(e), **vars(e)},
67+
)
4468

4569

4670
@functools.lru_cache
@@ -51,3 +75,12 @@ def _get_merger(extensions):
5175
builder = ProfileBuilder(tag, extensions, standard_base_url=url)
5276
patched_schema = builder.patched_release_schema()
5377
return Merger(rules=Merger.get_rules(Merger.dereference(patched_schema)))
78+
79+
80+
def filter_warnings(wlist, category):
81+
"""Yield warnings that match category, re-emitting non-matching warnings."""
82+
for w in wlist:
83+
if issubclass(w.category, category):
84+
yield w
85+
else:
86+
warnings.warn_explicit(w.message, w.category, w.filename, w.lineno, source=w.source)

process/util.py

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import io
33
import logging
44
import os
5-
import warnings
65
from contextlib import contextmanager
76
from textwrap import fill
87

@@ -151,22 +150,6 @@ def delete_step(name, finish=None, finish_args=(), exception=None, **kwargs):
151150
finish(*finish_args, exception=exception)
152151

153152

154-
@contextmanager
155-
def create_warnings_note(collection, category):
156-
with warnings.catch_warnings(record=True, action="always", category=category) as wlist:
157-
yield
158-
159-
note = []
160-
for w in wlist:
161-
if issubclass(w.category, category):
162-
note.append(str(w.message))
163-
else:
164-
warnings.warn_explicit(w.message, w.category, w.filename, w.lineno, source=w.source)
165-
166-
if note:
167-
create_note(collection, CollectionNote.Level.WARNING, note)
168-
169-
170153
@contextmanager
171154
def create_logger_note(collection, name):
172155
stream = io.StringIO()

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ ocdskit==1.4.0
9292
# via -r requirements.in
9393
ocdsmerge==0.8.0
9494
# via ocdskit
95-
ocdsmerge-rs==0.1.1
95+
ocdsmerge-rs==0.1.2
9696
# via -r requirements.in
9797
odfpy==1.4.1
9898
# via flattentool

requirements_dev.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ ocdsmerge==0.8.0
134134
# via
135135
# -r requirements.txt
136136
# ocdskit
137-
ocdsmerge-rs==0.1.1
137+
ocdsmerge-rs==0.1.2
138138
# via -r requirements.txt
139139
odfpy==1.4.1
140140
# via

0 commit comments

Comments
 (0)