cbpr-usage-rules 0.1.0__py3-none-any.whl

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 (48) hide show
  1. cbpr_rules/__init__.py +21 -0
  2. cbpr_rules/cli.py +176 -0
  3. cbpr_rules/engine.py +100 -0
  4. cbpr_rules/helpers.py +420 -0
  5. cbpr_rules/loader.py +77 -0
  6. cbpr_rules/message.py +170 -0
  7. cbpr_rules/models.py +83 -0
  8. cbpr_rules/py.typed +0 -0
  9. cbpr_rules/reference/__init__.py +9 -0
  10. cbpr_rules/reference/countries.py +28 -0
  11. cbpr_rules/reference/currencies.py +25 -0
  12. cbpr_rules/registry.py +107 -0
  13. cbpr_rules/rules/__init__.py +1 -0
  14. cbpr_rules/rules/y2025/__init__.py +1 -0
  15. cbpr_rules/rules/y2025/camt_052.py +224 -0
  16. cbpr_rules/rules/y2025/camt_054.py +176 -0
  17. cbpr_rules/rules/y2025/pacs_002.py +212 -0
  18. cbpr_rules/rules/y2025/pacs_004.py +831 -0
  19. cbpr_rules/rules/y2025/pacs_008.py +375 -0
  20. cbpr_rules/rules/y2025/pacs_008_stp.py +367 -0
  21. cbpr_rules/rules/y2025/pacs_009.py +273 -0
  22. cbpr_rules/rules/y2025/pacs_009_adv.py +255 -0
  23. cbpr_rules/rules/y2025/pacs_009_cov.py +358 -0
  24. cbpr_rules/rules/y2025/pain_001.py +306 -0
  25. cbpr_rules/rules/y2026/__init__.py +1 -0
  26. cbpr_rules/rules/y2026/camt_052.py +191 -0
  27. cbpr_rules/rules/y2026/camt_054.py +182 -0
  28. cbpr_rules/rules/y2026/pacs_002.py +208 -0
  29. cbpr_rules/rules/y2026/pacs_004.py +491 -0
  30. cbpr_rules/rules/y2026/pacs_008.py +377 -0
  31. cbpr_rules/rules/y2026/pacs_008_stp.py +369 -0
  32. cbpr_rules/rules/y2026/pacs_009.py +260 -0
  33. cbpr_rules/rules/y2026/pacs_009_adv.py +256 -0
  34. cbpr_rules/rules/y2026/pacs_009_cov.py +324 -0
  35. cbpr_rules/rules/y2026/pain_001.py +272 -0
  36. cbpr_rules/schema.py +97 -0
  37. cbpr_rules/validators/__init__.py +16 -0
  38. cbpr_rules/validators/bic.py +21 -0
  39. cbpr_rules/validators/country.py +11 -0
  40. cbpr_rules/validators/currency.py +11 -0
  41. cbpr_rules/validators/iban.py +26 -0
  42. cbpr_rules/validators/lei.py +17 -0
  43. cbpr_usage_rules-0.1.0.dist-info/METADATA +335 -0
  44. cbpr_usage_rules-0.1.0.dist-info/RECORD +48 -0
  45. cbpr_usage_rules-0.1.0.dist-info/WHEEL +5 -0
  46. cbpr_usage_rules-0.1.0.dist-info/entry_points.txt +2 -0
  47. cbpr_usage_rules-0.1.0.dist-info/licenses/LICENSE +21 -0
  48. cbpr_usage_rules-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,335 @@
