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,16 @@
1
+ module SBOM
2
+ module CycloneDX
3
+ module Type
4
+ module Boolean
5
+ end
6
+
7
+ class Union
8
+ @types: Array[fieldTypeLabel]
9
+
10
+ def self.[]: [T < fieldTypeLabel] (*T) -> instance
11
+
12
+ private def initialize: [T < fieldTypeLabel] (*T) -> void
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,31 @@
1
+ module SBOM
2
+ module CycloneDX
3
+ module Validator
4
+ class ArrayValidator < BaseValidator[::Array[fieldValue]]
5
+ type itemsValidator = ^(untyped) -> Array[String]
6
+ type validSingleTypeLabel =
7
+ :boolean
8
+ | :date_time
9
+ | :email_address
10
+ | :float
11
+ | :integer
12
+ | singleton(SBOM::CycloneDX::Record::Base)
13
+ | :string
14
+ | :uri
15
+
16
+ @items_validator: BaseValidator[fieldValue]
17
+ @unique: bool
18
+
19
+ def initialize: (
20
+ items: itemsValidator | validSingleTypeLabel | Validator::arrayItemValidatorParams,
21
+ ?unique: bool,
22
+ ?required: bool
23
+ ) -> void
24
+
25
+ def valid?: (untyped) -> bool
26
+ private def validator_method: (SBOM::CycloneDX::Validator::BaseValidator[untyped]) -> ^(untyped) -> Array[String]
27
+ private def proc_validator: (^(untyped) -> (bool | Array[untyped] | String)) -> ^(untyped) -> Array[String]
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,21 @@
1
+ module SBOM
2
+ module CycloneDX
3
+ module Validator
4
+ class BaseValidator[in T < fieldValue]
5
+ MISSING_REQUIRED: String
6
+ INVALID_TYPE: String
7
+
8
+ @types: Array[fieldType]
9
+ @required: bool
10
+ @errors: Array[String]
11
+
12
+ def initialize: (*fieldType, ?required: bool) -> void
13
+ def valid?: (untyped) -> bool
14
+ def validate: (untyped) -> Array[String]
15
+ def required?: () -> bool
16
+ def const?: () -> bool
17
+ def raw_types: () -> Array[fieldType]
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,9 @@
1
+ module SBOM
2
+ module CycloneDX
3
+ module Validator
4
+ class BooleanValidator < BaseValidator[bool]
5
+ def initialize: (?required: bool) -> void
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ module SBOM
2
+ module CycloneDX
3
+ module Validator
4
+ class DateTimeValidator < BaseValidator[dateTime]
5
+ def initialize: (?required: bool) -> void
6
+ def valid?: (untyped) -> bool
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module SBOM
2
+ module CycloneDX
3
+ module Validator
4
+ class EmailAddressValidator < BaseValidator[emailAddress]
5
+ def initialize: (?required: bool) -> void
6
+ def valid?: (untyped) -> bool
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ module SBOM
2
+ module CycloneDX
3
+ module Validator
4
+ class FloatValidator < BaseValidator[Float]
5
+ @range: Range[number?]
6
+
7
+ def initialize: (?maximum: number?, ?minimum: number?, ?required: bool) -> void
8
+ def valid?: (untyped) -> bool
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module SBOM
2
+ module CycloneDX
3
+ module Validator
4
+ class IntegerValidator < BaseValidator[Integer]
5
+ @range: Range[number?]
6
+
7
+ def initialize: (?maximum: number?, ?minimum: number?, ?required: bool) -> void
8
+ def valid?: (untyped) -> bool
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module SBOM
2
+ module CycloneDX
3
+ module Validator
4
+ class RecordValidator < BaseValidator[Record::Base]
5
+ @record_type: singleton(SBOM::CycloneDX::Record::Base)
6
+
7
+ def initialize: (type: singleton(SBOM::CycloneDX::Record::Base), ?required: bool) -> void
8
+ def valid?: (untyped) -> bool
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,14 @@
1
+ module SBOM
2
+ module CycloneDX
3
+ module Validator
4
+ class StringValidator < BaseValidator[String]
5
+ @enum: Array[String]?
6
+ @length_range: Range[Integer?]
7
+ @pattern: Regexp
8
+
9
+ def initialize: (?enum: Array[String]?, ?max_length: Integer?, ?min_length: Integer?, ?pattern: Regexp, ?required: bool) -> void
10
+ def valid?: (untyped) -> bool
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,24 @@
1
+ module SBOM
2
+ module CycloneDX
3
+ module Validator
4
+ class UnionValidator < BaseValidator[fieldValue]
5
+ type unionableValidatorParams =
6
+ fieldTypeLabel
7
+ | [:array, arrayValidatorParams]
8
+ | [:boolean, booleanValidatorParams]
9
+ | [:date_time, dateTimeValidatorParams]
10
+ | [:email_address, emailAddressValidatorParams]
11
+ | [:float, floatValidatorParams]
12
+ | [:integer, integerValidatorParams]
13
+ | [singleton(SBOM::CycloneDX::Record::Base), recordValidatorParams]
14
+ | [:string, stringValidatorParams]
15
+ | [:uri, uriValidatorParams]
16
+
17
+ @nested_validators: Array[BaseValidator[untyped]]
18
+
19
+ def initialize: (of: Array[unionableValidatorParams], ?required: bool) -> void
20
+ def valid?: (untyped) -> bool
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,10 @@
1
+ module SBOM
2
+ module CycloneDX
3
+ module Validator
4
+ class URIValidator < BaseValidator[uri]
5
+ def initialize: (?required: bool) -> void
6
+ def valid?: (untyped) -> bool
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,66 @@
1
+ module SBOM
2
+ module CycloneDX
3
+ module Validator
4
+ type anyValidator =
5
+ ArrayValidator
6
+ | BooleanValidator
7
+ | DateTimeValidator
8
+ | EmailAddressValidator
9
+ | FloatValidator
10
+ | IntegerValidator
11
+ | RecordValidator
12
+ | StringValidator
13
+ | UnionValidator
14
+ | URIValidator
15
+
16
+ type arrayValidatorParams = { items: ^(untyped) -> bool | fieldTypeLabel | arrayItemValidatorParams, ?unique: bool, ?required: bool }
17
+ type booleanValidatorParams = { ?required: bool }
18
+ type dateTimeValidatorParams = { ?required: bool }
19
+ type emailAddressValidatorParams = { ?required: bool }
20
+ type floatValidatorParams = { ?maximum: number?, ?minimum: number, ?required: bool }
21
+ type integerValidatorParams = { ?maximum: Integer, ?minimum: Integer, ?required: bool }
22
+ type recordValidatorParams = { type: singleton(SBOM::CycloneDX::Record::Base), ?required: bool }
23
+ type stringValidatorParams = { ?enum: Array[String], ?max_length: Integer?, ?min_length: Integer?, ?pattern: Regexp, ?required: bool }
24
+ type unionValidatorParams = { of: Array[UnionValidator::unionableValidatorParams], ?required: bool }
25
+ type uriValidatorParams = { ?required: bool }
26
+ type anyValidatorParams =
27
+ arrayValidatorParams
28
+ | booleanValidatorParams
29
+ | dateTimeValidatorParams
30
+ | emailAddressValidatorParams
31
+ | floatValidatorParams
32
+ | integerValidatorParams
33
+ | recordValidatorParams
34
+ | stringValidatorParams
35
+ | unionValidatorParams
36
+ | uriValidatorParams
37
+
38
+ type arrayItemValidatorParams =
39
+ [:array, arrayValidatorParams]
40
+ | [:boolean, booleanValidatorParams]
41
+ | [:date_time, dateTimeValidatorParams]
42
+ | [:email_address, emailAddressValidatorParams]
43
+ | [:float, floatValidatorParams]
44
+ | [:integer, integerValidatorParams]
45
+ | [singleton(SBOM::CycloneDX::Record::Base), recordValidatorParams]
46
+ | [:string, stringValidatorParams]
47
+ | [:union, unionValidatorParams]
48
+ | [:uri, uriValidatorParams]
49
+
50
+ SIMPLE_TYPES: [:array, :boolean, :date_time, :email_address, :float, :integer, :string, :uri]
51
+
52
+ def self.for:
53
+ (:array type, **untyped) -> ArrayValidator
54
+ | (:boolean type, **untyped) -> BooleanValidator
55
+ | (:date_time type, **untyped) -> DateTimeValidator
56
+ | (:email_address type, **untyped) -> EmailAddressValidator
57
+ | (:float type, **untyped) -> FloatValidator
58
+ | (:integer type, **untyped) -> IntegerValidator
59
+ | (singleton(SBOM::CycloneDX::Record::Base) type, **untyped) -> RecordValidator
60
+ | (:string type, **untyped) -> StringValidator
61
+ | (:union type, **untyped) -> UnionValidator
62
+ | (:uri type, **untyped) -> URIValidator
63
+ | (fieldTypeLabel type, **untyped) -> BaseValidator[untyped]
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,13 @@
1
+ module SBOM
2
+ module CycloneDX
3
+ VERSION: String
4
+
5
+ class Error < StandardError
6
+ end
7
+
8
+ def self.create: (Hash[String | Symbol, fieldValue]) -> Record::Root
9
+ def self.load: (File) -> Record::Root
10
+ def self.parse: (String) -> Record::Root
11
+ def self.json_create: (::Hash[String | Symbol, untyped]) -> Record::Root
12
+ end
13
+ end
data/sig/types.rbs ADDED
@@ -0,0 +1,45 @@
1
+ type dateTime = DateTime | Time | String
2
+ type emailAddress = EmailAddress::Address | String
3
+ type number = Integer | Float
4
+ type uri = URI::Generic | String
5
+ type fieldValue =
6
+ bool
7
+ | dateTime
8
+ | emailAddress
9
+ | Float
10
+ | Integer
11
+ | SBOM::CycloneDX::Record::Base
12
+ | String
13
+ | URI::Generic
14
+ | nil
15
+ | Array[fieldValue]
16
+ type fieldTypeLabel =
17
+ :array
18
+ | :boolean
19
+ | :date_time
20
+ | :email_address
21
+ | :float
22
+ | :integer
23
+ | singleton(SBOM::CycloneDX::Record::Base)
24
+ | :string
25
+ | :union
26
+ | :uri
27
+ type fieldType = Class & (
28
+ singleton(Array)
29
+ | singleton(TrueClass)
30
+ | singleton(FalseClass)
31
+ | singleton(DateTime)
32
+ | singleton(Time)
33
+ | singleton(EmailAddress::Address)
34
+ | singleton(Float)
35
+ | singleton(Integer)
36
+ | singleton(String)
37
+ | singleton(URI::Generic)
38
+ | singleton(SBOM::CycloneDX::Record::Base)
39
+ )
40
+
41
+ type jsonObject = Float | Integer | String | bool | Array[jsonObject] | Hash[String, jsonObject] | nil
42
+
43
+ # Steep can't find this for some raeason
44
+ class Date::Error < Exception
45
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require "email_address_extension"
5
+
6
+ describe EmailAddressExtension do
7
+ let(:email_address_string) { Faker::Internet.email }
8
+ let(:email_address) { EmailAddress.new(email_address_string) }
9
+
10
+ it "disables dns lookup" do
11
+ expect(email_address.host.dns_enabled?).to be false
12
+ expect(email_address.host.config[:dns_lookup]).to eq(:off)
13
+ end
14
+
15
+ it "disables host validation" do
16
+ expect(email_address.host.dns_enabled?).to be false
17
+ expect(email_address.host.config[:host_validation]).to eq(:syntax)
18
+ end
19
+
20
+ it "aliases #as_json to #to_s" do
21
+ expect(email_address.as_json).to eq(email_address_string)
22
+ end
23
+
24
+ it "aliases #to_json to #to_s" do
25
+ expect(email_address.to_json).to eq(email_address_string)
26
+ end
27
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "faker"
4
+
5
+ module FactoryHelper
6
+ SEQUENCE_GENERATORS = {
7
+ # Generators for data not available through Faker, mostly matching Pattern:: constants
8
+ cdx_urn_fragment: ->(n) { "fragment-#{n}" },
9
+ cdx_bom_version: ->(n) { (n + 1).to_s },
10
+ cdx_urn_nss: ->(n) { "#{SecureRandom.uuid}/#{use_generator(:cdx_bom_version, n)}" },
11
+ cdx_urn_assigned_name: ->(n) { "urn:cdx:#{use_generator(:cdx_urn_nss, n)}" },
12
+ cdx_urn_with_fragment: lambda do |n|
13
+ "#{use_generator(:cdx_urn_assigned_name, n)}##{use_generator(:cdx_urn_fragment, n)}"
14
+ end,
15
+ cdx_urn: lambda do |n|
16
+ next use_generator(:cdx_urn_assigned_name, n) if Faker::Boolean.boolean
17
+
18
+ use_generator(:cdx_urn_with_fragment, n)
19
+ end,
20
+ bom_serial_number: ->(_) { "urn:uuid:#{SecureRandom.uuid}" },
21
+ ref_link: ->(n) { "ref-link-#{n}" },
22
+ ref_or_cdx_urn: lambda do |n|
23
+ Faker::Boolean.boolean ? use_generator(:ref_link, n) : use_generator(:cdx_urn_with_fragment, n)
24
+ end,
25
+ hash_value: ->(_) { SecureRandom.hex([32, 40, 64, 96, 128].sample) },
26
+ locale: ->(_) { I18n.available_locales.sample.to_s },
27
+ mime_type: ->(_) { Faker::File.mime_type },
28
+ open_cre: ->(_) { "CRE:#{rand(1..100)}-#{rand(1..100)}" },
29
+ content_type: lambda do |n|
30
+ mime_type = use_generator(:mime_type, n)
31
+ next mime_type if Faker::Boolean.boolean
32
+
33
+ "#{mime_type}; #{Faker::Lorem.word.downcase}=#{Faker::Lorem.word.downcase}-#{n}"
34
+ end,
35
+ url: lambda do |_|
36
+ gen_url = Faker::Internet.url
37
+ next gen_url if Faker::Boolean.boolean
38
+
39
+ URI.parse(gen_url)
40
+ end,
41
+ email: lambda do |_|
42
+ gen_email = Faker::Internet.email
43
+ next gen_email if Faker::Boolean.boolean
44
+
45
+ EmailAddress::Address.new(gen_email)
46
+ end
47
+ }.freeze
48
+
49
+ SEQUENCE_GENERATORS.each do |name, generator|
50
+ FactoryBot::Internal.register_sequence(FactoryBot::Sequence.new(name, &generator))
51
+ end
52
+
53
+ def self.use_generator(name, n) # rubocop:disable Naming/MethodParameterName
54
+ SEQUENCE_GENERATORS.fetch(name).call(n)
55
+ end
56
+
57
+ def generate_association(factories, *args, **kwargs)
58
+ association(factories.sample, *args, **kwargs)
59
+ end
60
+
61
+ def association_list(factory, count = nil, *args, **kwargs)
62
+ Array.new(count || rand(1..2)) { generate_association(Array(factory), *args, **kwargs) }
63
+ end
64
+
65
+ def generate_license_choice(*args, **kwargs)
66
+ generate_association(%i[license_expression wrapped_license], *args, **kwargs)
67
+ end
68
+
69
+ def license_choice_list(count = nil, *args, **kwargs)
70
+ association_list(%i[license_expression wrapped_license], count, *args, **kwargs)
71
+ end
72
+
73
+ def generate_signature(*args, **kwargs)
74
+ generate_association(%i[jsf_signature signature_chain signer_list], *args, **kwargs)
75
+ end
76
+ end
77
+
78
+ FactoryBot::Evaluator.prepend(FactoryHelper)
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :advisory, parent: :record, class: "SBOM::CycloneDX::Record::Advisory" do
5
+ url { generate(:url) }
6
+
7
+ trait :all_fields do
8
+ title { Faker::Lorem.sentence }
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :annotation, parent: :record, class: "SBOM::CycloneDX::Record::Annotation" do
5
+ subjects { Array.new(rand(1..4)) { generate(:ref_or_cdx_urn) } }
6
+ annotator
7
+ timestamp { Faker::Time.backward(days: 367) }
8
+ text { Faker::Lorem.sentence }
9
+
10
+ trait :all_fields do
11
+ bom_ref { generate(:ref_link) }
12
+ annotator
13
+ signature { generate_signature }
14
+ end
15
+ end
16
+
17
+ factory :annotator, parent: :record, class: "SBOM::CycloneDX::Record::Annotation::Annotator" do
18
+ transient do
19
+ annotator_type do
20
+ %i[
21
+ organization
22
+ individual
23
+ component
24
+ service
25
+ ].sample
26
+ end
27
+ end
28
+
29
+ trait :all_fields
30
+
31
+ trait :organization do
32
+ transient { annotator_type { :organization } }
33
+ end
34
+
35
+ trait :contact do
36
+ transient { annotator_type { :contact } }
37
+ end
38
+
39
+ trait :component do
40
+ transient { annotator_type { :component } }
41
+ end
42
+
43
+ trait :service do
44
+ transient { annotator_type { :service } }
45
+ end
46
+
47
+ organization do
48
+ annotator_type == :organization ? association(:organizational_entity) : nil
49
+ end
50
+
51
+ individual do
52
+ annotator_type == :individual ? association(:organizational_contact) : nil
53
+ end
54
+
55
+ component do
56
+ annotator_type == :component ? association(:component) : nil
57
+ end
58
+
59
+ service do
60
+ annotator_type == :service ? association(:service) : nil
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :attachment, parent: :record, class: "SBOM::CycloneDX::Record::Attachment" do
5
+ content { Base64.encode64(Faker::Lorem.paragraph) }
6
+ end
7
+
8
+ trait :all_fields
9
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "yaml"
4
+
5
+ FactoryBot.define do
6
+ factory :cipher_suite, parent: :record, class: "SBOM::CycloneDX::Record::CipherSuite" do
7
+ transient do
8
+ cipher_data { @cipher_data ||= YAML.load_file("spec/fixtures/cipher_info.yml") }
9
+ end
10
+
11
+ trait :all_fields do
12
+ name { cipher_data.keys.sample }
13
+ identifiers { cipher_data[name] }
14
+ algorithms do
15
+ name.split("_")[0..-2].each_with_object([]) do |word, memo|
16
+ case word
17
+ when "WITH", "TLS", "NULL" then next
18
+ when /\A[0-9]+\z/ then memo << "#{memo.pop}-#{word}"
19
+ when /\A[A-Z]+[0-9]{2,}\z/ then memo << word.gsub(/([A-Z])([0-9])/, '\1-\2').downcase
20
+ else memo << word.downcase
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :co2_measure, parent: :record, class: "SBOM::CycloneDX::Record::CO2Measure" do
5
+ value { rand(0.0..100.0) }
6
+
7
+ trait :all_fields
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :command, parent: :record, class: "SBOM::CycloneDX::Record::Command" do
5
+ trait :all_fields do
6
+ executed { "echo '#{Faker::Lorem.sentence}'" }
7
+ properties { association_list(:property) }
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :commit, parent: :record, class: "SBOM::CycloneDX::Record::Commit" do
5
+ trait :all_fields do
6
+ uid { Faker::Crypto.sha1 }
7
+ url { generate(:url) }
8
+ author factory: :identifiable_action
9
+ committer factory: :identifiable_action
10
+ message { Faker::Lorem.sentence }
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "sbom/cyclone_dx/enum"
4
+
5
+ FactoryBot.define do
6
+ factory :component_data, parent: :record, class: "SBOM::CycloneDX::Record::ComponentData" do
7
+ type { SBOM::CycloneDX::Enum::COMPONENT_DATA_TYPE.sample }
8
+
9
+ trait :all_fields do
10
+ bom_ref { generate(:ref_link) }
11
+ name { Faker::Lorem.word }
12
+ contents factory: :content
13
+ classification { Faker::Lorem.word }
14
+ sensitive_data { Array.new(rand(1..4)) { Faker::Lorem.word } }
15
+ graphics factory: :graphics_collection
16
+ description { Faker::Lorem.sentence }
17
+ governance factory: :data_governance
18
+ end
19
+ end
20
+
21
+ factory :content, parent: :record, class: "SBOM::CycloneDX::Record::ComponentData::Content" do
22
+ trait :all_fields do
23
+ attachment
24
+ url { generate(:url) }
25
+ properties { association_list(:property) }
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :component_evidence, parent: :record, class: "SBOM::CycloneDX::Record::ComponentEvidence" do
5
+ trait :all_fields do
6
+ identity { association_list(:component_identity_evidence) }
7
+ occurrences { association_list(:occurrence) }
8
+ callstack
9
+ licenses { license_choice_list(rand(1..3)) }
10
+ copyright { association_list(:copyright) }
11
+ end
12
+ end
13
+
14
+ factory :callstack, parent: :record, class: "SBOM::CycloneDX::Record::ComponentEvidence::Callstack" do
15
+ trait :all_fields do
16
+ frames { association_list(:frame) }
17
+ end
18
+ end
19
+
20
+ factory :frame, parent: :record, class: "SBOM::CycloneDX::Record::ComponentEvidence::Frame" do
21
+ source_module { Faker::Lorem.word }
22
+
23
+ trait :all_fields do
24
+ package { Faker::Lorem.word }
25
+ function { Faker::Lorem.word }
26
+ parameters { Faker::Lorem.words(number: rand(1..4)) }
27
+ line { rand(1..1000) }
28
+ column { rand(1..200) }
29
+ full_filename { Faker::File.file_name }
30
+ end
31
+ end
32
+
33
+ factory :occurrence, parent: :record, class: "SBOM::CycloneDX::Record::ComponentEvidence::Occurrence" do
34
+ location { Faker::File.file_name }
35
+
36
+ trait :all_fields do
37
+ bom_ref { generate(:ref_link) }
38
+ line { rand(1..1000) }
39
+ offset { rand(1..200) }
40
+ symbol { Faker::Lorem.word }
41
+ additional_context { Faker::Lorem.sentence }
42
+ end
43
+ end
44
+ end