summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWojtek Kosior <koszko@koszko.org>2022-08-25 13:18:28 +0200
committerWojtek Kosior <koszko@koszko.org>2022-09-28 12:54:54 +0200
commitc1f6a379b3a85303f487e1b366e96d9db90cd4e3 (patch)
tree363707a5d1809b2d3640eb3e934a0239a699f64f
parentad76c83354b2741b10fc2f9b12fea30dbd450e33 (diff)
downloadhaketilo-hydrilla-c1f6a379b3a85303f487e1b366e96d9db90cd4e3.tar.gz
haketilo-hydrilla-c1f6a379b3a85303f487e1b366e96d9db90cd4e3.zip
include offending mapping identifiers in exception when unable to resolve dependencies
-rw-r--r--src/hydrilla/proxy/simple_dependency_satisfying.py22
1 files changed, 15 insertions, 7 deletions
diff --git a/src/hydrilla/proxy/simple_dependency_satisfying.py b/src/hydrilla/proxy/simple_dependency_satisfying.py
index f1371db..78a1197 100644
--- a/src/hydrilla/proxy/simple_dependency_satisfying.py
+++ b/src/hydrilla/proxy/simple_dependency_satisfying.py
@@ -25,7 +25,11 @@
# in a proprietary program, I am not going to enforce this in court.
"""
-.....
+This module contains logic to construct the dependency graph of Haketilo
+packages and to perform dependency resolution.
+
+The approach taken here is a very simplified one. Hopefully, this will at some
+point be replaced by a solution based on some SAT solver.
"""
# Enable using with Python 3.7.
@@ -39,8 +43,9 @@ from .. import item_infos
from .. import url_patterns
+@dc.dataclass(frozen=True)
class ImpossibleSituation(HaketiloException):
- pass
+ bad_mapping_identifiers: frozenset[str]
@dc.dataclass(frozen=True)
@@ -219,13 +224,16 @@ class _ComputationData:
if self.mappings.get(depended_identifier) not in choices:
_mark_mappings(depended_identifier, reverse_deps, bad_mappings)
- if any(identifier in self.required for identifier in bad_mappings):
- raise ImpossibleSituation()
+ bad_required_mappings: list[str] = []
- for identifier in bad_mappings:
- if identifier in self.required:
- raise ImpossibleSituation()
+ for identifier in self.required:
+ if identifier in bad_mappings or identifier not in choices:
+ bad_required_mappings.append(identifier)
+
+ if len(bad_required_mappings) > 0:
+ raise ImpossibleSituation(frozenset(bad_required_mappings))
+ for identifier in bad_mappings:
if identifier in self.mappings:
choices.pop(identifier, None)