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,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Base
5
+ # `dcc:softwareListType` — collection of `dcc:software`.
6
+ module SoftwareList
7
+ def self.included(klass)
8
+ klass.class_eval do
9
+ attribute :id, :string
10
+ attribute :ref_id, :string
11
+ attribute :ref_type, :string
12
+ attribute :software, :software, collection: true
13
+
14
+ xml do
15
+ namespace ::Dcc::Namespace::Dcc
16
+ element "softwareList"
17
+ ordered
18
+ map_attribute "id", to: :id
19
+ map_attribute "refId", to: :ref_id
20
+ map_attribute "refType", to: :ref_type
21
+ map_element "software", to: :software
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Base
5
+ # `dcc:statementMetaDataType` — generic statement block used for conformity,
6
+ # traceability, validity range, etc. Carries a refType classifier.
7
+ module Statement
8
+ def self.included(klass)
9
+ klass.class_eval do
10
+ attribute :id, :string
11
+ attribute :ref_id, :string
12
+ attribute :ref_type, :string
13
+ attribute :country_code_iso_3166_1, ::Dcc::Type::IsoCountryCode
14
+ attribute :convention, :string
15
+ attribute :traceable, :boolean
16
+ attribute :norm, :text
17
+ attribute :reference, :text
18
+ attribute :declaration, :text
19
+ attribute :valid, :boolean
20
+ attribute :ref_id_statement, :string
21
+ attribute :date, :date
22
+ attribute :period, :string
23
+ attribute :non_si_unit, :string
24
+ attribute :non_si_definition, :text
25
+
26
+ xml do
27
+ namespace ::Dcc::Namespace::Dcc
28
+ element "statement"
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 "countryCodeISO3166_1", to: :country_code_iso_3166_1
34
+ map_element "convention", to: :convention
35
+ map_element "traceable", to: :traceable
36
+ map_element "norm", to: :norm
37
+ map_element "reference", to: :reference
38
+ map_element "declaration", to: :declaration
39
+ map_element "valid", to: :valid
40
+ map_element "refId", to: :ref_id_statement
41
+ map_element "date", to: :date
42
+ map_element "period", to: :period
43
+ map_element "nonSIUnit", to: :non_si_unit
44
+ map_element "nonSIDefinition", to: :non_si_definition
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Base
5
+ # `dcc:statementListType` — collection of `dcc:statement`.
6
+ module StatementList
7
+ def self.included(klass)
8
+ klass.class_eval do
9
+ attribute :id, :string
10
+ attribute :ref_id, :string
11
+ attribute :ref_type, :string
12
+ attribute :statement, :statement, collection: true
13
+
14
+ xml do
15
+ namespace ::Dcc::Namespace::Dcc
16
+ element "statements"
17
+ ordered
18
+ map_attribute "id", to: :id
19
+ map_attribute "refId", to: :ref_id
20
+ map_attribute "refType", to: :ref_type
21
+ map_element "statement", to: :statement
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Base
5
+ # `dcc:stringWithLangType` — single localized string with an optional
6
+ # `xml:lang` attribute. Used inside `dcc:textType` and many other types.
7
+ module StringWithLang
8
+ def self.included(klass)
9
+ klass.class_eval do
10
+ attribute :value, :string, collection: true
11
+ attribute :lang, :string
12
+
13
+ xml do
14
+ namespace ::Dcc::Namespace::Dcc
15
+ element "content"
16
+ mixed_content
17
+ map_content to: :value
18
+ map_attribute "lang", to: :lang
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Base
5
+ # `dcc:textType` — multilingual text container. Holds interleaved
6
+ # `dcc:content` (localized text), `dcc:file` (byteData), and
7
+ # `dcc:formula` elements per the v3.3.0 XSD content model.
8
+ module Text
9
+ def self.included(klass)
10
+ klass.class_eval do
11
+ attribute :id, :string
12
+ attribute :ref_id, :string
13
+ attribute :ref_type, :string
14
+ attribute :content, :content, collection: true
15
+ attribute :file, :byteData, collection: true
16
+ attribute :formula, :formula, collection: true
17
+
18
+ xml do
19
+ namespace ::Dcc::Namespace::Dcc
20
+ element "text"
21
+ ordered
22
+ map_attribute "id", to: :id
23
+ map_attribute "refId", to: :ref_id
24
+ map_attribute "refType", to: :ref_type
25
+ map_element "content", to: :content
26
+ map_element "file", to: :file
27
+ map_element "formula", to: :formula
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Base
5
+ # `dcc:usedMethodType` — calibration method with name/description/norm.
6
+ module UsedMethod
7
+ def self.included(klass)
8
+ klass.class_eval do
9
+ attribute :id, :string
10
+ attribute :ref_id, :string
11
+ attribute :ref_type, :string
12
+ attribute :name, :text
13
+ attribute :description, :text
14
+ attribute :norm, :text, collection: true
15
+
16
+ xml do
17
+ namespace ::Dcc::Namespace::Dcc
18
+ element "usedMethod"
19
+ ordered
20
+ map_attribute "id", to: :id
21
+ map_attribute "refId", to: :ref_id
22
+ map_attribute "refType", to: :ref_type
23
+ map_element "name", to: :name
24
+ map_element "description", to: :description
25
+ map_element "norm", to: :norm
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Base
5
+ # `dcc:usedMethodListType` — collection of `dcc:usedMethod`.
6
+ module UsedMethodList
7
+ def self.included(klass)
8
+ klass.class_eval do
9
+ attribute :id, :string
10
+ attribute :ref_id, :string
11
+ attribute :ref_type, :string
12
+ attribute :used_method, :usedMethod, collection: true
13
+
14
+ xml do
15
+ namespace ::Dcc::Namespace::Dcc
16
+ element "usedMethods"
17
+ ordered
18
+ map_attribute "id", to: :id
19
+ map_attribute "refId", to: :ref_id
20
+ map_attribute "refType", to: :ref_type
21
+ map_element "usedMethod", to: :used_method
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Base
5
+ # `dcc:xmlType` — opaque wildcard XML payload (`xs:any namespace="##other"`).
6
+ module XmlBlob
7
+ def self.included(klass)
8
+ klass.class_eval do
9
+ attribute :raw, :string
10
+
11
+ xml do
12
+ namespace ::Dcc::Namespace::Dcc
13
+ element "xml"
14
+ map_all to: :raw
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
data/lib/dcc/base.rb ADDED
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ # `Dcc::Base` hosts version-agnostic XML mapping modules for every DCC element
4
+ # type. Each module follows the `self.included(klass)` pattern from mml so the
5
+ # version wrapper classes (`Dcc::V2::*`, `Dcc::V3::*`) can mix them in and add
6
+ # version-specific extras.
7
+ #
8
+ # Inside `class_eval` blocks, constants resolve from `Dcc::Base`'s lexical
9
+ # scope, so always use fully-qualified names (e.g. `::Dcc::Namespace::Dcc`).
10
+ module Dcc
11
+ module Base
12
+ autoload :Text, "dcc/base/text"
13
+ autoload :StringWithLang, "dcc/base/string_with_lang"
14
+ autoload :ByteData, "dcc/base/byte_data"
15
+ autoload :Formula, "dcc/base/formula"
16
+ autoload :Mathml, "dcc/base/mathml"
17
+ autoload :RichContent, "dcc/base/rich_content"
18
+ autoload :XmlBlob, "dcc/base/xml_blob"
19
+ autoload :Comment, "dcc/base/comment"
20
+ autoload :EquipmentClass, "dcc/base/equipment_class"
21
+ autoload :Contact, "dcc/base/contact"
22
+ autoload :ContactNotStrict, "dcc/base/contact_not_strict"
23
+ autoload :Location, "dcc/base/location"
24
+ autoload :HashType, "dcc/base/hash_type"
25
+ autoload :Identifications, "dcc/base/identifications"
26
+ autoload :Identification, "dcc/base/identification"
27
+ autoload :Software, "dcc/base/software"
28
+ autoload :SoftwareList, "dcc/base/software_list"
29
+ autoload :RefTypeDefinition, "dcc/base/ref_type_definition"
30
+ autoload :RefTypeDefinitionList, "dcc/base/ref_type_definition_list"
31
+ autoload :CoreData, "dcc/base/core_data"
32
+ autoload :Item, "dcc/base/item"
33
+ autoload :ItemList, "dcc/base/item_list"
34
+ autoload :CalibrationLaboratory, "dcc/base/calibration_laboratory"
35
+ autoload :RespPerson, "dcc/base/resp_person"
36
+ autoload :RespPersonList, "dcc/base/resp_person_list"
37
+ autoload :Statement, "dcc/base/statement"
38
+ autoload :StatementList, "dcc/base/statement_list"
39
+ autoload :MeasuringEquipment, "dcc/base/measuring_equipment"
40
+ autoload :MeasuringEquipmentList, "dcc/base/measuring_equipment_list"
41
+ autoload :UsedMethod, "dcc/base/used_method"
42
+ autoload :UsedMethodList, "dcc/base/used_method_list"
43
+ autoload :InfluenceCondition, "dcc/base/influence_condition"
44
+ autoload :InfluenceConditionList, "dcc/base/influence_condition_list"
45
+ autoload :Condition, "dcc/base/condition"
46
+ autoload :Result, "dcc/base/result"
47
+ autoload :ResultList, "dcc/base/result_list"
48
+ autoload :Data, "dcc/base/data"
49
+ autoload :Quantity, "dcc/base/quantity"
50
+ autoload :List, "dcc/base/list"
51
+ autoload :MeasurementResult, "dcc/base/measurement_result"
52
+ autoload :MeasurementResultList, "dcc/base/measurement_result_list"
53
+ autoload :MeasurementMetaData, "dcc/base/measurement_meta_data"
54
+ autoload :MeasurementMetaDataList, "dcc/base/measurement_meta_data_list"
55
+ autoload :AdministrativeData, "dcc/base/administrative_data"
56
+ autoload :DigitalCalibrationCertificate, "dcc/base/digital_calibration_certificate"
57
+ end
58
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Builder
5
+ # Placeholder module — the DSL is implemented directly on `Session`.
6
+ # Kept for future expansion (e.g. shared mixins for V2 vs V3 DSL).
7
+ module Dsl
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,170 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Builder
5
+ # A builder session tracks the current container (administrative_data,
6
+ # items, measurement_results) and produces a fully populated
7
+ # Dcc::V2::DigitalCalibrationCertificate or Dcc::V3::DigitalCalibrationCertificate
8
+ # on `build`.
9
+ class Session
10
+ def initialize(version: 3)
11
+ @version = version
12
+ case version
13
+ when 2 then ::Dcc::V2.load_all!
14
+ when 3 then ::Dcc::V3.load_all!
15
+ else
16
+ raise ::Dcc::UnknownVersionError,
17
+ "Unsupported DCC version: #{version.inspect}"
18
+ end
19
+ @administrative_in_progress = new_administrative_data
20
+ @results_in_progress = []
21
+ @items_in_progress = []
22
+ end
23
+
24
+ attr_reader :version
25
+
26
+ # Top-level DSL methods. Each opens a nested container that captures
27
+ # subsequent setter calls via instance_eval.
28
+ def administrative_data(**attrs, &block)
29
+ apply_attrs(@administrative_in_progress, attrs)
30
+ instance_eval(&block) if block_given?
31
+ @administrative_in_progress
32
+ end
33
+
34
+ def core_data(**attrs, &block)
35
+ cd = new_core_data
36
+ apply_attrs(cd, attrs)
37
+ @administrative_in_progress.core_data = cd
38
+ instance_eval(&block) if block_given?
39
+ cd
40
+ end
41
+
42
+ def items(**attrs, &block)
43
+ items_obj = new_items
44
+ apply_attrs(items_obj, attrs)
45
+ @administrative_in_progress.items = items_obj
46
+ instance_eval(&block) if block_given?
47
+ items_obj
48
+ end
49
+
50
+ def item(**attrs, &block)
51
+ it = new_item
52
+ apply_attrs(it, attrs)
53
+ instance_eval(&block) if block_given?
54
+ (@items_in_progress ||= []) << it
55
+ # Wire into the open items container if present.
56
+ if @administrative_in_progress&.items
57
+ current = @administrative_in_progress.items.item
58
+ @administrative_in_progress.items.item = Array(current) + [it]
59
+ end
60
+ it
61
+ end
62
+
63
+ def measurement_results(**_attrs, &block)
64
+ instance_eval(&block) if block_given?
65
+ end
66
+
67
+ def measurement_result(**attrs, &block)
68
+ mr = new_measurement_result
69
+ apply_attrs(mr, attrs)
70
+ instance_eval(&block) if block_given?
71
+ @results_in_progress << mr
72
+ mr
73
+ end
74
+
75
+ # CoreData convenience setters
76
+ def unique_identifier(value)
77
+ ensure_core_data.unique_identifier = value
78
+ end
79
+
80
+ def country_code(value)
81
+ ensure_core_data.country_code_iso_3166_1 = value
82
+ end
83
+
84
+ def used_lang(value)
85
+ cd = ensure_core_data
86
+ cd.used_lang_code_iso_639_1 = Array(cd.used_lang_code_iso_639_1) + [value]
87
+ end
88
+
89
+ def mandatory_lang(value)
90
+ cd = ensure_core_data
91
+ cd.mandatory_lang_code_iso_639_1 = Array(cd.mandatory_lang_code_iso_639_1) + [value]
92
+ end
93
+
94
+ def begin_performance_date(value)
95
+ ensure_core_data.begin_performance_date = value
96
+ end
97
+
98
+ def end_performance_date(value)
99
+ ensure_core_data.end_performance_date = value
100
+ end
101
+
102
+ # @return [Dcc::V2::DigitalCalibrationCertificate, Dcc::V3::DigitalCalibrationCertificate]
103
+ def build
104
+ validate_required_sections!
105
+ dcc = new_digital_calibration_certificate
106
+ dcc.schema_version = @version == 2 ? "2.3.0" : "3.3.0"
107
+ dcc.administrative_data = @administrative_in_progress
108
+ dcc.measurement_results = new_measurement_results
109
+ dcc.measurement_results.measurement_result = @results_in_progress
110
+ dcc
111
+ end
112
+
113
+ private
114
+
115
+ def ensure_core_data
116
+ @administrative_in_progress.core_data ||= new_core_data
117
+ end
118
+
119
+ def validate_required_sections!
120
+ unless @administrative_in_progress&.core_data
121
+ raise ::Dcc::BuilderError,
122
+ "administrative_data.core_data is required"
123
+ end
124
+ return if @administrative_in_progress.items
125
+
126
+ raise ::Dcc::BuilderError,
127
+ "administrative_data.items is required"
128
+ end
129
+
130
+ def apply_attrs(target, attrs)
131
+ attrs.each do |k, v|
132
+ setter = :"#{k}="
133
+ target.public_send(setter, v) if Dcc::TypeGuards.has_attribute?(target, setter)
134
+ end
135
+ end
136
+
137
+ def version_module
138
+ @version == 2 ? ::Dcc::V2 : ::Dcc::V3
139
+ end
140
+
141
+ def new_digital_calibration_certificate
142
+ version_module::DigitalCalibrationCertificate.new
143
+ end
144
+
145
+ def new_administrative_data
146
+ version_module::AdministrativeData.new
147
+ end
148
+
149
+ def new_core_data
150
+ version_module::CoreData.new
151
+ end
152
+
153
+ def new_items
154
+ version_module::ItemList.new
155
+ end
156
+
157
+ def new_item
158
+ version_module::Item.new
159
+ end
160
+
161
+ def new_measurement_results
162
+ version_module::MeasurementResultList.new
163
+ end
164
+
165
+ def new_measurement_result
166
+ version_module::MeasurementResult.new
167
+ end
168
+ end
169
+ end
170
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ # `Dcc::Builder` provides a programmatic DSL for constructing DCC documents.
4
+ #
5
+ # @example
6
+ # dcc = Dcc.build(version: 3) do
7
+ # administrative_data do
8
+ # core_data do
9
+ # unique_identifier "urn:uuid:abc-123"
10
+ # country_code "DE"
11
+ # used_lang "en"
12
+ # mandatory_lang "en"
13
+ # end
14
+ # end
15
+ # measurement_results { }
16
+ # end
17
+ module Dcc
18
+ module Builder
19
+ autoload :Session, "dcc/builder/session"
20
+ autoload :Dsl, "dcc/builder/dsl"
21
+
22
+ class << self
23
+ # @param version [Integer, nil] major DCC version (default: 3).
24
+ # @yield [Dcc::Builder::Session] builder session.
25
+ # @return [Dcc::V2::DigitalCalibrationCertificate, Dcc::V3::DigitalCalibrationCertificate]
26
+ def call(version: 3, &block)
27
+ ::Dcc.load_all!
28
+ session = Session.new(version: version)
29
+ session.instance_eval(&block) if block_given?
30
+ session.build
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,149 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "thor"
4
+ require "tty-table"
5
+
6
+ # `Dcc::Cli::Cli` is the Thor-based command-line interface. Each subcommand
7
+ # (validate, convert, extract, signature, transform, inspect, diff, issue)
8
+ # corresponds to a feature service exposed by the gem.
9
+ module Dcc
10
+ module Cli
11
+ autoload :Formatters, "dcc/cli/formatters"
12
+
13
+ class Cli < Thor
14
+ package_name "dcc"
15
+
16
+ class << self
17
+ # Lazy-load the model contexts the first time a CLI command runs.
18
+ # This avoids autoload side effects when users just want the gem
19
+ # library (no CLI).
20
+ def ensure_loaded!
21
+ ::Dcc::V3.load_all!
22
+ ::Dcc::V2.load_all!
23
+ end
24
+ end
25
+
26
+ def self.exit_on_failure?
27
+ true
28
+ end
29
+
30
+ desc "validate SCHEMA FILE", "Validate a DCC XML against XSD, Schematron, or both"
31
+ long_desc <<~DESC
32
+ Validates the given DCC XML file.
33
+
34
+ Examples:
35
+ $ dcc validate xsd cert.xml
36
+ $ dcc validate schematron cert.xml
37
+ $ dcc validate all cert.xml
38
+ DESC
39
+ method_option :version, type: :string, default: "auto",
40
+ desc: "Schema version (e.g. '3.3.0', 'auto')"
41
+ method_option :format, type: :string, default: "text",
42
+ enum: %w[text json yaml]
43
+ def validate(schema, file)
44
+ Cli.ensure_loaded!
45
+ xml = File.read(file)
46
+ version = options[:version]
47
+ result =
48
+ case schema
49
+ when "xsd" then ::Dcc::Validate::Xsd.call(xml, version: version)
50
+ when "schematron" then ::Dcc::Validate::Schematron.call(Dcc.parse(xml))
51
+ when "all"
52
+ ::Dcc::Validate::Xsd.call(xml, version: version)
53
+ .merge(::Dcc::Validate::Schematron.call(Dcc.parse(xml)))
54
+ else
55
+ abort "Unknown validation target: #{schema} (expected xsd|schematron|all)"
56
+ end
57
+ ::Dcc::Cli::Formatters.print(result, format: options[:format])
58
+ exit(1) unless result.ok?
59
+ end
60
+
61
+ desc "convert FORMAT FILE", "Convert a DCC XML file to json / yaml / csv / html"
62
+ method_option :output, type: :string, banner: "PATH",
63
+ desc: "Write output to a file instead of stdout"
64
+ def convert(format, file)
65
+ Cli.ensure_loaded!
66
+ xml = File.read(file)
67
+ dcc = Dcc.parse(xml)
68
+ result =
69
+ case format
70
+ when "json" then ::Dcc::Convert::Json.call(dcc)
71
+ when "yaml" then ::Dcc::Convert::Yaml.call(dcc)
72
+ else
73
+ abort "Format not yet implemented: #{format}"
74
+ end
75
+ output = result.to_s
76
+ if options[:output]
77
+ File.write(options[:output], output)
78
+ else
79
+ $stdout.puts(output)
80
+ end
81
+ end
82
+
83
+ desc "extract TARGET FILE", "Extract embedded files or quantities from a DCC"
84
+ method_option :index, type: :numeric, desc: "Index of the file to extract"
85
+ method_option :output, type: :string, banner: "PATH",
86
+ desc: "Write extracted payload to PATH"
87
+ method_option :ring, type: :string,
88
+ enum: %w[administrativeData measurementResults comment document]
89
+ def extract(target, file)
90
+ Cli.ensure_loaded!
91
+ dcc = Dcc.parse(File.read(file))
92
+ case target
93
+ when "files"
94
+ files = ::Dcc::Extract::File.each(dcc)
95
+ files = files.select { |f| f.ring.to_s == options[:ring] } if options[:ring]
96
+ if options[:index]
97
+ f = files[options[:index].to_i] || abort("No file at index #{options[:index]}")
98
+ output_to(f.data, options[:output], f.file_name)
99
+ else
100
+ ::Dcc::Cli::Formatters.print_files(files)
101
+ end
102
+ else
103
+ abort "Unknown extract target: #{target}"
104
+ end
105
+ end
106
+
107
+ desc "inspect FILE", "Show a human-readable summary of a DCC"
108
+ method_option :format, type: :string, default: "text",
109
+ enum: %w[text json yaml]
110
+ def inspect(file)
111
+ Cli.ensure_loaded!
112
+ dcc = Dcc.parse(File.read(file))
113
+ report = ::Dcc::Inspect::Report.call(dcc)
114
+ ::Dcc::Cli::Formatters.print(report, format: options[:format])
115
+ end
116
+
117
+ desc "diff FILE1 FILE2", "Compare two DCC files structurally"
118
+ method_option :format, type: :string, default: "text",
119
+ enum: %w[text json]
120
+ def diff(file1, file2)
121
+ Cli.ensure_loaded!
122
+ dcc1 = Dcc.parse(File.read(file1))
123
+ dcc2 = Dcc.parse(File.read(file2))
124
+ diff = ::Dcc::Diff.call(dcc1, dcc2)
125
+ ::Dcc::Cli::Formatters.print(diff, format: options[:format])
126
+ end
127
+
128
+ desc "version", "Print the dcc gem version"
129
+ def version
130
+ puts "dcc #{::Dcc::VERSION}"
131
+ end
132
+
133
+ no_commands do
134
+ def output_to(payload, path, file_name)
135
+ if path
136
+ File.binwrite(path, payload)
137
+ say "Wrote #{payload.bytesize} bytes to #{path}"
138
+ elsif file_name
139
+ File.binwrite(file_name, payload)
140
+ say "Wrote #{payload.bytesize} bytes to #{file_name}"
141
+ else
142
+ $stdout.binmode
143
+ $stdout.write(payload)
144
+ end
145
+ end
146
+ end
147
+ end
148
+ end
149
+ end