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,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :external_reference, parent: :record, class: "SBOM::CycloneDX::Record::ExternalReference" do
5
+ url { generate(:url) }
6
+ type { SBOM::CycloneDX::Enum::EXTERNAL_REFERENCE_TYPE.sample }
7
+
8
+ trait :all_fields do
9
+ comment { Faker::Lorem.sentence }
10
+ hashes { association_list(:hash_data) }
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :fairness_assessment, parent: :record, class: "SBOM::CycloneDX::Record::FairnessAssessment" do
5
+ trait :all_fields do
6
+ group_at_risk { Faker::Lorem.word }
7
+ benefits { Faker::Lorem.words(number: rand(0..4)).join(", ") }
8
+ harms { Faker::Lorem.words(number: rand(0..4)).join(", ") }
9
+ mitigation_strategy { Faker::Lorem.sentence }
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :formula, parent: :record, class: "SBOM::CycloneDX::Record::Formula" do
5
+ trait :all_fields do
6
+ bom_ref { generate(:ref_link) }
7
+ components { association_list(:component) }
8
+ services { association_list(:service) }
9
+ workflows { association_list(:workflow) }
10
+ properties { association_list(:property) }
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :graphic, parent: :record, class: "SBOM::CycloneDX::Record::Graphic" do
5
+ trait :all_fields do
6
+ name { Faker::Lorem.word }
7
+ image { association(:attachment) }
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :graphics_collection, parent: :record, class: "SBOM::CycloneDX::Record::GraphicsCollection" do
5
+ trait :all_fields do
6
+ description { Faker::Lorem.sentence }
7
+ collection { association_list(:graphic) }
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :hash_data, parent: :record, class: "SBOM::CycloneDX::Record::HashData" do
5
+ alg { SBOM::CycloneDX::Enum::HASH_ALG.sample }
6
+ content { generate(:hash_value) }
7
+
8
+ trait :all_fields
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :identifiable_action, parent: :record, class: "SBOM::CycloneDX::Record::IdentifiableAction" do
5
+ trait :all_fields do
6
+ timestamp { Faker::Time.backward(days: 367) }
7
+ name { Faker::Lorem.word }
8
+ email { generate(:email) }
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :input, parent: :record, class: "SBOM::CycloneDX::Record::Input" do
5
+ transient do
6
+ input_type { %i[resource parameters environment_vars data].sample }
7
+ end
8
+
9
+ trait :resource do
10
+ input_type { :resource }
11
+ end
12
+
13
+ trait :parameters do
14
+ input_type { :parameters }
15
+ end
16
+
17
+ trait :environment_vars do
18
+ input_type { :environment_vars }
19
+ end
20
+
21
+ trait :data do
22
+ input_type { :data }
23
+ end
24
+
25
+ resource { input_type == :resource ? association(:resource_reference_choice) : nil }
26
+ parameters { input_type == :parameters ? association_list(:parameter) : nil }
27
+ environment_vars { input_type == :environment_vars ? association_list(:property) : nil }
28
+ data { input_type == :data ? association(:attachment) : nil }
29
+
30
+ trait :all_fields do
31
+ source { association(:resource_reference_choice) }
32
+ target { association(:resource_reference_choice) }
33
+ properties { association_list(:property) }
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :input_output_ml_parameter, parent: :record, class: "SBOM::CycloneDX::Record::InputOutputMLParameter" do
5
+ trait :all_fields do
6
+ format { %w[string image time-series].sample }
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :issue, parent: :record, class: "SBOM::CycloneDX::Record::Issue" do
5
+ type { SBOM::CycloneDX::Enum::ISSUE_TYPE.sample }
6
+
7
+ trait :all_fields do
8
+ id { SecureRandom.uuid }
9
+ name { Faker::Lorem.word }
10
+ description { Faker::Lorem.sentence }
11
+ source { association(:source) }
12
+ references { Array.new(rand(1..3)) { generate(:url) } }
13
+ end
14
+ end
15
+
16
+ factory :source, parent: :record, class: "SBOM::CycloneDX::Record::Issue::Source" do
17
+ trait :all_fields do
18
+ name { Faker::Lorem.word }
19
+ url { generate(:url) }
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :license_expression, parent: :record, class: "SBOM::CycloneDX::Record::LicenseChoice::LicenseExpression" do
5
+ expression do
6
+ first_license = SBOM::CycloneDX::Enum::LICENSE_ID.sample
7
+ next first_license if Faker::Boolean.boolean
8
+
9
+ "#{first_license} #{%w[WITH AND OR].sample} #{SBOM::CycloneDX::Enum::LICENSE_ID.sample}"
10
+ end
11
+
12
+ trait :all_fields do
13
+ acknowledgement { SBOM::CycloneDX::Enum::LICENSE_ACKNOWLEDGEMENT.sample }
14
+ bom_ref { generate(:ref_link) }
15
+ end
16
+ end
17
+
18
+ factory :wrapped_license, parent: :record, class: "SBOM::CycloneDX::Record::LicenseChoice::WrappedLicense" do
19
+ license
20
+
21
+ trait :all_fields
22
+ end
23
+ end
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :license, parent: :record, class: "SBOM::CycloneDX::Record::License" do
5
+ transient do
6
+ license_specifier { %i[id name].sample }
7
+ end
8
+
9
+ trait :id do
10
+ license_specifier { :id }
11
+ end
12
+
13
+ trait :name do
14
+ license_specifier { :name }
15
+ end
16
+
17
+ id { license_specifier == :id ? SBOM::CycloneDX::Enum::LICENSE_ID.sample : nil }
18
+ name { license_specifier == :name ? Faker::Lorem.word : nil }
19
+
20
+ trait :all_fields do
21
+ bom_ref { generate(:ref_link) }
22
+ acknowledgement { SBOM::CycloneDX::Enum::LICENSE_ACKNOWLEDGEMENT.sample }
23
+ text { association(:attachment) }
24
+ url { generate(:url) }
25
+ licensing { association(:licensing) }
26
+ properties { association_list(:property) }
27
+ end
28
+ end
29
+
30
+ factory :licensing, parent: :record, class: "SBOM::CycloneDX::Record::License::Licensing" do
31
+ trait :all_fields do
32
+ alt_ids { Array.new(rand(1..3)) { Faker::Lorem.word } }
33
+ licensor { association(:licensor) }
34
+ licensee { association(:licensee) }
35
+ purchaser { association(:purchaser) }
36
+ purchase_order { Faker::Lorem.word }
37
+ license_types { Array.new(rand(1..3)) { SBOM::CycloneDX::Enum::LICENSE_TYPE.sample } }
38
+ last_renewal { Faker::Time.backward(days: 367) }
39
+ expiration { last_renewal + rand(1..730).days }
40
+ end
41
+ end
42
+
43
+ factory :licensor, parent: :record, class: "SBOM::CycloneDX::Record::License::Licensing::Licensor" do
44
+ transient do
45
+ licensor_type { %i[organization individual] }
46
+ end
47
+
48
+ trait :organization do
49
+ licensor_type { :organization }
50
+ end
51
+
52
+ trait :individual do
53
+ licensor_type { :individual }
54
+ end
55
+
56
+ organization { licensor_type == :organization ? association(:organizational_entity) : nil }
57
+ individual { licensor_type == :individual ? association(:organizational_contact) : nil }
58
+
59
+ trait :all_fields
60
+ end
61
+
62
+ factory :licensee, parent: :record, class: "SBOM::CycloneDX::Record::License::Licensing::Licensee" do
63
+ transient do
64
+ licensee_type { %i[organization individual] }
65
+ end
66
+
67
+ trait :organization do
68
+ licensee_type { :organization }
69
+ end
70
+
71
+ trait :individual do
72
+ licensee_type { :individual }
73
+ end
74
+
75
+ organization { licensee_type == :organization ? association(:organizational_entity) : nil }
76
+ individual { licensee_type == :individual ? association(:organizational_contact) : nil }
77
+
78
+ trait :all_fields
79
+ end
80
+
81
+ factory :purchaser, parent: :record, class: "SBOM::CycloneDX::Record::License::Licensing::Purchaser" do
82
+ transient do
83
+ purchaser_type { %i[organization individual] }
84
+ end
85
+
86
+ trait :organization do
87
+ purchaser_type { :organization }
88
+ end
89
+
90
+ trait :individual do
91
+ purchaser_type { :individual }
92
+ end
93
+
94
+ organization { purchaser_type == :organization ? association(:organizational_entity) : nil }
95
+ individual { purchaser_type == :individual ? association(:organizational_contact) : nil }
96
+
97
+ trait :all_fields
98
+ end
99
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :metadata, parent: :record, class: "SBOM::CycloneDX::Record::Metadata" do
5
+ trait :all_fields do
6
+ timestamp { Faker::Time.backward(days: 4) }
7
+ lifecycles do
8
+ Array.new(rand(1..3)) do
9
+ next association(:pre_defined_phase) if Faker::Boolean.boolean
10
+
11
+ association(:custom_phase)
12
+ end
13
+ end
14
+ tools { association(:tools) }
15
+ manufacturer { association(:organizational_entity) }
16
+ authors { association_list(:organizational_contact) }
17
+ component { association(:component) }
18
+ manufacture { association(:organizational_entity) }
19
+ supplier { association(:organizational_entity) }
20
+ licenses { license_choice_list }
21
+ properties { association_list(:property) }
22
+ end
23
+ end
24
+
25
+ factory :custom_phase, parent: :record, class: "SBOM::CycloneDX::Record::Metadata::CustomPhase" do
26
+ name { Faker::Lorem.word }
27
+
28
+ trait :all_fields do
29
+ description { Faker::Lorem.sentence }
30
+ end
31
+ end
32
+
33
+ factory :pre_defined_phase, parent: :record, class: "SBOM::CycloneDX::Record::Metadata::PreDefinedPhase" do
34
+ phase { SBOM::CycloneDX::Enum::PHASE.sample }
35
+
36
+ trait :all_fields
37
+ end
38
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :model_card, parent: :record, class: "SBOM::CycloneDX::Record::ModelCard" do
5
+ trait :all_fields do
6
+ bom_ref { generate(:ref_link) }
7
+ model_parameters { association(:model_parameters) }
8
+ quantitative_analysis { association(:quantitative_analysis) }
9
+ considerations { association(:considerations) }
10
+ properties { association_list(:property) }
11
+ end
12
+ end
13
+
14
+ factory :considerations, parent: :record, class: "SBOM::CycloneDX::Record::ModelCard::Considerations" do
15
+ trait :all_fields do
16
+ users { Array.new(rand(1..3)) { Faker::Lorem.word } }
17
+ use_cases { Array.new(rand(1..3)) { Faker::Lorem.word } }
18
+ technical_limitations { Array.new(rand(1..3)) { Faker::Lorem.word } }
19
+ performance_tradeoffs { Array.new(rand(1..3)) { Faker::Lorem.word } }
20
+ ethical_considerations { association_list(:risk) }
21
+ environmental_considerations { association(:environmental_consideration) }
22
+ fairness_assessments { association_list(:fairness_assessment) }
23
+ end
24
+ end
25
+
26
+ factory :model_parameters, parent: :record, class: "SBOM::CycloneDX::Record::ModelCard::ModelParameters" do
27
+ trait :all_fields do
28
+ approach { association(:approach) }
29
+ task { Faker::Lorem.word }
30
+ architecture_family { Faker::Lorem.word }
31
+ model_architecture { Faker::Lorem.word }
32
+ datasets do
33
+ Array.new(1..3) { Faker::Boolean.boolean ? association(:component_data) : association(:data_reference) }
34
+ end
35
+ inputs { association_list(:input_output_ml_parameter) }
36
+ outputs { association_list(:input_output_ml_parameter) }
37
+ end
38
+ end
39
+
40
+ factory :approach, parent: :record, class: "SBOM::CycloneDX::Record::ModelCard::ModelParameters::Approach" do
41
+ trait :all_fields do
42
+ type { SBOM::CycloneDX::Enum::LEARNING_TYPE.sample }
43
+ end
44
+ end
45
+
46
+ factory :data_reference, parent: :record,
47
+ class: "SBOM::CycloneDX::Record::ModelCard::ModelParameters::DataReference" do
48
+ trait :all_fields do
49
+ ref { generate(:ref_or_cdx_urn) }
50
+ end
51
+ end
52
+
53
+ factory :quantitative_analysis, parent: :record, class: "SBOM::CycloneDX::Record::ModelCard::QuantitativeAnalysis" do
54
+ trait :all_fields do
55
+ performance_metrics { association_list(:performance_metric) }
56
+ graphics { association(:graphics_collection) }
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :note, parent: :record, class: "SBOM::CycloneDX::Record::Note" do
5
+ text { association(:attachment) }
6
+
7
+ trait :all_fields do
8
+ locale { generate(:locale) }
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :organizational_contact, parent: :record, class: "SBOM::CycloneDX::Record::OrganizationalContact" do
5
+ trait :all_fields do
6
+ bom_ref { generate(:ref_link) }
7
+ name { Faker::Name.name }
8
+ email { generate(:email) }
9
+ phone { Faker::PhoneNumber.phone_number }
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :organizational_entity, parent: :record, class: "SBOM::CycloneDX::Record::OrganizationalEntity" do
5
+ trait :all_fields do
6
+ bom_ref { generate(:ref_link) }
7
+ name { Faker::Company.name }
8
+ address { association(:postal_address) }
9
+ url { [Faker::Internet.url] }
10
+ contact { association_list(:organizational_contact) }
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :output, parent: :record, class: "SBOM::CycloneDX::Record::Output" do
5
+ transient do
6
+ reference_type { %i[resource data environment_vars].sample }
7
+ end
8
+
9
+ trait :resource do
10
+ reference_type { :resource }
11
+ end
12
+
13
+ trait :data do
14
+ reference_type { :data }
15
+ end
16
+
17
+ trait :environment_vars do
18
+ reference_type { :environment_vars }
19
+ end
20
+
21
+ type { SBOM::CycloneDX::Enum::OUTPUT_TYPE.sample }
22
+ resource { association(:resource_reference_choice) if reference_type == :resource }
23
+ data { association(:attachment) if reference_type == :data }
24
+ environment_vars { association_list(:property) if reference_type == :environment_vars }
25
+
26
+ trait :all_fields do
27
+ source { association(:resource_reference_choice) }
28
+ target { association(:resource_reference_choice) }
29
+ properties { association_list(:property) }
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :parameter, parent: :record, class: "SBOM::CycloneDX::Record::Parameter" do
5
+ trait :all_fields do
6
+ name { Faker::Lorem.word }
7
+ value { Faker::Lorem.word }
8
+ data_type { Faker::Lorem.word }
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :patch, parent: :record, class: "SBOM::CycloneDX::Record::Patch" do
5
+ type { SBOM::CycloneDX::Enum::PATCH_TYPE.sample }
6
+
7
+ trait :all_fields do
8
+ diff { association(:diff) }
9
+ resolves { association_list(:issue) }
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :performance_metric, parent: :record, class: "SBOM::CycloneDX::Record::PerformanceMetric" do
5
+ trait :all_fields do
6
+ type { Faker::Lorem.word }
7
+ value { Faker::Lorem.word }
8
+ slice { Faker::Lorem.word }
9
+ confidence_interval { association(:confidence_interval) }
10
+ end
11
+ end
12
+
13
+ factory :confidence_interval, parent: :record,
14
+ class: "SBOM::CycloneDX::Record::PerformanceMetric::ConfidenceInterval" do
15
+ trait :all_fields do
16
+ lower_bound { Faker::Lorem.word }
17
+ upper_bound { Faker::Lorem.word }
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :postal_address, parent: :record, class: "SBOM::CycloneDX::Record::PostalAddress" do
5
+ trait :all_fields do
6
+ country { Faker::Address.country }
7
+ region { Faker::Address.state }
8
+ locality { Faker::Address.city }
9
+ post_office_box_number { Faker::Address.building_number }
10
+ postal_code { Faker::Address.zip_code }
11
+ street_address { Faker::Address.street_address }
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :property, parent: :record, class: "SBOM::CycloneDX::Record::Property" do
5
+ name { Faker::Lorem.word }
6
+
7
+ trait :all_fields do
8
+ value { Faker::Lorem.word }
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :rating, parent: :record, class: "SBOM::CycloneDX::Record::Rating" do
5
+ trait :all_fields do
6
+ source { association(:vulnerability_source) }
7
+ score { rand(0.0..10.0) }
8
+ severity { SBOM::CycloneDX::Enum::SEVERITY.sample }
9
+ score_method { SBOM::CycloneDX::Enum::SCORE_METHOD.sample }
10
+ vector { Faker::Lorem.sentence }
11
+ justification { Faker::Lorem.sentence }
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :release_notes, parent: :record, class: "SBOM::CycloneDX::Record::ReleaseNotes" do
5
+ type { Faker::Lorem.word }
6
+
7
+ trait :all_fields do
8
+ title { Faker::Lorem.sentence }
9
+ featured_image { Faker::LoremFlickr.image }
10
+ social_image { Faker::LoremFlickr.image }
11
+ description { Faker::Lorem.paragraph }
12
+ timestamp { Faker::Time.backward }
13
+ aliases { Array.new(rand(0..3)) { Faker::Lorem.word } }
14
+ tags { Array.new(rand(0..3)) { Faker::Lorem.word } }
15
+ resolves { association_list(:issue) }
16
+ notes { association_list(:note) }
17
+ properties { association_list(:property) }
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :resource_reference_choice, parent: :record, class: "SBOM::CycloneDX::Record::ResourceReferenceChoice" do
5
+ transient do
6
+ reference_type { %i[ref external_reference].sample }
7
+ end
8
+
9
+ trait :ref do
10
+ transient { reference_type { :ref } }
11
+ end
12
+
13
+ trait :external_reference do
14
+ transient { reference_type { :external_reference } }
15
+ end
16
+
17
+ ref do
18
+ reference_type == :ref ? generate(:ref_or_cdx_urn) : nil
19
+ end
20
+
21
+ external_reference do
22
+ reference_type == :external_reference ? association(:external_reference) : nil
23
+ end
24
+
25
+ trait :all_fields
26
+ end
27
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :risk, parent: :record, class: "SBOM::CycloneDX::Record::Risk" do
5
+ trait :all_fields do
6
+ name { Faker::Lorem.word }
7
+ mitigation_strategy { Faker::Lorem.sentence }
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :root, parent: :record, class: "SBOM::CycloneDX::Record::Root" do
5
+ trait :all_fields do
6
+ serial_number { generate(:bom_serial_number) }
7
+ version { rand(1..10_000) }
8
+ metadata { association(:metadata) }
9
+ components { association_list(:component) }
10
+ services { association_list(:service) }
11
+ external_references { association_list(:external_reference) }
12
+ dependencies { association_list(:dependency) }
13
+ compositions { association_list(:composition) }
14
+ vulnerabilities { association_list(:vulnerability) }
15
+ annotations { association_list(:annotation) }
16
+ formulation { association_list(:formula) }
17
+ declarations { association(:declarations) }
18
+ definitions { association(:definitions) }
19
+ properties { association_list(:property) }
20
+ signature { generate_signature }
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :secured_by, parent: :record, class: "SBOM::CycloneDX::Record::SecuredBy" do
5
+ trait :all_fields do
6
+ mechanism { Faker::Lorem.word }
7
+ algorithm_ref { generate(:ref_link) }
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :service_data, parent: :record, class: "SBOM::CycloneDX::Record::ServiceData" do
5
+ flow { SBOM::CycloneDX::Enum::DATA_FLOW_DIRECTION.sample }
6
+ classification { Faker::Lorem.word }
7
+ source { Faker::Boolean.boolean ? generate(:url) : generate(:cdx_urn) }
8
+ destination { Faker::Boolean.boolean ? generate(:url) : generate(:cdx_urn) }
9
+
10
+ trait :all_fields do
11
+ name { Faker::Lorem.word }
12
+ description { Faker::Lorem.sentence }
13
+ governance { association(:data_governance) }
14
+ end
15
+ end
16
+ end