Skip to content

Commit 01f581f

Browse files
authored
Workflow refactoring (#58)
* separate out etl processes * move naming logic into etl module * Move prompts * remove unused code from data * simplifications * robust testing * add app target to Makefile for running FastAPI application
1 parent 2b0883f commit 01f581f

17 files changed

+755
-686
lines changed

Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,5 +42,8 @@ off:
4242
sudo systemctl stop strava.service
4343
sudo systemctl stop nginx
4444

45+
app:
46+
fastapi run ./src/app/main.py
47+
4548
logs:
4649
journalctl -u strava.service -f -n 300

src/tasks/data.py

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,10 @@
11
import polyline
22
from stravalib.model import SummaryActivity
3-
from typing import Any
43
from shapely.geometry import Polygon
54

65
from src.database.models import Activity
76

87

9-
def process_activity(activity: SummaryActivity) -> dict[str, Any]:
10-
activity_dict = activity.model_dump()
11-
12-
# process columns
13-
if activity_dict["start_latlng"]:
14-
activity_dict["start_lat"] = activity_dict["start_latlng"][0]
15-
activity_dict["start_lng"] = activity_dict["start_latlng"][1]
16-
del activity_dict["start_latlng"]
17-
18-
if activity_dict["end_latlng"]:
19-
activity_dict["end_lat"] = activity_dict["end_latlng"][0]
20-
activity_dict["end_lng"] = activity_dict["end_latlng"][1]
21-
del activity_dict["end_latlng"]
22-
23-
activity_dict["date"] = activity_dict["start_date_local"].date()
24-
activity_dict["time"] = activity_dict["start_date_local"].time()
25-
activity_dict["day_of_week"] = activity_dict["start_date_local"].strftime("%A")
26-
activity_dict["moving_time_minutes"] = activity_dict["moving_time"] / 60
27-
activity_dict["distance_km"] = activity_dict["distance"] / 1000
28-
29-
try:
30-
activity_dict["pace_min_per_km"] = (
31-
1.0 * activity_dict["moving_time_minutes"] / activity_dict["distance_km"]
32-
)
33-
except ZeroDivisionError:
34-
activity_dict["pace_min_per_km"] = None
35-
36-
decoded = polyline.decode(activity_dict["map"]["summary_polyline"])
37-
if len(decoded) > 0:
38-
poly = Polygon(decoded)
39-
centroid = poly.centroid
40-
centroid_lat = centroid.x
41-
centroid_lon = centroid.y
42-
area = poly.area
43-
44-
activity_dict["map_centroid_lat"] = centroid_lat
45-
activity_dict["map_centroid_lon"] = centroid_lon
46-
activity_dict["map_area"] = area
47-
return activity_dict
48-
49-
508
def summary_activity_to_activity_model(summary_activity: SummaryActivity) -> Activity:
519
activity_dict = summary_activity.model_dump()
5210

src/tasks/etl.py

Lines changed: 0 additions & 272 deletions
This file was deleted.

src/tasks/etl/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from src.tasks.etl.auth_etl import AuthETL # noqa: F401
2+
from src.tasks.etl.single_activity_etl import SingleActivityETL # noqa: F401
3+
from src.tasks.etl.user_etl import UserETL # noqa: F401
4+
from src.tasks.etl.historic_activities_etl import ActivitiesETL # noqa: F401
5+
from src.tasks.etl.naming_etl import run_name_activity_etl # noqa: F401

src/tasks/etl/auth_etl.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import uuid
2+
3+
from stravalib import Client
4+
5+
from src.app.config import Settings
6+
from src.database.models import Auth
7+
from src.tasks.etl.base import ETL
8+
9+
10+
class AuthETL(ETL):
11+
def __init__(self, code: str, scope: str, settings: Settings):
12+
super().__init__(settings=settings)
13+
self.code = code
14+
self.scope = scope
15+
16+
def extract(self):
17+
client = Client()
18+
self._token_response = client.exchange_code_for_token(
19+
client_id=self.settings.strava_client_id,
20+
client_secret=self.settings.strava_client_secret,
21+
code=self.code,
22+
)
23+
24+
def load(self):
25+
auth = Auth(
26+
uuid=uuid.uuid4(),
27+
access_token=self._token_response["access_token"],
28+
refresh_token=self._token_response["refresh_token"],
29+
expires_at=self._token_response["expires_at"],
30+
scope=self.scope,
31+
)
32+
self.db.add_auth(auth)
33+
return auth.uuid

0 commit comments

Comments
 (0)