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