Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/sigstore_models/_core.py: 65%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

37 statements  

1from __future__ import annotations 

2 

3import base64 

4import typing as t 

5 

6import typing_extensions as te 

7from pydantic import BaseModel, BeforeValidator, ConfigDict, PlainSerializer 

8from pydantic.alias_generators import to_camel 

9 

10 

11class Base(BaseModel): 

12 model_config = ConfigDict( 

13 alias_generator=to_camel, 

14 strict=True, 

15 extra="forbid", 

16 validate_by_name=True, 

17 validate_by_alias=True, 

18 ) 

19 

20 @classmethod 

21 def from_json(cls, json: str | bytes) -> te.Self: 

22 return cls.model_validate_json(json) 

23 

24 @classmethod 

25 def from_dict(cls, data: dict) -> te.Self: 

26 return cls.model_validate(data) 

27 

28 def to_json(self) -> str: 

29 return self.model_dump_json( 

30 exclude_none=True, 

31 exclude_unset=True, 

32 by_alias=True, 

33 ) 

34 

35 def to_dict(self) -> dict: 

36 return self.model_dump( 

37 mode="json", exclude_none=True, exclude_unset=True, by_alias=True 

38 ) 

39 

40 

41def _validate_proto_u64(value: object) -> int: 

42 if not isinstance(value, str): 

43 raise ValueError( 

44 f"Expected protobuf uint64 as string, got {type(value).__name__}" 

45 ) 

46 

47 n = int(value) 

48 if n < 0 or n > 2**64 - 1: 

49 raise ValueError(f"Value exceeds uint64 domain: {value}") 

50 

51 return n 

52 

53 

54def _serialize_proto_u64(value: int) -> str: 

55 if value < 0 or value > 2**64 - 1: 

56 raise ValueError(f"Value exceeds uint64 domain: {value}") 

57 

58 return str(value) 

59 

60 

61ProtoU64 = t.Annotated[ 

62 int, 

63 BeforeValidator(_validate_proto_u64), 

64 PlainSerializer(_serialize_proto_u64, return_type=str), 

65] 

66 

67 

68def _validate_proto_bytes(value: object) -> bytes: 

69 if not isinstance(value, (bytes, str)): 

70 raise ValueError( 

71 f"Expected protobuf bytes as string or bytes, got {type(value).__name__}" 

72 ) 

73 

74 return base64.b64decode(value) 

75 

76 

77def _serialize_proto_bytes(value: bytes) -> bytes: 

78 return base64.b64encode(value) 

79 

80 

81ProtoBytes = t.Annotated[ 

82 bytes, 

83 BeforeValidator(_validate_proto_bytes), 

84 PlainSerializer(_serialize_proto_bytes, return_type=bytes), 

85]