11import 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
0 commit comments