1
+ Metadata-Version: 2.4
2
+ Name: cbpr-usage-rules
3
+ Version: 0.1.0
4
+ Summary: Validate ISO 20022 CBPR+ XML messages against SWIFT usage (business) rules.
5
+ Author: Pete Houghton
6
+ License: MIT License
7
+
8
+ Copyright (c) 2021 Peter Houghton
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
+ SOFTWARE.
27
+
28
+ Project-URL: Homepage, https://github.com/phoughton/iso20022-cbpr-ur
29
+ Project-URL: Repository, https://github.com/phoughton/iso20022-cbpr-ur
30
+ Project-URL: Issues, https://github.com/phoughton/iso20022-cbpr-ur/issues
31
+ Keywords: iso20022,cbpr,swift,payments,validation,pacs,pain,camt
32
+ Classifier: Development Status :: 3 - Alpha
33
+ Classifier: Intended Audience :: Financial and Insurance Industry
34
+ Classifier: Intended Audience :: Developers
35
+ Classifier: License :: OSI Approved :: MIT License
36
+ Classifier: Operating System :: OS Independent
37
+ Classifier: Programming Language :: Python :: 3
38
+ Classifier: Programming Language :: Python :: 3.9
39
+ Classifier: Programming Language :: Python :: 3.10
40
+ Classifier: Programming Language :: Python :: 3.11
41
+ Classifier: Programming Language :: Python :: 3.12
42
+ Classifier: Programming Language :: Python :: 3.13
43
+ Classifier: Topic :: Office/Business :: Financial
44
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
45
+ Requires-Python: >=3.9
46
+ Description-Content-Type: text/markdown
47
+ License-File: LICENSE
48
+ Requires-Dist: lxml>=4.9
49
+ Provides-Extra: dev
50
+ Requires-Dist: pytest>=7; extra == "dev"
51
+ Requires-Dist: openpyxl>=3.1; extra == "dev"
52
+ Requires-Dist: build; extra == "dev"
53
+ Requires-Dist: twine; extra == "dev"
54
+ Dynamic: license-file
55
+
56
+ # cbpr-usage-rules
57
+
58
+ Validate **ISO 20022 CBPR+** XML messages (the SWIFT cross-border payments
59
+ profile) against the **Usage / Business Rules** that apply on top of the XSD
60
+ schemas. These are the rules that the schema alone cannot express: cross-field
61
+ constraints, cross-schema checks between the Business Application Header (BAH)
62
+ and the message Document, conditional presence, code-list restrictions, and
63
+ field-format algorithms (IBAN, LEI, BIC, country, currency).
64
+
65
+ Rules are versioned per year (currently **2025** and **2026**) and organised by
66
+ message type (pacs.008, pacs.009 and its COV/ADV variants, pacs.002, pacs.004,
67
+ pain.001, camt.052, camt.054, and the STP variants).
68
+
69
+ > **This package is AI generated.** The rule logic was derived, with review,
70
+ > from the published CBPR+ usage-guideline spreadsheets. Treat it as an aid, not
71
+ > as a substitute for the official SWIFT specifications. Verify against the
72
+ > source material before relying on results in production.
73
+
74
+ ---
75
+
76
+ ## Installation
77
+
78
+ ```bash
79
+ pip install cbpr-usage-rules
80
+ ```
81
+
82
+ Requires Python 3.9+ and depends only on `lxml`.
83
+
84
+ ---
85
+
86
+ ## Quick start
87
+
88
+ ### As a library
89
+
90
+ ```python
91
+ import cbpr_rules
92
+
93
+ result = cbpr_rules.validate_file("payment.xml", year=2025)
94
+
95
+ if result["valid"]:
96
+ print("Compliant")
97
+ else:
98
+ for v in result["violations"]:
99
+ print(f"{v['rule_number']} line {v['line']} {v['xpath']}")
100
+ print(f" {v['description']}")
101
+ ```
102
+
103
+ `validate_string` is the same but takes XML text:
104
+
105
+ ```python
106
+ result = cbpr_rules.validate_string(xml_text, year=2026)
107
+ ```
108
+
109
+ ### From the command line
110
+
111
+ ```bash
112
+ # Human-readable (default). Exit code is non-zero if there are violations.
113
+ cbpr-validate payment.xml --year 2025
114
+
115
+ # JSON output
116
+ cbpr-validate payment.xml --year 2025 --json
117
+
118
+ # Read from stdin
119
+ cat payment.xml | cbpr-validate --year 2026
120
+
121
+ # Also list the advisory (non-enforced) rules in full
122
+ cbpr-validate payment.xml --year 2025 --advisory
123
+
124
+ # Additionally schema-validate against an XSD (repeatable, results shown separately)
125
+ cbpr-validate payment.xml --year 2025 --xsd pacs.008.001.08.xsd
126
+ ```
127
+
128
+ Each reported violation shows the rule, **why** this instance failed (`Problem:`),
129
+ the **offending XML** from your file (`Found:`), and its line + xpath (`At:`).
130
+ Advisory rules are summarised as a count by default; pass `--advisory` to list them.
131
+
132
+ ---
133
+
134
+ ## The result object
135
+
136
+ Both `validate_file` and `validate_string` return a dictionary:
137
+
138
+ ```python
139
+ {
140
+ "valid": False, # True only if there are no VIOLATION-severity findings
141
+ "message_type": "pacs.008", # the rule set that was applied
142
+ "detected_message_type": "pacs.008",# auto-detected from the Document namespace
143
+ "year": 2025,
144
+ "rules_evaluated": 84,
145
+ "violations": [
146
+ {
147
+ "rule_number": "pacs.008:R41", # unique within the message type
148
+ "name": "CBPR_Interbank_Settlement_Currency_FormalRule",
149
+ "description": "The codes XAU, XAG, XPD and XPT are not allowed ...",
150
+ "detail": "commodity currency 'XAU' not allowed", # why this instance was flagged
151
+ "found": "<IntrBkSttlmAmt Ccy=\"XAU\">1000.00</IntrBkSttlmAmt>", # the offending XML
152
+ "xpath": "/RequestPayload/Document/FIToFICstmrCdtTrf/CdtTrfTxInf/IntrBkSttlmAmt",
153
+ "line": 39, # 1-based line in the source XML
154
+ "severity": "violation"
155
+ }
156
+ ],
157
+ "advisory": [ # textual guidance that cannot be mechanically enforced
158
+ {"rule_number": "pacs.008:R4", "name": "...", "description": "..."}
159
+ ]
160
+ }
161
+ ```
162
+
163
+ Every violation carries the four required pieces of information: the **xpath**,
164
+ the **line number**, a **description**, and a **unique rule number**.
165
+
166
+ ---
167
+
168
+ ## Mid-level usage
169
+
170
+ ### Choosing the year
171
+
172
+ Pass `year=2025` or `year=2026`. Rule loading is per-year and lazy — only the
173
+ requested year's modules are imported. You can validate against more than one
174
+ year in the same process simply by calling with different `year` values.
175
+
176
+ ### Message type detection and variants
177
+
178
+ The message type is auto-detected from the `<Document>` namespace, so you
179
+ normally don't pass it. Business variants that share a base namespace — **STP**
180
+ (pacs.008/pacs.009), **COV** and **ADV** (pacs.009) — cannot be told apart from
181
+ the XML alone, so select them explicitly when you want their stricter rule sets:
182
+
183
+ ```python
184
+ cbpr_rules.validate_file("cover.xml", year=2025, msgtype="pacs.009_cov")
185
+ ```
186
+
187
+ ```bash
188
+ cbpr-validate cover.xml --year 2025 --type pacs.009_cov
189
+ ```
190
+
191
+ ### Wrapper tags
192
+
193
+ Messages arrive inside different envelopes (`<RequestPayload>`, `<DataPDU>`,
194
+ SWIFT SAA wrappers, and so on). The validator locates the `AppHdr` and
195
+ `Document` elements wherever they sit in the tree and ignores the surrounding
196
+ wrapper, so the same input validates identically regardless of envelope. Element
197
+ matching is by local name, so namespace prefixes never matter.
198
+
199
+ ### Severity
200
+
201
+ - `violation` — a usage rule is broken; this makes `valid` false.
202
+ - `info` — advisory guidance surfaced for awareness; it never fails validation
203
+ and appears in the separate `advisory` list (textual rules that cannot be
204
+ mechanically checked).
205
+
206
+ ---
207
+
208
+ ## In-depth usage
209
+
210
+ ### Discovering the rule set
211
+
212
+ ```python
213
+ cbpr_rules.available(2025) # -> ['camt.052', 'pacs.008', ...]
214
+ cbpr_rules.list_rules(2025, "pacs.008") # -> [{rule_number, name, description, severity, enforced}, ...]
215
+ ```
216
+
217
+ ```bash
218
+ cbpr-validate --year 2025 --list-types
219
+ cbpr-validate --year 2025 --type pacs.008 --list
220
+ ```
221
+
222
+ ### Algorithmic field validation
223
+
224
+ Beyond the published rules, the following formats are validated with their
225
+ standard algorithms wherever the corresponding fields appear:
226
+
227
+ | Field | Standard | Check |
228
+ |----------|---------------------|-----------------------------------------|
229
+ | IBAN | ISO 13616 | structure + mod-97 check digits |
230
+ | LEI | ISO 17442 | structure + ISO 7064 mod-97-10 check |
231
+ | BIC | ISO 9362 | 8/11-char structure + valid country |
232
+ | Country | ISO 3166-1 alpha-2 | membership |
233
+ | Currency | ISO 4217 | membership |
234
+
235
+ The reference code lists are vendored, so validation never makes a network call.
236
+
237
+ Some of these check-digit algorithms and reference code lists were derived from
238
+ Wikipedia (e.g. [IBAN](https://en.wikipedia.org/wiki/International_Bank_Account_Number),
239
+ [LEI](https://en.wikipedia.org/wiki/Legal_Entity_Identifier), and the
240
+ [ISO 3166 country codes](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes)).
241
+ Verify against the authoritative ISO/registry sources before relying on them in
242
+ production.
243
+
244
+ ### Optional XSD schema validation
245
+
246
+ You can additionally validate a message against one or more **XSD schemas** as a
247
+ *separate* second result set. XSD files are **not** bundled with the package —
248
+ supply your own path(s):
249
+
250
+ ```python
251
+ result = cbpr_rules.validate_file("payment.xml", year=2025, xsd="pacs.008.001.08.xsd")
252
+ # or several: xsd=["head.001.001.02.xsd", "pacs.008.001.08.xsd"]
253
+ ```
254
+
255
+ ```bash
256
+ cbpr-validate payment.xml --year 2025 --xsd pacs.008.001.08.xsd
257
+ ```
258
+
259
+ Each XSD is auto-matched by its `targetNamespace`: a message schema validates the
260
+ `Document`, a head.001 schema validates the `AppHdr`. When (and only when) an XSD
261
+ is supplied, the result gains a separate top-level `xsd` block, and the CLI prints
262
+ a distinct **XSD SCHEMA VALIDATION** section:
263
+
264
+ ```python
265
+ "xsd": {
266
+ "checked": True,
267
+ "schema_valid": False, # all supplied schemas passed?
268
+ "schemas": [
269
+ {
270
+ "file": "pacs.008.001.08.xsd",
271
+ "target_namespace": "urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08",
272
+ "validated_element": "Document", # or "AppHdr" / "root"
273
+ "valid": False,
274
+ "errors": [{"message": "...", "line": 82, "xpath": "/Document/.../CdtrAgt"}]
275
+ }
276
+ ]
277
+ }
278
+ ```
279
+
280
+ Usage-rule results and schema results stay separate: the top-level `valid` reflects
281
+ only the usage rules, while schema validity is `xsd.schema_valid`. The **CLI exit
282
+ code is non-zero if either** the usage rules or the schema fail. With no `--xsd`,
283
+ nothing about XSD appears in the output.
284
+
285
+ ### Handling errors
286
+
287
+ `validate_file` / `validate_string` raise `cbpr_rules.engine.ValidationError`
288
+ for unparseable XML or when the message type cannot be determined and was not
289
+ supplied. The CLI turns these into a message on stderr and exit code 2.
290
+
291
+ ### CLI exit codes
292
+
293
+ | Code | Meaning |
294
+ |------|----------------------------------|
295
+ | 0 | Valid (no violations) |
296
+ | 1 | Invalid (one or more violations) |
297
+ | 2 | Usage error / could not validate |
298
+
299
+ ---
300
+
301
+ ## How the rules are organised
302
+
303
+ Each `(year, message type)` has a hand-authored Python module under
304
+ `cbpr_rules/rules/y<year>/`. Rules are built from a small library of reusable
305
+ combinators (presence, conditional presence, mutual exclusion, value matching,
306
+ length, code lists, address grace-period rules) plus bespoke functions for
307
+ cross-field and cross-schema logic. The XSD files in the source material are
308
+ informational only and are not reimplemented here.
309
+
310
+ ### Enforced vs advisory
311
+
312
+ Every published rule is registered. A rule is **enforced** (can produce a
313
+ violation) when it can be checked deterministically from the message alone —
314
+ this includes the formal pseudo-code rules and the mechanizable textual rules,
315
+ such as:
316
+
317
+ - header ↔ message consistency (`MsgDefIdr` matches the Document definition;
318
+ `BizMsgIdr` carries the GroupHeader `MsgId`);
319
+ - no structured Postal Address value duplicated in an `AddressLine`;
320
+ - `AnyBIC` present ⇒ `Name`/`PostalAddress` not allowed;
321
+ - Structured Remittance ≤ 9,000 characters;
322
+ - charge rules where instructed and settlement amounts share a currency and
323
+ differ, and amount-total-equals-sum checks.
324
+
325
+ A rule stays **advisory** (`severity: info`, surfaced as guidance, never failing
326
+ validation) when it cannot be verified from the message in isolation — for
327
+ example anything that refers to a *related or underlying message* not present
328
+ (`Original_*`, related-BAH, COV/ADV UETR/E2E), depends on the SWIFT network or a
329
+ jurisdiction, or expresses a recommendation / bilaterally-agreed practice.
330
+ Checks are deliberately **conservative**: each skips when its inputs are absent
331
+ or ambiguous, so a compliant message is never failed spuriously.
332
+
333
+ ## Licence
334
+
335
+ MIT — see [LICENSE](LICENSE).
@@ -0,0 +1,48 @@
1
+ cbpr_rules/__init__.py,sha256=k42ZYh_EMU18nxOPRFJNCmnY71F7iGj7gGxxl_2tTxc,493
2
+ cbpr_rules/cli.py,sha256=okRp2YWvp0HH6O1-5FgHvqwC4c7paJNnjIMejdoPw-s,6510
3
+ cbpr_rules/engine.py,sha256=a_9eVKVg_hUmbyGl9oORv2Bzo1HnjpODRAgLUzAPOf0,3411
4
+ cbpr_rules/helpers.py,sha256=myLyRQU4aHbo777y3waW9vL5APWw52VrrkECwpx4QL0,14958
5
+ cbpr_rules/loader.py,sha256=CVEjcWDdlDS5LAHRVQqRqIpCjl3XsO8ons8_T2oWFN4,2468
6
+ cbpr_rules/message.py,sha256=4Xxn5mp33SrlqAYYG-K9I7Fb3QfMhpW1sJepltcuqjY,6488
7
+ cbpr_rules/models.py,sha256=AMPhncnlHHn1ehBKxnfaGSfzAxD0jmkaC_AhAPKu8Aw,2372
8
+ cbpr_rules/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ cbpr_rules/registry.py,sha256=fafVr3gsSiCucp8AqSe2LjC3zaNfvmaK3pH9Vlh_eoA,3660
10
+ cbpr_rules/schema.py,sha256=aCEP7ECSUvVEcVhacl-N78S23SxFdpWGBKCbC0MDjNc,3455
11
+ cbpr_rules/reference/__init__.py,sha256=pqWAN-iWWv-5oNM1mtaWcRvn9hnBIGxkSYm8C6bh7ck,297
12
+ cbpr_rules/reference/countries.py,sha256=U519poQS49Js_ZJBT_e9xC2DyrSPZ74s1Lv0T-h3_O8,1802
13
+ cbpr_rules/reference/currencies.py,sha256=nO6BueDRwc9J1H4dvsZJkFArPzjcO8dfStRgz-7BVh8,1513
14
+ cbpr_rules/rules/__init__.py,sha256=oDId4pgbOQbNRtfEvTY0tZpCPBoXpADWktpwMDNkT1g,82
15
+ cbpr_rules/rules/y2025/__init__.py,sha256=-S2vcoTEWb3HPdtrDUQ7z8W2jt2oCbVgLoQdWlErUQg,32
16
+ cbpr_rules/rules/y2025/camt_052.py,sha256=Tpu0voEq0b_LG_nHWEkYU2NkVL3pRmRff_ZDPd3eVkk,11050
17
+ cbpr_rules/rules/y2025/camt_054.py,sha256=MQv7_7yuCKmLBgTxnMJgwlWGca7-xbz4yzI_yz36Gg0,9312
18
+ cbpr_rules/rules/y2025/pacs_002.py,sha256=IEfbijL5tHagkujR9rj5CzgLaeOxK8Et1Y1R1aCxX-s,10585
19
+ cbpr_rules/rules/y2025/pacs_004.py,sha256=E1fRPKL56N2ybbu1cP3ZUSB6lxyAzSqs4MgyD-Q2w14,59465
20
+ cbpr_rules/rules/y2025/pacs_008.py,sha256=zvfigewkZ2EMlB_CspthcTiF9f18qqGWKW2T_Q-rhsM,18189
21
+ cbpr_rules/rules/y2025/pacs_008_stp.py,sha256=zellRcGmTB_3RiLkagGAppWlt4kzczTbEXJJSLJ5uZk,18457
22
+ cbpr_rules/rules/y2025/pacs_009.py,sha256=lHNX9xqLAP1B-nTEs-C9KH3jMuSib7nYM3zx67jxR80,13387
23
+ cbpr_rules/rules/y2025/pacs_009_adv.py,sha256=swH2pKEdFaDqiC7hcoPFnIucFXeK5Yojj1ca-n0zumg,12114
24
+ cbpr_rules/rules/y2025/pacs_009_cov.py,sha256=9wNtaIz2K6yz32m8QSr1zpbvr6wQpxIj4eT3C1uX_4U,18643
25
+ cbpr_rules/rules/y2025/pain_001.py,sha256=kY0i1vl31pDyjLnS7xftnaejBejNUowVF2wXVfSxNyY,15756
26
+ cbpr_rules/rules/y2026/__init__.py,sha256=l13kGUN2HeD7P4RELOPEzDpLjzdvWESKAXkAUhPSwHw,32
27
+ cbpr_rules/rules/y2026/camt_052.py,sha256=0wp_7eIhFJYJJKGGCKB_hiCqnL4R9A4NWHT5933S9FM,8707
28
+ cbpr_rules/rules/y2026/camt_054.py,sha256=RL0Sq1xYA6OpTF3kkLw11IK5KrVurIobZgNCTd-VYvg,8658
29
+ cbpr_rules/rules/y2026/pacs_002.py,sha256=kabK9vfSYLH6-Mod7Txj3vcqoMzP5IFPTyjPaFNWZu8,9814
30
+ cbpr_rules/rules/y2026/pacs_004.py,sha256=vbwKSEKjTs61UWh25G-w6NFU62BDDBbKvgMGHaw6VDc,25246
31
+ cbpr_rules/rules/y2026/pacs_008.py,sha256=VWnfD1LzsrzIeEfIjmm8b6Sruw0at4iucmj9CNrYy5Q,20963
32
+ cbpr_rules/rules/y2026/pacs_008_stp.py,sha256=CWkmCOgmzU4Avz7qt5is1n5JG3kooK4u_X8YAJZ964k,18514
33
+ cbpr_rules/rules/y2026/pacs_009.py,sha256=1ZeyP9K7Ei2U2mDJ_evutxMhLpeD-QQ9XeqMlsWBd34,11646
34
+ cbpr_rules/rules/y2026/pacs_009_adv.py,sha256=wGMI0oYPxeWQi-CVNTx8ubW9Xuihlkd0zyxRTEYPt5s,11420
35
+ cbpr_rules/rules/y2026/pacs_009_cov.py,sha256=kOu9OGvKj6j1vZYEDIbt63eURrkR4doF7cPmm1G2dwA,16338
36
+ cbpr_rules/rules/y2026/pain_001.py,sha256=-nJDZQJ0N2WZhupfSIqAWBU-IRjbDyDezPhaAp944bE,11919
37
+ cbpr_rules/validators/__init__.py,sha256=8B-QAb7-TaRjYE2C_qxHFcmXKh416mfHBExolo0LWqs,403
38
+ cbpr_rules/validators/bic.py,sha256=RHsZ7rjyT1POFWShCUyzp2UVMBX81Hs67nSlKBSD9QA,656
39
+ cbpr_rules/validators/country.py,sha256=UkGmsKPZjcIIApvMvA_DmyzqNnPVh5BDOuoEyyzLaac,346
40
+ cbpr_rules/validators/currency.py,sha256=i6H4aBtFTz-zqDj6MRkEOgfs6yLlT32s3aBIPlnr-f8,316
41
+ cbpr_rules/validators/iban.py,sha256=ksA4Sr12hPVPqoBWYnYjHr-5YX77NyID8E9p-5lrR7I,900
42
+ cbpr_rules/validators/lei.py,sha256=MBekU14fjMbNO1JRvhjW3og--KBAogfnyulVur7LfJs,545
43
+ cbpr_usage_rules-0.1.0.dist-info/licenses/LICENSE,sha256=VAAd5Xxo-KD8zhuGVJNETiX0fZgHPpwMVjeKIGKcPnA,1071
44
+ cbpr_usage_rules-0.1.0.dist-info/METADATA,sha256=hZ_KIKCSi-bKONbtMcDUNASmo-WkQ5HMMxm93bUP__U,13071
45
+ cbpr_usage_rules-0.1.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
46
+ cbpr_usage_rules-0.1.0.dist-info/entry_points.txt,sha256=BJ7UqvDeLtS8rqpPh7-WLnpxrmpJiSQF-fVYLJdG7m4,54
47
+ cbpr_usage_rules-0.1.0.dist-info/top_level.txt,sha256=tz4sIzzVmkkJjZICUpzjK5XRcz45Y1_IFRH60Jx7YnY,11
48
+ cbpr_usage_rules-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (82.0.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ cbpr-validate = cbpr_rules.cli:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2021 Peter Houghton
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ cbpr_rules