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})')