Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(809)

Unified Diff: sky/tools/webkitpy/style/filter.py

Issue 675343003: Prune a bunch of webkitpy. (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sky/tools/webkitpy/style/filereader_unittest.py ('k') | sky/tools/webkitpy/style/filter_unittest.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sky/tools/webkitpy/style/filter.py
diff --git a/sky/tools/webkitpy/style/filter.py b/sky/tools/webkitpy/style/filter.py
deleted file mode 100644
index 608a9e60c4f2bf6bd060a238dc2bb4adad3bbd22..0000000000000000000000000000000000000000
--- a/sky/tools/webkitpy/style/filter.py
+++ /dev/null
@@ -1,278 +0,0 @@
-# Copyright (C) 2010 Chris Jerdonek (chris.jerdonek@gmail.com)
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
-# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
-# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-"""Contains filter-related code."""
-
-
-def validate_filter_rules(filter_rules, all_categories):
- """Validate the given filter rules, and raise a ValueError if not valid.
-
- Args:
- filter_rules: A list of boolean filter rules, for example--
- ["-whitespace", "+whitespace/braces"]
- all_categories: A list of all available category names, for example--
- ["whitespace/tabs", "whitespace/braces"]
-
- Raises:
- ValueError: An error occurs if a filter rule does not begin
- with "+" or "-" or if a filter rule does not match
- the beginning of some category name in the list
- of all available categories.
-
- """
- for rule in filter_rules:
- if not (rule.startswith('+') or rule.startswith('-')):
- raise ValueError('Invalid filter rule "%s": every rule '
- "must start with + or -." % rule)
-
- for category in all_categories:
- if category.startswith(rule[1:]):
- break
- else:
- raise ValueError('Suspected incorrect filter rule "%s": '
- "the rule does not match the beginning "
- "of any category name." % rule)
-
-
-class _CategoryFilter(object):
-
- """Filters whether to check style categories."""
-
- def __init__(self, filter_rules=None):
- """Create a category filter.
-
- Args:
- filter_rules: A list of strings that are filter rules, which
- are strings beginning with the plus or minus
- symbol (+/-). The list should include any
- default filter rules at the beginning.
- Defaults to the empty list.
-
- Raises:
- ValueError: Invalid filter rule if a rule does not start with
- plus ("+") or minus ("-").
-
- """
- if filter_rules is None:
- filter_rules = []
-
- self._filter_rules = filter_rules
- self._should_check_category = {} # Cached dictionary of category to True/False
-
- def __str__(self):
- return ",".join(self._filter_rules)
-
- # Useful for unit testing.
- def __eq__(self, other):
- """Return whether this CategoryFilter instance is equal to another."""
- return self._filter_rules == other._filter_rules
-
- # Useful for unit testing.
- def __ne__(self, other):
- # Python does not automatically deduce from __eq__().
- return not (self == other)
-
- def should_check(self, category):
- """Return whether the category should be checked.
-
- The rules for determining whether a category should be checked
- are as follows. By default all categories should be checked.
- Then apply the filter rules in order from first to last, with
- later flags taking precedence.
-
- A filter rule applies to a category if the string after the
- leading plus/minus (+/-) matches the beginning of the category
- name. A plus (+) means the category should be checked, while a
- minus (-) means the category should not be checked.
-
- """
- if category in self._should_check_category:
- return self._should_check_category[category]
-
- should_check = True # All categories checked by default.
- for rule in self._filter_rules:
- if not category.startswith(rule[1:]):
- continue
- should_check = rule.startswith('+')
- self._should_check_category[category] = should_check # Update cache.
- return should_check
-
-
-class FilterConfiguration(object):
-
- """Supports filtering with path-specific and user-specified rules."""
-
- def __init__(self, base_rules=None, path_specific=None, user_rules=None):
- """Create a FilterConfiguration instance.
-
- Args:
- base_rules: The starting list of filter rules to use for
- processing. The default is the empty list, which
- by itself would mean that all categories should be
- checked.
-
- path_specific: A list of (sub_paths, path_rules) pairs
- that stores the path-specific filter rules for
- appending to the base rules.
- The "sub_paths" value is a list of path
- substrings. If a file path contains one of the
- substrings, then the corresponding path rules
- are appended. The first substring match takes
- precedence, i.e. only the first match triggers
- an append.
- The "path_rules" value is a list of filter
- rules that can be appended to the base rules.
-
- user_rules: A list of filter rules that is always appended
- to the base rules and any path rules. In other
- words, the user rules take precedence over the
- everything. In practice, the user rules are
- provided by the user from the command line.
-
- """
- if base_rules is None:
- base_rules = []
- if path_specific is None:
- path_specific = []
- if user_rules is None:
- user_rules = []
-
- self._base_rules = base_rules
- self._path_specific = path_specific
- self._path_specific_lower = None
- """The backing store for self._get_path_specific_lower()."""
-
- self._user_rules = user_rules
-
- self._path_rules_to_filter = {}
- """Cached dictionary of path rules to CategoryFilter instance."""
-
- # The same CategoryFilter instance can be shared across
- # multiple keys in this dictionary. This allows us to take
- # greater advantage of the caching done by
- # CategoryFilter.should_check().
- self._path_to_filter = {}
- """Cached dictionary of file path to CategoryFilter instance."""
-
- # Useful for unit testing.
- def __eq__(self, other):
- """Return whether this FilterConfiguration is equal to another."""
- if self._base_rules != other._base_rules:
- return False
- if self._path_specific != other._path_specific:
- return False
- if self._user_rules != other._user_rules:
- return False
-
- return True
-
- # Useful for unit testing.
- def __ne__(self, other):
- # Python does not automatically deduce this from __eq__().
- return not self.__eq__(other)
-
- # We use the prefix "_get" since the name "_path_specific_lower"
- # is already taken up by the data attribute backing store.
- def _get_path_specific_lower(self):
- """Return a copy of self._path_specific with the paths lower-cased."""
- if self._path_specific_lower is None:
- self._path_specific_lower = []
- for (sub_paths, path_rules) in self._path_specific:
- sub_paths = map(str.lower, sub_paths)
- self._path_specific_lower.append((sub_paths, path_rules))
- return self._path_specific_lower
-
- def _path_rules_from_path(self, path):
- """Determine the path-specific rules to use, and return as a tuple.
-
- This method returns a tuple rather than a list so the return
- value can be passed to _filter_from_path_rules() without change.
-
- """
- path = path.lower()
- for (sub_paths, path_rules) in self._get_path_specific_lower():
- for sub_path in sub_paths:
- if path.find(sub_path) > -1:
- return tuple(path_rules)
- return () # Default to the empty tuple.
-
- def _filter_from_path_rules(self, path_rules):
- """Return the CategoryFilter associated to the given path rules.
-
- Args:
- path_rules: A tuple of path rules. We require a tuple rather
- than a list so the value can be used as a dictionary
- key in self._path_rules_to_filter.
-
- """
- # We reuse the same CategoryFilter where possible to take
- # advantage of the caching they do.
- if path_rules not in self._path_rules_to_filter:
- rules = list(self._base_rules) # Make a copy
- rules.extend(path_rules)
- rules.extend(self._user_rules)
- self._path_rules_to_filter[path_rules] = _CategoryFilter(rules)
-
- return self._path_rules_to_filter[path_rules]
-
- def _filter_from_path(self, path):
- """Return the CategoryFilter associated to a path."""
- if path not in self._path_to_filter:
- path_rules = self._path_rules_from_path(path)
- filter = self._filter_from_path_rules(path_rules)
- self._path_to_filter[path] = filter
-
- return self._path_to_filter[path]
-
- def should_check(self, category, path):
- """Return whether the given category should be checked.
-
- This method determines whether a category should be checked
- by checking the category name against the filter rules for
- the given path.
-
- For a given path, the filter rules are the combination of
- the base rules, the path-specific rules, and the user-provided
- rules -- in that order. As we will describe below, later rules
- in the list take precedence. The path-specific rules are the
- rules corresponding to the first element of the "path_specific"
- parameter that contains a string case-insensitively matching
- some substring of the path. If there is no such element,
- there are no path-specific rules for that path.
-
- Given a list of filter rules, the logic for determining whether
- a category should be checked is as follows. By default all
- categories should be checked. Then apply the filter rules in
- order from first to last, with later flags taking precedence.
-
- A filter rule applies to a category if the string after the
- leading plus/minus (+/-) matches the beginning of the category
- name. A plus (+) means the category should be checked, while a
- minus (-) means the category should not be checked.
-
- Args:
- category: The category name.
- path: The path of the file being checked.
-
- """
- return self._filter_from_path(path).should_check(category)
-
« no previous file with comments | « sky/tools/webkitpy/style/filereader_unittest.py ('k') | sky/tools/webkitpy/style/filter_unittest.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698