Milimetric has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/158630

Change subject: [WIP] Add Rolling Surviving New Active Editor
......................................................................

[WIP] Add Rolling Surviving New Active Editor

NOTE: not ready but proof that I do TDD sometimes :)

Bug: 67460
Change-Id: I38b324e0228833d47e5df71d2022432d6066372a
---
M tests/test_metrics/test_rolling_new_active_editor.py
A tests/test_metrics/test_rolling_surviving_new_active_editor.py
2 files changed, 165 insertions(+), 2 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/analytics/wikimetrics 
refs/changes/30/158630/1

diff --git a/tests/test_metrics/test_rolling_new_active_editor.py 
b/tests/test_metrics/test_rolling_new_active_editor.py
index 6eb1ce8..30b9880 100644
--- a/tests/test_metrics/test_rolling_new_active_editor.py
+++ b/tests/test_metrics/test_rolling_new_active_editor.py
@@ -136,8 +136,6 @@
         }
         for user_id, result in expected_results.items():
             assert_equal(results[user_id][metric.id], result)
-        # users with no edits at all just won't show up
-        assert_equal(results.get(self.editor_ids[3], -1), -1)
 
     def test_wiki_cohort_nobody_qualifying(self):
         # make everyone fail the registration criteria and make sure they're 
excluded
diff --git a/tests/test_metrics/test_rolling_surviving_new_active_editor.py 
b/tests/test_metrics/test_rolling_surviving_new_active_editor.py
new file mode 100644
index 0000000..2b5ed88
--- /dev/null
+++ b/tests/test_metrics/test_rolling_surviving_new_active_editor.py
@@ -0,0 +1,165 @@
+from datetime import datetime, timedelta
+from nose.tools import assert_true, assert_equal, assert_false
+
+from tests.fixtures import DatabaseTest, i, d
+from wikimetrics.utils import format_pretty_date as s
+from wikimetrics.models import Revision, Logging
+from wikimetrics.metrics import RollingNewActiveEditor
+from wikimetrics.enums import TimeseriesChoices
+
+
+class RollingNewActiveEditorTest(DatabaseTest):
+    """
+        TODO: add timeseries support and use the following tests:
+        
gerrit.wikimedia.org/r/#/c/147312/5/tests/test_metrics/test_rolling_active_editor.py
+    """
+    def runTest(self):
+        pass
+
+    def setUp(self):
+        DatabaseTest.setUp(self)
+
+        # registration for all the editors below
+        self.before_r = before_r = 20131201000000
+        self.r = r = 20140101000000
+        # exactly 30 days after registration
+        self.m = m = 20140131000000
+        # exactly 60 days after registration
+        self.m2 = m2 = 20140302000000
+        self.r_plus_60 = s(d(self.m2))
+        self.editor_count = 12
+
+        self.create_test_cohort(
+            # 5 editors will have registered on time, 5 will not
+            editor_count=self.editor_count,
+            revisions_per_editor=8,
+            revision_timestamps=[
+                # NOTE: these first 6 are registered BEFORE r
+                # this one will make 5 edits within 30 days of m, 3 after
+                [r + 1, r + 2, r + 3, r + 4, r + 5, m + 6, m + 7, m + 8],
+                # this one will make 3 edits within 30 days of m, 5 after
+                [r + 1, r + 2, r + 3, m + 4, m + 5, m + 6, m + 7, m + 8],
+                # this one will make 8 edits within 30 days of m, 0 after
+                [r + 1, r + 2, r + 3, r + 4, r + 5, r + 6, r + 7, r + 8],
+                # this one will make 0 edits within 30 days of m, 8 after
+                [m + 1, m + 2, m + 3, m + 4, m + 5, m + 6, m + 7, m + 8],
+                # this one will make the 5th edit right on m, 4 after
+                [r + 1, r + 2, r + 3, r + 4, m + 0, m + 6, m + 7, m + 8],
+                # this one will make no edits within r -> r + 60 days
+                [m2 + 1] * 8,
+
+                # NOTE: these next 6 are registered AFTER r
+                # this one will make 5 edits within 30 days of m, 3 after
+                [r + 1, r + 2, r + 3, r + 4, r + 5, m + 6, m + 7, m + 8],
+                # this one will make 3 edits within 30 days of m, 5 after
+                [r + 1, r + 2, r + 3, m + 4, m + 5, m + 6, m + 7, m + 8],
+                # this one will make 8 edits within 30 days of m, 0 after
+                [r + 1, r + 2, r + 3, r + 4, r + 5, r + 6, r + 7, r + 8],
+                # this one will make 0 edits within 30 days of m, 8 after
+                [m + 1, m + 2, m + 3, m + 4, m + 5, m + 6, m + 7, m + 8],
+                # this one will make the 5th edit right on m, 4 after
+                [r + 1, r + 2, r + 3, r + 4, m + 0, m + 6, m + 7, m + 8],
+                # this one will make no edits within r -> r + 60 days
+                [m2 + 1] * 8,
+            ],
+            user_registrations=([before_r] * 6) + ([r] * 6),
+            revision_lengths=10
+        )
+        self.create_non_editors([
+            (r, 'newusers', 'create'),
+            (r, 'newusers', 'create'),
+            (m, 'newusers', 'create'),
+        ])
+
+    def test_validates(self):
+        metric = RollingNewActiveEditor(
+            end_date='blah'
+        )
+        assert_false(metric.validate())
+
+        metric = RollingNewActiveEditor(
+            end_date=self.r_plus_60,
+        )
+        assert_true(metric.validate())
+
+    def test_normal_cohort(self):
+        metric = RollingNewActiveEditor(
+            end_date=self.r_plus_60,
+        )
+        results = metric(self.editor_ids, self.mwSession)
+
+        assert_equal(set(results.keys()), set(self.editor_ids))
+        assert_equal([0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0], [
+            results[self.editor_ids[x]][metric.id] for x in 
range(self.editor_count)
+        ])
+
+    def test_normal_cohort_with_archived_revisions(self):
+        self.archive_revisions()
+        self.test_normal_cohort()
+
+    def test_wiki_cohort(self):
+        # make one of the non-cohort users, who registered on self.r, active
+        make_active = self.non_editors[0]
+        self.mwSession.bind.engine.execute(
+            Revision.__table__.insert(), [
+                {
+                    'rev_page'      : self.page.page_id,
+                    'rev_user'      : make_active.user_id,
+                    'rev_comment'   : 'revision {}, additional'.format(rev),
+                    'rev_timestamp' : self.r + rev,
+                    'rev_len'       : 10,
+                    # rev_parent_id will not be set
+                }
+                for rev in range(1, 6)
+            ]
+        )
+        self.mwSession.commit()
+
+        expected = set(self.editor_ids + [make_active.user_id])
+        # editors with no edits at all won't be picked up by the query
+        expected.remove(self.editor_ids[11])
+        # editors that haven't registered in time shouldn't be picked up at all
+        expected.remove(self.editor_ids[0])
+        expected.remove(self.editor_ids[1])
+        expected.remove(self.editor_ids[2])
+        expected.remove(self.editor_ids[3])
+        expected.remove(self.editor_ids[4])
+        expected.remove(self.editor_ids[5])
+
+        metric = RollingNewActiveEditor(
+            end_date=self.r_plus_60,
+        )
+        results = metric(None, self.mwSession)
+
+        print self.editor_ids
+        print expected
+        print results.keys()
+        assert_equal(set(results.keys()), expected)
+        expected_results = {
+            # all actives show, whether in a cohort or not
+            self.editor_ids[6] : 1,
+            self.editor_ids[8] : 1,
+            make_active.user_id : 1,
+            # users with not enough edits will show up with 0 as the result
+            self.editor_ids[7] : 0,
+            self.editor_ids[9] : 0,
+            self.editor_ids[10] : 0,
+        }
+        for user_id, result in expected_results.items():
+            assert_equal(results[user_id][metric.id], result)
+
+    def test_wiki_cohort_nobody_qualifying(self):
+        # make everyone fail the registration criteria and make sure they're 
excluded
+        self.mwSession.bind.engine.execute(
+            Logging.__table__.update().values({
+                'log_type': 'blah'
+            })
+        )
+        self.mwSession.commit()
+
+        metric = RollingNewActiveEditor(
+            end_date=self.r_plus_60,
+        )
+        results = metric(None, self.mwSession)
+
+        assert_equal(results.keys(), [])

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I38b324e0228833d47e5df71d2022432d6066372a
Gerrit-PatchSet: 1
Gerrit-Project: analytics/wikimetrics
Gerrit-Branch: master
Gerrit-Owner: Milimetric <dandree...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to