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
« prev ^ index » next coverage.py v7.6.0, created at 2024-07-28 10:12 -0400
1"""Pydantic models needed throughout the project."""
3from typing import List, Optional
4import pydantic
7class Sources(pydantic.BaseModel):
8 """Overture sources model."""
10 property: str
11 dataset: str
12 record_id: Optional[str] = None
13 confidence: float = pydantic.Field(default=0.0)
16class Names(pydantic.BaseModel):
17 """Overture names model."""
19 primary: str
20 common: Optional[str]
21 rules: Optional[str]
24class Addresses(pydantic.BaseModel):
25 """Overture addresses model."""
27 freeform: Optional[str]
28 locality: Optional[str]
29 postcode: Optional[str]
30 region: Optional[str]
31 country: Optional[str]
34class Categories(pydantic.BaseModel):
35 """Overture categories model."""
37 main: str
38 alternate: Optional[List[str]]
41class Brand(pydantic.BaseModel):
42 """Overture brand model."""
44 wikidata: Optional[str]
45 names: Names
48class PlaceProps(pydantic.BaseModel):
49 """Overture properties model."""
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]
65class ConfidenceError(Exception):
66 """
67 Confidence error exception.
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.
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 """
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)
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}"""
96class UnmatchedError(Exception):
97 """
98 Unmatched category error.
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.
105 Attributes:
106 category (str): The Overture category that is unmatched.
107 message (str): The error message.
108 """
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)
120 def __str__(self) -> str:
121 """@private"""
122 return f"{self.message} { category={self.category}} "
125class BuildingProps(pydantic.BaseModel):
126 """Overture building properties."""
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