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.
Files changed (368) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +15 -0
  3. data/.gitlab-ci.yml +49 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +72 -0
  6. data/.vscode/settings.json +6 -0
  7. data/CHANGELOG.md +9 -0
  8. data/CODE_OF_CONDUCT.md +132 -0
  9. data/Gemfile +26 -0
  10. data/Gemfile.lock +179 -0
  11. data/LICENSE.txt +21 -0
  12. data/README.md +39 -0
  13. data/Rakefile +36 -0
  14. data/Steepfile +14 -0
  15. data/bin/console +11 -0
  16. data/bin/rbs_spec +9 -0
  17. data/bin/setup +8 -0
  18. data/bom-1.6.schema.json +7334 -0
  19. data/lib/email_address_extension.rb +26 -0
  20. data/lib/sbom/cyclone_dx/enum.rb +2178 -0
  21. data/lib/sbom/cyclone_dx/field.rb +404 -0
  22. data/lib/sbom/cyclone_dx/pattern.rb +43 -0
  23. data/lib/sbom/cyclone_dx/record/advisory.rb +17 -0
  24. data/lib/sbom/cyclone_dx/record/annotation.rb +46 -0
  25. data/lib/sbom/cyclone_dx/record/attachment.rb +21 -0
  26. data/lib/sbom/cyclone_dx/record/base.rb +244 -0
  27. data/lib/sbom/cyclone_dx/record/cipher_suite.rb +23 -0
  28. data/lib/sbom/cyclone_dx/record/co2_measure.rb +18 -0
  29. data/lib/sbom/cyclone_dx/record/command.rb +18 -0
  30. data/lib/sbom/cyclone_dx/record/commit.rb +25 -0
  31. data/lib/sbom/cyclone_dx/record/component.rb +126 -0
  32. data/lib/sbom/cyclone_dx/record/component_data.rb +46 -0
  33. data/lib/sbom/cyclone_dx/record/component_evidence.rb +68 -0
  34. data/lib/sbom/cyclone_dx/record/component_identity_evidence.rb +36 -0
  35. data/lib/sbom/cyclone_dx/record/composition.rb +33 -0
  36. data/lib/sbom/cyclone_dx/record/condition.rb +20 -0
  37. data/lib/sbom/cyclone_dx/record/copyright.rb +16 -0
  38. data/lib/sbom/cyclone_dx/record/crypto_properties.rb +137 -0
  39. data/lib/sbom/cyclone_dx/record/data_governance.rb +21 -0
  40. data/lib/sbom/cyclone_dx/record/data_governance_responsible_party.rb +22 -0
  41. data/lib/sbom/cyclone_dx/record/declarations.rb +193 -0
  42. data/lib/sbom/cyclone_dx/record/definitions.rb +17 -0
  43. data/lib/sbom/cyclone_dx/record/dependency.rb +21 -0
  44. data/lib/sbom/cyclone_dx/record/diff.rb +18 -0
  45. data/lib/sbom/cyclone_dx/record/energy_consumption.rb +31 -0
  46. data/lib/sbom/cyclone_dx/record/energy_measure.rb +18 -0
  47. data/lib/sbom/cyclone_dx/record/energy_provider.rb +31 -0
  48. data/lib/sbom/cyclone_dx/record/environmental_consideration.rb +20 -0
  49. data/lib/sbom/cyclone_dx/record/event.rb +31 -0
  50. data/lib/sbom/cyclone_dx/record/external_reference.rb +25 -0
  51. data/lib/sbom/cyclone_dx/record/fairness_assessment.rb +22 -0
  52. data/lib/sbom/cyclone_dx/record/formula.rb +29 -0
  53. data/lib/sbom/cyclone_dx/record/graphic.rb +19 -0
  54. data/lib/sbom/cyclone_dx/record/graphics_collection.rb +19 -0
  55. data/lib/sbom/cyclone_dx/record/hash_data.rb +18 -0
  56. data/lib/sbom/cyclone_dx/record/identifiable_action.rb +21 -0
  57. data/lib/sbom/cyclone_dx/record/input.rb +34 -0
  58. data/lib/sbom/cyclone_dx/record/input_output_ml_parameter.rb +17 -0
  59. data/lib/sbom/cyclone_dx/record/issue.rb +36 -0
  60. data/lib/sbom/cyclone_dx/record/license.rb +90 -0
  61. data/lib/sbom/cyclone_dx/record/license_choice.rb +35 -0
  62. data/lib/sbom/cyclone_dx/record/metadata.rb +55 -0
  63. data/lib/sbom/cyclone_dx/record/model_card.rb +89 -0
  64. data/lib/sbom/cyclone_dx/record/note.rb +20 -0
  65. data/lib/sbom/cyclone_dx/record/organizational_contact.rb +26 -0
  66. data/lib/sbom/cyclone_dx/record/organizational_entity.rb +28 -0
  67. data/lib/sbom/cyclone_dx/record/output.rb +34 -0
  68. data/lib/sbom/cyclone_dx/record/parameter.rb +20 -0
  69. data/lib/sbom/cyclone_dx/record/patch.rb +23 -0
  70. data/lib/sbom/cyclone_dx/record/performance_metric.rb +30 -0
  71. data/lib/sbom/cyclone_dx/record/postal_address.rb +34 -0
  72. data/lib/sbom/cyclone_dx/record/property.rb +18 -0
  73. data/lib/sbom/cyclone_dx/record/rating.rb +27 -0
  74. data/lib/sbom/cyclone_dx/record/release_notes.rb +44 -0
  75. data/lib/sbom/cyclone_dx/record/resource_reference_choice.rb +22 -0
  76. data/lib/sbom/cyclone_dx/record/risk.rb +18 -0
  77. data/lib/sbom/cyclone_dx/record/root.rb +63 -0
  78. data/lib/sbom/cyclone_dx/record/secured_by.rb +20 -0
  79. data/lib/sbom/cyclone_dx/record/service.rb +54 -0
  80. data/lib/sbom/cyclone_dx/record/service_data.rb +32 -0
  81. data/lib/sbom/cyclone_dx/record/signature.rb +85 -0
  82. data/lib/sbom/cyclone_dx/record/standard.rb +72 -0
  83. data/lib/sbom/cyclone_dx/record/step.rb +24 -0
  84. data/lib/sbom/cyclone_dx/record/swid.rb +29 -0
  85. data/lib/sbom/cyclone_dx/record/task.rb +56 -0
  86. data/lib/sbom/cyclone_dx/record/tools.rb +20 -0
  87. data/lib/sbom/cyclone_dx/record/trigger.rb +48 -0
  88. data/lib/sbom/cyclone_dx/record/version.rb +24 -0
  89. data/lib/sbom/cyclone_dx/record/volume.rb +33 -0
  90. data/lib/sbom/cyclone_dx/record/vulnerability.rb +119 -0
  91. data/lib/sbom/cyclone_dx/record/vulnerability_source.rb +20 -0
  92. data/lib/sbom/cyclone_dx/record/workflow.rb +59 -0
  93. data/lib/sbom/cyclone_dx/record/workspace.rb +45 -0
  94. data/lib/sbom/cyclone_dx/record.rb +12 -0
  95. data/lib/sbom/cyclone_dx/validator/array_validator.rb +66 -0
  96. data/lib/sbom/cyclone_dx/validator/base_validator.rb +43 -0
  97. data/lib/sbom/cyclone_dx/validator/boolean_validator.rb +16 -0
  98. data/lib/sbom/cyclone_dx/validator/date_time_validator.rb +29 -0
  99. data/lib/sbom/cyclone_dx/validator/email_address_validator.rb +31 -0
  100. data/lib/sbom/cyclone_dx/validator/float_validator.rb +30 -0
  101. data/lib/sbom/cyclone_dx/validator/integer_validator.rb +30 -0
  102. data/lib/sbom/cyclone_dx/validator/record_validator.rb +26 -0
  103. data/lib/sbom/cyclone_dx/validator/string_validator.rb +33 -0
  104. data/lib/sbom/cyclone_dx/validator/union_validator.rb +39 -0
  105. data/lib/sbom/cyclone_dx/validator/uri_validator.rb +32 -0
  106. data/lib/sbom/cyclone_dx/validator.rb +32 -0
  107. data/lib/sbom/cyclone_dx/version.rb +7 -0
  108. data/lib/sbom/cyclone_dx.rb +39 -0
  109. data/rbs_collection.lock.yaml +288 -0
  110. data/rbs_collection.yaml +31 -0
  111. data/sbom-cyclone_dx.gemspec +32 -0
  112. data/sig/email_address_extension.rbs +14 -0
  113. data/sig/sbom/cyclone_dx/enum.rbs +93 -0
  114. data/sig/sbom/cyclone_dx/field.rbs +434 -0
  115. data/sig/sbom/cyclone_dx/pattern.rbs +24 -0
  116. data/sig/sbom/cyclone_dx/record/advisory.rbs +19 -0
  117. data/sig/sbom/cyclone_dx/record/annotation.rbs +63 -0
  118. data/sig/sbom/cyclone_dx/record/attachment.rbs +24 -0
  119. data/sig/sbom/cyclone_dx/record/base.rbs +62 -0
  120. data/sig/sbom/cyclone_dx/record/cipher_suite.rbs +24 -0
  121. data/sig/sbom/cyclone_dx/record/co2_measure.rbs +14 -0
  122. data/sig/sbom/cyclone_dx/record/command.rbs +19 -0
  123. data/sig/sbom/cyclone_dx/record/commit.rbs +34 -0
  124. data/sig/sbom/cyclone_dx/record/component.rbs +203 -0
  125. data/sig/sbom/cyclone_dx/record/component_data.rbs +73 -0
  126. data/sig/sbom/cyclone_dx/record/component_evidence.rbs +115 -0
  127. data/sig/sbom/cyclone_dx/record/component_identity_evidence.rbs +53 -0
  128. data/sig/sbom/cyclone_dx/record/composition.rbs +39 -0
  129. data/sig/sbom/cyclone_dx/record/condition.rbs +24 -0
  130. data/sig/sbom/cyclone_dx/record/copyright.rbs +14 -0
  131. data/sig/sbom/cyclone_dx/record/crypto_properties.rbs +268 -0
  132. data/sig/sbom/cyclone_dx/record/data_governance.rbs +24 -0
  133. data/sig/sbom/cyclone_dx/record/data_governance_responsible_party.rbs +19 -0
  134. data/sig/sbom/cyclone_dx/record/declarations.rbs +352 -0
  135. data/sig/sbom/cyclone_dx/record/definitions.rbs +14 -0
  136. data/sig/sbom/cyclone_dx/record/dependency.rbs +24 -0
  137. data/sig/sbom/cyclone_dx/record/diff.rbs +19 -0
  138. data/sig/sbom/cyclone_dx/record/energy_consumption.rbs +39 -0
  139. data/sig/sbom/cyclone_dx/record/energy_measure.rbs +14 -0
  140. data/sig/sbom/cyclone_dx/record/energy_provider.rbs +39 -0
  141. data/sig/sbom/cyclone_dx/record/environmental_consideration.rbs +19 -0
  142. data/sig/sbom/cyclone_dx/record/event.rbs +44 -0
  143. data/sig/sbom/cyclone_dx/record/external_reference.rbs +29 -0
  144. data/sig/sbom/cyclone_dx/record/fairness_assessment.rbs +29 -0
  145. data/sig/sbom/cyclone_dx/record/formula.rbs +34 -0
  146. data/sig/sbom/cyclone_dx/record/graphic.rbs +19 -0
  147. data/sig/sbom/cyclone_dx/record/graphics_collection.rbs +19 -0
  148. data/sig/sbom/cyclone_dx/record/hash_data.rbs +19 -0
  149. data/sig/sbom/cyclone_dx/record/identifiable_action.rbs +24 -0
  150. data/sig/sbom/cyclone_dx/record/input.rbs +44 -0
  151. data/sig/sbom/cyclone_dx/record/input_output_ml_parameter.rbs +14 -0
  152. data/sig/sbom/cyclone_dx/record/issue.rbs +53 -0
  153. data/sig/sbom/cyclone_dx/record/license.rbs +134 -0
  154. data/sig/sbom/cyclone_dx/record/license_choice.rbs +39 -0
  155. data/sig/sbom/cyclone_dx/record/metadata.rbs +82 -0
  156. data/sig/sbom/cyclone_dx/record/model_card.rbs +143 -0
  157. data/sig/sbom/cyclone_dx/record/note.rbs +19 -0
  158. data/sig/sbom/cyclone_dx/record/organizational_contact.rbs +29 -0
  159. data/sig/sbom/cyclone_dx/record/organizational_entity.rbs +34 -0
  160. data/sig/sbom/cyclone_dx/record/output.rbs +44 -0
  161. data/sig/sbom/cyclone_dx/record/parameter.rbs +24 -0
  162. data/sig/sbom/cyclone_dx/record/patch.rbs +24 -0
  163. data/sig/sbom/cyclone_dx/record/performance_metric.rbs +43 -0
  164. data/sig/sbom/cyclone_dx/record/postal_address.rbs +44 -0
  165. data/sig/sbom/cyclone_dx/record/property.rbs +19 -0
  166. data/sig/sbom/cyclone_dx/record/rating.rbs +39 -0
  167. data/sig/sbom/cyclone_dx/record/release_notes.rbs +64 -0
  168. data/sig/sbom/cyclone_dx/record/resource_reference_choice.rbs +19 -0
  169. data/sig/sbom/cyclone_dx/record/risk.rbs +19 -0
  170. data/sig/sbom/cyclone_dx/record/root.rbs +84 -0
  171. data/sig/sbom/cyclone_dx/record/secured_by.rbs +19 -0
  172. data/sig/sbom/cyclone_dx/record/service.rbs +99 -0
  173. data/sig/sbom/cyclone_dx/record/service_data.rbs +44 -0
  174. data/sig/sbom/cyclone_dx/record/signature.rbs +130 -0
  175. data/sig/sbom/cyclone_dx/record/standard.rbs +132 -0
  176. data/sig/sbom/cyclone_dx/record/step.rbs +29 -0
  177. data/sig/sbom/cyclone_dx/record/swid.rbs +44 -0
  178. data/sig/sbom/cyclone_dx/record/task.rbs +84 -0
  179. data/sig/sbom/cyclone_dx/record/tools.rbs +19 -0
  180. data/sig/sbom/cyclone_dx/record/trigger.rbs +69 -0
  181. data/sig/sbom/cyclone_dx/record/version.rbs +24 -0
  182. data/sig/sbom/cyclone_dx/record/volume.rbs +49 -0
  183. data/sig/sbom/cyclone_dx/record/vulnerability.rbs +209 -0
  184. data/sig/sbom/cyclone_dx/record/vulnerability_source.rbs +19 -0
  185. data/sig/sbom/cyclone_dx/record/workflow.rbs +94 -0
  186. data/sig/sbom/cyclone_dx/record/workspace.rbs +69 -0
  187. data/sig/sbom/cyclone_dx/record.rbs +161 -0
  188. data/sig/sbom/cyclone_dx/type.rbs +16 -0
  189. data/sig/sbom/cyclone_dx/validator/array_validator.rbs +31 -0
  190. data/sig/sbom/cyclone_dx/validator/base_validator.rbs +21 -0
  191. data/sig/sbom/cyclone_dx/validator/boolean_validator.rbs +9 -0
  192. data/sig/sbom/cyclone_dx/validator/date_time_validator.rbs +10 -0
  193. data/sig/sbom/cyclone_dx/validator/email_address_validator.rbs +10 -0
  194. data/sig/sbom/cyclone_dx/validator/float_validator.rbs +12 -0
  195. data/sig/sbom/cyclone_dx/validator/integer_validator.rbs +12 -0
  196. data/sig/sbom/cyclone_dx/validator/record_validator.rbs +12 -0
  197. data/sig/sbom/cyclone_dx/validator/string_validator.rbs +14 -0
  198. data/sig/sbom/cyclone_dx/validator/union_validator.rbs +24 -0
  199. data/sig/sbom/cyclone_dx/validator/uri_validator.rbs +10 -0
  200. data/sig/sbom/cyclone_dx/validator.rbs +66 -0
  201. data/sig/sbom/cyclone_dx.rbs +13 -0
  202. data/sig/types.rbs +45 -0
  203. data/spec/email_address_extension_spec.rb +27 -0
  204. data/spec/factories/factory_helper.rb +78 -0
  205. data/spec/factories/record/advisory_factory.rb +11 -0
  206. data/spec/factories/record/annotation_factory.rb +63 -0
  207. data/spec/factories/record/attachment_factory.rb +9 -0
  208. data/spec/factories/record/cipher_suite_factory.rb +26 -0
  209. data/spec/factories/record/co2_measure_factory.rb +9 -0
  210. data/spec/factories/record/command_factory.rb +10 -0
  211. data/spec/factories/record/commit_factory.rb +13 -0
  212. data/spec/factories/record/component_data_factory.rb +28 -0
  213. data/spec/factories/record/component_evidence_factory.rb +44 -0
  214. data/spec/factories/record/component_factory.rb +102 -0
  215. data/spec/factories/record/component_identity_evidence_factory.rb +25 -0
  216. data/spec/factories/record/composition_factory.rb +20 -0
  217. data/spec/factories/record/condition_factory.rb +11 -0
  218. data/spec/factories/record/copyright_factory.rb +9 -0
  219. data/spec/factories/record/crypto_properties_factory.rb +191 -0
  220. data/spec/factories/record/data_governance_factory.rb +11 -0
  221. data/spec/factories/record/data_governance_responsible_party_factory.rb +31 -0
  222. data/spec/factories/record/declarations_factory.rb +145 -0
  223. data/spec/factories/record/definitions_factory.rb +9 -0
  224. data/spec/factories/record/dependency_factory.rb +12 -0
  225. data/spec/factories/record/diff_factory.rb +24 -0
  226. data/spec/factories/record/energy_consumption_factory.rb +15 -0
  227. data/spec/factories/record/energy_measure_factory.rb +9 -0
  228. data/spec/factories/record/energy_provider_factory.rb +15 -0
  229. data/spec/factories/record/environmental_consideration_factory.rb +10 -0
  230. data/spec/factories/record/event_factory.rb +15 -0
  231. data/spec/factories/record/external_reference_factory.rb +13 -0
  232. data/spec/factories/record/fairness_assessment_factory.rb +12 -0
  233. data/spec/factories/record/formula_factory.rb +13 -0
  234. data/spec/factories/record/graphic_factory.rb +10 -0
  235. data/spec/factories/record/graphics_collection_factory.rb +10 -0
  236. data/spec/factories/record/hash_data_factory.rb +10 -0
  237. data/spec/factories/record/identifiable_action_factory.rb +11 -0
  238. data/spec/factories/record/input_factory.rb +36 -0
  239. data/spec/factories/record/input_output_ml_parameter_factory.rb +9 -0
  240. data/spec/factories/record/issue_factory.rb +22 -0
  241. data/spec/factories/record/license_choice_factory.rb +23 -0
  242. data/spec/factories/record/license_factory.rb +99 -0
  243. data/spec/factories/record/metadata_factory.rb +38 -0
  244. data/spec/factories/record/model_card_factory.rb +59 -0
  245. data/spec/factories/record/note_factory.rb +11 -0
  246. data/spec/factories/record/organizational_contact_factory.rb +12 -0
  247. data/spec/factories/record/organizational_entity_factory.rb +13 -0
  248. data/spec/factories/record/output_factory.rb +32 -0
  249. data/spec/factories/record/parameter_factory.rb +11 -0
  250. data/spec/factories/record/patch_factory.rb +12 -0
  251. data/spec/factories/record/performance_metric_factory.rb +20 -0
  252. data/spec/factories/record/postal_address_factory.rb +14 -0
  253. data/spec/factories/record/property_factory.rb +11 -0
  254. data/spec/factories/record/rating_factory.rb +14 -0
  255. data/spec/factories/record/release_notes_factory.rb +20 -0
  256. data/spec/factories/record/resource_reference_choice_factory.rb +27 -0
  257. data/spec/factories/record/risk_factory.rb +10 -0
  258. data/spec/factories/record/root_factory.rb +23 -0
  259. data/spec/factories/record/secured_by_factory.rb +10 -0
  260. data/spec/factories/record/service_data_factory.rb +16 -0
  261. data/spec/factories/record/service_factory.rb +27 -0
  262. data/spec/factories/record/signature_factory.rb +50 -0
  263. data/spec/factories/record/standard_factory.rb +37 -0
  264. data/spec/factories/record/step_factory.rb +12 -0
  265. data/spec/factories/record/swid_factory.rb +16 -0
  266. data/spec/factories/record/task_factory.rb +24 -0
  267. data/spec/factories/record/tools_factory.rb +10 -0
  268. data/spec/factories/record/trigger_factory.rb +21 -0
  269. data/spec/factories/record/version_factory.rb +19 -0
  270. data/spec/factories/record/volume_factory.rb +16 -0
  271. data/spec/factories/record/vulnerability_factory.rb +70 -0
  272. data/spec/factories/record/vulnerability_source_factory.rb +10 -0
  273. data/spec/factories/record/workflow_factory.rb +26 -0
  274. data/spec/factories/record/workspace_factory.rb +21 -0
  275. data/spec/factories/record_factory.rb +159 -0
  276. data/spec/fixtures/cipher_info.yml +948 -0
  277. data/spec/fixtures/purl_data.yml +0 -0
  278. data/spec/sbom/cyclone_dx/enum_spec.rb +30 -0
  279. data/spec/sbom/cyclone_dx/field_spec.rb +104 -0
  280. data/spec/sbom/cyclone_dx/pattern_spec.rb +18 -0
  281. data/spec/sbom/cyclone_dx/record/advisory_spec.rb +14 -0
  282. data/spec/sbom/cyclone_dx/record/annotation_spec.rb +31 -0
  283. data/spec/sbom/cyclone_dx/record/attachment_spec.rb +14 -0
  284. data/spec/sbom/cyclone_dx/record/base_spec.rb +363 -0
  285. data/spec/sbom/cyclone_dx/record/cipher_suite_spec.rb +14 -0
  286. data/spec/sbom/cyclone_dx/record/co2_measure_spec.rb +14 -0
  287. data/spec/sbom/cyclone_dx/record/command_spec.rb +14 -0
  288. data/spec/sbom/cyclone_dx/record/commit_spec.rb +14 -0
  289. data/spec/sbom/cyclone_dx/record/component_data_spec.rb +14 -0
  290. data/spec/sbom/cyclone_dx/record/component_evidence_spec.rb +14 -0
  291. data/spec/sbom/cyclone_dx/record/component_identity_evidence_spec.rb +14 -0
  292. data/spec/sbom/cyclone_dx/record/component_spec.rb +14 -0
  293. data/spec/sbom/cyclone_dx/record/composition_spec.rb +14 -0
  294. data/spec/sbom/cyclone_dx/record/condition_spec.rb +14 -0
  295. data/spec/sbom/cyclone_dx/record/copyright_spec.rb +14 -0
  296. data/spec/sbom/cyclone_dx/record/crypto_properties_spec.rb +14 -0
  297. data/spec/sbom/cyclone_dx/record/data_governance_responsible_party_spec.rb +19 -0
  298. data/spec/sbom/cyclone_dx/record/data_governance_spec.rb +14 -0
  299. data/spec/sbom/cyclone_dx/record/declarations_spec.rb +14 -0
  300. data/spec/sbom/cyclone_dx/record/definitions_spec.rb +14 -0
  301. data/spec/sbom/cyclone_dx/record/dependency_spec.rb +14 -0
  302. data/spec/sbom/cyclone_dx/record/diff_spec.rb +14 -0
  303. data/spec/sbom/cyclone_dx/record/energy_consumption_spec.rb +14 -0
  304. data/spec/sbom/cyclone_dx/record/energy_measure_spec.rb +14 -0
  305. data/spec/sbom/cyclone_dx/record/energy_provider_spec.rb +14 -0
  306. data/spec/sbom/cyclone_dx/record/environmental_consideration_spec.rb +14 -0
  307. data/spec/sbom/cyclone_dx/record/event_spec.rb +14 -0
  308. data/spec/sbom/cyclone_dx/record/external_reference_spec.rb +14 -0
  309. data/spec/sbom/cyclone_dx/record/fairness_assessment_spec.rb +14 -0
  310. data/spec/sbom/cyclone_dx/record/formula_spec.rb +14 -0
  311. data/spec/sbom/cyclone_dx/record/graphic_spec.rb +14 -0
  312. data/spec/sbom/cyclone_dx/record/graphics_collection_spec.rb +14 -0
  313. data/spec/sbom/cyclone_dx/record/hash_data_spec.rb +14 -0
  314. data/spec/sbom/cyclone_dx/record/identifiable_action_spec.rb +14 -0
  315. data/spec/sbom/cyclone_dx/record/input_output_ml_parameter_spec.rb +14 -0
  316. data/spec/sbom/cyclone_dx/record/input_spec.rb +14 -0
  317. data/spec/sbom/cyclone_dx/record/issue_spec.rb +14 -0
  318. data/spec/sbom/cyclone_dx/record/license_choice_spec.rb +26 -0
  319. data/spec/sbom/cyclone_dx/record/license_spec.rb +14 -0
  320. data/spec/sbom/cyclone_dx/record/metadata_spec.rb +14 -0
  321. data/spec/sbom/cyclone_dx/record/model_card_spec.rb +14 -0
  322. data/spec/sbom/cyclone_dx/record/note_spec.rb +14 -0
  323. data/spec/sbom/cyclone_dx/record/organizational_contact_spec.rb +14 -0
  324. data/spec/sbom/cyclone_dx/record/organizational_entity_spec.rb +14 -0
  325. data/spec/sbom/cyclone_dx/record/output_spec.rb +14 -0
  326. data/spec/sbom/cyclone_dx/record/parameter_spec.rb +14 -0
  327. data/spec/sbom/cyclone_dx/record/patch_spec.rb +14 -0
  328. data/spec/sbom/cyclone_dx/record/performance_metric_spec.rb +14 -0
  329. data/spec/sbom/cyclone_dx/record/postal_address_spec.rb +14 -0
  330. data/spec/sbom/cyclone_dx/record/property_spec.rb +14 -0
  331. data/spec/sbom/cyclone_dx/record/rating_spec.rb +14 -0
  332. data/spec/sbom/cyclone_dx/record/release_notes_spec.rb +14 -0
  333. data/spec/sbom/cyclone_dx/record/resource_reference_choice_spec.rb +14 -0
  334. data/spec/sbom/cyclone_dx/record/risk_spec.rb +14 -0
  335. data/spec/sbom/cyclone_dx/record/root_spec.rb +14 -0
  336. data/spec/sbom/cyclone_dx/record/secured_by_spec.rb +14 -0
  337. data/spec/sbom/cyclone_dx/record/service_data_spec.rb +14 -0
  338. data/spec/sbom/cyclone_dx/record/service_spec.rb +14 -0
  339. data/spec/sbom/cyclone_dx/record/signature_spec.rb +26 -0
  340. data/spec/sbom/cyclone_dx/record/standard_spec.rb +14 -0
  341. data/spec/sbom/cyclone_dx/record/step_spec.rb +14 -0
  342. data/spec/sbom/cyclone_dx/record/swid_spec.rb +14 -0
  343. data/spec/sbom/cyclone_dx/record/task_spec.rb +14 -0
  344. data/spec/sbom/cyclone_dx/record/tools_spec.rb +14 -0
  345. data/spec/sbom/cyclone_dx/record/trigger_spec.rb +14 -0
  346. data/spec/sbom/cyclone_dx/record/version_spec.rb +14 -0
  347. data/spec/sbom/cyclone_dx/record/volume_spec.rb +14 -0
  348. data/spec/sbom/cyclone_dx/record/vulnerability_source_spec.rb +14 -0
  349. data/spec/sbom/cyclone_dx/record/vulnerability_spec.rb +14 -0
  350. data/spec/sbom/cyclone_dx/record/workflow_spec.rb +14 -0
  351. data/spec/sbom/cyclone_dx/record/workspace_spec.rb +14 -0
  352. data/spec/sbom/cyclone_dx/record_spec.rb +7 -0
  353. data/spec/sbom/cyclone_dx/validator/array_validator_spec.rb +184 -0
  354. data/spec/sbom/cyclone_dx/validator/base_validator_spec.rb +71 -0
  355. data/spec/sbom/cyclone_dx/validator/boolean_validator_spec.rb +26 -0
  356. data/spec/sbom/cyclone_dx/validator/date_time_validator_spec.rb +28 -0
  357. data/spec/sbom/cyclone_dx/validator/email_address_validator_spec.rb +23 -0
  358. data/spec/sbom/cyclone_dx/validator/float_validator_spec.rb +71 -0
  359. data/spec/sbom/cyclone_dx/validator/integer_validator_spec.rb +71 -0
  360. data/spec/sbom/cyclone_dx/validator/record_validator_spec.rb +35 -0
  361. data/spec/sbom/cyclone_dx/validator/string_validator_spec.rb +94 -0
  362. data/spec/sbom/cyclone_dx/validator/union_validator_spec.rb +65 -0
  363. data/spec/sbom/cyclone_dx/validator/uri_validator_spec.rb +21 -0
  364. data/spec/sbom/cyclone_dx/validator_spec.rb +38 -0
  365. data/spec/sbom/cyclone_dx/version_spec.rb +9 -0
  366. data/spec/sbom/cyclone_dx_spec.rb +7 -0
  367. data/spec/spec_helper.rb +39 -0
  368. 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