Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-flake8-bugbear for
openSUSE:Factory checked in at 2023-09-20 13:26:01
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-flake8-bugbear (Old)
and /work/SRC/openSUSE:Factory/.python-flake8-bugbear.new.16627 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-flake8-bugbear"
Wed Sep 20 13:26:01 2023 rev:16 rq:1111899 version:23.9.16
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-flake8-bugbear/python-flake8-bugbear.changes
2023-07-12 17:27:50.466706226 +0200
+++
/work/SRC/openSUSE:Factory/.python-flake8-bugbear.new.16627/python-flake8-bugbear.changes
2023-09-20 13:27:53.355850283 +0200
@@ -1,0 +2,8 @@
+Mon Sep 18 06:54:37 UTC 2023 - Daniel Garcia <[email protected]>
+
+- update to 23.9.16:
+ * add --classmethod-decorators (#405)
+ * fix name collision for node_stack on python 3.12 (#406)
+ * Use pypa/build to build the package (#404)
+
+-------------------------------------------------------------------
Old:
----
flake8-bugbear-23.7.10.tar.gz
New:
----
flake8-bugbear-23.9.16.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-flake8-bugbear.spec ++++++
--- /var/tmp/diff_new_pack.58MDOo/_old 2023-09-20 13:27:54.447889406 +0200
+++ /var/tmp/diff_new_pack.58MDOo/_new 2023-09-20 13:27:54.451889549 +0200
@@ -18,7 +18,7 @@
%{?sle15_python_module_pythons}
Name: python-flake8-bugbear
-Version: 23.7.10
+Version: 23.9.16
Release: 0
Summary: A plugin for flake8 finding likely bugs and design problems in
your program
License: MIT
++++++ flake8-bugbear-23.7.10.tar.gz -> flake8-bugbear-23.9.16.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/flake8-bugbear-23.7.10/PKG-INFO
new/flake8-bugbear-23.9.16/PKG-INFO
--- old/flake8-bugbear-23.7.10/PKG-INFO 2023-07-10 18:29:34.876180400 +0200
+++ new/flake8-bugbear-23.9.16/PKG-INFO 2023-09-16 22:26:20.477575000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: flake8-bugbear
-Version: 23.7.10
+Version: 23.9.16
Summary: A plugin for flake8 finding likely bugs and design problems in your
program. Contains warnings that don't belong in pyflakes and pycodestyle.
Author-email: Åukasz Langa <[email protected]>
License: MIT
@@ -25,8 +25,16 @@
Classifier: Topic :: Software Development :: Quality Assurance
Requires-Python: >=3.8.1
Description-Content-Type: text/x-rst
-Provides-Extra: dev
License-File: LICENSE
+Requires-Dist: flake8>=6.0.0
+Requires-Dist: attrs>=19.2.0
+Provides-Extra: dev
+Requires-Dist: tox; extra == "dev"
+Requires-Dist: coverage; extra == "dev"
+Requires-Dist: hypothesis; extra == "dev"
+Requires-Dist: hypothesmith>=0.2; extra == "dev"
+Requires-Dist: pre-commit; extra == "dev"
+Requires-Dist: pytest; extra == "dev"
==============
flake8-bugbear
@@ -327,13 +335,16 @@
Configuration
-------------
-The plugin currently has one setting:
+The plugin currently has the following settings:
``extend-immutable-calls``: Specify a list of additional immutable calls.
This could be useful, when using other libraries that provide more immutable
calls,
beside those already handled by ``flake8-bugbear``. Calls to these method will
no longer
raise a ``B008`` warning.
+``classmethod-decorators``: Specify a list of decorators to additionally mark
a method as a ``classmethod`` as used by B902. Default values are
``classmethod, validator, root_validator``, and when an ``@obj.name`` decorator
is specified it will match against either ``name`` or ``obj.name``.
+This functions similarly to how `pep8-naming
<https://github.com/PyCQA/pep8-naming>` handles it, but with different
defaults, and they don't support specifying attributes such that a decorator
will never match against a specified value ``obj.name`` even if decorated with
``@obj.name``.
+
For example::
[flake8]
@@ -341,6 +352,7 @@
max-complexity = 12
...
extend-immutable-calls = pathlib.Path, Path
+ classmethod-decorators = myclassmethod, mylibrary.otherclassmethod
Tests / Lints
---------------
@@ -364,8 +376,15 @@
Change Log
----------
+23.9.16
+~~~~~~~
+
+* add --classmethod-decorators (#405)
+* fix name collision for node_stack on python 3.12 (#406)
+* Use pypa/build to build the package (#404)
+
23.7.10
-~~~~~~~~~~
+~~~~~~~
* Add B034: re.sub/subn/split must pass flags/count/maxsplit as keyword
arguments.
* Fix a crash and several test failures on Python 3.12, all relating to the
B907
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/flake8-bugbear-23.7.10/README.rst
new/flake8-bugbear-23.9.16/README.rst
--- old/flake8-bugbear-23.7.10/README.rst 2023-07-10 18:29:25.000000000
+0200
+++ new/flake8-bugbear-23.9.16/README.rst 2023-09-16 22:26:06.000000000
+0200
@@ -297,13 +297,16 @@
Configuration
-------------
-The plugin currently has one setting:
+The plugin currently has the following settings:
``extend-immutable-calls``: Specify a list of additional immutable calls.
This could be useful, when using other libraries that provide more immutable
calls,
beside those already handled by ``flake8-bugbear``. Calls to these method will
no longer
raise a ``B008`` warning.
+``classmethod-decorators``: Specify a list of decorators to additionally mark
a method as a ``classmethod`` as used by B902. Default values are
``classmethod, validator, root_validator``, and when an ``@obj.name`` decorator
is specified it will match against either ``name`` or ``obj.name``.
+This functions similarly to how `pep8-naming
<https://github.com/PyCQA/pep8-naming>` handles it, but with different
defaults, and they don't support specifying attributes such that a decorator
will never match against a specified value ``obj.name`` even if decorated with
``@obj.name``.
+
For example::
[flake8]
@@ -311,6 +314,7 @@
max-complexity = 12
...
extend-immutable-calls = pathlib.Path, Path
+ classmethod-decorators = myclassmethod, mylibrary.otherclassmethod
Tests / Lints
---------------
@@ -334,8 +338,15 @@
Change Log
----------
+23.9.16
+~~~~~~~
+
+* add --classmethod-decorators (#405)
+* fix name collision for node_stack on python 3.12 (#406)
+* Use pypa/build to build the package (#404)
+
23.7.10
-~~~~~~~~~~
+~~~~~~~
* Add B034: re.sub/subn/split must pass flags/count/maxsplit as keyword
arguments.
* Fix a crash and several test failures on Python 3.12, all relating to the
B907
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/flake8-bugbear-23.7.10/bugbear.py
new/flake8-bugbear-23.9.16/bugbear.py
--- old/flake8-bugbear-23.7.10/bugbear.py 2023-07-10 18:29:25.000000000
+0200
+++ new/flake8-bugbear-23.9.16/bugbear.py 2023-09-16 22:26:06.000000000
+0200
@@ -10,11 +10,12 @@
from contextlib import suppress
from functools import lru_cache, partial
from keyword import iskeyword
+from typing import Dict, List, Set, Union
import attr
import pycodestyle
-__version__ = "23.7.10"
+__version__ = "23.9.16"
LOG = logging.getLogger("flake8.bugbear")
CONTEXTFUL_NODES = (
@@ -38,6 +39,8 @@
"assertWarnsRegex",
}
+B902_default_decorators = {"classmethod", "validator", "root_validator"}
+
Context = namedtuple("Context", ["node", "stack"])
@@ -62,10 +65,15 @@
else:
b008_extend_immutable_calls = set()
+ b902_classmethod_decorators: set[str] = B902_default_decorators
+ if self.options and hasattr(self.options, "classmethod_decorators"):
+ b902_classmethod_decorators =
set(self.options.classmethod_decorators)
+
visitor = self.visitor(
filename=self.filename,
lines=self.lines,
b008_extend_immutable_calls=b008_extend_immutable_calls,
+ b902_classmethod_decorators=b902_classmethod_decorators,
)
visitor.visit(self.tree)
for e in itertools.chain(visitor.errors, self.gen_line_based_checks()):
@@ -143,6 +151,19 @@
default=[],
help="Skip B008 test for additional immutable calls.",
)
+ # you cannot register the same option in two different plugins, so we
+ # only register --classmethod-decorators if pep8-naming is not
installed
+ if "pep8ext_naming" not in sys.modules.keys():
+ optmanager.add_option(
+ "--classmethod-decorators",
+ comma_separated_list=True,
+ parse_from_config=True,
+ default=B902_default_decorators,
+ help=(
+ "List of method decorators that should be treated as
classmethods"
+ " by B902"
+ ),
+ )
@lru_cache # noqa: B019
def should_warn(self, code):
@@ -184,10 +205,8 @@
return True
LOG.info(
- (
- "Optional warning %s not present in selected warnings: %r. Not
"
- "firing it at all."
- ),
+ "Optional warning %s not present in selected warnings: %r. Not "
+ "firing it at all.",
code,
self.options.select,
)
@@ -310,7 +329,7 @@
filename = attr.ib()
lines = attr.ib()
b008_extend_immutable_calls = attr.ib(default=attr.Factory(set))
- node_stack = attr.ib(default=attr.Factory(list))
+ b902_classmethod_decorators = attr.ib(default=attr.Factory(set))
node_window = attr.ib(default=attr.Factory(list))
errors = attr.ib(default=attr.Factory(list))
futures = attr.ib(default=attr.Factory(set))
@@ -974,37 +993,51 @@
self.errors.append(B901(return_node.lineno,
return_node.col_offset))
break
- def check_for_b902(self, node):
+ # taken from pep8-naming
+ @classmethod
+ def find_decorator_name(cls, d):
+ if isinstance(d, ast.Name):
+ return d.id
+ elif isinstance(d, ast.Attribute):
+ return d.attr
+ elif isinstance(d, ast.Call):
+ return cls.find_decorator_name(d.func)
+
+ def check_for_b902( # noqa: C901 (too complex)
+ self, node: Union[ast.FunctionDef, ast.AsyncFunctionDef]
+ ) -> None:
+ def is_classmethod(decorators: Set[str]) -> bool:
+ return (
+ any(name in decorators for name in
self.b902_classmethod_decorators)
+ or node.name in B902.implicit_classmethods
+ )
+
if len(self.contexts) < 2 or not isinstance(
self.contexts[-2].node, ast.ClassDef
):
return
cls = self.contexts[-2].node
- decorators = NameFinder()
- decorators.visit(node.decorator_list)
- if "staticmethod" in decorators.names:
+ decorators: set[str] = {
+ self.find_decorator_name(d) for d in node.decorator_list
+ }
+
+ if "staticmethod" in decorators:
# TODO: maybe warn if the first argument is surprisingly `self` or
# `cls`?
return
bases = {b.id for b in cls.bases if isinstance(b, ast.Name)}
if "type" in bases:
- if (
- "classmethod" in decorators.names
- or node.name in B902.implicit_classmethods
- ):
+ if is_classmethod(decorators):
expected_first_args = B902.metacls
kind = "metaclass class"
else:
expected_first_args = B902.cls
kind = "metaclass instance"
else:
- if (
- "classmethod" in decorators.names
- or node.name in B902.implicit_classmethods
- ):
+ if is_classmethod(decorators):
expected_first_args = B902.cls
kind = "class"
else:
@@ -1441,9 +1474,11 @@
key is name string, value is the node (useful for location purposes).
"""
- names = attr.ib(default=attr.Factory(dict))
+ names: Dict[str, List[ast.Name]] = attr.ib(default=attr.Factory(dict))
- def visit_Name(self, node): # noqa: B906 # names don't contain other names
+ def visit_Name( # noqa: B906 # names don't contain other names
+ self, node: ast.Name
+ ):
self.names.setdefault(node.id, []).append(node)
def visit(self, node):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/flake8-bugbear-23.7.10/flake8_bugbear.egg-info/PKG-INFO
new/flake8-bugbear-23.9.16/flake8_bugbear.egg-info/PKG-INFO
--- old/flake8-bugbear-23.7.10/flake8_bugbear.egg-info/PKG-INFO 2023-07-10
18:29:34.000000000 +0200
+++ new/flake8-bugbear-23.9.16/flake8_bugbear.egg-info/PKG-INFO 2023-09-16
22:26:20.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: flake8-bugbear
-Version: 23.7.10
+Version: 23.9.16
Summary: A plugin for flake8 finding likely bugs and design problems in your
program. Contains warnings that don't belong in pyflakes and pycodestyle.
Author-email: Åukasz Langa <[email protected]>
License: MIT
@@ -25,8 +25,16 @@
Classifier: Topic :: Software Development :: Quality Assurance
Requires-Python: >=3.8.1
Description-Content-Type: text/x-rst
-Provides-Extra: dev
License-File: LICENSE
+Requires-Dist: flake8>=6.0.0
+Requires-Dist: attrs>=19.2.0
+Provides-Extra: dev
+Requires-Dist: tox; extra == "dev"
+Requires-Dist: coverage; extra == "dev"
+Requires-Dist: hypothesis; extra == "dev"
+Requires-Dist: hypothesmith>=0.2; extra == "dev"
+Requires-Dist: pre-commit; extra == "dev"
+Requires-Dist: pytest; extra == "dev"
==============
flake8-bugbear
@@ -327,13 +335,16 @@
Configuration
-------------
-The plugin currently has one setting:
+The plugin currently has the following settings:
``extend-immutable-calls``: Specify a list of additional immutable calls.
This could be useful, when using other libraries that provide more immutable
calls,
beside those already handled by ``flake8-bugbear``. Calls to these method will
no longer
raise a ``B008`` warning.
+``classmethod-decorators``: Specify a list of decorators to additionally mark
a method as a ``classmethod`` as used by B902. Default values are
``classmethod, validator, root_validator``, and when an ``@obj.name`` decorator
is specified it will match against either ``name`` or ``obj.name``.
+This functions similarly to how `pep8-naming
<https://github.com/PyCQA/pep8-naming>` handles it, but with different
defaults, and they don't support specifying attributes such that a decorator
will never match against a specified value ``obj.name`` even if decorated with
``@obj.name``.
+
For example::
[flake8]
@@ -341,6 +352,7 @@
max-complexity = 12
...
extend-immutable-calls = pathlib.Path, Path
+ classmethod-decorators = myclassmethod, mylibrary.otherclassmethod
Tests / Lints
---------------
@@ -364,8 +376,15 @@
Change Log
----------
+23.9.16
+~~~~~~~
+
+* add --classmethod-decorators (#405)
+* fix name collision for node_stack on python 3.12 (#406)
+* Use pypa/build to build the package (#404)
+
23.7.10
-~~~~~~~~~~
+~~~~~~~
* Add B034: re.sub/subn/split must pass flags/count/maxsplit as keyword
arguments.
* Fix a crash and several test failures on Python 3.12, all relating to the
B907
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/flake8-bugbear-23.7.10/flake8_bugbear.egg-info/SOURCES.txt
new/flake8-bugbear-23.9.16/flake8_bugbear.egg-info/SOURCES.txt
--- old/flake8-bugbear-23.7.10/flake8_bugbear.egg-info/SOURCES.txt
2023-07-10 18:29:34.000000000 +0200
+++ new/flake8-bugbear-23.9.16/flake8_bugbear.egg-info/SOURCES.txt
2023-09-16 22:26:20.000000000 +0200
@@ -51,6 +51,7 @@
tests/b034.py
tests/b901.py
tests/b902.py
+tests/b902_extended.py
tests/b902_py38.py
tests/b903.py
tests/b904.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/flake8-bugbear-23.7.10/tests/b006_b008.py
new/flake8-bugbear-23.9.16/tests/b006_b008.py
--- old/flake8-bugbear-23.7.10/tests/b006_b008.py 2023-07-10
18:29:25.000000000 +0200
+++ new/flake8-bugbear-23.9.16/tests/b006_b008.py 2023-09-16
22:26:06.000000000 +0200
@@ -12,8 +12,7 @@
# B006
# Allow immutable literals/calls/comprehensions
-def this_is_okay(value=(1, 2, 3)):
- ...
+def this_is_okay(value=(1, 2, 3)): ...
async def and_this_also(value=tuple()):
@@ -50,35 +49,28 @@
pass
-def kwonlyargs_immutable(*, value=()):
- ...
+def kwonlyargs_immutable(*, value=()): ...
# Flag mutable literals/comprehensions
-def this_is_wrong(value=[1, 2, 3]):
- ...
+def this_is_wrong(value=[1, 2, 3]): ...
-def this_is_also_wrong(value={}):
- ...
+def this_is_also_wrong(value={}): ...
-def and_this(value=set()):
- ...
+def and_this(value=set()): ...
-def this_too(value=collections.OrderedDict()):
- ...
+def this_too(value=collections.OrderedDict()): ...
-async def async_this_too(value=collections.defaultdict()):
- ...
+async def async_this_too(value=collections.defaultdict()): ...
-def dont_forget_me(value=collections.deque()):
- ...
+def dont_forget_me(value=collections.deque()): ...
# N.B. we're also flagging the function call in the comprehension
@@ -94,8 +86,7 @@
pass
-def kwonlyargs_mutable(*, value=[]):
- ...
+def kwonlyargs_mutable(*, value=[]): ...
# Recommended approach for mutable defaults
@@ -106,16 +97,14 @@
# B008
# Flag function calls as default args (including if they are part of a
sub-expression)
-def in_fact_all_calls_are_wrong(value=time.time()):
- ...
+def in_fact_all_calls_are_wrong(value=time.time()): ...
def f(when=dt.datetime.now() + dt.timedelta(days=7)):
pass
-def can_even_catch_lambdas(a=(lambda x: x)()):
- ...
+def can_even_catch_lambdas(a=(lambda x: x)()): ...
# Recommended approach for function calls as default args
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/flake8-bugbear-23.7.10/tests/b008_extended.py
new/flake8-bugbear-23.9.16/tests/b008_extended.py
--- old/flake8-bugbear-23.7.10/tests/b008_extended.py 2023-07-10
18:29:25.000000000 +0200
+++ new/flake8-bugbear-23.9.16/tests/b008_extended.py 2023-09-16
22:26:06.000000000 +0200
@@ -4,13 +4,10 @@
from fastapi import Query
-def this_is_okay_extended(db=fastapi.Depends(get_db)):
- ...
+def this_is_okay_extended(db=fastapi.Depends(get_db)): ...
-def this_is_okay_extended_second(data: List[str] = fastapi.Query(None)):
- ...
+def this_is_okay_extended_second(data: List[str] = fastapi.Query(None)): ...
-def this_is_not_okay_relative_import_not_listed(data: List[str] = Query(None)):
- ...
+def this_is_not_okay_relative_import_not_listed(data: List[str] =
Query(None)): ...
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/flake8-bugbear-23.7.10/tests/b019.py
new/flake8-bugbear-23.9.16/tests/b019.py
--- old/flake8-bugbear-23.7.10/tests/b019.py 2023-07-10 18:29:25.000000000
+0200
+++ new/flake8-bugbear-23.9.16/tests/b019.py 2023-09-16 22:26:06.000000000
+0200
@@ -6,98 +6,77 @@
from functools import cache, cached_property, lru_cache
-def some_other_cache():
- ...
+def some_other_cache(): ...
class Foo:
def __init__(self, x):
self.x = x
- def compute_method(self, y):
- ...
+ def compute_method(self, y): ...
@some_other_cache
- def user_cached_method(self, y):
- ...
+ def user_cached_method(self, y): ...
@classmethod
@functools.cache
- def cached_classmethod(cls, y):
- ...
+ def cached_classmethod(cls, y): ...
@classmethod
@cache
- def other_cached_classmethod(cls, y):
- ...
+ def other_cached_classmethod(cls, y): ...
@classmethod
@functools.lru_cache
- def lru_cached_classmethod(cls, y):
- ...
+ def lru_cached_classmethod(cls, y): ...
@classmethod
@lru_cache
- def other_lru_cached_classmethod(cls, y):
- ...
+ def other_lru_cached_classmethod(cls, y): ...
@staticmethod
@functools.cache
- def cached_staticmethod(y):
- ...
+ def cached_staticmethod(y): ...
@staticmethod
@cache
- def other_cached_staticmethod(y):
- ...
+ def other_cached_staticmethod(y): ...
@staticmethod
@functools.lru_cache
- def lru_cached_staticmethod(y):
- ...
+ def lru_cached_staticmethod(y): ...
@staticmethod
@lru_cache
- def other_lru_cached_staticmethod(y):
- ...
+ def other_lru_cached_staticmethod(y): ...
@functools.cached_property
- def some_cached_property(self):
- ...
+ def some_cached_property(self): ...
@cached_property
- def some_other_cached_property(self):
- ...
+ def some_other_cached_property(self): ...
# Remaining methods should emit B019
@functools.cache
- def cached_method(self, y):
- ...
+ def cached_method(self, y): ...
@cache
- def another_cached_method(self, y):
- ...
+ def another_cached_method(self, y): ...
@functools.cache()
- def called_cached_method(self, y):
- ...
+ def called_cached_method(self, y): ...
@cache()
- def another_called_cached_method(self, y):
- ...
+ def another_called_cached_method(self, y): ...
@functools.lru_cache
- def lru_cached_method(self, y):
- ...
+ def lru_cached_method(self, y): ...
@lru_cache
- def another_lru_cached_method(self, y):
- ...
+ def another_lru_cached_method(self, y): ...
@functools.lru_cache()
- def called_lru_cached_method(self, y):
- ...
+ def called_lru_cached_method(self, y): ...
@lru_cache()
- def another_called_lru_cached_method(self, y):
- ...
+ def another_called_lru_cached_method(self, y): ...
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/flake8-bugbear-23.7.10/tests/b027.py
new/flake8-bugbear-23.9.16/tests/b027.py
--- old/flake8-bugbear-23.7.10/tests/b027.py 2023-07-10 18:29:25.000000000
+0200
+++ new/flake8-bugbear-23.9.16/tests/b027.py 2023-09-16 22:26:06.000000000
+0200
@@ -32,16 +32,14 @@
...
@abstractmethod
- def abstract_1(self):
- ...
+ def abstract_1(self): ...
@abstractmethod
def abstract_2(self):
pass
@abc.abstractmethod
- def abstract_3(self):
- ...
+ def abstract_3(self): ...
def body_1(self):
print("foo")
@@ -69,21 +67,16 @@
class AstractClass(ABC):
@overload
- def empty_1(self, foo: str):
- ...
+ def empty_1(self, foo: str): ...
@typing.overload
- def empty_1(self, foo: int):
- ...
+ def empty_1(self, foo: int): ...
@t.overload
- def empty_1(self, foo: list):
- ...
+ def empty_1(self, foo: list): ...
@anything.overload
- def empty_1(self, foo: float):
- ...
+ def empty_1(self, foo: float): ...
@abstractmethod
- def empty_1(self, foo: Union[str, int, list, float]):
- ...
+ def empty_1(self, foo: Union[str, int, list, float]): ...
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/flake8-bugbear-23.7.10/tests/b902.py
new/flake8-bugbear-23.9.16/tests/b902.py
--- old/flake8-bugbear-23.7.10/tests/b902.py 2023-07-10 18:29:25.000000000
+0200
+++ new/flake8-bugbear-23.9.16/tests/b902.py 2023-09-16 22:26:06.000000000
+0200
@@ -1,63 +1,47 @@
-def not_a_method(arg1):
- ...
+def not_a_method(arg1): ...
class NoWarnings:
def __init__(self):
- def not_a_method_either(arg1):
- ...
+ def not_a_method_either(arg1): ...
- def __new__(cls, *args, **kwargs):
- ...
+ def __new__(cls, *args, **kwargs): ...
- def method(self, arg1, *, yeah):
- ...
+ def method(self, arg1, *, yeah): ...
- async def async_method(self, arg1, *, yeah):
- ...
+ async def async_method(self, arg1, *, yeah): ...
@classmethod
- def someclassmethod(cls, arg1, with_default=None):
- ...
+ def someclassmethod(cls, arg1, with_default=None): ...
@staticmethod
- def not_a_problem(arg1):
- ...
+ def not_a_problem(arg1): ...
class Warnings:
- def __init__(i_am_special):
- ...
+ def __init__(i_am_special): ...
- def almost_a_class_method(cls, arg1):
- ...
+ def almost_a_class_method(cls, arg1): ...
- def almost_a_static_method():
- ...
+ def almost_a_static_method(): ...
@classmethod
- def wat(self, i_like_confusing_people):
- ...
+ def wat(self, i_like_confusing_people): ...
def i_am_strange(*args, **kwargs):
self = args[0]
- def defaults_anyone(self=None):
- ...
+ def defaults_anyone(self=None): ...
- def invalid_kwargs_only(**kwargs):
- ...
+ def invalid_kwargs_only(**kwargs): ...
- def invalid_keyword_only(*, self):
- ...
+ def invalid_keyword_only(*, self): ...
- async def async_invalid_keyword_only(*, self):
- ...
+ async def async_invalid_keyword_only(*, self): ...
class Meta(type):
- def __init__(cls, name, bases, d):
- ...
+ def __init__(cls, name, bases, d): ...
@classmethod
def __prepare__(metacls, name, bases):
@@ -65,16 +49,14 @@
class OtherMeta(type):
- def __init__(self, name, bases, d):
- ...
+ def __init__(self, name, bases, d): ...
@classmethod
def __prepare__(cls, name, bases):
return {}
@classmethod
- def first_arg_mcs_allowed(mcs, value):
- ...
+ def first_arg_mcs_allowed(mcs, value): ...
def type_factory():
@@ -82,21 +64,16 @@
class CrazyBases(Warnings, type_factory(), metaclass=type):
- def __init__(self):
- ...
+ def __init__(self): ...
class RuntimeError("This is not a base"):
- def __init__(self):
- ...
+ def __init__(self): ...
class ImplicitClassMethods:
- def __new__(cls, *args, **kwargs):
- ...
+ def __new__(cls, *args, **kwargs): ...
- def __init_subclass__(cls, *args, **kwargs):
- ...
+ def __init_subclass__(cls, *args, **kwargs): ...
- def __class_getitem__(cls, key):
- ...
+ def __class_getitem__(cls, key): ...
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/flake8-bugbear-23.7.10/tests/b902_extended.py
new/flake8-bugbear-23.9.16/tests/b902_extended.py
--- old/flake8-bugbear-23.7.10/tests/b902_extended.py 1970-01-01
01:00:00.000000000 +0100
+++ new/flake8-bugbear-23.9.16/tests/b902_extended.py 2023-09-16
22:26:06.000000000 +0200
@@ -0,0 +1,104 @@
+# parameters: --classmethod-decorators=["mylibrary.classmethod", "validator"]
+class Errors:
+ # correctly registered as classmethod
+ @validator
+ def foo_validator(self) -> None: ...
+
+ @other.validator
+ def foo_other_validator(self) -> None: ...
+
+ @foo.bar.validator
+ def foo_foo_bar_validator(self) -> None: ...
+
+ @validator.blah
+ def foo_validator_blah(cls) -> None: ...
+
+ # specifying attribute in options is not valid
+ @mylibrary.makeclassmethod
+ def foo2(cls) -> None: ...
+
+ # specified attribute in options
+ @makeclassmethod
+ def foo6(cls) -> None: ...
+
+ # classmethod is default, but if not specified it's ignored
+ @classmethod
+ def foo3(cls) -> None: ...
+
+ # random unknown decorator
+ @aoeuaoeu
+ def foo5(cls) -> None: ...
+
+
+class NoErrors:
+ @validator
+ def foo1(cls) -> None: ...
+
+ @other.validator
+ def foo4(cls) -> None: ...
+
+ @mylibrary.makeclassmethod
+ def foo2(self) -> None: ...
+
+ @classmethod
+ def foo3(self) -> None: ...
+
+ @aoeuaoeu
+ def foo5(self) -> None: ...
+
+ @makeclassmethod
+ def foo6(self) -> None: ...
+
+
+# Above tests, duplicated to check that the separate logic for metaclasses
also works
+
+
+class ErrorsMeta(type):
+ # correctly registered as classmethod
+ @validator
+ def foo_validator(cls) -> None: ...
+
+ @other.validator
+ def foo_other_validator(cls) -> None: ...
+
+ @foo.bar.validator
+ def foo_foo_bar_validator(cls) -> None: ...
+
+ @validator.blah
+ def foo_validator_blah(metacls) -> None: ...
+
+ # specifying attribute in options is not valid
+ @mylibrary.makeclassmethod
+ def foo2(metacls) -> None: ...
+
+ # specified attribute in options
+ @makeclassmethod
+ def foo6(metacls) -> None: ...
+
+ # classmethod is default, but if not specified it's ignored
+ @classmethod
+ def foo3(metacls) -> None: ...
+
+ # random unknown decorator
+ @aoeuaoeu
+ def foo5(metacls) -> None: ...
+
+
+class NoErrorsMeta(type):
+ @validator
+ def foo1(metacls) -> None: ...
+
+ @other.validator
+ def foo4(metacls) -> None: ...
+
+ @mylibrary.makeclassmethod
+ def foo2(cls) -> None: ...
+
+ @classmethod
+ def foo3(cls) -> None: ...
+
+ @aoeuaoeu
+ def foo5(cls) -> None: ...
+
+ @makeclassmethod
+ def foo6(cls) -> None: ...
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/flake8-bugbear-23.7.10/tests/b902_py38.py
new/flake8-bugbear-23.9.16/tests/b902_py38.py
--- old/flake8-bugbear-23.7.10/tests/b902_py38.py 2023-07-10
18:29:25.000000000 +0200
+++ new/flake8-bugbear-23.9.16/tests/b902_py38.py 2023-09-16
22:26:06.000000000 +0200
@@ -1,63 +1,47 @@
-def not_a_method(arg1, /):
- ...
+def not_a_method(arg1, /): ...
class NoWarnings:
def __init__(self, /):
- def not_a_method_either(arg1, /):
- ...
+ def not_a_method_either(arg1, /): ...
- def __new__(cls, /, *args, **kwargs):
- ...
+ def __new__(cls, /, *args, **kwargs): ...
- def method(self, arg1, /, *, yeah):
- ...
+ def method(self, arg1, /, *, yeah): ...
- async def async_method(self, arg1, /, *, yeah):
- ...
+ async def async_method(self, arg1, /, *, yeah): ...
@classmethod
- def someclassmethod(cls, arg1, with_default=None, /):
- ...
+ def someclassmethod(cls, arg1, with_default=None, /): ...
@staticmethod
- def not_a_problem(arg1, /):
- ...
+ def not_a_problem(arg1, /): ...
class Warnings:
- def __init__(i_am_special, /):
- ...
+ def __init__(i_am_special, /): ...
- def almost_a_class_method(cls, arg1, /):
- ...
+ def almost_a_class_method(cls, arg1, /): ...
- def almost_a_static_method():
- ...
+ def almost_a_static_method(): ...
@classmethod
- def wat(self, i_like_confusing_people, /):
- ...
+ def wat(self, i_like_confusing_people, /): ...
def i_am_strange(*args, **kwargs):
self = args[0]
- def defaults_anyone(self=None, /):
- ...
+ def defaults_anyone(self=None, /): ...
- def invalid_kwargs_only(**kwargs):
- ...
+ def invalid_kwargs_only(**kwargs): ...
- def invalid_keyword_only(*, self):
- ...
+ def invalid_keyword_only(*, self): ...
- async def async_invalid_keyword_only(*, self):
- ...
+ async def async_invalid_keyword_only(*, self): ...
class Meta(type):
- def __init__(cls, name, bases, d, /):
- ...
+ def __init__(cls, name, bases, d, /): ...
@classmethod
def __prepare__(metacls, name, bases, /):
@@ -65,16 +49,14 @@
class OtherMeta(type):
- def __init__(self, name, bases, d, /):
- ...
+ def __init__(self, name, bases, d, /): ...
@classmethod
def __prepare__(cls, name, bases, /):
return {}
@classmethod
- def first_arg_mcs_allowed(mcs, value, /):
- ...
+ def first_arg_mcs_allowed(mcs, value, /): ...
def type_factory():
@@ -82,21 +64,16 @@
class CrazyBases(Warnings, type_factory(), metaclass=type):
- def __init__(self):
- ...
+ def __init__(self): ...
class RuntimeError("This is not a base"):
- def __init__(self):
- ...
+ def __init__(self): ...
class ImplicitClassMethods:
- def __new__(cls, /, *args, **kwargs):
- ...
+ def __new__(cls, /, *args, **kwargs): ...
- def __init_subclass__(cls, /, *args, **kwargs):
- ...
+ def __init_subclass__(cls, /, *args, **kwargs): ...
- def __class_getitem__(cls, key, /):
- ...
+ def __class_getitem__(cls, key, /): ...
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/flake8-bugbear-23.7.10/tests/b903.py
new/flake8-bugbear-23.9.16/tests/b903.py
--- old/flake8-bugbear-23.7.10/tests/b903.py 2023-07-10 18:29:25.000000000
+0200
+++ new/flake8-bugbear-23.9.16/tests/b903.py 2023-09-16 22:26:06.000000000
+0200
@@ -3,8 +3,7 @@
self.foo = foo
self.bar = bar
- def other_function(self):
- ...
+ def other_function(self): ...
class NoWarningsClassAttributes:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/flake8-bugbear-23.7.10/tests/b906.py
new/flake8-bugbear-23.9.16/tests/b906.py
--- old/flake8-bugbear-23.7.10/tests/b906.py 2023-07-10 18:29:25.000000000
+0200
+++ new/flake8-bugbear-23.9.16/tests/b906.py 2023-09-16 22:26:06.000000000
+0200
@@ -6,8 +6,7 @@
# error
-def visit_For():
- ...
+def visit_For(): ...
# has call to visit function
@@ -27,74 +26,58 @@
# not a valid AST class, no error
-def visit_foo():
- ...
+def visit_foo(): ...
# Break has no subfields to visit, so no error
-def visit_Break():
- ...
+def visit_Break(): ...
# explicitly check `visit` and `generic_visit`
# doesn't start with _visit, safe
-def visit():
- ...
+def visit(): ...
# doesn't start with _visit, safe
-def generic_visit():
- ...
+def generic_visit(): ...
# check no crash on short name
-def a():
- ...
+def a(): ...
-def visit_():
- ...
+def visit_(): ...
# Check exceptions for ast types that only contain ADSL builtin types
# i.e. don't contain any ast.AST subnodes and therefore don't need a
generic_visit
-def visit_alias():
- ...
+def visit_alias(): ...
-def visit_Constant():
- ...
+def visit_Constant(): ...
-def visit_Global():
- ...
+def visit_Global(): ...
-def visit_MatchSingleton():
- ...
+def visit_MatchSingleton(): ...
-def visit_MatchStar():
- ...
+def visit_MatchStar(): ...
-def visit_Nonlocal():
- ...
+def visit_Nonlocal(): ...
-def visit_TypeIgnore():
- ...
+def visit_TypeIgnore(): ...
# These nodes are deprecated, but some codebases may still use them
# for backwards-compatibility with Python 3.7
-def visit_Bytes():
- ...
+def visit_Bytes(): ...
-def visit_Num():
- ...
+def visit_Num(): ...
-def visit_Str():
- ...
+def visit_Str(): ...
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/flake8-bugbear-23.7.10/tests/test_bugbear.py
new/flake8-bugbear-23.9.16/tests/test_bugbear.py
--- old/flake8-bugbear-23.7.10/tests/test_bugbear.py 2023-07-10
18:29:25.000000000 +0200
+++ new/flake8-bugbear-23.9.16/tests/test_bugbear.py 2023-09-16
22:26:06.000000000 +0200
@@ -114,31 +114,31 @@
self.assertEqual(
errors,
self.errors(
- B006(60, 24),
- B006(64, 29),
- B006(68, 19),
- B006(72, 19),
- B006(76, 31),
- B006(80, 25),
- B006(85, 45),
- B008(85, 60),
- B006(89, 45),
- B008(89, 63),
- B006(93, 44),
- B008(93, 59),
- B006(97, 32),
- B008(109, 38),
- B008(113, 11),
- B008(113, 31),
- B008(117, 29),
- B008(160, 29),
- B008(164, 44),
- B006(170, 19),
- B008(170, 20),
- B008(170, 30),
- B008(176, 21),
- B008(181, 18),
- B008(181, 36),
+ B006(58, 24),
+ B006(61, 29),
+ B006(64, 19),
+ B006(67, 19),
+ B006(70, 31),
+ B006(73, 25),
+ B006(77, 45),
+ B008(77, 60),
+ B006(81, 45),
+ B008(81, 63),
+ B006(85, 44),
+ B008(85, 59),
+ B006(89, 32),
+ B008(100, 38),
+ B008(103, 11),
+ B008(103, 31),
+ B008(107, 29),
+ B008(149, 29),
+ B008(153, 44),
+ B006(159, 19),
+ B008(159, 20),
+ B008(159, 30),
+ B008(165, 21),
+ B008(170, 18),
+ B008(170, 36),
),
)
@@ -168,7 +168,7 @@
self.assertEqual(
errors,
- self.errors(B008(15, 66)),
+ self.errors(B008(13, 66)),
)
def test_b009_b010(self):
@@ -296,14 +296,14 @@
self.assertEqual(
errors,
self.errors(
- B019(73, 5),
- B019(77, 5),
+ B019(60, 5),
+ B019(63, 5),
+ B019(66, 5),
+ B019(69, 5),
+ B019(72, 5),
+ B019(75, 5),
+ B019(78, 5),
B019(81, 5),
- B019(85, 5),
- B019(89, 5),
- B019(93, 5),
- B019(97, 5),
- B019(101, 5),
),
)
@@ -654,16 +654,49 @@
self.assertEqual(
errors,
self.errors(
- B902(29, 17, vars=("'i_am_special'", "instance", "self")),
- B902(32, 30, vars=("'cls'", "instance", "self")),
- B902(35, 4, vars=("(none)", "instance", "self")),
- B902(39, 12, vars=("'self'", "class", "cls")),
- B902(42, 22, vars=("*args", "instance", "self")),
- B902(48, 30, vars=("**kwargs", "instance", "self")),
- B902(51, 32, vars=("*, self", "instance", "self")),
- B902(54, 44, vars=("*, self", "instance", "self")),
- B902(68, 17, vars=("'self'", "metaclass instance", "cls")),
- B902(72, 20, vars=("'cls'", "metaclass class", "metacls")),
+ B902(22, 17, vars=("'i_am_special'", "instance", "self")),
+ B902(24, 30, vars=("'cls'", "instance", "self")),
+ B902(26, 4, vars=("(none)", "instance", "self")),
+ B902(29, 12, vars=("'self'", "class", "cls")),
+ B902(31, 22, vars=("*args", "instance", "self")),
+ B902(36, 30, vars=("**kwargs", "instance", "self")),
+ B902(38, 32, vars=("*, self", "instance", "self")),
+ B902(40, 44, vars=("*, self", "instance", "self")),
+ B902(52, 17, vars=("'self'", "metaclass instance", "cls")),
+ B902(55, 20, vars=("'cls'", "metaclass class", "metacls")),
+ ),
+ )
+
+ def test_b902_extended(self):
+ filename = Path(__file__).absolute().parent / "b902_extended.py"
+
+ mock_options = Namespace(
+ classmethod_decorators=["mylibrary.makeclassmethod", "validator"],
+ select=["B902"],
+ )
+ bbc = BugBearChecker(filename=str(filename), options=mock_options)
+ errors = list(bbc.run())
+
+ self.assertEqual(
+ errors,
+ self.errors(
+ B902(5, 22, vars=("'self'", "class", "cls")),
+ B902(8, 28, vars=("'self'", "class", "cls")),
+ B902(11, 30, vars=("'self'", "class", "cls")),
+ B902(14, 27, vars=("'cls'", "instance", "self")),
+ B902(18, 13, vars=("'cls'", "instance", "self")),
+ B902(22, 13, vars=("'cls'", "instance", "self")),
+ B902(26, 13, vars=("'cls'", "instance", "self")),
+ B902(30, 13, vars=("'cls'", "instance", "self")),
+ # metaclass
+ B902(59, 22, vars=("'cls'", "metaclass class", "metacls")),
+ B902(62, 28, vars=("'cls'", "metaclass class", "metacls")),
+ B902(65, 30, vars=("'cls'", "metaclass class", "metacls")),
+ B902(68, 27, vars=("'metacls'", "metaclass instance", "cls")),
+ B902(72, 13, vars=("'metacls'", "metaclass instance", "cls")),
+ B902(76, 13, vars=("'metacls'", "metaclass instance", "cls")),
+ B902(80, 13, vars=("'metacls'", "metaclass instance", "cls")),
+ B902(84, 13, vars=("'metacls'", "metaclass instance", "cls")),
),
)
@@ -674,16 +707,16 @@
self.assertEqual(
errors,
self.errors(
- B902(29, 17, vars=("'i_am_special'", "instance", "self")),
- B902(32, 30, vars=("'cls'", "instance", "self")),
- B902(35, 4, vars=("(none)", "instance", "self")),
- B902(39, 12, vars=("'self'", "class", "cls")),
- B902(42, 22, vars=("*args", "instance", "self")),
- B902(48, 30, vars=("**kwargs", "instance", "self")),
- B902(51, 32, vars=("*, self", "instance", "self")),
- B902(54, 44, vars=("*, self", "instance", "self")),
- B902(68, 17, vars=("'self'", "metaclass instance", "cls")),
- B902(72, 20, vars=("'cls'", "metaclass class", "metacls")),
+ B902(22, 17, vars=("'i_am_special'", "instance", "self")),
+ B902(24, 30, vars=("'cls'", "instance", "self")),
+ B902(26, 4, vars=("(none)", "instance", "self")),
+ B902(29, 12, vars=("'self'", "class", "cls")),
+ B902(31, 22, vars=("*args", "instance", "self")),
+ B902(36, 30, vars=("**kwargs", "instance", "self")),
+ B902(38, 32, vars=("*, self", "instance", "self")),
+ B902(40, 44, vars=("*, self", "instance", "self")),
+ B902(52, 17, vars=("'self'", "metaclass instance", "cls")),
+ B902(55, 20, vars=("'cls'", "metaclass class", "metacls")),
),
)
@@ -691,7 +724,7 @@
filename = Path(__file__).absolute().parent / "b903.py"
bbc = BugBearChecker(filename=str(filename))
errors = list(bbc.run())
- self.assertEqual(errors, self.errors(B903(32, 0), B903(38, 0)))
+ self.assertEqual(errors, self.errors(B903(31, 0), B903(37, 0)))
def test_b904(self):
filename = Path(__file__).absolute().parent / "b904.py"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/flake8-bugbear-23.7.10/tox.ini
new/flake8-bugbear-23.9.16/tox.ini
--- old/flake8-bugbear-23.7.10/tox.ini 2023-07-10 18:29:25.000000000 +0200
+++ new/flake8-bugbear-23.9.16/tox.ini 2023-09-16 22:26:06.000000000 +0200
@@ -1,14 +1,14 @@
# The test environment and commands
[tox]
# default environments to run without `-e`
-envlist = py38, py39, py310, py311, py312
+envlist = py38, py39, py310, py311, py312, pep8_naming
[gh-actions]
python =
3.8: py38
3.9: py39
3.10: py310
- 3.11: py311
+ 3.11: py311,pep8_naming
3.12: py312
[testenv]
@@ -21,6 +21,16 @@
coverage run tests/test_bugbear.py {posargs}
coverage report -m
+[testenv:pep8_naming]
+deps =
+ coverage
+ hypothesis
+ hypothesmith
+ pep8-naming
+commands =
+ coverage run tests/test_bugbear.py -k b902 {posargs}
+ coverage report -m
+
[testenv:py312]
deps =
# the other dependencies aren't yet installable on py312+