def test_flood_negative_gap_differing_data(): events = [ Event(timestamp=now, duration=5, data={"a": 0}), Event(timestamp=now, duration=100, data={"b": 1}), ] flooded = flood(events) assert flooded == events
def test_flood_negative_gap_differing_data(): events = [ Event(timestamp=now, duration=5, data={"a": 0}), Event(timestamp=now, duration=100, data={"b": 1}), ] flooded = flood(events) assert flooded == events
def test_flood_backward(): events = [ Event(timestamp=now, duration=5, data={"a": 0}), Event(timestamp=now + 10 * td1s, duration=10, data={"b": 1}), ] flooded = flood(events) assert (flooded[0].timestamp + flooded[0].duration) - flooded[1].timestamp == timedelta(0)
def test_flood_forward(): events = [ Event(timestamp=now, duration=10, data={"a": 0}), Event(timestamp=now + 15 * td1s, duration=5, data={"b": 1}), ] flooded = flood(events) assert (flooded[0].timestamp + flooded[0].duration) - flooded[1].timestamp == timedelta(0)
def test_flood_negative_small_gap_differing_data(): events = [ Event(timestamp=now, duration=100, data={"b": 1}), Event(timestamp=now + 99.99 * td1s, duration=100, data={"a": 0}), ] flooded = flood(events) duration = sum((e.duration for e in flooded), timedelta(0)) assert duration == timedelta(seconds=100 + 99.99)
def test_flood_backward_merge(): events = [ Event(timestamp=now, duration=5), Event(timestamp=now + 10 * td1s, duration=10), ] flooded = flood(events) assert len(flooded) == 1 assert flooded[0].duration == timedelta(seconds=20)
def test_flood_negative_small_gap_differing_data(): events = [ Event(timestamp=now, duration=100, data={"b": 1}), Event(timestamp=now + 99.99 * td1s, duration=100, data={"a": 0}), ] flooded = flood(events) duration = sum((e.duration for e in flooded), timedelta(0)) assert duration == timedelta(seconds=100 + 99.99)
def test_flood_backward_merge(): events = [ Event(timestamp=now, duration=5), Event(timestamp=now + 10 * td1s, duration=10), ] flooded = flood(events) assert len(flooded) == 1 assert flooded[0].duration == timedelta(seconds=20)
def test_flood_negative_gap_same_data(): events = [ Event(timestamp=now, duration=100, data={"a": 0}), Event(timestamp=now, duration=5, data={"a": 0}), ] flooded = flood(events) total_duration = sum((e.duration for e in flooded), timedelta(0)) assert len(flooded) == 1 assert total_duration == timedelta(seconds=100)
def test_flood_negative_gap_same_data(): events = [ Event(timestamp=now, duration=100, data={"a": 0}), Event(timestamp=now, duration=5, data={"a": 0}), ] flooded = flood(events) total_duration = sum((e.duration for e in flooded), timedelta(0)) assert len(flooded) == 1 assert total_duration == timedelta(seconds=100)
def generous_approx(events: List[dict], max_break: float) -> timedelta: """ Returns a generous approximation of worked time by including non-categorized time when shorter than a specific duration max_break: Max time (in seconds) to flood when there's an empty slot between events """ events_e: List[Event] = [Event(**e) for e in events] return sum( map(lambda e: e.duration, flood(events_e, max_break)), timedelta(), )
def _query_complete(): # noqa from aw_transform import (query_bucket, find_bucket, filter_keyvals, exclude_keyvals, period_union, concat) hostname = "" # set in preprocessing browsernames_chrome = ["Chromium"] # TODO: Include more browsers browsernames_ff = ["Firefox"] # TODO: Include more browsers events = flood(query_bucket(find_bucket("aw-watcher-window", hostname))) events_afk = query_bucket( find_bucket("aw-watcher-afk", hostname) ) # TODO: Readd flooding for afk-events once a release has been made that includes the flooding-fix events_web_chrome = flood( query_bucket(find_bucket("aw-watcher-web-chrome"))) events_web_ff = flood(query_bucket(find_bucket("aw-watcher-web-firefox"))) # Combine window events with web events events_browser_chrome = filter_keyvals(events, "app", browsernames_chrome) events_web_chrome = filter_period_intersect(events_web_chrome, events_browser_chrome) events_browser_ff = filter_keyvals(events, "app", browsernames_ff) events_web_ff = filter_period_intersect(events_web_ff, events_browser_ff) events_web = concat(events_web_chrome, events_web_ff) # TODO: Browser events should only be excluded when there's a web-event replacing it events = exclude_keyvals(events, "app", browsernames_chrome) events = exclude_keyvals(events, "app", browsernames_ff) events = concat(events, events_web) # Filter away all inactive (afk and non-audible) time events_notafk = filter_keyvals(events_afk, "status", ["not-afk"]) events_audible = filter_keyvals(events_web, "audible", [True]) events_active = period_union(events_notafk, events_audible) events = filter_period_intersect(events, events_active) return events
def q2_flood(events: list) -> List[Event]: return flood(events)
def q2_flood(events: list) -> List[Event]: return flood(events)