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.
- checksums.yaml +7 -0
- data/.gitignore +16 -0
- data/.rspec +3 -0
- data/.rubocop.yml +16 -0
- data/.rubocop_todo.yml +10 -0
- data/CHANGELOG.adoc +54 -0
- data/CONTRIBUTING.adoc +64 -0
- data/Gemfile +25 -0
- data/LICENSE +21 -0
- data/README.adoc +69 -0
- data/Rakefile +13 -0
- data/dcc.gemspec +41 -0
- data/docs/cli-reference.adoc +67 -0
- data/docs/getting-started.adoc +117 -0
- data/docs/schema-versions.adoc +65 -0
- data/examples/build_minimal_dcc.rb +23 -0
- data/examples/convert_all_formats.rb +19 -0
- data/examples/parse_and_inspect.rb +19 -0
- data/examples/quantity_math_demo.rb +32 -0
- data/examples/validate_full.rb +27 -0
- data/exe/dcc +7 -0
- data/lib/dcc/base/administrative_data.rb +43 -0
- data/lib/dcc/base/byte_data.rb +36 -0
- data/lib/dcc/base/calibration_laboratory.rb +29 -0
- data/lib/dcc/base/comment.rb +23 -0
- data/lib/dcc/base/condition.rb +34 -0
- data/lib/dcc/base/contact.rb +38 -0
- data/lib/dcc/base/contact_not_strict.rb +38 -0
- data/lib/dcc/base/core_data.rb +44 -0
- data/lib/dcc/base/data.rb +42 -0
- data/lib/dcc/base/digital_calibration_certificate.rb +32 -0
- data/lib/dcc/base/equipment_class.rb +24 -0
- data/lib/dcc/base/formula.rb +33 -0
- data/lib/dcc/base/hash_type.rb +34 -0
- data/lib/dcc/base/identification.rb +27 -0
- data/lib/dcc/base/identifications.rb +27 -0
- data/lib/dcc/base/influence_condition.rb +16 -0
- data/lib/dcc/base/influence_condition_list.rb +40 -0
- data/lib/dcc/base/item.rb +38 -0
- data/lib/dcc/base/item_list.rb +38 -0
- data/lib/dcc/base/list.rb +44 -0
- data/lib/dcc/base/location.rb +36 -0
- data/lib/dcc/base/measurement_meta_data.rb +15 -0
- data/lib/dcc/base/measurement_meta_data_list.rb +27 -0
- data/lib/dcc/base/measurement_result.rb +41 -0
- data/lib/dcc/base/measurement_result_list.rb +28 -0
- data/lib/dcc/base/measuring_equipment.rb +41 -0
- data/lib/dcc/base/measuring_equipment_list.rb +38 -0
- data/lib/dcc/base/quantity.rb +61 -0
- data/lib/dcc/base/ref_type_definition.rb +36 -0
- data/lib/dcc/base/ref_type_definition_list.rb +21 -0
- data/lib/dcc/base/resp_person.rb +38 -0
- data/lib/dcc/base/resp_person_list.rb +27 -0
- data/lib/dcc/base/result.rb +31 -0
- data/lib/dcc/base/result_list.rb +27 -0
- data/lib/dcc/base/rich_content.rb +34 -0
- data/lib/dcc/base/software.rb +35 -0
- data/lib/dcc/base/software_list.rb +27 -0
- data/lib/dcc/base/statement.rb +50 -0
- data/lib/dcc/base/statement_list.rb +27 -0
- data/lib/dcc/base/string_with_lang.rb +24 -0
- data/lib/dcc/base/text.rb +33 -0
- data/lib/dcc/base/used_method.rb +31 -0
- data/lib/dcc/base/used_method_list.rb +27 -0
- data/lib/dcc/base/xml_blob.rb +20 -0
- data/lib/dcc/base.rb +58 -0
- data/lib/dcc/builder/dsl.rb +10 -0
- data/lib/dcc/builder/session.rb +170 -0
- data/lib/dcc/builder.rb +34 -0
- data/lib/dcc/cli/cli.rb +149 -0
- data/lib/dcc/cli/formatters.rb +77 -0
- data/lib/dcc/cli.rb +7 -0
- data/lib/dcc/common_elements.rb +20 -0
- data/lib/dcc/context_configuration.rb +167 -0
- data/lib/dcc/context_options.rb +47 -0
- data/lib/dcc/convert/csv.rb +129 -0
- data/lib/dcc/convert/html.rb +127 -0
- data/lib/dcc/convert/json.rb +62 -0
- data/lib/dcc/convert/result.rb +51 -0
- data/lib/dcc/convert/yaml.rb +21 -0
- data/lib/dcc/convert.rb +14 -0
- data/lib/dcc/diff/change.rb +21 -0
- data/lib/dcc/diff/result.rb +58 -0
- data/lib/dcc/diff.rb +83 -0
- data/lib/dcc/error.rb +54 -0
- data/lib/dcc/extract/file.rb +143 -0
- data/lib/dcc/extract/ring.rb +28 -0
- data/lib/dcc/extract.rb +9 -0
- data/lib/dcc/i18n/text_lookup.rb +67 -0
- data/lib/dcc/i18n.rb +12 -0
- data/lib/dcc/inspect/report.rb +139 -0
- data/lib/dcc/inspect.rb +9 -0
- data/lib/dcc/migrate.rb +41 -0
- data/lib/dcc/namespace/dcc.rb +30 -0
- data/lib/dcc/namespace/dsig.rb +15 -0
- data/lib/dcc/namespace/math_ml.rb +14 -0
- data/lib/dcc/namespace/qudt.rb +15 -0
- data/lib/dcc/namespace/si.rb +26 -0
- data/lib/dcc/namespace.rb +18 -0
- data/lib/dcc/plugin/registry.rb +45 -0
- data/lib/dcc/plugin.rb +42 -0
- data/lib/dcc/quantity_format/formatter.rb +90 -0
- data/lib/dcc/quantity_format.rb +10 -0
- data/lib/dcc/quantity_math/quantity.rb +46 -0
- data/lib/dcc/quantity_math/real.rb +116 -0
- data/lib/dcc/quantity_math.rb +14 -0
- data/lib/dcc/schema/resources/dcc/dsi/v1.0.1.xsd +415 -0
- data/lib/dcc/schema/resources/dcc/dsi/v1.3.0.xsd +814 -0
- data/lib/dcc/schema/resources/dcc/dsi/v1.3.1.xsd +814 -0
- data/lib/dcc/schema/resources/dcc/dsi/v2.0.0.xsd +869 -0
- data/lib/dcc/schema/resources/dcc/dsi/v2.1.0.xsd +1031 -0
- data/lib/dcc/schema/resources/dcc/dsi/v2.2.1.xsd +1574 -0
- data/lib/dcc/schema/resources/dcc/qudt/v2.2.1.xsd +44 -0
- data/lib/dcc/schema/resources/dcc/v2.1.0/dcc.xsd +650 -0
- data/lib/dcc/schema/resources/dcc/v2.1.1/dcc.xsd +669 -0
- data/lib/dcc/schema/resources/dcc/v2.2.0/dcc.xsd +730 -0
- data/lib/dcc/schema/resources/dcc/v2.3.0/dcc.xsd +708 -0
- data/lib/dcc/schema/resources/dcc/v2.4.0/dcc.xsd +725 -0
- data/lib/dcc/schema/resources/dcc/v3.0.0/dcc.xsd +749 -0
- data/lib/dcc/schema/resources/dcc/v3.1.0/dcc.xsd +843 -0
- data/lib/dcc/schema/resources/dcc/v3.1.1/dcc.xsd +843 -0
- data/lib/dcc/schema/resources/dcc/v3.1.2/dcc.xsd +844 -0
- data/lib/dcc/schema/resources/dcc/v3.2.0/dcc.xsd +940 -0
- data/lib/dcc/schema/resources/dcc/v3.2.1/dcc.xsd +963 -0
- data/lib/dcc/schema/resources/dcc/v3.3.0/dcc.xsd +1008 -0
- data/lib/dcc/schema/resources/dcc/xmldsig-core-schema.xsd +312 -0
- data/lib/dcc/schema/resources/dsi/qudt/v2.2.1.xsd +44 -0
- data/lib/dcc/schema/resources/dsi/v1.0.1/SI_Format.xsd +415 -0
- data/lib/dcc/schema/resources/dsi/v1.3.0/SI_Format.xsd +814 -0
- data/lib/dcc/schema/resources/dsi/v1.3.1/SI_Format.xsd +814 -0
- data/lib/dcc/schema/resources/dsi/v2.0.0/SI_Format.xsd +869 -0
- data/lib/dcc/schema/resources/dsi/v2.1.0/SI_Format.xsd +1031 -0
- data/lib/dcc/schema/resources/dsi/v2.2.1/SI_Format.xsd +1574 -0
- data/lib/dcc/schema/resources/qudt/qudt.xsd +44 -0
- data/lib/dcc/schema/resources/schematron/dcc.sch +523 -0
- data/lib/dcc/schema/resources/schematron/dcc.svrl +2302 -0
- data/lib/dcc/schema/resources/xmldsig/xmldsig-core-schema.xsd +312 -0
- data/lib/dcc/schema/version.rb +94 -0
- data/lib/dcc/schema.rb +35 -0
- data/lib/dcc/server/app.rb +133 -0
- data/lib/dcc/server/storage/entry.rb +15 -0
- data/lib/dcc/server/storage/memory.rb +57 -0
- data/lib/dcc/server/storage.rb +13 -0
- data/lib/dcc/server.rb +33 -0
- data/lib/dcc/si/base/complex.rb +43 -0
- data/lib/dcc/si/base/complex_list_xml_list.rb +39 -0
- data/lib/dcc/si/base/constant.rb +39 -0
- data/lib/dcc/si/base/coverage_interval_mu.rb +31 -0
- data/lib/dcc/si/base/expanded_mu.rb +29 -0
- data/lib/dcc/si/base/expanded_unc_xml_list.rb +30 -0
- data/lib/dcc/si/base/hybrid.rb +42 -0
- data/lib/dcc/si/base/measurement_uncertainty_univariate.rb +28 -0
- data/lib/dcc/si/base/real.rb +48 -0
- data/lib/dcc/si/base/real_list_xml_list.rb +45 -0
- data/lib/dcc/si/base/si_list.rb +37 -0
- data/lib/dcc/si/base/standard_mu.rb +25 -0
- data/lib/dcc/si/base.rb +24 -0
- data/lib/dcc/si/common_elements.rb +13 -0
- data/lib/dcc/si/namespace.rb +7 -0
- data/lib/dcc/si/v1/common_elements.rb +13 -0
- data/lib/dcc/si/v1/complex.rb +8 -0
- data/lib/dcc/si/v1/complex_list_xml_list.rb +8 -0
- data/lib/dcc/si/v1/configuration.rb +13 -0
- data/lib/dcc/si/v1/constant.rb +8 -0
- data/lib/dcc/si/v1/coverage_interval_mu.rb +8 -0
- data/lib/dcc/si/v1/expanded_mu.rb +8 -0
- data/lib/dcc/si/v1/expanded_unc.rb +23 -0
- data/lib/dcc/si/v1/expanded_unc_xml_list.rb +8 -0
- data/lib/dcc/si/v1/hybrid.rb +8 -0
- data/lib/dcc/si/v1/measurement_uncertainty_univariate.rb +8 -0
- data/lib/dcc/si/v1/namespace.rb +9 -0
- data/lib/dcc/si/v1/real.rb +8 -0
- data/lib/dcc/si/v1/real_list_xml_list.rb +8 -0
- data/lib/dcc/si/v1/si_list.rb +8 -0
- data/lib/dcc/si/v1/standard_mu.rb +8 -0
- data/lib/dcc/si/v1.rb +46 -0
- data/lib/dcc/si/v2/common_elements.rb +13 -0
- data/lib/dcc/si/v2/complex.rb +8 -0
- data/lib/dcc/si/v2/complex_list_xml_list.rb +8 -0
- data/lib/dcc/si/v2/configuration.rb +13 -0
- data/lib/dcc/si/v2/constant.rb +8 -0
- data/lib/dcc/si/v2/coverage_interval_mu.rb +8 -0
- data/lib/dcc/si/v2/coverage_interval_mu_xml_list.rb +24 -0
- data/lib/dcc/si/v2/expanded_mu.rb +8 -0
- data/lib/dcc/si/v2/expanded_mu_xml_list.rb +22 -0
- data/lib/dcc/si/v2/expanded_unc_xml_list.rb +8 -0
- data/lib/dcc/si/v2/hybrid.rb +8 -0
- data/lib/dcc/si/v2/measurement_uncertainty_univariate.rb +8 -0
- data/lib/dcc/si/v2/namespace.rb +9 -0
- data/lib/dcc/si/v2/real.rb +8 -0
- data/lib/dcc/si/v2/real_list_xml_list.rb +8 -0
- data/lib/dcc/si/v2/si_list.rb +8 -0
- data/lib/dcc/si/v2/standard_mu.rb +8 -0
- data/lib/dcc/si/v2/standard_mu_xml_list.rb +18 -0
- data/lib/dcc/si/v2.rb +49 -0
- data/lib/dcc/si.rb +34 -0
- data/lib/dcc/signature/result.rb +43 -0
- data/lib/dcc/signature/signer.rb +36 -0
- data/lib/dcc/signature/verifier.rb +41 -0
- data/lib/dcc/signature.rb +13 -0
- data/lib/dcc/transform/result.rb +24 -0
- data/lib/dcc/transform/xslt.rb +72 -0
- data/lib/dcc/transform.rb +12 -0
- data/lib/dcc/type/base64_binary.rb +55 -0
- data/lib/dcc/type/decimal_xml_list.rb +47 -0
- data/lib/dcc/type/iso_country_code.rb +23 -0
- data/lib/dcc/type/iso_language_code.rb +23 -0
- data/lib/dcc/type/schema_version.rb +37 -0
- data/lib/dcc/type/si_unit.rb +26 -0
- data/lib/dcc/type.rb +16 -0
- data/lib/dcc/type_guards.rb +140 -0
- data/lib/dcc/v2/administrative_data.rb +8 -0
- data/lib/dcc/v2/byte_data.rb +8 -0
- data/lib/dcc/v2/calibration_laboratory.rb +8 -0
- data/lib/dcc/v2/comment.rb +8 -0
- data/lib/dcc/v2/common_elements.rb +13 -0
- data/lib/dcc/v2/condition.rb +8 -0
- data/lib/dcc/v2/configuration.rb +17 -0
- data/lib/dcc/v2/contact.rb +8 -0
- data/lib/dcc/v2/contact_not_strict.rb +8 -0
- data/lib/dcc/v2/core_data.rb +8 -0
- data/lib/dcc/v2/data.rb +8 -0
- data/lib/dcc/v2/digital_calibration_certificate.rb +8 -0
- data/lib/dcc/v2/equipment_class.rb +8 -0
- data/lib/dcc/v2/formula.rb +8 -0
- data/lib/dcc/v2/hash_type.rb +8 -0
- data/lib/dcc/v2/identification.rb +8 -0
- data/lib/dcc/v2/identifications.rb +8 -0
- data/lib/dcc/v2/influence_condition.rb +7 -0
- data/lib/dcc/v2/influence_condition_list.rb +8 -0
- data/lib/dcc/v2/item.rb +8 -0
- data/lib/dcc/v2/item_list.rb +8 -0
- data/lib/dcc/v2/list.rb +8 -0
- data/lib/dcc/v2/location.rb +8 -0
- data/lib/dcc/v2/measurement_meta_data.rb +8 -0
- data/lib/dcc/v2/measurement_meta_data_list.rb +8 -0
- data/lib/dcc/v2/measurement_result.rb +8 -0
- data/lib/dcc/v2/measurement_result_list.rb +8 -0
- data/lib/dcc/v2/measuring_equipment.rb +8 -0
- data/lib/dcc/v2/measuring_equipment_list.rb +8 -0
- data/lib/dcc/v2/namespace.rb +8 -0
- data/lib/dcc/v2/quantity.rb +49 -0
- data/lib/dcc/v2/ref_type_definition.rb +11 -0
- data/lib/dcc/v2/ref_type_definition_list.rb +15 -0
- data/lib/dcc/v2/resp_person.rb +8 -0
- data/lib/dcc/v2/resp_person_list.rb +8 -0
- data/lib/dcc/v2/result.rb +8 -0
- data/lib/dcc/v2/result_list.rb +8 -0
- data/lib/dcc/v2/rich_content.rb +12 -0
- data/lib/dcc/v2/software.rb +8 -0
- data/lib/dcc/v2/software_list.rb +8 -0
- data/lib/dcc/v2/statement.rb +8 -0
- data/lib/dcc/v2/statement_list.rb +8 -0
- data/lib/dcc/v2/string_with_lang.rb +8 -0
- data/lib/dcc/v2/text.rb +8 -0
- data/lib/dcc/v2/used_method.rb +8 -0
- data/lib/dcc/v2/used_method_list.rb +8 -0
- data/lib/dcc/v2/xml_blob.rb +8 -0
- data/lib/dcc/v2.rb +84 -0
- data/lib/dcc/v3/administrative_data.rb +8 -0
- data/lib/dcc/v3/byte_data.rb +8 -0
- data/lib/dcc/v3/calibration_laboratory.rb +8 -0
- data/lib/dcc/v3/comment.rb +8 -0
- data/lib/dcc/v3/common_elements.rb +11 -0
- data/lib/dcc/v3/condition.rb +8 -0
- data/lib/dcc/v3/configuration.rb +17 -0
- data/lib/dcc/v3/contact.rb +8 -0
- data/lib/dcc/v3/contact_not_strict.rb +8 -0
- data/lib/dcc/v3/core_data.rb +8 -0
- data/lib/dcc/v3/data.rb +8 -0
- data/lib/dcc/v3/digital_calibration_certificate.rb +8 -0
- data/lib/dcc/v3/equipment_class.rb +8 -0
- data/lib/dcc/v3/formula.rb +8 -0
- data/lib/dcc/v3/hash_type.rb +8 -0
- data/lib/dcc/v3/identification.rb +8 -0
- data/lib/dcc/v3/identifications.rb +8 -0
- data/lib/dcc/v3/influence_condition.rb +7 -0
- data/lib/dcc/v3/influence_condition_list.rb +8 -0
- data/lib/dcc/v3/item.rb +8 -0
- data/lib/dcc/v3/item_list.rb +8 -0
- data/lib/dcc/v3/list.rb +8 -0
- data/lib/dcc/v3/location.rb +8 -0
- data/lib/dcc/v3/measurement_meta_data.rb +8 -0
- data/lib/dcc/v3/measurement_meta_data_list.rb +8 -0
- data/lib/dcc/v3/measurement_result.rb +8 -0
- data/lib/dcc/v3/measurement_result_list.rb +8 -0
- data/lib/dcc/v3/measuring_equipment.rb +8 -0
- data/lib/dcc/v3/measuring_equipment_list.rb +8 -0
- data/lib/dcc/v3/namespace.rb +7 -0
- data/lib/dcc/v3/quantity.rb +49 -0
- data/lib/dcc/v3/ref_type_definition.rb +8 -0
- data/lib/dcc/v3/ref_type_definition_list.rb +8 -0
- data/lib/dcc/v3/resp_person.rb +8 -0
- data/lib/dcc/v3/resp_person_list.rb +8 -0
- data/lib/dcc/v3/result.rb +8 -0
- data/lib/dcc/v3/result_list.rb +8 -0
- data/lib/dcc/v3/rich_content.rb +8 -0
- data/lib/dcc/v3/software.rb +8 -0
- data/lib/dcc/v3/software_list.rb +8 -0
- data/lib/dcc/v3/statement.rb +8 -0
- data/lib/dcc/v3/statement_list.rb +8 -0
- data/lib/dcc/v3/string_with_lang.rb +8 -0
- data/lib/dcc/v3/text.rb +8 -0
- data/lib/dcc/v3/used_method.rb +8 -0
- data/lib/dcc/v3/used_method_list.rb +8 -0
- data/lib/dcc/v3/xml_blob.rb +8 -0
- data/lib/dcc/v3.rb +111 -0
- data/lib/dcc/validate/business_rules.rb +121 -0
- data/lib/dcc/validate/issue.rb +56 -0
- data/lib/dcc/validate/result.rb +105 -0
- data/lib/dcc/validate/schematron/profile.rb +64 -0
- data/lib/dcc/validate/schematron/rule.rb +49 -0
- data/lib/dcc/validate/schematron/rules/administrative_data_completeness.rb +42 -0
- data/lib/dcc/validate/schematron/rules/base.rb +15 -0
- data/lib/dcc/validate/schematron/rules/date_range_check.rb +41 -0
- data/lib/dcc/validate/schematron/rules/id_refid_linking.rb +61 -0
- data/lib/dcc/validate/schematron/rules/influence_conditions_placement.rb +58 -0
- data/lib/dcc/validate/schematron/rules/iso_code_validation.rb +53 -0
- data/lib/dcc/validate/schematron/rules/language_code_dedup.rb +39 -0
- data/lib/dcc/validate/schematron/rules/non_si_declaration.rb +82 -0
- data/lib/dcc/validate/schematron/rules/release_format_check.rb +44 -0
- data/lib/dcc/validate/schematron/rules/schema_version_check.rb +31 -0
- data/lib/dcc/validate/schematron/rules/uncertainty_consistency.rb +58 -0
- data/lib/dcc/validate/schematron/rules/unit_format_check.rb +74 -0
- data/lib/dcc/validate/schematron/rules/used_methods_placement.rb +65 -0
- data/lib/dcc/validate/schematron/rules/used_software_placement.rb +43 -0
- data/lib/dcc/validate/schematron/rules/xml_list_spacing.rb +42 -0
- data/lib/dcc/validate/schematron/rules.rb +30 -0
- data/lib/dcc/validate/schematron.rb +22 -0
- data/lib/dcc/validate/severity.rb +39 -0
- data/lib/dcc/validate/xsd.rb +97 -0
- data/lib/dcc/validate.rb +15 -0
- data/lib/dcc/version.rb +5 -0
- data/lib/dcc/versioned_parser.rb +48 -0
- data/lib/dcc.rb +141 -0
- metadata +425 -0
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,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,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 MeasurementUncertaintyUnivariate < CommonElements
|
|
5
|
+
include ::Dcc::Si::Base::MeasurementUncertaintyUnivariate
|
|
6
|
+
end
|
|
7
|
+
Configuration.register_model(MeasurementUncertaintyUnivariate, id: :measurementUncertaintyUnivariate)
|
|
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
|