Coverage for turvallisuusneuvonta/csaf/csaf.py: 73.68%

17 statements  

« prev     ^ index     » next       coverage.py v7.0.3, created at 2023-01-07 19:14 +0100

1"""CSAF Document model.""" 

2from __future__ import annotations 

3 

4from typing import Annotated, List, Optional, no_type_check 

5 

6from pydantic import BaseModel, Field, validator 

7 

8from turvallisuusneuvonta.csaf.document import Document 

9from turvallisuusneuvonta.csaf.product import ProductTree 

10from turvallisuusneuvonta.csaf.vulnerability import Vulnerability 

11 

12 

13class CSAF(BaseModel): 

14 """ 

15 Representation of security advisory information as a JSON document. 

16 """ 

17 

18 document: Annotated[ 

19 Document, 

20 Field( 

21 description='Captures the meta-data about this document describing a particular set of' 

22 ' security advisories.', 

23 title='Document level meta-data', 

24 ), 

25 ] 

26 product_tree: Annotated[ 

27 Optional[ProductTree], 

28 Field( 

29 description='Is a container for all fully qualified product names that can be referenced elsewhere' 

30 ' in the document.', 

31 title='Product tree', 

32 ), 

33 ] 

34 vulnerabilities: Annotated[ 

35 Optional[List[Vulnerability]], 

36 Field( 

37 description='Represents a list of all relevant vulnerability information items.', 

38 min_items=1, 

39 title='Vulnerabilities', 

40 ), 

41 ] 

42 

43 @no_type_check 

44 @validator('vulnerabilities') 

45 @classmethod 

46 def check_len(cls, v): 

47 if not v: 

48 raise ValueError('vulnerabilities present but empty') 

49 return v