sort4circ-dpp 1.3.1__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 (204) hide show
  1. sort4circ_dpp-1.3.1/.dockerignore +133 -0
  2. sort4circ_dpp-1.3.1/.editorconfig +17 -0
  3. sort4circ_dpp-1.3.1/.gitattributes +1 -0
  4. sort4circ_dpp-1.3.1/.github/CODEOWNERS +20 -0
  5. sort4circ_dpp-1.3.1/.github/ISSUE_TEMPLATE/bug_report.yml +65 -0
  6. sort4circ_dpp-1.3.1/.github/ISSUE_TEMPLATE/spec_question.yml +69 -0
  7. sort4circ_dpp-1.3.1/.github/PULL_REQUEST_TEMPLATE.md +23 -0
  8. sort4circ_dpp-1.3.1/.github/dependabot.yml +27 -0
  9. sort4circ_dpp-1.3.1/.github/workflows/ci.yml +255 -0
  10. sort4circ_dpp-1.3.1/.github/workflows/release.yml +116 -0
  11. sort4circ_dpp-1.3.1/.gitignore +29 -0
  12. sort4circ_dpp-1.3.1/CHANGELOG.md +393 -0
  13. sort4circ_dpp-1.3.1/CITATION.cff +54 -0
  14. sort4circ_dpp-1.3.1/CODE_OF_CONDUCT.md +103 -0
  15. sort4circ_dpp-1.3.1/CONTRIBUTING.md +170 -0
  16. sort4circ_dpp-1.3.1/LICENSE +202 -0
  17. sort4circ_dpp-1.3.1/LICENSE-DOCS +47 -0
  18. sort4circ_dpp-1.3.1/LICENSING.md +90 -0
  19. sort4circ_dpp-1.3.1/MANIFEST.in +203 -0
  20. sort4circ_dpp-1.3.1/MANIFEST.sha256 +200 -0
  21. sort4circ_dpp-1.3.1/Makefile +17 -0
  22. sort4circ_dpp-1.3.1/PKG-INFO +276 -0
  23. sort4circ_dpp-1.3.1/PUBLICATION_BOUNDARY.md +51 -0
  24. sort4circ_dpp-1.3.1/README.md +242 -0
  25. sort4circ_dpp-1.3.1/SECURITY.md +87 -0
  26. sort4circ_dpp-1.3.1/constraints-py311-py312-py313.txt +42 -0
  27. sort4circ_dpp-1.3.1/docker/Dockerfile +10 -0
  28. sort4circ_dpp-1.3.1/docker/compose.example.yml +32 -0
  29. sort4circ_dpp-1.3.1/docs/api.md +313 -0
  30. sort4circ_dpp-1.3.1/docs/architecture.md +130 -0
  31. sort4circ_dpp-1.3.1/docs/assets/eu-emblem.svg +36 -0
  32. sort4circ_dpp-1.3.1/docs/assets/sort4circ-hero-dark.svg +351 -0
  33. sort4circ_dpp-1.3.1/docs/benchmarks/README.md +238 -0
  34. sort4circ_dpp-1.3.1/docs/benchmarks/anchor-selftest.json +47 -0
  35. sort4circ_dpp-1.3.1/docs/benchmarks/anchor-targets.example.json +43 -0
  36. sort4circ_dpp-1.3.1/docs/benchmarks/loadtest-results.json +284 -0
  37. sort4circ_dpp-1.3.1/docs/carrier-binding.md +204 -0
  38. sort4circ_dpp-1.3.1/docs/concepts.md +207 -0
  39. sort4circ_dpp-1.3.1/docs/conformance.md +263 -0
  40. sort4circ_dpp-1.3.1/docs/customisation.md +145 -0
  41. sort4circ_dpp-1.3.1/docs/enterprise-integration.md +215 -0
  42. sort4circ_dpp-1.3.1/docs/first-dpp.md +299 -0
  43. sort4circ_dpp-1.3.1/docs/getting-started.md +215 -0
  44. sort4circ_dpp-1.3.1/docs/glossary.md +48 -0
  45. sort4circ_dpp-1.3.1/docs/governance.md +28 -0
  46. sort4circ_dpp-1.3.1/docs/identifiers.md +193 -0
  47. sort4circ_dpp-1.3.1/docs/index.md +99 -0
  48. sort4circ_dpp-1.3.1/docs/integrity.md +282 -0
  49. sort4circ_dpp-1.3.1/docs/interoperability.md +214 -0
  50. sort4circ_dpp-1.3.1/docs/lifecycle-events.md +209 -0
  51. sort4circ_dpp-1.3.1/docs/provenance.md +200 -0
  52. sort4circ_dpp-1.3.1/docs/public-release.md +24 -0
  53. sort4circ_dpp-1.3.1/docs/regulatory-context.md +78 -0
  54. sort4circ_dpp-1.3.1/docs/scalability.md +167 -0
  55. sort4circ_dpp-1.3.1/docs/security.md +228 -0
  56. sort4circ_dpp-1.3.1/docs/sorting-integration.md +277 -0
  57. sort4circ_dpp-1.3.1/docs/testing-methodology.md +11 -0
  58. sort4circ_dpp-1.3.1/docs/traceability.md +242 -0
  59. sort4circ_dpp-1.3.1/docs/validation.md +195 -0
  60. sort4circ_dpp-1.3.1/docs/versioning-and-migration.md +111 -0
  61. sort4circ_dpp-1.3.1/docs/vocabularies.md +174 -0
  62. sort4circ_dpp-1.3.1/examples/README.md +64 -0
  63. sort4circ_dpp-1.3.1/examples/fixtures/README.md +40 -0
  64. sort4circ_dpp-1.3.1/examples/fixtures/invalid-article-class-token.json +44 -0
  65. sort4circ_dpp-1.3.1/examples/fixtures/invalid-composition-above-one-hundred.json +44 -0
  66. sort4circ_dpp-1.3.1/examples/fixtures/invalid-confidence-without-scale.json +47 -0
  67. sort4circ_dpp-1.3.1/examples/fixtures/invalid-fibre-token.json +44 -0
  68. sort4circ_dpp-1.3.1/examples/fixtures/invalid-item-without-item-id.json +43 -0
  69. sort4circ_dpp-1.3.1/examples/fixtures/invalid-no-material-observation.json +23 -0
  70. sort4circ_dpp-1.3.1/examples/fixtures/invalid-observation-without-method.json +43 -0
  71. sort4circ_dpp-1.3.1/examples/fixtures/invalid-percentage-without-basis.json +43 -0
  72. sort4circ_dpp-1.3.1/examples/fixtures/invalid-timestamp-without-offset.json +44 -0
  73. sort4circ_dpp-1.3.1/examples/fixtures/invalid-unknown-carrying-a-value.json +44 -0
  74. sort4circ_dpp-1.3.1/examples/fixtures/valid-annex-g-garment.json +46 -0
  75. sort4circ_dpp-1.3.1/examples/fixtures/valid-minimum.json +43 -0
  76. sort4circ_dpp-1.3.1/examples/fixtures/valid-two-technologies-disagree.json +61 -0
  77. sort4circ_dpp-1.3.1/examples/fixtures/valid-uncharacterised-garment.json +31 -0
  78. sort4circ_dpp-1.3.1/examples/fixtures/xml/invalid-observation-without-method.xml +7 -0
  79. sort4circ_dpp-1.3.1/examples/fixtures/xml/valid-annex-g-garment.xml +28 -0
  80. sort4circ_dpp-1.3.1/examples/worked_example.py +44 -0
  81. sort4circ_dpp-1.3.1/public-release-policy.json +307 -0
  82. sort4circ_dpp-1.3.1/pyproject.toml +67 -0
  83. sort4circ_dpp-1.3.1/pytest.ini +6 -0
  84. sort4circ_dpp-1.3.1/setup.cfg +4 -0
  85. sort4circ_dpp-1.3.1/setup.py +50 -0
  86. sort4circ_dpp-1.3.1/spec/access-matrix.json +145 -0
  87. sort4circ_dpp-1.3.1/spec/governance/en18223-deviation-open-template.json +21 -0
  88. sort4circ_dpp-1.3.1/spec/governance/en18223-deviation.schema.json +70 -0
  89. sort4circ_dpp-1.3.1/spec/governance/environmental-selection-template.json +30 -0
  90. sort4circ_dpp-1.3.1/spec/governance/environmental-selection.schema.json +72 -0
  91. sort4circ_dpp-1.3.1/spec/mappings/README.md +46 -0
  92. sort4circ_dpp-1.3.1/spec/mappings/dpp-mapping-1.0.0.csv +125 -0
  93. sort4circ_dpp-1.3.1/spec/mappings/dpp-mapping-1.0.0.json +2370 -0
  94. sort4circ_dpp-1.3.1/spec/mappings/dpp-mapping-1.0.0.schema.json +93 -0
  95. sort4circ_dpp-1.3.1/spec/ontology/sort4circ-1.0.1.ttl +372 -0
  96. sort4circ_dpp-1.3.1/spec/openapi/dpp-api-v1.json +782 -0
  97. sort4circ_dpp-1.3.1/spec/queries/environmental-values-1.0.0.rq +2 -0
  98. sort4circ_dpp-1.3.1/spec/queries/expected-results-1.0.0.json +10 -0
  99. sort4circ_dpp-1.3.1/spec/queries/identity-resolution-1.0.0.rq +7 -0
  100. sort4circ_dpp-1.3.1/spec/queries/lifecycle-events-1.0.0.rq +2 -0
  101. sort4circ_dpp-1.3.1/spec/queries/material-divergence-1.0.0.rq +12 -0
  102. sort4circ_dpp-1.3.1/spec/queries/product-hierarchy-1.0.0.rq +2 -0
  103. sort4circ_dpp-1.3.1/spec/queries/sorting-results-1.0.0.rq +2 -0
  104. sort4circ_dpp-1.3.1/spec/reason-codes.json +232 -0
  105. sort4circ_dpp-1.3.1/spec/schemas/dpp-1.0.0.schema.json +288 -0
  106. sort4circ_dpp-1.3.1/spec/schemas/dpp-1.0.0.xsd +148 -0
  107. sort4circ_dpp-1.3.1/spec/vocabularies/article-class.json +93 -0
  108. sort4circ_dpp-1.3.1/spec/vocabularies/binding-status.json +33 -0
  109. sort4circ_dpp-1.3.1/spec/vocabularies/carrier-type.json +33 -0
  110. sort4circ_dpp-1.3.1/spec/vocabularies/colour-family.json +51 -0
  111. sort4circ_dpp-1.3.1/spec/vocabularies/component-type.json +75 -0
  112. sort4circ_dpp-1.3.1/spec/vocabularies/condition.json +45 -0
  113. sort4circ_dpp-1.3.1/spec/vocabularies/confidence-scale.json +21 -0
  114. sort4circ_dpp-1.3.1/spec/vocabularies/encoding-scheme.json +33 -0
  115. sort4circ_dpp-1.3.1/spec/vocabularies/event-type.json +87 -0
  116. sort4circ_dpp-1.3.1/spec/vocabularies/evidence-state.json +45 -0
  117. sort4circ_dpp-1.3.1/spec/vocabularies/fabric-construction.json +51 -0
  118. sort4circ_dpp-1.3.1/spec/vocabularies/fibre-type.json +194 -0
  119. sort4circ_dpp-1.3.1/spec/vocabularies/method.json +65 -0
  120. sort4circ_dpp-1.3.1/spec/vocabularies/passport-status.json +33 -0
  121. sort4circ_dpp-1.3.1/spec/vocabularies/percentage-basis.json +21 -0
  122. sort4circ_dpp-1.3.1/spec/vocabularies/sorting-category.json +69 -0
  123. sort4circ_dpp-1.3.1/spec/vocabularies/technical-flag.json +93 -0
  124. sort4circ_dpp-1.3.1/spec/vocabularies/value-status.json +39 -0
  125. sort4circ_dpp-1.3.1/src/sort4circ_dpp/__init__.py +30 -0
  126. sort4circ_dpp-1.3.1/src/sort4circ_dpp/_spec/access-matrix.json +145 -0
  127. sort4circ_dpp-1.3.1/src/sort4circ_dpp/_spec/reason-codes.json +232 -0
  128. sort4circ_dpp-1.3.1/src/sort4circ_dpp/_spec/schemas/dpp-1.0.0.schema.json +288 -0
  129. sort4circ_dpp-1.3.1/src/sort4circ_dpp/_spec/schemas/dpp-1.0.0.xsd +148 -0
  130. sort4circ_dpp-1.3.1/src/sort4circ_dpp/_spec/vocabularies/article-class.json +93 -0
  131. sort4circ_dpp-1.3.1/src/sort4circ_dpp/_spec/vocabularies/binding-status.json +33 -0
  132. sort4circ_dpp-1.3.1/src/sort4circ_dpp/_spec/vocabularies/carrier-type.json +33 -0
  133. sort4circ_dpp-1.3.1/src/sort4circ_dpp/_spec/vocabularies/colour-family.json +51 -0
  134. sort4circ_dpp-1.3.1/src/sort4circ_dpp/_spec/vocabularies/component-type.json +75 -0
  135. sort4circ_dpp-1.3.1/src/sort4circ_dpp/_spec/vocabularies/condition.json +45 -0
  136. sort4circ_dpp-1.3.1/src/sort4circ_dpp/_spec/vocabularies/confidence-scale.json +21 -0
  137. sort4circ_dpp-1.3.1/src/sort4circ_dpp/_spec/vocabularies/encoding-scheme.json +33 -0
  138. sort4circ_dpp-1.3.1/src/sort4circ_dpp/_spec/vocabularies/event-type.json +87 -0
  139. sort4circ_dpp-1.3.1/src/sort4circ_dpp/_spec/vocabularies/evidence-state.json +45 -0
  140. sort4circ_dpp-1.3.1/src/sort4circ_dpp/_spec/vocabularies/fabric-construction.json +51 -0
  141. sort4circ_dpp-1.3.1/src/sort4circ_dpp/_spec/vocabularies/fibre-type.json +194 -0
  142. sort4circ_dpp-1.3.1/src/sort4circ_dpp/_spec/vocabularies/method.json +65 -0
  143. sort4circ_dpp-1.3.1/src/sort4circ_dpp/_spec/vocabularies/passport-status.json +33 -0
  144. sort4circ_dpp-1.3.1/src/sort4circ_dpp/_spec/vocabularies/percentage-basis.json +21 -0
  145. sort4circ_dpp-1.3.1/src/sort4circ_dpp/_spec/vocabularies/sorting-category.json +69 -0
  146. sort4circ_dpp-1.3.1/src/sort4circ_dpp/_spec/vocabularies/technical-flag.json +93 -0
  147. sort4circ_dpp-1.3.1/src/sort4circ_dpp/_spec/vocabularies/value-status.json +39 -0
  148. sort4circ_dpp-1.3.1/src/sort4circ_dpp/access.py +210 -0
  149. sort4circ_dpp-1.3.1/src/sort4circ_dpp/api.py +435 -0
  150. sort4circ_dpp-1.3.1/src/sort4circ_dpp/auth.py +38 -0
  151. sort4circ_dpp-1.3.1/src/sort4circ_dpp/canonical.py +141 -0
  152. sort4circ_dpp-1.3.1/src/sort4circ_dpp/cli.py +41 -0
  153. sort4circ_dpp-1.3.1/src/sort4circ_dpp/config.py +76 -0
  154. sort4circ_dpp-1.3.1/src/sort4circ_dpp/evidence.py +137 -0
  155. sort4circ_dpp-1.3.1/src/sort4circ_dpp/exchange.py +286 -0
  156. sort4circ_dpp-1.3.1/src/sort4circ_dpp/gateway/__init__.py +5 -0
  157. sort4circ_dpp-1.3.1/src/sort4circ_dpp/gateway/readzone.py +89 -0
  158. sort4circ_dpp-1.3.1/src/sort4circ_dpp/governance.py +77 -0
  159. sort4circ_dpp-1.3.1/src/sort4circ_dpp/index.py +146 -0
  160. sort4circ_dpp-1.3.1/src/sort4circ_dpp/ledger/__init__.py +11 -0
  161. sort4circ_dpp-1.3.1/src/sort4circ_dpp/ledger/base.py +78 -0
  162. sort4circ_dpp-1.3.1/src/sort4circ_dpp/ledger/besu.py +136 -0
  163. sort4circ_dpp-1.3.1/src/sort4circ_dpp/ledger/memory.py +77 -0
  164. sort4circ_dpp-1.3.1/src/sort4circ_dpp/mapping.py +177 -0
  165. sort4circ_dpp-1.3.1/src/sort4circ_dpp/public_summary.py +53 -0
  166. sort4circ_dpp-1.3.1/src/sort4circ_dpp/py.typed +0 -0
  167. sort4circ_dpp-1.3.1/src/sort4circ_dpp/reasons.py +112 -0
  168. sort4circ_dpp-1.3.1/src/sort4circ_dpp/store.py +365 -0
  169. sort4circ_dpp-1.3.1/src/sort4circ_dpp/synthetic.py +154 -0
  170. sort4circ_dpp-1.3.1/src/sort4circ_dpp/validation.py +112 -0
  171. sort4circ_dpp-1.3.1/src/sort4circ_dpp/vocab.py +151 -0
  172. sort4circ_dpp-1.3.1/src/sort4circ_dpp.egg-info/SOURCES.txt +201 -0
  173. sort4circ_dpp-1.3.1/tests/conformance/__init__.py +0 -0
  174. sort4circ_dpp-1.3.1/tests/conformance/test_checklist.py +484 -0
  175. sort4circ_dpp-1.3.1/tests/conftest.py +71 -0
  176. sort4circ_dpp-1.3.1/tests/test_access.py +140 -0
  177. sort4circ_dpp-1.3.1/tests/test_api_contract.py +348 -0
  178. sort4circ_dpp-1.3.1/tests/test_besu.py +39 -0
  179. sort4circ_dpp-1.3.1/tests/test_canonical.py +169 -0
  180. sort4circ_dpp-1.3.1/tests/test_evidence.py +107 -0
  181. sort4circ_dpp-1.3.1/tests/test_exchange.py +161 -0
  182. sort4circ_dpp-1.3.1/tests/test_governance.py +100 -0
  183. sort4circ_dpp-1.3.1/tests/test_index_staleness.py +129 -0
  184. sort4circ_dpp-1.3.1/tests/test_ledger_contract.py +78 -0
  185. sort4circ_dpp-1.3.1/tests/test_licensing.py +83 -0
  186. sort4circ_dpp-1.3.1/tests/test_manifest.py +8 -0
  187. sort4circ_dpp-1.3.1/tests/test_mapping.py +359 -0
  188. sort4circ_dpp-1.3.1/tests/test_packaged_resources.py +73 -0
  189. sort4circ_dpp-1.3.1/tests/test_public_release.py +200 -0
  190. sort4circ_dpp-1.3.1/tests/test_public_summary.py +28 -0
  191. sort4circ_dpp-1.3.1/tests/test_readzone.py +85 -0
  192. sort4circ_dpp-1.3.1/tests/test_repository_alignment.py +40 -0
  193. sort4circ_dpp-1.3.1/tests/test_store.py +123 -0
  194. sort4circ_dpp-1.3.1/tests/test_synthetic.py +31 -0
  195. sort4circ_dpp-1.3.1/tests/test_validation.py +67 -0
  196. sort4circ_dpp-1.3.1/tests/test_vocab.py +62 -0
  197. sort4circ_dpp-1.3.1/tools/anchor_bench.py +39 -0
  198. sort4circ_dpp-1.3.1/tools/conformance_report.py +75 -0
  199. sort4circ_dpp-1.3.1/tools/gen_mapping_csv.py +52 -0
  200. sort4circ_dpp-1.3.1/tools/gen_openapi.py +50 -0
  201. sort4circ_dpp-1.3.1/tools/loadtest.py +65 -0
  202. sort4circ_dpp-1.3.1/tools/validate_fixtures.py +58 -0
  203. sort4circ_dpp-1.3.1/tools/verify_public_release.py +380 -0
  204. sort4circ_dpp-1.3.1/verify_files.py +22 -0
