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,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::Si::V1
4
+ class Real < CommonElements
5
+ include ::Dcc::Si::Base::Real
6
+ end
7
+ Configuration.register_model(Real, id: :real)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::Si::V1
4
+ class RealListXmlList < CommonElements
5
+ include ::Dcc::Si::Base::RealListXmlList
6
+ end
7
+ Configuration.register_model(RealListXmlList, id: :realListXMLList)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::Si::V1
4
+ class SiList < CommonElements
5
+ include ::Dcc::Si::Base::SiList
6
+ end
7
+ Configuration.register_model(SiList, id: :list)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::Si::V1
4
+ class StandardMU < CommonElements
5
+ include ::Dcc::Si::Base::StandardMU
6
+ end
7
+ Configuration.register_model(StandardMU, id: :standardMU)
8
+ end
data/lib/dcc/si/v1.rb ADDED
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ # `Dcc::Si::V1` hosts D-SI v1.x element wrappers registered in the
4
+ # `:dsi_v1` context. Mirrors the V2 structure but additionally supports
5
+ # the deprecated `expandedUnc` type that v2 replaced with `expandedMU`.
6
+ module Dcc
7
+ module Si
8
+ module V1
9
+ autoload :Configuration, "dcc/si/v1/configuration"
10
+ autoload :CommonElements, "dcc/si/v1/common_elements"
11
+ autoload :Namespace, "dcc/si/v1/namespace"
12
+
13
+ autoload :Real, "dcc/si/v1/real"
14
+ autoload :Complex, "dcc/si/v1/complex"
15
+ autoload :Constant, "dcc/si/v1/constant"
16
+ autoload :RealListXmlList, "dcc/si/v1/real_list_xml_list"
17
+ autoload :ComplexListXmlList, "dcc/si/v1/complex_list_xml_list"
18
+ autoload :Hybrid, "dcc/si/v1/hybrid"
19
+ autoload :SiList, "dcc/si/v1/si_list"
20
+ autoload :List, "dcc/si/v1/si_list"
21
+ autoload :StandardMU, "dcc/si/v1/standard_mu"
22
+ autoload :ExpandedMU, "dcc/si/v1/expanded_mu"
23
+ autoload :CoverageIntervalMU, "dcc/si/v1/coverage_interval_mu"
24
+ autoload :ExpandedUnc, "dcc/si/v1/expanded_unc"
25
+ autoload :ExpandedUncXmlList, "dcc/si/v1/expanded_unc_xml_list"
26
+ autoload :MeasurementUncertaintyUnivariate, "dcc/si/v1/measurement_uncertainty_univariate"
27
+
28
+ ROOT_ELEMENT_TAG = "real"
29
+
30
+ extend ::Dcc::VersionedParser
31
+
32
+ ELEMENT_CLASSES = %i[
33
+ Real Complex Constant
34
+ RealListXmlList ComplexListXmlList Hybrid SiList
35
+ StandardMU ExpandedMU CoverageIntervalMU
36
+ ExpandedUnc ExpandedUncXmlList MeasurementUncertaintyUnivariate
37
+ ].freeze
38
+
39
+ def self.load_all!
40
+ ELEMENT_CLASSES.each { |name| const_get(name) }
41
+ Configuration.populate_context!
42
+ true
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Si
5
+ module V2
6
+ class CommonElements < ::Dcc::Si::CommonElements
7
+ def self.lutaml_default_register
8
+ :dsi_v2
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::Si::V2
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::V2
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 V2
6
+ module Configuration
7
+ extend ::Dcc::ContextConfiguration
8
+
9
+ CONTEXT_ID = :dsi_v2
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::Si::V2
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::V2
4
+ class CoverageIntervalMU < CommonElements
5
+ include ::Dcc::Si::Base::CoverageIntervalMU
6
+ end
7
+ Configuration.register_model(CoverageIntervalMU, id: :coverageIntervalMU)
8
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ # XML-list variant of coverageIntervalMU.
4
+ module Dcc::Si::V2
5
+ class CoverageIntervalMUXMLList < CommonElements
6
+ attribute :value_standard_mu_xml_list, ::Dcc::Type::DecimalXmlList
7
+ attribute :interval_min_xml_list, ::Dcc::Type::DecimalXmlList
8
+ attribute :interval_max_xml_list, ::Dcc::Type::DecimalXmlList
9
+ attribute :coverage_probability_xml_list, :string
10
+ attribute :distribution_xml_list, :string
11
+
12
+ xml do
13
+ namespace ::Dcc::Namespace::Si
14
+ element "coverageIntervalMUXMLList"
15
+ ordered
16
+ map_element "valueStandardMUXMLList", to: :value_standard_mu_xml_list
17
+ map_element "intervalMinXMLList", to: :interval_min_xml_list
18
+ map_element "intervalMaxXMLList", to: :interval_max_xml_list
19
+ map_element "coverageProbabilityXMLList", to: :coverage_probability_xml_list
20
+ map_element "distributionXMLList", to: :distribution_xml_list
21
+ end
22
+ end
23
+ Configuration.register_model(CoverageIntervalMUXMLList, id: :coverageIntervalMUXMLList)
24
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::Si::V2
4
+ class ExpandedMU < CommonElements
5
+ include ::Dcc::Si::Base::ExpandedMU
6
+ end
7
+ Configuration.register_model(ExpandedMU, id: :expandedMU)
8
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ # XML-list variant of expandedMU. Stores space-separated decimals.
4
+ module Dcc::Si::V2
5
+ class ExpandedMUXMLList < CommonElements
6
+ attribute :value_expanded_mu_xml_list, ::Dcc::Type::DecimalXmlList
7
+ attribute :coverage_factor_xml_list, :string
8
+ attribute :coverage_probability_xml_list, :string
9
+ attribute :distribution_xml_list, :string
10
+
11
+ xml do
12
+ namespace ::Dcc::Namespace::Si
13
+ element "expandedMUXMLList"
14
+ ordered
15
+ map_element "valueExpandedMUXMLList", to: :value_expanded_mu_xml_list
16
+ map_element "coverageFactorXMLList", to: :coverage_factor_xml_list
17
+ map_element "coverageProbabilityXMLList", to: :coverage_probability_xml_list
18
+ map_element "distributionXMLList", to: :distribution_xml_list
19
+ end
20
+ end
21
+ Configuration.register_model(ExpandedMUXMLList, id: :expandedMUXMLList)
22
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::Si::V2
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::V2
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::V2
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 V2
6
+ Namespace = ::Dcc::Namespace::Si
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::Si::V2
4
+ class Real < CommonElements
5
+ include ::Dcc::Si::Base::Real
6
+ end
7
+ Configuration.register_model(Real, id: :real)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::Si::V2
4
+ class RealListXmlList < CommonElements
5
+ include ::Dcc::Si::Base::RealListXmlList
6
+ end
7
+ Configuration.register_model(RealListXmlList, id: :realListXMLList)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::Si::V2
4
+ class SiList < CommonElements
5
+ include ::Dcc::Si::Base::SiList
6
+ end
7
+ Configuration.register_model(SiList, id: :list)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc::Si::V2
4
+ class StandardMU < CommonElements
5
+ include ::Dcc::Si::Base::StandardMU
6
+ end
7
+ Configuration.register_model(StandardMU, id: :standardMU)
8
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ # XML-list variant of standard_mu. Stores space-separated decimals.
4
+ module Dcc::Si::V2
5
+ class StandardMUXMLList < CommonElements
6
+ attribute :value_standard_mu_xml_list, ::Dcc::Type::DecimalXmlList
7
+ attribute :distribution_xml_list, :string
8
+
9
+ xml do
10
+ namespace ::Dcc::Namespace::Si
11
+ element "standardMUXMLList"
12
+ ordered
13
+ map_element "valueStandardMUXMLList", to: :value_standard_mu_xml_list
14
+ map_element "distributionXMLList", to: :distribution_xml_list
15
+ end
16
+ end
17
+ Configuration.register_model(StandardMUXMLList, id: :standardMUXMLList)
18
+ end
data/lib/dcc/si/v2.rb ADDED
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ # `Dcc::Si::V2` hosts D-SI v2.x element wrappers registered in the `:dsi_v2`
4
+ # context. They share the same `lib/dcc/si/base/*.rb` mapping modules as V1
5
+ # but live in their own class hierarchy so the two versions can coexist.
6
+ module Dcc
7
+ module Si
8
+ module V2
9
+ autoload :Configuration, "dcc/si/v2/configuration"
10
+ autoload :CommonElements, "dcc/si/v2/common_elements"
11
+ autoload :Namespace, "dcc/si/v2/namespace"
12
+
13
+ autoload :Real, "dcc/si/v2/real"
14
+ autoload :Complex, "dcc/si/v2/complex"
15
+ autoload :Constant, "dcc/si/v2/constant"
16
+ autoload :RealListXmlList, "dcc/si/v2/real_list_xml_list"
17
+ autoload :ComplexListXmlList, "dcc/si/v2/complex_list_xml_list"
18
+ autoload :Hybrid, "dcc/si/v2/hybrid"
19
+ autoload :SiList, "dcc/si/v2/si_list"
20
+ autoload :StandardMU, "dcc/si/v2/standard_mu"
21
+ autoload :StandardMUXMLList, "dcc/si/v2/standard_mu_xml_list"
22
+ autoload :ExpandedMU, "dcc/si/v2/expanded_mu"
23
+ autoload :ExpandedMUXMLList, "dcc/si/v2/expanded_mu_xml_list"
24
+ autoload :CoverageIntervalMU, "dcc/si/v2/coverage_interval_mu"
25
+ autoload :CoverageIntervalMUXMLList, "dcc/si/v2/coverage_interval_mu_xml_list"
26
+ autoload :ExpandedUncXmlList, "dcc/si/v2/expanded_unc_xml_list"
27
+ autoload :MeasurementUncertaintyUnivariate, "dcc/si/v2/measurement_uncertainty_univariate"
28
+
29
+ ROOT_ELEMENT_TAG = "real"
30
+
31
+ extend ::Dcc::VersionedParser
32
+
33
+ ELEMENT_CLASSES = %i[
34
+ Real Complex Constant
35
+ RealListXmlList ComplexListXmlList Hybrid SiList
36
+ StandardMU StandardMUXMLList
37
+ ExpandedMU ExpandedMUXMLList
38
+ CoverageIntervalMU CoverageIntervalMUXMLList
39
+ ExpandedUncXmlList MeasurementUncertaintyUnivariate
40
+ ].freeze
41
+
42
+ def self.load_all!
43
+ ELEMENT_CLASSES.each { |name| const_get(name) }
44
+ Configuration.populate_context!
45
+ true
46
+ end
47
+ end
48
+ end
49
+ end
data/lib/dcc/si.rb ADDED
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ # `Dcc::Si` is the D-SI quantity sub-namespace. It hosts the per-major-version
4
+ # wrapper hierarchies (`Dcc::Si::V1`, `Dcc::Si::V2`) that model the D-SI
5
+ # schema. Each version has its own type registry and configuration, mirroring
6
+ # the DCC pattern.
7
+ module Dcc
8
+ module Si
9
+ SUPPORTED_VERSIONS = [1, 2].freeze
10
+ UNSPECIFIED_CONTEXT = ::Dcc::UNSPECIFIED_CONTEXT
11
+
12
+ autoload :Namespace, "dcc/si/namespace"
13
+ autoload :CommonElements, "dcc/si/common_elements"
14
+ autoload :Base, "dcc/si/base"
15
+ autoload :V1, "dcc/si/v1"
16
+ autoload :V2, "dcc/si/v2"
17
+
18
+ module_function
19
+
20
+ def parse(input, version: 2, context: UNSPECIFIED_CONTEXT, register: nil)
21
+ parser_for(version).parse(input, context: context, register: register)
22
+ end
23
+
24
+ def parser_for(version)
25
+ case version.to_i
26
+ when 1 then V1
27
+ when 2 then V2
28
+ else
29
+ raise ::Dcc::UnknownVersionError,
30
+ "Unsupported D-SI version: #{version.inspect} (expected 1 or 2)"
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Signature
5
+ # Outcome of a signature verification. Carries the verified certificate,
6
+ # validity flag, and the signed XML subtree (the only trustable part).
7
+ class Result
8
+ attr_reader :valid, :certificate_pem, :signed_xml
9
+
10
+ def initialize(valid:, certificate_pem: nil, signed_xml: nil)
11
+ @valid = valid
12
+ @certificate_pem = certificate_pem
13
+ @signed_xml = signed_xml
14
+ end
15
+
16
+ def valid?
17
+ !!@valid
18
+ end
19
+
20
+ def to_s
21
+ if valid?
22
+ "Signature valid#{certificate_pem ? " (cert: #{certificate_pem.lines.first&.strip})" : ''}"
23
+ else
24
+ "Signature INVALID"
25
+ end
26
+ end
27
+
28
+ def to_json(*_args)
29
+ require "json"
30
+ ::JSON.pretty_generate(
31
+ valid: valid?,
32
+ certificate_pem: certificate_pem,
33
+ signed_xml_length: signed_xml&.length,
34
+ )
35
+ end
36
+
37
+ def to_yaml(*_args)
38
+ require "yaml"
39
+ { valid: valid?, certificate_pem: certificate_pem }.to_yaml
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Signature
5
+ # `Dcc::Signature::Signer` wraps an enveloped XMLDSig signature over a
6
+ # DCC document using RSA-SHA-256. Requires the `xmldsig` gem.
7
+ module Signer
8
+ class << self
9
+ # @param xml_or_dcc [String, Lutaml::Model::Serializable] the DCC.
10
+ # @param cert_pem [String] PEM-encoded signing certificate.
11
+ # @param key_pem [String] PEM-encoded private key.
12
+ # @return [String] the signed XML document.
13
+ def call(xml_or_dcc, cert_pem:, key_pem:)
14
+ ensure_xmldsig!
15
+ xml = xml_or_dcc.is_a?(::String) ? xml_or_dcc : xml_or_dcc.to_xml
16
+ document = Xmldsig::XMLDoc.new(xml)
17
+ document.sign(
18
+ OpenSSL::PKey::RSA.new(key_pem),
19
+ cert_pem,
20
+ ).to_xml
21
+ end
22
+
23
+ private
24
+
25
+ def ensure_xmldsig!
26
+ return if defined?(::Xmldsig)
27
+
28
+ require "xmldsig"
29
+ rescue ::LoadError
30
+ raise ::Dcc::MissingDependencyError.new(gem_name: "xmldsig", feature: "Dcc::Signature"),
31
+ "xmldsig is required for XMLDSig signing"
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Signature
5
+ # `Dcc::Signature::Verifier` validates a signed DCC against a CA
6
+ # certificate. The signed XML subtree is extracted so callers can
7
+ # extract the trustworthy content.
8
+ module Verifier
9
+ class << self
10
+ # @param xml [String] signed DCC XML.
11
+ # @param ca_cert_pem [String] PEM-encoded CA certificate.
12
+ # @return [Dcc::Signature::Result]
13
+ def call(xml, ca_cert_pem:)
14
+ ensure_xmldsig!
15
+ document = Xmldsig::XMLDoc.new(xml)
16
+ signed_xml = nil
17
+ is_valid = document.validate(ca_cert_pem) do |signed_node|
18
+ signed_xml = signed_node.to_xml
19
+ true
20
+ end
21
+ ::Dcc::Signature::Result.new(
22
+ valid: is_valid,
23
+ certificate_pem: ca_cert_pem,
24
+ signed_xml: signed_xml,
25
+ )
26
+ end
27
+
28
+ private
29
+
30
+ def ensure_xmldsig!
31
+ return if defined?(::Xmldsig)
32
+
33
+ require "xmldsig"
34
+ rescue ::LoadError
35
+ raise ::Dcc::MissingDependencyError.new(gem_name: "xmldsig", feature: "Dcc::Signature"),
36
+ "xmldsig is required for XMLDSig verification"
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ # `Dcc::Signature` provides XMLDSig sign/verify using the `xmldsig` gem as
4
+ # a soft dependency. If the gem is not installed, attempting to use the
5
+ # signer or verifier raises `Dcc::MissingDependencyError` with installation
6
+ # instructions.
7
+ module Dcc
8
+ module Signature
9
+ autoload :Signer, "dcc/signature/signer"
10
+ autoload :Verifier, "dcc/signature/verifier"
11
+ autoload :Result, "dcc/signature/result"
12
+ end
13
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Transform
5
+ # Output of an XSLT transform.
6
+ class Result
7
+ attr_reader :payload, :engine
8
+
9
+ def initialize(payload:, engine:)
10
+ @payload = payload
11
+ @engine = engine
12
+ end
13
+
14
+ def to_s
15
+ @payload
16
+ end
17
+
18
+ def to_json(*_args)
19
+ require "json"
20
+ ::JSON.pretty_generate(engine: @engine, payload: @payload)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "open3"
4
+
5
+ module Dcc
6
+ module Transform
7
+ # `Dcc::Transform::Xslt` applies an XSLT stylesheet to a DCC XML document.
8
+ #
9
+ # Nokogiri is OFFICIALLY banned outside validation, so we shell out to
10
+ # the system `xsltproc` (libxslt) for XSLT 1.0 transforms. For XSLT
11
+ # 2.0/3.0, set `ENV["SAXON_JAR"]` to point at saxon-he.jar.
12
+ module Xslt
13
+ class << self
14
+ # @param xml [String, Lutaml::Model::Serializable]
15
+ # @param stylesheet [String] path to XSLT file or raw XSLT.
16
+ # @param engine [Symbol] :xsltproc (default) or :saxon.
17
+ # @return [Dcc::Transform::Result]
18
+ def call(xml, stylesheet, engine: :xsltproc)
19
+ xml_string = xml.is_a?(::String) ? xml : xml.to_xml
20
+ output = case engine
21
+ when :xsltproc then run_xsltproc(xml_string, stylesheet)
22
+ when :saxon then run_saxon(xml_string, stylesheet)
23
+ else
24
+ raise ::ArgumentError, "unknown XSLT engine: #{engine.inspect}"
25
+ end
26
+ ::Dcc::Transform::Result.new(payload: output, engine: engine)
27
+ end
28
+
29
+ private
30
+
31
+ def run_xsltproc(xml, stylesheet)
32
+ ensure_tool!("xsltproc")
33
+ xsl_path = stylesheet_path(stylesheet)
34
+ out, status = ::Open3.capture2("xsltproc", xsl_path, "-", stdin_data: xml)
35
+ raise ::Dcc::TransformError, "xsltproc failed: #{status}" unless status.success?
36
+
37
+ out
38
+ end
39
+
40
+ def run_saxon(xml, stylesheet)
41
+ jar = ENV["SAXON_JAR"]
42
+ raise ::Dcc::MissingDependencyError.new(gem_name: "saxon-he",
43
+ feature: "XSLT 2.0/3.0"),
44
+ "SAXON_JAR env var is required for the :saxon engine" unless jar
45
+
46
+ xsl_path = stylesheet_path(stylesheet)
47
+ cmd = ["java", "-jar", jar, "-s:-", "-xsl:#{xsl_path}"]
48
+ out, status = ::Open3.capture2(*cmd, stdin_data: xml)
49
+ raise ::Dcc::TransformError, "saxon failed: #{status}" unless status.success?
50
+
51
+ out
52
+ end
53
+
54
+ def stylesheet_path(stylesheet)
55
+ return stylesheet if File.exist?(stylesheet)
56
+
57
+ Tempfile.create(["dcc-transform", ".xsl"]) do |f|
58
+ f.write(stylesheet)
59
+ f.path
60
+ end
61
+ end
62
+
63
+ def ensure_tool!(name)
64
+ return if system("which #{name} > /dev/null 2>&1")
65
+
66
+ raise ::Dcc::MissingDependencyError.new(gem_name: name, feature: "Dcc::Transform"),
67
+ "#{name} CLI not available on PATH"
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ # `Dcc::Transform` provides XSLT transformations. We cannot use Nokogiri
4
+ # for this per project rule (only validation may touch Nokogiri); instead
5
+ # we shell out to the system `xsltproc` CLI for XSLT 1.0, or to
6
+ # `java -jar saxon-he.jar` for XSLT 2.0/3.0 when SAXON_JAR is set.
7
+ module Dcc
8
+ module Transform
9
+ autoload :Xslt, "dcc/transform/xslt"
10
+ autoload :Result, "dcc/transform/result"
11
+ end
12
+ end