Skip to content

Commit b4905f6

Browse files
author
Ilya Lityuga
committed
✨Add daily forecast data API endpoint
1 parent 6eac381 commit b4905f6

3 files changed

Lines changed: 84 additions & 33 deletions

File tree

app.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@
66
import starlette.status as status
77
from immanuel import charts
88
from immanuel.const import chart, names
9-
from utils import retrograde_periods, weekly_forecast_data, yearly_forecast_data
9+
from utils import (
10+
retrograde_periods,
11+
daily_forecast_data,
12+
weekly_forecast_data,
13+
yearly_forecast_data,
14+
)
1015

1116
tags_metadata = [
1217
{
@@ -17,6 +22,10 @@
1722
"name": "retrograde_calendar",
1823
"description": "Retrograde calendar for a given year",
1924
},
25+
{
26+
"name": "get_daily_forecast_data",
27+
"description": "Get daily forecast data - planet positions, major aspects, moon phase etc - for a given date",
28+
},
2029
{
2130
"name": "get_weekly_forecast_data",
2231
"description": "Get weekly forecast data - planet positions, major aspects, retrograde etc - for a given date",
@@ -427,6 +436,22 @@ def solar_returns(year: int, month: int, day: int, hour: int, lat: float, lon: f
427436
return charts.SolarReturns(native)
428437

429438

439+
@app.get("/get_daily_forecast_data", tags=["get_daily_forecast_data"])
440+
def get_daily_forecast_data(
441+
start_date: Annotated[
442+
date,
443+
Query(
444+
title="date",
445+
description="Input date for the forecast",
446+
examples=[date.today()],
447+
),
448+
],
449+
):
450+
datetime_obj = datetime.combine(start_date, time.min)
451+
dfd = daily_forecast_data(datetime_obj)
452+
return {"success": 1, "data": dfd}
453+
454+
430455
@app.get("/get_weekly_forecast_data", tags=["get_weekly_forecast_data"])
431456
def get_weekly_forecast_data(
432457
start_date: Annotated[

test_app.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,25 @@ def test_retrograde_calendar():
2424
assert response.status_code == 200
2525
assert response_json["success"] == 1
2626
assert response_json["data"][0]["planet"] == "Mercury"
27-
assert len(response_json["data"][0]["periods"]) == 6
27+
assert len(response_json["data"][0]["periods"]) == 7
28+
29+
30+
def test_get_daily_forecast_data():
31+
response = client.get(
32+
"/get_daily_forecast_data?start_date=2024-03-19",
33+
headers={"X-Token": "coneofsilence"},
34+
)
35+
response_json = response.json()
36+
assert response.status_code == 200
37+
assert response_json["success"] == 1
38+
assert len(response_json["data"]) == 3
39+
assert len(response_json["data"]["planets"]) == 8
40+
assert "moon_phase" in response_json["data"]
41+
assert "planets" in response_json["data"]
42+
assert "aspects" in response_json["data"]
43+
assert "sign" in response_json["data"]["planets"]["Mercury"]
44+
assert "house" in response_json["data"]["planets"]["Mercury"]
45+
assert "movement" in response_json["data"]["planets"]["Mercury"]
2846

2947

3048
def test_get_weekly_forecast_data():
@@ -48,6 +66,6 @@ def test_get_yearly_forecast_data():
4866
assert response.status_code == 200
4967
assert response_json["success"] == 1
5068
assert len(response_json["data"]) == 8
51-
assert len(response_json["data"]["Mercury"]) == 2
69+
assert len(response_json["data"]["Mercury"]) == 3
5270
assert "sign" in response_json["data"]["Mercury"]
5371
assert "movement" in response_json["data"]["Mercury"]

utils.py

Lines changed: 38 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,11 @@ def retrograde_periods(n, lat, lon):
8888
return retro_table
8989

9090

91+
def daily_forecast_data(start_date):
92+
settings.set({"objects": planets})
93+
return day_forecast(start_date)
94+
95+
9196
def weekly_forecast_data(start_date):
9297
settings.set({"objects": planets})
9398

@@ -96,41 +101,44 @@ def weekly_forecast_data(start_date):
96101

97102
for i in range(7): # for each day of week
98103
date = start_date + timedelta(days=i)
104+
weekly_data[date.strftime("%Y-%m-%d")] = day_forecast(date)
99105

100-
native = charts.Subject(date_time=date, latitude=0.0, longitude=0.0)
101-
natal = charts.Natal(native)
106+
return weekly_data
102107

103-
planet_positions = {}
104-
for object in natal.objects.values():
105-
planet_positions[object.name] = {
106-
"sign": object.sign.name,
107-
"house": object.house.number,
108-
"movement": object.movement.formatted,
109-
}
110-
111-
planet_aspects = []
112-
aspects_set = set()
113-
for index, aspects in natal.aspects.items():
114-
for aspect in aspects.values():
115-
aspect_key = aspect._active_name + " " + aspect._passive_name
116-
if aspect_key not in aspects_set:
117-
planet_aspects.append(
118-
{
119-
"active": aspect._active_name,
120-
"passive": aspect._passive_name,
121-
"aspect": aspect.aspect,
122-
"type": aspect.type,
123-
}
124-
)
125-
aspects_set.add(aspect_key)
126108

127-
weekly_data[date.strftime("%Y-%m-%d")] = {
128-
"moon_phase": natal.moon_phase.formatted,
129-
"planets": planet_positions,
130-
"aspects": planet_aspects,
109+
def day_forecast(date):
110+
native = charts.Subject(date_time=date, latitude=0.0, longitude=0.0)
111+
natal = charts.Natal(native)
112+
113+
planet_positions = {}
114+
for object in natal.objects.values():
115+
planet_positions[object.name] = {
116+
"sign": object.sign.name,
117+
"house": object.house.number,
118+
"movement": object.movement.formatted,
131119
}
132120

133-
return weekly_data
121+
planet_aspects = []
122+
aspects_set = set()
123+
for index, aspects in natal.aspects.items():
124+
for aspect in aspects.values():
125+
aspect_key = aspect._active_name + " " + aspect._passive_name
126+
if aspect_key not in aspects_set:
127+
planet_aspects.append(
128+
{
129+
"active": aspect._active_name,
130+
"passive": aspect._passive_name,
131+
"aspect": aspect.aspect,
132+
"type": aspect.type,
133+
}
134+
)
135+
aspects_set.add(aspect_key)
136+
137+
return {
138+
"moon_phase": natal.moon_phase.formatted,
139+
"planets": planet_positions,
140+
"aspects": planet_aspects,
141+
}
134142

135143

136144
def yearly_forecast_data(start_date):

0 commit comments

Comments
 (0)