Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 # Copyright (c) 2012 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 | |
| 6 """Results object and results formatters for checkdeps tool.""" | |
| 7 | |
| 8 | |
| 9 class DependencyViolation(object): | |
| 10 """A single dependency violation.""" | |
| 11 | |
| 12 def __init__(self, include_path, violated_rule, rules): | |
| 13 # Path of the included or imported file that is in violation of a rule. | |
|
erikwright (departed)
2012/07/31 17:22:46
I would write this as "The include or import path
Jói
2012/08/01 15:22:58
Done.
| |
| 14 self.include_path = include_path | |
| 15 | |
| 16 # The specific rule | |
|
erikwright (departed)
2012/07/31 17:22:46
The violated rule.
Jói
2012/08/01 15:22:58
Done.
| |
| 17 self.violated_rule = violated_rule | |
| 18 | |
| 19 # The set of rules containing self.violated_rules | |
|
erikwright (departed)
2012/07/31 17:22:46
violated_rules -> violated_rule
Add a '.'
Jói
2012/08/01 15:22:58
Done.
| |
| 20 self.rules = rules | |
| 21 | |
| 22 | |
| 23 class DependeeStatus(object): | |
| 24 """Results object for a file that has one or more violations.""" | |
|
erikwright (departed)
2012/07/31 17:22:46
"one or more" seems wrong, given the presence of "
Jói
2012/08/01 15:22:58
Done.
| |
| 25 | |
| 26 def __init__(self, dependee_path): | |
| 27 # Path of the file that has the dependencies-in-violation listed | |
|
erikwright (departed)
2012/07/31 17:22:46
Maybe "Path of the file whose nonconforming depend
Jói
2012/08/01 15:22:58
Done.
| |
| 28 # in self.violations. | |
| 29 self.dependee_path = dependee_path | |
| 30 | |
| 31 # List of DependencyViolation objects that apply to the dependee | |
| 32 # file. | |
| 33 self.violations = [] | |
| 34 | |
| 35 def AddViolation(self, violation): | |
| 36 """Adds a violation.""" | |
| 37 self.violations.append(violation) | |
| 38 | |
| 39 def HasViolations(self): | |
| 40 """Returns True if this dependee is violating one or more rules.""" | |
| 41 return not not self.violations | |
| 42 | |
| 43 | |
| 44 class ResultsFormatter(object): | |
| 45 """Base class for results formatters.""" | |
| 46 | |
| 47 def __init__(self): | |
| 48 self.results = [] | |
|
erikwright (departed)
2012/07/31 17:22:46
I would pull results into NormalResultsFormatter,
Jói
2012/08/01 15:22:58
Done.
| |
| 49 | |
| 50 def AddError(self, dependee_status): | |
| 51 """Add a formatted result to |self.results| for |dependee_status|, | |
| 52 which is guaranteed to return True for | |
| 53 |dependee_status.HasViolations|. | |
| 54 """ | |
| 55 raise NotImplementedError() | |
| 56 | |
| 57 def GetResults(self): | |
| 58 """Returns the results. May be overridden e.g. to process the | |
| 59 results that have been accumulated. | |
| 60 """ | |
| 61 return self.results | |
| 62 | |
| 63 def PrintResults(self): | |
| 64 """Prints the results to stdout.""" | |
| 65 raise NotImplementedError() | |
| 66 | |
| 67 | |
| 68 class NormalResultsFormatter(ResultsFormatter): | |
| 69 """A results formatting object that produces the classical, | |
| 70 detailed, human-readable output of the checkdeps tool. | |
| 71 """ | |
| 72 | |
| 73 def __init__(self, verbose): | |
| 74 super(NormalResultsFormatter, self).__init__() | |
| 75 self.verbose = verbose | |
| 76 | |
| 77 def AddError(self, dependee_status): | |
| 78 lines = [] | |
| 79 lines.append('\nERROR in %s' % dependee_status.dependee_path) | |
| 80 for violation in dependee_status.violations: | |
| 81 lines.append(self.FormatViolation(violation)) | |
| 82 self.results.append('\n'.join(lines)) | |
| 83 | |
| 84 def FormatViolation(self, violation): | |
|
erikwright (departed)
2012/07/31 17:22:46
I would convert this into a class function taking
| |
| 85 lines = [] | |
| 86 if self.verbose: | |
| 87 lines.append('For %s' % violation.rules) | |
| 88 lines.append( | |
| 89 ' Illegal include: "%s"\n Because of %s' % | |
| 90 (violation.include_path, str(violation.violated_rule))) | |
| 91 return '\n'.join(lines) | |
| 92 | |
| 93 def PrintResults(self): | |
| 94 for result in self.results: | |
| 95 print result | |
| 96 if self.results: | |
| 97 print '\nFAILED\n' | |
| 98 | |
| 99 | |
| 100 class TemporaryRulesFormatter(ResultsFormatter): | |
| 101 """A results formatter that produces a single line per file that | |
|
erikwright (departed)
2012/07/31 17:22:46
"a single line per file that fails checks" indicat
| |
| 102 fails checks, that is suitable for directly pasting into a DEPS file | |
| 103 as a temporary-allow rule. | |
| 104 """ | |
| 105 | |
| 106 def __init__(self): | |
| 107 self.violations = set() | |
| 108 | |
| 109 def AddError(self, dependee_status): | |
| 110 for violation in dependee_status.violations: | |
| 111 self.violations.add(violation.include_path) | |
| 112 | |
| 113 def GetResults(self): | |
| 114 return [' "!%s",' % path for path in sorted(self.violations)] | |
| 115 | |
| 116 def PrintResults(self): | |
| 117 for result in self.GetResults(): | |
| 118 print result | |
| OLD | NEW |