Skip to content

Commit da8f6b6

Browse files
committed
Implement Google Sheets persister prototype (#213)
1 parent 12c9f9f commit da8f6b6

File tree

3 files changed

+81
-16
lines changed

3 files changed

+81
-16
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,3 +193,4 @@ burr/tracking/server/build
193193
examples/*/statemachine
194194
examples/*/*/statemachine
195195
.vscode
196+
google_creds.json
Lines changed: 65 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,78 @@
11
import json
2-
from burr.core.persistence import BaseStatePersister
2+
from burr.core import persistence
3+
from googleapiclient.discovery import build
4+
from google.oauth2.service_account import Credentials
35

4-
5-
class GoogleSheetsPersister(BaseStatePersister):
6+
class GoogleSheetsPersister(persistence.BaseStatePersister):
67
"""
78
Persister that stores Burr state in Google Sheets.
89
"""
910

10-
def __init__(self, spreadsheet_id):
11+
def __init__(self, spreadsheet_id: str, credentials_file: str):
1112
self.spreadsheet_id = spreadsheet_id
13+
scopes = ["https://www.googleapis.com/auth/spreadsheets"]
14+
creds = Credentials.from_service_account_file(
15+
credentials_file,
16+
scopes=scopes)
17+
self.service = build("sheets", "v4", credentials=creds)
1218

19+
20+
1321
def save(self, app_id: str, partition_key: str, state: dict):
14-
"""
15-
Save state to Google Sheets
16-
"""
17-
print("Saving state to Google Sheets")
22+
state_json = json.dumps(state)
23+
24+
values = [[app_id, partition_key, state_json]]
25+
body = {"values": values}
26+
27+
self.service.spreadsheets().values().append(
28+
spreadsheetId=self.spreadsheet_id,
29+
range="states!A:C",
30+
valueInputOption="RAW",
31+
body=body).execute()
32+
33+
1834

1935
def load(self, app_id: str, partition_key: str):
20-
"""
21-
Load state from Google Sheets
22-
"""
23-
print("Loading state from Google Sheets")
36+
result = self.service.spreadsheets().values().get(
37+
spreadsheetId=self.spreadsheet_id,
38+
range="states!A:C").execute()
39+
40+
rows = result.get("values", [])
41+
42+
for row in rows:
43+
if len(row) >= 3 and row[0] == app_id and row[1] == partition_key:
44+
return json.loads(row[2])
45+
46+
return None
47+
48+
2449

2550
def list(self, app_id: str):
26-
"""
27-
List partitions
28-
"""
29-
return []
51+
result = self.service.spreadsheets().values().get(
52+
spreadsheetId=self.spreadsheet_id,
53+
range="states!A:C").execute()
54+
55+
rows = result.get("values", [])
56+
partition_keys = []
57+
58+
for row in rows:
59+
if len(row) >= 2 and row[0] == app_id:
60+
partition_keys.append(row[1])
61+
62+
return partition_keys
63+
64+
65+
66+
def list_app_ids(self):
67+
result = self.service.spreadsheets().values().get(
68+
spreadsheetId=self.spreadsheet_id,
69+
range="states!A:C").execute()
70+
71+
rows = result.get("values", [])
72+
app_ids = []
73+
74+
for row in rows[1:]:
75+
if len(row) >= 1 and row[0] not in app_ids:
76+
app_ids.append(row[0])
77+
78+
return app_ids

test_sheets.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from burr.integrations.persisters.b_google_sheets import GoogleSheetsPersister
2+
3+
persister = GoogleSheetsPersister(
4+
spreadsheet_id="1ur4GqM0tQQyCRn3lAj5bZk3DAeZBvrbYRwKok780hHc",
5+
credentials_file="google_creds.json"
6+
)
7+
8+
# Save some data
9+
persister.save("demo_app", "user1", {"hello": "world"})
10+
11+
# Load the data
12+
data = persister.load("demo_app", "user1")
13+
14+
print("Loaded data:", data)
15+
print("App IDs:", persister.list_app_ids())

0 commit comments

Comments
 (0)