cbpr-usage-rules 0.3.0__tar.gz → 0.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/CHANGELOG.md +8 -0
  2. {cbpr_usage_rules-0.3.0/src/cbpr_usage_rules.egg-info → cbpr_usage_rules-0.4.0}/PKG-INFO +4 -2
  3. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/README.md +3 -1
  4. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/__init__.py +1 -1
  5. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/cli.py +8 -2
  6. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/engine.py +10 -3
  7. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0/src/cbpr_usage_rules.egg-info}/PKG-INFO +4 -2
  8. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/LICENSE +0 -0
  9. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/MANIFEST.in +0 -0
  10. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/pyproject.toml +0 -0
  11. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/setup.cfg +0 -0
  12. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2025/camt.052.max.xml +0 -0
  13. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2025/camt.052.min.xml +0 -0
  14. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2025/camt.054.max.xml +0 -0
  15. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2025/camt.054.min.xml +0 -0
  16. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2025/pacs.002.max.xml +0 -0
  17. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2025/pacs.002.min.xml +0 -0
  18. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2025/pacs.004.max.xml +0 -0
  19. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2025/pacs.004.min.xml +0 -0
  20. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2025/pacs.008.max.xml +0 -0
  21. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2025/pacs.008.min.xml +0 -0
  22. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2025/pacs.008_stp.max.xml +0 -0
  23. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2025/pacs.008_stp.min.xml +0 -0
  24. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2025/pacs.009.max.xml +0 -0
  25. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2025/pacs.009.min.xml +0 -0
  26. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2025/pacs.009_adv.max.xml +0 -0
  27. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2025/pacs.009_adv.min.xml +0 -0
  28. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2025/pacs.009_cov.max.xml +0 -0
  29. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2025/pacs.009_cov.min.xml +0 -0
  30. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2025/pain.001.max.xml +0 -0
  31. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2025/pain.001.min.xml +0 -0
  32. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2026/camt.052.max.xml +0 -0
  33. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2026/camt.052.min.xml +0 -0
  34. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2026/camt.054.max.xml +0 -0
  35. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2026/camt.054.min.xml +0 -0
  36. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2026/pacs.002.max.xml +0 -0
  37. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2026/pacs.002.min.xml +0 -0
  38. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2026/pacs.004.max.xml +0 -0
  39. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2026/pacs.004.min.xml +0 -0
  40. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2026/pacs.008.max.xml +0 -0
  41. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2026/pacs.008.min.xml +0 -0
  42. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2026/pacs.008_stp.max.xml +0 -0
  43. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2026/pacs.008_stp.min.xml +0 -0
  44. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2026/pacs.009.max.xml +0 -0
  45. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2026/pacs.009.min.xml +0 -0
  46. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2026/pacs.009_adv.max.xml +0 -0
  47. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2026/pacs.009_adv.min.xml +0 -0
  48. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2026/pacs.009_cov.max.xml +0 -0
  49. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2026/pacs.009_cov.min.xml +0 -0
  50. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2026/pain.001.max.xml +0 -0
  51. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/examples/y2026/pain.001.min.xml +0 -0
  52. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/helpers.py +0 -0
  53. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/loader.py +0 -0
  54. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/message.py +0 -0
  55. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/models.py +0 -0
  56. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/py.typed +0 -0
  57. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/reference/__init__.py +0 -0
  58. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/reference/countries.py +0 -0
  59. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/reference/currencies.py +0 -0
  60. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/registry.py +0 -0
  61. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/rules/__init__.py +0 -0
  62. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/rules/y2025/__init__.py +0 -0
  63. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/rules/y2025/camt_052.py +0 -0
  64. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/rules/y2025/camt_054.py +0 -0
  65. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/rules/y2025/pacs_002.py +0 -0
  66. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/rules/y2025/pacs_004.py +0 -0
  67. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/rules/y2025/pacs_008.py +0 -0
  68. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/rules/y2025/pacs_008_stp.py +0 -0
  69. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/rules/y2025/pacs_009.py +0 -0
  70. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/rules/y2025/pacs_009_adv.py +0 -0
  71. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/rules/y2025/pacs_009_cov.py +0 -0
  72. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/rules/y2025/pain_001.py +0 -0
  73. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/rules/y2026/__init__.py +0 -0
  74. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/rules/y2026/camt_052.py +0 -0
  75. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/rules/y2026/camt_054.py +0 -0
  76. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/rules/y2026/pacs_002.py +0 -0
  77. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/rules/y2026/pacs_004.py +0 -0
  78. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/rules/y2026/pacs_008.py +0 -0
  79. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/rules/y2026/pacs_008_stp.py +0 -0
  80. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/rules/y2026/pacs_009.py +0 -0
  81. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/rules/y2026/pacs_009_adv.py +0 -0
  82. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/rules/y2026/pacs_009_cov.py +0 -0
  83. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/rules/y2026/pain_001.py +0 -0
  84. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/schema.py +0 -0
  85. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/validators/__init__.py +0 -0
  86. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/validators/bic.py +0 -0
  87. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/validators/country.py +0 -0
  88. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/validators/currency.py +0 -0
  89. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/validators/iban.py +0 -0
  90. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_rules/validators/lei.py +0 -0
  91. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_usage_rules.egg-info/SOURCES.txt +0 -0
  92. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_usage_rules.egg-info/dependency_links.txt +0 -0
  93. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_usage_rules.egg-info/entry_points.txt +0 -0
  94. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_usage_rules.egg-info/requires.txt +0 -0
  95. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/src/cbpr_usage_rules.egg-info/top_level.txt +0 -0
  96. {cbpr_usage_rules-0.3.0 → cbpr_usage_rules-0.4.0}/tests/test_examples.py +0 -0
