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,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require "sbom/cyclone_dx/record/release_notes"
5
+
6
+ describe SBOM::CycloneDX::Record::ReleaseNotes do
7
+ it "can be initialized with minimum required attributes" do
8
+ expect { build(:release_notes) }.not_to raise_error
9
+ end
10
+
11
+ it "can be initialized with all attributes" do
12
+ expect { build(:release_notes, :all_fields) }.not_to raise_error
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require "sbom/cyclone_dx/record/resource_reference_choice"
5
+
6
+ describe SBOM::CycloneDX::Record::ResourceReferenceChoice do
7
+ it "can be initialized with minimum required attributes" do
8
+ expect { build(:resource_reference_choice) }.not_to raise_error
9
+ end
10
+
11
+ it "can be initialized with all attributes" do
12
+ expect { build(:resource_reference_choice, :all_fields) }.not_to raise_error
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require "sbom/cyclone_dx/record/risk"
5
+
6
+ describe SBOM::CycloneDX::Record::Risk do
7
+ it "can be initialized with minimum required attributes" do
8
+ expect { build(:risk) }.not_to raise_error
9
+ end
10
+
11
+ it "can be initialized with all attributes" do
12
+ expect { build(:risk, :all_fields) }.not_to raise_error
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require "sbom/cyclone_dx/record/root"
5
+
6
+ describe SBOM::CycloneDX::Record::Root do
7
+ it "can be initialized with minimum required attributes" do
8
+ expect { build(:root) }.not_to raise_error
9
+ end
10
+
11
+ it "can be initialized with all attributes" do
12
+ expect { build(:root, :all_fields) }.not_to raise_error
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require "sbom/cyclone_dx/record/secured_by"
5
+
6
+ describe SBOM::CycloneDX::Record::SecuredBy do
7
+ it "can be initialized with minimum required attributes" do
8
+ expect { build(:secured_by) }.not_to raise_error
9
+ end
10
+
11
+ it "can be initialized with all attributes" do
12
+ expect { build(:secured_by, :all_fields) }.not_to raise_error
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require "sbom/cyclone_dx/record/service_data"
5
+
6
+ describe SBOM::CycloneDX::Record::ServiceData do
7
+ it "can be initialized with minimum required attributes" do
8
+ expect { build(:service_data) }.not_to raise_error
9
+ end
10
+
11
+ it "can be initialized with all attributes" do
12
+ expect { build(:service_data, :all_fields) }.not_to raise_error
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require "sbom/cyclone_dx/record/service"
5
+
6
+ describe SBOM::CycloneDX::Record::Service do
7
+ it "can be initialized with minimum required attributes" do
8
+ expect { build(:service) }.not_to raise_error
9
+ end
10
+
11
+ it "can be initialized with all attributes" do
12
+ expect { build(:service, :all_fields) }.not_to raise_error
13
+ end
14
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require "sbom/cyclone_dx/record/signature"
5
+
6
+ describe SBOM::CycloneDX::Record::Signature do
7
+ describe SBOM::CycloneDX::Record::Signature::JSFSignature do
8
+ it "can be initialized with minimum required attributes" do
9
+ expect { build(:jsf_signature) }.not_to raise_error
10
+ end
11
+
12
+ it "can be initialized with all attributes" do
13
+ expect { build(:jsf_signature, :all_fields) }.not_to raise_error
14
+ end
15
+ end
16
+
17
+ describe SBOM::CycloneDX::Record::Signature::SignatureChain do
18
+ it "can be initialized with minimum required attributes" do
19
+ expect { build(:signature_chain) }.not_to raise_error
20
+ end
21
+
22
+ it "can be initialized with all attributes" do
23
+ expect { build(:signature_chain, :all_fields) }.not_to raise_error
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require "sbom/cyclone_dx/record/standard"
5
+
6
+ describe SBOM::CycloneDX::Record::Standard do
7
+ it "can be initialized with minimum required attributes" do
8
+ expect { build(:standard) }.not_to raise_error
9
+ end
10
+
11
+ it "can be initialized with all attributes" do
12
+ expect { build(:standard, :all_fields) }.not_to raise_error
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require "sbom/cyclone_dx/record/step"
5
+
6
+ describe SBOM::CycloneDX::Record::Step do
7
+ it "can be initialized with minimum required attributes" do
8
+ expect { build(:step) }.not_to raise_error
9
+ end
10
+
11
+ it "can be initialized with all attributes" do
12
+ expect { build(:step, :all_fields) }.not_to raise_error
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require "sbom/cyclone_dx/record/swid"
5
+
6
+ describe SBOM::CycloneDX::Record::SWID do
7
+ it "can be initialized with minimum required attributes" do
8
+ expect { build(:swid) }.not_to raise_error
9
+ end
10
+
11
+ it "can be initialized with all attributes" do
12
+ expect { build(:swid, :all_fields) }.not_to raise_error
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require "sbom/cyclone_dx/record/task"
5
+
6
+ describe SBOM::CycloneDX::Record::Task do
7
+ it "can be initialized with minimum required attributes" do
8
+ expect { build(:task) }.not_to raise_error
9
+ end
10
+
11
+ it "can be initialized with all attributes" do
12
+ expect { build(:task, :all_fields) }.not_to raise_error
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require "sbom/cyclone_dx/record/tools"
5
+
6
+ describe SBOM::CycloneDX::Record::Tools do
7
+ it "can be initialized with minimum required attributes" do
8
+ expect { build(:tools) }.not_to raise_error
9
+ end
10
+
11
+ it "can be initialized with all attributes" do
12
+ expect { build(:tools, :all_fields) }.not_to raise_error
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require "sbom/cyclone_dx/record/trigger"
5
+
6
+ describe SBOM::CycloneDX::Record::Trigger do
7
+ it "can be initialized with minimum required attributes" do
8
+ expect { build(:trigger) }.not_to raise_error
9
+ end
10
+
11
+ it "can be initialized with all attributes" do
12
+ expect { build(:trigger, :all_fields) }.not_to raise_error
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require "sbom/cyclone_dx/record/version"
5
+
6
+ describe SBOM::CycloneDX::Record::Version do
7
+ it "can be initialized with minimum required attributes" do
8
+ expect { build(:version) }.not_to raise_error
9
+ end
10
+
11
+ it "can be initialized with all attributes" do
12
+ expect { build(:version, :all_fields) }.not_to raise_error
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require "sbom/cyclone_dx/record/volume"
5
+
6
+ describe SBOM::CycloneDX::Record::Volume do
7
+ it "can be initialized with minimum required attributes" do
8
+ expect { build(:volume) }.not_to raise_error
9
+ end
10
+
11
+ it "can be initialized with all attributes" do
12
+ expect { build(:volume, :all_fields) }.not_to raise_error
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require "sbom/cyclone_dx/record/vulnerability_source"
5
+
6
+ describe SBOM::CycloneDX::Record::VulnerabilitySource do
7
+ it "can be initialized with minimum required attributes" do
8
+ expect { build(:vulnerability_source) }.not_to raise_error
9
+ end
10
+
11
+ it "can be initialized with all attributes" do
12
+ expect { build(:vulnerability_source, :all_fields) }.not_to raise_error
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require "sbom/cyclone_dx/record/vulnerability"
5
+
6
+ describe SBOM::CycloneDX::Record::Vulnerability do
7
+ it "can be initialized with minimum required attributes" do
8
+ expect { build(:vulnerability) }.not_to raise_error
9
+ end
10
+
11
+ it "can be initialized with all attributes" do
12
+ expect { build(:vulnerability, :all_fields) }.not_to raise_error
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require "sbom/cyclone_dx/record/workflow"
5
+
6
+ describe SBOM::CycloneDX::Record::Workflow do
7
+ it "can be initialized with minimum required attributes" do
8
+ expect { build(:workflow) }.not_to raise_error
9
+ end
10
+
11
+ it "can be initialized with all attributes" do
12
+ expect { build(:workflow, :all_fields) }.not_to raise_error
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require "sbom/cyclone_dx/record/workspace"
5
+
6
+ describe SBOM::CycloneDX::Record::Workspace do
7
+ it "can be initialized with minimum required attributes" do
8
+ expect { build(:workspace) }.not_to raise_error
9
+ end
10
+
11
+ it "can be initialized with all attributes" do
12
+ expect { build(:workspace, :all_fields) }.not_to raise_error
13
+ end
14
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ describe SBOM::CycloneDX::Record do
6
+ it "is just a module and so doesn't have real tests associated"
7
+ end
@@ -0,0 +1,184 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ describe SBOM::CycloneDX::Validator::ArrayValidator do
6
+ describe "#initialize" do
7
+ it "requires :items" do
8
+ expect { described_class.new(items: :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
+ it "supports uniqueness checking" do
15
+ expect(described_class.new(items: :integer, unique: true).validate([1, 2, 3])).to be_empty
16
+ expect(described_class.new(items: :integer, unique: true).validate([1, 2, 2])).not_to be_empty
17
+ end
18
+
19
+ context "when :items is a symbol" do
20
+ let(:items) { :string }
21
+ let(:value) { %w[a bb ccc] }
22
+
23
+ describe "#initialize" do
24
+ it "accepts all symbols representing simple types" do
25
+ SBOM::CycloneDX::Validator::SIMPLE_TYPES.each do |simple_type|
26
+ expect { described_class.new(items: simple_type) }.not_to raise_error
27
+ end
28
+ end
29
+
30
+ it "rejects symbols that are not simple types" do
31
+ %i[array union record invalid].each do |invalid_type|
32
+ # This may raise RBS::Test::Tester::TypeError or ArgumentError, depending on test context
33
+ expect { described_class.new(items: invalid_type) }.to raise_error(Exception)
34
+ end
35
+ end
36
+ end
37
+
38
+ describe "#validate" do
39
+ subject(:instance) { described_class.new(items: items) }
40
+
41
+ it "does not permit nil elements" do
42
+ expect(instance.validate(value.push(nil).shuffle)).not_to be_empty
43
+ end
44
+
45
+ it "returns an empty array when all elements are of the specified type" do
46
+ expect(instance.validate(value)).to be_empty
47
+ end
48
+
49
+ it "returns an array of error messages when any element is not of the specified type" do
50
+ expect(instance.validate(value.push(1).shuffle)).not_to be_empty
51
+ end
52
+ end
53
+ end
54
+
55
+ context "when :items is a Class" do
56
+ let(:items) { SBOM::CycloneDX::Record::Property }
57
+ let(:value) { Array.new(rand(1..5)) { items.new(name: Faker::Lorem.word, value: Faker::Lorem.sentence) } }
58
+
59
+ describe "#initialize" do
60
+ it "accepts classes for Record types" do
61
+ expect { described_class.new(items: items) }.not_to raise_error
62
+ end
63
+
64
+ it "rejects classes that are not Record types" do
65
+ # This may raise RBS::Test::Tester::TypeError or ArgumentError, depending on test context
66
+ expect { described_class.new(items: String) }.to raise_error(Exception)
67
+ end
68
+ end
69
+
70
+ describe "#validate" do
71
+ subject(:instance) { described_class.new(items: items) }
72
+
73
+ it "does not permit nil elements" do
74
+ expect(instance.validate(value.push(nil).shuffle)).not_to be_empty
75
+ end
76
+
77
+ it "returns an empty array when all elements are of the specified type and valid" do
78
+ expect(instance.validate(value)).to be_empty
79
+ end
80
+
81
+ it "returns an array of error messages when any element is invalid" do
82
+ bad_items = [
83
+ SBOM::CycloneDX::Record::Declarations::Attestation::Map::Confidence.new(score: 0.1),
84
+ SBOM::CycloneDX::Record::Declarations::Attestation::Map::Confidence.new(score: 2.5),
85
+ SBOM::CycloneDX::Record::Declarations::Attestation::Map::Confidence.new(score: 0.9)
86
+ ]
87
+ confidence_instance =
88
+ described_class.new(items: SBOM::CycloneDX::Record::Declarations::Attestation::Map::Confidence)
89
+ expect(confidence_instance.validate(bad_items)).not_to be_empty
90
+ end
91
+
92
+ it "returns an array of error messages when any element is not of the specified type" do
93
+ value.push(SBOM::CycloneDX::Record::Copyright.new(text: Faker::Lorem.sentence))
94
+ expect(instance.validate(value)).not_to be_empty
95
+ end
96
+ end
97
+ end
98
+
99
+ context "when :items is an Array" do
100
+ let(:items) { [:string, min_length: 1, max_length: 2] }
101
+ let(:value) { %w[a bb cc] }
102
+
103
+ describe "#initialize" do
104
+ it "accepts an array representing validator creation arguments" do
105
+ expect { described_class.new(items: items) }.not_to raise_error
106
+ end
107
+
108
+ it "rejects an array that does not represent validator creation arguments" do
109
+ # This may raise RBS::Test::Tester::TypeError or ArgumentError, depending on test context
110
+ expect { described_class.new(items: %i[string integer]) }.to raise_error(Exception)
111
+ end
112
+ end
113
+
114
+ describe "#validate" do
115
+ subject(:instance) { described_class.new(items: items) }
116
+
117
+ it "does not permit nil elements by default" do
118
+ expect(instance.validate(value.push(nil).shuffle)).not_to be_empty
119
+ end
120
+
121
+ it "allows permitting nil elements" do
122
+ items.last[:required] = false
123
+ nilable_instance = described_class.new(items: items)
124
+ expect(nilable_instance.validate(value.push(nil).shuffle)).to be_empty
125
+ end
126
+
127
+ it "returns an empty array when all elements are valid" do
128
+ expect(instance.validate(value)).to be_empty
129
+ end
130
+
131
+ it "returns an array of error messages when any element is invalid" do
132
+ expect(instance.validate(value.push("dddd").shuffle)).not_to be_empty
133
+ end
134
+ end
135
+ end
136
+
137
+ # context "when :items is a Proc" do
138
+ # pending "Re-implementation of procs in ArrayValidator"
139
+ # let(:items) { ->(item) { item.even? && item < 10 } }
140
+ # let(:value) { [2, 4, 6] }
141
+
142
+ # describe "#initialize" do
143
+ # it "accepts a Proc" do
144
+ # expect { described_class.new(items: items) }.not_to raise_error
145
+ # end
146
+ # end
147
+
148
+ # describe "#validate" do
149
+ # subject(:instance) { described_class.new(items: items) }
150
+
151
+ # it "returns proc return value when proc returns an array" do
152
+ # expected_return = value.map { Faker::Lorem.word }
153
+ # message_stack = expected_return.reverse
154
+ # array_proc_instance = described_class.new(items: ->(_item) { message_stack.pop })
155
+ # expect(array_proc_instance.validate(value)).to match_array(expected_return)
156
+ # end
157
+
158
+ # it "wraps proc value in array when proc returns a string" do
159
+ # static_message = "some error message"
160
+ # expected_return = value.map { static_message }
161
+ # string_proc_instance = described_class.new(items: ->(_item) { static_message })
162
+ # expect(string_proc_instance.validate(value)).to match_array(expected_return)
163
+ # end
164
+
165
+ # it "returns a basic error message when proc returns false" do
166
+ # false_proc_instance = described_class.new(items: lambda(&:even?))
167
+ # expect(false_proc_instance.validate([5])).to contain_exactly("5 is invalid")
168
+ # end
169
+
170
+ # it "returns an empty array when proc returns true" do
171
+ # true_proc_instance = described_class.new(items: lambda(&:even?))
172
+ # expect(true_proc_instance.validate([4])).to be_empty
173
+ # end
174
+
175
+ # it "returns an empty array when all elements are valid" do
176
+ # expect(instance.validate(value)).to be_empty
177
+ # end
178
+
179
+ # it "returns an array of error messages when any element is invalid" do
180
+ # expect(instance.validate(value.push(11).shuffle)).not_to be_empty
181
+ # end
182
+ # end
183
+ # end
184
+ 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::BaseValidator do
7
+ subject(:validator_klass) { Class.new(described_class) }
8
+
9
+ describe "#initialize" do
10
+ it "returns an error if not subclassed" do
11
+ expect { described_class.new }.to raise_error(RuntimeError)
12
+ end
13
+
14
+ it "accepts optional class types" do
15
+ expect { validator_klass.new }.not_to raise_error
16
+ expect { validator_klass.new(Integer) }.not_to raise_error
17
+ expect { validator_klass.new(String, Float) }.not_to raise_error
18
+ end
19
+
20
+ it "accepts optional :required" do
21
+ expect(validator_klass.new).not_to be_required
22
+ expect(validator_klass.new(required: true)).to be_required
23
+ end
24
+ end
25
+
26
+ describe "#required?" do
27
+ it "returns true when initialized with required: true" do
28
+ expect(validator_klass.new(required: true).required?).to be true
29
+ end
30
+
31
+ it "returns false when intialized with required: false" do
32
+ expect(validator_klass.new(required: false).required?).to be false
33
+ end
34
+ end
35
+
36
+ describe "#valid?" do
37
+ subject(:validator) { validator_klass.new }
38
+
39
+ it "returns true when #validate returns no errors" do
40
+ allow(validator).to receive(:validate).and_return([]) # rubocop:disable RSpec/SubjectStub
41
+ expect(validator.valid?(1)).to be true
42
+ end
43
+
44
+ it "returns false when #validate returns errors" do
45
+ allow(validator).to receive(:validate).and_return(["some error"]) # rubocop:disable RSpec/SubjectStub
46
+ expect(validator.valid?(1)).to be false
47
+ end
48
+ end
49
+
50
+ describe "#validate" do
51
+ subject(:validator) { validator_klass.new(Integer, String) }
52
+
53
+ it "returns an empty array when the arg is one of the specified types" do
54
+ expect(validator.validate(1)).to eq []
55
+ expect(validator.validate("a")).to eq []
56
+ end
57
+
58
+ it "returns an error when the arg is not one of the specified types" do
59
+ expect(validator.validate(1.5)).to contain_exactly(an_instance_of(String))
60
+ expect(validator.validate(%w[a b c])).to contain_exactly(an_instance_of(String))
61
+ end
62
+
63
+ it "returns an empty array when the arg is nil and required is false" do
64
+ expect(validator_klass.new(Integer, required: false).validate(nil)).to eq []
65
+ end
66
+
67
+ it "returns an error when the arg is nil and required is true" do
68
+ expect(validator_klass.new(Integer, required: true).validate(nil)).to contain_exactly(an_instance_of(String))
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,26 @@
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::BooleanValidator do
7
+ subject(:validator) { described_class.new(required: true) }
8
+
9
+ it "accepts true" do
10
+ expect(validator.validate(true)).to be_empty
11
+ end
12
+
13
+ it "accepts false" do
14
+ expect(validator.validate(false)).to be_empty
15
+ end
16
+
17
+ it "rejects truthy values" do
18
+ expect(validator.validate(1)).not_to be_empty
19
+ expect(validator.validate("true")).not_to be_empty
20
+ end
21
+
22
+ it "rejects falsey values" do
23
+ expect(validator.validate(0)).not_to be_empty
24
+ expect(validator.validate(nil)).not_to be_empty
25
+ end
26
+ end
@@ -0,0 +1,28 @@
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::DateTimeValidator do
7
+ subject(:validator) { described_class.new(required: true) }
8
+
9
+ it "accepts DateTime instances" do
10
+ expect(validator.validate(DateTime.current)).to be_empty
11
+ end
12
+
13
+ it "accepts Time instances" do
14
+ expect(validator.validate(Time.now)).to be_empty
15
+ end
16
+
17
+ it "accepts strings in ISO 8601 format" do
18
+ expect(validator.validate("2022-01-01T12:00:00Z")).to be_empty
19
+ end
20
+
21
+ it "rejects Date instances" do
22
+ expect(validator.validate(Date.today)).not_to be_empty
23
+ end
24
+
25
+ it "rejects strings in other formats" do
26
+ expect(validator.validate("6/15/2013, 5:32:17 PM")).not_to be_empty
27
+ end
28
+ end
@@ -0,0 +1,23 @@
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::EmailAddressValidator do
7
+ subject(:validator) { described_class.new(required: true) }
8
+
9
+ it "accepts EmailAddress instances" do
10
+ expect(validator.validate(EmailAddress::Address.new(Faker::Internet.email))).to be_empty
11
+ end
12
+
13
+ it "accepts strings representing valid email addresses" do
14
+ expect(validator.validate(Faker::Internet.email)).to be_empty
15
+ end
16
+
17
+ it "rejects strings representing invalid email addresses" do
18
+ expect(validator.validate("bad@email")).not_to be_empty
19
+ expect(validator.validate("bad.email")).not_to be_empty
20
+ expect(validator.validate("bad@.com")).not_to be_empty
21
+ expect(validator.validate("bad.com")).not_to be_empty
22
+ end
23
+ end