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,71 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
# This is a simple type validator, with no options
|
6
|
+
describe SBOM::CycloneDX::Validator::FloatValidator do
|
7
|
+
subject(:validator) { described_class.new(required: true) }
|
8
|
+
|
9
|
+
let(:value) { Faker::Number.decimal }
|
10
|
+
|
11
|
+
it "accepts Float objects" do
|
12
|
+
expect(validator.validate(value)).to be_empty
|
13
|
+
end
|
14
|
+
|
15
|
+
it "rejects other number-like objects" do
|
16
|
+
expect(validator.validate(value.to_c)).not_to be_empty
|
17
|
+
expect(validator.validate(value.to_i)).not_to be_empty
|
18
|
+
expect(validator.validate(value.to_r)).not_to be_empty
|
19
|
+
expect(validator.validate(value.to_s)).not_to be_empty
|
20
|
+
end
|
21
|
+
|
22
|
+
context "with constraints" do
|
23
|
+
let(:minimum) { Faker::Number.decimal }
|
24
|
+
let(:maximum) { minimum + Faker::Number.decimal.abs }
|
25
|
+
|
26
|
+
it "accepts values greater than or equal to a specified minimum" do
|
27
|
+
validator = described_class.new(minimum: minimum, required: true)
|
28
|
+
|
29
|
+
expect(validator.validate(minimum)).to be_empty
|
30
|
+
expect(validator.validate(minimum + 1)).to be_empty
|
31
|
+
end
|
32
|
+
|
33
|
+
it "accepts values less than or equal to a specified maximum" do
|
34
|
+
validator = described_class.new(maximum: maximum, required: true)
|
35
|
+
|
36
|
+
expect(validator.validate(maximum)).to be_empty
|
37
|
+
expect(validator.validate(maximum - 1)).to be_empty
|
38
|
+
end
|
39
|
+
|
40
|
+
it "accepts values within the range indicated by both minimum and maxiumum" do
|
41
|
+
validator = described_class.new(minimum: minimum, maximum: maximum, required: true)
|
42
|
+
|
43
|
+
expect(validator.validate(minimum)).to be_empty
|
44
|
+
expect(validator.validate(maximum)).to be_empty
|
45
|
+
expect(validator.validate((minimum + maximum) / 2)).to be_empty
|
46
|
+
end
|
47
|
+
|
48
|
+
it "rejects values less than the specified minimum" do
|
49
|
+
validator = described_class.new(minimum: minimum, required: true)
|
50
|
+
|
51
|
+
expect(validator.validate(minimum - 1)).not_to be_empty
|
52
|
+
end
|
53
|
+
|
54
|
+
it "rejects values greater than the specified maximum" do
|
55
|
+
validator = described_class.new(maximum: maximum, required: true)
|
56
|
+
|
57
|
+
expect(validator.validate(maximum + 1)).not_to be_empty
|
58
|
+
end
|
59
|
+
|
60
|
+
it "rejects values outside the range indicated by both minimum and maximum" do
|
61
|
+
validator = described_class.new(minimum: minimum, maximum: maximum, required: true)
|
62
|
+
|
63
|
+
expect(validator.validate(minimum - 1)).not_to be_empty
|
64
|
+
expect(validator.validate(maximum + 1)).not_to be_empty
|
65
|
+
end
|
66
|
+
|
67
|
+
it "raises an error if maximum is less than minimum" do
|
68
|
+
expect { described_class.new(minimum: maximum, maximum: minimum, required: true) }.to raise_error(ArgumentError)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
# This is a simple type validator, with no options
|
6
|
+
describe SBOM::CycloneDX::Validator::IntegerValidator do
|
7
|
+
subject(:validator) { described_class.new(required: true) }
|
8
|
+
|
9
|
+
let(:value) { Faker::Number.number }
|
10
|
+
|
11
|
+
it "accepts Integer objects" do
|
12
|
+
expect(validator.validate(value)).to be_empty
|
13
|
+
end
|
14
|
+
|
15
|
+
it "rejects other number-like objects" do
|
16
|
+
expect(validator.validate(value.to_c)).not_to be_empty
|
17
|
+
expect(validator.validate(value.to_f)).not_to be_empty
|
18
|
+
expect(validator.validate(value.to_r)).not_to be_empty
|
19
|
+
expect(validator.validate(value.to_s)).not_to be_empty
|
20
|
+
end
|
21
|
+
|
22
|
+
context "with constraints" do
|
23
|
+
let(:minimum) { Faker::Number.number }
|
24
|
+
let(:maximum) { minimum + Faker::Number.positive.to_i }
|
25
|
+
|
26
|
+
it "accepts values greater than or equal to a specified minimum" do
|
27
|
+
validator = described_class.new(minimum: minimum, required: true)
|
28
|
+
|
29
|
+
expect(validator.validate(minimum)).to be_empty
|
30
|
+
expect(validator.validate(minimum + 1)).to be_empty
|
31
|
+
end
|
32
|
+
|
33
|
+
it "accepts values less than or equal to a specified maximum" do
|
34
|
+
validator = described_class.new(maximum: maximum, required: true)
|
35
|
+
|
36
|
+
expect(validator.validate(maximum)).to be_empty
|
37
|
+
expect(validator.validate(maximum - 1)).to be_empty
|
38
|
+
end
|
39
|
+
|
40
|
+
it "accepts values within the range indicated by both minimum and maxiumum" do
|
41
|
+
validator = described_class.new(minimum: minimum, maximum: maximum, required: true)
|
42
|
+
|
43
|
+
expect(validator.validate(minimum)).to be_empty
|
44
|
+
expect(validator.validate(maximum)).to be_empty
|
45
|
+
expect(validator.validate((minimum + maximum) / 2)).to be_empty
|
46
|
+
end
|
47
|
+
|
48
|
+
it "rejects values less than the specified minimum" do
|
49
|
+
validator = described_class.new(minimum: minimum, required: true)
|
50
|
+
|
51
|
+
expect(validator.validate(minimum - 1)).not_to be_empty
|
52
|
+
end
|
53
|
+
|
54
|
+
it "rejects values greater than the specified maximum" do
|
55
|
+
validator = described_class.new(maximum: maximum, required: true)
|
56
|
+
|
57
|
+
expect(validator.validate(maximum + 1)).not_to be_empty
|
58
|
+
end
|
59
|
+
|
60
|
+
it "rejects values outside the range indicated by both minimum and maximum" do
|
61
|
+
validator = described_class.new(minimum: minimum, maximum: maximum, required: true)
|
62
|
+
|
63
|
+
expect(validator.validate(minimum - 1)).not_to be_empty
|
64
|
+
expect(validator.validate(maximum + 1)).not_to be_empty
|
65
|
+
end
|
66
|
+
|
67
|
+
it "raises an error if maximum is less than minimum" do
|
68
|
+
expect { described_class.new(minimum: maximum, maximum: minimum, required: true) }.to raise_error(ArgumentError)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
# This is a simple type validator, with no options
|
6
|
+
describe SBOM::CycloneDX::Validator::RecordValidator do
|
7
|
+
subject(:validator) { described_class.new(type: value.class, required: true) }
|
8
|
+
|
9
|
+
let(:value) { build(:note) }
|
10
|
+
|
11
|
+
it "accepts records with the correct type" do
|
12
|
+
expect(validator.validate(value)).to be_empty
|
13
|
+
end
|
14
|
+
|
15
|
+
it "rejects records with an incorrect type" do
|
16
|
+
bad_value = build(:parameter)
|
17
|
+
expect(validator.validate(bad_value)).not_to be_empty
|
18
|
+
end
|
19
|
+
|
20
|
+
it "validates simple fields" do
|
21
|
+
value.locale = "en-US"
|
22
|
+
expect(validator.validate(value)).to be_empty
|
23
|
+
|
24
|
+
value.locale = "what is this nonsense"
|
25
|
+
expect(validator.validate(value)).not_to be_empty
|
26
|
+
end
|
27
|
+
|
28
|
+
it "validates nested records" do
|
29
|
+
value.text.content_type = "text/json"
|
30
|
+
expect(validator.validate(value)).to be_empty
|
31
|
+
|
32
|
+
value.text.content_type = "what is this nonsense"
|
33
|
+
expect(validator.validate(value)).not_to be_empty
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
# This is a simple type validator, with no options
|
6
|
+
describe SBOM::CycloneDX::Validator::StringValidator do
|
7
|
+
subject(:validator) { described_class.new(required: true) }
|
8
|
+
|
9
|
+
let(:value) { Faker::Lorem.word }
|
10
|
+
|
11
|
+
it "accepts String objects" do
|
12
|
+
expect(validator.validate(value)).to be_empty
|
13
|
+
end
|
14
|
+
|
15
|
+
it "rejects other objects" do
|
16
|
+
expect(validator.validate(0)).not_to be_empty
|
17
|
+
end
|
18
|
+
|
19
|
+
context "with enum" do
|
20
|
+
subject(:validator) { described_class.new(enum: enum, required: true) }
|
21
|
+
|
22
|
+
let(:enum) { Array.new(3) { Faker::Lorem.word } }
|
23
|
+
|
24
|
+
it "accepts values in the enum" do
|
25
|
+
enum.each do |value|
|
26
|
+
expect(validator.validate(value)).to be_empty
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
it "rejects values not in the enum" do
|
31
|
+
expect(validator.validate(enum.join)).not_to be_empty
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "with length constraints" do
|
36
|
+
let(:min_length) { Faker::Number.number(digits: 2) }
|
37
|
+
let(:max_length) { min_length + Faker::Number.number(digits: 2).to_i }
|
38
|
+
|
39
|
+
it "accepts values with length greater than or equal to a specified min_length" do
|
40
|
+
validator = described_class.new(min_length: min_length, required: true)
|
41
|
+
|
42
|
+
expect(validator.validate("a" * min_length.to_i)).to be_empty
|
43
|
+
expect(validator.validate("a" * (min_length.to_i + 1))).to be_empty
|
44
|
+
end
|
45
|
+
|
46
|
+
it "accepts values with length less than or equal to a specified max_length" do
|
47
|
+
validator = described_class.new(max_length: max_length, required: true)
|
48
|
+
|
49
|
+
expect(validator.validate("a" * max_length.to_i)).to be_empty
|
50
|
+
expect(validator.validate("a" * (max_length.to_i - 1))).to be_empty
|
51
|
+
end
|
52
|
+
|
53
|
+
it "accepts values with length within the range indicated by both min_length and max_length" do
|
54
|
+
validator = described_class.new(min_length: min_length, max_length: max_length, required: true)
|
55
|
+
|
56
|
+
expect(validator.validate("a" * min_length.to_i)).to be_empty
|
57
|
+
expect(validator.validate("a" * max_length.to_i)).to be_empty
|
58
|
+
expect(validator.validate("a" * ((min_length.to_i + max_length.to_i) / 2))).to be_empty
|
59
|
+
end
|
60
|
+
|
61
|
+
it "rejects values with length less than the specified min_length" do
|
62
|
+
validator = described_class.new(min_length: min_length, required: true)
|
63
|
+
|
64
|
+
expect(validator.validate("a" * (min_length.to_i - 1))).not_to be_empty
|
65
|
+
end
|
66
|
+
|
67
|
+
it "rejects values with length greater than the specified max_length" do
|
68
|
+
validator = described_class.new(max_length: max_length, required: true)
|
69
|
+
|
70
|
+
expect(validator.validate("a" * (max_length.to_i + 1))).not_to be_empty
|
71
|
+
end
|
72
|
+
|
73
|
+
it "rejects values with length outside the range indicated by both min_length and max_length" do
|
74
|
+
validator = described_class.new(min_length: min_length, max_length: max_length, required: true)
|
75
|
+
|
76
|
+
expect(validator.validate("a" * (min_length.to_i - 1))).not_to be_empty
|
77
|
+
expect(validator.validate("a" * (max_length.to_i + 1))).not_to be_empty
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context "with pattern" do
|
82
|
+
subject(:validator) { described_class.new(pattern: pattern, required: true) }
|
83
|
+
|
84
|
+
let(:pattern) { /\A[a-z]+\z/ }
|
85
|
+
|
86
|
+
it "accepts values that match the pattern" do
|
87
|
+
expect(validator.validate("abc")).to be_empty
|
88
|
+
end
|
89
|
+
|
90
|
+
it "rejects values that do not match the pattern" do
|
91
|
+
expect(validator.validate("123")).not_to be_empty
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
describe SBOM::CycloneDX::Validator::UnionValidator do
|
6
|
+
describe "#initialize" do
|
7
|
+
it "requires :of" do
|
8
|
+
expect { described_class.new(of: %i[integer string]) }.not_to raise_error
|
9
|
+
# This may raise RBS::Test::Tester::TypeError or ArgumentError, depending on test context
|
10
|
+
expect { described_class.new }.to raise_error(Exception)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
context "when :of contains symbols" do
|
15
|
+
let(:of) { %i[integer string] }
|
16
|
+
let(:value) { [Faker::Number.number, Faker::Lorem.word].sample }
|
17
|
+
|
18
|
+
describe "#initialize" do
|
19
|
+
it "accepts symbols representing simple types" do
|
20
|
+
expect { described_class.new(of: of) }.not_to raise_error
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#validate" do
|
25
|
+
subject(:instance) { described_class.new(of: of) }
|
26
|
+
|
27
|
+
it "returns an empty array when value is one of the specified types" do
|
28
|
+
expect(instance.validate(value)).to be_empty
|
29
|
+
end
|
30
|
+
|
31
|
+
it "returns an array of error messages when value is not one of the specified types" do
|
32
|
+
expect(instance.validate(true)).not_to be_empty
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "when :of contains arrays" do
|
38
|
+
let(:of) { [[:integer, minimum: 0, maximum: 10], [:string, min_length: 1, max_length: 2]] }
|
39
|
+
let(:value) { [Faker::Number.within(range: 0..10), Faker::Lorem.characters(number: 1..2)].sample }
|
40
|
+
|
41
|
+
describe "#initialize" do
|
42
|
+
it "accepts an array representing validator creation arguments" do
|
43
|
+
expect { described_class.new(of: of) }.not_to raise_error
|
44
|
+
end
|
45
|
+
|
46
|
+
it "rejects an array that does not represent validator creation arguments" do
|
47
|
+
# This may raise RBS::Test::Tester::TypeError or ArgumentError, depending on test context
|
48
|
+
expect { described_class.new(of: [:boolean, %i[string integer]]) }.to raise_error(Exception)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "#validate" do
|
53
|
+
subject(:instance) { described_class.new(of: of) }
|
54
|
+
|
55
|
+
it "returns an empty array when all elements are valid" do
|
56
|
+
expect(instance.validate(value)).to be_empty
|
57
|
+
end
|
58
|
+
|
59
|
+
it "returns an array of error messages when any element is invalid" do
|
60
|
+
expect(instance.validate("dddd")).not_to be_empty
|
61
|
+
expect(instance.validate(11)).not_to be_empty
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
# This is a simple type validator, with no options
|
6
|
+
describe SBOM::CycloneDX::Validator::URIValidator do
|
7
|
+
subject(:validator) { described_class.new(required: true) }
|
8
|
+
|
9
|
+
it "accepts URI instances" do
|
10
|
+
expect(validator.validate(URI.parse(Faker::Internet.url))).to be_empty
|
11
|
+
end
|
12
|
+
|
13
|
+
it "accepts strings representing valid URIs" do
|
14
|
+
expect(validator.validate(Faker::Internet.url)).to be_empty
|
15
|
+
end
|
16
|
+
|
17
|
+
it "rejects strings representing invalid URIs" do
|
18
|
+
expect(validator.validate("bad.uri")).not_to be_empty
|
19
|
+
expect(validator.validate("bad.com")).not_to be_empty
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
require "active_support/all"
|
5
|
+
require "sbom/cyclone_dx"
|
6
|
+
require "sbom/cyclone_dx/record"
|
7
|
+
require "sbom/cyclone_dx/validator"
|
8
|
+
|
9
|
+
describe SBOM::CycloneDX::Validator do
|
10
|
+
describe "#for" do
|
11
|
+
let(:type_args) do
|
12
|
+
{
|
13
|
+
SBOM::CycloneDX::Validator::ArrayValidator => [:array, items: :boolean],
|
14
|
+
SBOM::CycloneDX::Validator::BooleanValidator => [:boolean, {}],
|
15
|
+
SBOM::CycloneDX::Validator::DateTimeValidator => [:date_time, {}],
|
16
|
+
SBOM::CycloneDX::Validator::EmailAddressValidator => [:email_address, {}],
|
17
|
+
SBOM::CycloneDX::Validator::FloatValidator => [:float, {}],
|
18
|
+
SBOM::CycloneDX::Validator::IntegerValidator => [:integer, {}],
|
19
|
+
SBOM::CycloneDX::Validator::RecordValidator => [Class.new(SBOM::CycloneDX::Record::Base), {}],
|
20
|
+
SBOM::CycloneDX::Validator::StringValidator => [:string, {}],
|
21
|
+
SBOM::CycloneDX::Validator::UnionValidator => [:union, of: %i[string integer]],
|
22
|
+
SBOM::CycloneDX::Validator::URIValidator => [:uri, {}]
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
it "returns the correct validator instance for the given type" do
|
27
|
+
type_args.each do |validator_class, (type, type_args)|
|
28
|
+
validator = described_class.for(type, **type_args)
|
29
|
+
expect(validator).to be_a(validator_class)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
it "raises an ArgumentError when an unsupported type is given", rbs_test: :skip do
|
34
|
+
expect { described_class.for(:unsupported) }.to raise_error(ArgumentError, "Unsupported type: unsupported")
|
35
|
+
expect { described_class.for(Set) }.to raise_error(ArgumentError, "Unsupported type: Set")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "sbom/cyclone_dx"
|
4
|
+
require "factory_bot"
|
5
|
+
require "faker"
|
6
|
+
require "rspec"
|
7
|
+
|
8
|
+
RSpec.configure do |config|
|
9
|
+
config.include FactoryBot::Syntax::Methods
|
10
|
+
|
11
|
+
config.expect_with :rspec do |expectations|
|
12
|
+
expectations.syntax = :expect
|
13
|
+
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
14
|
+
end
|
15
|
+
|
16
|
+
config.mock_with :rspec do |mocks|
|
17
|
+
mocks.verify_partial_doubles = true
|
18
|
+
end
|
19
|
+
|
20
|
+
config.shared_context_metadata_behavior = :apply_to_host_groups
|
21
|
+
config.filter_run_when_matching :focus
|
22
|
+
config.example_status_persistence_file_path = ".rspec_state"
|
23
|
+
config.disable_monkey_patching!
|
24
|
+
config.expose_dsl_globally = true
|
25
|
+
|
26
|
+
if config.files_to_run.one?
|
27
|
+
config.default_formatter = "doc"
|
28
|
+
config.warnings = true
|
29
|
+
else
|
30
|
+
config.profile_examples = 10
|
31
|
+
end
|
32
|
+
|
33
|
+
config.order = :random
|
34
|
+
Kernel.srand config.seed
|
35
|
+
|
36
|
+
config.before(:suite) do
|
37
|
+
FactoryBot.find_definitions
|
38
|
+
end
|
39
|
+
end
|