@@ -4,6 +4,14 @@ All notable changes to this project are documented here. The format is based on
4
4
  [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and this project adheres
5
5
  to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [0.4.0]
8
+
9
+ ### Added
10
+ - List only the **enforceable** rules for a year + message type:
11
+ `list_rules(year, msgtype, enforced_only=True)` in the API and
12
+ `cbpr-validate --enforced --year … --type …` on the CLI (advisory rules omitted;
13
+ composes with `--json`).
14
+
7
15
  ## [0.3.0]
8
16
 
9
17
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cbpr-usage-rules
3
- Version: 0.3.0
3
+ Version: 0.4.0
4
4
  Summary: Validate ISO 20022 CBPR+ XML messages against SWIFT usage (business) rules.
5
5
  Author: Pete Houghton
6
6
  License: MIT License
@@ -258,11 +258,13 @@ matching is by local name, so namespace prefixes never matter.
258
258
  ```python
259
259
  cbpr_rules.available(2025) # -> ['camt.052', 'pacs.008', ...]
260
260
  cbpr_rules.list_rules(2025, "pacs.008") # -> [{rule_number, name, description, severity, enforced}, ...]
261
+ cbpr_rules.list_rules(2025, "pacs.008", enforced_only=True) # only the enforceable rules
261
262
  ```
262
263
 
263
264
  ```bash
264
265
  cbpr-validate --year 2025 --list-types
265
- cbpr-validate --year 2025 --type pacs.008 --list
266
+ cbpr-validate --year 2025 --type pacs.008 --list # all rules
267
+ cbpr-validate --year 2025 --type pacs.008 --enforced # enforceable rules only
266
268
  ```
267
269
 
268
270
  ### Algorithmic field validation
@@ -203,11 +203,13 @@ matching is by local name, so namespace prefixes never matter.
203
203
  ```python
204
204
  cbpr_rules.available(2025) # -> ['camt.052', 'pacs.008', ...]
205
205
  cbpr_rules.list_rules(2025, "pacs.008") # -> [{rule_number, name, description, severity, enforced}, ...]
206
+ cbpr_rules.list_rules(2025, "pacs.008", enforced_only=True) # only the enforceable rules
206
207
  ```
207
208
 
208
209
  ```bash
209
210
  cbpr-validate --year 2025 --list-types
210
- cbpr-validate --year 2025 --type pacs.008 --list
211
+ cbpr-validate --year 2025 --type pacs.008 --list # all rules
212
+ cbpr-validate --year 2025 --type pacs.008 --enforced # enforceable rules only
211
213
  ```
212
214
 
213
215
  ### Algorithmic field validation
@@ -4,7 +4,7 @@ This package is AI generated. See the README for details and caveats.
4
4
  """
5
5
  from __future__ import annotations
6
6
 
7
- __version__ = "0.3.0"
7
+ __version__ = "0.4.0"
8
8
 
9
9
  from .models import Rule, Severity, Violation
10
10
  from .engine import (
@@ -77,6 +77,12 @@ def _build_parser() -> argparse.ArgumentParser:
77
77
  action="store_true",
78
78
  help="List the rules for --year/--type instead of validating.",
79
79
  )
80
+ p.add_argument(
81
+ "--enforced",
82
+ action="store_true",
83
+ help="List only the enforceable (mechanically-checked) rules for --year/--type; "
84
+ "advisory rules are omitted. Implies --list.",
85
+ )
80
86
  p.add_argument(
81
87
  "--list-types", action="store_true", help="List message types available for --year."
82
88
  )
@@ -216,11 +222,11 @@ def main(argv: Optional[List[str]] = None) -> int:
216
222
  return 2
217
223
  return 0
218
224
 
219
- if args.list:
225
+ if args.list or args.enforced:
220
226
  if args.year is None or args.msgtype is None:
221
227
  print("error: --year and --type are required for --list", file=sys.stderr)
222
228
  return 2
223
- rules = list_rules(args.year, args.msgtype)
229
+ rules = list_rules(args.year, args.msgtype, enforced_only=args.enforced)
224
230
  if args.json:
225
231
  print(json.dumps(rules, indent=2))
226
232
  else:
@@ -95,9 +95,16 @@ def validate_string(xml: str, year: int, msgtype: Optional[str] = None, xsd=None
95
95
  return _validate_tree(tree, year, msgtype, xsd)
96
96
 
97
97
 
98
- def list_rules(year: int, msgtype: str) -> List[dict]:
99
- """Return metadata for every rule registered for a (year, message type)."""
100
- return [r.to_dict() for r in load_rules(year, msgtype)]
98
+ def list_rules(year: int, msgtype: str, enforced_only: bool = False) -> List[dict]:
99
+ """Return metadata for the rules registered for a (year, message type).
100
+
101
+ With ``enforced_only=True`` only the enforceable (mechanically-checked) rules
102
+ are returned, omitting advisory/catalogue-only ones.
103
+ """
104
+ rules = [r.to_dict() for r in load_rules(year, msgtype)]
105
+ if enforced_only:
106
+ rules = [r for r in rules if r["enforced"]]
107
+ return rules
101
108
 
102
109
 
103
110
  def available(year: int) -> List[str]:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cbpr-usage-rules
3
- Version: 0.3.0
3
+ Version: 0.4.0
4
4
  Summary: Validate ISO 20022 CBPR+ XML messages against SWIFT usage (business) rules.
5
5
  Author: Pete Houghton
6
6
  License: MIT License
@@ -258,11 +258,13 @@ matching is by local name, so namespace prefixes never matter.
258
258
  ```python
259
259
  cbpr_rules.available(2025) # -> ['camt.052', 'pacs.008', ...]
260
260
  cbpr_rules.list_rules(2025, "pacs.008") # -> [{rule_number, name, description, severity, enforced}, ...]
261
+ cbpr_rules.list_rules(2025, "pacs.008", enforced_only=True) # only the enforceable rules
261
262
  ```
262
263
 
263
264
  ```bash
264
265
  cbpr-validate --year 2025 --list-types
265
- cbpr-validate --year 2025 --type pacs.008 --list
266
+ cbpr-validate --year 2025 --type pacs.008 --list # all rules
267
+ cbpr-validate --year 2025 --type pacs.008 --enforced # enforceable rules only
266
268
  ```
267
269
 
268
270
  ### Algorithmic field validation