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