@@ -0,0 +1,133 @@
1
+ **
2
+ !docker
3
+ docker/**
4
+ !spec
5
+ spec/**
6
+ !spec/governance
7
+ spec/governance/**
8
+ !spec/mappings
9
+ spec/mappings/**
10
+ !spec/ontology
11
+ spec/ontology/**
12
+ !spec/openapi
13
+ spec/openapi/**
14
+ !spec/queries
15
+ spec/queries/**
16
+ !spec/schemas
17
+ spec/schemas/**
18
+ !spec/vocabularies
19
+ spec/vocabularies/**
20
+ !src
21
+ src/**
22
+ !src/sort4circ_dpp
23
+ src/sort4circ_dpp/**
24
+ !src/sort4circ_dpp/_spec
25
+ src/sort4circ_dpp/_spec/**
26
+ !src/sort4circ_dpp/_spec/schemas
27
+ src/sort4circ_dpp/_spec/schemas/**
28
+ !src/sort4circ_dpp/_spec/vocabularies
29
+ src/sort4circ_dpp/_spec/vocabularies/**
30
+ !src/sort4circ_dpp/gateway
31
+ src/sort4circ_dpp/gateway/**
32
+ !src/sort4circ_dpp/ledger
33
+ src/sort4circ_dpp/ledger/**
34
+ !tools
35
+ tools/**
36
+ !.dockerignore
37
+ !LICENSE
38
+ !LICENSE-DOCS
39
+ !LICENSING.md
40
+ !MANIFEST.in
41
+ !README.md
42
+ !docker/Dockerfile
43
+ !docker/compose.example.yml
44
+ !public-release-policy.json
45
+ !pyproject.toml
46
+ !setup.py
47
+ !spec/access-matrix.json
48
+ !spec/governance/en18223-deviation-open-template.json
49
+ !spec/governance/en18223-deviation.schema.json
50
+ !spec/governance/environmental-selection-template.json
51
+ !spec/governance/environmental-selection.schema.json
52
+ !spec/mappings/README.md
53
+ !spec/mappings/dpp-mapping-1.0.0.csv
54
+ !spec/mappings/dpp-mapping-1.0.0.json
55
+ !spec/mappings/dpp-mapping-1.0.0.schema.json
56
+ !spec/ontology/sort4circ-1.0.1.ttl
57
+ !spec/openapi/dpp-api-v1.json
58
+ !spec/queries/environmental-values-1.0.0.rq
59
+ !spec/queries/expected-results-1.0.0.json
60
+ !spec/queries/identity-resolution-1.0.0.rq
61
+ !spec/queries/lifecycle-events-1.0.0.rq
62
+ !spec/queries/material-divergence-1.0.0.rq
63
+ !spec/queries/product-hierarchy-1.0.0.rq
64
+ !spec/queries/sorting-results-1.0.0.rq
65
+ !spec/reason-codes.json
66
+ !spec/schemas/dpp-1.0.0.schema.json
67
+ !spec/schemas/dpp-1.0.0.xsd
68
+ !spec/vocabularies/article-class.json
69
+ !spec/vocabularies/binding-status.json
70
+ !spec/vocabularies/carrier-type.json
71
+ !spec/vocabularies/colour-family.json
72
+ !spec/vocabularies/component-type.json
73
+ !spec/vocabularies/condition.json
74
+ !spec/vocabularies/confidence-scale.json
75
+ !spec/vocabularies/encoding-scheme.json
76
+ !spec/vocabularies/event-type.json
77
+ !spec/vocabularies/evidence-state.json
78
+ !spec/vocabularies/fabric-construction.json
79
+ !spec/vocabularies/fibre-type.json
80
+ !spec/vocabularies/method.json
81
+ !spec/vocabularies/passport-status.json
82
+ !spec/vocabularies/percentage-basis.json
83
+ !spec/vocabularies/sorting-category.json
84
+ !spec/vocabularies/technical-flag.json
85
+ !spec/vocabularies/value-status.json
86
+ !src/sort4circ_dpp/__init__.py
87
+ !src/sort4circ_dpp/_spec/access-matrix.json
88
+ !src/sort4circ_dpp/_spec/reason-codes.json
89
+ !src/sort4circ_dpp/_spec/schemas/dpp-1.0.0.schema.json
90
+ !src/sort4circ_dpp/_spec/schemas/dpp-1.0.0.xsd
91
+ !src/sort4circ_dpp/_spec/vocabularies/article-class.json
92
+ !src/sort4circ_dpp/_spec/vocabularies/binding-status.json
93
+ !src/sort4circ_dpp/_spec/vocabularies/carrier-type.json
94
+ !src/sort4circ_dpp/_spec/vocabularies/colour-family.json
95
+ !src/sort4circ_dpp/_spec/vocabularies/component-type.json
96
+ !src/sort4circ_dpp/_spec/vocabularies/condition.json
97
+ !src/sort4circ_dpp/_spec/vocabularies/confidence-scale.json
98
+ !src/sort4circ_dpp/_spec/vocabularies/encoding-scheme.json
99
+ !src/sort4circ_dpp/_spec/vocabularies/event-type.json
100
+ !src/sort4circ_dpp/_spec/vocabularies/evidence-state.json
101
+ !src/sort4circ_dpp/_spec/vocabularies/fabric-construction.json
102
+ !src/sort4circ_dpp/_spec/vocabularies/fibre-type.json
103
+ !src/sort4circ_dpp/_spec/vocabularies/method.json
104
+ !src/sort4circ_dpp/_spec/vocabularies/passport-status.json
105
+ !src/sort4circ_dpp/_spec/vocabularies/percentage-basis.json
106
+ !src/sort4circ_dpp/_spec/vocabularies/sorting-category.json
107
+ !src/sort4circ_dpp/_spec/vocabularies/technical-flag.json
108
+ !src/sort4circ_dpp/_spec/vocabularies/value-status.json
109
+ !src/sort4circ_dpp/access.py
110
+ !src/sort4circ_dpp/api.py
111
+ !src/sort4circ_dpp/auth.py
112
+ !src/sort4circ_dpp/canonical.py
113
+ !src/sort4circ_dpp/cli.py
114
+ !src/sort4circ_dpp/config.py
115
+ !src/sort4circ_dpp/evidence.py
116
+ !src/sort4circ_dpp/exchange.py
117
+ !src/sort4circ_dpp/gateway/__init__.py
118
+ !src/sort4circ_dpp/gateway/readzone.py
119
+ !src/sort4circ_dpp/governance.py
120
+ !src/sort4circ_dpp/index.py
121
+ !src/sort4circ_dpp/ledger/__init__.py
122
+ !src/sort4circ_dpp/ledger/base.py
123
+ !src/sort4circ_dpp/ledger/besu.py
124
+ !src/sort4circ_dpp/ledger/memory.py
125
+ !src/sort4circ_dpp/mapping.py
126
+ !src/sort4circ_dpp/public_summary.py
127
+ !src/sort4circ_dpp/py.typed
128
+ !src/sort4circ_dpp/reasons.py
129
+ !src/sort4circ_dpp/store.py
130
+ !src/sort4circ_dpp/synthetic.py
131
+ !src/sort4circ_dpp/validation.py
132
+ !src/sort4circ_dpp/vocab.py
133
+ !tools/verify_public_release.py
@@ -0,0 +1,17 @@
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ end_of_line = lf
6
+ insert_final_newline = true
7
+ trim_trailing_whitespace = true
8
+ indent_style = space
9
+
10
+ [*.py]
11
+ indent_size = 4
12
+
13
+ [*.{json,yml,yaml,md,ttl}]
14
+ indent_size = 2
15
+
16
+ [Makefile]
17
+ indent_style = tab
@@ -0,0 +1 @@
1
+ * text=auto eol=lf
@@ -0,0 +1,20 @@
1
+ # Review ownership for this repository.
2
+ #
3
+ # GitHub requests a review from the owning team on any pull request touching a
4
+ # matching path. These entries only gate a merge once branch protection on the
5
+ # default branch requires review from code owners, which is a repository setting
6
+ # and not something this file can enable.
7
+ #
8
+ # The team must exist in the Constructor-Uni organisation and hold write access on
9
+ # this repository. GitHub ignores an entry naming a team that does not exist, or
10
+ # that lacks write access, without reporting an error.
11
+
12
+ * @Constructor-Uni/sort4circ-wp4
13
+
14
+ # Specification assets, the publication allowlist, the licence coverage map, and the
15
+ # workflows that build and publish releases. Later rules win in CODEOWNERS, so these
16
+ # are listed after the global rule to keep them authoritative for their paths.
17
+ spec/** @Constructor-Uni/sort4circ-wp4
18
+ public-release-policy.json @Constructor-Uni/sort4circ-wp4
19
+ LICENSING.md @Constructor-Uni/sort4circ-wp4
20
+ .github/workflows/** @Constructor-Uni/sort4circ-wp4
@@ -0,0 +1,65 @@
1
+ name: Non-sensitive bug report
2
+ description: Report a non-sensitive bug in the public DPP reference implementation.
3
+ labels:
4
+ - bug
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: 'Public GitHub issues are only for non-sensitive bugs and feature requests.
9
+
10
+ Do not post security vulnerabilities or suspected accidental project-data exposure here.
11
+
12
+ Use GitHub Private Vulnerability Reporting and follow SECURITY.md. If that option is
13
+
14
+ unavailable, keep the report private; do not use a public issue as a fallback.
15
+
16
+
17
+ Use independently synthetic reproductions only, including in private reports.
18
+
19
+ Do not submit real credentials, private configuration, partner data, project data,
20
+
21
+ pilot data or internal endpoints in payloads, attachments, screenshots, logs or comments.
22
+
23
+ Describe suspected exposure privately without reproducing the exposed material.
24
+
25
+
26
+ Synthetic example. Not SORT4CIRC project data.'
27
+ - type: textarea
28
+ id: expected
29
+ attributes:
30
+ label: What the specification requires
31
+ description: Name a public specification artefact, field, API route or reason code.
32
+ validations:
33
+ required: true
34
+ - type: textarea
35
+ id: actual
36
+ attributes:
37
+ label: What happens instead
38
+ validations:
39
+ required: true
40
+ - type: textarea
41
+ id: reproduce
42
+ attributes:
43
+ label: Smallest synthetic reproduction
44
+ description: Use fictional inputs only; never attach operational logs or private data.
45
+ render: shell
46
+ validations:
47
+ required: true
48
+ - type: input
49
+ id: version
50
+ attributes:
51
+ label: Public release version
52
+ description: Name a public release version; do not include private references or endpoints.
53
+ validations:
54
+ required: true
55
+ - type: checkboxes
56
+ id: public_synthetic_confirmation
57
+ attributes:
58
+ label: Public issue confirmation
59
+ options:
60
+ - label: This is a non-sensitive bug or feature request, not a security or suspected data-exposure
61
+ report.
62
+ required: true
63
+ - label: All reproduction material is synthetic and excludes real credentials, private configuration,
64
+ partner/project/pilot data and internal endpoints.
65
+ required: true
@@ -0,0 +1,69 @@
1
+ name: Specification bug or feature request
2
+ description: Report a non-sensitive public-profile defect or propose a feature.
3
+ labels:
4
+ - specification
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: 'Public GitHub issues are only for non-sensitive bugs and feature requests.
9
+
10
+ Do not post security vulnerabilities or suspected accidental project-data exposure here.
11
+
12
+ Use GitHub Private Vulnerability Reporting and follow SECURITY.md. If that option is
13
+
14
+ unavailable, keep the report private; do not use a public issue as a fallback.
15
+
16
+
17
+ Use independently synthetic reproductions only, including in private reports.
18
+
19
+ Do not submit real credentials, private configuration, partner data, project data,
20
+
21
+ pilot data or internal endpoints in payloads, attachments, screenshots, logs or comments.
22
+
23
+ Describe suspected exposure privately without reproducing the exposed material.
24
+
25
+
26
+ Synthetic example. Not SORT4CIRC project data.'
27
+ - type: dropdown
28
+ id: kind
29
+ attributes:
30
+ label: Kind
31
+ options:
32
+ - 'Bug: the documentation or rule is unclear'
33
+ - 'Bug: a public-profile rule cannot be implemented as written'
34
+ - 'Bug: an implemented rule has incorrect behaviour'
35
+ - 'Feature: a public-profile capability is missing'
36
+ - 'Feature: a new controlled value is needed'
37
+ validations:
38
+ required: true
39
+ - type: textarea
40
+ id: artefact
41
+ attributes:
42
+ label: Which artefact and clause
43
+ validations:
44
+ required: true
45
+ - type: textarea
46
+ id: consequence
47
+ attributes:
48
+ label: What breaks if it stays as it is
49
+ description: Give a concrete case with independently synthetic data only.
50
+ validations:
51
+ required: true
52
+ - type: textarea
53
+ id: migration
54
+ attributes:
55
+ label: What happens to records already written under the current rule
56
+ description: Describe migration with fictional records only; do not provide real datasets.
57
+ validations:
58
+ required: true
59
+ - type: checkboxes
60
+ id: public_synthetic_confirmation
61
+ attributes:
62
+ label: Public issue confirmation
63
+ options:
64
+ - label: This is a non-sensitive bug or feature request, not a security or suspected data-exposure
65
+ report.
66
+ required: true
67
+ - label: All reproduction material is synthetic and excludes real credentials, private configuration,
68
+ partner/project/pilot data and internal endpoints.
69
+ required: true
@@ -0,0 +1,23 @@
1
+ ## Public contribution only
2
+
3
+ Use this template only for non-sensitive changes. Security vulnerabilities and suspected accidental project-data exposure must not be posted in public issues or pull requests. Use GitHub Private Vulnerability Reporting and follow SECURITY.md.
4
+
5
+ All reproductions must be independently synthetic, including private reports. Do not submit real credentials, private configuration, partner data, project data, pilot data or internal endpoints in changes, attachments, screenshots, logs or comments. Describe suspected exposure privately without reproducing the exposed material.
6
+
7
+ ## Public-profile change
8
+
9
+ Describe the problem, resulting behaviour and any version/migration impact using synthetic examples only.
10
+
11
+ ## Validation
12
+
13
+ List the tests actually run. Confirm fixture, mapping/OpenAPI and release-policy checks where relevant. Do not attach raw operational output.
14
+
15
+ ## Publication boundary
16
+
17
+ - [ ] This pull request contains no security vulnerability report or suspected project-data exposure report.
18
+ - [ ] Reproductions and examples are independently synthetic.
19
+ - [ ] No real credentials, private configuration, partner data, project data, pilot data or internal endpoints are included.
20
+ - [ ] No personal data, private reviews, raw operational logs or historical evidence are attached.
21
+ - [ ] New public files were deliberately reviewed for the explicit allowlist.
22
+ - [ ] Claims describe public-profile conformance only.
23
+ - [ ] The component licences (Apache-2.0 software, CC BY 4.0 docs/spec) and third-party notices are respected; new public files have explicit coverage under LICENSING.md.
@@ -0,0 +1,27 @@
1
+ version: 2
2
+
3
+ updates:
4
+ # Runtime and development Python dependencies. Version bumps must keep the pinned
5
+ # constraints file in step: see constraints-py311-py312-py313.txt.
6
+ - package-ecosystem: pip
7
+ directory: /
8
+ schedule:
9
+ interval: weekly
10
+ open-pull-requests-limit: 5
11
+ labels:
12
+ - dependencies
13
+ commit-message:
14
+ prefix: "deps"
15
+
16
+ # Workflow actions are pinned to commit SHAs. Dependabot updates the SHA and the
17
+ # trailing version comment together, which keeps the pinning intact.
18
+ - package-ecosystem: github-actions
19
+ directory: /
20
+ schedule:
21
+ interval: weekly
22
+ open-pull-requests-limit: 5
23
+ labels:
24
+ - dependencies
25
+ - ci
26
+ commit-message:
27
+ prefix: "ci"
@@ -0,0 +1,255 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ test:
14
+ name: Test on Python ${{ matrix.python-version }}
15
+ runs-on: ubuntu-latest
16
+ strategy:
17
+ fail-fast: false
18
+ matrix:
19
+ python-version: ["3.11", "3.12", "3.13"]
20
+ steps:
21
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
22
+
23
+ - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
24
+ with:
25
+ python-version: ${{ matrix.python-version }}
26
+ cache: pip
27
+
28
+ - name: Install
29
+ run: python -m pip install -c constraints-py311-py312-py313.txt -e ".[dev]"
30
+
31
+ - name: Lint
32
+ run: ruff check src tests tools examples
33
+
34
+ - name: Test
35
+ run: python -m pytest -q
36
+
37
+ - name: Validate fixtures
38
+ run: python tools/validate_fixtures.py
39
+
40
+ - name: Worked example
41
+ run: python examples/worked_example.py
42
+
43
+ - name: Mapping CSV is up to date
44
+ run: python tools/gen_mapping_csv.py --check
45
+
46
+ - name: Public file policy
47
+ run: python tools/verify_public_release.py --files-only
48
+
49
+ - name: Public manifest
50
+ run: python verify_files.py
51
+
52
+ spec:
53
+ name: Specification artefacts
54
+ runs-on: ubuntu-latest
55
+ steps:
56
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
57
+
58
+ - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
59
+ with:
60
+ python-version: "3.12"
61
+ cache: pip
62
+
63
+ - name: Install
64
+ run: pip install -c constraints-py311-py312-py313.txt -e ".[dev]"
65
+
66
+ - name: Ontology parses without error
67
+ run: |
68
+ python - <<'PY'
69
+ from rdflib import Graph
70
+ g = Graph().parse("spec/ontology/sort4circ-1.0.1.ttl", format="turtle")
71
+ print(f"{len(g)} triples")
72
+ assert len(g) > 200, "the ontology lost content"
73
+ PY
74
+
75
+ - name: Every JSON artefact parses
76
+ run: |
77
+ python - <<'PY'
78
+ import json, pathlib
79
+ for path in sorted(pathlib.Path("spec").rglob("*.json")):
80
+ json.loads(path.read_text(encoding="utf-8"))
81
+ print("ok", path)
82
+ PY
83
+
84
+ - name: The OpenAPI contract is up to date
85
+ run: |
86
+ python tools/gen_openapi.py
87
+ git diff --exit-code spec/openapi/ || {
88
+ echo "::error::spec/openapi is stale. Run 'make openapi' and commit the result."
89
+ exit 1
90
+ }
91
+
92
+ conformance:
93
+ name: Conformance report
94
+ runs-on: ubuntu-latest
95
+ steps:
96
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
97
+ - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
98
+ with:
99
+ python-version: "3.12"
100
+ cache: pip
101
+ - run: pip install -c constraints-py311-py312-py313.txt -e ".[dev]"
102
+ - run: python tools/conformance_report.py --output conformance-report.json
103
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
104
+ with:
105
+ name: conformance-report
106
+ path: conformance-report.json
107
+ if-no-files-found: error
108
+
109
+ wheel-smoke:
110
+ name: Installed wheel smoke
111
+ runs-on: ubuntu-latest
112
+ steps:
113
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
114
+
115
+ - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
116
+ with:
117
+ python-version: "3.12"
118
+ cache: pip
119
+
120
+ - name: Build wheel outside the checkout
121
+ run: |
122
+ set -euo pipefail
123
+ mkdir -p "$RUNNER_TEMP/s4c-wheel"
124
+ mkdir -p "$RUNNER_TEMP/s4c-wheel-smoke"
125
+ python -m pip wheel . --no-deps --wheel-dir "$RUNNER_TEMP/s4c-wheel"
126
+
127
+ - name: Inspect packaged runtime resources
128
+ run: |
129
+ python - <<'PY'
130
+ import os
131
+ import pathlib
132
+ import zipfile
133
+
134
+ root = pathlib.Path.cwd()
135
+ wheel = next((pathlib.Path(os.environ["RUNNER_TEMP"]) / "s4c-wheel").glob("*.whl"))
136
+ expected = {
137
+ "access-matrix.json",
138
+ "reason-codes.json",
139
+ "schemas/dpp-1.0.0.schema.json",
140
+ "schemas/dpp-1.0.0.xsd",
141
+ *(path.relative_to(root / "spec").as_posix()
142
+ for path in (root / "spec" / "vocabularies").glob("*.json")),
143
+ }
144
+ with zipfile.ZipFile(wheel) as archive:
145
+ prefix = "sort4circ_dpp/_spec/"
146
+ actual = {
147
+ name.removeprefix(prefix)
148
+ for name in archive.namelist()
149
+ if name.startswith(prefix) and not name.endswith("/")
150
+ }
151
+ assert actual == expected, (sorted(actual), sorted(expected))
152
+ print(f"verified {len(actual)} runtime resources")
153
+ PY
154
+
155
+ - name: Install wheel in a clean environment
156
+ run: |
157
+ set -euo pipefail
158
+ python -m venv "$RUNNER_TEMP/s4c-wheel-venv"
159
+ "$RUNNER_TEMP/s4c-wheel-venv/bin/python" -m pip install \
160
+ -c "$GITHUB_WORKSPACE/constraints-py311-py312-py313.txt" \
161
+ "$(find "$RUNNER_TEMP/s4c-wheel" -name '*.whl' -print -quit)"
162
+
163
+ - name: Exercise installed wheel outside the checkout
164
+ env:
165
+ WHEEL_VENV: ${{ runner.temp }}/s4c-wheel-venv
166
+ working-directory: ${{ runner.temp }}/s4c-wheel-smoke
167
+ run: |
168
+ set -euo pipefail
169
+ test ! -e spec
170
+ "$WHEEL_VENV/bin/python" - <<'PY'
171
+ import asyncio
172
+ import os
173
+ import pathlib
174
+ import sys
175
+
176
+ import sort4circ_dpp
177
+ from fastapi import FastAPI
178
+ from sort4circ_dpp.api import create_app
179
+ from sort4circ_dpp.reasons import released_codes
180
+ from sort4circ_dpp.validation import schema, validate_schema
181
+ from sort4circ_dpp.vocab import load
182
+
183
+ origin = pathlib.Path(sort4circ_dpp.__file__).resolve()
184
+ prefix = pathlib.Path(sys.prefix).resolve()
185
+ assert origin.is_relative_to(prefix), (origin, prefix)
186
+ assert released_codes()
187
+ assert load("article-class").tokens
188
+ assert schema()["$schema"]
189
+ try:
190
+ validate_schema({})
191
+ except Exception:
192
+ pass
193
+ else:
194
+ raise AssertionError("an empty payload unexpectedly passed schema validation")
195
+
196
+ app = create_app()
197
+ assert isinstance(app, FastAPI)
198
+ messages = []
199
+
200
+ async def receive():
201
+ return {"type": "http.request", "body": b"", "more_body": False}
202
+
203
+ async def send(message):
204
+ messages.append(message)
205
+
206
+ scope = {
207
+ "type": "http",
208
+ "asgi": {"version": "3.0", "spec_version": "2.0"},
209
+ "method": "GET",
210
+ "path": "/health",
211
+ "raw_path": b"/health",
212
+ "query_string": b"",
213
+ "headers": [],
214
+ "http_version": "1.1",
215
+ "client": ("127.0.0.1", 1),
216
+ "server": ("test", 80),
217
+ "scheme": "http",
218
+ "root_path": "",
219
+ }
220
+
221
+ asyncio.run(app(scope, receive, send))
222
+ response = next(message for message in messages if message["type"] == "http.response.start")
223
+ assert response["status"] == 200
224
+ print("installed wheel smoke passed")
225
+ PY
226
+
227
+ - name: Clean temporary wheel resources
228
+ if: always()
229
+ run: |
230
+ rm -rf "$RUNNER_TEMP/s4c-wheel" \
231
+ "$RUNNER_TEMP/s4c-wheel-venv" \
232
+ "$RUNNER_TEMP/s4c-wheel-smoke"
233
+
234
+ package:
235
+ name: Public export and distributions
236
+ runs-on: ubuntu-latest
237
+ steps:
238
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
239
+ - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
240
+ with:
241
+ python-version: "3.12"
242
+ cache: pip
243
+ - run: python -m pip install -c constraints-py311-py312-py313.txt build
244
+ - name: Export only the allowlisted public files
245
+ run: python tools/verify_public_release.py --files-only --export ../public-profile-export
246
+ - name: Build the distributions from the export
247
+ run: python -m build ../public-profile-export --outdir ../public-profile-dist
248
+ - name: Verify the built distributions against the file policy
249
+ run: |
250
+ python - <<'PY'
251
+ from pathlib import Path
252
+ from tools.verify_public_release import verify_archive
253
+ for path in sorted(Path("../public-profile-dist").iterdir()):
254
+ print(path.name, verify_archive(path), "files verified")
255
+ PY