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
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Dcc::V3
|
|
4
|
+
# V3 Quantity: declares DCC admin attributes + D-SI v2.x quantity element
|
|
5
|
+
# references in a single `xml do` block. We avoid `include Dcc::Base::Quantity`
|
|
6
|
+
# because the second `xml do` block would overwrite the base mappings.
|
|
7
|
+
class Quantity < CommonElements
|
|
8
|
+
attribute :id, :string
|
|
9
|
+
attribute :ref_id, :string
|
|
10
|
+
attribute :ref_type, :string
|
|
11
|
+
attribute :name, :text
|
|
12
|
+
attribute :no_quantity, :string
|
|
13
|
+
attribute :used_methods, :usedMethods
|
|
14
|
+
attribute :used_software, :softwareList
|
|
15
|
+
attribute :influence_conditions, :influenceConditions
|
|
16
|
+
attribute :measurement_meta_data, :measurementMetaData
|
|
17
|
+
# D-SI v2 quantity substitutions (Option B)
|
|
18
|
+
attribute :real, ::Dcc::Si::V2::Real, collection: true
|
|
19
|
+
attribute :complex, ::Dcc::Si::V2::Complex, collection: true
|
|
20
|
+
attribute :constant, ::Dcc::Si::V2::Constant, collection: true
|
|
21
|
+
attribute :hybrid, ::Dcc::Si::V2::Hybrid, collection: true
|
|
22
|
+
attribute :real_list_xml_list, ::Dcc::Si::V2::RealListXmlList, collection: true
|
|
23
|
+
attribute :complex_list_xml_list, ::Dcc::Si::V2::ComplexListXmlList, collection: true
|
|
24
|
+
attribute :list, ::Dcc::Si::V2::SiList, collection: true
|
|
25
|
+
|
|
26
|
+
xml do
|
|
27
|
+
namespace ::Dcc::Namespace::Dcc
|
|
28
|
+
element "quantity"
|
|
29
|
+
ordered
|
|
30
|
+
map_attribute "id", to: :id
|
|
31
|
+
map_attribute "refId", to: :ref_id
|
|
32
|
+
map_attribute "refType", to: :ref_type
|
|
33
|
+
map_element "name", to: :name
|
|
34
|
+
map_element "noQuantity", to: :no_quantity
|
|
35
|
+
map_element "usedMethods", to: :used_methods
|
|
36
|
+
map_element "usedSoftware", to: :used_software
|
|
37
|
+
map_element "influenceConditions", to: :influence_conditions
|
|
38
|
+
map_element "measurementMetaData", to: :measurement_meta_data
|
|
39
|
+
map_element "real", to: :real
|
|
40
|
+
map_element "complex", to: :complex
|
|
41
|
+
map_element "constant", to: :constant
|
|
42
|
+
map_element "hybrid", to: :hybrid
|
|
43
|
+
map_element "realListXMLList", to: :real_list_xml_list
|
|
44
|
+
map_element "complexListXMLList", to: :complex_list_xml_list
|
|
45
|
+
map_element "list", to: :list
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
Configuration.register_model(Quantity, id: :quantity)
|
|
49
|
+
end
|
data/lib/dcc/v3/text.rb
ADDED
data/lib/dcc/v3.rb
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# `Dcc::V3` hosts all DCC v3.x element wrapper classes. They share the same
|
|
4
|
+
# `lib/dcc/base/*.rb` mapping modules as V2 but live in their own class
|
|
5
|
+
# hierarchy and register in their own type context (`:dcc_v3`), so V2 and V3
|
|
6
|
+
# can coexist in one process without symbol clashes.
|
|
7
|
+
module Dcc
|
|
8
|
+
module V3
|
|
9
|
+
autoload :Configuration, "dcc/v3/configuration"
|
|
10
|
+
autoload :Namespace, "dcc/v3/namespace"
|
|
11
|
+
autoload :CommonElements, "dcc/v3/common_elements"
|
|
12
|
+
|
|
13
|
+
autoload :StringWithLang, "dcc/v3/string_with_lang"
|
|
14
|
+
autoload :Text, "dcc/v3/text"
|
|
15
|
+
autoload :ByteData, "dcc/v3/byte_data"
|
|
16
|
+
autoload :Formula, "dcc/v3/formula"
|
|
17
|
+
autoload :RichContent, "dcc/v3/rich_content"
|
|
18
|
+
autoload :XmlBlob, "dcc/v3/xml_blob"
|
|
19
|
+
autoload :Comment, "dcc/v3/comment"
|
|
20
|
+
autoload :EquipmentClass, "dcc/v3/equipment_class"
|
|
21
|
+
autoload :Location, "dcc/v3/location"
|
|
22
|
+
autoload :Contact, "dcc/v3/contact"
|
|
23
|
+
autoload :ContactNotStrict, "dcc/v3/contact_not_strict"
|
|
24
|
+
autoload :HashType, "dcc/v3/hash_type"
|
|
25
|
+
autoload :Identification, "dcc/v3/identification"
|
|
26
|
+
autoload :Identifications, "dcc/v3/identifications"
|
|
27
|
+
autoload :Software, "dcc/v3/software"
|
|
28
|
+
autoload :SoftwareList, "dcc/v3/software_list"
|
|
29
|
+
autoload :RefTypeDefinition, "dcc/v3/ref_type_definition"
|
|
30
|
+
autoload :RefTypeDefinitionList, "dcc/v3/ref_type_definition_list"
|
|
31
|
+
autoload :CoreData, "dcc/v3/core_data"
|
|
32
|
+
autoload :Item, "dcc/v3/item"
|
|
33
|
+
autoload :ItemList, "dcc/v3/item_list"
|
|
34
|
+
autoload :CalibrationLaboratory, "dcc/v3/calibration_laboratory"
|
|
35
|
+
autoload :RespPerson, "dcc/v3/resp_person"
|
|
36
|
+
autoload :RespPersonList, "dcc/v3/resp_person_list"
|
|
37
|
+
autoload :Statement, "dcc/v3/statement"
|
|
38
|
+
autoload :StatementList, "dcc/v3/statement_list"
|
|
39
|
+
autoload :MeasuringEquipment, "dcc/v3/measuring_equipment"
|
|
40
|
+
autoload :MeasuringEquipmentList, "dcc/v3/measuring_equipment_list"
|
|
41
|
+
autoload :UsedMethod, "dcc/v3/used_method"
|
|
42
|
+
autoload :UsedMethodList, "dcc/v3/used_method_list"
|
|
43
|
+
autoload :Condition, "dcc/v3/condition"
|
|
44
|
+
autoload :InfluenceCondition, "dcc/v3/influence_condition"
|
|
45
|
+
autoload :InfluenceConditionList, "dcc/v3/influence_condition_list"
|
|
46
|
+
autoload :Result, "dcc/v3/result"
|
|
47
|
+
autoload :ResultList, "dcc/v3/result_list"
|
|
48
|
+
autoload :Data, "dcc/v3/data"
|
|
49
|
+
autoload :Quantity, "dcc/v3/quantity"
|
|
50
|
+
autoload :List, "dcc/v3/list"
|
|
51
|
+
autoload :MeasurementMetaData, "dcc/v3/measurement_meta_data"
|
|
52
|
+
autoload :MeasurementMetaDataList, "dcc/v3/measurement_meta_data_list"
|
|
53
|
+
autoload :MeasurementResult, "dcc/v3/measurement_result"
|
|
54
|
+
autoload :MeasurementResultList, "dcc/v3/measurement_result_list"
|
|
55
|
+
autoload :AdministrativeData, "dcc/v3/administrative_data"
|
|
56
|
+
autoload :DigitalCalibrationCertificate, "dcc/v3/digital_calibration_certificate"
|
|
57
|
+
|
|
58
|
+
ROOT_ELEMENT_TAG = "digitalCalibrationCertificate"
|
|
59
|
+
|
|
60
|
+
extend ::Dcc::VersionedParser
|
|
61
|
+
|
|
62
|
+
# Element wrapper classes that must be loaded before
|
|
63
|
+
# `Configuration.populate_context!` can register them. Iterating
|
|
64
|
+
# `constants` triggers each autoload lazily.
|
|
65
|
+
ELEMENT_CLASSES = %i[
|
|
66
|
+
StringWithLang Text ByteData Formula RichContent XmlBlob Comment
|
|
67
|
+
EquipmentClass Location Contact ContactNotStrict HashType
|
|
68
|
+
Identification Identifications Software SoftwareList
|
|
69
|
+
RefTypeDefinition RefTypeDefinitionList
|
|
70
|
+
CoreData Item ItemList CalibrationLaboratory
|
|
71
|
+
RespPerson RespPersonList Statement StatementList
|
|
72
|
+
MeasuringEquipment MeasuringEquipmentList
|
|
73
|
+
UsedMethod UsedMethodList
|
|
74
|
+
Condition InfluenceCondition InfluenceConditionList
|
|
75
|
+
Result ResultList Data Quantity List
|
|
76
|
+
MeasurementMetaData MeasurementMetaDataList
|
|
77
|
+
MeasurementResult MeasurementResultList
|
|
78
|
+
AdministrativeData DigitalCalibrationCertificate
|
|
79
|
+
].freeze
|
|
80
|
+
|
|
81
|
+
# Eagerly load every element wrapper so registrations run, then register
|
|
82
|
+
# D-SI types in the DCC v3 context so cross-namespace `:real` / `:hybrid`
|
|
83
|
+
# references inside DCC Quantity's D-SI children resolve cleanly.
|
|
84
|
+
def self.load_all!
|
|
85
|
+
ELEMENT_CLASSES.each { |name| const_get(name) }
|
|
86
|
+
Configuration.populate_context!
|
|
87
|
+
register_dsi_types!
|
|
88
|
+
true
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Re-export D-SI v2 type registrations into the DCC v3 context. Uses
|
|
92
|
+
# only the public `register_model` API (no instance_variable access).
|
|
93
|
+
def self.register_dsi_types!
|
|
94
|
+
::Dcc::Si::V2.load_all!
|
|
95
|
+
::Dcc::Si::V2::Configuration.registered_model_ids.each do |id|
|
|
96
|
+
klass = ::Dcc::Si::V2::Configuration.registered_model_class(id)
|
|
97
|
+
Configuration.register_model(klass, id: id)
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Re-export Mml type registrations into the DCC v3 context so
|
|
102
|
+
# `Mml::V3::Math` children resolve when formula.mathml is serialized.
|
|
103
|
+
def self.register_mml_types!
|
|
104
|
+
::Mml::V3::Configuration.populate_context!
|
|
105
|
+
::Mml::V3::Configuration.registered_model_ids.each do |id|
|
|
106
|
+
klass = ::Mml::V3::Configuration.registered_model_class(id)
|
|
107
|
+
Configuration.register_model(klass, id: id)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Dcc
|
|
4
|
+
module Validate
|
|
5
|
+
# Ruby-side semantic checks that go beyond Schematron. Cross-section
|
|
6
|
+
# consistency, signer coverage, language completeness. Open for
|
|
7
|
+
# extension via the Registry class.
|
|
8
|
+
module BusinessRules
|
|
9
|
+
# Output of running business rules. Same shape as Validate::Result.
|
|
10
|
+
class Result < ::Dcc::Validate::Result
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Registry of all registered business rules. Plugins call
|
|
14
|
+
# `Dcc::Validate::BusinessRules::Registry.add(rule_class)` to add
|
|
15
|
+
# new rules without modifying this file (OCP).
|
|
16
|
+
class Registry
|
|
17
|
+
@rules = []
|
|
18
|
+
|
|
19
|
+
class << self
|
|
20
|
+
attr_reader :rules
|
|
21
|
+
|
|
22
|
+
# @param rule_class [Class] subclass of Rule.
|
|
23
|
+
def add(rule_class)
|
|
24
|
+
@rules << rule_class
|
|
25
|
+
rule_class
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# @return [Array<Class>]
|
|
29
|
+
def all
|
|
30
|
+
@rules
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def reset!
|
|
34
|
+
@rules.clear
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Base class for business rules.
|
|
40
|
+
class Rule
|
|
41
|
+
def severity
|
|
42
|
+
::Dcc::Validate::Severity::ERROR
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def code
|
|
46
|
+
"dcc.business_rule.#{self.class.name.split('::').last.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').gsub(/([a-z\d])([A-Z])/, '\1_\2').downcase}"
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# @param _dcc [Lutaml::Model::Serializable]
|
|
50
|
+
# @return [Array<Dcc::Validate::Issue>]
|
|
51
|
+
def check_on(_dcc)
|
|
52
|
+
[]
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
protected
|
|
56
|
+
|
|
57
|
+
def issue(severity:, message:, path: nil)
|
|
58
|
+
::Dcc::Validate::Issue.build(
|
|
59
|
+
severity: severity,
|
|
60
|
+
message: message,
|
|
61
|
+
code: code,
|
|
62
|
+
path: path,
|
|
63
|
+
source: "business_rule",
|
|
64
|
+
)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Require exactly one respPerson with mainSigner = true.
|
|
69
|
+
class MainSignerSingle < Rule
|
|
70
|
+
def check_on(dcc)
|
|
71
|
+
return [] unless Dcc::TypeGuards.has_attribute?(dcc, :administrative_data)
|
|
72
|
+
|
|
73
|
+
admin = dcc.administrative_data
|
|
74
|
+
return [] unless admin && Dcc::TypeGuards.has_attribute?(admin, :resp_persons) && admin.resp_persons
|
|
75
|
+
|
|
76
|
+
resp_persons = Array(admin.resp_persons.resp_person)
|
|
77
|
+
main_signers = resp_persons.select { |p| Dcc::TypeGuards.has_attribute?(p, :main_signer) && p.main_signer }
|
|
78
|
+
return [] if main_signers.size == 1
|
|
79
|
+
|
|
80
|
+
[
|
|
81
|
+
issue(
|
|
82
|
+
severity: :error,
|
|
83
|
+
message: "Expected exactly one mainSigner respPerson, found #{main_signers.size}",
|
|
84
|
+
),
|
|
85
|
+
]
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Require non-empty uniqueIdentifier.
|
|
90
|
+
class UniqueIdentifierPresent < Rule
|
|
91
|
+
def check_on(dcc)
|
|
92
|
+
return [] unless Dcc::TypeGuards.has_attribute?(dcc, :administrative_data)
|
|
93
|
+
|
|
94
|
+
core = dcc.administrative_data&.core_data
|
|
95
|
+
return [issue(severity: :error, message: "coreData is missing")] unless core
|
|
96
|
+
|
|
97
|
+
id = core.unique_identifier
|
|
98
|
+
return [] if id && !id.to_s.empty?
|
|
99
|
+
|
|
100
|
+
[issue(severity: :error, message: "uniqueIdentifier is missing or empty")]
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
Registry.add(MainSignerSingle)
|
|
105
|
+
Registry.add(UniqueIdentifierPresent)
|
|
106
|
+
|
|
107
|
+
class << self
|
|
108
|
+
# @param dcc [Lutaml::Model::Serializable]
|
|
109
|
+
# @return [Dcc::Validate::BusinessRules::Result]
|
|
110
|
+
def call(dcc)
|
|
111
|
+
issues = Registry.all.flat_map { |rule_class| rule_class.new.check_on(dcc) }
|
|
112
|
+
Result.new(
|
|
113
|
+
issues: issues,
|
|
114
|
+
schema_version: Dcc::TypeGuards.has_attribute?(dcc, :schema_version) ? dcc.schema_version.to_s : nil,
|
|
115
|
+
source: "business_rule",
|
|
116
|
+
)
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "lutaml/model"
|
|
4
|
+
|
|
5
|
+
module Dcc
|
|
6
|
+
module Validate
|
|
7
|
+
# A single validation issue (XSD error, Schematron failed assert, or
|
|
8
|
+
# business-rule violation). Carries enough metadata for both human and
|
|
9
|
+
# machine reporting.
|
|
10
|
+
class Issue < Lutaml::Model::Serializable
|
|
11
|
+
attribute :severity, :symbol
|
|
12
|
+
attribute :code, :string
|
|
13
|
+
attribute :message, :string
|
|
14
|
+
attribute :line, :integer
|
|
15
|
+
attribute :column, :integer
|
|
16
|
+
attribute :path, :string
|
|
17
|
+
attribute :source, :string
|
|
18
|
+
|
|
19
|
+
# Convenience constructor used by validators.
|
|
20
|
+
# @param severity [Symbol, String] see `Dcc::Validate::Severity.normalize`.
|
|
21
|
+
# @param message [String] human-readable description.
|
|
22
|
+
# @param code [String, nil] validator-specific code (e.g. "dcc.date-range").
|
|
23
|
+
# @param line [Integer, nil] XML line number if known.
|
|
24
|
+
# @param column [Integer, nil] XML column number if known.
|
|
25
|
+
# @param path [String, nil] XPath / element path if known.
|
|
26
|
+
# @param source [String, nil] validator name (e.g. "xsd", "schematron").
|
|
27
|
+
def self.build(severity:, message:, code: nil, line: nil, column: nil, path: nil, source: nil)
|
|
28
|
+
new(
|
|
29
|
+
severity: ::Dcc::Validate::Severity.normalize(severity),
|
|
30
|
+
message: message,
|
|
31
|
+
code: code,
|
|
32
|
+
line: line,
|
|
33
|
+
column: column,
|
|
34
|
+
path: path,
|
|
35
|
+
source: source,
|
|
36
|
+
)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# @return [Boolean] whether this issue fails validation (severity == error).
|
|
40
|
+
def failing?
|
|
41
|
+
severity == ::Dcc::Validate::Severity::ERROR
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def to_s
|
|
45
|
+
loc = []
|
|
46
|
+
loc << "line #{line}" if line
|
|
47
|
+
loc << "col #{column}" if column
|
|
48
|
+
loc << path if path
|
|
49
|
+
loc_str = loc.empty? ? "" : " [#{loc.join(' ')}]"
|
|
50
|
+
code_str = code ? "(#{code}) " : ""
|
|
51
|
+
src_str = source ? "#{source}: " : ""
|
|
52
|
+
"#{src_str}#{severity.upcase} #{code_str}#{message}#{loc_str}"
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "lutaml/model"
|
|
4
|
+
|
|
5
|
+
module Dcc
|
|
6
|
+
module Validate
|
|
7
|
+
# Result of running one or more validators. Tracks the list of issues
|
|
8
|
+
# and the schema version (when relevant). Renderable as text, JSON, or
|
|
9
|
+
# YAML via `to_s` / `to_json` / `to_yaml`.
|
|
10
|
+
class Result < Lutaml::Model::Serializable
|
|
11
|
+
attribute :issues, ::Dcc::Validate::Issue, collection: true
|
|
12
|
+
attribute :schema_version, :string
|
|
13
|
+
attribute :source, :string
|
|
14
|
+
|
|
15
|
+
# @param issues [Array<Dcc::Validate::Issue>] validation issues found.
|
|
16
|
+
# @param schema_version [String, nil] DCC schema version validated against.
|
|
17
|
+
# @param source [String, nil] validator name (xsd, schematron, business_rules, all).
|
|
18
|
+
def initialize(issues: [], schema_version: nil, source: nil)
|
|
19
|
+
super()
|
|
20
|
+
self.issues = issues
|
|
21
|
+
self.schema_version = schema_version
|
|
22
|
+
self.source = source
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# @return [Boolean] true when there are no failing (error) issues.
|
|
26
|
+
def ok?
|
|
27
|
+
issues.none?(&:failing?)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# @return [Array<Dcc::Validate::Issue>] only the errors.
|
|
31
|
+
def errors
|
|
32
|
+
issues.select(&:failing?)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# @return [Array<Dcc::Validate::Issue>] only the warnings.
|
|
36
|
+
def warnings
|
|
37
|
+
issues.select { |i| i.severity == ::Dcc::Validate::Severity::WARNING }
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# @return [Array<Dcc::Validate::Issue>] only informational issues.
|
|
41
|
+
def infos
|
|
42
|
+
issues.select { |i| i.severity == ::Dcc::Validate::Severity::INFO }
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Merge another Result into this one (mutating). Returns self.
|
|
46
|
+
# @param other [Dcc::Validate::Result]
|
|
47
|
+
# @return [Dcc::Validate::Result]
|
|
48
|
+
def merge!(other)
|
|
49
|
+
self.issues = issues + other.issues
|
|
50
|
+
self
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Non-mutating merge.
|
|
54
|
+
# @return [Dcc::Validate::Result]
|
|
55
|
+
def merge(other)
|
|
56
|
+
dup.merge!(other)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def to_s
|
|
60
|
+
if ok?
|
|
61
|
+
"OK: no errors found#{schema_version ? " (schemaVersion #{schema_version})" : ''}"
|
|
62
|
+
else
|
|
63
|
+
header = "#{errors.size} error(s), #{warnings.size} warning(s)"
|
|
64
|
+
header += " (schemaVersion #{schema_version})" if schema_version
|
|
65
|
+
body = errors.map(&:to_s).unshift(header).join("\n")
|
|
66
|
+
body
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def to_json(*_args)
|
|
71
|
+
require "json"
|
|
72
|
+
payload = {
|
|
73
|
+
ok: ok?,
|
|
74
|
+
source: source,
|
|
75
|
+
schema_version: schema_version,
|
|
76
|
+
error_count: errors.size,
|
|
77
|
+
warning_count: warnings.size,
|
|
78
|
+
info_count: infos.size,
|
|
79
|
+
issues: issues.map do |i|
|
|
80
|
+
{
|
|
81
|
+
severity: i.severity.to_s,
|
|
82
|
+
code: i.code,
|
|
83
|
+
message: i.message,
|
|
84
|
+
line: i.line,
|
|
85
|
+
column: i.column,
|
|
86
|
+
path: i.path,
|
|
87
|
+
source: i.source,
|
|
88
|
+
}
|
|
89
|
+
end,
|
|
90
|
+
}
|
|
91
|
+
::JSON.pretty_generate(payload)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def to_yaml(*_args)
|
|
95
|
+
require "yaml"
|
|
96
|
+
{
|
|
97
|
+
ok: ok?,
|
|
98
|
+
source: source,
|
|
99
|
+
schema_version: schema_version,
|
|
100
|
+
issues: issues.map { |i| [i.severity.to_s, i.message, i.line, i.path] },
|
|
101
|
+
}.to_yaml
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "bigdecimal"
|
|
4
|
+
require "date"
|
|
5
|
+
|
|
6
|
+
module Dcc
|
|
7
|
+
module Validate
|
|
8
|
+
module Schematron
|
|
9
|
+
# `Dcc::Validate::Schematron::Profile` aggregates the 14 PTB Schematron
|
|
10
|
+
# rules and runs them against a parsed DCC object tree. Each rule is a
|
|
11
|
+
# `Lutaml::Model::Validation::Rule` subclass that walks the parsed tree.
|
|
12
|
+
#
|
|
13
|
+
# @example
|
|
14
|
+
# result = Dcc::Validate::Schematron.call(dcc)
|
|
15
|
+
# result.ok? # => true
|
|
16
|
+
# result.issues.size # => 0
|
|
17
|
+
class Profile
|
|
18
|
+
attr_reader :dcc, :rules
|
|
19
|
+
|
|
20
|
+
def initialize(dcc)
|
|
21
|
+
@dcc = dcc
|
|
22
|
+
@rules = [
|
|
23
|
+
Rules::UsedMethodsPlacement,
|
|
24
|
+
Rules::UsedSoftwarePlacement,
|
|
25
|
+
Rules::InfluenceConditionsPlacement,
|
|
26
|
+
Rules::SchemaVersionCheck,
|
|
27
|
+
Rules::IdRefIdLinking,
|
|
28
|
+
Rules::IsoCodeValidation,
|
|
29
|
+
Rules::DateRangeCheck,
|
|
30
|
+
Rules::ReleaseFormatCheck,
|
|
31
|
+
Rules::UncertaintyConsistency,
|
|
32
|
+
Rules::UnitFormatCheck,
|
|
33
|
+
Rules::NonSiDeclaration,
|
|
34
|
+
Rules::LanguageCodeDedup,
|
|
35
|
+
Rules::XmlListSpacing,
|
|
36
|
+
]
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Run all rules and return a `Dcc::Validate::Result`.
|
|
40
|
+
def call
|
|
41
|
+
issues = []
|
|
42
|
+
rules.each do |rule_class|
|
|
43
|
+
issues.concat(rule_class.new.check_on(dcc))
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
::Dcc::Validate::Result.new(
|
|
47
|
+
issues: issues,
|
|
48
|
+
schema_version: Dcc::TypeGuards.has_attribute?(dcc, :schema_version) ? dcc.schema_version.to_s : nil,
|
|
49
|
+
source: "schematron",
|
|
50
|
+
)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
class << self
|
|
54
|
+
# Convenience class method.
|
|
55
|
+
# @param dcc [Lutaml::Model::Serializable]
|
|
56
|
+
# @return [Dcc::Validate::Result]
|
|
57
|
+
def call(dcc)
|
|
58
|
+
new(dcc).call
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|