this repo has no description
1from datetime import datetime, timezone, timedelta 2 3class BaseFeed: 4 def process_commit(self, commit): 5 raise NotImplementedError 6 7 def serve_feed(self, limit, offset, langs): 8 raise NotImplementedError 9 10 def commit_changes(self): 11 raise NotImplementedError 12 13 def parse_timestamp(self, timestamp): 14 # https://atproto.com/specs/lexicon#datetime 15 formats = { 16 # preferred 17 '1985-04-12T23:20:50.123Z': '%Y-%m-%dT%H:%M:%S.%f%z', 18 # '1985-04-12T23:20:50.123456Z': '%Y-%m-%dT%H:%M:%S.%f%z', 19 # '1985-04-12T23:20:50.120Z': '%Y-%m-%dT%H:%M:%S.%f%z', 20 # '1985-04-12T23:20:50.120000Z': '%Y-%m-%dT%H:%M:%S.%f%z', 21 22 # supported 23 # '1985-04-12T23:20:50.12345678912345Z': '', 24 '1985-04-12T23:20:50Z': '%Y-%m-%dT%H:%M:%S%z', 25 # '1985-04-12T23:20:50.0Z': '%Y-%m-%dT%H:%M:%S.%f%z', 26 # '1985-04-12T23:20:50.123+00:00': '%Y-%m-%dT%H:%M:%S.%f%z', 27 # '1985-04-12T23:20:50.123-07:00': '%Y-%m-%dT%H:%M:%S.%f%z', 28 } 29 30 for format in formats.values(): 31 try: 32 ts = datetime.strptime(timestamp, format) 33 except ValueError: 34 continue 35 else: 36 return ts 37 38 return datetime.now(timezone.utc) 39 40 def safe_timestamp(self, timestamp): 41 parsed = self.parse_timestamp(timestamp) 42 utc_now = datetime.now(timezone.utc) 43 if parsed.timestamp() <= 0: 44 return utc_now 45 elif parsed - timedelta(minutes=2) < utc_now: 46 return parsed 47 elif parsed > utc_now: 48 return utc_now 49 50 def transaction_begin(self, db): 51 if not db.in_transaction: 52 db.execute('BEGIN') 53 54 def transaction_commit(self, db): 55 if db.in_transaction: 56 db.execute('COMMIT') 57 58 def wal_checkpoint(self, db, mode='PASSIVE'): 59 db.pragma(f'wal_checkpoint({mode})')