-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcharts.py
More file actions
285 lines (215 loc) · 9.02 KB
/
charts.py
File metadata and controls
285 lines (215 loc) · 9.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
"""Charts category client for chart calculations."""
from __future__ import annotations
from astroapi.categories.base import BaseCategoryClient
from astroapi.types.requests import (
CompositeChartRequest,
DirectionRequest,
LunarReturnRequest,
NatalChartRequest,
NatalTransitsRequest,
ProgressionRequest,
SolarReturnRequest,
SynastryChartRequest,
TransitChartRequest,
VenusReturnRequest,
)
from astroapi.types.responses import (
CompositeChartResponse,
DirectionResponse,
GenericResponse,
NatalChartResponse,
ProgressionResponse,
ReturnChartResponse,
SynastryChartResponse,
TransitChartResponse,
)
from astroapi.utils.validators import validate_datetime_location, validate_subject
class ChartsClient(BaseCategoryClient):
"""Client for chart calculation endpoints.
Provides access to natal, synastry, composite, transit, return,
progression, and direction charts.
"""
API_PREFIX = "/api/v3/charts"
def get_natal_chart(self, request: NatalChartRequest) -> NatalChartResponse:
"""Calculate natal chart for a subject.
Args:
request: Natal chart request parameters
Returns:
Natal chart response
Raises:
AstrologyError: If validation fails or API request fails
"""
validate_subject(request.subject)
url = self._build_url("natal")
data = self._http.post(url, json=request.model_dump(exclude_none=True))
return NatalChartResponse(**data)
def get_synastry_chart(self, request: SynastryChartRequest) -> SynastryChartResponse:
"""Calculate synastry chart for two subjects.
Args:
request: Synastry chart request parameters
Returns:
Synastry chart response
Raises:
AstrologyError: If validation fails or API request fails
"""
validate_subject(request.subject1)
validate_subject(request.subject2)
url = self._build_url("synastry")
data = self._http.post(url, json=request.model_dump(exclude_none=True))
return SynastryChartResponse(**data)
def get_composite_chart(self, request: CompositeChartRequest) -> CompositeChartResponse:
"""Calculate composite chart for two subjects.
Args:
request: Composite chart request parameters
Returns:
Composite chart response
Raises:
AstrologyError: If validation fails or API request fails
"""
validate_subject(request.subject1)
validate_subject(request.subject2)
url = self._build_url("composite")
data = self._http.post(url, json=request.model_dump(exclude_none=True))
return CompositeChartResponse(**data)
def get_transit_chart(self, request: TransitChartRequest) -> TransitChartResponse:
"""Calculate transit chart.
Args:
request: Transit chart request parameters
Returns:
Transit chart response
Raises:
AstrologyError: If validation fails or API request fails
"""
validate_subject(request.natal_subject)
validate_datetime_location(request.transit_datetime)
url = self._build_url("transit")
data = self._http.post(url, json=request.model_dump(exclude_none=True))
return TransitChartResponse(**data)
def get_solar_return(self, request: SolarReturnRequest) -> ReturnChartResponse:
"""Calculate solar return chart.
Args:
request: Solar return request parameters
Returns:
Solar return chart response
Raises:
AstrologyError: If validation fails or API request fails
"""
validate_subject(request.subject)
if request.return_location:
validate_datetime_location(request.return_location)
url = self._build_url("returns", "solar")
data = self._http.post(url, json=request.model_dump(exclude_none=True))
return ReturnChartResponse(**data)
def get_lunar_return(self, request: LunarReturnRequest) -> ReturnChartResponse:
"""Calculate lunar return chart.
Args:
request: Lunar return request parameters
Returns:
Lunar return chart response
Raises:
AstrologyError: If validation fails or API request fails
"""
validate_subject(request.subject)
if request.return_location:
validate_datetime_location(request.return_location)
url = self._build_url("returns", "lunar")
data = self._http.post(url, json=request.model_dump(exclude_none=True))
return ReturnChartResponse(**data)
def get_progression(self, request: ProgressionRequest) -> ProgressionResponse:
"""Calculate progression chart.
Args:
request: Progression request parameters
Returns:
Progression chart response
Raises:
AstrologyError: If validation fails or API request fails
"""
validate_subject(request.subject)
if request.location:
validate_datetime_location(request.location)
url = self._build_url("progressions")
data = self._http.post(url, json=request.model_dump(exclude_none=True))
return ProgressionResponse(**data)
def get_secondary_progression(self, request: ProgressionRequest) -> ProgressionResponse:
"""Calculate secondary progression chart.
Args:
request: Progression request parameters
Returns:
Secondary progression response
Raises:
AstrologyError: If validation fails or API request fails
"""
validate_subject(request.subject)
if request.location:
validate_datetime_location(request.location)
url = self._build_url("progressions", "secondary")
data = self._http.post(url, json=request.model_dump(exclude_none=True))
return ProgressionResponse(**data)
def get_solar_arc_progression(self, request: ProgressionRequest) -> ProgressionResponse:
"""Calculate solar arc progression chart.
Args:
request: Progression request parameters
Returns:
Solar arc progression response
Raises:
AstrologyError: If validation fails or API request fails
"""
validate_subject(request.subject)
if request.location:
validate_datetime_location(request.location)
url = self._build_url("progressions", "solar-arc")
data = self._http.post(url, json=request.model_dump(exclude_none=True))
return ProgressionResponse(**data)
def get_direction(self, request: DirectionRequest) -> DirectionResponse:
"""Calculate direction chart.
Args:
request: Direction request parameters
Returns:
Direction chart response
Raises:
AstrologyError: If validation fails or API request fails
"""
validate_subject(request.subject)
url = self._build_url("directions")
data = self._http.post(url, json=request.model_dump(exclude_none=True))
return DirectionResponse(**data)
def get_primary_direction(self, request: DirectionRequest) -> DirectionResponse:
"""Calculate primary direction chart.
Args:
request: Direction request parameters
Returns:
Primary direction response
Raises:
AstrologyError: If validation fails or API request fails
"""
validate_subject(request.subject)
url = self._build_url("directions", "primary")
data = self._http.post(url, json=request.model_dump(exclude_none=True))
return DirectionResponse(**data)
def get_symbolic_direction(self, request: DirectionRequest) -> DirectionResponse:
"""Calculate symbolic direction chart.
Args:
request: Direction request parameters
Returns:
Symbolic direction response
Raises:
AstrologyError: If validation fails or API request fails
"""
validate_subject(request.subject)
url = self._build_url("directions", "symbolic")
data = self._http.post(url, json=request.model_dump(exclude_none=True))
return DirectionResponse(**data)
def get_venus_return(self, request: VenusReturnRequest) -> ReturnChartResponse:
"""Calculate Venus return chart."""
validate_subject(request.subject)
if request.return_location:
validate_datetime_location(request.return_location)
url = self._build_url("returns", "venus")
data = self._http.post(url, json=request.model_dump(exclude_none=True))
return ReturnChartResponse(**data)
def get_natal_transits(self, request: NatalTransitsRequest) -> GenericResponse:
"""Get natal transit period analysis."""
validate_subject(request.natal_subject)
url = self._build_url("natal-transits")
data = self._http.post(url, json=request.model_dump(exclude_none=True))
return GenericResponse(**data)