| Index: abp/filters/sources.py |
| =================================================================== |
| --- a/abp/filters/sources.py |
| +++ b/abp/filters/sources.py |
| @@ -8,103 +8,142 @@ |
| # Adblock Plus is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| -"""Helper classes that handle IO for parsing and rendering.""" |
| +"""Helper classes that handle IO for filter list parsing and rendering.""" |
| import io |
| from os import path |
| try: |
| from urllib2 import urlopen, HTTPError |
| except ImportError: # The module was renamed in Python 3. |
| from urllib.request import urlopen |
| from urllib.error import HTTPError |
| -__all__ = ['FSSource', 'TopSource', 'WebSource', 'NotFound'] |
| +__all__ = ['NotFound', 'FSSource', 'TopSource', 'WebSource'] |
| class NotFound(Exception): |
| """Requested file doesn't exist in this source. |
| The file with requested name doesn't exist. If this results from an |
| include, the including list probably contains an error. |
| """ |
| class FSSource(object): |
| """Directory on the filesystem. |
| - :param root_path: The path to the directory. |
| - :param encoding: Encoding to use for reading the files (default: utf-8). |
| + Parameters |
| + ---------- |
| + root_path : str |
| + The path to the directory. |
| + encoding : str |
| + Encoding to use for reading the files (default: utf-8). |
| + |
| """ |
| is_inheritable = True |
| def __init__(self, root_path, encoding='utf-8'): |
| root_path = path.abspath(root_path) |
| self.root_path = root_path |
| self.encoding = encoding |
| - def resolve_path(self, path_in_source): |
| + def _resolve_path(self, path_in_source): |
| parts = path_in_source.split('/') |
| full_path = path.abspath(path.join(self.root_path, *parts)) |
| if not full_path.startswith(self.root_path): |
| raise ValueError("Invalid path: '{}'".format(path_in_source)) |
| return full_path |
| def get(self, path_in_source): |
| - full_path = self.resolve_path(path_in_source) |
| + """Read file from the source. |
| + |
| + Parameters |
| + ---------- |
| + path_in_source : str |
| + Path to the file inside of the source. |
| + |
| + Returns |
| + ------- |
| + iterable of str |
| + Lines of the file. |
| + |
| + """ |
| + full_path = self._resolve_path(path_in_source) |
| try: |
| with io.open(full_path, encoding=self.encoding) as open_file: |
| for line in open_file: |
| yield line.rstrip() |
| except IOError as exc: |
| if exc.errno == 2: # No such file or directory. |
| raise NotFound("File not found: '{}'".format(full_path)) |
| raise exc |
| class TopSource(FSSource): |
| """Current directory without path conversion. |
| Also supports absolute paths. This source is used for the top fragment. |
| - :param encoding: Encoding to use for reading the files (default: utf-8). |
| + Parameters |
| + ---------- |
| + encoding : str |
| + Encoding to use for reading the files (default: utf-8). |
| + |
| """ |
| is_inheritable = False |
| def __init__(self, encoding='utf-8'): |
| super(TopSource, self).__init__('.', encoding) |
| - def resolve_path(self, path_in_source): |
| + def _resolve_path(self, path_in_source): |
| return path_in_source |
| class WebSource(object): |
| """Handler for http or https. |
| - :param protocol: "http" or "https". |
| - :param default_encoding: Encoding to use when the server doesn't specify |
| - it (default: utf-8). |
| + Parameters |
| + ---------- |
| + protocol : str |
| + Protocol to use: "http" or "https". |
| + default_encoding : str |
| + Encoding to use when the server doesn't specify it (default: utf-8). |
| + |
| """ |
| is_inheritable = False |
| def __init__(self, protocol, default_encoding='utf-8'): |
| self.protocol = protocol |
| self.default_encoding = default_encoding |
| def get(self, path_in_source): |
| + """Read file from the source. |
| + |
| + Parameters |
| + ---------- |
| + path_in_source : str |
| + The rest of the URL after "http(s):". |
| + |
| + Returns |
| + ------- |
| + iterable of str |
| + Lines of the file. |
| + |
| + """ |
| url = '{}:{}'.format(self.protocol, path_in_source) |
| try: |
| response = urlopen(url) |
| info = response.info() |
| # info.getparam became info.get_param in Python 3 so we'll |
| # try both. |
| get_param = (getattr(info, 'get_param', None) or |
| getattr(info, 'getparam', None)) |