From 3912dca0163488cc69301877df8bc7ea57ea2112 Mon Sep 17 00:00:00 2001 From: Joshua Harlow Date: Thu, 11 Sep 2014 15:36:25 -0700 Subject: [PATCH] Allow a default_extension to be provided When a file is found without an extension allow a CLI provided default_extension to be used in these cases so that files without extensions can be classified as known file extension types. Change-Id: I115ccc92ccd51a7018672b98b639ade30869f939 --- README.rst | 9 +++++++-- doc8/main.py | 14 +++++++++++++- doc8/parser.py | 10 +++++++--- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/README.rst b/README.rst index b739b30..3df598e 100644 --- a/README.rst +++ b/README.rst @@ -27,8 +27,8 @@ Command line usage $ doc8 -h usage: doc8 [-h] [--config path] [--allow-long-titles] [--ignore code] - [--no-sphinx] [--ignore-path path] [--max-line-length int] - [-e extension] [-v] + [--no-sphinx] [--ignore-path path] [--default-extension extension] + [--max-line-length int] [-e extension] [-v] [--version] [path [path ...]] Check documentation for simple style requirements. @@ -56,12 +56,16 @@ Command line usage --no-sphinx do not ignore sphinx specific false positives --ignore-path path ignore the given directory or file (globs are supported) + --default-extension extension + Default file extension to use when a file is found + without a file extension. --max-line-length int maximum allowed line length (default: 79) -e extension, --extension extension check file extensions of the given type (default: .rst, .txt) -v, --verbose run in verbose mode + --version Show the version and exit. Ini file usage ************** @@ -101,6 +105,7 @@ of conflicts. Option Overrides Merges ===================== =========== ======== ``allow-long-titles`` Yes No +``default-extension`` Yes No ``extension`` No Yes ``ignore-path`` No Yes ``ignore`` No Yes diff --git a/doc8/main.py b/doc8/main.py index a029723..85228d8 100644 --- a/doc8/main.py +++ b/doc8/main.py @@ -109,6 +109,10 @@ def extract_config(args): cfg['verbose'] = parser.getboolean("doc8", "verbose") except (configparser.NoSectionError, configparser.NoOptionError): pass + try: + cfg['default_extension'] = parser.get("doc8", "default-extension") + except (configparser.NoSectionError, configparser.NoOptionError): + pass try: extensions = parser.get("doc8", "extensions") extensions = extensions.split(",") @@ -155,13 +159,16 @@ def scan(cfg): files_ignored = 0 file_iter = utils.find_files(cfg.get('paths', []), cfg.get('extension', []), ignored_paths) + default_extension = cfg.get('default_extension') for filename, ignoreable in file_iter: if ignoreable: files_ignored += 1 if cfg.get('verbose'): print(" Ignoring '%s'" % (filename)) else: - files.append(file_parser.parse(filename)) + f = file_parser.parse(filename, + default_extension=default_extension) + files.append(f) if cfg.get('verbose'): print(" Selecting '%s'" % (filename)) return (files, files_ignored) @@ -263,6 +270,11 @@ def main(): parser.add_argument("--ignore-path", action="append", default=[], help="Ignore the given directory or file (globs" " are supported).", metavar='path') + parser.add_argument("--default-extension", action="store", + help="Default file extension to use when a file is" + " found without a file extension.", + default='', dest='default_extension', + metavar='extension') parser.add_argument("--max-line-length", action="store", metavar="int", type=int, help="Maximum allowed line" diff --git a/doc8/parser.py b/doc8/parser.py index 16d0304..2778af0 100644 --- a/doc8/parser.py +++ b/doc8/parser.py @@ -29,7 +29,7 @@ import six class ParsedFile(object): FALLBACK_ENCODING = 'utf-8' - def __init__(self, filename, encoding=None): + def __init__(self, filename, encoding=None, default_extension=''): self._filename = filename self._content = None self._raw_content = None @@ -40,6 +40,8 @@ class ParsedFile(object): self._has_read = False self._extension = os.path.splitext(filename)[1] self._read_lock = threading.Lock() + if not self._extension: + self._extension = default_extension @property def errors(self): @@ -129,7 +131,9 @@ class ParsedFile(object): len(list(self.lines_iter()))) -def parse(filename, encoding=None): +def parse(filename, encoding=None, default_extension=''): if not os.path.isfile(filename): raise IOError(errno.ENOENT, 'File not found', filename) - return ParsedFile(filename, encoding=encoding) + return ParsedFile(filename, + encoding=encoding, + default_extension=default_extension)