sbom-cyclonedx 0.1.0 → 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 +4 -4
- data/.gitignore +15 -0
- data/.gitlab-ci.yml +49 -0
- data/.rspec +3 -0
- data/.rubocop.yml +72 -0
- data/.vscode/settings.json +6 -0
- data/CHANGELOG.md +9 -0
- data/CODE_OF_CONDUCT.md +132 -0
- data/Gemfile +26 -0
- data/Gemfile.lock +179 -0
- data/LICENSE.txt +21 -0
- data/README.md +39 -0
- data/Rakefile +36 -0
- data/Steepfile +14 -0
- data/bin/console +11 -0
- data/bin/rbs_spec +9 -0
- data/bin/setup +8 -0
- data/bom-1.6.schema.json +7334 -0
- data/lib/email_address_extension.rb +26 -0
- data/lib/sbom/cyclone_dx/enum.rb +2178 -0
- data/lib/sbom/cyclone_dx/field.rb +404 -0
- data/lib/sbom/cyclone_dx/pattern.rb +43 -0
- data/lib/sbom/cyclone_dx/record/advisory.rb +17 -0
- data/lib/sbom/cyclone_dx/record/annotation.rb +46 -0
- data/lib/sbom/cyclone_dx/record/attachment.rb +21 -0
- data/lib/sbom/cyclone_dx/record/base.rb +244 -0
- data/lib/sbom/cyclone_dx/record/cipher_suite.rb +23 -0
- data/lib/sbom/cyclone_dx/record/co2_measure.rb +18 -0
- data/lib/sbom/cyclone_dx/record/command.rb +18 -0
- data/lib/sbom/cyclone_dx/record/commit.rb +25 -0
- data/lib/sbom/cyclone_dx/record/component.rb +126 -0
- data/lib/sbom/cyclone_dx/record/component_data.rb +46 -0
- data/lib/sbom/cyclone_dx/record/component_evidence.rb +68 -0
- data/lib/sbom/cyclone_dx/record/component_identity_evidence.rb +36 -0
- data/lib/sbom/cyclone_dx/record/composition.rb +33 -0
- data/lib/sbom/cyclone_dx/record/condition.rb +20 -0
- data/lib/sbom/cyclone_dx/record/copyright.rb +16 -0
- data/lib/sbom/cyclone_dx/record/crypto_properties.rb +137 -0
- data/lib/sbom/cyclone_dx/record/data_governance.rb +21 -0
- data/lib/sbom/cyclone_dx/record/data_governance_responsible_party.rb +22 -0
- data/lib/sbom/cyclone_dx/record/declarations.rb +193 -0
- data/lib/sbom/cyclone_dx/record/definitions.rb +17 -0
- data/lib/sbom/cyclone_dx/record/dependency.rb +21 -0
- data/lib/sbom/cyclone_dx/record/diff.rb +18 -0
- data/lib/sbom/cyclone_dx/record/energy_consumption.rb +31 -0
- data/lib/sbom/cyclone_dx/record/energy_measure.rb +18 -0
- data/lib/sbom/cyclone_dx/record/energy_provider.rb +31 -0
- data/lib/sbom/cyclone_dx/record/environmental_consideration.rb +20 -0
- data/lib/sbom/cyclone_dx/record/event.rb +31 -0
- data/lib/sbom/cyclone_dx/record/external_reference.rb +25 -0
- data/lib/sbom/cyclone_dx/record/fairness_assessment.rb +22 -0
- data/lib/sbom/cyclone_dx/record/formula.rb +29 -0
- data/lib/sbom/cyclone_dx/record/graphic.rb +19 -0
- data/lib/sbom/cyclone_dx/record/graphics_collection.rb +19 -0
- data/lib/sbom/cyclone_dx/record/hash_data.rb +18 -0
- data/lib/sbom/cyclone_dx/record/identifiable_action.rb +21 -0
- data/lib/sbom/cyclone_dx/record/input.rb +34 -0
- data/lib/sbom/cyclone_dx/record/input_output_ml_parameter.rb +17 -0
- data/lib/sbom/cyclone_dx/record/issue.rb +36 -0
- data/lib/sbom/cyclone_dx/record/license.rb +90 -0
- data/lib/sbom/cyclone_dx/record/license_choice.rb +35 -0
- data/lib/sbom/cyclone_dx/record/metadata.rb +55 -0
- data/lib/sbom/cyclone_dx/record/model_card.rb +89 -0
- data/lib/sbom/cyclone_dx/record/note.rb +20 -0
- data/lib/sbom/cyclone_dx/record/organizational_contact.rb +26 -0
- data/lib/sbom/cyclone_dx/record/organizational_entity.rb +28 -0
- data/lib/sbom/cyclone_dx/record/output.rb +34 -0
- data/lib/sbom/cyclone_dx/record/parameter.rb +20 -0
- data/lib/sbom/cyclone_dx/record/patch.rb +23 -0
- data/lib/sbom/cyclone_dx/record/performance_metric.rb +30 -0
- data/lib/sbom/cyclone_dx/record/postal_address.rb +34 -0
- data/lib/sbom/cyclone_dx/record/property.rb +18 -0
- data/lib/sbom/cyclone_dx/record/rating.rb +27 -0
- data/lib/sbom/cyclone_dx/record/release_notes.rb +44 -0
- data/lib/sbom/cyclone_dx/record/resource_reference_choice.rb +22 -0
- data/lib/sbom/cyclone_dx/record/risk.rb +18 -0
- data/lib/sbom/cyclone_dx/record/root.rb +63 -0
- data/lib/sbom/cyclone_dx/record/secured_by.rb +20 -0
- data/lib/sbom/cyclone_dx/record/service.rb +54 -0
- data/lib/sbom/cyclone_dx/record/service_data.rb +32 -0
- data/lib/sbom/cyclone_dx/record/signature.rb +85 -0
- data/lib/sbom/cyclone_dx/record/standard.rb +72 -0
- data/lib/sbom/cyclone_dx/record/step.rb +24 -0
- data/lib/sbom/cyclone_dx/record/swid.rb +29 -0
- data/lib/sbom/cyclone_dx/record/task.rb +56 -0
- data/lib/sbom/cyclone_dx/record/tools.rb +20 -0
- data/lib/sbom/cyclone_dx/record/trigger.rb +48 -0
- data/lib/sbom/cyclone_dx/record/version.rb +24 -0
- data/lib/sbom/cyclone_dx/record/volume.rb +33 -0
- data/lib/sbom/cyclone_dx/record/vulnerability.rb +119 -0
- data/lib/sbom/cyclone_dx/record/vulnerability_source.rb +20 -0
- data/lib/sbom/cyclone_dx/record/workflow.rb +59 -0
- data/lib/sbom/cyclone_dx/record/workspace.rb +45 -0
- data/lib/sbom/cyclone_dx/record.rb +12 -0
- data/lib/sbom/cyclone_dx/validator/array_validator.rb +66 -0
- data/lib/sbom/cyclone_dx/validator/base_validator.rb +43 -0
- data/lib/sbom/cyclone_dx/validator/boolean_validator.rb +16 -0
- data/lib/sbom/cyclone_dx/validator/date_time_validator.rb +29 -0
- data/lib/sbom/cyclone_dx/validator/email_address_validator.rb +31 -0
- data/lib/sbom/cyclone_dx/validator/float_validator.rb +30 -0
- data/lib/sbom/cyclone_dx/validator/integer_validator.rb +30 -0
- data/lib/sbom/cyclone_dx/validator/record_validator.rb +26 -0
- data/lib/sbom/cyclone_dx/validator/string_validator.rb +33 -0
- data/lib/sbom/cyclone_dx/validator/union_validator.rb +39 -0
- data/lib/sbom/cyclone_dx/validator/uri_validator.rb +32 -0
- data/lib/sbom/cyclone_dx/validator.rb +32 -0
- data/lib/sbom/cyclone_dx/version.rb +7 -0
- data/lib/sbom/cyclone_dx.rb +39 -0
- data/rbs_collection.lock.yaml +288 -0
- data/rbs_collection.yaml +31 -0
- data/sbom-cyclone_dx.gemspec +32 -0
- data/sig/email_address_extension.rbs +14 -0
- data/sig/sbom/cyclone_dx/enum.rbs +93 -0
- data/sig/sbom/cyclone_dx/field.rbs +434 -0
- data/sig/sbom/cyclone_dx/pattern.rbs +24 -0
- data/sig/sbom/cyclone_dx/record/advisory.rbs +19 -0
- data/sig/sbom/cyclone_dx/record/annotation.rbs +63 -0
- data/sig/sbom/cyclone_dx/record/attachment.rbs +24 -0
- data/sig/sbom/cyclone_dx/record/base.rbs +62 -0
- data/sig/sbom/cyclone_dx/record/cipher_suite.rbs +24 -0
- data/sig/sbom/cyclone_dx/record/co2_measure.rbs +14 -0
- data/sig/sbom/cyclone_dx/record/command.rbs +19 -0
- data/sig/sbom/cyclone_dx/record/commit.rbs +34 -0
- data/sig/sbom/cyclone_dx/record/component.rbs +203 -0
- data/sig/sbom/cyclone_dx/record/component_data.rbs +73 -0
- data/sig/sbom/cyclone_dx/record/component_evidence.rbs +115 -0
- data/sig/sbom/cyclone_dx/record/component_identity_evidence.rbs +53 -0
- data/sig/sbom/cyclone_dx/record/composition.rbs +39 -0
- data/sig/sbom/cyclone_dx/record/condition.rbs +24 -0
- data/sig/sbom/cyclone_dx/record/copyright.rbs +14 -0
- data/sig/sbom/cyclone_dx/record/crypto_properties.rbs +268 -0
- data/sig/sbom/cyclone_dx/record/data_governance.rbs +24 -0
- data/sig/sbom/cyclone_dx/record/data_governance_responsible_party.rbs +19 -0
- data/sig/sbom/cyclone_dx/record/declarations.rbs +352 -0
- data/sig/sbom/cyclone_dx/record/definitions.rbs +14 -0
- data/sig/sbom/cyclone_dx/record/dependency.rbs +24 -0
- data/sig/sbom/cyclone_dx/record/diff.rbs +19 -0
- data/sig/sbom/cyclone_dx/record/energy_consumption.rbs +39 -0
- data/sig/sbom/cyclone_dx/record/energy_measure.rbs +14 -0
- data/sig/sbom/cyclone_dx/record/energy_provider.rbs +39 -0
- data/sig/sbom/cyclone_dx/record/environmental_consideration.rbs +19 -0
- data/sig/sbom/cyclone_dx/record/event.rbs +44 -0
- data/sig/sbom/cyclone_dx/record/external_reference.rbs +29 -0
- data/sig/sbom/cyclone_dx/record/fairness_assessment.rbs +29 -0
- data/sig/sbom/cyclone_dx/record/formula.rbs +34 -0
- data/sig/sbom/cyclone_dx/record/graphic.rbs +19 -0
- data/sig/sbom/cyclone_dx/record/graphics_collection.rbs +19 -0
- data/sig/sbom/cyclone_dx/record/hash_data.rbs +19 -0
- data/sig/sbom/cyclone_dx/record/identifiable_action.rbs +24 -0
- data/sig/sbom/cyclone_dx/record/input.rbs +44 -0
- data/sig/sbom/cyclone_dx/record/input_output_ml_parameter.rbs +14 -0
- data/sig/sbom/cyclone_dx/record/issue.rbs +53 -0
- data/sig/sbom/cyclone_dx/record/license.rbs +134 -0
- data/sig/sbom/cyclone_dx/record/license_choice.rbs +39 -0
- data/sig/sbom/cyclone_dx/record/metadata.rbs +82 -0
- data/sig/sbom/cyclone_dx/record/model_card.rbs +143 -0
- data/sig/sbom/cyclone_dx/record/note.rbs +19 -0
- data/sig/sbom/cyclone_dx/record/organizational_contact.rbs +29 -0
- data/sig/sbom/cyclone_dx/record/organizational_entity.rbs +34 -0
- data/sig/sbom/cyclone_dx/record/output.rbs +44 -0
- data/sig/sbom/cyclone_dx/record/parameter.rbs +24 -0
- data/sig/sbom/cyclone_dx/record/patch.rbs +24 -0
- data/sig/sbom/cyclone_dx/record/performance_metric.rbs +43 -0
- data/sig/sbom/cyclone_dx/record/postal_address.rbs +44 -0
- data/sig/sbom/cyclone_dx/record/property.rbs +19 -0
- data/sig/sbom/cyclone_dx/record/rating.rbs +39 -0
- data/sig/sbom/cyclone_dx/record/release_notes.rbs +64 -0
- data/sig/sbom/cyclone_dx/record/resource_reference_choice.rbs +19 -0
- data/sig/sbom/cyclone_dx/record/risk.rbs +19 -0
- data/sig/sbom/cyclone_dx/record/root.rbs +84 -0
- data/sig/sbom/cyclone_dx/record/secured_by.rbs +19 -0
- data/sig/sbom/cyclone_dx/record/service.rbs +99 -0
- data/sig/sbom/cyclone_dx/record/service_data.rbs +44 -0
- data/sig/sbom/cyclone_dx/record/signature.rbs +130 -0
- data/sig/sbom/cyclone_dx/record/standard.rbs +132 -0
- data/sig/sbom/cyclone_dx/record/step.rbs +29 -0
- data/sig/sbom/cyclone_dx/record/swid.rbs +44 -0
- data/sig/sbom/cyclone_dx/record/task.rbs +84 -0
- data/sig/sbom/cyclone_dx/record/tools.rbs +19 -0
- data/sig/sbom/cyclone_dx/record/trigger.rbs +69 -0
- data/sig/sbom/cyclone_dx/record/version.rbs +24 -0
- data/sig/sbom/cyclone_dx/record/volume.rbs +49 -0
- data/sig/sbom/cyclone_dx/record/vulnerability.rbs +209 -0
- data/sig/sbom/cyclone_dx/record/vulnerability_source.rbs +19 -0
- data/sig/sbom/cyclone_dx/record/workflow.rbs +94 -0
- data/sig/sbom/cyclone_dx/record/workspace.rbs +69 -0
- data/sig/sbom/cyclone_dx/record.rbs +161 -0
- data/sig/sbom/cyclone_dx/type.rbs +16 -0
- data/sig/sbom/cyclone_dx/validator/array_validator.rbs +31 -0
- data/sig/sbom/cyclone_dx/validator/base_validator.rbs +21 -0
- data/sig/sbom/cyclone_dx/validator/boolean_validator.rbs +9 -0
- data/sig/sbom/cyclone_dx/validator/date_time_validator.rbs +10 -0
- data/sig/sbom/cyclone_dx/validator/email_address_validator.rbs +10 -0
- data/sig/sbom/cyclone_dx/validator/float_validator.rbs +12 -0
- data/sig/sbom/cyclone_dx/validator/integer_validator.rbs +12 -0
- data/sig/sbom/cyclone_dx/validator/record_validator.rbs +12 -0
- data/sig/sbom/cyclone_dx/validator/string_validator.rbs +14 -0
- data/sig/sbom/cyclone_dx/validator/union_validator.rbs +24 -0
- data/sig/sbom/cyclone_dx/validator/uri_validator.rbs +10 -0
- data/sig/sbom/cyclone_dx/validator.rbs +66 -0
- data/sig/sbom/cyclone_dx.rbs +13 -0
- data/sig/types.rbs +45 -0
- data/spec/email_address_extension_spec.rb +27 -0
- data/spec/factories/factory_helper.rb +78 -0
- data/spec/factories/record/advisory_factory.rb +11 -0
- data/spec/factories/record/annotation_factory.rb +63 -0
- data/spec/factories/record/attachment_factory.rb +9 -0
- data/spec/factories/record/cipher_suite_factory.rb +26 -0
- data/spec/factories/record/co2_measure_factory.rb +9 -0
- data/spec/factories/record/command_factory.rb +10 -0
- data/spec/factories/record/commit_factory.rb +13 -0
- data/spec/factories/record/component_data_factory.rb +28 -0
- data/spec/factories/record/component_evidence_factory.rb +44 -0
- data/spec/factories/record/component_factory.rb +102 -0
- data/spec/factories/record/component_identity_evidence_factory.rb +25 -0
- data/spec/factories/record/composition_factory.rb +20 -0
- data/spec/factories/record/condition_factory.rb +11 -0
- data/spec/factories/record/copyright_factory.rb +9 -0
- data/spec/factories/record/crypto_properties_factory.rb +191 -0
- data/spec/factories/record/data_governance_factory.rb +11 -0
- data/spec/factories/record/data_governance_responsible_party_factory.rb +31 -0
- data/spec/factories/record/declarations_factory.rb +145 -0
- data/spec/factories/record/definitions_factory.rb +9 -0
- data/spec/factories/record/dependency_factory.rb +12 -0
- data/spec/factories/record/diff_factory.rb +24 -0
- data/spec/factories/record/energy_consumption_factory.rb +15 -0
- data/spec/factories/record/energy_measure_factory.rb +9 -0
- data/spec/factories/record/energy_provider_factory.rb +15 -0
- data/spec/factories/record/environmental_consideration_factory.rb +10 -0
- data/spec/factories/record/event_factory.rb +15 -0
- data/spec/factories/record/external_reference_factory.rb +13 -0
- data/spec/factories/record/fairness_assessment_factory.rb +12 -0
- data/spec/factories/record/formula_factory.rb +13 -0
- data/spec/factories/record/graphic_factory.rb +10 -0
- data/spec/factories/record/graphics_collection_factory.rb +10 -0
- data/spec/factories/record/hash_data_factory.rb +10 -0
- data/spec/factories/record/identifiable_action_factory.rb +11 -0
- data/spec/factories/record/input_factory.rb +36 -0
- data/spec/factories/record/input_output_ml_parameter_factory.rb +9 -0
- data/spec/factories/record/issue_factory.rb +22 -0
- data/spec/factories/record/license_choice_factory.rb +23 -0
- data/spec/factories/record/license_factory.rb +99 -0
- data/spec/factories/record/metadata_factory.rb +38 -0
- data/spec/factories/record/model_card_factory.rb +59 -0
- data/spec/factories/record/note_factory.rb +11 -0
- data/spec/factories/record/organizational_contact_factory.rb +12 -0
- data/spec/factories/record/organizational_entity_factory.rb +13 -0
- data/spec/factories/record/output_factory.rb +32 -0
- data/spec/factories/record/parameter_factory.rb +11 -0
- data/spec/factories/record/patch_factory.rb +12 -0
- data/spec/factories/record/performance_metric_factory.rb +20 -0
- data/spec/factories/record/postal_address_factory.rb +14 -0
- data/spec/factories/record/property_factory.rb +11 -0
- data/spec/factories/record/rating_factory.rb +14 -0
- data/spec/factories/record/release_notes_factory.rb +20 -0
- data/spec/factories/record/resource_reference_choice_factory.rb +27 -0
- data/spec/factories/record/risk_factory.rb +10 -0
- data/spec/factories/record/root_factory.rb +23 -0
- data/spec/factories/record/secured_by_factory.rb +10 -0
- data/spec/factories/record/service_data_factory.rb +16 -0
- data/spec/factories/record/service_factory.rb +27 -0
- data/spec/factories/record/signature_factory.rb +50 -0
- data/spec/factories/record/standard_factory.rb +37 -0
- data/spec/factories/record/step_factory.rb +12 -0
- data/spec/factories/record/swid_factory.rb +16 -0
- data/spec/factories/record/task_factory.rb +24 -0
- data/spec/factories/record/tools_factory.rb +10 -0
- data/spec/factories/record/trigger_factory.rb +21 -0
- data/spec/factories/record/version_factory.rb +19 -0
- data/spec/factories/record/volume_factory.rb +16 -0
- data/spec/factories/record/vulnerability_factory.rb +70 -0
- data/spec/factories/record/vulnerability_source_factory.rb +10 -0
- data/spec/factories/record/workflow_factory.rb +26 -0
- data/spec/factories/record/workspace_factory.rb +21 -0
- data/spec/factories/record_factory.rb +159 -0
- data/spec/fixtures/cipher_info.yml +948 -0
- data/spec/fixtures/purl_data.yml +0 -0
- data/spec/sbom/cyclone_dx/enum_spec.rb +30 -0
- data/spec/sbom/cyclone_dx/field_spec.rb +104 -0
- data/spec/sbom/cyclone_dx/pattern_spec.rb +18 -0
- data/spec/sbom/cyclone_dx/record/advisory_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/annotation_spec.rb +31 -0
- data/spec/sbom/cyclone_dx/record/attachment_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/base_spec.rb +363 -0
- data/spec/sbom/cyclone_dx/record/cipher_suite_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/co2_measure_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/command_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/commit_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/component_data_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/component_evidence_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/component_identity_evidence_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/component_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/composition_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/condition_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/copyright_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/crypto_properties_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/data_governance_responsible_party_spec.rb +19 -0
- data/spec/sbom/cyclone_dx/record/data_governance_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/declarations_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/definitions_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/dependency_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/diff_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/energy_consumption_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/energy_measure_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/energy_provider_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/environmental_consideration_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/event_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/external_reference_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/fairness_assessment_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/formula_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/graphic_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/graphics_collection_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/hash_data_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/identifiable_action_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/input_output_ml_parameter_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/input_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/issue_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/license_choice_spec.rb +26 -0
- data/spec/sbom/cyclone_dx/record/license_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/metadata_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/model_card_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/note_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/organizational_contact_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/organizational_entity_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/output_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/parameter_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/patch_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/performance_metric_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/postal_address_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/property_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/rating_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/release_notes_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/resource_reference_choice_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/risk_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/root_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/secured_by_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/service_data_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/service_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/signature_spec.rb +26 -0
- data/spec/sbom/cyclone_dx/record/standard_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/step_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/swid_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/task_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/tools_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/trigger_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/version_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/volume_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/vulnerability_source_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/vulnerability_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/workflow_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record/workspace_spec.rb +14 -0
- data/spec/sbom/cyclone_dx/record_spec.rb +7 -0
- data/spec/sbom/cyclone_dx/validator/array_validator_spec.rb +184 -0
- data/spec/sbom/cyclone_dx/validator/base_validator_spec.rb +71 -0
- data/spec/sbom/cyclone_dx/validator/boolean_validator_spec.rb +26 -0
- data/spec/sbom/cyclone_dx/validator/date_time_validator_spec.rb +28 -0
- data/spec/sbom/cyclone_dx/validator/email_address_validator_spec.rb +23 -0
- data/spec/sbom/cyclone_dx/validator/float_validator_spec.rb +71 -0
- data/spec/sbom/cyclone_dx/validator/integer_validator_spec.rb +71 -0
- data/spec/sbom/cyclone_dx/validator/record_validator_spec.rb +35 -0
- data/spec/sbom/cyclone_dx/validator/string_validator_spec.rb +94 -0
- data/spec/sbom/cyclone_dx/validator/union_validator_spec.rb +65 -0
- data/spec/sbom/cyclone_dx/validator/uri_validator_spec.rb +21 -0
- data/spec/sbom/cyclone_dx/validator_spec.rb +38 -0
- data/spec/sbom/cyclone_dx/version_spec.rb +9 -0
- data/spec/sbom/cyclone_dx_spec.rb +7 -0
- data/spec/spec_helper.rb +39 -0
- metadata +377 -6
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
FactoryBot.define do
|
4
|
+
factory :service, parent: :record, class: "SBOM::CycloneDX::Record::Service" do
|
5
|
+
name { Faker::App.name }
|
6
|
+
|
7
|
+
trait :all_fields do
|
8
|
+
bom_ref { generate(:ref_link) }
|
9
|
+
provider { association :organizational_entity }
|
10
|
+
group { Faker::Lorem.word }
|
11
|
+
version { Faker::App.semantic_version }
|
12
|
+
description { Faker::Lorem.sentence }
|
13
|
+
endpoints { Array.new(rand(0..3)) { generate(:url) } }
|
14
|
+
authenticated { Faker::Boolean.boolean }
|
15
|
+
x_trust_boundary { Faker::Boolean.boolean }
|
16
|
+
trust_zone { Faker::Lorem.word }
|
17
|
+
data { association_list(:service_data) }
|
18
|
+
licenses { license_choice_list }
|
19
|
+
external_references { association_list(:external_reference) }
|
20
|
+
services { association_list(:service) }
|
21
|
+
release_notes { association :release_notes }
|
22
|
+
properties { association_list(:property) }
|
23
|
+
tags { Array.new(rand(0..3)) { Faker::Lorem.word } }
|
24
|
+
signature { generate_signature }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
FactoryBot.define do
|
4
|
+
# This will almost not pass cursory validation, but is good enough for these specs
|
5
|
+
factory :jsf_signature, parent: :record, class: "SBOM::CycloneDX::Record::Signature::JSFSignature" do
|
6
|
+
algorithm { SBOM::CycloneDX::Enum::SIGNATURE_ALGORITHM.sample }
|
7
|
+
value { Base64.encode64(SecureRandom.bytes(64)) }
|
8
|
+
|
9
|
+
trait :all_fields do
|
10
|
+
key_id { SecureRandom.uuid }
|
11
|
+
public_key { generate_association(%i[ec okp rsa]) }
|
12
|
+
certificate_path { Array.new(rand(1..3)) { Base64.encode64(SecureRandom.bytes(534)) } }
|
13
|
+
excludes { Faker::Lorem.words(number: rand(1..3)).map(&:downcase) }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
factory :signature_chain, parent: :record, class: "SBOM::CycloneDX::Record::Signature::SignatureChain" do
|
18
|
+
trait :all_fields do
|
19
|
+
signatures { association_list(:jsf_signature) }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
factory :signer_list, parent: :record, class: "SBOM::CycloneDX::Record::Signature::SignerList" do
|
24
|
+
trait :all_fields do
|
25
|
+
signers { association_list(:jsf_signature) }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
factory :ec, parent: :record, class: "SBOM::CycloneDX::Record::Signature::JSFSignature::PublicKey::EC" do
|
30
|
+
crv { SBOM::CycloneDX::Enum::SIGNATURE_EC_CRV.sample }
|
31
|
+
x { Base64.encode64(SecureRandom.bytes(32)) }
|
32
|
+
y { Base64.encode64(SecureRandom.bytes(32)) }
|
33
|
+
|
34
|
+
trait :all_fields
|
35
|
+
end
|
36
|
+
|
37
|
+
factory :okp, parent: :record, class: "SBOM::CycloneDX::Record::Signature::JSFSignature::PublicKey::OKP" do
|
38
|
+
crv { SBOM::CycloneDX::Enum::SIGNATURE_OKP_CRV.sample }
|
39
|
+
x { Base64.encode64(SecureRandom.bytes(32)) }
|
40
|
+
|
41
|
+
trait :all_fields
|
42
|
+
end
|
43
|
+
|
44
|
+
factory :rsa, parent: :record, class: "SBOM::CycloneDX::Record::Signature::JSFSignature::PublicKey::RSA" do
|
45
|
+
n { Base64.encode64(rand(1..4096).to_s) }
|
46
|
+
e { Base64.encode64(rand(1..4096).to_s) }
|
47
|
+
|
48
|
+
trait :all_fields
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
FactoryBot.define do
|
4
|
+
factory :standard, parent: :record, class: "SBOM::CycloneDX::Record::Standard" do
|
5
|
+
trait :all_fields do
|
6
|
+
bom_ref { generate(:ref_link) }
|
7
|
+
name { Faker::Lorem.word }
|
8
|
+
version { Faker::App.semantic_version }
|
9
|
+
description { Faker::Lorem.sentence }
|
10
|
+
owner { Faker::Company.name }
|
11
|
+
requirements { association_list(:requirement) }
|
12
|
+
levels { association_list(:level) }
|
13
|
+
external_references { association_list(:external_reference) }
|
14
|
+
signature { generate_signature }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
factory :level, parent: :record, class: "SBOM::CycloneDX::Record::Standard::Level" do
|
19
|
+
bom_ref { generate(:ref_link) }
|
20
|
+
identifier { Faker::Lorem.word }
|
21
|
+
title { Faker::Lorem.word }
|
22
|
+
description { Faker::Lorem.sentence }
|
23
|
+
requirements { Array.new(rand(0..2)) { generate(:ref_link) } }
|
24
|
+
end
|
25
|
+
|
26
|
+
factory :requirement, parent: :record, class: "SBOM::CycloneDX::Record::Standard::Requirement" do
|
27
|
+
bom_ref { generate(:ref_link) }
|
28
|
+
identifier { Faker::Lorem.word }
|
29
|
+
title { Faker::Lorem.word }
|
30
|
+
text { Faker::Lorem.paragraph }
|
31
|
+
descriptions { Array.new(rand(0..2)) { Faker::Lorem.sentence } }
|
32
|
+
open_cre { Array.new(rand(0..3)) { generate(:open_cre) } }
|
33
|
+
parent { generate(:ref_link) }
|
34
|
+
properties { association_list(:property) }
|
35
|
+
external_references { association_list(:external_reference) }
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
FactoryBot.define do
|
4
|
+
factory :step, parent: :record, class: "SBOM::CycloneDX::Record::Step" do
|
5
|
+
trait :all_fields do
|
6
|
+
name { Faker::Lorem.word }
|
7
|
+
description { Faker::Lorem.sentence }
|
8
|
+
commands { association_list(:command) }
|
9
|
+
properties { association_list(:property) }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
FactoryBot.define do
|
4
|
+
factory :swid, parent: :record, class: "SBOM::CycloneDX::Record::SWID" do
|
5
|
+
tag_id { "tag_id" }
|
6
|
+
name { "name" }
|
7
|
+
|
8
|
+
trait :all_fields do
|
9
|
+
version { Faker::App.semantic_version }
|
10
|
+
tag_version { rand(0..100) }
|
11
|
+
patch { Faker::Boolean.boolean }
|
12
|
+
text { association(:attachment) }
|
13
|
+
url { generate(:url) }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
FactoryBot.define do
|
4
|
+
factory :task, parent: :record, class: "SBOM::CycloneDX::Record::Task" do
|
5
|
+
bom_ref { generate(:ref_link) }
|
6
|
+
uid { Faker::Lorem.characters(number: 16) }
|
7
|
+
|
8
|
+
trait :all_fields do
|
9
|
+
name { Faker::Lorem.word }
|
10
|
+
description { Faker::Lorem.sentence }
|
11
|
+
resource_references { association_list(:resource_reference_choice) }
|
12
|
+
task_types { SBOM::CycloneDX::Enum::TASK_TYPE.sample(rand(1..3)) }
|
13
|
+
trigger { association(:trigger) }
|
14
|
+
steps { association_list(:step) }
|
15
|
+
inputs { association_list(:input) }
|
16
|
+
outputs { association_list(:output) }
|
17
|
+
time_start { Faker::Time.backward(days: 367) }
|
18
|
+
time_end { time_start + rand(1..100).hours }
|
19
|
+
workspaces { association_list(:workspace) }
|
20
|
+
runtime_topology { association_list(:dependency) }
|
21
|
+
properties { association_list(:property) }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
FactoryBot.define do
|
4
|
+
factory :tools, parent: :record, class: "SBOM::CycloneDX::Record::Tools" do
|
5
|
+
trait :all_fields do
|
6
|
+
components { association_list(:component) }
|
7
|
+
services { association_list(:service) }
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
FactoryBot.define do
|
4
|
+
factory :trigger, parent: :record, class: "SBOM::CycloneDX::Record::Trigger" do
|
5
|
+
bom_ref { generate(:ref_link) }
|
6
|
+
uid { Faker::Lorem.characters(number: 16) }
|
7
|
+
type { SBOM::CycloneDX::Enum::TRIGGER_TYPE.sample }
|
8
|
+
|
9
|
+
trait :all_fields do
|
10
|
+
name { Faker::Lorem.word }
|
11
|
+
description { Faker::Lorem.sentence }
|
12
|
+
resource_references { association_list(:resource_reference_choice) }
|
13
|
+
event { association(:event) }
|
14
|
+
conditions { association_list(:condition) }
|
15
|
+
time_activated { Faker::Time.backward(days: 367) }
|
16
|
+
inputs { association_list(:input) }
|
17
|
+
outputs { association_list(:output) }
|
18
|
+
properties { association_list(:property) }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
FactoryBot.define do
|
4
|
+
factory :version, parent: :record, class: "SBOM::CycloneDX::Record::Version" do
|
5
|
+
transient do
|
6
|
+
version_type { %i[fixed range].sample }
|
7
|
+
end
|
8
|
+
|
9
|
+
trait(:fixed) { version_type { :fixed } }
|
10
|
+
trait(:range) { version_type { :range } }
|
11
|
+
|
12
|
+
version { Faker::App.semantic_version if version_type == :fixed }
|
13
|
+
range { ">=#{Faker::App.semantic_version}" if version_type == :range }
|
14
|
+
|
15
|
+
trait :all_fields do
|
16
|
+
status { SBOM::CycloneDX::Enum::AFFECTED_STATUS.sample }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
FactoryBot.define do
|
4
|
+
factory :volume, parent: :record, class: "SBOM::CycloneDX::Record::Volume" do
|
5
|
+
trait :all_fields do
|
6
|
+
uid { Faker::Lorem.characters(number: 16) }
|
7
|
+
name { Faker::Lorem.word }
|
8
|
+
mode { SBOM::CycloneDX::Enum::VOLUME_MODE.sample }
|
9
|
+
path { Faker::File.dir }
|
10
|
+
size_allocated { "#{rand(0..1023)}#{["", "K", "M", "G", "T", "P"].sample}B" }
|
11
|
+
persistent { Faker::Boolean.boolean }
|
12
|
+
remote { Faker::Boolean.boolean }
|
13
|
+
properties { association_list(:property) }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
FactoryBot.define do
|
4
|
+
factory :vulnerability, parent: :record, class: "SBOM::CycloneDX::Record::Vulnerability" do
|
5
|
+
trait :all_fields do
|
6
|
+
bom_ref { generate(:ref_link) }
|
7
|
+
id { "CVE-#{rand(2015..2024)}-#{rand(100_000..999_999)}" }
|
8
|
+
source { association(:vulnerability_source) }
|
9
|
+
references { association_list(:reference) }
|
10
|
+
ratings { association_list(:rating) }
|
11
|
+
cwes { Array.new(rand(1..3)) { rand(1..999) } }
|
12
|
+
description { Faker::Lorem.sentence }
|
13
|
+
detail { Faker::Lorem.paragraph }
|
14
|
+
recommendation { Faker::Lorem.sentence }
|
15
|
+
workaround { Faker::Lorem.sentence }
|
16
|
+
proof_of_concept { association(:proof_of_concept) }
|
17
|
+
advisories { association_list(:advisory) }
|
18
|
+
created { Faker::Time.backward(days: 367) }
|
19
|
+
published { created + rand(1..7).days }
|
20
|
+
updated { published + rand(1..30).days }
|
21
|
+
rejected { updated + rand(1..30).days }
|
22
|
+
credits { association(:credits) }
|
23
|
+
tools { association(:tools) }
|
24
|
+
analysis { association(:analysis) }
|
25
|
+
affects { association_list(:affects) }
|
26
|
+
properties { association_list(:property) }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
factory :analysis, parent: :record, class: "SBOM::CycloneDX::Record::Vulnerability::Analysis" do
|
31
|
+
trait :all_fields do
|
32
|
+
state { SBOM::CycloneDX::Enum::IMPACT_ANALYSIS_STATE.sample }
|
33
|
+
justification { SBOM::CycloneDX::Enum::IMPACT_ANALYSIS_JUSTIFICATION.sample }
|
34
|
+
response { SBOM::CycloneDX::Enum::RESPONSE.sample(rand(1..3)) }
|
35
|
+
detail { Faker::Lorem.paragraph }
|
36
|
+
first_issued { Faker::Time.backward(days: 367) }
|
37
|
+
last_updated { first_issued + rand(1..30).days }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
factory :affects, parent: :record, class: "SBOM::CycloneDX::Record::Vulnerability::Affects" do
|
42
|
+
ref { generate(:ref_or_cdx_urn) }
|
43
|
+
|
44
|
+
trait :all_fields do
|
45
|
+
versions { association_list(:version) }
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
factory :credits, parent: :record, class: "SBOM::CycloneDX::Record::Vulnerability::Credits" do
|
50
|
+
trait :all_fields do
|
51
|
+
organizations { association_list(:organizational_entity) }
|
52
|
+
individuals { association_list(:organizational_contact) }
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
factory :proof_of_concept, parent: :record, class: "SBOM::CycloneDX::Record::Vulnerability::ProofOfConcept" do
|
57
|
+
trait :all_fields do
|
58
|
+
reproduction_steps { Faker::Lorem.paragraph }
|
59
|
+
environment { Faker::Lorem.word }
|
60
|
+
supporting_material { association_list(:attachment) }
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
factory :reference, parent: :record, class: "SBOM::CycloneDX::Record::Vulnerability::Reference" do
|
65
|
+
id { "CVE-#{rand(2015..2024)}-#{rand(100_000..999_999)}" }
|
66
|
+
source { association(:vulnerability_source) }
|
67
|
+
|
68
|
+
trait :all_fields
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
FactoryBot.define do
|
4
|
+
factory :vulnerability_source, parent: :record, class: "SBOM::CycloneDX::Record::VulnerabilitySource" do
|
5
|
+
trait :all_fields do
|
6
|
+
url { generate(:url).to_s }
|
7
|
+
name { Faker::Lorem.word }
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
FactoryBot.define do
|
4
|
+
factory :workflow, parent: :record, class: "SBOM::CycloneDX::Record::Workflow" do
|
5
|
+
bom_ref { generate(:ref_link) }
|
6
|
+
uid { SecureRandom.uuid }
|
7
|
+
|
8
|
+
trait :all_fields do
|
9
|
+
name { Faker::Lorem.word }
|
10
|
+
description { Faker::Lorem.sentence }
|
11
|
+
resource_references { association_list(:resource_reference_choice) }
|
12
|
+
tasks { association_list(:task) }
|
13
|
+
task_dependencies { association_list(:dependency) }
|
14
|
+
task_types { SBOM::CycloneDX::Enum::TASK_TYPE.sample(rand(1..3)) }
|
15
|
+
trigger { association(:trigger) }
|
16
|
+
steps { association_list(:step) }
|
17
|
+
inputs { association_list(:input) }
|
18
|
+
outputs { association_list(:output) }
|
19
|
+
time_start { Faker::Time.backward(days: 367) }
|
20
|
+
time_end { time_start + rand(1..100).hours }
|
21
|
+
workspaces { association_list(:workspace) }
|
22
|
+
runtime_topology { association_list(:dependency) }
|
23
|
+
properties { association_list(:property) }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
FactoryBot.define do
|
4
|
+
factory :workspace, parent: :record, class: "SBOM::CycloneDX::Record::Workspace" do
|
5
|
+
bom_ref { generate(:ref_link) }
|
6
|
+
uid { Faker::Lorem.characters(number: 16) }
|
7
|
+
|
8
|
+
trait :all_fields do
|
9
|
+
name { Faker::Lorem.word }
|
10
|
+
aliases { Faker::Lorem.words(number: rand(1..3)) }
|
11
|
+
description { Faker::Lorem.sentence }
|
12
|
+
resource_references { association_list(:resource_reference_choice) }
|
13
|
+
access_mode { SBOM::CycloneDX::Enum::ACCESS_MODE.sample }
|
14
|
+
mount_path { Faker::File.dir }
|
15
|
+
managed_data_type { Faker::Lorem.word }
|
16
|
+
volume_request { Faker::Lorem.word }
|
17
|
+
volume { association(:volume) }
|
18
|
+
properties { association_list(:property) }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,159 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "faker"
|
4
|
+
require "i18n"
|
5
|
+
require "sbom/cyclone_dx"
|
6
|
+
require "sbom/cyclone_dx/record"
|
7
|
+
|
8
|
+
module SBOM
|
9
|
+
module CycloneDX
|
10
|
+
module Record
|
11
|
+
module MockRecord
|
12
|
+
# Schema name: Basic
|
13
|
+
class Basic < Base
|
14
|
+
prop :string_value, :string
|
15
|
+
end
|
16
|
+
|
17
|
+
# Schema name: AllTypes
|
18
|
+
class AllTypes < Base
|
19
|
+
prop :string_value, :string
|
20
|
+
prop :integer_value, :integer
|
21
|
+
prop :float_value, :float
|
22
|
+
prop :boolean_value, :boolean
|
23
|
+
prop :basic_record_value, Basic
|
24
|
+
prop :array_value, :array, items: :string
|
25
|
+
prop :datetime_value, :date_time
|
26
|
+
prop :uri_value, :uri
|
27
|
+
prop :union_value, :union, of: %i[string integer]
|
28
|
+
prop :email_address_value, :email_address
|
29
|
+
end
|
30
|
+
|
31
|
+
# Schema name: RequiredMembers
|
32
|
+
class RequiredMembers < Base
|
33
|
+
prop :always_required, :string, required: true
|
34
|
+
prop :any_required_a, :string
|
35
|
+
prop :any_required_b, :string
|
36
|
+
prop :one_required_a, :string
|
37
|
+
prop :one_required_b, :string
|
38
|
+
prop :impl_required_a, :string
|
39
|
+
prop :impl_required_b, :string
|
40
|
+
prop :optional, :string
|
41
|
+
|
42
|
+
validate :any_required_a, :any_required_b, presence: :any
|
43
|
+
validate :one_required_a, :one_required_b, presence: :one
|
44
|
+
validate(:impl_required_a, :impl_required_b) { |a, b| a.nil? || b.present? }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
FactoryBot.define do
|
52
|
+
factory :record, class: "SBOM::CycloneDX::Record" do
|
53
|
+
initialize_with { new(**attributes) }
|
54
|
+
|
55
|
+
factory :mock_record, class: "SBOM::CycloneDX::Record" do
|
56
|
+
trait :string_value do
|
57
|
+
string_value { Faker::Lorem.sentence }
|
58
|
+
end
|
59
|
+
|
60
|
+
trait :integer_value do
|
61
|
+
integer_value { rand(1..100) }
|
62
|
+
end
|
63
|
+
|
64
|
+
trait :float_value do
|
65
|
+
float_value { rand(1..100) + rand(0.01..0.99) }
|
66
|
+
end
|
67
|
+
|
68
|
+
trait :boolean_value do
|
69
|
+
boolean_value { [true, false].sample }
|
70
|
+
end
|
71
|
+
|
72
|
+
trait :basic_record_value do
|
73
|
+
basic_record_value { basic_record }
|
74
|
+
end
|
75
|
+
|
76
|
+
trait :array_value do
|
77
|
+
array_value { Faker::Lorem.words(number: 4) }
|
78
|
+
end
|
79
|
+
|
80
|
+
trait :datetime_value do
|
81
|
+
datetime_value { Faker::Time.between(from: DateTime.now - 2, to: DateTime.now) }
|
82
|
+
end
|
83
|
+
|
84
|
+
trait :uri_value do
|
85
|
+
uri_value { [URI.parse(Faker::Internet.url), Faker::Internet.url].sample }
|
86
|
+
end
|
87
|
+
|
88
|
+
trait :union_value do
|
89
|
+
union_value { [Faker::Marketing.buzzwords, rand(1..100)].sample }
|
90
|
+
end
|
91
|
+
|
92
|
+
trait :email_address_value do
|
93
|
+
email_address_value do
|
94
|
+
[EmailAddress::Address.new(Faker::Internet.email), Faker::Internet.email].sample
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
factory :basic_record, class: "SBOM::CycloneDX::Record::MockRecord::Basic", traits: [:string_value]
|
99
|
+
|
100
|
+
factory :all_types_record, class: "SBOM::CycloneDX::Record::MockRecord::AllTypes", traits: %i[
|
101
|
+
string_value
|
102
|
+
integer_value
|
103
|
+
float_value
|
104
|
+
boolean_value
|
105
|
+
basic_record_value
|
106
|
+
array_value
|
107
|
+
datetime_value
|
108
|
+
uri_value
|
109
|
+
union_value
|
110
|
+
email_address_value
|
111
|
+
]
|
112
|
+
|
113
|
+
factory :required_members_record, class: "SBOM::CycloneDX::Record::MockRecord::RequiredMembers" do
|
114
|
+
trait :valid do
|
115
|
+
always_required { Faker::Lorem.word }
|
116
|
+
any_required_b { Faker::Lorem.word }
|
117
|
+
one_required_b { Faker::Lorem.word }
|
118
|
+
end
|
119
|
+
|
120
|
+
trait :missing_always_required do
|
121
|
+
any_required_b { Faker::Lorem.word }
|
122
|
+
one_required_b { Faker::Lorem.word }
|
123
|
+
end
|
124
|
+
|
125
|
+
trait :missing_any_required do
|
126
|
+
always_required { Faker::Lorem.word }
|
127
|
+
one_required_b { Faker::Lorem.word }
|
128
|
+
end
|
129
|
+
|
130
|
+
trait :missing_one_required do
|
131
|
+
always_required { Faker::Lorem.word }
|
132
|
+
any_required_b { Faker::Lorem.word }
|
133
|
+
end
|
134
|
+
|
135
|
+
trait :both_one_required do
|
136
|
+
always_required { Faker::Lorem.word }
|
137
|
+
any_required_b { Faker::Lorem.word }
|
138
|
+
one_required_a { Faker::Lorem.word }
|
139
|
+
one_required_b { Faker::Lorem.word }
|
140
|
+
end
|
141
|
+
|
142
|
+
trait :having_impl_required do
|
143
|
+
always_required { Faker::Lorem.word }
|
144
|
+
any_required_b { Faker::Lorem.word }
|
145
|
+
one_required_b { Faker::Lorem.word }
|
146
|
+
impl_required_a { Faker::Lorem.word }
|
147
|
+
impl_required_b { Faker::Lorem.word }
|
148
|
+
end
|
149
|
+
|
150
|
+
trait :having_impl_required_missing do
|
151
|
+
always_required { Faker::Lorem.word }
|
152
|
+
any_required_b { Faker::Lorem.word }
|
153
|
+
one_required_b { Faker::Lorem.word }
|
154
|
+
impl_required_a { Faker::Lorem.word }
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|