Skip to content

Commit

Permalink
Make .reader.update.interval minutes, not seconds. #332
Browse files Browse the repository at this point in the history
  • Loading branch information
lemon24 committed Jun 2, 2024
1 parent e0f3721 commit 9ad3bae
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 35 deletions.
7 changes: 4 additions & 3 deletions src/reader/_update.py
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,7 @@ class Config(TypedDict):
jitter: float


DEFAULT_CONFIG = Config(interval=3600, jitter=0)
DEFAULT_CONFIG = Config(interval=60, jitter=0)
CONFIG_KEY = 'update'


Expand All @@ -287,7 +287,7 @@ def flatten_config(config: Any, default: Config) -> Config:
)
return rv

set_number('interval', config, rv, int, min=60) # type: ignore
set_number('interval', config, rv, int, min=1) # type: ignore
set_number('jitter', config, rv, float, max=1) # type: ignore
return rv

Expand Down Expand Up @@ -323,8 +323,9 @@ def set_number(name, src, dst, type, min=0, max=float('inf')): # type: ignore


def next_update_after(now: datetime, interval: int, jitter: float = 0) -> datetime:
interval_s = interval * 60
now_s = (now.replace(tzinfo=None) - UPDATE_AFTER_START).total_seconds()
rv_s = int((now_s // interval + 1 + random.random() * jitter) * interval)
rv_s = int((now_s // interval_s + 1 + random.random() * jitter) * interval_s)
rv_s = rv_s // 60 * 60
rv = datetime.utcfromtimestamp(rv_s + EPOCH_OFFSET).replace(tzinfo=now.tzinfo)
return rv
Expand Down
66 changes: 34 additions & 32 deletions tests/test_reader.py
Original file line number Diff line number Diff line change
Expand Up @@ -896,14 +896,16 @@ def test_last_retrieved_update_after_basic(reader, action):


@pytest.mark.parametrize(
'global_config, feed_config',
'global_config, feed_config, expected',
[
({'interval': 7200}, Ellipsis),
(Ellipsis, {'interval': 7200}),
({'interval': 3600 * 24 * 1000}, {'interval': 7200}),
({'interval': 120}, Ellipsis, datetime(2010, 1, 1, 2)),
(Ellipsis, {'interval': 120}, datetime(2010, 1, 1, 2)),
({'interval': 60 * 24 * 1000}, {'interval': 120}, datetime(2010, 1, 1, 2)),
# minimum value
({'interval': 1}, Ellipsis, datetime(2010, 1, 1, 0, 1)),
],
)
def test_update_after_interval(reader, global_config, feed_config):
def test_update_after_interval(reader, global_config, feed_config, expected):
reader._parser = parser = Parser()
feed = parser.feed(1)
reader.add_feed(feed)
Expand All @@ -917,17 +919,17 @@ def test_update_after_interval(reader, global_config, feed_config):
reader.update_feeds()
feed = reader.get_feed(feed)

assert feed.update_after == datetime(2010, 1, 1, 2)
assert feed.update_after == expected


@pytest.mark.parametrize(
'global_config, feed_config',
[
({'interval': 3600 * 24, 'jitter': 1 / 12}, Ellipsis),
(Ellipsis, {'interval': 3600 * 24, 'jitter': 1 / 12}),
({'interval': 3600 * 24}, {'jitter': 1 / 12}),
({'jitter': 1 / 12}, {'interval': 3600 * 24}),
({'interval': 3600 * 24, 'jitter': 1}, {'jitter': 1 / 12}),
({'interval': 60 * 24, 'jitter': 1 / 12}, Ellipsis),
(Ellipsis, {'interval': 60 * 24, 'jitter': 1 / 12}),
({'interval': 60 * 24}, {'jitter': 1 / 12}),
({'jitter': 1 / 12}, {'interval': 60 * 24}),
({'interval': 60 * 24, 'jitter': 1}, {'jitter': 1 / 12}),
],
)
def test_update_after_jitter(reader, global_config, feed_config, monkeypatch):
Expand Down Expand Up @@ -960,7 +962,7 @@ def test_update_after_jitter(reader, global_config, feed_config, monkeypatch):
{'interval': '1.0', 'jitter': 'not-a-float'},
{'interval': 'inf', 'jitter': 'inf'},
{'interval': 0, 'jitter': 'nan'},
{'interval': 59, 'jitter': -1},
{'jitter': -1},
{'jitter': 100},
],
)
Expand All @@ -983,30 +985,30 @@ def test_update_after_invalid_config(reader, config, config_is_global):
'now, interval, jitter, random, expected',
[
# hours
(datetime(2010, 1, 1), 3600 * 8, 0, 0, datetime(2010, 1, 1, 8)),
(datetime(2010, 1, 1, 7, 59, 59), 3600 * 8, 0, 0, datetime(2010, 1, 1, 8)),
(datetime(2010, 1, 1, 8), 3600 * 8, 0, 0, datetime(2010, 1, 1, 16)),
(datetime(2010, 1, 1, 20), 3600 * 8, 0, 0, datetime(2010, 1, 2)),
(datetime(2010, 1, 1), 60 * 8, 0, 0, datetime(2010, 1, 1, 8)),
(datetime(2010, 1, 1, 7, 59, 59), 60 * 8, 0, 0, datetime(2010, 1, 1, 8)),
(datetime(2010, 1, 1, 8), 60 * 8, 0, 0, datetime(2010, 1, 1, 16)),
(datetime(2010, 1, 1, 20), 60 * 8, 0, 0, datetime(2010, 1, 2)),
# days
# if the interval is 7 days, the next value is a Monday
(datetime(2010, 1, 1), 3600 * 24 * 7, 0, 0, datetime(2010, 1, 4)),
(datetime(2010, 1, 3, 23, 59, 59), 3600 * 24 * 7, 0, 0, datetime(2010, 1, 4)),
(datetime(2010, 1, 4), 3600 * 24 * 7, 0, 0, datetime(2010, 1, 11)),
(datetime(2024, 5, 30), 3600 * 24 * 7, 0, 0, datetime(2024, 6, 3)),
(datetime(2010, 1, 1), 60 * 24 * 7, 0, 0, datetime(2010, 1, 4)),
(datetime(2010, 1, 3, 23, 59, 59), 60 * 24 * 7, 0, 0, datetime(2010, 1, 4)),
(datetime(2010, 1, 4), 60 * 24 * 7, 0, 0, datetime(2010, 1, 11)),
(datetime(2024, 5, 30), 60 * 24 * 7, 0, 0, datetime(2024, 6, 3)),
# otherwise, it's somewhat arbitrary (but next values are interval apart)
(datetime(2010, 1, 1), 3600 * 24 * 3, 0, 0, datetime(2010, 1, 2)),
(datetime(2010, 1, 1, 23), 3600 * 24 * 3, 0, 0, datetime(2010, 1, 2)),
(datetime(2010, 1, 2), 3600 * 24 * 3, 0, 0, datetime(2010, 1, 5)),
(datetime(2010, 1, 4, 23), 3600 * 24 * 3, 0, 0, datetime(2010, 1, 5)),
(datetime(2010, 1, 5), 3600 * 24 * 3, 0, 0, datetime(2010, 1, 8)),
(datetime(2010, 1, 1), 60 * 24 * 3, 0, 0, datetime(2010, 1, 2)),
(datetime(2010, 1, 1, 23), 60 * 24 * 3, 0, 0, datetime(2010, 1, 2)),
(datetime(2010, 1, 2), 60 * 24 * 3, 0, 0, datetime(2010, 1, 5)),
(datetime(2010, 1, 4, 23), 60 * 24 * 3, 0, 0, datetime(2010, 1, 5)),
(datetime(2010, 1, 5), 60 * 24 * 3, 0, 0, datetime(2010, 1, 8)),
# jitter
(datetime(2010, 1, 1), 3600 * 8, 1, 0, datetime(2010, 1, 1, 8)),
(datetime(2010, 1, 1), 3600 * 8, 1, 0.5, datetime(2010, 1, 1, 12)),
(datetime(2010, 1, 1), 3600 * 8, 1, 1, datetime(2010, 1, 1, 16)),
(datetime(2010, 1, 1), 3600 * 8, 0.5, 0.5, datetime(2010, 1, 1, 10)),
(datetime(2010, 1, 1), 3600 * 8, 0.5, 0.1, datetime(2010, 1, 1, 8, 24)),
(datetime(2010, 1, 1), 3600 * 8, 0.5, 0.12, datetime(2010, 1, 1, 8, 28)),
(datetime(2010, 1, 1), 3600 * 8, 0.5, 0.123, datetime(2010, 1, 1, 8, 29)),
(datetime(2010, 1, 1), 60 * 8, 1, 0, datetime(2010, 1, 1, 8)),
(datetime(2010, 1, 1), 60 * 8, 1, 0.5, datetime(2010, 1, 1, 12)),
(datetime(2010, 1, 1), 60 * 8, 1, 1, datetime(2010, 1, 1, 16)),
(datetime(2010, 1, 1), 60 * 8, 0.5, 0.5, datetime(2010, 1, 1, 10)),
(datetime(2010, 1, 1), 60 * 8, 0.5, 0.1, datetime(2010, 1, 1, 8, 24)),
(datetime(2010, 1, 1), 60 * 8, 0.5, 0.12, datetime(2010, 1, 1, 8, 28)),
(datetime(2010, 1, 1), 60 * 8, 0.5, 0.123, datetime(2010, 1, 1, 8, 29)),
],
)
def test_next_update_after(monkeypatch, now, interval, jitter, random, expected):
Expand Down

0 comments on commit 9ad3bae

Please sign in to comment.