From 20f10bbda905b86b32a2b87ad5498624326c6717 Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Mon, 28 Nov 2022 08:38:30 -0600 Subject: [PATCH 01/18] Fix the first (simplest) batch of minor flake8 complaints --- rope/base/codeanalyze.py | 2 +- rope/base/fscommands.py | 2 +- rope/base/oi/doa.py | 2 +- rope/base/pycore.py | 1 - ropetest/advanced_oi_test.py | 2 +- ropetest/contrib/autoimport/utilstest.py | 6 +----- ropetest/refactor/patchedasttest.py | 1 - ropetest/type_hinting_test.py | 4 ++-- setup.py | 2 +- 9 files changed, 8 insertions(+), 14 deletions(-) diff --git a/rope/base/codeanalyze.py b/rope/base/codeanalyze.py index 992ff478c..b5804b012 100644 --- a/rope/base/codeanalyze.py +++ b/rope/base/codeanalyze.py @@ -181,7 +181,7 @@ def logical_line_in(self, line_number): indents = count_line_indents(self.lines.get_line(lineno)) def generate_starts(self, start_line=1, end_line=None): - for start, end in self.generate_regions(start_line, end_line): + for start, _end in self.generate_regions(start_line, end_line): yield start def generate_regions(self, start_line=1, end_line=None): diff --git a/rope/base/fscommands.py b/rope/base/fscommands.py index f69b172e7..8f609b699 100644 --- a/rope/base/fscommands.py +++ b/rope/base/fscommands.py @@ -105,7 +105,7 @@ def __init__(self, root): traceback=False, report_untrusted=False, ) - except: + except Exception: self.ui = self.hg.ui.ui() self.ui.setconfig("ui", "interactive", "no") self.ui.setconfig("ui", "debug", "no") diff --git a/rope/base/oi/doa.py b/rope/base/oi/doa.py index 92dbd5140..2ec6a7fc8 100644 --- a/rope/base/oi/doa.py +++ b/rope/base/oi/doa.py @@ -188,7 +188,7 @@ def receive_data(self): buf_digest = base64.b64decode(buf[:digest_end]) buf_data = buf[digest_end + 1 : -1] decoded_buf_data = base64.b64decode(buf_data) - except: + except Exception: # Corrupted data; the payload cannot be trusted and just has # to be dropped. See CVE-2014-3539. continue diff --git a/rope/base/pycore.py b/rope/base/pycore.py index d41aaf117..7428bc1ee 100644 --- a/rope/base/pycore.py +++ b/rope/base/pycore.py @@ -1,6 +1,5 @@ import bisect import difflib -import sys import warnings import rope.base.libutils diff --git a/ropetest/advanced_oi_test.py b/ropetest/advanced_oi_test.py index ee9f997f8..6bbf96d9a 100644 --- a/ropetest/advanced_oi_test.py +++ b/ropetest/advanced_oi_test.py @@ -1052,7 +1052,7 @@ def test_validation_problems_for_changing_builtin_types(self): l = {} v = l["key"] """)) - pymod1 = self.project.get_pymodule(mod1) # noqa + pymod1 = self.project.get_pymodule(mod1) var = pymod1["v"].get_object() # noqa def test_always_returning_containing_class_for_selfs(self): diff --git a/ropetest/contrib/autoimport/utilstest.py b/ropetest/contrib/autoimport/utilstest.py index 91e1622f4..0c818cd8c 100644 --- a/ropetest/contrib/autoimport/utilstest.py +++ b/ropetest/contrib/autoimport/utilstest.py @@ -1,9 +1,5 @@ """Tests for autoimport utility functions, written in pytest""" -from sys import platform - -import pytest - from rope.contrib.autoimport import utils from rope.contrib.autoimport.defs import Package, PackageType, Source @@ -59,5 +55,5 @@ def test_get_package_tuple_typing(typing_path): def test_get_package_tuple_compiled(compiled_lib): lib_name, lib_path = compiled_lib assert Package( - lib_name, Source.STANDARD, lib_path, PackageType.COMPILED + lib_name, Source.STANDARD, lib_path, PackageType.COMPILED ) == utils.get_package_tuple(lib_path) diff --git a/ropetest/refactor/patchedasttest.py b/ropetest/refactor/patchedasttest.py index 25298c453..5ea9eb9b5 100644 --- a/ropetest/refactor/patchedasttest.py +++ b/ropetest/refactor/patchedasttest.py @@ -1558,7 +1558,6 @@ def test_match_node_with_match_class_match_as_capture_pattern_with_explicit_name ")", ]) - @testutils.only_for_versions_higher("3.10") def test_match_node_with_match_mapping_match_as(self): source = dedent("""\ diff --git a/ropetest/type_hinting_test.py b/ropetest/type_hinting_test.py index 739a0abde..af94352fb 100644 --- a/ropetest/type_hinting_test.py +++ b/ropetest/type_hinting_test.py @@ -1,5 +1,4 @@ import unittest -from textwrap import dedent from textwrap import dedent, indent import pytest @@ -173,7 +172,8 @@ class Sample(object): def a_method(self): self.a_attr.is_a""") offset = len(code) - code += dedent(f"""\ + # Note: the leading blank lines are required. + code += dedent("""\ class Other(object): diff --git a/setup.py b/setup.py index fc1f76c84..606849326 100644 --- a/setup.py +++ b/setup.py @@ -1,3 +1,3 @@ from setuptools import setup -setup() \ No newline at end of file +setup() From bd36aef3c67463db0f60a4c25febeefaf736e5a1 Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Mon, 28 Nov 2022 09:10:40 -0600 Subject: [PATCH 02/18] Fix a potential crasher apparently not caught by a unit test --- rope/refactor/extract.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rope/refactor/extract.py b/rope/refactor/extract.py index 0b5c1d45f..67beb70c2 100644 --- a/rope/refactor/extract.py +++ b/rope/refactor/extract.py @@ -949,7 +949,7 @@ def _handle_loop_context(self, node): def _get_argnames(arguments): result = [node.arg for node in arguments.args if isinstance(node, ast.arg)] if arguments.vararg: - result.append(vararg.arg) + result.append(arguments.vararg.arg) if arguments.kwarg: result.append(arguments.kwarg.arg) return result From 6d35a19636050e12f7b51e9262d919966546d9fc Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Mon, 28 Nov 2022 09:11:41 -0600 Subject: [PATCH 03/18] Removed an unnecessary '# noqa' --- rope/base/pyobjectsdef.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rope/base/pyobjectsdef.py b/rope/base/pyobjectsdef.py index 9069dab0c..59cb2c6ce 100644 --- a/rope/base/pyobjectsdef.py +++ b/rope/base/pyobjectsdef.py @@ -455,7 +455,7 @@ def _AugAssign(self, node): pass def _For(self, node): - self._update_evaluated(node.target, node.iter, ".__iter__().next()") # noqa + self._update_evaluated(node.target, node.iter, ".__iter__().next()") for child in node.body + node.orelse: ast.walk(child, self) From db75d42b81c64f6a675980a8424a24b123431b67 Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Mon, 28 Nov 2022 17:05:29 -0600 Subject: [PATCH 04/18] Add .pylintrc. Suppress pylint complaint in project.py --- .pylintrc | 207 +++++++++++++++++++++++++++++++++++++++++++ rope/base/project.py | 2 +- 2 files changed, 208 insertions(+), 1 deletion(-) create mode 100644 .pylintrc diff --git a/.pylintrc b/.pylintrc new file mode 100644 index 000000000..3750041b4 --- /dev/null +++ b/.pylintrc @@ -0,0 +1,207 @@ +# An experimental settings file for pylint and rope. + +[MASTER] + +# Add to the black list. A base name, not a path. +ignore= + .git + +# Files or directories matching regex, in Windows or Posix format. +ignore-paths= + +# Pickle collected data for later comparisons. +persistent=yes + +[MESSAGES CONTROL] + +# Enable the message, report, category or checker with the given id(s). +# enable= + +# Disable the message, report, category or checker with the given id(s). +disable= + + # Catagories to disable: expensive or make-work + # typecheck + + basic, # Check on names. Unimportant. + classes, # Unimportant. + design, # Make work. + format, # Use black + imports, # Creates import graph. Expensive? + similarities, # Expensive. + typecheck, # Unimportant + variables, # Unimportant. + + # Black. Suppress checks that conflict with Black's conventions. + + line-too-long, + + # Rope: Suppress checks that conflict with Rope's conventions. + + bad-classmethod-argument, + eval-used, + function-redefined, + inconsistent-return-statements, + invalid-name, + no-else-return, + no-self-argument, + signature-differs, # Maybe. + not-callable, # Maybe. + unexpected-special-method-signature, + + # Rope: potentially serious warnings. + + arguments-differ, + dangerous-default-value, + modified-iterating-list, + used-before-assignment, + unsubscriptable-object, + unpacking-non-sequence, + + # Rope: to be removed. + + duplicate-string-formatting-argument, + no-else-raise, # Unnecessary "else" after "raise", remove the "else" and de-indent the code inside it. + reimported, + superfluous-parens, + unused-import, + unused-wildcard-import, + useless-super-delegation, + + useless-else-on-loop, #Else clause on loop without a break statement, remove the else and de-indent all the code inside it. + unidiomatic-typecheck, + wildcard-import, + wrong-import-order, + + # Rope: Additional (temporary?) suppressions. + + abstract-method, + arguments-differ, + consider-merging-isinstance, + consider-using-enumerate, + deprecated-method, + implicit-str-concat, + logging-fstring-interpolation, + no-member, + no-staticmethod-decorator, # Consider using a decorator instead of calling staticmethod. + non-parent-init-called, + raise-missing-from, + super-init-not-called, + unnecessary-lambda, + unsupported-assignment-operation, + + # Leo: Standard suppressions. + + arguments-renamed, # cursesGui2.py + assignment-from-no-return, # Causes problems when base class return None. + assignment-from-none, # Causes problems when base class return None. + attribute-defined-outside-init, + broad-except, # except Exception is justified if followed by g.es_exception. + c-extension-no-member, # Too many errors re pyQt6. + condition-evals-to-constant, + consider-iterating-dictionary, + consider-using-from-import, + consider-using-f-string, # complains about regex's! + consider-using-in, + consider-using-dict-comprehension, + consider-using-dict-items, + consider-using-generator, + consider-using-max-builtin, + consider-using-set-comprehension, + consider-using-ternary, + consider-using-with, + cyclic-import, + deprecated-module, + exec-used, + f-string-without-interpolation, # Useful for concatenated f-strings. + global-statement, # Assume we know what we are doing. + global-variable-not-assigned, # not helpful. + import-error, # Ignore imports of optional packages. + import-outside-toplevel, # Requires substantial code changes. + keyword-arg-before-vararg, # See https://github.com/PyCQA/pylint/issues/2027 + missing-docstring, # Instead, use Leo's find-missing-docstrings command. + no-else-break, # **Possible pylint bug** + protected-access, + redeclared-assigned-name, + redefined-argument-from-local, # I do this all the time. + redefined-builtin, # all, next, etc. so what? + redefined-outer-name, + too-few-public-methods, + trailing-whitespace, # Too picky. No need to constantly do clean-all-lines. + unnecessary-comprehension, + unnecessary-dunder-call, # pylint for python 3.10 only. + unnecessary-lambda-assignment, + unnecessary-pass, # Can be pedantic in some situations. + unspecified-encoding, # Huh? + unused-argument, + unused-private-member, # too many false positives. + unused-variable, # way too many false positives, esp. tuple unpacking. + use-dict-literal, + use-list-literal, + use-maxsplit-arg, # What is this?? + using-constant-test, + + # Good warnings. Don't suppress these. + + # bad-option-value, # obsolete pylint option. + # unrecognized-option, # newer python. + + # bad-builtin, + # bad-continuation, + # bad-option-value, # obsolete pylint option. + # chained-comparison, + # len-as-condition, + # import-error, # Warns when an import fails: useful now that we are only using python 3. + # literal-comparison, + # locally-disabled, + # multiple-statements, + # no-else-raise, + # no-init, + # no-value-for-parameter, + # not-an-iterable, + # old-style-class, # Probably not an issue. + # simplifiable-if-statement, + # singleton-comparison, + # superfluous-parens, + # trailing-comma-tuple, + # unsupported-assignment-operation, + # unsupported-delete-operation, + # unsubscriptable-object, + # useless-object-inheritance, # class x(object): + # useless-return, + +[REPORTS] + +# Set the output format. Multiple values are allowed. +output-format=text # colorized, text, parseable, msvs (visual studio) + +reports=no # Display only messages. + +score=no # Deactivate the evaluation score. + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +# notes=FIXME,XXX,TODO +notes= + +# The following sections are all suppressed above. + +[BASIC] + +[CLASSES] + +[DESIGN] + +# Maximum number of nested blocks for function / method body +max-nested-blocks=10 # Apparently, this can't be suppressed! + +[FORMAT] + +[IMPORTS] + +[SIMILARITIES] + +[TYPECHECK] + +[VARIABLES] diff --git a/rope/base/project.py b/rope/base/project.py index a643dbdd1..8e7124c05 100644 --- a/rope/base/project.py +++ b/rope/base/project.py @@ -273,7 +273,7 @@ def _init_prefs(self, prefs): def _init_other_parts(self): # Forcing the creation of `self.pycore` to register observers - self.pycore + self.pycore # pylint: disable=pointless-statement def is_ignored(self, resource): return self.ignored.does_match(resource) From b0e3ef073fa155909391648ce6d378429ead8d65 Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Tue, 29 Nov 2022 00:47:07 -0600 Subject: [PATCH 05/18] Improve opening comments --- .pylintrc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.pylintrc b/.pylintrc index 3750041b4..37c0c6108 100644 --- a/.pylintrc +++ b/.pylintrc @@ -1,4 +1,11 @@ -# An experimental settings file for pylint and rope. +# A settings file for running pylint on Rope + +# From the top-level Rope directory: `python -m pylint rope` + +# Developed with Python 3.10. `python -m pylint --version` reports: +# pylint 2.14.4 +# astroid 2.11.6 +# Python 3.10.5 (tags/v3.10.5:f377153, Jun 6 2022, 16:14:13) [MSC v.1929 64 bit (AMD64)] [MASTER] From 7298879d765788a4c0aebb22e6fc0f1426371e37 Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Tue, 29 Nov 2022 00:52:08 -0600 Subject: [PATCH 06/18] Still better opening comments --- .pylintrc | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/.pylintrc b/.pylintrc index 37c0c6108..c6c315de6 100644 --- a/.pylintrc +++ b/.pylintrc @@ -1,11 +1,8 @@ -# A settings file for running pylint on Rope +# A settings file for running pylint on Rope. -# From the top-level Rope directory: `python -m pylint rope` +# Run pylint from the top-level Rope directory: `python -m pylint rope` -# Developed with Python 3.10. `python -m pylint --version` reports: -# pylint 2.14.4 -# astroid 2.11.6 -# Python 3.10.5 (tags/v3.10.5:f377153, Jun 6 2022, 16:14:13) [MSC v.1929 64 bit (AMD64)] +# This file tested on pylint 2.14.4, Python 3.10.5, as reported by `python -m pylint --version`. [MASTER] From 84682700a3925d58d4cb17be6c97a12cee4e5f60 Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Tue, 29 Nov 2022 06:38:40 -0600 Subject: [PATCH 07/18] Fix B007: Loop control variable 'whatever' not used within the loop body --- rope/base/history.py | 4 ++-- rope/base/oi/type_hinting/providers/numpydocstrings.py | 2 +- rope/base/project.py | 2 +- rope/contrib/changestack.py | 2 +- rope/contrib/generate.py | 2 +- rope/refactor/importutils/module_imports.py | 2 +- rope/refactor/move.py | 2 +- rope/refactor/patchedast.py | 6 +++--- ropetest/testutils.py | 2 +- 9 files changed, 12 insertions(+), 12 deletions(-) diff --git a/rope/base/history.py b/rope/base/history.py index cbfc692db..f868208f9 100644 --- a/rope/base/history.py +++ b/rope/base/history.py @@ -106,7 +106,7 @@ def _find_dependencies(self, change_list, change): return _FindChangeDependencies(change_list[index:])() def _perform_undos(self, count, task_handle): - for i in range(count): + for _i in range(count): self.current_change = self.undo_list[-1] try: job_set = change.create_job_set(task_handle, self.current_change) @@ -116,7 +116,7 @@ def _perform_undos(self, count, task_handle): self.redo_list.append(self.undo_list.pop()) def _perform_redos(self, count, task_handle): - for i in range(count): + for _i in range(count): self.current_change = self.redo_list[-1] try: job_set = change.create_job_set(task_handle, self.current_change) diff --git a/rope/base/oi/type_hinting/providers/numpydocstrings.py b/rope/base/oi/type_hinting/providers/numpydocstrings.py index dec290195..6b4238f28 100644 --- a/rope/base/oi/type_hinting/providers/numpydocstrings.py +++ b/rope/base/oi/type_hinting/providers/numpydocstrings.py @@ -19,7 +19,7 @@ def __call__(self, docstring, param_name): if not docstring: return [] params = NumpyDocString(docstring)._parsed_data["Parameters"] - for p_name, p_type, p_descr in params: + for p_name, p_type, _p_descr in params: if p_name == param_name: m = re.match("([^,]+(,[^,]+)*?)(,[ ]*optional)?$", p_type) if m: diff --git a/rope/base/project.py b/rope/base/project.py index 8e7124c05..145ca738f 100644 --- a/rope/base/project.py +++ b/rope/base/project.py @@ -156,7 +156,7 @@ def find_module(self, modname, folder=None): return None def find_relative_module(self, modname, folder, level): - for i in range(level - 1): + for _i in range(level - 1): folder = folder.parent if modname == "": return folder diff --git a/rope/contrib/changestack.py b/rope/contrib/changestack.py index 9b48cbd25..1bec57206 100644 --- a/rope/contrib/changestack.py +++ b/rope/contrib/changestack.py @@ -32,7 +32,7 @@ def push(self, changes): self.project.do(changes) def pop_all(self): - for i in range(len(self.stack)): + for _i in range(len(self.stack)): self.project.history.undo(drop=True) def merged(self): diff --git a/rope/contrib/generate.py b/rope/contrib/generate.py index 0d6b91e35..4cac5e1ad 100644 --- a/rope/contrib/generate.py +++ b/rope/contrib/generate.py @@ -372,7 +372,7 @@ def get_passed_args(self): result.append(arg) else: result.append("arg%d" % len(result)) - for name, value in keywords: + for name, _value in keywords: result.append(name) return result diff --git a/rope/refactor/importutils/module_imports.py b/rope/refactor/importutils/module_imports.py index 67a42f2ce..39cb718f6 100644 --- a/rope/refactor/importutils/module_imports.py +++ b/rope/refactor/importutils/module_imports.py @@ -574,7 +574,7 @@ def _get_names(self, alias_names): def find_import_statements(self): nodes = self.pymodule.get_ast().body - for index, node in enumerate(nodes): + for node in nodes: if isinstance(node, (ast.Import, ast.ImportFrom)): lines = self.pymodule.logical_lines end_line = lines.logical_line_in(node.lineno)[1] + 1 diff --git a/rope/refactor/move.py b/rope/refactor/move.py index 4e9aea1dd..24c3d0ea3 100644 --- a/rope/refactor/move.py +++ b/rope/refactor/move.py @@ -706,7 +706,7 @@ def rename_in_module(self, new_name, pymodule=None, imports=False, resource=None def occurs_in_module(self, pymodule=None, resource=None, imports=True): finder = self._create_finder(imports) - for occurrence in finder.find_occurrences(pymodule=pymodule, resource=resource): + for _occurrence in finder.find_occurrences(pymodule=pymodule, resource=resource): return True return False diff --git a/rope/refactor/patchedast.py b/rope/refactor/patchedast.py index 7ffa8de87..f6df40130 100644 --- a/rope/refactor/patchedast.py +++ b/rope/refactor/patchedast.py @@ -184,13 +184,13 @@ def _handle_parens(self, children, start, formats): opens, closes = self._count_needed_parens(formats) old_end = self.source.offset new_end = None - for i in range(closes): + for _i in range(closes): new_end = self.source.consume(")")[1] if new_end is not None: if self.children: children.append(self.source[old_end:new_end]) new_start = start - for i in range(opens): + for _i in range(opens): new_start = self.source.rfind_token("(", 0, new_start) if new_start != start: if self.children: @@ -921,7 +921,7 @@ def consume(self, token, skip_comment=True): break else: self._skip_comment() - except (ValueError, TypeError) as e: + except (ValueError, TypeError) as e: # noqa raise MismatchedTokenError( f"Token <{token}> at {self._get_location()} cannot be matched" ) diff --git a/ropetest/testutils.py b/ropetest/testutils.py index 91ed4d437..425700e7a 100644 --- a/ropetest/testutils.py +++ b/ropetest/testutils.py @@ -51,7 +51,7 @@ def remove_recursively(path): # windows sometimes raises exceptions instead of removing files if os.name == "nt" or sys.platform == "cygwin": - for i in range(12): + for _i in range(12): try: _remove_recursively(path) except OSError as e: From 975c2f4473acaeb15bca9d97d7566d6936b3f443 Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Tue, 29 Nov 2022 06:49:10 -0600 Subject: [PATCH 08/18] Fix B009: Do not call getattr with a constant attribute value, it is not any safer than normal property access. --- rope/base/pyobjectsdef.py | 2 +- rope/refactor/patchedast.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rope/base/pyobjectsdef.py b/rope/base/pyobjectsdef.py index 9afe778b8..05f83c340 100644 --- a/rope/base/pyobjectsdef.py +++ b/rope/base/pyobjectsdef.py @@ -106,7 +106,7 @@ def get_kind(self): @property def decorators(self): try: - return getattr(self.ast_node, "decorator_list") + return self.ast_node.decorator_list except AttributeError: return getattr(self.ast_node, "decorators", None) diff --git a/rope/refactor/patchedast.py b/rope/refactor/patchedast.py index f6df40130..6f224ce75 100644 --- a/rope/refactor/patchedast.py +++ b/rope/refactor/patchedast.py @@ -535,7 +535,7 @@ def _alias(self, node): def _handle_function_def_node(self, node, is_async): children = [] try: - decorators = getattr(node, "decorator_list") + decorators = node.decorator_list except AttributeError: decorators = getattr(node, "decorators", None) if decorators: From 86503e4fd77e0b9b420f9f3d1bdff86379c35cba Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Tue, 29 Nov 2022 06:59:44 -0600 Subject: [PATCH 09/18] Fix B011 --- rope/refactor/extract.py | 2 +- rope/refactor/patchedast.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rope/refactor/extract.py b/rope/refactor/extract.py index 529ee71f7..532532f0f 100644 --- a/rope/refactor/extract.py +++ b/rope/refactor/extract.py @@ -902,7 +902,7 @@ def _flatten_nested_tuple_of_names(self, node): elif isinstance(node, ast.Name): yield node.id else: - assert False, "Unexpected node type in list comprehension target: %s" % node + raise AssertionError(f"Unexpected node type in list comprehension target: {node!r}") def _If(self, node): self._handle_conditional_node(node) diff --git a/rope/refactor/patchedast.py b/rope/refactor/patchedast.py index 6f224ce75..583bdfc83 100644 --- a/rope/refactor/patchedast.py +++ b/rope/refactor/patchedast.py @@ -395,7 +395,7 @@ def _Constant(self, node): self._handle(node, ["..."]) return - assert False + raise AssertionError(f"unknown node.value: {node.value!r}") def _Num(self, node): self._handle(node, [self.Number]) From 23188bc5fe3479cea1f48531e794502466eedcfa Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Tue, 29 Nov 2022 08:15:27 -0600 Subject: [PATCH 10/18] blacken --- rope/refactor/extract.py | 4 +++- rope/refactor/move.py | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/rope/refactor/extract.py b/rope/refactor/extract.py index 532532f0f..fea7ac471 100644 --- a/rope/refactor/extract.py +++ b/rope/refactor/extract.py @@ -902,7 +902,9 @@ def _flatten_nested_tuple_of_names(self, node): elif isinstance(node, ast.Name): yield node.id else: - raise AssertionError(f"Unexpected node type in list comprehension target: {node!r}") + raise AssertionError( + f"Unexpected node type in list comprehension target: {node!r}" + ) def _If(self, node): self._handle_conditional_node(node) diff --git a/rope/refactor/move.py b/rope/refactor/move.py index 24c3d0ea3..08dfd9c82 100644 --- a/rope/refactor/move.py +++ b/rope/refactor/move.py @@ -706,7 +706,9 @@ def rename_in_module(self, new_name, pymodule=None, imports=False, resource=None def occurs_in_module(self, pymodule=None, resource=None, imports=True): finder = self._create_finder(imports) - for _occurrence in finder.find_occurrences(pymodule=pymodule, resource=resource): + for _occurrence in finder.find_occurrences( + pymodule=pymodule, resource=resource + ): return True return False From d1b078bc5fdb38887ec6bdc5ff716cd067c9682e Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Wed, 30 Nov 2022 13:14:12 -0600 Subject: [PATCH 11/18] Add suppressions to suppress all flake8 messages --- setup.cfg | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/setup.cfg b/setup.cfg index 84bae7b71..8b5d0f81c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -8,6 +8,21 @@ extend-ignore = # E203: whitespace before ':' # this rule contradicts black codestyle E203 + + # Temporary extra suppressions, to be removed asap. + + B006 # Do not use mutable data structures for argument defaults. + B008 # Do not perform function calls in argument defaults. + B020 # Found for loop that reassigns the iterable it is iterating with each iterable value. + + E731 # do not assign a lambda expression, use a def + E741 # ambiguous variable name 'l' + + F401 # 'ast.*' imported but unused + F402 # import 'change' from line 1 shadowed by loop variable + F403 # 'from ast import *' used; unable to detect undefined names + F405 # 'utils' may be undefined, or defined from star imports: rope.base.pynames + F811 # redefinition of unused 'whatever' max-line-length = 110 From 4739b79a6e8909dffd852c4b3f439c9d4942d78a Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Wed, 30 Nov 2022 13:25:33 -0600 Subject: [PATCH 12/18] Change _MoveTools.occurs_in_module per lieryan's suggestion. All tests pass --- rope/refactor/move.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/rope/refactor/move.py b/rope/refactor/move.py index 08dfd9c82..b283c6260 100644 --- a/rope/refactor/move.py +++ b/rope/refactor/move.py @@ -706,11 +706,8 @@ def rename_in_module(self, new_name, pymodule=None, imports=False, resource=None def occurs_in_module(self, pymodule=None, resource=None, imports=True): finder = self._create_finder(imports) - for _occurrence in finder.find_occurrences( - pymodule=pymodule, resource=resource - ): - return True - return False + occurrences = finder.find_occurrences(pymodule=pymodule, resource=resource) + return any(True for _ in occurrences) def _create_finder(self, imports): return occurrences.create_finder( From ad9c23ed1297932898eba544ee360227169ddc02 Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Wed, 30 Nov 2022 13:28:23 -0600 Subject: [PATCH 13/18] Use lieryan's second suggestion --- rope/refactor/move.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rope/refactor/move.py b/rope/refactor/move.py index b283c6260..c4ccd8970 100644 --- a/rope/refactor/move.py +++ b/rope/refactor/move.py @@ -707,7 +707,8 @@ def rename_in_module(self, new_name, pymodule=None, imports=False, resource=None def occurs_in_module(self, pymodule=None, resource=None, imports=True): finder = self._create_finder(imports) occurrences = finder.find_occurrences(pymodule=pymodule, resource=resource) - return any(True for _ in occurrences) + sentinel = object() + return next(occurrences, sentinel) is not sentinel def _create_finder(self, imports): return occurrences.create_finder( From e560a088f07395bc0bd308fc5d7d754345e0d05d Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Thu, 1 Dec 2022 05:10:52 -0600 Subject: [PATCH 14/18] Restore setup.cfg from master --- setup.cfg | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/setup.cfg b/setup.cfg index 8b5d0f81c..84bae7b71 100644 --- a/setup.cfg +++ b/setup.cfg @@ -8,21 +8,6 @@ extend-ignore = # E203: whitespace before ':' # this rule contradicts black codestyle E203 - - # Temporary extra suppressions, to be removed asap. - - B006 # Do not use mutable data structures for argument defaults. - B008 # Do not perform function calls in argument defaults. - B020 # Found for loop that reassigns the iterable it is iterating with each iterable value. - - E731 # do not assign a lambda expression, use a def - E741 # ambiguous variable name 'l' - - F401 # 'ast.*' imported but unused - F402 # import 'change' from line 1 shadowed by loop variable - F403 # 'from ast import *' used; unable to detect undefined names - F405 # 'utils' may be undefined, or defined from star imports: rope.base.pynames - F811 # redefinition of unused 'whatever' max-line-length = 110 From c364775d38ff41fefb2a3ebef0de1be723819658 Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Thu, 1 Dec 2022 05:43:17 -0600 Subject: [PATCH 15/18] Fix 'ambiguous name' complaint --- rope/base/pyscopes.py | 8 ++++---- rope/refactor/sourceutils.py | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/rope/base/pyscopes.py b/rope/base/pyscopes.py index 9f13bc40c..74e16b415 100644 --- a/rope/base/pyscopes.py +++ b/rope/base/pyscopes.py @@ -328,14 +328,14 @@ def find_scope_end(self, scope): body_indents = self._get_scope_indents(scope) + 4 else: body_indents = self._get_body_indents(scope) - for l in self.logical_lines.generate_starts( + for line_start in self.logical_lines.generate_starts( min(end + 1, self.lines.length()), self.lines.length() + 1 ): - if not self._is_empty_line(l): - if self.get_indents(l) < body_indents: + if not self._is_empty_line(line_start): + if self.get_indents(line_start) < body_indents: return end else: - end = l + end = line_start return end @property diff --git a/rope/refactor/sourceutils.py b/rope/refactor/sourceutils.py index 27116b60a..d55aad4c9 100644 --- a/rope/refactor/sourceutils.py +++ b/rope/refactor/sourceutils.py @@ -20,15 +20,15 @@ def indent_lines(source_code, amount): return source_code lines = source_code.splitlines(True) result = [] - for l in lines: - if l.strip() == "": + for line in lines: + if line.strip() == "": result.append("\n") continue if amount < 0: - indents = codeanalyze.count_line_indents(l) - result.append(max(0, indents + amount) * " " + l.lstrip()) + indents = codeanalyze.count_line_indents(line) + result.append(max(0, indents + amount) * " " + line.lstrip()) else: - result.append(" " * amount + l) + result.append(" " * amount + line) return "".join(result) From 20b331e7babd64f76308a9d8cc14ea37eb3414d0 Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Fri, 2 Dec 2022 13:55:37 -0600 Subject: [PATCH 16/18] Restore assert statements, using an f-string for one of them --- rope/refactor/extract.py | 4 +--- rope/refactor/patchedast.py | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/rope/refactor/extract.py b/rope/refactor/extract.py index 3a859ab1d..7c9edda64 100644 --- a/rope/refactor/extract.py +++ b/rope/refactor/extract.py @@ -902,9 +902,7 @@ def _flatten_nested_tuple_of_names(self, node): elif isinstance(node, ast.Name): yield node.id else: - raise AssertionError( - f"Unexpected node type in list comprehension target: {node!r}" - ) + assert False, f"Unexpected node type in list comprehension target: {node!r}" def _If(self, node): self._handle_conditional_node(node) diff --git a/rope/refactor/patchedast.py b/rope/refactor/patchedast.py index 85621e580..c84d188be 100644 --- a/rope/refactor/patchedast.py +++ b/rope/refactor/patchedast.py @@ -394,7 +394,7 @@ def _Constant(self, node): self._handle(node, ["..."]) return - raise AssertionError(f"unknown node.value: {node.value!r}") + assert False def _Num(self, node): self._handle(node, [self.Number]) From b0f2062275ece3626dbcec37de2f405de68d0b3e Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Fri, 2 Dec 2022 16:21:00 -0600 Subject: [PATCH 17/18] Suppress flake8 B007 test and remove recently added underscores for loop vars --- rope/base/codeanalyze.py | 2 +- rope/base/history.py | 4 ++-- rope/base/oi/type_hinting/providers/numpydocstrings.py | 2 +- rope/base/project.py | 2 +- rope/contrib/changestack.py | 2 +- rope/contrib/generate.py | 2 +- rope/refactor/patchedast.py | 4 ++-- ropetest/testutils.py | 2 +- setup.cfg | 4 ++++ 9 files changed, 14 insertions(+), 10 deletions(-) diff --git a/rope/base/codeanalyze.py b/rope/base/codeanalyze.py index b5804b012..992ff478c 100644 --- a/rope/base/codeanalyze.py +++ b/rope/base/codeanalyze.py @@ -181,7 +181,7 @@ def logical_line_in(self, line_number): indents = count_line_indents(self.lines.get_line(lineno)) def generate_starts(self, start_line=1, end_line=None): - for start, _end in self.generate_regions(start_line, end_line): + for start, end in self.generate_regions(start_line, end_line): yield start def generate_regions(self, start_line=1, end_line=None): diff --git a/rope/base/history.py b/rope/base/history.py index f868208f9..cbfc692db 100644 --- a/rope/base/history.py +++ b/rope/base/history.py @@ -106,7 +106,7 @@ def _find_dependencies(self, change_list, change): return _FindChangeDependencies(change_list[index:])() def _perform_undos(self, count, task_handle): - for _i in range(count): + for i in range(count): self.current_change = self.undo_list[-1] try: job_set = change.create_job_set(task_handle, self.current_change) @@ -116,7 +116,7 @@ def _perform_undos(self, count, task_handle): self.redo_list.append(self.undo_list.pop()) def _perform_redos(self, count, task_handle): - for _i in range(count): + for i in range(count): self.current_change = self.redo_list[-1] try: job_set = change.create_job_set(task_handle, self.current_change) diff --git a/rope/base/oi/type_hinting/providers/numpydocstrings.py b/rope/base/oi/type_hinting/providers/numpydocstrings.py index 6b4238f28..dec290195 100644 --- a/rope/base/oi/type_hinting/providers/numpydocstrings.py +++ b/rope/base/oi/type_hinting/providers/numpydocstrings.py @@ -19,7 +19,7 @@ def __call__(self, docstring, param_name): if not docstring: return [] params = NumpyDocString(docstring)._parsed_data["Parameters"] - for p_name, p_type, _p_descr in params: + for p_name, p_type, p_descr in params: if p_name == param_name: m = re.match("([^,]+(,[^,]+)*?)(,[ ]*optional)?$", p_type) if m: diff --git a/rope/base/project.py b/rope/base/project.py index 145ca738f..8e7124c05 100644 --- a/rope/base/project.py +++ b/rope/base/project.py @@ -156,7 +156,7 @@ def find_module(self, modname, folder=None): return None def find_relative_module(self, modname, folder, level): - for _i in range(level - 1): + for i in range(level - 1): folder = folder.parent if modname == "": return folder diff --git a/rope/contrib/changestack.py b/rope/contrib/changestack.py index 1bec57206..9b48cbd25 100644 --- a/rope/contrib/changestack.py +++ b/rope/contrib/changestack.py @@ -32,7 +32,7 @@ def push(self, changes): self.project.do(changes) def pop_all(self): - for _i in range(len(self.stack)): + for i in range(len(self.stack)): self.project.history.undo(drop=True) def merged(self): diff --git a/rope/contrib/generate.py b/rope/contrib/generate.py index 4cac5e1ad..0d6b91e35 100644 --- a/rope/contrib/generate.py +++ b/rope/contrib/generate.py @@ -372,7 +372,7 @@ def get_passed_args(self): result.append(arg) else: result.append("arg%d" % len(result)) - for name, _value in keywords: + for name, value in keywords: result.append(name) return result diff --git a/rope/refactor/patchedast.py b/rope/refactor/patchedast.py index c84d188be..c545f1a6f 100644 --- a/rope/refactor/patchedast.py +++ b/rope/refactor/patchedast.py @@ -183,13 +183,13 @@ def _handle_parens(self, children, start, formats): opens, closes = self._count_needed_parens(formats) old_end = self.source.offset new_end = None - for _i in range(closes): + for i in range(closes): new_end = self.source.consume(")")[1] if new_end is not None: if self.children: children.append(self.source[old_end:new_end]) new_start = start - for _i in range(opens): + for i in range(opens): new_start = self.source.rfind_token("(", 0, new_start) if new_start != start: if self.children: diff --git a/ropetest/testutils.py b/ropetest/testutils.py index 425700e7a..91ed4d437 100644 --- a/ropetest/testutils.py +++ b/ropetest/testutils.py @@ -51,7 +51,7 @@ def remove_recursively(path): # windows sometimes raises exceptions instead of removing files if os.name == "nt" or sys.platform == "cygwin": - for _i in range(12): + for i in range(12): try: _remove_recursively(path) except OSError as e: diff --git a/setup.cfg b/setup.cfg index 84bae7b71..f90d1ecf7 100644 --- a/setup.cfg +++ b/setup.cfg @@ -8,6 +8,10 @@ extend-ignore = # E203: whitespace before ':' # this rule contradicts black codestyle E203 + + # B007: Loop control variable 'keyword' not used within the loop body. + # If this is intended, start the name with an underscore. + B007 max-line-length = 110 From ddbb9577495a19584a8dfa7e58ce38dc9d972e58 Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Fri, 2 Dec 2022 16:32:46 -0600 Subject: [PATCH 18/18] Suppress flake8 B011 warning --- setup.cfg | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/setup.cfg b/setup.cfg index f90d1ecf7..18cc2fd8a 100644 --- a/setup.cfg +++ b/setup.cfg @@ -12,6 +12,10 @@ extend-ignore = # B007: Loop control variable 'keyword' not used within the loop body. # If this is intended, start the name with an underscore. B007 + + # B011: Do not call assert False since python -O removes these calls. + # Instead callers should raise AssertionError(). + B011 max-line-length = 110