Skip to content

Commit f077156

Browse files
authored
default errors from ledger.get_errors() to be unique (#8)
* unqify errors with legdger.get_errors() * upgrade version * opt out of unique errrors
1 parent 5086830 commit f077156

File tree

4 files changed

+47
-3
lines changed

4 files changed

+47
-3
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ var/
2323
*.egg-info/
2424
.installed.cfg
2525
*.egg
26+
.venv/
2627

2728
# PyInstaller
2829
# Usually these files are written by a python script from a template

pylidator/error_ledger.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,13 @@ def get_descriptive_error_messages(self):
9494
def get_warning_messages(self):
9595
return list(unique_everseen([e["message"] for e in self._errors if e["level"] == e.WARN]))
9696

97-
def get_errors(self):
98-
return [e for e in self._errors if e["level"] == e.ERROR]
97+
def get_errors(self, unique=True):
98+
errors = [e for e in self._errors if e["level"] == e.ERROR]
99+
if unique:
100+
return ensure_unique_error_list(errors)
101+
else:
102+
return errors
103+
99104

100105
def get_warnings(self):
101106
return [e for e in self._errors if e["level"] == e.WARN]
@@ -146,3 +151,17 @@ def unique_everseen(iterable, key=None):
146151
if k not in seen:
147152
seen_add(k)
148153
yield element
154+
155+
def ensure_unique_error_list(dict_list):
156+
# Use a set to track unique frozensets of dictionary items
157+
seen = set()
158+
unique_dicts = []
159+
160+
for d in dict_list:
161+
# Convert dictionary items to a frozenset
162+
items = frozenset(d.items())
163+
if items not in seen:
164+
seen.add(items)
165+
unique_dicts.append(d)
166+
167+
return unique_dicts

pylidator/tests/pylidator_test.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,3 +136,27 @@ def test_validator_requesting_unavailable_context_throws(self):
136136
providers=_providers,
137137
extra_context={"not_constants_service": cs},
138138
)
139+
140+
def test_validator_returns_array_of_strings_results_in_errors_that_are_unique(self):
141+
data = TestObj(returns=["error one", "error one"])
142+
ret = pylidator.validate(data, {pylidator.ERROR: [validate_parent]}, providers=_providers)
143+
self.assertEqual(
144+
[
145+
{'validation_type': None, 'message': 'error one', 'level': 'ERROR'},
146+
{'validation_type': None, 'message': 'error one', 'level': 'ERROR'}
147+
],
148+
ret.get_full_results(),
149+
)
150+
self.assertEqual(
151+
[
152+
{'validation_type': None, 'message': 'error one', 'level': 'ERROR'},
153+
],
154+
ret.get_errors(),
155+
)
156+
self.assertEqual(
157+
[
158+
{'validation_type': None, 'message': 'error one', 'level': 'ERROR'},
159+
{'validation_type': None, 'message': 'error one', 'level': 'ERROR'}
160+
],
161+
ret.get_errors(unique=False),
162+
)

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
# Versions should comply with PEP440. For a discussion on single-sourcing
1111
# the version across setup.py and the project code, see
1212
# https://packaging.python.org/en/latest/single_source_version.html
13-
version="1.1.5",
13+
version="1.1.6",
1414
description="A practical system for organizing validation rules.",
1515
long_description=long_description,
1616
long_description_content_type="text/markdown",

0 commit comments

Comments
 (0)