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
data/lib/dcc/server.rb ADDED
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ # `Dcc::Server` provides an optional Rack/Sinatra REST API mirroring PTB's
4
+ # dcclib REST endpoints. Soft-depends on `sinatra`; raises
5
+ # `Dcc::MissingDependencyError` if not installed.
6
+ module Dcc
7
+ module Server
8
+ autoload :App, "dcc/server/app"
9
+ autoload :Storage, "dcc/server/storage"
10
+
11
+ # Attempt to load sinatra to detect availability.
12
+ def self.available?
13
+ return @available unless @available.nil?
14
+
15
+ begin
16
+ require "sinatra/base"
17
+ @available = true
18
+ rescue ::LoadError
19
+ @available = false
20
+ end
21
+ @available
22
+ end
23
+
24
+ # Raise a friendly error if Sinatra is missing.
25
+ def self.ensure_available!
26
+ return if available?
27
+
28
+ raise ::Dcc::MissingDependencyError.new(gem_name: "sinatra",
29
+ feature: "Dcc::Server REST API"),
30
+ "sinatra is required for the REST API"
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Si
5
+ module Base
6
+ # `si:complexQuantityType` — complex number in Cartesian or polar form.
7
+ module Complex
8
+ def self.included(klass)
9
+ klass.class_eval do
10
+ attribute :id, :string
11
+ attribute :ref_type, :string
12
+ attribute :label, :string
13
+ attribute :value_real, :string
14
+ attribute :value_imag, :string
15
+ attribute :value_magnitude, :string
16
+ attribute :value_phase, :string
17
+ attribute :unit, ::Dcc::Type::SiUnit
18
+ attribute :unit_phase, :string
19
+ attribute :significant_digit, :integer
20
+ attribute :date_time, :date_time
21
+
22
+ xml do
23
+ namespace ::Dcc::Namespace::Si
24
+ element "complex"
25
+ ordered
26
+ map_attribute "id", to: :id
27
+ map_attribute "refType", to: :ref_type
28
+ map_element "label", to: :label
29
+ map_element "valueReal", to: :value_real
30
+ map_element "valueImag", to: :value_imag
31
+ map_element "valueMagnitude", to: :value_magnitude
32
+ map_element "valuePhase", to: :value_phase
33
+ map_element "unit", to: :unit
34
+ map_element "unitPhase", to: :unit_phase
35
+ map_element "significantDigit", to: :significant_digit
36
+ map_element "dateTime", to: :date_time
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Si
5
+ module Base
6
+ # `si:complexListXMLListType` — compact list of complex quantities.
7
+ module ComplexListXmlList
8
+ def self.included(klass)
9
+ klass.class_eval do
10
+ attribute :id, :string
11
+ attribute :ref_type, :string
12
+ attribute :label_xml_list, :string
13
+ attribute :value_real_xml_list, ::Dcc::Type::DecimalXmlList
14
+ attribute :value_imag_xml_list, ::Dcc::Type::DecimalXmlList
15
+ attribute :value_magnitude_xml_list, ::Dcc::Type::DecimalXmlList
16
+ attribute :value_phase_xml_list, ::Dcc::Type::DecimalXmlList
17
+ attribute :unit_xml_list, :string
18
+ attribute :unit_phase_xml_list, :string
19
+
20
+ xml do
21
+ namespace ::Dcc::Namespace::Si
22
+ element "complexListXMLList"
23
+ ordered
24
+ map_attribute "id", to: :id
25
+ map_attribute "refType", to: :ref_type
26
+ map_element "labelXMLList", to: :label_xml_list
27
+ map_element "valueRealXMLList", to: :value_real_xml_list
28
+ map_element "valueImagXMLList", to: :value_imag_xml_list
29
+ map_element "valueMagnitudeXMLList", to: :value_magnitude_xml_list
30
+ map_element "valuePhaseXMLList", to: :value_phase_xml_list
31
+ map_element "unitXMLList", to: :unit_xml_list
32
+ map_element "unitPhaseXMLList", to: :unit_phase_xml_list
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Si
5
+ module Base
6
+ # `si:constantQuantityType` — physical or mathematical constant.
7
+ module Constant
8
+ def self.included(klass)
9
+ klass.class_eval do
10
+ attribute :id, :string
11
+ attribute :ref_type, :string
12
+ attribute :label, :string
13
+ attribute :value, :string
14
+ attribute :unit, ::Dcc::Type::SiUnit
15
+ attribute :significant_digit, :integer
16
+ attribute :date_time, :date_time
17
+ attribute :value_standard_mu, :string
18
+ attribute :distribution, :string
19
+
20
+ xml do
21
+ namespace ::Dcc::Namespace::Si
22
+ element "constant"
23
+ ordered
24
+ map_attribute "id", to: :id
25
+ map_attribute "refType", to: :ref_type
26
+ map_element "label", to: :label
27
+ map_element "value", to: :value
28
+ map_element "unit", to: :unit
29
+ map_element "significantDigit", to: :significant_digit
30
+ map_element "dateTime", to: :date_time
31
+ map_element "valueStandardMU", to: :value_standard_mu
32
+ map_element "distribution", to: :distribution
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Si
5
+ module Base
6
+ # `si:coverageIntervalMUType` — coverage interval uncertainty.
7
+ module CoverageIntervalMU
8
+ def self.included(klass)
9
+ klass.class_eval do
10
+ attribute :value_standard_mu, :string
11
+ attribute :interval_min, :string
12
+ attribute :interval_max, :string
13
+ attribute :coverage_probability, :string
14
+ attribute :distribution, :string
15
+
16
+ xml do
17
+ namespace ::Dcc::Namespace::Si
18
+ element "coverageIntervalMU"
19
+ ordered
20
+ map_element "valueStandardMU", to: :value_standard_mu
21
+ map_element "intervalMin", to: :interval_min
22
+ map_element "intervalMax", to: :interval_max
23
+ map_element "coverageProbability", to: :coverage_probability
24
+ map_element "distribution", to: :distribution
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Si
5
+ module Base
6
+ # `si:expandedMUType` — expanded measurement uncertainty (k × σ).
7
+ module ExpandedMU
8
+ def self.included(klass)
9
+ klass.class_eval do
10
+ attribute :value_expanded_mu, :string
11
+ attribute :coverage_factor, :string
12
+ attribute :coverage_probability, :string
13
+ attribute :distribution, :string
14
+
15
+ xml do
16
+ namespace ::Dcc::Namespace::Si
17
+ element "expandedMU"
18
+ ordered
19
+ map_element "valueExpandedMU", to: :value_expanded_mu
20
+ map_element "coverageFactor", to: :coverage_factor
21
+ map_element "coverageProbability", to: :coverage_probability
22
+ map_element "distribution", to: :distribution
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Si
5
+ module Base
6
+ # `si:expandedUncXMLListType` — compact expanded uncertainty paired
7
+ # with a `realListXMLList`. Used in PTB's valid.xml.
8
+ module ExpandedUncXmlList
9
+ def self.included(klass)
10
+ klass.class_eval do
11
+ attribute :uncertainty_xml_list, ::Dcc::Type::DecimalXmlList
12
+ attribute :coverage_factor_xml_list, :string
13
+ attribute :coverage_probability_xml_list, :string
14
+ attribute :distribution_xml_list, :string
15
+
16
+ xml do
17
+ namespace ::Dcc::Namespace::Si
18
+ element "expandedUncXMLList"
19
+ ordered
20
+ map_element "uncertaintyXMLList", to: :uncertainty_xml_list
21
+ map_element "coverageFactorXMLList", to: :coverage_factor_xml_list
22
+ map_element "coverageProbabilityXMLList", to: :coverage_probability_xml_list
23
+ map_element "distributionXMLList", to: :distribution_xml_list
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Si
5
+ module Base
6
+ # `si:hybridType` — multi-unit adapter. Wraps one or more quantity
7
+ # representations (real, realListXMLList, complex, etc.) that express
8
+ # the same measurand in different units. At least one SI unit is
9
+ # required per the XSD.
10
+ module Hybrid
11
+ def self.included(klass)
12
+ klass.class_eval do
13
+ attribute :id, :string
14
+ attribute :ref_type, :string
15
+ attribute :label, :string
16
+ attribute :quantity_type, :string
17
+ attribute :real, :real, collection: true
18
+ attribute :complex, :complex, collection: true
19
+ attribute :constant, :constant, collection: true
20
+ attribute :real_list_xml_list, :realListXMLList, collection: true
21
+ attribute :complex_list_xml_list, :complexListXMLList, collection: true
22
+
23
+ xml do
24
+ namespace ::Dcc::Namespace::Si
25
+ element "hybrid"
26
+ ordered
27
+ map_attribute "id", to: :id
28
+ map_attribute "refType", to: :ref_type
29
+ map_element "label", to: :label
30
+ map_element "quantityType", to: :quantity_type
31
+ map_element "real", to: :real
32
+ map_element "complex", to: :complex
33
+ map_element "constant", to: :constant
34
+ map_element "realListXMLList", to: :real_list_xml_list
35
+ map_element "complexListXMLList", to: :complex_list_xml_list
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Si
5
+ module Base
6
+ # `si:measurementUncertaintyUnivariateType` — choice of standardMU /
7
+ # expandedMU / coverageIntervalMU. Modeled as three optional attributes.
8
+ module MeasurementUncertaintyUnivariate
9
+ def self.included(klass)
10
+ klass.class_eval do
11
+ attribute :standard_mu, :standardMU
12
+ attribute :expanded_mu, :expandedMU
13
+ attribute :coverage_interval_mu, :coverageIntervalMU
14
+
15
+ xml do
16
+ namespace ::Dcc::Namespace::Si
17
+ element "measurementUncertaintyUnivariate"
18
+ ordered
19
+ map_element "standardMU", to: :standard_mu
20
+ map_element "expandedMU", to: :expanded_mu
21
+ map_element "coverageIntervalMU", to: :coverage_interval_mu
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Si
5
+ module Base
6
+ # `si:realQuantityType` — single real measurement quantity with
7
+ # optional univariate uncertainty.
8
+ #
9
+ # Wire format:
10
+ # <si:real>
11
+ # <si:label>...</si:label>
12
+ # <si:value>42.0</si:value>
13
+ # <si:unit>\kelvin</si:unit>
14
+ # <si:measurementUncertaintyUnivariate>
15
+ # <si:expandedMU>...</si:expandedMU>
16
+ # </si:measurementUncertaintyUnivariate>
17
+ # </si:real>
18
+ module Real
19
+ def self.included(klass)
20
+ klass.class_eval do
21
+ attribute :id, :string
22
+ attribute :ref_type, :string
23
+ attribute :label, :string
24
+ attribute :value, :string
25
+ attribute :unit, ::Dcc::Type::SiUnit
26
+ attribute :significant_digit, :integer
27
+ attribute :date_time, :date_time
28
+ attribute :measurement_uncertainty_univariate, :measurementUncertaintyUnivariate
29
+
30
+ xml do
31
+ namespace ::Dcc::Namespace::Si
32
+ element "real"
33
+ ordered
34
+ map_attribute "id", to: :id
35
+ map_attribute "refType", to: :ref_type
36
+ map_element "label", to: :label
37
+ map_element "value", to: :value
38
+ map_element "unit", to: :unit
39
+ map_element "significantDigit", to: :significant_digit
40
+ map_element "dateTime", to: :date_time
41
+ map_element "measurementUncertaintyUnivariate", to: :measurement_uncertainty_univariate
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Si
5
+ module Base
6
+ # `si:realListXMLListType` — compact space-separated list of real
7
+ # measurement quantities. Each component (values, units, uncertainty)
8
+ # is itself a space-separated XML list.
9
+ module RealListXmlList
10
+ def self.included(klass)
11
+ klass.class_eval do
12
+ attribute :id, :string
13
+ attribute :ref_type, :string
14
+ attribute :label_xml_list, :string
15
+ attribute :quantity_type_xml_list, :string
16
+ attribute :value_xml_list, ::Dcc::Type::DecimalXmlList
17
+ attribute :unit_xml_list, :string
18
+ attribute :significant_digit_xml_list, :string
19
+ attribute :date_time_xml_list, :string
20
+ attribute :expanded_unc_xml_list, :expandedUncXMLList
21
+ attribute :standard_mu_xml_list, :standardMUXMLList
22
+ attribute :coverage_interval_mu_xml_list, :coverageIntervalMUXMLList
23
+
24
+ xml do
25
+ namespace ::Dcc::Namespace::Si
26
+ element "realListXMLList"
27
+ ordered
28
+ map_attribute "id", to: :id
29
+ map_attribute "refType", to: :ref_type
30
+ map_element "labelXMLList", to: :label_xml_list
31
+ map_element "quantityTypeXMLList", to: :quantity_type_xml_list
32
+ map_element "valueXMLList", to: :value_xml_list
33
+ map_element "unitXMLList", to: :unit_xml_list
34
+ map_element "significantDigitXMLList", to: :significant_digit_xml_list
35
+ map_element "dateTimeXMLList", to: :date_time_xml_list
36
+ map_element "expandedUncXMLList", to: :expanded_unc_xml_list
37
+ map_element "standardMUXMLList", to: :standard_mu_xml_list
38
+ map_element "coverageIntervalMUXMLList", to: :coverage_interval_mu_xml_list
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Si
5
+ module Base
6
+ # `si:listType` — recursive list container for nested quantity lists.
7
+ module SiList
8
+ def self.included(klass)
9
+ klass.class_eval do
10
+ attribute :id, :string
11
+ attribute :ref_type, :string
12
+ attribute :label, :string
13
+ attribute :date_time, :date_time
14
+ attribute :real_list, :real, collection: true
15
+ attribute :real_list_xml_list, :realListXMLList, collection: true
16
+ attribute :complex_list_xml_list, :complexListXMLList, collection: true
17
+ attribute :list, :list, collection: true
18
+
19
+ xml do
20
+ namespace ::Dcc::Namespace::Si
21
+ element "list"
22
+ ordered
23
+ map_attribute "id", to: :id
24
+ map_attribute "refType", to: :ref_type
25
+ map_element "label", to: :label
26
+ map_element "dateTime", to: :date_time
27
+ map_element "realList", to: :real_list
28
+ map_element "realListXMLList", to: :real_list_xml_list
29
+ map_element "complexListXMLList", to: :complex_list_xml_list
30
+ map_element "list", to: :list
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Si
5
+ module Base
6
+ # `si:standardMUType` — standard measurement uncertainty (1σ).
7
+ module StandardMU
8
+ def self.included(klass)
9
+ klass.class_eval do
10
+ attribute :value_standard_mu, :string
11
+ attribute :distribution, :string
12
+
13
+ xml do
14
+ namespace ::Dcc::Namespace::Si
15
+ element "standardMU"
16
+ ordered
17
+ map_element "valueStandardMU", to: :value_standard_mu
18
+ map_element "distribution", to: :distribution
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ # `Dcc::Si::Base` hosts version-agnostic XML mapping modules for every D-SI
4
+ # element type. Mirrors the `Dcc::Base` pattern: each module uses
5
+ # `self.included(klass)` with `klass.class_eval` to inject attributes and
6
+ # the `xml do ... end` mapping block.
7
+ module Dcc
8
+ module Si
9
+ module Base
10
+ autoload :Real, "dcc/si/base/real"
11
+ autoload :Complex, "dcc/si/base/complex"
12
+ autoload :Constant, "dcc/si/base/constant"
13
+ autoload :RealListXmlList, "dcc/si/base/real_list_xml_list"
14
+ autoload :ComplexListXmlList, "dcc/si/base/complex_list_xml_list"
15
+ autoload :Hybrid, "dcc/si/base/hybrid"
16
+ autoload :SiList, "dcc/si/base/si_list"
17
+ autoload :StandardMU, "dcc/si/base/standard_mu"
18
+ autoload :ExpandedMU, "dcc/si/base/expanded_mu"
19
+ autoload :CoverageIntervalMU, "dcc/si/base/coverage_interval_mu"
20
+ autoload :ExpandedUncXmlList, "dcc/si/base/expanded_unc_xml_list"
21
+ autoload :MeasurementUncertaintyUnivariate, "dcc/si/base/measurement_uncertainty_univariate"
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Si
5
+ # Base class for D-SI element wrappers. Subclassed per version with the
6
+ # appropriate `lutaml_default_register`.
7
+ class CommonElements < Lutaml::Model::Serializable
8
+ def self.lutaml_default_register
9
+ :dsi_v2
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Si
5
+ Namespace = ::Dcc::Namespace::Si
6
+ end
7
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Si
5
+ module V1
6
+ class CommonElements < ::Dcc::Si::CommonElements
7
+ def self.lutaml_default_register
8
+ :dsi_v1
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::Si::V1
4
+ class Complex < CommonElements
5
+ include ::Dcc::Si::Base::Complex
6
+ end
7
+ Configuration.register_model(Complex, id: :complex)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::Si::V1
4
+ class ComplexListXmlList < CommonElements
5
+ include ::Dcc::Si::Base::ComplexListXmlList
6
+ end
7
+ Configuration.register_model(ComplexListXmlList, id: :complexListXMLList)
8
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Si
5
+ module V1
6
+ module Configuration
7
+ extend ::Dcc::ContextConfiguration
8
+
9
+ CONTEXT_ID = :dsi_v1
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::Si::V1
4
+ class Constant < CommonElements
5
+ include ::Dcc::Si::Base::Constant
6
+ end
7
+ Configuration.register_model(Constant, id: :constant)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::Si::V1
4
+ class CoverageIntervalMU < CommonElements
5
+ include ::Dcc::Si::Base::CoverageIntervalMU
6
+ end
7
+ Configuration.register_model(CoverageIntervalMU, id: :coverageIntervalMU)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::Si::V1
4
+ class ExpandedMU < CommonElements
5
+ include ::Dcc::Si::Base::ExpandedMU
6
+ end
7
+ Configuration.register_model(ExpandedMU, id: :expandedMU)
8
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::Si::V1
4
+ # Deprecated v1 expandedUnc type — superseded by expandedMU in v2.
5
+ # Kept so old fixtures parse without losing data.
6
+ class ExpandedUnc < CommonElements
7
+ attribute :uncertainty, :string
8
+ attribute :coverage_factor, :string
9
+ attribute :coverage_probability, :string
10
+ attribute :distribution, :string
11
+
12
+ xml do
13
+ namespace ::Dcc::Namespace::Si
14
+ element "expandedUnc"
15
+ ordered
16
+ map_element "uncertainty", to: :uncertainty
17
+ map_element "coverageFactor", to: :coverage_factor
18
+ map_element "coverageProbability", to: :coverage_probability
19
+ map_element "distribution", to: :distribution
20
+ end
21
+ end
22
+ Configuration.register_model(ExpandedUnc, id: :expandedUnc)
23
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::Si::V1
4
+ class ExpandedUncXmlList < CommonElements
5
+ include ::Dcc::Si::Base::ExpandedUncXmlList
6
+ end
7
+ Configuration.register_model(ExpandedUncXmlList, id: :expandedUncXMLList)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::Si::V1
4
+ class Hybrid < CommonElements
5
+ include ::Dcc::Si::Base::Hybrid
6
+ end
7
+ Configuration.register_model(Hybrid, id: :hybrid)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::Si::V1
4
+ class MeasurementUncertaintyUnivariate < CommonElements
5
+ include ::Dcc::Si::Base::MeasurementUncertaintyUnivariate
6
+ end
7
+ Configuration.register_model(MeasurementUncertaintyUnivariate, id: :measurementUncertaintyUnivariate)
8
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Si
5
+ module V1
6
+ Namespace = ::Dcc::Namespace::Si
7
+ end
8
+ end
9
+ end