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,312 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+
3
+ <!-- Schema for XML Signatures
4
+ http://www.w3.org/2000/09/xmldsig#
5
+ $Revision: 1.2 $ on $Date: 2013-04-16 12:48:49 $ by $Author: denis $
6
+
7
+ Copyright 2001 The Internet Society and W3C (Massachusetts Institute
8
+ of Technology, Institut National de Recherche en Informatique et en
9
+ Automatique, Keio University). All Rights Reserved.
10
+ http://www.w3.org/Consortium/Legal/
11
+
12
+ This document is governed by the W3C Software License [1] as described
13
+ in the FAQ [2].
14
+
15
+ [1] http://www.w3.org/Consortium/Legal/copyright-software-19980720
16
+ [2] http://www.w3.org/Consortium/Legal/IPR-FAQ-20000620.html#DTD
17
+
18
+ Modification by PTB:
19
+ - Removed lines 2 to 10 from W3C XMLDSig-Core scheme to avoid the use of DTD due to security risk.
20
+ -->
21
+
22
+
23
+ <schema xmlns="http://www.w3.org/2001/XMLSchema"
24
+ xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
25
+ targetNamespace="http://www.w3.org/2000/09/xmldsig#"
26
+ version="0.1" elementFormDefault="qualified">
27
+
28
+ <!-- Basic Types Defined for Signatures -->
29
+
30
+ <simpleType name="CryptoBinary">
31
+ <restriction base="base64Binary">
32
+ </restriction>
33
+ </simpleType>
34
+
35
+ <!-- Start Signature -->
36
+
37
+ <element name="Signature" type="ds:SignatureType"/>
38
+ <complexType name="SignatureType">
39
+ <sequence>
40
+ <element ref="ds:SignedInfo"/>
41
+ <element ref="ds:SignatureValue"/>
42
+ <element ref="ds:KeyInfo" minOccurs="0"/>
43
+ <element ref="ds:Object" minOccurs="0" maxOccurs="unbounded"/>
44
+ </sequence>
45
+ <attribute name="Id" type="ID" use="optional"/>
46
+ </complexType>
47
+
48
+ <element name="SignatureValue" type="ds:SignatureValueType"/>
49
+ <complexType name="SignatureValueType">
50
+ <simpleContent>
51
+ <extension base="base64Binary">
52
+ <attribute name="Id" type="ID" use="optional"/>
53
+ </extension>
54
+ </simpleContent>
55
+ </complexType>
56
+
57
+ <!-- Start SignedInfo -->
58
+
59
+ <element name="SignedInfo" type="ds:SignedInfoType"/>
60
+ <complexType name="SignedInfoType">
61
+ <sequence>
62
+ <element ref="ds:CanonicalizationMethod"/>
63
+ <element ref="ds:SignatureMethod"/>
64
+ <element ref="ds:Reference" maxOccurs="unbounded"/>
65
+ </sequence>
66
+ <attribute name="Id" type="ID" use="optional"/>
67
+ </complexType>
68
+
69
+ <element name="CanonicalizationMethod" type="ds:CanonicalizationMethodType"/>
70
+ <complexType name="CanonicalizationMethodType" mixed="true">
71
+ <sequence>
72
+ <any namespace="##any" minOccurs="0" maxOccurs="unbounded"/>
73
+ <!-- (0,unbounded) elements from (1,1) namespace -->
74
+ </sequence>
75
+ <attribute name="Algorithm" type="anyURI" use="required"/>
76
+ </complexType>
77
+
78
+ <element name="SignatureMethod" type="ds:SignatureMethodType"/>
79
+ <complexType name="SignatureMethodType" mixed="true">
80
+ <sequence>
81
+ <element name="HMACOutputLength" minOccurs="0" type="ds:HMACOutputLengthType"/>
82
+ <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
83
+ <!-- (0,unbounded) elements from (1,1) external namespace -->
84
+ </sequence>
85
+ <attribute name="Algorithm" type="anyURI" use="required"/>
86
+ </complexType>
87
+
88
+ <!-- Start Reference -->
89
+
90
+ <element name="Reference" type="ds:ReferenceType"/>
91
+ <complexType name="ReferenceType">
92
+ <sequence>
93
+ <element ref="ds:Transforms" minOccurs="0"/>
94
+ <element ref="ds:DigestMethod"/>
95
+ <element ref="ds:DigestValue"/>
96
+ </sequence>
97
+ <attribute name="Id" type="ID" use="optional"/>
98
+ <attribute name="URI" type="anyURI" use="optional"/>
99
+ <attribute name="Type" type="anyURI" use="optional"/>
100
+ </complexType>
101
+
102
+ <element name="Transforms" type="ds:TransformsType"/>
103
+ <complexType name="TransformsType">
104
+ <sequence>
105
+ <element ref="ds:Transform" maxOccurs="unbounded"/>
106
+ </sequence>
107
+ </complexType>
108
+
109
+ <element name="Transform" type="ds:TransformType"/>
110
+ <complexType name="TransformType" mixed="true">
111
+ <choice minOccurs="0" maxOccurs="unbounded">
112
+ <any namespace="##other" processContents="lax"/>
113
+ <!-- (1,1) elements from (0,unbounded) namespaces -->
114
+ <element name="XPath" type="string"/>
115
+ </choice>
116
+ <attribute name="Algorithm" type="anyURI" use="required"/>
117
+ </complexType>
118
+
119
+ <!-- End Reference -->
120
+
121
+ <element name="DigestMethod" type="ds:DigestMethodType"/>
122
+ <complexType name="DigestMethodType" mixed="true">
123
+ <sequence>
124
+ <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
125
+ </sequence>
126
+ <attribute name="Algorithm" type="anyURI" use="required"/>
127
+ </complexType>
128
+
129
+ <element name="DigestValue" type="ds:DigestValueType"/>
130
+ <simpleType name="DigestValueType">
131
+ <restriction base="base64Binary"/>
132
+ </simpleType>
133
+
134
+ <!-- End SignedInfo -->
135
+
136
+ <!-- Start KeyInfo -->
137
+
138
+ <element name="KeyInfo" type="ds:KeyInfoType"/>
139
+ <complexType name="KeyInfoType" mixed="true">
140
+ <choice maxOccurs="unbounded">
141
+ <element ref="ds:KeyName"/>
142
+ <element ref="ds:KeyValue"/>
143
+ <element ref="ds:RetrievalMethod"/>
144
+ <element ref="ds:X509Data"/>
145
+ <element ref="ds:PGPData"/>
146
+ <element ref="ds:SPKIData"/>
147
+ <element ref="ds:MgmtData"/>
148
+ <any processContents="lax" namespace="##other"/>
149
+ <!-- (1,1) elements from (0,unbounded) namespaces -->
150
+ </choice>
151
+ <attribute name="Id" type="ID" use="optional"/>
152
+ </complexType>
153
+
154
+ <element name="KeyName" type="string"/>
155
+ <element name="MgmtData" type="string"/>
156
+
157
+ <element name="KeyValue" type="ds:KeyValueType"/>
158
+ <complexType name="KeyValueType" mixed="true">
159
+ <choice>
160
+ <element ref="ds:DSAKeyValue"/>
161
+ <element ref="ds:RSAKeyValue"/>
162
+ <any namespace="##other" processContents="lax"/>
163
+ </choice>
164
+ </complexType>
165
+
166
+ <element name="RetrievalMethod" type="ds:RetrievalMethodType"/>
167
+ <complexType name="RetrievalMethodType">
168
+ <sequence>
169
+ <element ref="ds:Transforms" minOccurs="0"/>
170
+ </sequence>
171
+ <attribute name="URI" type="anyURI"/>
172
+ <attribute name="Type" type="anyURI" use="optional"/>
173
+ </complexType>
174
+
175
+ <!-- Start X509Data -->
176
+
177
+ <element name="X509Data" type="ds:X509DataType"/>
178
+ <complexType name="X509DataType">
179
+ <sequence maxOccurs="unbounded">
180
+ <choice>
181
+ <element name="X509IssuerSerial" type="ds:X509IssuerSerialType"/>
182
+ <element name="X509SKI" type="base64Binary"/>
183
+ <element name="X509SubjectName" type="string"/>
184
+ <element name="X509Certificate" type="base64Binary"/>
185
+ <element name="X509CRL" type="base64Binary"/>
186
+ <any namespace="##other" processContents="lax"/>
187
+ </choice>
188
+ </sequence>
189
+ </complexType>
190
+
191
+ <complexType name="X509IssuerSerialType">
192
+ <sequence>
193
+ <element name="X509IssuerName" type="string"/>
194
+ <element name="X509SerialNumber" type="integer"/>
195
+ </sequence>
196
+ </complexType>
197
+
198
+ <!-- End X509Data -->
199
+
200
+ <!-- Begin PGPData -->
201
+
202
+ <element name="PGPData" type="ds:PGPDataType"/>
203
+ <complexType name="PGPDataType">
204
+ <choice>
205
+ <sequence>
206
+ <element name="PGPKeyID" type="base64Binary"/>
207
+ <element name="PGPKeyPacket" type="base64Binary" minOccurs="0"/>
208
+ <any namespace="##other" processContents="lax" minOccurs="0"
209
+ maxOccurs="unbounded"/>
210
+ </sequence>
211
+ <sequence>
212
+ <element name="PGPKeyPacket" type="base64Binary"/>
213
+ <any namespace="##other" processContents="lax" minOccurs="0"
214
+ maxOccurs="unbounded"/>
215
+ </sequence>
216
+ </choice>
217
+ </complexType>
218
+
219
+ <!-- End PGPData -->
220
+
221
+ <!-- Begin SPKIData -->
222
+
223
+ <element name="SPKIData" type="ds:SPKIDataType"/>
224
+ <complexType name="SPKIDataType">
225
+ <sequence maxOccurs="unbounded">
226
+ <element name="SPKISexp" type="base64Binary"/>
227
+ <any namespace="##other" processContents="lax" minOccurs="0"/>
228
+ </sequence>
229
+ </complexType>
230
+
231
+ <!-- End SPKIData -->
232
+
233
+ <!-- End KeyInfo -->
234
+
235
+ <!-- Start Object (Manifest, SignatureProperty) -->
236
+
237
+ <element name="Object" type="ds:ObjectType"/>
238
+ <complexType name="ObjectType" mixed="true">
239
+ <sequence minOccurs="0" maxOccurs="unbounded">
240
+ <any namespace="##any" processContents="lax"/>
241
+ </sequence>
242
+ <attribute name="Id" type="ID" use="optional"/>
243
+ <attribute name="MimeType" type="string" use="optional"/> <!-- add a grep facet -->
244
+ <attribute name="Encoding" type="anyURI" use="optional"/>
245
+ </complexType>
246
+
247
+ <element name="Manifest" type="ds:ManifestType"/>
248
+ <complexType name="ManifestType">
249
+ <sequence>
250
+ <element ref="ds:Reference" maxOccurs="unbounded"/>
251
+ </sequence>
252
+ <attribute name="Id" type="ID" use="optional"/>
253
+ </complexType>
254
+
255
+ <element name="SignatureProperties" type="ds:SignaturePropertiesType"/>
256
+ <complexType name="SignaturePropertiesType">
257
+ <sequence>
258
+ <element ref="ds:SignatureProperty" maxOccurs="unbounded"/>
259
+ </sequence>
260
+ <attribute name="Id" type="ID" use="optional"/>
261
+ </complexType>
262
+
263
+ <element name="SignatureProperty" type="ds:SignaturePropertyType"/>
264
+ <complexType name="SignaturePropertyType" mixed="true">
265
+ <choice maxOccurs="unbounded">
266
+ <any namespace="##other" processContents="lax"/>
267
+ <!-- (1,1) elements from (1,unbounded) namespaces -->
268
+ </choice>
269
+ <attribute name="Target" type="anyURI" use="required"/>
270
+ <attribute name="Id" type="ID" use="optional"/>
271
+ </complexType>
272
+
273
+ <!-- End Object (Manifest, SignatureProperty) -->
274
+
275
+ <!-- Start Algorithm Parameters -->
276
+
277
+ <simpleType name="HMACOutputLengthType">
278
+ <restriction base="integer"/>
279
+ </simpleType>
280
+
281
+ <!-- Start KeyValue Element-types -->
282
+
283
+ <element name="DSAKeyValue" type="ds:DSAKeyValueType"/>
284
+ <complexType name="DSAKeyValueType">
285
+ <sequence>
286
+ <sequence minOccurs="0">
287
+ <element name="P" type="ds:CryptoBinary"/>
288
+ <element name="Q" type="ds:CryptoBinary"/>
289
+ </sequence>
290
+ <element name="G" type="ds:CryptoBinary" minOccurs="0"/>
291
+ <element name="Y" type="ds:CryptoBinary"/>
292
+ <element name="J" type="ds:CryptoBinary" minOccurs="0"/>
293
+ <sequence minOccurs="0">
294
+ <element name="Seed" type="ds:CryptoBinary"/>
295
+ <element name="PgenCounter" type="ds:CryptoBinary"/>
296
+ </sequence>
297
+ </sequence>
298
+ </complexType>
299
+
300
+ <element name="RSAKeyValue" type="ds:RSAKeyValueType"/>
301
+ <complexType name="RSAKeyValueType">
302
+ <sequence>
303
+ <element name="Modulus" type="ds:CryptoBinary"/>
304
+ <element name="Exponent" type="ds:CryptoBinary"/>
305
+ </sequence>
306
+ </complexType>
307
+
308
+ <!-- End KeyValue Element-types -->
309
+
310
+ <!-- End Signature -->
311
+
312
+ </schema>
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ # `Dcc::Schema::Version` enumerates the bundled DCC and D-SI schema versions
4
+ # and provides lookup helpers. Versions are stored as Strings in semver form
5
+ # (e.g. `"3.3.0"`) with an optional `"v"` prefix tolerated on input.
6
+ module Dcc
7
+ module Schema
8
+ module Version
9
+ DCC_ALL = %w[
10
+ 2.1.0 2.1.1 2.2.0 2.3.0 2.4.0
11
+ 3.0.0 3.1.0 3.1.1 3.1.2 3.2.0 3.2.1 3.3.0
12
+ ].freeze
13
+
14
+ DCC_LATEST = "3.3.0"
15
+ DCC_DEFAULT = DCC_LATEST
16
+
17
+ DSI_ALL = %w[
18
+ 1.0.1 1.3.0 1.3.1 2.0.0 2.1.0 2.2.1
19
+ ].freeze
20
+
21
+ DSI_LATEST = "2.2.1"
22
+ DSI_DEFAULT = DSI_LATEST
23
+
24
+ QUDT_VERSION = "2.2.1"
25
+
26
+ class << self
27
+ # Normalize a version input to a bare `"X.Y.Z"` String.
28
+ # @param v [String, Symbol] e.g. `:v3_3_0`, `"3.3.0"`, `"v3.3.0"`.
29
+ # @return [String, nil]
30
+ def normalize(v)
31
+ return nil if v.nil?
32
+
33
+ s = v.to_s.sub(/\Av/, "").gsub(/_/, ".")
34
+ s.empty? ? nil : s
35
+ end
36
+
37
+ # @param v [String, Symbol] candidate version.
38
+ # @return [Boolean] whether the version is a known DCC release.
39
+ def dcc?(v)
40
+ DCC_ALL.include?(normalize(v))
41
+ end
42
+
43
+ # @param v [String, Symbol] candidate version.
44
+ # @return [Boolean] whether the version is a known D-SI release.
45
+ def dsi?(v)
46
+ DSI_ALL.include?(normalize(v))
47
+ end
48
+
49
+ # Major version of a semver string (`"3.3.0"` → `3`).
50
+ def major(v)
51
+ Integer(normalize(v).split(".").first)
52
+ end
53
+
54
+ # Resolve `:auto`, `nil`, `"latest"`, or a specific version string to
55
+ # a concrete DCC version. The `:auto` strategy reads `schemaVersion`
56
+ # from the XML body.
57
+ def resolve_dcc(version, xml: nil)
58
+ v = normalize(version)
59
+ return detect_from_xml(xml) if v.nil? || v == "auto"
60
+ return DCC_LATEST if v == "latest"
61
+
62
+ unless dcc?(v)
63
+ raise ::Dcc::UnknownVersionError,
64
+ "Unknown DCC schema version: #{version.inspect}"
65
+ end
66
+
67
+ v
68
+ end
69
+
70
+ def resolve_dsi(version, xml: nil)
71
+ v = normalize(version)
72
+ return DSI_LATEST if v.nil? || v == "auto" || v == "latest"
73
+
74
+ unless dsi?(v)
75
+ raise ::Dcc::UnknownVersionError,
76
+ "Unknown D-SI schema version: #{version.inspect}"
77
+ end
78
+
79
+ v
80
+ end
81
+
82
+ # Extract the `schemaVersion` attribute from an XML string.
83
+ # @return [String, nil]
84
+ def detect_from_xml(xml)
85
+ return nil unless xml
86
+
87
+ str = ::Dcc.read_input(xml)
88
+ match = str.match(/schemaVersion\s*=\s*["']([^"']+)["']/)
89
+ match && match[1]
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
data/lib/dcc/schema.rb ADDED
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ # `Dcc::Schema` provides access to the bundled XSD, Schematron, and QUDT
4
+ # resources that ship with the gem under `lib/dcc/schema/resources/`.
5
+ #
6
+ # Use `Dcc::Schema.path("dcc/v3.3.0/dcc.xsd")` to get the absolute filesystem
7
+ # path of a bundled resource. Use `Dcc::Schema::Version` for the canonical
8
+ # list of supported versions.
9
+ module Dcc
10
+ module Schema
11
+ RESOURCES_DIR = File.expand_path("schema/resources", __dir__).freeze
12
+
13
+ autoload :Version, "dcc/schema/version"
14
+
15
+ class << self
16
+ # @param relative_path [String, Array<String>] resource path relative to
17
+ # `lib/dcc/schema/resources/`, e.g. `"dcc/v3.3.0/dcc.xsd"`.
18
+ # @return [String] absolute filesystem path.
19
+ def path(relative_path)
20
+ File.join(RESOURCES_DIR, *Array(relative_path))
21
+ end
22
+
23
+ # @return [Boolean] whether the bundled resource exists.
24
+ def exists?(relative_path)
25
+ File.file?(path(relative_path))
26
+ end
27
+
28
+ # Read a bundled resource's contents.
29
+ # @return [String]
30
+ def read(relative_path)
31
+ File.read(path(relative_path))
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,133 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Loads Sinatra lazily so the gem works without it installed.
4
+ begin
5
+ require "sinatra/base"
6
+ SINATRA_AVAILABLE = true
7
+ rescue ::LoadError
8
+ SINATRA_AVAILABLE = false
9
+ end
10
+
11
+ module Dcc
12
+ module Server
13
+ # Sinatra application exposing the DCC REST API. Mirrors PTB dcclib's
14
+ # endpoints: POST /dccs, GET /dccs/:id, DELETE /dccs/:id,
15
+ # POST /dccs/:id/validate/{xsd,schematron}, /convert/json,
16
+ # /extract/{files,formulae}, /signature, /transform/xslt.
17
+ #
18
+ # Run via:
19
+ # require "dcc/server"
20
+ # Dcc::Server::App.run!
21
+ class App < ::Sinatra::Base
22
+ before do
23
+ content_type :json
24
+ end
25
+
26
+ # Storage instance — override in config.ru for production swaps.
27
+ set :storage, ::Dcc::Server::Storage::Memory.new
28
+
29
+ get "/" do
30
+ {
31
+ title: "dcc gem REST API",
32
+ version: ::Dcc::VERSION,
33
+ endpoints: [
34
+ "POST /dccs",
35
+ "GET /dccs/:id",
36
+ "DELETE /dccs/:id",
37
+ "POST /dccs/:id/validate/xsd",
38
+ "POST /dccs/:id/validate/schematron",
39
+ "POST /dccs/:id/convert/json",
40
+ "GET /dccs/:id/extract/files",
41
+ "POST /dccs/:id/transform/xslt",
42
+ ],
43
+ }.to_json
44
+ end
45
+
46
+ post "/dccs" do
47
+ ensure_loaded!
48
+ body = JSON.parse(request.body.read)
49
+ xml = body.fetch("xml")
50
+ entry = settings.storage.put(xml)
51
+ status 201
52
+ { id: entry.id, expires: entry.expires_at }.to_json
53
+ rescue ::KeyError
54
+ status 400
55
+ { error: "missing 'xml' in request body" }.to_json
56
+ end
57
+
58
+ get "/dccs/:id" do
59
+ entry = settings.storage.get(params[:id])
60
+ halt 404, { error: "not found" }.to_json unless entry
61
+
62
+ { id: entry.id, xml: entry.xml, expires: entry.expires_at }.to_json
63
+ end
64
+
65
+ delete "/dccs/:id" do
66
+ deleted = settings.storage.delete(params[:id])
67
+ halt 404, { error: "not found" }.to_json unless deleted
68
+
69
+ status 204
70
+ end
71
+
72
+ post "/dccs/:id/validate/xsd" do
73
+ result = with_dcc(params[:id]) { |xml| ::Dcc::Validate::Xsd.call(xml) }
74
+ result.to_json
75
+ end
76
+
77
+ post "/dccs/:id/validate/schematron" do
78
+ result = with_dcc(params[:id]) { |xml| ::Dcc::Validate::Schematron.call(::Dcc.parse(xml)) }
79
+ result.to_json
80
+ end
81
+
82
+ post "/dccs/:id/convert/json" do
83
+ with_dcc(params[:id]) do |xml|
84
+ ::Dcc::Convert::Json.call(::Dcc.parse(xml)).payload
85
+ end
86
+ end
87
+
88
+ get "/dccs/:id/extract/files" do
89
+ with_dcc(params[:id]) do |xml|
90
+ files = ::Dcc::Extract::File.each(::Dcc.parse(xml))
91
+ {
92
+ files: files.map do |f|
93
+ {
94
+ name: f.name, file_name: f.file_name,
95
+ mime_type: f.mime_type, ring: f.ring.to_s,
96
+ data_base64: ::Base64.strict_encode64(f.data),
97
+ }
98
+ end,
99
+ }.to_json
100
+ end
101
+ end
102
+
103
+ post "/dccs/:id/transform/xslt" do
104
+ body = JSON.parse(request.body.read)
105
+ xslt = body.fetch("xslt")
106
+ with_dcc(params[:id]) do |xml|
107
+ ::Dcc::Transform::Xslt.call(xml, xslt).payload
108
+ end
109
+ end
110
+
111
+ private
112
+
113
+ def ensure_loaded!
114
+ return if @loaded
115
+
116
+ ::Dcc.load_all!
117
+ @loaded = true
118
+ end
119
+
120
+ def with_dcc(id)
121
+ entry = settings.storage.get(id)
122
+ halt 404, { error: "not found" }.to_json unless entry
123
+
124
+ ensure_loaded!
125
+ result = yield(entry.xml)
126
+ result.is_a?(::String) ? result : result.to_json
127
+ end
128
+ end
129
+ end
130
+ end
131
+
132
+ require "base64"
133
+ require "json"
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Server
5
+ module Storage
6
+ # Value object for a stored DCC entry. Carries the SHA-256 id, XML
7
+ # payload, and expiry timestamp.
8
+ Entry = ::Struct.new(:id, :xml, :expires_at, keyword_init: true) do
9
+ def expired?
10
+ expires_at && Time.now > expires_at
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "digest"
4
+
5
+ module Dcc
6
+ module Server
7
+ module Storage
8
+ # In-memory storage with SHA-256-keyed entries and TTL eviction.
9
+ # Not thread-safe without external synchronization — wrap in a
10
+ # Mutex for concurrent deployments.
11
+ class Memory
12
+ attr_reader :ttl_seconds
13
+
14
+ def initialize(ttl_seconds: 300)
15
+ @store = {}
16
+ @ttl_seconds = ttl_seconds
17
+ end
18
+
19
+ # @param xml [String]
20
+ # @return [Dcc::Server::Storage::Entry]
21
+ def put(xml)
22
+ id = ::Digest::SHA256.hexdigest(xml)
23
+ entry = Entry.new(id: id, xml: xml, expires_at: Time.now + ttl_seconds)
24
+ @store[id] = entry
25
+ entry
26
+ end
27
+
28
+ # @param id [String] SHA-256 hex.
29
+ # @return [Dcc::Server::Storage::Entry, nil]
30
+ def get(id)
31
+ entry = @store[id]
32
+ return nil unless entry
33
+
34
+ if entry.expired?
35
+ @store.delete(id)
36
+ return nil
37
+ end
38
+ entry
39
+ end
40
+
41
+ # @param id [String]
42
+ # @return [Boolean]
43
+ def delete(id)
44
+ !!@store.delete(id)
45
+ end
46
+
47
+ def clear
48
+ @store.clear
49
+ end
50
+
51
+ def size
52
+ @store.size
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dcc
4
+ module Server
5
+ # Pluggable storage for uploaded DCC XML documents. The default
6
+ # `Memory` implementation keeps documents in-process; production
7
+ # deployments can swap in a disk or Redis-backed implementation.
8
+ module Storage
9
+ autoload :Memory, "dcc/server/storage/memory"
10
+ autoload :Entry, "dcc/server/storage/entry"
11
+ end
12
+ end
13
+ end