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,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "sbom/cyclone_dx/enum"
4
+
5
+ FactoryBot.define do
6
+ factory :component, parent: :record, class: "SBOM::CycloneDX::Record::Component" do
7
+ type { SBOM::CycloneDX::Enum::COMPONENT_TYPE.sample }
8
+ name { Faker::Lorem.word }
9
+
10
+ trait :all_fields do
11
+ mime_type { generate(:mime_type) }
12
+ bom_ref { generate(:ref_link) }
13
+ supplier factory: :organizational_entity
14
+ manufacturer factory: :organizational_entity
15
+ authors { association_list(:organizational_contact) }
16
+ publisher { Faker::Lorem.word }
17
+ group { Faker::Lorem.word }
18
+ version { Faker::App.semantic_version }
19
+ description { Faker::Lorem.sentence }
20
+ scope { SBOM::CycloneDX::Enum::SCOPE.sample }
21
+ hashes { association_list(:hash_data) }
22
+ licenses { license_choice_list(rand(1..3)) }
23
+ copyright { Faker::Company.name }
24
+ cpe do
25
+ # cpe:2.3:part:vendor:product:version:update:edition:language:sw_edition:target_sw:target_hw:other
26
+ "cpe:" \
27
+ "2.3:" \
28
+ "#{%w[a h o].sample}:" \
29
+ "#{copyright.gsub(/\s+/, "-").underscore}:" \
30
+ "#{name.underscore}:" \
31
+ "#{version}:" \
32
+ "*:" \
33
+ "*:" \
34
+ "*:" \
35
+ "*:" \
36
+ "*:" \
37
+ "*:" \
38
+ "*"
39
+ end
40
+ purl do
41
+ # scheme:type/namespace/name@version?qualifiers#subpath
42
+ "pkg:" \
43
+ "#{%w[apk cargo gem github npm].sample}/" \
44
+ "#{copyright.gsub(/\s+/, "-").underscore}/" \
45
+ "#{name.underscore}@#{version}" \
46
+ "?release=#{%w[alpha beta rc stable].sample}" \
47
+ "#some/subpath/#{Faker::Lorem.word.downcase}"
48
+ end
49
+ omnibor_id do
50
+ Array.new(rand(1..4)) do
51
+ sha_type = %w[sha1 sha256].sample
52
+ shasum = sha_type == "sha1" ? Faker::Crypto.sha1 : Faker::Crypto.sha256
53
+
54
+ "gitoid:" \
55
+ "#{%w[blob tree commit tag].sample}:" \
56
+ "#{sha_type}:" \
57
+ "#{shasum}"
58
+ end
59
+ end
60
+ swhid do
61
+ Array.new(rand(1..4)) do
62
+ "swh:" \
63
+ "1:" \
64
+ "#{%w[cnt dir rel rev snp].sample}:" \
65
+ "#{Faker::Crypto.sha1}"
66
+ end
67
+ end
68
+ swid
69
+ modified { Faker::Boolean.boolean }
70
+ pedigree { association(:pedigree) }
71
+ external_references { association_list(:external_reference) }
72
+ components { [] }
73
+ evidence factory: :component_evidence
74
+ release_notes
75
+ model_card
76
+ data { association_list(:component_data) }
77
+ crypto_properties
78
+ properties { association_list(:property) }
79
+ tags { Array.new(rand(1..4)) { Faker::Lorem.word } }
80
+ signature { generate_signature }
81
+ end
82
+
83
+ after(:build) do |component|
84
+ if component.pedigree? && !component.pedigree.nil?
85
+ component.pedigree.ancestors ||= []
86
+ component.pedigree.ancestors << component
87
+ component.pedigree.ancestors.uniq!
88
+ end
89
+ end
90
+ end
91
+
92
+ factory :pedigree, parent: :record, class: "SBOM::CycloneDX::Record::Component::Pedigree" do
93
+ trait :all_fields do
94
+ ancestors { [] }
95
+ descendants { [] }
96
+ variants { [] }
97
+ commits { association_list(:commit) }
98
+ patches { association_list(:patch) }
99
+ notes { Faker::Lorem.sentence }
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "sbom/cyclone_dx/enum"
4
+
5
+ FactoryBot.define do
6
+ factory :component_identity_evidence, parent: :record, class: "SBOM::CycloneDX::Record::ComponentIdentityEvidence" do
7
+ field { SBOM::CycloneDX::Enum::FIELD.sample }
8
+
9
+ trait :all_fields do
10
+ confidence { rand(0.0..1.0) }
11
+ concluded_value { %w[cpe purl omnibor_id swhid swid].sample }
12
+ methods_used { association_list(:method) }
13
+ tools { Array.new(rand(1..4)) { generate(:ref_or_cdx_urn) } }
14
+ end
15
+ end
16
+
17
+ factory :method, parent: :record, class: "SBOM::CycloneDX::Record::ComponentIdentityEvidence::Method" do
18
+ technique { Faker::Lorem.word }
19
+ confidence { rand(0.0..1.0) }
20
+
21
+ trait :all_fields do
22
+ value { Faker::Lorem.sentence }
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :composition, parent: :record, class: "SBOM::CycloneDX::Record::Composition" do
5
+ trait :all_fields do
6
+ bom_ref { generate(:ref_link) }
7
+ aggregate { SBOM::CycloneDX::Enum::AGGREGATE_TYPE.sample }
8
+ assemblies { Array.new(rand(1..3)) { generate(:ref_or_cdx_urn) } }
9
+ dependencies do
10
+ Array.new(rand(1..3)) do
11
+ next association(:component) if Faker::Boolean.boolean
12
+
13
+ association(:service)
14
+ end
15
+ end
16
+ vulnerabilities { association_list(:vulnerability) }
17
+ signature { generate_signature }
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :condition, parent: :record, class: "SBOM::CycloneDX::Record::Condition" do
5
+ trait :all_fields do
6
+ description { Faker::Lorem.sentence }
7
+ expression { Faker::Lorem.words(number: 4).zip(Array.new(3) { %w[AND OR XOR].sample }).flatten.join(" ") }
8
+ properties { association_list(:property) }
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :copyright, parent: :record, class: "SBOM::CycloneDX::Record::Copyright" do
5
+ text { "©#{rand(1979..2024)} #{Faker::Company.name}" }
6
+
7
+ trait :all_fields
8
+ end
9
+ end
@@ -0,0 +1,191 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :crypto_properties, parent: :record, class: "SBOM::CycloneDX::Record::CryptoProperties" do
5
+ asset_type { SBOM::CycloneDX::Enum::ASSET_TYPE.sample }
6
+
7
+ trait :all_fields do
8
+ algorithm_properties { association :algorithm_properties }
9
+ certificate_properties { association :certificate_properties }
10
+ related_crypto_material_properties { association :related_crypto_material_properties }
11
+ protocol_properties { association :protocol_properties }
12
+ oid do
13
+ # Pseudo-random sample of crypto-related OIDs of different lengths in different forms
14
+ [
15
+ "1.2",
16
+ "iso.member-body",
17
+ "1.3.132",
18
+ "iso.identified-organization.certicom",
19
+ "2.5.29.17",
20
+ "joint-iso-itu-t.ds.certificateExtension.subjectAltName",
21
+ "1.3.132.0.23",
22
+ "iso.identified-organization.certicom.curve.sect131r2",
23
+ "1.3.132.1.14.3",
24
+ "iso.identified-organization.certicom.schemes.14.dhSinglePass-cofactorDH-sha512kdf-scheme",
25
+ "1.2.840.113549.1.9.5",
26
+ "iso.member-body.us.rsadsi.pkcs.pkcs-9.signing-time",
27
+ "1.3.6.1.1.1.2.8",
28
+ "iso.identified-organization.dod.internet.directory.nisSchema.2.nisNetgroup",
29
+ "1.3.6.1.5.5.7.4.11",
30
+ "iso.identified-organization.dod.internet.security.mechanisms.pkix.it.id-it-keyPairParamRep",
31
+ "1.3.6.1.4.1.311.12.1.2",
32
+ "iso.identified-organization.dod.internet.private.enterprise.311 12 1 2",
33
+ "1.3.6.1.4.1.1722.12.2.1.16",
34
+ "iso.identified-organization.dod.internet.private.enterprise.1722 cryptography.hashAlgs.blake2b.16",
35
+ "1.3.6.1.4.1.42.2.27.2.1.15",
36
+ "iso.identified-organization.dod.internet.private.enterprise.42 products.27 2 1 rfc822MailMember",
37
+ "1.2.804.2.1.1.1.1.3.1.1.2.3",
38
+ "iso.member-body.ua.root.security.cryptography.ua-pki.alg.asym.dstu4145WithGost34311." \
39
+ "dstu4145WithGost34311-pb.dstu4145WithGost34311keyFormat-PB.dstu4145WithGost34311m179-PB"
40
+ ].sample
41
+ end
42
+ end
43
+ end
44
+
45
+ factory(
46
+ :algorithm_properties,
47
+ parent: :record,
48
+ class: "SBOM::CycloneDX::Record::CryptoProperties::AlgorithmProperties"
49
+ ) do
50
+ trait :all_fields do
51
+ primitive { SBOM::CycloneDX::Enum::PRIMITIVE.sample }
52
+ parameter_set_identifier { %w[128 256 512].sample }
53
+ curve do
54
+ [
55
+ "FRP256v1",
56
+ "BLS12-477",
57
+ "Bandersnatch",
58
+ "bn638",
59
+ "brainpoolP512t1",
60
+ "gost512",
61
+ "id-tc26-gost-3410-12-512-paramSetB",
62
+ "id-GostR3410-2001-CryptoPro-C-ParamSet",
63
+ "mnt4",
64
+ "mnt5/1",
65
+ "B-409",
66
+ "numsp512t1",
67
+ "ed-511-mers",
68
+ "w-510-mont",
69
+ "Oakley Group 4",
70
+ "384-bit Random ECP Group",
71
+ "SM2",
72
+ "Curve22103",
73
+ "Ed448-Goldilocks",
74
+ "Fp254n2BNa",
75
+ "ssc-512",
76
+ "Tweedledum",
77
+ "Tweedledee",
78
+ "JubJub",
79
+ "Vesta",
80
+ "BADA55-VPR-224",
81
+ "Tom-521",
82
+ "sect571k1",
83
+ "wap-wsg-idm-ecid-wtls12",
84
+ "prime239v3",
85
+ "c2pnb163v1",
86
+ "ansit233r1"
87
+ ].sample
88
+ end
89
+ execution_environment { SBOM::CycloneDX::Enum::EXECUTION_ENVIRONMENT.sample }
90
+ implementation_platform { SBOM::CycloneDX::Enum::IMPLEMENTATION_PLATFORM.sample }
91
+ certification_level { Array.new(rand(1..3)) { SBOM::CycloneDX::Enum::CERTIFICATION_LEVEL.sample } }
92
+ mode { SBOM::CycloneDX::Enum::ALGORITHM_MODE.sample }
93
+ padding { SBOM::CycloneDX::Enum::PADDING.sample }
94
+ crypto_functions { Array.new(rand(1..3)) { SBOM::CycloneDX::Enum::CRYPTO_FUNCTION.sample } }
95
+ classical_security_level do
96
+ base_power = 2**rand(7..12)
97
+ next base_power if Faker::Boolean.boolean
98
+
99
+ base_power + (2**rand(3..9))
100
+ end
101
+ nist_quantum_security_level do
102
+ # Not how this is actually calculated. Just ensuring the values roughly correlate
103
+ Math.log2(classical_security_level).floor - 6
104
+ end
105
+ end
106
+ end
107
+
108
+ factory(
109
+ :certificate_properties,
110
+ parent: :record,
111
+ class: "SBOM::CycloneDX::Record::CryptoProperties::CertificateProperties"
112
+ ) do
113
+ trait :all_fields do
114
+ subject_name { Faker::Internet.domain_name }
115
+ issuer_name do
116
+ [
117
+ "ACCVRAIZ1",
118
+ "Certum Trusted Root CA",
119
+ "DigiCert SMIME ECC P384 Root G5",
120
+ "ePKI Root Certification Authority",
121
+ "GlobalSign",
122
+ "GTS Root R1",
123
+ "IdenTrust Commercial Root CA 1",
124
+ "ISRG Root X2",
125
+ "OISTE WISeKey Global Root GB CA",
126
+ "Starfield Class 2 Certification Authority",
127
+ "SZAFIR ROOT CA2",
128
+ "TeliaSonera Root CA v1",
129
+ "Trustwave Global Certification Authority",
130
+ "Trustwave Global ECC P256 Certification Authority",
131
+ "vTrus ECC Root CA",
132
+ "XRamp Global Certification Authority"
133
+ ].sample
134
+ end
135
+ not_valid_before { Faker::Time.between(from: 730.days.ago, to: 183.days.from_now) }
136
+ not_valid_after { not_valid_before + rand(1..913).days }
137
+ signature_algorithm_ref { generate(:ref_link) }
138
+ subject_public_key_ref { generate(:ref_link) }
139
+ certificate_format { %w[X.509 PEM DER CVC].sample }
140
+ certificate_extension { %w[crt pem cer der p12].sample }
141
+ end
142
+ end
143
+
144
+ factory(
145
+ :protocol_properties,
146
+ parent: :record,
147
+ class: "SBOM::CycloneDX::Record::CryptoProperties::ProtocolProperties"
148
+ ) do
149
+ trait :all_fields do
150
+ type { SBOM::CycloneDX::Enum::PROTOCOL_TYPE.sample }
151
+ version { Faker::App.version }
152
+ cipher_suites { association_list(:cipher_suite) }
153
+ ikev2_transform_types { association :ikev2_transform_type }
154
+ crypto_ref_array { Array.new(rand(1..3)) { generate(:ref_link) } }
155
+ end
156
+ end
157
+
158
+ factory(
159
+ :ikev2_transform_type,
160
+ parent: :record,
161
+ class: "SBOM::CycloneDX::Record::CryptoProperties::ProtocolProperties::IKEv2TransformType"
162
+ ) do
163
+ trait :all_fields do
164
+ encr { Array.new(rand(1..3)) { generate(:ref_link) } }
165
+ prf { Array.new(rand(1..3)) { generate(:ref_link) } }
166
+ integ { Array.new(rand(1..3)) { generate(:ref_link) } }
167
+ ke { Array.new(rand(1..3)) { generate(:ref_link) } }
168
+ esn { Array.new(rand(1..3)) { generate(:ref_link) } }
169
+ auth { Array.new(rand(1..3)) { generate(:ref_link) } }
170
+ end
171
+ end
172
+
173
+ factory(
174
+ :related_crypto_material_properties,
175
+ class: "SBOM::CycloneDX::Record::CryptoProperties::RelatedCryptoMaterialProperties"
176
+ ) do
177
+ trait :all_fields do
178
+ type { SBOM::CycloneDX::Enum::RELATED_CRYPTO_MATERIAL_TYPE.sample }
179
+ id { SecureRandom.uuid }
180
+ state { SBOM::CycloneDX::Enum::RELATED_CRYPTO_MATERIAL_STATE.sample }
181
+ creation_date { Faker::Time.backward(days: 367) }
182
+ activation_date { creation_date + rand(1..183).days }
183
+ update_date { activation_date + rand(1..183).days }
184
+ expiration_date { update_date + rand(1..367).days }
185
+ value { Faker::Crypto.md5 }
186
+ asset_size { rand(1..(2**16)) }
187
+ format { %w[P8 PEM DER CVC].sample }
188
+ secured_by { association_list(:secured_by) }
189
+ end
190
+ end
191
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :data_governance, parent: :record, class: "SBOM::CycloneDX::Record::DataGovernance" do
5
+ trait :all_fields do
6
+ custodians { association_list(:data_governance_responsible_party) }
7
+ stewards { association_list(:data_governance_responsible_party) }
8
+ owners { association_list(:data_governance_responsible_party) }
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory(
5
+ :data_governance_responsible_party,
6
+ parent: :record,
7
+ class: "SBOM::CycloneDX::Record::DataGovernanceResponsibleParty"
8
+ ) do
9
+ transient do
10
+ party_type { %i[organization contact].sample }
11
+ end
12
+
13
+ trait :all_fields
14
+
15
+ trait :organization do
16
+ transient { party_type { :organization } }
17
+ end
18
+
19
+ trait :contact do
20
+ transient { party_type { :contact } }
21
+ end
22
+
23
+ organization do
24
+ party_type == :organization ? association(:organizational_entity) : nil
25
+ end
26
+
27
+ contact do
28
+ party_type == :contact ? association(:organizational_contact) : nil
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,145 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :declarations, parent: :record, class: "SBOM::CycloneDX::Record::Declarations" do
5
+ trait :all_fields do
6
+ assessors { association_list(:assessor) }
7
+ attestations { association_list(:attestation) }
8
+ claims { association_list(:claim) }
9
+ evidence { association_list(:evidence) }
10
+ targets { association_list(:target) }
11
+ affirmation
12
+ signature { generate_signature }
13
+ end
14
+ end
15
+
16
+ factory :affirmation, parent: :record, class: "SBOM::CycloneDX::Record::Declarations::Affirmation" do
17
+ trait :all_fields do
18
+ statement { Faker::Lorem.sentence }
19
+ signatories { association_list(:signatory) }
20
+ signature { generate_signature }
21
+ end
22
+ end
23
+
24
+ factory :signatory, parent: :record, class: "SBOM::CycloneDX::Record::Declarations::Affirmation::Signatory" do
25
+ transient do
26
+ signatory_type { %w[signature organization].sample }
27
+ end
28
+
29
+ signature { signatory_type == :signature ? generate_signature : nil }
30
+ organization { signatory_type == :organization ? association(:organizational_entity) : nil }
31
+ external_reference { signatory_type == :organization ? association(:external_reference) : nil }
32
+
33
+ trait :all_fields do
34
+ name { Faker::Name.name }
35
+ role { Faker::Job.title }
36
+ signature { generate_signature }
37
+ organization factory: :organizational_entity
38
+ external_reference
39
+ end
40
+ end
41
+
42
+ factory :assessor, parent: :record, class: "SBOM::CycloneDX::Record::Declarations::Assessor" do
43
+ trait :all_fields do
44
+ bom_ref { generate(:ref_link) }
45
+ third_party { Faker::Boolean.boolean }
46
+ organization factory: :organizational_entity
47
+ end
48
+ end
49
+
50
+ factory :attestation, parent: :record, class: "SBOM::CycloneDX::Record::Declarations::Attestation" do
51
+ trait :all_fields do
52
+ summary { Faker::Lorem.sentence }
53
+ assessor { generate(:ref_link) }
54
+ requirements_map { association_list(:map) }
55
+ signature { generate_signature }
56
+ end
57
+ end
58
+
59
+ factory :map, parent: :record, class: "SBOM::CycloneDX::Record::Declarations::Attestation::Map" do
60
+ trait :all_fields do
61
+ requirement { generate(:ref_link) }
62
+ claims { Array.new(rand(1..2)) { generate(:ref_link) } }
63
+ counter_claims { Array.new(rand(1..2)) { generate(:ref_link) } }
64
+ conformance
65
+ confidence
66
+ end
67
+ end
68
+
69
+ factory :confidence, parent: :record, class: "SBOM::CycloneDX::Record::Declarations::Attestation::Map::Confidence" do
70
+ trait :all_fields do
71
+ score { rand(0.0..1.0) }
72
+ rationale { Faker::Lorem.sentence }
73
+ end
74
+ end
75
+
76
+ factory :conformance, parent: :record,
77
+ class: "SBOM::CycloneDX::Record::Declarations::Attestation::Map::Conformance" do
78
+ trait :all_fields do
79
+ score { rand(0.0..1.0) }
80
+ rationale { Faker::Lorem.sentence }
81
+ mitigation_strategies { Array.new(rand(1..2)) { generate(:ref_link) } }
82
+ end
83
+ end
84
+
85
+ factory :claim, parent: :record, class: "SBOM::CycloneDX::Record::Declarations::Claim" do
86
+ trait :all_fields do
87
+ bom_ref { generate(:ref_link) }
88
+ target { generate(:ref_link) }
89
+ predicate { Faker::Lorem.sentence }
90
+ mitigation_strategies { Array.new(rand(1..2)) { generate(:ref_link) } }
91
+ reasoning { Faker::Lorem.sentence }
92
+ evidence { Array.new(rand(1..2)) { generate(:ref_link) } }
93
+ external_references { Array.new(rand(1..2)) { generate(:ref_link) } }
94
+ signature { generate_signature }
95
+ end
96
+ end
97
+
98
+ factory :evidence, parent: :record, class: "SBOM::CycloneDX::Record::Declarations::Evidence" do
99
+ trait :all_fields do
100
+ bom_ref { generate(:ref_link) }
101
+ # This will definitely not be valid, but isn't checked currently
102
+ property_name { Faker::Lorem.words(number: 2).join(":").downcase }
103
+ description { Faker::Lorem.sentence }
104
+ data { association_list(:evidence_data) }
105
+ created { Faker::Time.backward(days: 367) }
106
+ expires { Faker::Time.between(from: 6.months.ago, to: 18.months.from_now) }
107
+ author factory: :organizational_contact
108
+ reviewer factory: :organizational_contact
109
+ signature { generate_signature }
110
+ end
111
+ end
112
+
113
+ factory(
114
+ :evidence_data,
115
+ parent: :record,
116
+ class: "SBOM::CycloneDX::Record::Declarations::Evidence::EvidenceData"
117
+ ) do
118
+ trait :all_fields do
119
+ name { Faker::Lorem.word }
120
+ contents
121
+ classification { %w[public restricted confidential secret].sample }
122
+ sensitive_data { Array.new(rand(1..3)) { Faker::Lorem.sentence } }
123
+ governance factory: :data_governance
124
+ end
125
+ end
126
+
127
+ factory(
128
+ :contents,
129
+ parent: :record,
130
+ class: "SBOM::CycloneDX::Record::Declarations::Evidence::EvidenceData::Contents"
131
+ ) do
132
+ trait :all_fields do
133
+ attachment
134
+ url { generate(:url) }
135
+ end
136
+ end
137
+
138
+ factory :target, parent: :record, class: "SBOM::CycloneDX::Record::Declarations::Target" do
139
+ trait :all_fields do
140
+ organizations { association_list(:organizational_entity) }
141
+ components { association_list(:component) }
142
+ services { association_list(:service) }
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :definitions, parent: :record, class: "SBOM::CycloneDX::Record::Definitions" do
5
+ trait :all_fields do
6
+ standards { association_list(:standard) }
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :dependency, parent: :record, class: "SBOM::CycloneDX::Record::Dependency" do
5
+ ref { generate(:ref_link) }
6
+
7
+ trait :all_fields do
8
+ depends_on { Array.new(rand(1..3)) { generate(:ref_link) } }
9
+ provides { Array.new(rand(1..3)) { generate(:ref_link) } }
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :diff, parent: :record, class: "SBOM::CycloneDX::Record::Diff" do
5
+ trait :all_fields do
6
+ text do
7
+ line_count = rand(0..100)
8
+ association(
9
+ :attachment,
10
+ content:
11
+ <<~DIFF_TEXT
12
+ --- #{Faker::Lorem.word}
13
+ +++ #{Faker::Lorem.word}
14
+ @@ -1,#{line_count} +1,#{line_count} @@
15
+ -# #{Faker::Lorem.sentence}
16
+ +# #{Faker::Lorem.sentence}
17
+ #{Faker::Lorem.sentence}
18
+ DIFF_TEXT
19
+ )
20
+ end
21
+ url { generate(:url) }
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :energy_consumption, parent: :record, class: "SBOM::CycloneDX::Record::EnergyConsumption" do
5
+ activity { SBOM::CycloneDX::Enum::ACTIVITY.sample }
6
+ energy_providers { association_list(:energy_provider) }
7
+ activity_energy_cost { association(:energy_measure) }
8
+
9
+ trait :all_fields do
10
+ co2_cost_equivalent { association(:co2_measure) }
11
+ co2_cost_offset { association(:co2_measure) }
12
+ properties { association_list(:property) }
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :energy_measure, parent: :record, class: "SBOM::CycloneDX::Record::EnergyMeasure" do
5
+ value { Faker::Number.decimal(l_digits: 2) }
6
+
7
+ trait :all_fields
8
+ end
9
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :energy_provider, parent: :record, class: "SBOM::CycloneDX::Record::EnergyProvider" do
5
+ organization { association(:organizational_entity) }
6
+ energy_source { SBOM::CycloneDX::Enum::ENERGY_SOURCE.sample }
7
+ energy_provided { association(:energy_measure) }
8
+
9
+ trait :all_fields do
10
+ bom_ref { generate(:ref_link) }
11
+ description { Faker::Lorem.sentence }
12
+ external_references { association_list(:external_reference) }
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :environmental_consideration, parent: :record, class: "SBOM::CycloneDX::Record::EnvironmentalConsideration" do
5
+ trait :all_fields do
6
+ energy_consumptions { association_list(:energy_consumption) }
7
+ properties { association_list(:property) }
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :event, parent: :record, class: "SBOM::CycloneDX::Record::Event" do
5
+ trait :all_fields do
6
+ uid { SecureRandom.uuid }
7
+ description { Faker::Lorem.sentence }
8
+ time_received { Faker::Time.backward(days: 21) }
9
+ data { association(:attachment) }
10
+ source { association(:resource_reference_choice) }
11
+ target { association(:resource_reference_choice) }
12
+ properties { association_list(:property) }
13
+ end
14
+ end
15
+ end