dcc 0.2.0

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 (336) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +16 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +16 -0
  5. data/.rubocop_todo.yml +10 -0
  6. data/CHANGELOG.adoc +54 -0
  7. data/CONTRIBUTING.adoc +64 -0
  8. data/Gemfile +25 -0
  9. data/LICENSE +21 -0
  10. data/README.adoc +69 -0
  11. data/Rakefile +13 -0
  12. data/dcc.gemspec +41 -0
  13. data/docs/cli-reference.adoc +67 -0
  14. data/docs/getting-started.adoc +117 -0
  15. data/docs/schema-versions.adoc +65 -0
  16. data/examples/build_minimal_dcc.rb +23 -0
  17. data/examples/convert_all_formats.rb +19 -0
  18. data/examples/parse_and_inspect.rb +19 -0
  19. data/examples/quantity_math_demo.rb +32 -0
  20. data/examples/validate_full.rb +27 -0
  21. data/exe/dcc +7 -0
  22. data/lib/dcc/base/administrative_data.rb +43 -0
  23. data/lib/dcc/base/byte_data.rb +36 -0
  24. data/lib/dcc/base/calibration_laboratory.rb +29 -0
  25. data/lib/dcc/base/comment.rb +23 -0
  26. data/lib/dcc/base/condition.rb +34 -0
  27. data/lib/dcc/base/contact.rb +38 -0
  28. data/lib/dcc/base/contact_not_strict.rb +38 -0
  29. data/lib/dcc/base/core_data.rb +44 -0
  30. data/lib/dcc/base/data.rb +42 -0
  31. data/lib/dcc/base/digital_calibration_certificate.rb +32 -0
  32. data/lib/dcc/base/equipment_class.rb +24 -0
  33. data/lib/dcc/base/formula.rb +33 -0
  34. data/lib/dcc/base/hash_type.rb +34 -0
  35. data/lib/dcc/base/identification.rb +27 -0
  36. data/lib/dcc/base/identifications.rb +27 -0
  37. data/lib/dcc/base/influence_condition.rb +16 -0
  38. data/lib/dcc/base/influence_condition_list.rb +40 -0
  39. data/lib/dcc/base/item.rb +38 -0
  40. data/lib/dcc/base/item_list.rb +38 -0
  41. data/lib/dcc/base/list.rb +44 -0
  42. data/lib/dcc/base/location.rb +36 -0
  43. data/lib/dcc/base/measurement_meta_data.rb +15 -0
  44. data/lib/dcc/base/measurement_meta_data_list.rb +27 -0
  45. data/lib/dcc/base/measurement_result.rb +41 -0
  46. data/lib/dcc/base/measurement_result_list.rb +28 -0
  47. data/lib/dcc/base/measuring_equipment.rb +41 -0
  48. data/lib/dcc/base/measuring_equipment_list.rb +38 -0
  49. data/lib/dcc/base/quantity.rb +61 -0
  50. data/lib/dcc/base/ref_type_definition.rb +36 -0
  51. data/lib/dcc/base/ref_type_definition_list.rb +21 -0
  52. data/lib/dcc/base/resp_person.rb +38 -0
  53. data/lib/dcc/base/resp_person_list.rb +27 -0
  54. data/lib/dcc/base/result.rb +31 -0
  55. data/lib/dcc/base/result_list.rb +27 -0
  56. data/lib/dcc/base/rich_content.rb +34 -0
  57. data/lib/dcc/base/software.rb +35 -0
  58. data/lib/dcc/base/software_list.rb +27 -0
  59. data/lib/dcc/base/statement.rb +50 -0
  60. data/lib/dcc/base/statement_list.rb +27 -0
  61. data/lib/dcc/base/string_with_lang.rb +24 -0
  62. data/lib/dcc/base/text.rb +33 -0
  63. data/lib/dcc/base/used_method.rb +31 -0
  64. data/lib/dcc/base/used_method_list.rb +27 -0
  65. data/lib/dcc/base/xml_blob.rb +20 -0
  66. data/lib/dcc/base.rb +58 -0
  67. data/lib/dcc/builder/dsl.rb +10 -0
  68. data/lib/dcc/builder/session.rb +170 -0
  69. data/lib/dcc/builder.rb +34 -0
  70. data/lib/dcc/cli/cli.rb +149 -0
  71. data/lib/dcc/cli/formatters.rb +77 -0
  72. data/lib/dcc/cli.rb +7 -0
  73. data/lib/dcc/common_elements.rb +20 -0
  74. data/lib/dcc/context_configuration.rb +167 -0
  75. data/lib/dcc/context_options.rb +47 -0
  76. data/lib/dcc/convert/csv.rb +129 -0
  77. data/lib/dcc/convert/html.rb +127 -0
  78. data/lib/dcc/convert/json.rb +62 -0
  79. data/lib/dcc/convert/result.rb +51 -0
  80. data/lib/dcc/convert/yaml.rb +21 -0
  81. data/lib/dcc/convert.rb +14 -0
  82. data/lib/dcc/diff/change.rb +21 -0
  83. data/lib/dcc/diff/result.rb +58 -0
  84. data/lib/dcc/diff.rb +83 -0
  85. data/lib/dcc/error.rb +54 -0
  86. data/lib/dcc/extract/file.rb +143 -0
  87. data/lib/dcc/extract/ring.rb +28 -0
  88. data/lib/dcc/extract.rb +9 -0
  89. data/lib/dcc/i18n/text_lookup.rb +67 -0
  90. data/lib/dcc/i18n.rb +12 -0
  91. data/lib/dcc/inspect/report.rb +139 -0
  92. data/lib/dcc/inspect.rb +9 -0
  93. data/lib/dcc/migrate.rb +41 -0
  94. data/lib/dcc/namespace/dcc.rb +30 -0
  95. data/lib/dcc/namespace/dsig.rb +15 -0
  96. data/lib/dcc/namespace/math_ml.rb +14 -0
  97. data/lib/dcc/namespace/qudt.rb +15 -0
  98. data/lib/dcc/namespace/si.rb +26 -0
  99. data/lib/dcc/namespace.rb +18 -0
  100. data/lib/dcc/plugin/registry.rb +45 -0
  101. data/lib/dcc/plugin.rb +42 -0
  102. data/lib/dcc/quantity_format/formatter.rb +90 -0
  103. data/lib/dcc/quantity_format.rb +10 -0
  104. data/lib/dcc/quantity_math/quantity.rb +46 -0
  105. data/lib/dcc/quantity_math/real.rb +116 -0
  106. data/lib/dcc/quantity_math.rb +14 -0
  107. data/lib/dcc/schema/resources/dcc/dsi/v1.0.1.xsd +415 -0
  108. data/lib/dcc/schema/resources/dcc/dsi/v1.3.0.xsd +814 -0
  109. data/lib/dcc/schema/resources/dcc/dsi/v1.3.1.xsd +814 -0
  110. data/lib/dcc/schema/resources/dcc/dsi/v2.0.0.xsd +869 -0
  111. data/lib/dcc/schema/resources/dcc/dsi/v2.1.0.xsd +1031 -0
  112. data/lib/dcc/schema/resources/dcc/dsi/v2.2.1.xsd +1574 -0
  113. data/lib/dcc/schema/resources/dcc/qudt/v2.2.1.xsd +44 -0
  114. data/lib/dcc/schema/resources/dcc/v2.1.0/dcc.xsd +650 -0
  115. data/lib/dcc/schema/resources/dcc/v2.1.1/dcc.xsd +669 -0
  116. data/lib/dcc/schema/resources/dcc/v2.2.0/dcc.xsd +730 -0
  117. data/lib/dcc/schema/resources/dcc/v2.3.0/dcc.xsd +708 -0
  118. data/lib/dcc/schema/resources/dcc/v2.4.0/dcc.xsd +725 -0
  119. data/lib/dcc/schema/resources/dcc/v3.0.0/dcc.xsd +749 -0
  120. data/lib/dcc/schema/resources/dcc/v3.1.0/dcc.xsd +843 -0
  121. data/lib/dcc/schema/resources/dcc/v3.1.1/dcc.xsd +843 -0
  122. data/lib/dcc/schema/resources/dcc/v3.1.2/dcc.xsd +844 -0
  123. data/lib/dcc/schema/resources/dcc/v3.2.0/dcc.xsd +940 -0
  124. data/lib/dcc/schema/resources/dcc/v3.2.1/dcc.xsd +963 -0
  125. data/lib/dcc/schema/resources/dcc/v3.3.0/dcc.xsd +1008 -0
  126. data/lib/dcc/schema/resources/dcc/xmldsig-core-schema.xsd +312 -0
  127. data/lib/dcc/schema/resources/dsi/qudt/v2.2.1.xsd +44 -0
  128. data/lib/dcc/schema/resources/dsi/v1.0.1/SI_Format.xsd +415 -0
  129. data/lib/dcc/schema/resources/dsi/v1.3.0/SI_Format.xsd +814 -0
  130. data/lib/dcc/schema/resources/dsi/v1.3.1/SI_Format.xsd +814 -0
  131. data/lib/dcc/schema/resources/dsi/v2.0.0/SI_Format.xsd +869 -0
  132. data/lib/dcc/schema/resources/dsi/v2.1.0/SI_Format.xsd +1031 -0
  133. data/lib/dcc/schema/resources/dsi/v2.2.1/SI_Format.xsd +1574 -0
  134. data/lib/dcc/schema/resources/qudt/qudt.xsd +44 -0
  135. data/lib/dcc/schema/resources/schematron/dcc.sch +523 -0
  136. data/lib/dcc/schema/resources/schematron/dcc.svrl +2302 -0
  137. data/lib/dcc/schema/resources/xmldsig/xmldsig-core-schema.xsd +312 -0
  138. data/lib/dcc/schema/version.rb +94 -0
  139. data/lib/dcc/schema.rb +35 -0
  140. data/lib/dcc/server/app.rb +133 -0
  141. data/lib/dcc/server/storage/entry.rb +15 -0
  142. data/lib/dcc/server/storage/memory.rb +57 -0
  143. data/lib/dcc/server/storage.rb +13 -0
  144. data/lib/dcc/server.rb +33 -0
  145. data/lib/dcc/si/base/complex.rb +43 -0
  146. data/lib/dcc/si/base/complex_list_xml_list.rb +39 -0
  147. data/lib/dcc/si/base/constant.rb +39 -0
  148. data/lib/dcc/si/base/coverage_interval_mu.rb +31 -0
  149. data/lib/dcc/si/base/expanded_mu.rb +29 -0
  150. data/lib/dcc/si/base/expanded_unc_xml_list.rb +30 -0
  151. data/lib/dcc/si/base/hybrid.rb +42 -0
  152. data/lib/dcc/si/base/measurement_uncertainty_univariate.rb +28 -0
  153. data/lib/dcc/si/base/real.rb +48 -0
  154. data/lib/dcc/si/base/real_list_xml_list.rb +45 -0
  155. data/lib/dcc/si/base/si_list.rb +37 -0
  156. data/lib/dcc/si/base/standard_mu.rb +25 -0
  157. data/lib/dcc/si/base.rb +24 -0
  158. data/lib/dcc/si/common_elements.rb +13 -0
  159. data/lib/dcc/si/namespace.rb +7 -0
  160. data/lib/dcc/si/v1/common_elements.rb +13 -0
  161. data/lib/dcc/si/v1/complex.rb +8 -0
  162. data/lib/dcc/si/v1/complex_list_xml_list.rb +8 -0
  163. data/lib/dcc/si/v1/configuration.rb +13 -0
  164. data/lib/dcc/si/v1/constant.rb +8 -0
  165. data/lib/dcc/si/v1/coverage_interval_mu.rb +8 -0
  166. data/lib/dcc/si/v1/expanded_mu.rb +8 -0
  167. data/lib/dcc/si/v1/expanded_unc.rb +23 -0
  168. data/lib/dcc/si/v1/expanded_unc_xml_list.rb +8 -0
  169. data/lib/dcc/si/v1/hybrid.rb +8 -0
  170. data/lib/dcc/si/v1/measurement_uncertainty_univariate.rb +8 -0
  171. data/lib/dcc/si/v1/namespace.rb +9 -0
  172. data/lib/dcc/si/v1/real.rb +8 -0
  173. data/lib/dcc/si/v1/real_list_xml_list.rb +8 -0
  174. data/lib/dcc/si/v1/si_list.rb +8 -0
  175. data/lib/dcc/si/v1/standard_mu.rb +8 -0
  176. data/lib/dcc/si/v1.rb +46 -0
  177. data/lib/dcc/si/v2/common_elements.rb +13 -0
  178. data/lib/dcc/si/v2/complex.rb +8 -0
  179. data/lib/dcc/si/v2/complex_list_xml_list.rb +8 -0
  180. data/lib/dcc/si/v2/configuration.rb +13 -0
  181. data/lib/dcc/si/v2/constant.rb +8 -0
  182. data/lib/dcc/si/v2/coverage_interval_mu.rb +8 -0
  183. data/lib/dcc/si/v2/coverage_interval_mu_xml_list.rb +24 -0
  184. data/lib/dcc/si/v2/expanded_mu.rb +8 -0
  185. data/lib/dcc/si/v2/expanded_mu_xml_list.rb +22 -0
  186. data/lib/dcc/si/v2/expanded_unc_xml_list.rb +8 -0
  187. data/lib/dcc/si/v2/hybrid.rb +8 -0
  188. data/lib/dcc/si/v2/measurement_uncertainty_univariate.rb +8 -0
  189. data/lib/dcc/si/v2/namespace.rb +9 -0
  190. data/lib/dcc/si/v2/real.rb +8 -0
  191. data/lib/dcc/si/v2/real_list_xml_list.rb +8 -0
  192. data/lib/dcc/si/v2/si_list.rb +8 -0
  193. data/lib/dcc/si/v2/standard_mu.rb +8 -0
  194. data/lib/dcc/si/v2/standard_mu_xml_list.rb +18 -0
  195. data/lib/dcc/si/v2.rb +49 -0
  196. data/lib/dcc/si.rb +34 -0
  197. data/lib/dcc/signature/result.rb +43 -0
  198. data/lib/dcc/signature/signer.rb +36 -0
  199. data/lib/dcc/signature/verifier.rb +41 -0
  200. data/lib/dcc/signature.rb +13 -0
  201. data/lib/dcc/transform/result.rb +24 -0
  202. data/lib/dcc/transform/xslt.rb +72 -0
  203. data/lib/dcc/transform.rb +12 -0
  204. data/lib/dcc/type/base64_binary.rb +55 -0
  205. data/lib/dcc/type/decimal_xml_list.rb +47 -0
  206. data/lib/dcc/type/iso_country_code.rb +23 -0
  207. data/lib/dcc/type/iso_language_code.rb +23 -0
  208. data/lib/dcc/type/schema_version.rb +37 -0
  209. data/lib/dcc/type/si_unit.rb +26 -0
  210. data/lib/dcc/type.rb +16 -0
  211. data/lib/dcc/type_guards.rb +140 -0
  212. data/lib/dcc/v2/administrative_data.rb +8 -0
  213. data/lib/dcc/v2/byte_data.rb +8 -0
  214. data/lib/dcc/v2/calibration_laboratory.rb +8 -0
  215. data/lib/dcc/v2/comment.rb +8 -0
  216. data/lib/dcc/v2/common_elements.rb +13 -0
  217. data/lib/dcc/v2/condition.rb +8 -0
  218. data/lib/dcc/v2/configuration.rb +17 -0
  219. data/lib/dcc/v2/contact.rb +8 -0
  220. data/lib/dcc/v2/contact_not_strict.rb +8 -0
  221. data/lib/dcc/v2/core_data.rb +8 -0
  222. data/lib/dcc/v2/data.rb +8 -0
  223. data/lib/dcc/v2/digital_calibration_certificate.rb +8 -0
  224. data/lib/dcc/v2/equipment_class.rb +8 -0
  225. data/lib/dcc/v2/formula.rb +8 -0
  226. data/lib/dcc/v2/hash_type.rb +8 -0
  227. data/lib/dcc/v2/identification.rb +8 -0
  228. data/lib/dcc/v2/identifications.rb +8 -0
  229. data/lib/dcc/v2/influence_condition.rb +7 -0
  230. data/lib/dcc/v2/influence_condition_list.rb +8 -0
  231. data/lib/dcc/v2/item.rb +8 -0
  232. data/lib/dcc/v2/item_list.rb +8 -0
  233. data/lib/dcc/v2/list.rb +8 -0
  234. data/lib/dcc/v2/location.rb +8 -0
  235. data/lib/dcc/v2/measurement_meta_data.rb +8 -0
  236. data/lib/dcc/v2/measurement_meta_data_list.rb +8 -0
  237. data/lib/dcc/v2/measurement_result.rb +8 -0
  238. data/lib/dcc/v2/measurement_result_list.rb +8 -0
  239. data/lib/dcc/v2/measuring_equipment.rb +8 -0
  240. data/lib/dcc/v2/measuring_equipment_list.rb +8 -0
  241. data/lib/dcc/v2/namespace.rb +8 -0
  242. data/lib/dcc/v2/quantity.rb +49 -0
  243. data/lib/dcc/v2/ref_type_definition.rb +11 -0
  244. data/lib/dcc/v2/ref_type_definition_list.rb +15 -0
  245. data/lib/dcc/v2/resp_person.rb +8 -0
  246. data/lib/dcc/v2/resp_person_list.rb +8 -0
  247. data/lib/dcc/v2/result.rb +8 -0
  248. data/lib/dcc/v2/result_list.rb +8 -0
  249. data/lib/dcc/v2/rich_content.rb +12 -0
  250. data/lib/dcc/v2/software.rb +8 -0
  251. data/lib/dcc/v2/software_list.rb +8 -0
  252. data/lib/dcc/v2/statement.rb +8 -0
  253. data/lib/dcc/v2/statement_list.rb +8 -0
  254. data/lib/dcc/v2/string_with_lang.rb +8 -0
  255. data/lib/dcc/v2/text.rb +8 -0
  256. data/lib/dcc/v2/used_method.rb +8 -0
  257. data/lib/dcc/v2/used_method_list.rb +8 -0
  258. data/lib/dcc/v2/xml_blob.rb +8 -0
  259. data/lib/dcc/v2.rb +84 -0
  260. data/lib/dcc/v3/administrative_data.rb +8 -0
  261. data/lib/dcc/v3/byte_data.rb +8 -0
  262. data/lib/dcc/v3/calibration_laboratory.rb +8 -0
  263. data/lib/dcc/v3/comment.rb +8 -0
  264. data/lib/dcc/v3/common_elements.rb +11 -0
  265. data/lib/dcc/v3/condition.rb +8 -0
  266. data/lib/dcc/v3/configuration.rb +17 -0
  267. data/lib/dcc/v3/contact.rb +8 -0
  268. data/lib/dcc/v3/contact_not_strict.rb +8 -0
  269. data/lib/dcc/v3/core_data.rb +8 -0
  270. data/lib/dcc/v3/data.rb +8 -0
  271. data/lib/dcc/v3/digital_calibration_certificate.rb +8 -0
  272. data/lib/dcc/v3/equipment_class.rb +8 -0
  273. data/lib/dcc/v3/formula.rb +8 -0
  274. data/lib/dcc/v3/hash_type.rb +8 -0
  275. data/lib/dcc/v3/identification.rb +8 -0
  276. data/lib/dcc/v3/identifications.rb +8 -0
  277. data/lib/dcc/v3/influence_condition.rb +7 -0
  278. data/lib/dcc/v3/influence_condition_list.rb +8 -0
  279. data/lib/dcc/v3/item.rb +8 -0
  280. data/lib/dcc/v3/item_list.rb +8 -0
  281. data/lib/dcc/v3/list.rb +8 -0
  282. data/lib/dcc/v3/location.rb +8 -0
  283. data/lib/dcc/v3/measurement_meta_data.rb +8 -0
  284. data/lib/dcc/v3/measurement_meta_data_list.rb +8 -0
  285. data/lib/dcc/v3/measurement_result.rb +8 -0
  286. data/lib/dcc/v3/measurement_result_list.rb +8 -0
  287. data/lib/dcc/v3/measuring_equipment.rb +8 -0
  288. data/lib/dcc/v3/measuring_equipment_list.rb +8 -0
  289. data/lib/dcc/v3/namespace.rb +7 -0
  290. data/lib/dcc/v3/quantity.rb +49 -0
  291. data/lib/dcc/v3/ref_type_definition.rb +8 -0
  292. data/lib/dcc/v3/ref_type_definition_list.rb +8 -0
  293. data/lib/dcc/v3/resp_person.rb +8 -0
  294. data/lib/dcc/v3/resp_person_list.rb +8 -0
  295. data/lib/dcc/v3/result.rb +8 -0
  296. data/lib/dcc/v3/result_list.rb +8 -0
  297. data/lib/dcc/v3/rich_content.rb +8 -0
  298. data/lib/dcc/v3/software.rb +8 -0
  299. data/lib/dcc/v3/software_list.rb +8 -0
  300. data/lib/dcc/v3/statement.rb +8 -0
  301. data/lib/dcc/v3/statement_list.rb +8 -0
  302. data/lib/dcc/v3/string_with_lang.rb +8 -0
  303. data/lib/dcc/v3/text.rb +8 -0
  304. data/lib/dcc/v3/used_method.rb +8 -0
  305. data/lib/dcc/v3/used_method_list.rb +8 -0
  306. data/lib/dcc/v3/xml_blob.rb +8 -0
  307. data/lib/dcc/v3.rb +111 -0
  308. data/lib/dcc/validate/business_rules.rb +121 -0
  309. data/lib/dcc/validate/issue.rb +56 -0
  310. data/lib/dcc/validate/result.rb +105 -0
  311. data/lib/dcc/validate/schematron/profile.rb +64 -0
  312. data/lib/dcc/validate/schematron/rule.rb +49 -0
  313. data/lib/dcc/validate/schematron/rules/administrative_data_completeness.rb +42 -0
  314. data/lib/dcc/validate/schematron/rules/base.rb +15 -0
  315. data/lib/dcc/validate/schematron/rules/date_range_check.rb +41 -0
  316. data/lib/dcc/validate/schematron/rules/id_refid_linking.rb +61 -0
  317. data/lib/dcc/validate/schematron/rules/influence_conditions_placement.rb +58 -0
  318. data/lib/dcc/validate/schematron/rules/iso_code_validation.rb +53 -0
  319. data/lib/dcc/validate/schematron/rules/language_code_dedup.rb +39 -0
  320. data/lib/dcc/validate/schematron/rules/non_si_declaration.rb +82 -0
  321. data/lib/dcc/validate/schematron/rules/release_format_check.rb +44 -0
  322. data/lib/dcc/validate/schematron/rules/schema_version_check.rb +31 -0
  323. data/lib/dcc/validate/schematron/rules/uncertainty_consistency.rb +58 -0
  324. data/lib/dcc/validate/schematron/rules/unit_format_check.rb +74 -0
  325. data/lib/dcc/validate/schematron/rules/used_methods_placement.rb +65 -0
  326. data/lib/dcc/validate/schematron/rules/used_software_placement.rb +43 -0
  327. data/lib/dcc/validate/schematron/rules/xml_list_spacing.rb +42 -0
  328. data/lib/dcc/validate/schematron/rules.rb +30 -0
  329. data/lib/dcc/validate/schematron.rb +22 -0
  330. data/lib/dcc/validate/severity.rb +39 -0
  331. data/lib/dcc/validate/xsd.rb +97 -0
  332. data/lib/dcc/validate.rb +15 -0
  333. data/lib/dcc/version.rb +5 -0
  334. data/lib/dcc/versioned_parser.rb +48 -0
  335. data/lib/dcc.rb +141 -0
  336. metadata +425 -0
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::V3
4
+ # V3 Quantity: declares DCC admin attributes + D-SI v2.x quantity element
5
+ # references in a single `xml do` block. We avoid `include Dcc::Base::Quantity`
6
+ # because the second `xml do` block would overwrite the base mappings.
7
+ class Quantity < CommonElements
8
+ attribute :id, :string
9
+ attribute :ref_id, :string
10
+ attribute :ref_type, :string
11
+ attribute :name, :text
12
+ attribute :no_quantity, :string
13
+ attribute :used_methods, :usedMethods
14
+ attribute :used_software, :softwareList
15
+ attribute :influence_conditions, :influenceConditions
16
+ attribute :measurement_meta_data, :measurementMetaData
17
+ # D-SI v2 quantity substitutions (Option B)
18
+ attribute :real, ::Dcc::Si::V2::Real, collection: true
19
+ attribute :complex, ::Dcc::Si::V2::Complex, collection: true
20
+ attribute :constant, ::Dcc::Si::V2::Constant, collection: true
21
+ attribute :hybrid, ::Dcc::Si::V2::Hybrid, collection: true
22
+ attribute :real_list_xml_list, ::Dcc::Si::V2::RealListXmlList, collection: true
23
+ attribute :complex_list_xml_list, ::Dcc::Si::V2::ComplexListXmlList, collection: true
24
+ attribute :list, ::Dcc::Si::V2::SiList, collection: true
25
+
26
+ xml do
27
+ namespace ::Dcc::Namespace::Dcc
28
+ element "quantity"
29
+ ordered
30
+ map_attribute "id", to: :id
31
+ map_attribute "refId", to: :ref_id
32
+ map_attribute "refType", to: :ref_type
33
+ map_element "name", to: :name
34
+ map_element "noQuantity", to: :no_quantity
35
+ map_element "usedMethods", to: :used_methods
36
+ map_element "usedSoftware", to: :used_software
37
+ map_element "influenceConditions", to: :influence_conditions
38
+ map_element "measurementMetaData", to: :measurement_meta_data
39
+ map_element "real", to: :real
40
+ map_element "complex", to: :complex
41
+ map_element "constant", to: :constant
42
+ map_element "hybrid", to: :hybrid
43
+ map_element "realListXMLList", to: :real_list_xml_list
44
+ map_element "complexListXMLList", to: :complex_list_xml_list
45
+ map_element "list", to: :list
46
+ end
47
+ end
48
+ Configuration.register_model(Quantity, id: :quantity)
49
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::V3
4
+ class RefTypeDefinition < CommonElements
5
+ include ::Dcc::Base::RefTypeDefinition
6
+ end
7
+ Configuration.register_model(RefTypeDefinition, id: :refTypeDefinition)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::V3
4
+ class RefTypeDefinitionList < CommonElements
5
+ include ::Dcc::Base::RefTypeDefinitionList
6
+ end
7
+ Configuration.register_model(RefTypeDefinitionList, id: :refTypeDefinitions)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::V3
4
+ class RespPerson < CommonElements
5
+ include ::Dcc::Base::RespPerson
6
+ end
7
+ Configuration.register_model(RespPerson, id: :respPerson)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::V3
4
+ class RespPersonList < CommonElements
5
+ include ::Dcc::Base::RespPersonList
6
+ end
7
+ Configuration.register_model(RespPersonList, id: :respPersons)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::V3
4
+ class Result < CommonElements
5
+ include ::Dcc::Base::Result
6
+ end
7
+ Configuration.register_model(Result, id: :result)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::V3
4
+ class ResultList < CommonElements
5
+ include ::Dcc::Base::ResultList
6
+ end
7
+ Configuration.register_model(ResultList, id: :results)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::V3
4
+ class RichContent < CommonElements
5
+ include ::Dcc::Base::RichContent
6
+ end
7
+ Configuration.register_model(RichContent, id: :richContent)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::V3
4
+ class Software < CommonElements
5
+ include ::Dcc::Base::Software
6
+ end
7
+ Configuration.register_model(Software, id: :software)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::V3
4
+ class SoftwareList < CommonElements
5
+ include ::Dcc::Base::SoftwareList
6
+ end
7
+ Configuration.register_model(SoftwareList, id: :softwareList)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::V3
4
+ class Statement < CommonElements
5
+ include ::Dcc::Base::Statement
6
+ end
7
+ Configuration.register_model(Statement, id: :statement)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::V3
4
+ class StatementList < CommonElements
5
+ include ::Dcc::Base::StatementList
6
+ end
7
+ Configuration.register_model(StatementList, id: :statements)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::V3
4
+ class StringWithLang < CommonElements
5
+ include ::Dcc::Base::StringWithLang
6
+ end
7
+ Configuration.register_model(StringWithLang, id: :content)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::V3
4
+ class Text < CommonElements
5
+ include ::Dcc::Base::Text
6
+ end
7
+ Configuration.register_model(Text, id: :text)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::V3
4
+ class UsedMethod < CommonElements
5
+ include ::Dcc::Base::UsedMethod
6
+ end
7
+ Configuration.register_model(UsedMethod, id: :usedMethod)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::V3
4
+ class UsedMethodList < CommonElements
5
+ include ::Dcc::Base::UsedMethodList
6
+ end
7
+ Configuration.register_model(UsedMethodList, id: :usedMethods)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::V3
4
+ class XmlBlob < CommonElements
5
+ include ::Dcc::Base::XmlBlob
6
+ end
7
+ Configuration.register_model(XmlBlob, id: :xml)
8
+ end
data/lib/dcc/v3.rb ADDED
@@ -0,0 +1,111 @@
1
+ # frozen_string_literal: true
2
+
3
+ # `Dcc::V3` hosts all DCC v3.x element wrapper classes. They share the same
4
+ # `lib/dcc/base/*.rb` mapping modules as V2 but live in their own class
5
+ # hierarchy and register in their own type context (`:dcc_v3`), so V2 and V3
6
+ # can coexist in one process without symbol clashes.
7
+ module Dcc
8
+ module V3
9
+ autoload :Configuration, "dcc/v3/configuration"
10
+ autoload :Namespace, "dcc/v3/namespace"
11
+ autoload :CommonElements, "dcc/v3/common_elements"
12
+
13
+ autoload :StringWithLang, "dcc/v3/string_with_lang"
14
+ autoload :Text, "dcc/v3/text"
15
+ autoload :ByteData, "dcc/v3/byte_data"
16
+ autoload :Formula, "dcc/v3/formula"
17
+ autoload :RichContent, "dcc/v3/rich_content"
18
+ autoload :XmlBlob, "dcc/v3/xml_blob"
19
+ autoload :Comment, "dcc/v3/comment"
20
+ autoload :EquipmentClass, "dcc/v3/equipment_class"
21
+ autoload :Location, "dcc/v3/location"
22
+ autoload :Contact, "dcc/v3/contact"
23
+ autoload :ContactNotStrict, "dcc/v3/contact_not_strict"
24
+ autoload :HashType, "dcc/v3/hash_type"
25
+ autoload :Identification, "dcc/v3/identification"
26
+ autoload :Identifications, "dcc/v3/identifications"
27
+ autoload :Software, "dcc/v3/software"
28
+ autoload :SoftwareList, "dcc/v3/software_list"
29
+ autoload :RefTypeDefinition, "dcc/v3/ref_type_definition"
30
+ autoload :RefTypeDefinitionList, "dcc/v3/ref_type_definition_list"
31
+ autoload :CoreData, "dcc/v3/core_data"
32
+ autoload :Item, "dcc/v3/item"
33
+ autoload :ItemList, "dcc/v3/item_list"
34
+ autoload :CalibrationLaboratory, "dcc/v3/calibration_laboratory"
35
+ autoload :RespPerson, "dcc/v3/resp_person"
36
+ autoload :RespPersonList, "dcc/v3/resp_person_list"
37
+ autoload :Statement, "dcc/v3/statement"
38
+ autoload :StatementList, "dcc/v3/statement_list"
39
+ autoload :MeasuringEquipment, "dcc/v3/measuring_equipment"
40
+ autoload :MeasuringEquipmentList, "dcc/v3/measuring_equipment_list"
41
+ autoload :UsedMethod, "dcc/v3/used_method"
42
+ autoload :UsedMethodList, "dcc/v3/used_method_list"
43
+ autoload :Condition, "dcc/v3/condition"
44
+ autoload :InfluenceCondition, "dcc/v3/influence_condition"
45
+ autoload :InfluenceConditionList, "dcc/v3/influence_condition_list"
46
+ autoload :Result, "dcc/v3/result"
47
+ autoload :ResultList, "dcc/v3/result_list"
48
+ autoload :Data, "dcc/v3/data"
49
+ autoload :Quantity, "dcc/v3/quantity"
50
+ autoload :List, "dcc/v3/list"
51
+ autoload :MeasurementMetaData, "dcc/v3/measurement_meta_data"
52
+ autoload :MeasurementMetaDataList, "dcc/v3/measurement_meta_data_list"
53
+ autoload :MeasurementResult, "dcc/v3/measurement_result"
54
+ autoload :MeasurementResultList, "dcc/v3/measurement_result_list"
55
+ autoload :AdministrativeData, "dcc/v3/administrative_data"
56
+ autoload :DigitalCalibrationCertificate, "dcc/v3/digital_calibration_certificate"
57
+
58
+ ROOT_ELEMENT_TAG = "digitalCalibrationCertificate"
59
+
60
+ extend ::Dcc::VersionedParser
61
+
62
+ # Element wrapper classes that must be loaded before
63
+ # `Configuration.populate_context!` can register them. Iterating
64
+ # `constants` triggers each autoload lazily.
65
+ ELEMENT_CLASSES = %i[
66
+ StringWithLang Text ByteData Formula RichContent XmlBlob Comment
67
+ EquipmentClass Location Contact ContactNotStrict HashType
68
+ Identification Identifications Software SoftwareList
69
+ RefTypeDefinition RefTypeDefinitionList
70
+ CoreData Item ItemList CalibrationLaboratory
71
+ RespPerson RespPersonList Statement StatementList
72
+ MeasuringEquipment MeasuringEquipmentList
73
+ UsedMethod UsedMethodList
74
+ Condition InfluenceCondition InfluenceConditionList
75
+ Result ResultList Data Quantity List
76
+ MeasurementMetaData MeasurementMetaDataList
77
+ MeasurementResult MeasurementResultList
78
+ AdministrativeData DigitalCalibrationCertificate
79
+ ].freeze
80
+
81
+ # Eagerly load every element wrapper so registrations run, then register
82
+ # D-SI types in the DCC v3 context so cross-namespace `:real` / `:hybrid`
83
+ # references inside DCC Quantity's D-SI children resolve cleanly.
84
+ def self.load_all!
85
+ ELEMENT_CLASSES.each { |name| const_get(name) }
86
+ Configuration.populate_context!
87
+ register_dsi_types!
88
+ true
89
+ end
90
+
91
+ # Re-export D-SI v2 type registrations into the DCC v3 context. Uses
92
+ # only the public `register_model` API (no instance_variable access).
93
+ def self.register_dsi_types!
94
+ ::Dcc::Si::V2.load_all!
95
+ ::Dcc::Si::V2::Configuration.registered_model_ids.each do |id|
96
+ klass = ::Dcc::Si::V2::Configuration.registered_model_class(id)
97
+ Configuration.register_model(klass, id: id)
98
+ end
99
+ end
100
+
101
+ # Re-export Mml type registrations into the DCC v3 context so
102
+ # `Mml::V3::Math` children resolve when formula.mathml is serialized.
103
+ def self.register_mml_types!
104
+ ::Mml::V3::Configuration.populate_context!
105
+ ::Mml::V3::Configuration.registered_model_ids.each do |id|
106
+ klass = ::Mml::V3::Configuration.registered_model_class(id)
107
+ Configuration.register_model(klass, id: id)
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Validate
5
+ # Ruby-side semantic checks that go beyond Schematron. Cross-section
6
+ # consistency, signer coverage, language completeness. Open for
7
+ # extension via the Registry class.
8
+ module BusinessRules
9
+ # Output of running business rules. Same shape as Validate::Result.
10
+ class Result < ::Dcc::Validate::Result
11
+ end
12
+
13
+ # Registry of all registered business rules. Plugins call
14
+ # `Dcc::Validate::BusinessRules::Registry.add(rule_class)` to add
15
+ # new rules without modifying this file (OCP).
16
+ class Registry
17
+ @rules = []
18
+
19
+ class << self
20
+ attr_reader :rules
21
+
22
+ # @param rule_class [Class] subclass of Rule.
23
+ def add(rule_class)
24
+ @rules << rule_class
25
+ rule_class
26
+ end
27
+
28
+ # @return [Array<Class>]
29
+ def all
30
+ @rules
31
+ end
32
+
33
+ def reset!
34
+ @rules.clear
35
+ end
36
+ end
37
+ end
38
+
39
+ # Base class for business rules.
40
+ class Rule
41
+ def severity
42
+ ::Dcc::Validate::Severity::ERROR
43
+ end
44
+
45
+ def code
46
+ "dcc.business_rule.#{self.class.name.split('::').last.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').gsub(/([a-z\d])([A-Z])/, '\1_\2').downcase}"
47
+ end
48
+
49
+ # @param _dcc [Lutaml::Model::Serializable]
50
+ # @return [Array<Dcc::Validate::Issue>]
51
+ def check_on(_dcc)
52
+ []
53
+ end
54
+
55
+ protected
56
+
57
+ def issue(severity:, message:, path: nil)
58
+ ::Dcc::Validate::Issue.build(
59
+ severity: severity,
60
+ message: message,
61
+ code: code,
62
+ path: path,
63
+ source: "business_rule",
64
+ )
65
+ end
66
+ end
67
+
68
+ # Require exactly one respPerson with mainSigner = true.
69
+ class MainSignerSingle < Rule
70
+ def check_on(dcc)
71
+ return [] unless Dcc::TypeGuards.has_attribute?(dcc, :administrative_data)
72
+
73
+ admin = dcc.administrative_data
74
+ return [] unless admin && Dcc::TypeGuards.has_attribute?(admin, :resp_persons) && admin.resp_persons
75
+
76
+ resp_persons = Array(admin.resp_persons.resp_person)
77
+ main_signers = resp_persons.select { |p| Dcc::TypeGuards.has_attribute?(p, :main_signer) && p.main_signer }
78
+ return [] if main_signers.size == 1
79
+
80
+ [
81
+ issue(
82
+ severity: :error,
83
+ message: "Expected exactly one mainSigner respPerson, found #{main_signers.size}",
84
+ ),
85
+ ]
86
+ end
87
+ end
88
+
89
+ # Require non-empty uniqueIdentifier.
90
+ class UniqueIdentifierPresent < Rule
91
+ def check_on(dcc)
92
+ return [] unless Dcc::TypeGuards.has_attribute?(dcc, :administrative_data)
93
+
94
+ core = dcc.administrative_data&.core_data
95
+ return [issue(severity: :error, message: "coreData is missing")] unless core
96
+
97
+ id = core.unique_identifier
98
+ return [] if id && !id.to_s.empty?
99
+
100
+ [issue(severity: :error, message: "uniqueIdentifier is missing or empty")]
101
+ end
102
+ end
103
+
104
+ Registry.add(MainSignerSingle)
105
+ Registry.add(UniqueIdentifierPresent)
106
+
107
+ class << self
108
+ # @param dcc [Lutaml::Model::Serializable]
109
+ # @return [Dcc::Validate::BusinessRules::Result]
110
+ def call(dcc)
111
+ issues = Registry.all.flat_map { |rule_class| rule_class.new.check_on(dcc) }
112
+ Result.new(
113
+ issues: issues,
114
+ schema_version: Dcc::TypeGuards.has_attribute?(dcc, :schema_version) ? dcc.schema_version.to_s : nil,
115
+ source: "business_rule",
116
+ )
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Dcc
6
+ module Validate
7
+ # A single validation issue (XSD error, Schematron failed assert, or
8
+ # business-rule violation). Carries enough metadata for both human and
9
+ # machine reporting.
10
+ class Issue < Lutaml::Model::Serializable
11
+ attribute :severity, :symbol
12
+ attribute :code, :string
13
+ attribute :message, :string
14
+ attribute :line, :integer
15
+ attribute :column, :integer
16
+ attribute :path, :string
17
+ attribute :source, :string
18
+
19
+ # Convenience constructor used by validators.
20
+ # @param severity [Symbol, String] see `Dcc::Validate::Severity.normalize`.
21
+ # @param message [String] human-readable description.
22
+ # @param code [String, nil] validator-specific code (e.g. "dcc.date-range").
23
+ # @param line [Integer, nil] XML line number if known.
24
+ # @param column [Integer, nil] XML column number if known.
25
+ # @param path [String, nil] XPath / element path if known.
26
+ # @param source [String, nil] validator name (e.g. "xsd", "schematron").
27
+ def self.build(severity:, message:, code: nil, line: nil, column: nil, path: nil, source: nil)
28
+ new(
29
+ severity: ::Dcc::Validate::Severity.normalize(severity),
30
+ message: message,
31
+ code: code,
32
+ line: line,
33
+ column: column,
34
+ path: path,
35
+ source: source,
36
+ )
37
+ end
38
+
39
+ # @return [Boolean] whether this issue fails validation (severity == error).
40
+ def failing?
41
+ severity == ::Dcc::Validate::Severity::ERROR
42
+ end
43
+
44
+ def to_s
45
+ loc = []
46
+ loc << "line #{line}" if line
47
+ loc << "col #{column}" if column
48
+ loc << path if path
49
+ loc_str = loc.empty? ? "" : " [#{loc.join(' ')}]"
50
+ code_str = code ? "(#{code}) " : ""
51
+ src_str = source ? "#{source}: " : ""
52
+ "#{src_str}#{severity.upcase} #{code_str}#{message}#{loc_str}"
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,105 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Dcc
6
+ module Validate
7
+ # Result of running one or more validators. Tracks the list of issues
8
+ # and the schema version (when relevant). Renderable as text, JSON, or
9
+ # YAML via `to_s` / `to_json` / `to_yaml`.
10
+ class Result < Lutaml::Model::Serializable
11
+ attribute :issues, ::Dcc::Validate::Issue, collection: true
12
+ attribute :schema_version, :string
13
+ attribute :source, :string
14
+
15
+ # @param issues [Array<Dcc::Validate::Issue>] validation issues found.
16
+ # @param schema_version [String, nil] DCC schema version validated against.
17
+ # @param source [String, nil] validator name (xsd, schematron, business_rules, all).
18
+ def initialize(issues: [], schema_version: nil, source: nil)
19
+ super()
20
+ self.issues = issues
21
+ self.schema_version = schema_version
22
+ self.source = source
23
+ end
24
+
25
+ # @return [Boolean] true when there are no failing (error) issues.
26
+ def ok?
27
+ issues.none?(&:failing?)
28
+ end
29
+
30
+ # @return [Array<Dcc::Validate::Issue>] only the errors.
31
+ def errors
32
+ issues.select(&:failing?)
33
+ end
34
+
35
+ # @return [Array<Dcc::Validate::Issue>] only the warnings.
36
+ def warnings
37
+ issues.select { |i| i.severity == ::Dcc::Validate::Severity::WARNING }
38
+ end
39
+
40
+ # @return [Array<Dcc::Validate::Issue>] only informational issues.
41
+ def infos
42
+ issues.select { |i| i.severity == ::Dcc::Validate::Severity::INFO }
43
+ end
44
+
45
+ # Merge another Result into this one (mutating). Returns self.
46
+ # @param other [Dcc::Validate::Result]
47
+ # @return [Dcc::Validate::Result]
48
+ def merge!(other)
49
+ self.issues = issues + other.issues
50
+ self
51
+ end
52
+
53
+ # Non-mutating merge.
54
+ # @return [Dcc::Validate::Result]
55
+ def merge(other)
56
+ dup.merge!(other)
57
+ end
58
+
59
+ def to_s
60
+ if ok?
61
+ "OK: no errors found#{schema_version ? " (schemaVersion #{schema_version})" : ''}"
62
+ else
63
+ header = "#{errors.size} error(s), #{warnings.size} warning(s)"
64
+ header += " (schemaVersion #{schema_version})" if schema_version
65
+ body = errors.map(&:to_s).unshift(header).join("\n")
66
+ body
67
+ end
68
+ end
69
+
70
+ def to_json(*_args)
71
+ require "json"
72
+ payload = {
73
+ ok: ok?,
74
+ source: source,
75
+ schema_version: schema_version,
76
+ error_count: errors.size,
77
+ warning_count: warnings.size,
78
+ info_count: infos.size,
79
+ issues: issues.map do |i|
80
+ {
81
+ severity: i.severity.to_s,
82
+ code: i.code,
83
+ message: i.message,
84
+ line: i.line,
85
+ column: i.column,
86
+ path: i.path,
87
+ source: i.source,
88
+ }
89
+ end,
90
+ }
91
+ ::JSON.pretty_generate(payload)
92
+ end
93
+
94
+ def to_yaml(*_args)
95
+ require "yaml"
96
+ {
97
+ ok: ok?,
98
+ source: source,
99
+ schema_version: schema_version,
100
+ issues: issues.map { |i| [i.severity.to_s, i.message, i.line, i.path] },
101
+ }.to_yaml
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bigdecimal"
4
+ require "date"
5
+
6
+ module Dcc
7
+ module Validate
8
+ module Schematron
9
+ # `Dcc::Validate::Schematron::Profile` aggregates the 14 PTB Schematron
10
+ # rules and runs them against a parsed DCC object tree. Each rule is a
11
+ # `Lutaml::Model::Validation::Rule` subclass that walks the parsed tree.
12
+ #
13
+ # @example
14
+ # result = Dcc::Validate::Schematron.call(dcc)
15
+ # result.ok? # => true
16
+ # result.issues.size # => 0
17
+ class Profile
18
+ attr_reader :dcc, :rules
19
+
20
+ def initialize(dcc)
21
+ @dcc = dcc
22
+ @rules = [
23
+ Rules::UsedMethodsPlacement,
24
+ Rules::UsedSoftwarePlacement,
25
+ Rules::InfluenceConditionsPlacement,
26
+ Rules::SchemaVersionCheck,
27
+ Rules::IdRefIdLinking,
28
+ Rules::IsoCodeValidation,
29
+ Rules::DateRangeCheck,
30
+ Rules::ReleaseFormatCheck,
31
+ Rules::UncertaintyConsistency,
32
+ Rules::UnitFormatCheck,
33
+ Rules::NonSiDeclaration,
34
+ Rules::LanguageCodeDedup,
35
+ Rules::XmlListSpacing,
36
+ ]
37
+ end
38
+
39
+ # Run all rules and return a `Dcc::Validate::Result`.
40
+ def call
41
+ issues = []
42
+ rules.each do |rule_class|
43
+ issues.concat(rule_class.new.check_on(dcc))
44
+ end
45
+
46
+ ::Dcc::Validate::Result.new(
47
+ issues: issues,
48
+ schema_version: Dcc::TypeGuards.has_attribute?(dcc, :schema_version) ? dcc.schema_version.to_s : nil,
49
+ source: "schematron",
50
+ )
51
+ end
52
+
53
+ class << self
54
+ # Convenience class method.
55
+ # @param dcc [Lutaml::Model::Serializable]
56
+ # @return [Dcc::Validate::Result]
57
+ def call(dcc)
58
+ new(dcc).call
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end