Milimetric has submitted this change and it was merged.

Change subject: Add lag option to reportupdater
......................................................................


Add lag option to reportupdater

Adds a 'lag' option to the report configuration (yaml)
that permits waiting for a given time before running
a report. This is useful for example if the source db
has lag.

Bug: T117091
Change-Id: I9b01c608bd912e80e31cdb372cb9e45441f96f76
---
M reportupdater/reader.py
M reportupdater/report.py
M reportupdater/selector.py
M test/reader_test.py
M test/report_test.py
M test/selector_test.py
6 files changed, 50 insertions(+), 3 deletions(-)

Approvals:
  Milimetric: Verified; Looks good to me, approved



diff --git a/reportupdater/reader.py b/reportupdater/reader.py
index 1a7245f..866d39f 100644
--- a/reportupdater/reader.py
+++ b/reportupdater/reader.py
@@ -58,6 +58,7 @@
         report.type = self.get_type(report_config)
         report.frequency = self.get_frequency(report_config)
         report.granularity = self.get_granularity(report_config)
+        report.lag = self.get_lag(report_config)
         report.is_timeboxed = self.get_is_timeboxed(report_config)
         report.is_funnel = self.get_is_funnel(report_config)
         report.first_date = self.get_first_date(report_config, 
report.is_timeboxed)
@@ -81,7 +82,7 @@
         if 'frequency' not in report_config:
             raise KeyError('Report frequency is not specified.')
         frequency = report_config['frequency']
-        if frequency not in ['hours', 'days', 'weeks']:
+        if frequency not in ['hours', 'days', 'weeks', 'months']:
             raise ValueError('Report frequency is not valid.')
         return frequency
 
@@ -95,6 +96,15 @@
         return granularity
 
 
+    def get_lag(self, report_config):
+        if 'lag' not in report_config:
+            return 0
+        lag = report_config['lag']
+        if type(lag) != int or lag < 0:
+            raise ValueError('Report lag is not valid.')
+        return lag
+
+
     def get_is_timeboxed(self, report_config):
         return 'timeboxed' in report_config and report_config['timeboxed'] is 
True
 
diff --git a/reportupdater/report.py b/reportupdater/report.py
index 3a34228..5f82114 100644
--- a/reportupdater/report.py
+++ b/reportupdater/report.py
@@ -19,6 +19,7 @@
         self.type = None
         self.frequency = None
         self.granularity = None
+        self.lag = 0
         self.is_timeboxed = False
         self.is_funnel = False
         self.first_date = None
@@ -38,6 +39,7 @@
             ' type=' + str(self.type) +
             ' frequency=' + str(self.frequency) +
             ' granularity=' + str(self.granularity) +
+            ' lag=' + str(self.lag) +
             ' is_timeboxed=' + str(self.is_timeboxed) +
             ' is_funnel=' + str(self.is_funnel) +
             ' first_date=' + self.format_date(self.first_date) +
diff --git a/reportupdater/selector.py b/reportupdater/selector.py
index 0fab90c..ce96468 100644
--- a/reportupdater/selector.py
+++ b/reportupdater/selector.py
@@ -75,8 +75,10 @@
 
         first_date = self.truncate_date(report.first_date, report.granularity)
         frequency_increment = self.get_increment(report.frequency)
+        lag_increment = relativedelta(seconds=report.lag)
         granularity_increment = self.get_increment(report.granularity)
-        last_date = self.truncate_date(now - frequency_increment, 
report.granularity)
+        relative_now = now - frequency_increment - lag_increment
+        last_date = self.truncate_date(relative_now, report.granularity)
         previous_results = get_previous_results(report, output_folder)
         already_done_dates = previous_results['data'].keys()
 
diff --git a/test/reader_test.py b/test/reader_test.py
index b11f626..445e740 100644
--- a/test/reader_test.py
+++ b/test/reader_test.py
@@ -71,7 +71,7 @@
 
 
     def test_get_frequency_and_granularity(self):
-        for frequency in ['hours', 'days', 'weeks']:
+        for frequency in ['hours', 'days', 'weeks', 'months']:
             report_config = {'frequency': frequency}
             result = self.reader.get_frequency(report_config)
             self.assertEqual(result, frequency)
@@ -81,6 +81,27 @@
             self.assertEqual(result, granularity)
 
 
+    def test_get_lag_when_value_is_not_in_config(self):
+        report_config = {}
+        result = self.reader.get_lag(report_config)
+        self.assertEqual(result, 0)
+
+
+    def test_get_lag_when_value_is_not_valid(self):
+        report_config = {'lag': 'not an int'}
+        with self.assertRaises(ValueError):
+            self.reader.get_lag(report_config)
+        report_config = {'lag': -1}
+        with self.assertRaises(ValueError):
+            self.reader.get_lag(report_config)
+
+
+    def test_get_lag(self):
+        report_config = {'lag': 10}
+        result = self.reader.get_lag(report_config)
+        self.assertEqual(result, 10)
+
+
     def test_get_is_timeboxed_when_report_timeboxed_is_not_in_config(self):
         report_config = {}
         is_timeboxed = self.reader.get_is_timeboxed(report_config)
diff --git a/test/report_test.py b/test/report_test.py
index 52309ed..8f8a068 100644
--- a/test/report_test.py
+++ b/test/report_test.py
@@ -13,6 +13,7 @@
         self.report.type = 'sql'
         self.report.frequency = 'hours'
         self.report.granularity = 'days'
+        self.report.lag = 0
         self.report.is_timeboxed = True
         self.report.is_funnel = True
         self.report.first_date = datetime(2015, 1, 1)
diff --git a/test/selector_test.py b/test/selector_test.py
index 39ce9db..c766fc8 100644
--- a/test/selector_test.py
+++ b/test/selector_test.py
@@ -117,6 +117,17 @@
         self.assertEqual(reports[0].end, datetime(2015, 1, 3))
 
 
+    def test_get_interval_reports_when_lag_is_set(self):
+        # Note no previous results tsv exists for default report.
+        now = datetime(2015, 1, 3)
+        self.report.frequency = 'days'
+        self.report.lag = 100  # 1 minute and 40 seconds
+        reports = list(self.selector.get_interval_reports(self.report, now))
+        self.assertEqual(len(reports), 1)
+        self.assertEqual(reports[0].start, datetime(2015, 1, 1))
+        self.assertEqual(reports[0].end, datetime(2015, 1, 2))
+
+
     def test_truncate_date_when_period_is_hours(self):
         date = datetime(2015, 1, 5, 10, 20, 30)
         result = self.selector.truncate_date(date, 'hours')

-- 
To view, visit https://gerrit.wikimedia.org/r/249813
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I9b01c608bd912e80e31cdb372cb9e45441f96f76
Gerrit-PatchSet: 1
Gerrit-Project: analytics/limn-mobile-data
Gerrit-Branch: master
Gerrit-Owner: Mforns <[email protected]>
Gerrit-Reviewer: Milimetric <[email protected]>
Gerrit-Reviewer: Nuria <[email protected]>
Gerrit-Reviewer: Yuvipanda <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to