1# Copyright 2015 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""A Model for holding a mapping of bug labels to sets of tests.
6
7This is used to decide which bug labels should be applied by default
8to bugs filed for alerts on particular tests.
9"""
10
11from google.appengine.ext import ndb
12
13from dashboard import utils
14
15# String ID for the single BugLabelPatterns entity.
16_ID = 'patterns'
17
18
19class BugLabelPatterns(ndb.Model):
20  """A model for storing the mapping of bug labels to test path patterns.
21
22  There should only ever be one BugLabelPatterns entity, and it has a single
23  property, which is a dict mapping bug label strings to lists of test path
24  pattern strings.
25  """
26  labels_to_patterns = ndb.JsonProperty(indexed=False)
27
28
29def _Get():
30  """Fetches the single BugLabelPatterns entity."""
31  entity = ndb.Key(BugLabelPatterns, _ID).get()
32  if entity:
33    return entity
34  entity = BugLabelPatterns(id=_ID)
35  entity.labels_to_patterns = {}
36  entity.put()
37  return entity
38
39
40def GetBugLabelPatterns():
41  """Returns the dict of bug labels to test path patterns."""
42  return _Get().labels_to_patterns
43
44
45def GetBugLabelsForTest(test):
46  """Returns a list of bug labels to be applied to the test."""
47  matching = []
48  for label, patterns in GetBugLabelPatterns().iteritems():
49    for pattern in patterns:
50      if utils.TestMatchesPattern(test, pattern):
51        matching.append(label)
52  return sorted(matching)
53
54
55def AddBugLabelPattern(label, pattern):
56  """Adds the given test path pattern for the given bug label."""
57  entity = _Get()
58  if label not in entity.labels_to_patterns:
59    entity.labels_to_patterns[label] = []
60  entity.labels_to_patterns[label].append(pattern)
61  entity.put()
62
63
64def RemoveBugLabel(label):
65  """Adds the given test path pattern for the given bug label."""
66  entity = _Get()
67  if label in entity.labels_to_patterns:
68    del entity.labels_to_patterns[label]
69  entity.put()
70