Project import generated by Copybara.
GitOrigin-RevId: d9e9e3fb4e31372ec1fb43b178994ca78fa8fe70
diff --git a/features/federated.py b/features/federated.py
new file mode 100644
index 0000000..2e4486a
--- /dev/null
+++ b/features/federated.py
@@ -0,0 +1,78 @@
+# Copyright 2019 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 or at
+# https://developers.google.com/open-source/licenses/bsd
+
+"""Logic for storing and representing issues from external trackers."""
+
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+
+import re
+
+from framework.exceptions import InvalidExternalIssueReference
+
+
+class FederatedIssue(object):
+ """Abstract base class for holding one federated issue.
+
+ Each distinct external tracker should subclass this.
+ """
+ shortlink_re = None
+
+ def __init__(self, shortlink):
+ if not self.IsShortlinkValid(shortlink):
+ raise InvalidExternalIssueReference(
+ 'Shortlink does not match any valid tracker: %s' % shortlink)
+
+ self.shortlink = shortlink
+
+ @classmethod
+ def IsShortlinkValid(cls, shortlink):
+ """Returns whether given shortlink is correctly formatted."""
+ if not cls.shortlink_re:
+ raise NotImplementedError()
+ return re.match(cls.shortlink_re, shortlink)
+
+
+class GoogleIssueTrackerIssue(FederatedIssue):
+ """Holds one Google Issue Tracker issue.
+
+ URL: https://issuetracker.google.com/
+ """
+ shortlink_re = r'^b\/\d+$'
+ url_format = 'https://issuetracker.google.com/issues/{issue_id}'
+
+ def __init__(self, shortlink):
+ super(GoogleIssueTrackerIssue, self).__init__(shortlink)
+ self.issue_id = int(self.shortlink[2:])
+
+ def ToURL(self):
+ return self.url_format.format(issue_id=self.issue_id)
+
+ def Summary(self):
+ """Returns a short string description for UI."""
+ return 'Google Issue Tracker issue %s.' % self.issue_id
+
+
+# All supported tracker classes.
+_federated_issue_classes = [GoogleIssueTrackerIssue]
+
+
+def IsShortlinkValid(shortlink):
+ """Returns whether the given string is valid for any issue tracker."""
+ return any(tracker_class.IsShortlinkValid(shortlink)
+ for tracker_class in _federated_issue_classes)
+
+
+def FromShortlink(shortlink):
+ """Returns a FederatedIssue for the first matching tracker.
+
+ If no matching tracker is found, returns None.
+ """
+ for tracker_class in _federated_issue_classes:
+ if tracker_class.IsShortlinkValid(shortlink):
+ return tracker_class(shortlink)
+
+ return None