Coverage for src/overturetoosm/objects.py: 96%

71 statements  

« prev     ^ index     » next       coverage.py v7.6.0, created at 2024-07-28 10:12 -0400

1"""Pydantic models needed throughout the project.""" 

2 

3from typing import List, Optional 

4import pydantic 

5 

6 

7class Sources(pydantic.BaseModel): 

8 """Overture sources model.""" 

9 

10 property: str 

11 dataset: str 

12 record_id: Optional[str] = None 

13 confidence: float = pydantic.Field(default=0.0) 

14 

15 

16class Names(pydantic.BaseModel): 

17 """Overture names model.""" 

18 

19 primary: str 

20 common: Optional[str] 

21 rules: Optional[str] 

22 

23 

24class Addresses(pydantic.BaseModel): 

25 """Overture addresses model.""" 

26 

27 freeform: Optional[str] 

28 locality: Optional[str] 

29 postcode: Optional[str] 

30 region: Optional[str] 

31 country: Optional[str] 

32 

33 

34class Categories(pydantic.BaseModel): 

35 """Overture categories model.""" 

36 

37 main: str 

38 alternate: Optional[List[str]] 

39 

40 

41class Brand(pydantic.BaseModel): 

42 """Overture brand model.""" 

43 

44 wikidata: Optional[str] 

45 names: Names 

46 

47 

48class PlaceProps(pydantic.BaseModel): 

49 """Overture properties model.""" 

50 

51 id: str 

52 version: int 

53 update_time: str 

54 sources: List[Sources] 

55 names: Names 

56 brand: Optional[Brand] = None 

57 categories: Optional[Categories] = None 

58 confidence: float = pydantic.Field(ge=0.0, le=1.0) 

59 websites: Optional[List[str]] = None 

60 socials: Optional[List[str]] = None 

61 phones: Optional[List[str]] = None 

62 addresses: List[Addresses] 

63 

64 

65class ConfidenceError(Exception): 

66 """ 

67 Confidence error exception. 

68 

69 This exception is raised when the confidence level of an item is too low. 

70 It contains the original confidence level and the confidence level of the item. 

71 

72 Attributes: 

73 confidence_level (float): The set confidence level. 

74 confidence_item (float): The confidence of the item. 

75 message (str): The error message. 

76 """ 

77 

78 def __init__( 

79 self, 

80 confidence_level: float, 

81 confidence_item: float, 

82 message: str = "Confidence in this item is too low.", 

83 ) -> None: 

84 """@private""" 

85 self.confidence_level = confidence_level 

86 self.confidence_item = confidence_item 

87 self.message = message 

88 super().__init__(message) 

89 

90 def __str__(self) -> str: 

91 """@private""" 

92 conf = f"confidence_level={self.confidence_level}, confidence_item={self.confidence_item}" 

93 return f"""{self.message} {conf}""" 

94 

95 

96class UnmatchedError(Exception): 

97 """ 

98 Unmatched category error. 

99 

100 This exception is raised when an item's Overture category does not have a 

101 corresponding OSM definition. Edit 

102 [the OSM Wiki page](https://wiki.openstreetmap.org/wiki/Overture_categories) 

103 to add a definition to this category. 

104 

105 Attributes: 

106 category (str): The Overture category that is unmatched. 

107 message (str): The error message. 

108 """ 

109 

110 def __init__( 

111 self, 

112 category: str, 

113 message: str = "Overture category is unmatched.", 

114 ) -> None: 

115 """@private""" 

116 self.category = category 

117 self.message = message 

118 super().__init__(message) 

119 

120 def __str__(self) -> str: 

121 """@private""" 

122 return f"{self.message} { category={self.category}} " 

123 

124 

125class BuildingProps(pydantic.BaseModel): 

126 """Overture building properties.""" 

127 

128 version: int 

129 class_: str = pydantic.Field(alias="class") 

130 subtype: str 

131 sources: List[Sources] 

132 height: Optional[float] = None 

133 is_underground: Optional[bool] = None 

134 num_floors: Optional[int] = None 

135 num_floors_underground: Optional[int] = None 

136 min_height: Optional[float] = None 

137 min_floor: Optional[int] = None 

138 facade_color: Optional[str] = None 

139 facade_material: Optional[str] = None 

140 roof_material: Optional[str] = None 

141 roof_shape: Optional[str] = None 

142 roof_direction: Optional[str] = None 

143 roof_orientation: Optional[str] = None 

144 roof_color: Optional[str] = None 

145 roof_height: Optional[float] = None