3636from cyclonedx .model .bom import Bom , BomMetaData , DistributionConstraints , TlpClassification
3737from cyclonedx .model .component import Component , Patch , Pedigree
3838from cyclonedx .model .component_evidence import ComponentEvidence , Identity as CEIdentity , Method as CEMethod
39+ from cyclonedx .model .crypto import CryptoProperties
3940from cyclonedx .model .issue import IssueType
4041from cyclonedx .model .license import DisjunctiveLicense
4142from cyclonedx .model .lifecycle import LifecyclePhase , PredefinedLifecycle
8788 VulnerabilityScoreSource ,
8889 VulnerabilitySeverity ,
8990)
91+ from cyclonedx .model .crypto import ( # isort:skip
92+ CryptoAssetType ,
93+ CryptoPrimitive ,
94+ CryptoExecutionEnvironment ,
95+ CryptoImplementationPlatform ,
96+ CryptoCertificationLevel ,
97+ CryptoMode ,
98+ CryptoPadding ,
99+ CryptoFunction ,
100+ RelatedCryptoMaterialType ,
101+ RelatedCryptoMaterialState ,
102+ ProtocolPropertiesType ,
103+ )
90104
91105# endregion SUT
92106
97111def dp_cases_from_xml_schema (sf : str , xpath : str ) -> Generator [str , None , None ]:
98112 for el in xml_parse (sf ).iterfind (f'{ xpath } /{ SCHEMA_NS } restriction/{ SCHEMA_NS } enumeration' ): # nosec B314
99113 yield el .get ('value' )
114+ # warn if no such structure
100115
101116
102- def dp_cases_from_xml_schemas (xpath : str ) -> Generator [str , None , None ]:
117+ def dp_cases_from_xml_schemas (xpath : str ) -> set [str ]:
118+ cases : set [str ] = set ()
103119 for sf in SCHEMA_XML .values ():
104120 if sf is None :
105121 continue
106- yield from dp_cases_from_xml_schema (sf , xpath )
107-
122+ cases .update (dp_cases_from_xml_schema (sf , xpath ))
123+ if len (cases ) == 0 :
124+ raise ValueError (f'no values for xpath: { xpath !r} ' )
125+ return cases
108126
109127def dp_cases_from_json_schema (sf : str , jsonpointer : Iterable [str ]) -> Generator [str , None , None ]:
110128 with open (sf ) as sfh :
@@ -113,15 +131,20 @@ def dp_cases_from_json_schema(sf: str, jsonpointer: Iterable[str]) -> Generator[
113131 for pp in jsonpointer :
114132 data = data [pp ]
115133 except KeyError :
134+ # warn if no such structure
116135 return
117136 yield from data ['enum' ]
118137
119138
120- def dp_cases_from_json_schemas (* jsonpointer : str ) -> Generator [str , None , None ]:
139+ def dp_cases_from_json_schemas (* jsonpointer : str ) -> set [str ]:
140+ cases : set [str ] = set ()
121141 for sf in SCHEMA_JSON .values ():
122142 if sf is None :
123143 continue
124- yield from dp_cases_from_json_schema (sf , jsonpointer )
144+ cases .update (dp_cases_from_json_schema (sf , jsonpointer ))
145+ if len (cases ) == 0 :
146+ raise ValueError (f'no values for jsonpointer: { jsonpointer !r} ' )
147+ return cases
125148
126149
127150UNSUPPORTED_OF_SV = frozenset ([
@@ -490,7 +513,7 @@ class TestEnumLifecyclePhase(_EnumTestCase):
490513
491514 @idata (set (chain (
492515 dp_cases_from_xml_schemas (f"./{ SCHEMA_NS } simpleType[@name='lifecyclePhaseType']" ),
493- dp_cases_from_json_schemas ('definitions' , 'metadata' , 'properties' , 'lifecycles' , 'items' , 'phase' ),
516+ dp_cases_from_json_schemas ('definitions' , 'metadata' , 'properties' , 'lifecycles' , 'items' , 'oneOf' , 0 , 'properties' , ' phase' ),
494517 )))
495518 def test_knows_value (self , value : str ) -> None :
496519 super ()._test_knows_value (LifecyclePhase , value )
@@ -598,6 +621,49 @@ def test_cases_render_valid(self, of: OutputFormat, sv: SchemaVersion, *_: Any,
598621 ])
599622 super ()._test_cases_render (bom , of , sv )
600623
624+ @ddt
625+ class TestEnumCryptoAssetType (_EnumTestCase ):
626+
627+ @idata (set (chain (
628+ dp_cases_from_xml_schemas (f"./{ SCHEMA_NS } complexType[@name='cryptoPropertiesType']/{ SCHEMA_NS } sequence/{ SCHEMA_NS } element[@name='assetType']/{ SCHEMA_NS } simpleType" ),
629+ dp_cases_from_json_schemas ('definitions' , 'cryptoProperties' , 'properties' , 'assetType' ),
630+ )))
631+ def test_knows_value (self , value : str ) -> None :
632+ super ()._test_knows_value (CryptoAssetType , value )
633+
634+ @named_data (* (d for d in NAMED_OF_SV if d [2 ] >= SchemaVersion .V1_6 ))
635+ def test_cases_render_valid (self , of : OutputFormat , sv : SchemaVersion , * _ : Any , ** __ : Any ) -> None :
636+ bom = _make_bom (
637+ components = [
638+ Component (
639+ name = f'CryptoAssetType: { cat .name } ' , type = ComponentType .CRYPTOGRAPHIC_ASSET , bom_ref = f'dummy-CAT:{ cat .name } ' ,
640+ crypto_properties = CryptoProperties (
641+ asset_type = cat
642+ )
643+ ) for cat in CryptoAssetType
644+ ])
645+ super ()._test_cases_render (bom , of , sv )
646+
647+ """
648+ @ddt
649+ class TestEnum...(_EnumTestCase):
650+
651+ @idata(set(chain(
652+ dp_cases_from_xml_schemas(f"./{SCHEMA_NS}simpleType[@name='...']"),
653+ dp_cases_from_json_schemas('definitions', '...'),
654+ )))
655+ def test_knows_value(self, value: str) -> None:
656+ super()._test_knows_value(..., value)
657+
658+ @named_data(*NAMED_OF_SV)
659+ def test_cases_render_valid(self, of: OutputFormat, sv: SchemaVersion, *_: Any, **__: Any) -> None:
660+ bom = _make_bom(
661+ components=[
662+ ...
663+ ])
664+ super()._test_cases_render(bom, of, sv)
665+
666+ """
601667
602668"""
603669missing:
0 commit comments