def test_I101_google_style(): base_path = os.path.dirname(__file__) test_case_path = os.path.join(base_path, "test_cases") fullpath = os.path.join(test_case_path, "bad_order_google.py") data = open(fullpath).read() tree = ast.parse(data, fullpath) argv = [ "--application-import-names=flake8_import_order,tests", "--import-order-style=google", ] parser = pycodestyle.get_parser('', '') Linter.add_options(parser) options, args = parser.parse_args(argv) Linter.parse_options(options) checker = Linter(tree, fullpath) codes = [] messages = [] for lineno, col_offset, msg, instance in checker.run(): code, message = msg.split(" ", 1) codes.append(code) messages.append(message) assert codes == ["I101"] assert messages == [ "Imported names are in the wrong order. Should be A, c, D" ]
def pyls_lint(config, workspace, document): # Read config from all over the place config_files = config.find_parents(document.path, CONFIG_FILES) pycodestyle_conf = pyls_config.build_config('pycodestyle', config_files) pep8_conf = pyls_config.build_config('pep8', config_files) conf_to_use = pycodestyle_conf if pycodestyle_conf else pep8_conf conf = {k.replace("-", "_"): v for k, v in conf_to_use.items()} log.debug("Got pycodestyle config: %s", conf) # Grab the pycodestyle parser and set the defaults based on the config we found parser = pycodestyle.get_parser() parser.set_defaults(**conf) opts, _args = parser.parse_args([]) styleguide = pycodestyle.StyleGuide(vars(opts)) c = pycodestyle.Checker(filename=document.uri, lines=document.lines, options=styleguide.options, report=PyCodeStyleDiagnosticReport( styleguide.options)) c.check_all() diagnostics = c.report.diagnostics return diagnostics
def check(self, code, filename): """Run pycodestyle on code and return the output.""" options = {'reporter': self.get_report()} type_map = { 'select': [], 'ignore': [], 'max-line-length': 0, 'max-complexity': 0 } self.build_options(options, type_map, transform=lambda s: s.replace('-', '_')) final_options = options.copy() # Try to read options from pycodestyle default configuration files (.pycodestyle, tox.ini). # If present, they will override the ones defined by Sublime Linter's config. try: # `onError` will be called by `process_options` when no pycodestyle configuration file is found. # Override needed to supress OptionParser.error() output in the default parser. def onError(msg): pass from pycodestyle import process_options, get_parser parser = get_parser() parser.error = onError pycodestyle_options, _ = process_options([os.curdir], True, True, parser=parser) # Merge options only if the pycodestyle config file actually exists; # pycodestyle always returns a config filename, even when it doesn't exist! if os.path.isfile(pycodestyle_options.config): pycodestyle_options = vars(pycodestyle_options) pycodestyle_options.pop('reporter', None) for opt_n, opt_v in pycodestyle_options.items(): if isinstance(final_options.get(opt_n, None), list): final_options[opt_n] += opt_v else: final_options[opt_n] = opt_v except SystemExit: # Catch and ignore parser.error() when no config files are found. pass if persist.debug_mode(): persist.printf('{} ST options: {}'.format(self.name, options)) persist.printf('{} options: {}'.format(self.name, final_options)) checker = self.module.StyleGuide(**final_options) return checker.input_file(filename=os.path.basename(filename), lines=code.splitlines(keepends=True))
def get_parser(): """This returns an instance of optparse.OptionParser with all the extensions registered and options set. This wraps ``pep8.get_parser``. """ (extensions, parser_hooks, options_hooks, ignored) = _register_extensions() details = ', '.join('%s: %s' % ext for ext in extensions) python_version = get_python_version() parser = pep8.get_parser( 'flake8', '%s (%s) %s' % (__version__, details, python_version)) for opt in ('--repeat', '--testsuite', '--doctest'): try: parser.remove_option(opt) except ValueError: pass if multiprocessing: parser.config_options.append('jobs') parser.add_option('-j', '--jobs', type='string', default='auto', help="number of jobs to run simultaneously, " "or 'auto'. This is ignored on Windows.") parser.add_option('--exit-zero', action='store_true', help="exit with code 0 even if there are errors") for parser_hook in parser_hooks: parser_hook(parser) # See comment above regarding why this has to be a callback. parser.add_option('--install-hook', default=False, dest='install_hook', help='Install the appropriate hook for this ' 'repository.', action='callback', callback=callbacks.install_vcs_hook) parser.add_option('--output-file', default=None, help='Redirect report to a file.', type='string', nargs=1, action='callback', callback=callbacks.redirect_stdout) parser.add_option('--enable-extensions', default='', dest='enable_extensions', help='Enable plugins and extensions that are disabled ' 'by default', type='string') parser.config_options.extend(['output-file', 'enable-extensions']) parser.ignored_extensions = ignored return parser, options_hooks
def _get_linter(argv, code, filename): parser = pycodestyle.get_parser('', '') Linter.add_options(parser) options, args = parser.parse_args(argv) Linter.parse_options(options) return Linter( ast.parse( code, filename ), str(filename) )
def test_linter(): argv = ['--application-import-names=flake8_import_order'] parser = pycodestyle.get_parser('', '') Linter.add_options(parser) options, args = parser.parse_args(argv) Linter.parse_options(options) data = 'import ast\nimport flake8_import_order\n' pycodestyle.stdin_get_value = lambda: data tree = ast.parse(data) checker = Linter(tree, None) for lineno, col_offset, msg, instance in checker.run(): assert msg == 'I201 Missing newline before sections or imports.'
def test_linter(): argv = ['--application-import-names=flake8_import_order'] parser = pycodestyle.get_parser('', '') Linter.add_options(parser) options, args = parser.parse_args(argv) Linter.parse_options(options) data = 'import ast\nimport flake8_import_order\n' pycodestyle.stdin_get_value = lambda: data tree = ast.parse(data) checker = Linter(tree, None) for lineno, col_offset, msg, instance in checker.run(): assert msg.startswith( 'I201 Missing newline between import groups.', )
def run(path, code=None, params=None, **meta): """Check code with pycodestyle. :return list: List of errors. """ parser = get_parser() for option in parser.option_list: if option.dest and option.dest in params: value = params[option.dest] if not isinstance(value, str): continue params[option.dest] = option.convert_value(option, params[option.dest]) P8Style = StyleGuide(reporter=_PycodestyleReport, **params) buf = StringIO(code) return P8Style.input_file(path, lines=buf.readlines())
def run(path, code=None, params=None, **meta): """Check code with pycodestyle. :return list: List of errors. """ parser = get_parser() for option in parser.option_list: if option.dest and option.dest in params: value = params[option.dest] if not isinstance(value, str): continue params[option.dest] = option.convert_value( option, params[option.dest]) P8Style = StyleGuide(reporter=_PycodestyleReport, **params) buf = StringIO(code) return P8Style.input_file(path, lines=buf.readlines())
def test_expected_error(tree, filename, expected_codes, expected_messages): argv = ["--gql-introspection-schema=./tests/introspection_schema.json"] parser = pycodestyle.get_parser("", "") Linter.add_options(parser) options, args = parser.parse_args(argv) Linter.parse_options(options) checker = Linter(tree, filename) codes = [] messages = [] for _lineno, _col_offset, msg, _instance in checker.run(): code, message = msg.split(" ", 1) codes.append(code) messages.append(message) assert codes == expected_codes assert set(messages) >= set(expected_messages)
def test_parsing(): style = 'google' import_names = ['flake8_import_order', 'tests'] package_names = ['local_package'] argv = [ "--application-import-names={}".format(','.join(import_names)), "--import-order-style={}".format(style), "--application-package-names={}".format(','.join(package_names)), ] parser = pycodestyle.get_parser('', '') Linter.add_options(parser) options, args = parser.parse_args(argv) Linter.parse_options(options) assert Linter.options['import_order_style'] == style assert Linter.options['application_import_names'] == import_names assert Linter.options['application_package_names'] == package_names
def pyls_lint(config, document): # Read config from all over the place config_files = config.find_parents(document.path, CONFIG_FILES) if pycodestyle.USER_CONFIG: config_files = [pycodestyle.USER_CONFIG] + config_files pycodestyle_conf = pyls_config.build_config('pycodestyle', config_files) pep8_conf = pyls_config.build_config('pep8', config_files) conf_to_use = pycodestyle_conf if pycodestyle_conf else pep8_conf conf = {k.replace("-", "_"): v for k, v in conf_to_use.items()} # Grab the pycodestyle parser and set the defaults based on the config we found parser = pycodestyle.get_parser() parser.set_defaults(**conf) # Override with any options set in the language server config argv = [] ls_conf = config.plugin_settings('pycodestyle') if ls_conf.get('exclude') is not None: argv.extend(['--exclude', ','.join(ls_conf['exclude'])]) if ls_conf.get('filename') is not None: argv.extend(['--filename', ','.join(ls_conf['filename'])]) if ls_conf.get('select') is not None: argv.extend(['--select', ','.join(ls_conf['select'])]) if ls_conf.get('ignore') is not None: argv.extend(['--ignore', ','.join(ls_conf['ignore'])]) if ls_conf.get('maxLineLength') is not None: argv.extend(['--max-line-length', str(ls_conf['maxLineLength'])]) if ls_conf.get('hangClosing'): argv.extend(['--hang-closing']) opts, _args = parser.parse_args(argv) log.debug("Got pycodestyle config: %s", opts) styleguide = pycodestyle.StyleGuide(vars(opts)) c = pycodestyle.Checker(filename=document.uri, lines=document.lines, options=styleguide.options, report=PyCodeStyleDiagnosticReport( styleguide.options)) c.check_all() diagnostics = c.report.diagnostics return diagnostics
def run(path, code=None, params=None, **meta): """Check code with pycodestyle. :return list: List of errors. """ parser = get_parser() for option in parser.option_list: if option.dest and option.dest in params: value = params[option.dest] if isinstance(value, str): params[option.dest] = option.convert_value(option, value) for key in ["filename", "exclude", "select", "ignore"]: if key in params and isinstance(params[key], str): params[key] = _parse_multi_options(params[key]) P8Style = StyleGuide(reporter=_PycodestyleReport, **params) buf = StringIO(code) return P8Style.input_file(path, lines=buf.readlines())
def test_expected_error(tree, filename, expected_codes, expected_messages): argv = [ "--gql-introspection-schema=./tests/introspection_schema.json" ] parser = pycodestyle.get_parser('', '') Linter.add_options(parser) options, args = parser.parse_args(argv) Linter.parse_options(options) checker = Linter(tree, filename) codes = [] messages = [] for lineno, col_offset, msg, instance in checker.run(): code, message = msg.split(" ", 1) codes.append(code) messages.append(message) assert codes == expected_codes assert set(messages) >= set(expected_messages)
def test_parsing(): style = 'google' import_names = ['flake8_import_order', 'tests'] package_names = ['local_package'] argv = [ "--application-import-names={}".format(','.join(import_names)), "--import-order-style={}".format(style), "--application-package-names={}".format(','.join(package_names)), ] parser = pycodestyle.get_parser('', '') Linter.add_options(parser) options, args = parser.parse_args(argv) Linter.parse_options(options) assert Linter.options['import_order_style'].name == style assert Linter.options['import_order_style'].load() is Google assert Linter.options['application_import_names'] == import_names assert Linter.options['application_package_names'] == package_names
def get_parser(): """This returns an instance of optparse.OptionParser with all the extensions registered and options set. This wraps ``pep8.get_parser``. """ (extensions, parser_hooks, options_hooks, ignored) = _register_extensions() details = ', '.join('%s: %s' % ext for ext in extensions) python_version = get_python_version() parser = pep8.get_parser('flake8', '%s (%s) %s' % ( __version__, details, python_version )) for opt in ('--repeat', '--testsuite', '--doctest'): try: parser.remove_option(opt) except ValueError: pass if multiprocessing: parser.config_options.append('jobs') parser.add_option('-j', '--jobs', type='string', default='auto', help="number of jobs to run simultaneously, " "or 'auto'. This is ignored on Windows.") parser.add_option('--exit-zero', action='store_true', help="exit with code 0 even if there are errors") for parser_hook in parser_hooks: parser_hook(parser) # See comment above regarding why this has to be a callback. parser.add_option('--install-hook', default=False, dest='install_hook', help='Install the appropriate hook for this ' 'repository.', action='callback', callback=callbacks.install_vcs_hook) parser.add_option('--output-file', default=None, help='Redirect report to a file.', type='string', nargs=1, action='callback', callback=callbacks.redirect_stdout) parser.add_option('--enable-extensions', default='', dest='enable_extensions', help='Enable plugins and extensions that are disabled ' 'by default', type='string') parser.config_options.extend(['output-file', 'enable-extensions']) parser.ignored_extensions = ignored return parser, options_hooks
def _main(): """Parse options and run checks on Python source.""" import signal # Handle "Broken pipe" gracefully try: signal.signal(signal.SIGPIPE, lambda signum, frame: sys.exit(1)) except AttributeError: pass # not supported on Windows parser = get_parser() parser.add_option("--grade-config", action="append", dest="grade_config") parser.add_option("--max-points", type="float", dest="max_points") style_guide = StyleGuide(parser=parser, parse_argv=True) options = style_guide.options style_guide.init_report(TapErrorReport) report = style_guide.check_files() report.print_results()
def run(self, doc_uri): document = self.workspace.get_document(doc_uri) # Read config from all over the place conf = {k.replace("-", "_"): v for k, v in self.get_config(document)} log.debug("Got pycodestyle config: %s", conf) # Grab the pycodestyle parser and set the defaults based on the config we found parser = pycodestyle.get_parser() parser.set_defaults(**conf) opts, _args = parser.parse_args([]) styleguide = pycodestyle.StyleGuide(vars(opts)) c = pycodestyle.Checker(filename=doc_uri, lines=document.lines, options=styleguide.options, report=PyCodeStyleDiagnosticReport( styleguide.options)) c.check_all() diagnostics = c.report.diagnostics return diagnostics
def run_check(self, ctx: RunContext): # noqa """Check code with pycodestyle.""" params = ctx.get_params("pycodestyle") options = ctx.options if options: params.setdefault("max_line_length", options.max_line_length) if params: parser = get_parser() for option in parser.option_list: if option.dest and option.dest in params: value = params[option.dest] if isinstance(value, str): params[option.dest] = option.convert_value( option, value) style = StyleGuide(reporter=_PycodestyleReport, **params) options = style.options options.report.ctx = ctx # type: ignore checker = Checker(ctx.filename, lines=ctx.lines, options=options) checker.check_all()
def test_expected_error(tree, filename, expected_codes, expected_messages): argv = ["--application-import-names=flake8_import_order,tests"] for style in ['google', 'smarkets', 'pep8']: if style in filename: argv.append('--import-order-style=' + style) break parser = pycodestyle.get_parser('', '') Linter.add_options(parser) options, args = parser.parse_args(argv) Linter.parse_options(options) checker = Linter(tree, filename) codes = [] messages = [] for lineno, col_offset, msg, instance in checker.run(): code, message = msg.split(" ", 1) codes.append(code) messages.append(message) assert codes == expected_codes assert set(messages) >= set(expected_messages)
def test_expected_error(tree, filename, expected_codes, expected_messages): argv = [ "--application-import-names=flake8_import_order,tests" ] for style in ['google', 'smarkets', 'pep8']: if style in filename: argv.append('--import-order-style=' + style) break parser = pycodestyle.get_parser('', '') Linter.add_options(parser) options, args = parser.parse_args(argv) Linter.parse_options(options) checker = Linter(tree, filename) codes = [] messages = [] for lineno, col_offset, msg, instance in checker.run(): code, message = msg.split(" ", 1) codes.append(code) messages.append(message) assert codes == expected_codes assert set(messages) >= set(expected_messages)
# -*- coding: utf-8 -*-
def _get_linter(argv, code, filename): parser = pycodestyle.get_parser('', '') Linter.add_options(parser) options, args = parser.parse_args(argv) Linter.parse_options(options) return Linter(ast.parse(code, filename), str(filename))