my_activity: Add some tests and fix some bugs
Change-Id: Ib5625ae9d052eca9d6c6b64f12f64e6697aef7a8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/2072874
Reviewed-by: Anthony Polito <apolito@google.com>
Commit-Queue: Edward Lesmes <ehmaldonado@chromium.org>
diff --git a/my_activity.py b/my_activity.py
index c7c28c4..ebac126 100755
--- a/my_activity.py
+++ b/my_activity.py
@@ -129,7 +129,7 @@
def get_quarter_of(date):
begin = (datetime_to_midnight(date) -
- relativedelta(months=(date.month % 3) - 1, days=(date.day - 1)))
+ relativedelta(months=(date.month - 1) % 3, days=(date.day - 1)))
return begin, begin + relativedelta(months=3)
@@ -160,6 +160,24 @@
def datetime_from_monorail(date_string):
return datetime.strptime(date_string, '%Y-%m-%dT%H:%M:%S')
+def extract_bug_numbers_from_description(issue):
+ # Getting the description for REST Gerrit
+ revision = issue['revisions'][issue['current_revision']]
+ description = revision['commit']['message']
+
+ bugs = []
+ # Handle both "Bug: 99999" and "BUG=99999" bug notations
+ # Multiple bugs can be noted on a single line or in multiple ones.
+ matches = re.findall(
+ r'^(BUG=|(Bug|Fixed):\s*)((((?:[a-zA-Z0-9-]+:)?\d+)(,\s?)?)+)',
+ description, flags=re.IGNORECASE | re.MULTILINE)
+ if matches:
+ for match in matches:
+ bugs.extend(match[2].replace(' ', '').split(','))
+ # Add default chromium: prefix if none specified.
+ bugs = [bug if ':' in bug else 'chromium:%s' % bug for bug in bugs]
+
+ return sorted(set(bugs))
class MyActivity(object):
def __init__(self, options):
@@ -180,32 +198,6 @@
sys.stdout.write(how)
sys.stdout.flush()
- def extract_bug_numbers_from_description(self, issue):
- description = None
-
- if 'description' in issue:
- # Getting the description for Rietveld
- description = issue['description']
- elif 'revisions' in issue:
- # Getting the description for REST Gerrit
- revision = issue['revisions'][issue['current_revision']]
- description = revision['commit']['message']
-
- bugs = []
- if description:
- # Handle both "Bug: 99999" and "BUG=99999" bug notations
- # Multiple bugs can be noted on a single line or in multiple ones.
- matches = re.findall(
- r'BUG[=:]\s?((((?:[a-zA-Z0-9-]+:)?\d+)(,\s?)?)+)', description,
- flags=re.IGNORECASE)
- if matches:
- for match in matches:
- bugs.extend(match[0].replace(' ', '').split(','))
- # Add default chromium: prefix if none specified.
- bugs = [bug if ':' in bug else 'chromium:%s' % bug for bug in bugs]
-
- return sorted(set(bugs))
-
def gerrit_changes_over_rest(self, instance, filters):
# Convert the "key:value" filter to a list of (key, value) pairs.
req = list(f.split(':', 1) for f in filters)
@@ -272,7 +264,7 @@
ret['replies'] = []
ret['reviewers'] = set(r['author'] for r in ret['replies'])
ret['reviewers'].discard(ret['author'])
- ret['bugs'] = self.extract_bug_numbers_from_description(issue)
+ ret['bugs'] = extract_bug_numbers_from_description(issue)
return ret
@staticmethod
diff --git a/tests/my_activity_test.py b/tests/my_activity_test.py
new file mode 100644
index 0000000..47d0f79
--- /dev/null
+++ b/tests/my_activity_test.py
@@ -0,0 +1,94 @@
+#!/usr/bin/env vpython3
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import sys
+import unittest
+
+from datetime import datetime
+
+DEPOT_TOOLS_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+sys.path.insert(0, DEPOT_TOOLS_ROOT)
+
+import my_activity
+
+class MyActivityTest(unittest.TestCase):
+ def test_datetime_to_midnight(self):
+ self.assertEqual(
+ datetime(2020, 9, 12),
+ my_activity.datetime_to_midnight(datetime(2020, 9, 12, 13, 0, 0)))
+ self.assertEqual(
+ datetime(2020, 12, 31),
+ my_activity.datetime_to_midnight(datetime(2020, 12, 31, 23, 59, 59)))
+ self.assertEqual(
+ datetime(2020, 12, 31),
+ my_activity.datetime_to_midnight(datetime(2020, 12, 31)))
+
+ def test_get_quarter_of(self):
+ self.assertEqual(
+ (datetime(2020, 7, 1), datetime(2020, 10, 1)),
+ my_activity.get_quarter_of(datetime(2020, 9, 12)))
+ # Quarter range includes beggining
+ self.assertEqual(
+ (datetime(2020, 10, 1), datetime(2021, 1, 1)),
+ my_activity.get_quarter_of(datetime(2020, 10, 1)))
+ # Quarter range excludes end
+ self.assertEqual(
+ (datetime(2021, 1, 1), datetime(2021, 4, 1)),
+ my_activity.get_quarter_of(datetime(2021, 1, 1)))
+ self.assertEqual(
+ (datetime(2020, 10, 1), datetime(2021, 1, 1)),
+ my_activity.get_quarter_of(datetime(2020, 12, 31, 23, 59, 59)))
+
+ def test_get_year_of(self):
+ self.assertEqual(
+ (datetime(2020, 1, 1), datetime(2021, 1, 1)),
+ my_activity.get_year_of(datetime(2020, 9, 12)))
+ # Year range includes beggining
+ self.assertEqual(
+ (datetime(2020, 1, 1), datetime(2021, 1, 1)),
+ my_activity.get_year_of(datetime(2020, 1, 1)))
+ # Year range excludes end
+ self.assertEqual(
+ (datetime(2021, 1, 1), datetime(2022, 1, 1)),
+ my_activity.get_year_of(datetime(2021, 1, 1)))
+
+ def test_get_week_of(self):
+ self.assertEqual(
+ (datetime(2020, 9, 7), datetime(2020, 9, 14)),
+ my_activity.get_week_of(datetime(2020, 9, 12)))
+ # Week range includes beginning
+ self.assertEqual(
+ (datetime(2020, 9, 7), datetime(2020, 9, 14)),
+ my_activity.get_week_of(datetime(2020, 9, 7)))
+ # Week range excludes beginning
+ self.assertEqual(
+ (datetime(2020, 9, 14), datetime(2020, 9, 21)),
+ my_activity.get_week_of(datetime(2020, 9, 14)))
+
+ def _get_issue_with_description(self, description):
+ return {
+ 'current_revision': 'rev',
+ 'revisions': {'rev': {'commit': {'message': description}}},
+ }
+
+ def test_extract_bug_numbers_from_description(self):
+ issue = self._get_issue_with_description(
+ 'Title\n'
+ '\n'
+ 'Description\n'
+ 'A comment:\n'
+ '> Bug: 1234, another:5678\n'
+ '\n'
+ 'Bug: another:1234, 5678\n'
+ 'BUG=project:13141516\n'
+ 'Fixed: fixed:9101112\n'
+ 'Change-Id: Iabcdef1234567890\n')
+ self.assertEqual(
+ ['another:1234', 'chromium:5678', 'fixed:9101112', 'project:13141516'],
+ my_activity.extract_bug_numbers_from_description(issue))
+
+if __name__ == '__main__':
+ unittest.main()