def by_feed(feed_slug, start, age): latest_query = ''' SELECT time FROM timeseries WHERE feed = ? AND time <= ? ORDER BY time DESC LIMIT 1; ''' entries_query = ''' SELECT feed, entry FROM timeseries WHERE feed = ? AND time > ? AND time <= ? ORDER BY time DESC; ''' with timeseries() as ts: arguments = (feed_slug, start.isoformat() + 'Z') try: (latest,), = ts.execute(latest_query, arguments) except ValueError: latest = start else: latest = datetime_from_iso(latest) arguments = (feed_slug, (latest - age).isoformat() + 'Z', latest.isoformat() + 'Z') yield from from_timeseries_cursor(ts.execute(entries_query, arguments))
def feed_stats(): query = """ SELECT feed, COUNT(*), MIN(time), MAX(time) FROM timeseries GROUP BY feed; """ stats = defaultdict(lambda: (0, None, None)) with timeseries() as ts: stats.update({ feed_slug: (count, datetime_from_iso(min_time), datetime_from_iso(max_time)) for feed_slug, count, min_time, max_time in ts.execute(query) }) return stats
def full_entry(feed_slug, entry_slug): feed_dir = join(STORAGE_ROOT, 'feeds', feed_slug) entry_dir = join(feed_dir, entry_slug) with open_file_from(feed_dir, 'feed.json', 'r') as feed_file, \ open_file_from(entry_dir, 'entry.json', 'r') as entry_file, \ open_file_from(entry_dir, 'entry.html', 'r') as entry_html: entry = json.load(entry_file) entry['published'] = datetime_from_iso(entry['published']) entry['feed'] = json.load(feed_file) entry['feed']['slug'] = feed_slug entry['body'] = entry_html.read() return entry
def date_from_entry_slug(entry_slug): if entry_slug[19] == '.': date_part = entry_slug[:26] else: date_part = entry_slug[:19] return datetime_from_iso(date_part + 'Z')