diff --git a/CHANGELOG.md b/CHANGELOG.md index 4290190..a685a05 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [2.0.2] - 2026-05-14 + ### Fixed -- Fixed EBA-DEC-002 false positives on integer-typed metrics that use the `pure` unit. `Fact.metric` stores the metric QName in Clark notation (`{namespace}localname`), but `_build_metric_type_map()` was keyed on prefix notation (`eba_met:qXYZ`) taken from the module, so every lookup missed and the validator fell back to unit-based inference, flagging every `pure`-unit integer fact as a percentage. Added a `Fact.metric_qname` property that exposes the prefix-normalised QName and updated the decimals rules (EBA-DEC-001/002/003) to use it. Integer classification is now fully taxonomy-driven — the unit-based fallback in `check_integer_decimals_xml` has been removed. No backward-incompatible changes: `Fact.metric` is unchanged. +- Fixed EBA-DEC-002 false positives on integer-typed metrics that use the `pure` unit. `Fact.metric` stores the metric QName in Clark notation (`{namespace}localname`), but `_build_metric_type_map()` was keyed on prefix notation (`eba_met:qXYZ`) taken from the module, so every lookup missed and the validator fell back to unit-based inference, flagging every `pure`-unit integer fact (e.g. `qAZH`, `qCCG`, `qDGB`) as a percentage. Added a `Fact.metric_qname` property that exposes the prefix-normalised QName and updated the decimals rules (EBA-DEC-001/002/003) to use it. Integer classification is now fully taxonomy-driven — the unit-based fallback in `check_integer_decimals_xml` has been removed. No backward-incompatible changes: `Fact.metric` is unchanged (#111). + +### Security +- Updated `urllib3` and widened the `sphinx` constraint (`^7.4.7` → `>=7.4.7,<8.2`) to pull in patched releases addressing reported vulnerabilities (#112). ## [2.0.1] - 2026-03-25 @@ -174,7 +179,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Initial pre-release version -[Unreleased]: https://github.com/Meaningful-Data/xbridge/compare/v2.0.1...HEAD +[Unreleased]: https://github.com/Meaningful-Data/xbridge/compare/v2.0.2...HEAD +[2.0.2]: https://github.com/Meaningful-Data/xbridge/compare/v2.0.1...v2.0.2 [2.0.1]: https://github.com/Meaningful-Data/xbridge/compare/v2.0.0...v2.0.1 [2.0.0]: https://github.com/Meaningful-Data/xbridge/compare/v1.5.2...v2.0.0 [1.5.2]: https://github.com/Meaningful-Data/xbridge/compare/v1.5.1...v1.5.2 diff --git a/pyproject.toml b/pyproject.toml index 6c50d0d..ec0064d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "eba-xbridge" -version = "2.0.1" +version = "2.0.2" description = "XBRL-XML to XBRL-CSV converter for EBA Taxonomy (version 4.2)" license = 'Apache 2.0' readme = "README.rst" diff --git a/src/xbridge/__init__.py b/src/xbridge/__init__.py index d69d36d..b4a3f8f 100644 --- a/src/xbridge/__init__.py +++ b/src/xbridge/__init__.py @@ -2,4 +2,4 @@ Init file for eba-xbridge library """ -__version__ = "2.0.1" +__version__ = "2.0.2" diff --git a/tests/test_eba_decimals.py b/tests/test_eba_decimals.py index 0cafc65..1b00851 100644 --- a/tests/test_eba_decimals.py +++ b/tests/test_eba_decimals.py @@ -585,9 +585,7 @@ def test_missing_params_no_findings(self) -> None: # Pillar 3 CODIS module has examples of all four metric types, and the # fixture is small enough to load quickly. -_PILLAR3_CODIS_SCHEMA = ( - "http://www.eba.europa.eu/eu/fr/xbrl/crr/fws/pillar3/4.1/mod/codis.xsd" -) +_PILLAR3_CODIS_SCHEMA = "http://www.eba.europa.eu/eu/fr/xbrl/crr/fws/pillar3/4.1/mod/codis.xsd" # Metrics picked from src/xbridge/modules/codis_pillar3_4.1.json _CODIS_MONETARY_METRIC = "qHNJ" @@ -611,12 +609,9 @@ def _xbrl_with_module(body: str, prefix: str = "eba_met") -> bytes: 'xmlns:find="http://www.eurofiling.info/xbrl/ext/filing-indicators" ' f'xmlns:{prefix}="http://www.eba.europa.eu/xbrl/crr/dict/met"' ) - schema_ref = ( - f'' - ) + schema_ref = f'' return ( - f'' - f'{schema_ref}{body}' + f'{schema_ref}{body}' ).encode() @@ -734,9 +729,7 @@ def _parse(self, xml_bytes: bytes): def test_metric_raw_is_clark_notation(self) -> None: """Backwards compatibility: ``Fact.metric`` stays in Clark notation.""" - xml = _xbrl( - _unit("u1", "xbrli:pure") + _context() + _fact(metric="eba_met:mi1") - ) + xml = _xbrl(_unit("u1", "xbrli:pure") + _context() + _fact(metric="eba_met:mi1")) facts = self._parse(xml) assert len(facts) == 1 assert facts[0].metric is not None @@ -745,17 +738,13 @@ def test_metric_raw_is_clark_notation(self) -> None: def test_metric_qname_is_prefix_form(self) -> None: """``Fact.metric_qname`` returns the EBA prefix form.""" - xml = _xbrl( - _unit("u1", "xbrli:pure") + _context() + _fact(metric="eba_met:mi1") - ) + xml = _xbrl(_unit("u1", "xbrli:pure") + _context() + _fact(metric="eba_met:mi1")) facts = self._parse(xml) assert facts[0].metric_qname == "eba_met:mi1" def test_metric_qname_cached(self) -> None: """Repeated access uses the cache, not re-parses the nsmap each time.""" - xml = _xbrl( - _unit("u1", "xbrli:pure") + _context() + _fact(metric="eba_met:mi1") - ) + xml = _xbrl(_unit("u1", "xbrli:pure") + _context() + _fact(metric="eba_met:mi1")) facts = self._parse(xml) first = facts[0].metric_qname second = facts[0].metric_qname