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 serve_wildcard_feed(self, feed_uri, limit, offset, langs): 11 raise NotImplementedError 12 13 def commit_changes(self): 14 raise NotImplementedError 15 16 def parse_timestamp(self, timestamp): 17 # https://atproto.com/specs/lexicon#datetime 18 formats = { 19 # preferred 20 '1985-04-12T23:20:50.123Z': '%Y-%m-%dT%H:%M:%S.%f%z', 21 # '1985-04-12T23:20:50.123456Z': '%Y-%m-%dT%H:%M:%S.%f%z', 22 # '1985-04-12T23:20:50.120Z': '%Y-%m-%dT%H:%M:%S.%f%z', 23 # '1985-04-12T23:20:50.120000Z': '%Y-%m-%dT%H:%M:%S.%f%z', 24 25 # supported 26 # '1985-04-12T23:20:50.12345678912345Z': '', 27 '1985-04-12T23:20:50Z': '%Y-%m-%dT%H:%M:%S%z', 28 # '1985-04-12T23:20:50.0Z': '%Y-%m-%dT%H:%M:%S.%f%z', 29 # '1985-04-12T23:20:50.123+00:00': '%Y-%m-%dT%H:%M:%S.%f%z', 30 # '1985-04-12T23:20:50.123-07:00': '%Y-%m-%dT%H:%M:%S.%f%z', 31 } 32 33 for format in formats.values(): 34 try: 35 ts = datetime.strptime(timestamp, format) 36 except ValueError: 37 continue 38 else: 39 return ts 40 41 return datetime.now(timezone.utc) 42 43 def safe_timestamp(self, timestamp): 44 utc_now = datetime.now(timezone.utc) 45 if timestamp is None: 46 return utc_now 47 48 parsed = self.parse_timestamp(timestamp) 49 if parsed.timestamp() <= 0: 50 return utc_now 51 elif parsed - timedelta(minutes=2) < utc_now: 52 return parsed 53 elif parsed > utc_now: 54 return utc_now 55 56 def transaction_begin(self, db): 57 if not db.in_transaction: 58 db.execute('BEGIN') 59 60 def transaction_commit(self, db): 61 if db.in_transaction: 62 db.execute('COMMIT') 63 64 def wal_checkpoint(self, db, mode='PASSIVE'): 65 return db.execute(f'PRAGMA wal_checkpoint({mode})')