Hello community,
here is the log from the commit of package python-pep8-naming for openSUSE:Factory checked in at 2019-02-02 22:24:46
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-pep8-naming (Old)
and /work/SRC/openSUSE:Factory/.python-pep8-naming.new.28833 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-pep8-naming"
Sat Feb 2 22:24:46 2019 rev:4 rq:670749 version:0.8.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-pep8-naming/python-pep8-naming.changes 2018-12-24 11:47:41.817117762 +0100
+++ /work/SRC/openSUSE:Factory/.python-pep8-naming.new.28833/python-pep8-naming.changes 2019-02-02 22:24:55.242092197 +0100
@@ -1,0 +2,19 @@
+Sat Feb 2 17:04:38 UTC 2019 - Arun Persaud
+
+- specfile:
+ * update copyright year
+
+- update to version 0.8.0:
+ * Detect N806 errors within for loops and exception handlers.
+ * Improve support for non-ASCII characters.
+ * Detect mixedCased variable names at class (N815) and global (N816)
+ scope.
+ * Ignore Django's setUpTestData method by default.
+ * Fix column offsets for N803, N804, and N805 under Python 3.
+ * Detect underscores within class names as N801 errors.
+ * Don't flag __getattr__ and __dir__ as N807 errors. (See PEP 562).
+ * async function and method names are now checked.
+ * Detect N806 errors in generator expressions and comprehensions.
+ * Detect N81x errors in import x as y statements.
+
+-------------------------------------------------------------------
Old:
----
pep8-naming-0.7.0.tar.gz
New:
----
pep8-naming-0.8.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-pep8-naming.spec ++++++
--- /var/tmp/diff_new_pack.5IFOVN/_old 2019-02-02 22:24:55.758091739 +0100
+++ /var/tmp/diff_new_pack.5IFOVN/_new 2019-02-02 22:24:55.770091728 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-pep8-naming
#
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -18,25 +18,24 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-pep8-naming
-Version: 0.7.0
+Version: 0.8.0
Release: 0
Summary: Flake8 plugin for checking PEP-8 naming conventions
License: MIT
Group: Development/Languages/Python
-Url: https://github.com/flintwork/pep8-naming
+URL: https://github.com/flintwork/pep8-naming
Source: https://files.pythonhosted.org/packages/source/p/pep8-naming/pep8-naming-%{version}.tar.gz
BuildRequires: %{python_module setuptools}
BuildRequires: fdupes
BuildRequires: python-rpm-macros
-# SECTION test requirements
-BuildRequires: %{python_module flake8-polyfill >= 1.0.2}
-BuildRequires: %{python_module flake8}
-# /SECTION
Requires: python-flake8
Requires: python-flake8-polyfill >= 1.0.2
Requires: python-setuptools
BuildArch: noarch
-
+# SECTION test requirements
+BuildRequires: %{python_module flake8-polyfill >= 1.0.2}
+BuildRequires: %{python_module flake8}
+# /SECTION
%python_subpackages
%description
++++++ pep8-naming-0.7.0.tar.gz -> pep8-naming-0.8.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/CHANGELOG.rst new/pep8-naming-0.8.0/CHANGELOG.rst
--- old/pep8-naming-0.7.0/CHANGELOG.rst 2018-05-17 17:30:20.000000000 +0200
+++ new/pep8-naming-0.8.0/CHANGELOG.rst 2019-01-28 16:46:14.000000000 +0100
@@ -1,6 +1,30 @@
Changes
=======
+0.8.0 - 2019-01-28
+------------------
+
+* Detect N806 errors within ``for`` loops and exception handlers.
+
+* Improve support for non-ASCII characters.
+
+* Detect mixedCased variable names at class (N815) and global (N816) scope.
+
+* Ignore Django's ``setUpTestData`` method by default.
+
+* Fix column offsets for N803, N804, and N805 under Python 3.
+
+* Detect underscores within class names as N801 errors.
+
+* Don't flag ``__getattr__`` and ``__dir__`` as N807 errors. (See
+ `PEP 562 https://www.python.org/dev/peps/pep-0562/`_).
+
+* ``async`` function and method names are now checked.
+
+* Detect N806 errors in generator expressions and comprehensions.
+
+* Detect N81x errors in ``import x as y`` statements.
+
0.7.0 - 2018-05-17
------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/PKG-INFO new/pep8-naming-0.8.0/PKG-INFO
--- old/pep8-naming-0.7.0/PKG-INFO 2018-05-17 17:31:23.000000000 +0200
+++ new/pep8-naming-0.8.0/PKG-INFO 2019-01-28 16:49:34.000000000 +0100
@@ -1,13 +1,15 @@
Metadata-Version: 1.1
Name: pep8-naming
-Version: 0.7.0
+Version: 0.8.0
Summary: Check PEP-8 naming conventions, plugin for flake8
Home-page: https://github.com/PyCQA/pep8-naming
Author: Florent Xicluna
Author-email: florent.xicluna@gmail.com
License: Expat license
-Description-Content-Type: UNKNOWN
-Description: PEP-8 Naming Conventions
+Description: .. image:: https://travis-ci.org/PyCQA/pep8-naming.svg?branch=master
+ :target: https://travis-ci.org/PyCQA/pep8-naming
+
+ PEP-8 Naming Conventions
========================
Check the PEP-8 naming conventions.
@@ -66,6 +68,33 @@
+------+-------------------------------------------------------+
| N814 | camelcase imported as constant |
+------+-------------------------------------------------------+
+ | N815 | mixedCase variable in class scope |
+ +------+-------------------------------------------------------+
+ | N816 | mixedCase variable in global scope |
+ +------+-------------------------------------------------------+
+
+ Options
+ -------
+
+ The following flake8 options are added:
+
+ --ignore-names Ignore errors for specific variable names.
+
+ Currently, this option can only be used for N802 errors (`#43 https://github.com/PyCQA/pep8-naming/issues/43`_).
+
+ Default: ``setUp,tearDown,setUpClass,tearDownClass,setUpTestData``.
+
+ --classmethod-decorators List of method decorators pep8-naming plugin should consider class method.
+
+ Used to prevent false N804 errors.
+
+ Default: ``classmethod``.
+
+ --staticmethod-decorators List of method decorators pep8-naming plugin should consider static method.
+
+ Used to prevent false N805 errors.
+
+ Default: ``staticmethod``.
Keywords: flake8 pep8 naming
Platform: UNKNOWN
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/README.rst new/pep8-naming-0.8.0/README.rst
--- old/pep8-naming-0.7.0/README.rst 2018-05-05 01:12:53.000000000 +0200
+++ new/pep8-naming-0.8.0/README.rst 2018-08-14 17:57:14.000000000 +0200
@@ -1,3 +1,6 @@
+.. image:: https://travis-ci.org/PyCQA/pep8-naming.svg?branch=master
+ :target: https://travis-ci.org/PyCQA/pep8-naming
+
PEP-8 Naming Conventions
========================
@@ -57,3 +60,30 @@
+------+-------------------------------------------------------+
| N814 | camelcase imported as constant |
+------+-------------------------------------------------------+
+| N815 | mixedCase variable in class scope |
++------+-------------------------------------------------------+
+| N816 | mixedCase variable in global scope |
++------+-------------------------------------------------------+
+
+Options
+-------
+
+The following flake8 options are added:
+
+--ignore-names Ignore errors for specific variable names.
+
+ Currently, this option can only be used for N802 errors (`#43 https://github.com/PyCQA/pep8-naming/issues/43`_).
+
+ Default: ``setUp,tearDown,setUpClass,tearDownClass,setUpTestData``.
+
+--classmethod-decorators List of method decorators pep8-naming plugin should consider class method.
+
+ Used to prevent false N804 errors.
+
+ Default: ``classmethod``.
+
+--staticmethod-decorators List of method decorators pep8-naming plugin should consider static method.
+
+ Used to prevent false N805 errors.
+
+ Default: ``staticmethod``.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/run_tests.py new/pep8-naming-0.8.0/run_tests.py
--- old/pep8-naming-0.7.0/run_tests.py 2018-05-05 01:34:19.000000000 +0200
+++ new/pep8-naming-0.8.0/run_tests.py 2019-01-24 19:23:43.000000000 +0100
@@ -1,5 +1,7 @@
+import io
import optparse
import os
+import platform
import re
import sys
@@ -8,11 +10,13 @@
PyCF_ONLY_AST = 1024
-IS_PY3 = sys.version_info[0] == 3
-IS_PY3_TEST = re.compile(r"^#\s*python3\s*only")
-IS_PY2_TEST = re.compile(r"^#\s*python2\s*only")
-
-TESTCASE_RE = re.compile("^#: (?P<code>\w+)(\((?P<options>.+)\))?$")
+TESTCASE_RE = re.compile(
+ r'#: '
+ r'(?P<code>\w+:?\d*:?\d*)'
+ r'(\((?P<options>.+)\))?'
+ r'$'
+)
+EVAL_LOCALS = {'python_version': platform.python_version()[:3]}
def main():
@@ -20,7 +24,8 @@
test_count = 0
errors = 0
for filename in os.listdir('testsuite'):
- with open(os.path.join('testsuite', filename)) as fd:
+ filepath = os.path.join('testsuite', filename)
+ with io.open(filepath, encoding='utf8') as fd:
lines = list(fd)
if not is_test_allowed(lines):
continue
@@ -37,12 +42,9 @@
def is_test_allowed(lines):
- if IS_PY3 and any(IS_PY2_TEST.search(line) for line in lines[:3]):
- return False
-
- if not IS_PY3 and any(IS_PY3_TEST.search(line) for line in lines[:3]):
- return False
-
+ for line in lines[:3]:
+ if 'python_version' in line:
+ return eval(line[1:], {}, EVAL_LOCALS)
return True
@@ -84,21 +86,25 @@
def test_file(filename, lines, code, options):
- tree = compile(''.join(lines), '', 'exec', PyCF_ONLY_AST)
+ if code is None: # Invalid test case
+ return 0
+ source = ''.join(lines)
+ tree = compile(source, '', 'exec', PyCF_ONLY_AST)
checker = pep8ext_naming.NamingChecker(tree, filename)
parse_options(checker, options)
+ error_format = (
+ '{0}:{lineno}:{col_offset}' if ':' in code else '{0}').format
- found_errors = []
+ found_errors = set()
for lineno, col_offset, msg, instance in checker.run():
- found_errors.append(msg.split()[0])
+ found_errors.add(error_format(msg.split()[0], **locals()))
- if code is None: # Invalid test case
- return 0
if not found_errors and code == 'Okay': # Expected PASS
return 0
if code in found_errors: # Expected FAIL
return 0
- print("ERROR: %s not in %s" % (code, filename))
+ print("ERROR: %s not in %s. found_errors: %s. Source:\n%s"
+ % (code, filename, found_errors, source))
return 1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/src/pep8_naming.egg-info/PKG-INFO new/pep8-naming-0.8.0/src/pep8_naming.egg-info/PKG-INFO
--- old/pep8-naming-0.7.0/src/pep8_naming.egg-info/PKG-INFO 2018-05-17 17:31:23.000000000 +0200
+++ new/pep8-naming-0.8.0/src/pep8_naming.egg-info/PKG-INFO 2019-01-28 16:49:34.000000000 +0100
@@ -1,13 +1,15 @@
Metadata-Version: 1.1
Name: pep8-naming
-Version: 0.7.0
+Version: 0.8.0
Summary: Check PEP-8 naming conventions, plugin for flake8
Home-page: https://github.com/PyCQA/pep8-naming
Author: Florent Xicluna
Author-email: florent.xicluna@gmail.com
License: Expat license
-Description-Content-Type: UNKNOWN
-Description: PEP-8 Naming Conventions
+Description: .. image:: https://travis-ci.org/PyCQA/pep8-naming.svg?branch=master
+ :target: https://travis-ci.org/PyCQA/pep8-naming
+
+ PEP-8 Naming Conventions
========================
Check the PEP-8 naming conventions.
@@ -66,6 +68,33 @@
+------+-------------------------------------------------------+
| N814 | camelcase imported as constant |
+------+-------------------------------------------------------+
+ | N815 | mixedCase variable in class scope |
+ +------+-------------------------------------------------------+
+ | N816 | mixedCase variable in global scope |
+ +------+-------------------------------------------------------+
+
+ Options
+ -------
+
+ The following flake8 options are added:
+
+ --ignore-names Ignore errors for specific variable names.
+
+ Currently, this option can only be used for N802 errors (`#43 https://github.com/PyCQA/pep8-naming/issues/43`_).
+
+ Default: ``setUp,tearDown,setUpClass,tearDownClass,setUpTestData``.
+
+ --classmethod-decorators List of method decorators pep8-naming plugin should consider class method.
+
+ Used to prevent false N804 errors.
+
+ Default: ``classmethod``.
+
+ --staticmethod-decorators List of method decorators pep8-naming plugin should consider static method.
+
+ Used to prevent false N805 errors.
+
+ Default: ``staticmethod``.
Keywords: flake8 pep8 naming
Platform: UNKNOWN
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/src/pep8_naming.egg-info/SOURCES.txt new/pep8-naming-0.8.0/src/pep8_naming.egg-info/SOURCES.txt
--- old/pep8-naming-0.7.0/src/pep8_naming.egg-info/SOURCES.txt 2018-05-17 17:31:23.000000000 +0200
+++ new/pep8-naming-0.8.0/src/pep8_naming.egg-info/SOURCES.txt 2019-01-28 16:49:34.000000000 +0100
@@ -14,13 +14,27 @@
src/pep8_naming.egg-info/requires.txt
src/pep8_naming.egg-info/top_level.txt
testsuite/N801.py
+testsuite/N801_py3.py
testsuite/N802.py
+testsuite/N802_py3.py
+testsuite/N802_py35.py
testsuite/N803.py
testsuite/N803_py2.py
testsuite/N803_py3.py
+testsuite/N803_py35.py
testsuite/N804.py
+testsuite/N804_py35.py
testsuite/N805.py
+testsuite/N805_py35.py
testsuite/N806.py
testsuite/N806_py3.py
+testsuite/N806_py35.py
testsuite/N807.py
-testsuite/N81x.py
\ No newline at end of file
+testsuite/N807_py3.py
+testsuite/N807_py35.py
+testsuite/N815.py
+testsuite/N816.py
+testsuite/N816_py3.py
+testsuite/N816_py37.py
+testsuite/N81x.py
+testsuite/N81x_py3.py
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/src/pep8ext_naming.py new/pep8-naming-0.8.0/src/pep8ext_naming.py
--- old/pep8-naming-0.7.0/src/pep8ext_naming.py 2018-05-17 17:29:59.000000000 +0200
+++ new/pep8-naming-0.8.0/src/pep8ext_naming.py 2019-01-28 16:46:14.000000000 +0100
@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
"""Checker of PEP-8 Naming Conventions."""
-import re
import sys
from collections import deque
+from functools import partial
from flake8_polyfill import options
@@ -12,18 +12,23 @@
except ImportError:
from flake8.util import ast, iter_child_nodes
-__version__ = '0.7.0'
+__version__ = '0.8.0'
-LOWERCASE_REGEX = re.compile(r'[_a-z][_a-z0-9]*$')
-UPPERCASE_REGEX = re.compile(r'[_A-Z][_A-Z0-9]*$')
-MIXEDCASE_REGEX = re.compile(r'_?[A-Z][a-zA-Z0-9]*$')
-
-PY2 = sys.version_info[0] == 2
+PYTHON_VERSION = sys.version_info[:3]
+PY2 = PYTHON_VERSION[0] == 2
# Node types which may contain class methods
-METHOD_CONTAINER_NODES = {ast.If, ast.While, ast.For, ast.With} | (
- {ast.TryExcept, ast.TryFinally} if PY2 else {ast.Try})
+METHOD_CONTAINER_NODES = {ast.If, ast.While, ast.For, ast.With}
+FUNC_NODES = (ast.FunctionDef,)
+if PY2:
+ METHOD_CONTAINER_NODES |= {ast.TryExcept, ast.TryFinally}
+else:
+ METHOD_CONTAINER_NODES |= {ast.Try}
+
+if PYTHON_VERSION > (3, 5):
+ FUNC_NODES += (ast.AsyncFunctionDef,)
+ METHOD_CONTAINER_NODES |= {ast.AsyncWith, ast.AsyncFor}
if PY2:
def _unpack_args(args):
@@ -32,15 +37,16 @@
if isinstance(arg, ast.Tuple):
ret.extend(_unpack_args(arg.elts))
else:
- ret.append(arg.id)
+ ret.append((arg, arg.id))
return ret
- def get_arg_names(node):
+ def get_arg_name_tuples(node):
return _unpack_args(node.args.args)
else:
- def get_arg_names(node):
- pos_args = [arg.arg for arg in node.args.args]
- kw_only = [arg.arg for arg in node.args.kwonlyargs]
+ def get_arg_name_tuples(node):
+ args = node.args
+ pos_args = [(arg, arg.arg) for arg in args.args]
+ kw_only = [(arg, arg.arg) for arg in args.kwonlyargs]
return pos_args + kw_only
@@ -52,18 +58,18 @@
cls._checks = []
-def _err(self, node, code, name=None):
+def _err(self, node, code, **kwargs):
lineno, col_offset = node.lineno, node.col_offset
if isinstance(node, ast.ClassDef):
lineno += len(node.decorator_list)
col_offset += 6
- elif isinstance(node, ast.FunctionDef):
+ elif isinstance(node, FUNC_NODES):
lineno += len(node.decorator_list)
col_offset += 4
code_str = getattr(self, code)
- if name is not None:
- code_str = code_str.format(name=name)
- return (lineno, col_offset, '%s %s' % (code, code_str), self)
+ if kwargs:
+ code_str = code_str.format(**kwargs)
+ return lineno, col_offset + 1, '%s %s' % (code, code_str), self
BaseASTCheck = _ASTCheckMeta('BaseASTCheck', (object,),
@@ -94,7 +100,7 @@
"""Checker of PEP-8 Naming Conventions."""
name = 'naming'
version = __version__
- ignore_names = ['setUp', 'tearDown', 'setUpClass', 'tearDownClass']
+ ignore_names = ['setUp', 'tearDown', 'setUpClass', 'tearDownClass', 'setUpTestData']
decorator_to_type = _build_decorator_to_type(
_default_classmethod_decorators, _default_staticmethod_decorators)
@@ -156,7 +162,7 @@
def visit_node(self, node):
if isinstance(node, ast.ClassDef):
self.tag_class_functions(node)
- elif isinstance(node, ast.FunctionDef):
+ elif isinstance(node, FUNC_NODES):
self.find_global_defs(node)
method = 'visit_' + node.__class__.__name__.lower()
@@ -199,7 +205,7 @@
if type(node) in METHOD_CONTAINER_NODES:
self.set_function_nodes_types(
iter_child_nodes(node), ismetaclass, late_decoration)
- if not isinstance(node, ast.FunctionDef):
+ if not isinstance(node, FUNC_NODES):
continue
node.function_type = _FunctionType.METHOD
if node.name in ('__new__', '__init_subclass__') or ismetaclass:
@@ -214,7 +220,8 @@
if names:
node.function_type = names[0]
- def find_global_defs(self, func_def_node):
+ @staticmethod
+ def find_global_defs(func_def_node):
global_names = set()
nodes_to_check = deque(iter_child_nodes(func_def_node))
while nodes_to_check:
@@ -222,7 +229,7 @@
if isinstance(node, ast.Global):
global_names.update(node.names)
- if not isinstance(node, (ast.FunctionDef, ast.ClassDef)):
+ if not isinstance(node, (ast.ClassDef,) + FUNC_NODES):
nodes_to_check.extend(iter_child_nodes(node))
func_def_node.global_names = global_names
@@ -233,14 +240,15 @@
Classes for internal use have a leading underscore in addition.
"""
- check = MIXEDCASE_REGEX.match
N801 = "class name '{name}' should use CapWords convention"
def visit_classdef(self, node, parents, ignore=None):
- if ignore and node.name in ignore:
+ name = node.name
+ if ignore and name in ignore:
return
- if not self.check(node.name):
- yield self.err(node, 'N801', node.name)
+ name = name.strip('_')
+ if not name[:1].isupper() or '_' in name:
+ yield self.err(node, 'N801', name=name)
class FunctionNameCheck(BaseASTCheck):
@@ -253,7 +261,6 @@
mixedCase is allowed only in contexts where that's already the
prevailing style (e.g. threading.py), to retain backwards compatibility.
"""
- check = LOWERCASE_REGEX.match
N802 = "function name '{name}' should be lowercase"
N807 = "function name '{name}' should not start or end with '__'"
@@ -262,10 +269,14 @@
name = node.name
if ignore and name in ignore:
return
- if not self.check(name):
- yield self.err(node, 'N802', name)
+ if name in ('__dir__', '__getattr__'):
+ return
+ if not name.islower() and name != '_':
+ yield self.err(node, 'N802', name=name)
if function_type == 'function' and '__' in (name[:2], name[-2:]):
- yield self.err(node, 'N807', name)
+ yield self.err(node, 'N807', name=name)
+
+ visit_asyncfunctiondef = visit_functiondef
class FunctionArgNamesCheck(BaseASTCheck):
@@ -276,7 +287,6 @@
A classmethod should have 'cls' as first argument.
A method should have 'self' as first argument.
"""
- check = LOWERCASE_REGEX.match
N803 = "argument name '{name}' should be lowercase"
N804 = "first argument of a classmethod should be named 'cls'"
N805 = "first argument of a method should be named 'self'"
@@ -284,85 +294,90 @@
def visit_functiondef(self, node, parents, ignore=None):
def arg_name(arg):
- return getattr(arg, 'arg', arg)
-
- kwarg = arg_name(node.args.kwarg)
- if kwarg is not None:
- if not self.check(kwarg):
- yield self.err(node, 'N803', kwarg)
- return
+ try:
+ return arg, arg.arg
+ except AttributeError: # PY2
+ return node, arg
+
+ for arg, name in arg_name(node.args.vararg), arg_name(node.args.kwarg):
+ if name is not None:
+ if not name.islower():
+ yield self.err(arg, 'N803', name=name)
+ return
- vararg = arg_name(node.args.vararg)
- if vararg is not None:
- if not self.check(vararg):
- yield self.err(node, 'N803', vararg)
- return
- arg_names = get_arg_names(node)
- if not arg_names:
+ arg_name_tuples = get_arg_name_tuples(node)
+ if not arg_name_tuples:
return
+ arg0, name0 = arg_name_tuples[0]
function_type = getattr(node, 'function_type', 'function')
if function_type == _FunctionType.METHOD:
- if arg_names[0] != 'self':
- yield self.err(node, 'N805')
+ if name0 != 'self':
+ yield self.err(arg0, 'N805')
elif function_type == _FunctionType.CLASSMETHOD:
- if arg_names[0] != 'cls':
- yield self.err(node, 'N804')
- for arg in arg_names:
- if not self.check(arg):
- yield self.err(node, 'N803', arg)
+ if name0 != 'cls':
+ yield self.err(arg0, 'N804')
+ for arg, name in arg_name_tuples:
+ if not name.islower():
+ yield self.err(arg, 'N803', name=name)
return
+ visit_asyncfunctiondef = visit_functiondef
+
class ImportAsCheck(BaseASTCheck):
"""
Don't change the naming convention via an import
"""
- check_lower = LOWERCASE_REGEX.match
- check_upper = UPPERCASE_REGEX.match
- N811 = "constant '{name}' imported as non constant"
- N812 = "lowercase '{name}' imported as non lowercase"
- N813 = "camelcase '{name}' imported as lowercase"
- N814 = "camelcase '{name}' imported as constant"
+ N811 = "constant '{name}' imported as non constant '{asname}'"
+ N812 = "lowercase '{name}' imported as non lowercase '{asname}'"
+ N813 = "camelcase '{name}' imported as lowercase '{asname}'"
+ N814 = "camelcase '{name}' imported as constant '{asname}'"
def visit_importfrom(self, node, parents, ignore=None):
for name in node.names:
- if not name.asname:
+ asname = name.asname
+ if not asname:
continue
- if self.check_upper(name.name):
- if not self.check_upper(name.asname):
- yield self.err(node, 'N811', name.asname)
- elif self.check_lower(name.name):
- if not self.check_lower(name.asname):
- yield self.err(node, 'N812', name.asname)
- elif self.check_lower(name.asname):
- yield self.err(node, 'N813', name.asname)
- elif self.check_upper(name.asname):
- yield self.err(node, 'N814', name.asname)
+ original_name = name.name
+ err_kwargs = {'name': original_name, 'asname': asname}
+ if original_name.isupper():
+ if not asname.isupper():
+ yield self.err(node, 'N811', **err_kwargs)
+ elif original_name.islower():
+ if not asname.islower():
+ yield self.err(node, 'N812', **err_kwargs)
+ elif asname.islower():
+ yield self.err(node, 'N813', **err_kwargs)
+ elif asname.isupper():
+ yield self.err(node, 'N814', **err_kwargs)
+
+ visit_import = visit_importfrom
-class VariablesInFunctionCheck(BaseASTCheck):
+class VariablesCheck(BaseASTCheck):
"""
Local variables in functions should be lowercase
"""
- check = LOWERCASE_REGEX.match
N806 = "variable '{name}' in function should be lowercase"
+ N815 = "variable '{name}' in class scope should not be mixedCase"
+ N816 = "variable '{name}' in global scope should not be mixedCase"
def _find_errors(self, assignment_target, parents):
for parent_func in reversed(parents):
if isinstance(parent_func, ast.ClassDef):
- return
- if isinstance(parent_func, ast.FunctionDef):
+ checker = self.class_variable_check
+ break
+ if isinstance(parent_func, FUNC_NODES):
+ checker = partial(self.function_variable_check, parent_func)
break
else:
- return
+ checker = self.global_variable_check
for name in _extract_names(assignment_target):
- if name in parent_func.global_names:
- continue
- if self.check(name) or name[:1] == '_':
- continue
- yield self.err(assignment_target, 'N806', name)
+ error_code = checker(name)
+ if error_code:
+ yield self.err(assignment_target, error_code, name=name)
def visit_assign(self, node, parents, ignore=None):
if isinstance(node.value, ast.Call):
@@ -385,6 +400,44 @@
for error in self._find_errors(item.optional_vars, parents):
yield error
+ visit_asyncwith = visit_with
+
+ def visit_for(self, node, parents, ignore):
+ for error in self._find_errors(node.target, parents):
+ yield error
+
+ visit_asyncfor = visit_for
+
+ def visit_excepthandler(self, node, parents, ignore):
+ if node.name:
+ for error in self._find_errors(node, parents):
+ yield error
+
+ def visit_generatorexp(self, node, parents, ignore):
+ for gen in node.generators:
+ for error in self._find_errors(gen.target, parents):
+ yield error
+
+ visit_listcomp = visit_dictcomp = visit_setcomp = visit_generatorexp
+
+ @staticmethod
+ def global_variable_check(name):
+ if is_mixed_case(name):
+ return 'N816'
+
+ @staticmethod
+ def class_variable_check(name):
+ if is_mixed_case(name):
+ return 'N815'
+
+ @staticmethod
+ def function_variable_check(func, var_name):
+ if var_name in func.global_names:
+ return None
+ if var_name.islower() or var_name == '_':
+ return None
+ return 'N806'
+
def _extract_names(assignment_target):
"""Yield assignment_target ids."""
@@ -403,3 +456,14 @@
elif not PY2 and element_type is ast.Starred: # PEP 3132
for n in _extract_names(element.value):
yield n
+ return
+ if target_type is ast.ExceptHandler:
+ if PY2:
+ yield assignment_target.name.id
+ else:
+ yield assignment_target.name
+ return
+
+
+def is_mixed_case(name):
+ return name.lower() != name and name.lstrip('_')[:1].islower()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/testsuite/N801.py new/pep8-naming-0.8.0/testsuite/N801.py
--- old/pep8-naming-0.7.0/testsuite/N801.py 2017-01-19 15:23:08.000000000 +0100
+++ new/pep8-naming-0.8.0/testsuite/N801.py 2018-08-14 17:57:14.000000000 +0200
@@ -9,3 +9,40 @@
#: Okay
class VeryGood(object):
pass
+#: N801:1:7
+class _:
+ pass
+#: N801:1:7
+class BAD_NAME:
+ pass
+#: Okay
+class Fine_:
+ pass
+#: Okay
+class Fine__:
+ pass
+#: Okay
+class G_:
+ pass
+#: N801:1:7
+class Not_Good:
+ pass
+#: Okay
+class __Fine:
+ pass
+# The following cases are currently OK, but perhaps could be errors.
+#: Okay
+class MEHHHH:
+ pass
+#: Okay
+class __Meh__:
+ pass
+#: Okay
+class __MEH:
+ pass
+#: Okay
+class MEH__:
+ pass
+#: Okay
+class __MEH__:
+ pass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/testsuite/N801_py3.py new/pep8-naming-0.8.0/testsuite/N801_py3.py
--- old/pep8-naming-0.7.0/testsuite/N801_py3.py 1970-01-01 01:00:00.000000000 +0100
+++ new/pep8-naming-0.8.0/testsuite/N801_py3.py 2019-01-24 19:23:43.000000000 +0100
@@ -0,0 +1,19 @@
+# python_version >= '3'
+#: Okay
+class Γ:
+ pass
+#: Okay
+class ΓγΓγ:
+ pass
+#: Okay
+class ΓγΓ6:
+ pass
+#: Okay
+class _Γ:
+ pass
+#: N801:1:7
+class γ:
+ pass
+#: N801
+class _γ:
+ pass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/testsuite/N802.py new/pep8-naming-0.8.0/testsuite/N802.py
--- old/pep8-naming-0.7.0/testsuite/N802.py 2018-05-05 01:12:53.000000000 +0200
+++ new/pep8-naming-0.8.0/testsuite/N802.py 2018-08-14 17:57:14.000000000 +0200
@@ -16,7 +16,7 @@
#: Okay
def _go_od_():
pass
-#: N802
+#: N802:1:5
def NotOK():
pass
#: Okay
@@ -56,3 +56,5 @@
pass
def tearDownClass(self):
pass
+ def setUpTestData(self):
+ pass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/testsuite/N802_py3.py new/pep8-naming-0.8.0/testsuite/N802_py3.py
--- old/pep8-naming-0.7.0/testsuite/N802_py3.py 1970-01-01 01:00:00.000000000 +0100
+++ new/pep8-naming-0.8.0/testsuite/N802_py3.py 2019-01-24 19:23:43.000000000 +0100
@@ -0,0 +1,7 @@
+# python_version >= '3'
+#: Okay
+def γ(x):
+ pass
+#: Okay
+def γ6(x):
+ pass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/testsuite/N802_py35.py new/pep8-naming-0.8.0/testsuite/N802_py35.py
--- old/pep8-naming-0.7.0/testsuite/N802_py35.py 1970-01-01 01:00:00.000000000 +0100
+++ new/pep8-naming-0.8.0/testsuite/N802_py35.py 2019-01-24 19:23:43.000000000 +0100
@@ -0,0 +1,9 @@
+# python_version >= '3.5'
+#: Okay
+async def func(param1, param2):
+ do_stuff()
+ await some_coroutine()
+#: N802
+async def Func(param1, param2):
+ do_stuff()
+ await some_coroutine()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/testsuite/N803.py new/pep8-naming-0.8.0/testsuite/N803.py
--- old/pep8-naming-0.7.0/testsuite/N803.py 2017-01-19 15:23:08.000000000 +0100
+++ new/pep8-naming-0.8.0/testsuite/N803.py 2018-08-14 17:57:14.000000000 +0200
@@ -37,10 +37,10 @@
#: N803
def b13(BAD, *VERYBAD, **EXTRABAD):
pass
-#: N803
+#: N803:1:9
def b14(BAD):
pass
-#: N803
+#: N803:2:24
class Test(object):
def __init__(self, BAD):
pass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/testsuite/N803_py2.py new/pep8-naming-0.8.0/testsuite/N803_py2.py
--- old/pep8-naming-0.7.0/testsuite/N803_py2.py 2017-01-19 15:23:08.000000000 +0100
+++ new/pep8-naming-0.8.0/testsuite/N803_py2.py 2019-01-24 19:23:43.000000000 +0100
@@ -1,4 +1,4 @@
-# python2 only
+# python_version < '3'
#: Okay
def test(a, b, (good, verygood)):
pass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/testsuite/N803_py3.py new/pep8-naming-0.8.0/testsuite/N803_py3.py
--- old/pep8-naming-0.7.0/testsuite/N803_py3.py 2017-01-19 15:23:08.000000000 +0100
+++ new/pep8-naming-0.8.0/testsuite/N803_py3.py 2019-01-24 19:23:43.000000000 +0100
@@ -1,4 +1,4 @@
-# python3 only
+# python_version >= '3'
#: Okay
def compare(a, b, *, key=None):
pass
@@ -11,3 +11,21 @@
#: N803
def compare(a, b, *ok, fine=None, **BAD):
pass
+#: Okay
+def foo(α, ß, γ):
+ pass
+#: Okay
+def foo(α, ß=''):
+ pass
+#: Okay
+def foo(**κ):
+ pass
+#: Okay
+def foo(*α):
+ pass
+#: Okay
+def foo(**κ2):
+ pass
+#: Okay
+def foo(*α2):
+ pass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/testsuite/N803_py35.py new/pep8-naming-0.8.0/testsuite/N803_py35.py
--- old/pep8-naming-0.7.0/testsuite/N803_py35.py 1970-01-01 01:00:00.000000000 +0100
+++ new/pep8-naming-0.8.0/testsuite/N803_py35.py 2019-01-24 19:23:43.000000000 +0100
@@ -0,0 +1,7 @@
+# python_version >= '3.5'
+#: Okay
+async def compare(a, b, *, key=None):
+ pass
+#: N803
+async def compare(a, b, *, BAD=None):
+ pass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/testsuite/N804.py new/pep8-naming-0.8.0/testsuite/N804.py
--- old/pep8-naming-0.7.0/testsuite/N804.py 2018-05-06 13:50:37.000000000 +0200
+++ new/pep8-naming-0.8.0/testsuite/N804.py 2018-08-14 17:57:14.000000000 +0200
@@ -1,4 +1,4 @@
-#: N804
+#: N804:7:13
class Foo(object):
@classmethod
def mmm(cls, ads):
@@ -14,7 +14,7 @@
def __init_subclass(self, ads):
pass
-#: N804(--classmethod-decorators=clazzy,cool)
+#: N804:3:14(--classmethod-decorators=clazzy,cool)
class NewClassIsRequired(object):
@cool
def test(self, sy):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/testsuite/N804_py35.py new/pep8-naming-0.8.0/testsuite/N804_py35.py
--- old/pep8-naming-0.7.0/testsuite/N804_py35.py 1970-01-01 01:00:00.000000000 +0100
+++ new/pep8-naming-0.8.0/testsuite/N804_py35.py 2019-01-24 19:23:43.000000000 +0100
@@ -0,0 +1,37 @@
+# python_version >= '3.5'
+#: N804:7:19
+class Foo(object):
+ @classmethod
+ async def mmm(cls, ads):
+ pass
+
+ @classmethod
+ async def bad(self, ads):
+ pass
+
+ @calling()
+ async def test(self, ads):
+ pass
+
+ async def __init_subclass(self, ads):
+ pass
+#: N804:3:20(--classmethod-decorators=clazzy,cool)
+class NewClassIsRequired(object):
+ @cool
+ async def test(self, sy):
+ pass
+#: N804
+class Meta(type):
+ async def __new__(self, name, bases, attrs):
+ pass
+#: Okay
+class MetaMethod(type):
+ async def test(cls):
+ pass
+#: Okay
+class NotMeta(object):
+ otherclass = Foo
+class AttributeParent(NotMeta.otherclass):
+ pass
+class CallParent(type('_tmp', (), {})):
+ pass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/testsuite/N805.py new/pep8-naming-0.8.0/testsuite/N805.py
--- old/pep8-naming-0.7.0/testsuite/N805.py 2018-05-05 01:12:53.000000000 +0200
+++ new/pep8-naming-0.8.0/testsuite/N805.py 2018-08-14 17:57:14.000000000 +0200
@@ -1,3 +1,13 @@
+#: Okay
+class C:
+ def __init__(*args, **kwargs):
+ pass
+#: N805:4:11
+class C:
+ @decorator(
+ 'a')
+ def m(cls, k='w'): # noqa: N805
+ pass
#: N805
class Foo(object):
def good(self, ads):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/testsuite/N805_py35.py new/pep8-naming-0.8.0/testsuite/N805_py35.py
--- old/pep8-naming-0.7.0/testsuite/N805_py35.py 1970-01-01 01:00:00.000000000 +0100
+++ new/pep8-naming-0.8.0/testsuite/N805_py35.py 2019-01-24 19:23:43.000000000 +0100
@@ -0,0 +1,16 @@
+# python_version >= '3.5'
+#: Okay
+class C:
+ async def __init__(*args, **kwargs):
+ pass
+#: N805:4:17
+class C:
+ @decorator(
+ 'a')
+ async def m(cls, k='w'): # noqa: N805
+ pass
+#: N805(--staticmethod-decorators=exstatik,stcmthd)
+class ButWeLostTheOriginalStaticMethodLateDecorator(object):
+ async def test(so, exciting):
+ pass
+ test = staticmethod(test)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/testsuite/N806.py new/pep8-naming-0.8.0/testsuite/N806.py
--- old/pep8-naming-0.7.0/testsuite/N806.py 2018-05-17 17:27:10.000000000 +0200
+++ new/pep8-naming-0.8.0/testsuite/N806.py 2019-01-24 19:23:43.000000000 +0100
@@ -100,3 +100,69 @@
def f():
with C() as (a, b, baD):
pass
+#: Okay
+def f():
+ for i in iterator:
+ pass
+#: N806:2:9
+def f():
+ for Bad in iterator:
+ pass
+#: Okay
+def f():
+ for a, b in enumerate(iterator):
+ pass
+#: N806
+def f():
+ for index, ITEM in enumerate(iterator):
+ pass
+#: N806
+def f():
+ try:
+ f()
+ except Exception as Bad:
+ pass
+#: Okay
+def f():
+ try:
+ f()
+ except Exception as good:
+ pass
+#: Okay
+def f():
+ try:
+ f()
+ except:
+ pass
+#: Okay
+def f():
+ try:
+ f()
+ except good:
+ pass
+#: N806
+def f():
+ try:
+ f()
+ except RuntimeError as good:
+ pass
+ except IndexError as BAD:
+ pass
+#: Okay
+def f():
+ return [i for i in range(3)]
+#: N806:2:22
+def t():
+ return [ITEM for ITEM in range(3)]
+#: N806:2:24
+def d():
+ return {AA: BB for AA, BB in {}}
+#: N806:2:22
+def s():
+ return {Item for Item in range(3)}
+#: N806:2:57
+def n():
+ return (good + BAD for good in range(3) if good for BAD in range(3) if BAD)
+#: N806:2:26
+def e():
+ return tuple(BaD for BaD in range(2))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/testsuite/N806_py3.py new/pep8-naming-0.8.0/testsuite/N806_py3.py
--- old/pep8-naming-0.7.0/testsuite/N806_py3.py 2018-05-17 17:27:10.000000000 +0200
+++ new/pep8-naming-0.8.0/testsuite/N806_py3.py 2019-01-24 19:23:43.000000000 +0100
@@ -1,7 +1,9 @@
-# python3 only
+# python_version >= '3'
#: Okay
VAR1, *VAR2, VAR3 = 1, 2, 3
#: Okay
+Α, *Β, Γ = 1, 2, 3
+#: Okay
[VAR1, *VAR2, VAR3] = (1, 2, 3)
#: N806
def extended_unpacking_not_ok():
@@ -15,3 +17,20 @@
#: N806
def assing_to_unpack_not_ok():
a, *[bB] = 1, 2
+#: Okay
+Γ = 1
+#: N806
+def f():
+ Δ = 1
+#: N806
+def f():
+ _Δ = 1
+#: Okay
+def f():
+ γ = 1
+#: Okay
+def f():
+ _γ = 1
+#: Okay
+def f():
+ h, _, γ = s.partition('sep')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/testsuite/N806_py35.py new/pep8-naming-0.8.0/testsuite/N806_py35.py
--- old/pep8-naming-0.7.0/testsuite/N806_py35.py 1970-01-01 01:00:00.000000000 +0100
+++ new/pep8-naming-0.8.0/testsuite/N806_py35.py 2019-01-24 19:23:43.000000000 +0100
@@ -0,0 +1,8 @@
+# python_version >= '3.5'
+#: Okay
+async def test():
+ good = 1
+#: N806
+async def f():
+ async with expr as ASYNC_VAR:
+ pass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/testsuite/N807.py new/pep8-naming-0.8.0/testsuite/N807.py
--- old/pep8-naming-0.7.0/testsuite/N807.py 2018-05-14 15:32:13.000000000 +0200
+++ new/pep8-naming-0.8.0/testsuite/N807.py 2018-09-07 17:05:25.000000000 +0200
@@ -24,7 +24,7 @@
#: N807
def __bad():
pass
-#: N807
+#: N807:1:5
def bad__():
pass
#: N807
@@ -35,3 +35,9 @@
def method(self):
def __bad():
pass
+#: Okay
+def __dir__():
+ pass
+#: Okay
+def __getattr__(name):
+ pass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/testsuite/N807_py3.py new/pep8-naming-0.8.0/testsuite/N807_py3.py
--- old/pep8-naming-0.7.0/testsuite/N807_py3.py 1970-01-01 01:00:00.000000000 +0100
+++ new/pep8-naming-0.8.0/testsuite/N807_py3.py 2019-01-24 19:23:43.000000000 +0100
@@ -0,0 +1,15 @@
+# python_version >= '3'
+#: Okay
+class C:
+ def γ(self):
+ pass
+#: N807
+def __β(self):
+ pass
+#: N807
+def __β6(self):
+ pass
+#: Okay
+class C:
+ def γ1(self):
+ pass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/testsuite/N807_py35.py new/pep8-naming-0.8.0/testsuite/N807_py35.py
--- old/pep8-naming-0.7.0/testsuite/N807_py35.py 1970-01-01 01:00:00.000000000 +0100
+++ new/pep8-naming-0.8.0/testsuite/N807_py35.py 2019-01-24 19:23:43.000000000 +0100
@@ -0,0 +1,8 @@
+# python_version >= '3.5'
+#: Okay
+class C:
+ async def γ(self):
+ pass
+#: N807
+async def __β(self):
+ pass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/testsuite/N815.py new/pep8-naming-0.8.0/testsuite/N815.py
--- old/pep8-naming-0.7.0/testsuite/N815.py 1970-01-01 01:00:00.000000000 +0100
+++ new/pep8-naming-0.8.0/testsuite/N815.py 2018-08-14 17:57:14.000000000 +0200
@@ -0,0 +1,18 @@
+#: Okay
+class C:
+ a = 0
+#: Okay
+class C:
+ lowercase = 0
+#: Okay
+class C:
+ v1 = 0
+#: Okay
+class C:
+ _1 = 0
+#: N815:2:5
+class C:
+ mixedCase = 0
+#: N815
+class C:
+ mixed_Case = 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/testsuite/N816.py new/pep8-naming-0.8.0/testsuite/N816.py
--- old/pep8-naming-0.7.0/testsuite/N816.py 1970-01-01 01:00:00.000000000 +0100
+++ new/pep8-naming-0.8.0/testsuite/N816.py 2018-08-14 17:57:14.000000000 +0200
@@ -0,0 +1,20 @@
+#: Okay
+GLOBAL_UPPER_CASE = 0
+#: N816
+mixedCase = 0
+#: N816:1:1
+mixed_Case = 0
+#: Okay
+_C = 0
+#: Okay
+__D = 0
+#: N816
+__mC = 0
+#: N816
+__mC__ = 0
+#: Okay
+__C6__ = 0
+#: Okay
+C6 = 0
+#: Okay
+C_6 = 0.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/testsuite/N816_py3.py new/pep8-naming-0.8.0/testsuite/N816_py3.py
--- old/pep8-naming-0.7.0/testsuite/N816_py3.py 1970-01-01 01:00:00.000000000 +0100
+++ new/pep8-naming-0.8.0/testsuite/N816_py3.py 2019-01-24 19:23:43.000000000 +0100
@@ -0,0 +1,17 @@
+# python_version >= '3'
+#: Okay
+Γ = 1
+#: N816
+γΓ = 1
+#: Okay
+Γ1 = 1
+#: Okay
+Γ_ = 1
+#: Okay
+Γ_1 = 1
+#: Okay
+Γ1_ = 1
+#: N816
+γΓ1 = 1
+#: N816
+_γ1Γ = 1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/testsuite/N816_py37.py new/pep8-naming-0.8.0/testsuite/N816_py37.py
--- old/pep8-naming-0.7.0/testsuite/N816_py37.py 1970-01-01 01:00:00.000000000 +0100
+++ new/pep8-naming-0.8.0/testsuite/N816_py37.py 2019-01-24 19:23:43.000000000 +0100
@@ -0,0 +1,13 @@
+# python_version >= '3.7'
+#: Okay
+async with expr as Γ:
+ pass
+#: N816
+async with expr as γΓ:
+ pass
+#: Okay
+async for Γ1 in iterator:
+ pass
+#: N816
+async for γΓ1 in iterator:
+ pass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/testsuite/N81x.py new/pep8-naming-0.8.0/testsuite/N81x.py
--- old/pep8-naming-0.7.0/testsuite/N81x.py 2017-01-19 15:23:08.000000000 +0100
+++ new/pep8-naming-0.8.0/testsuite/N81x.py 2019-01-24 19:23:43.000000000 +0100
@@ -1,12 +1,16 @@
+#: N812:1:1
+import os as OS
+#: Okay
+import os as myos
#: Okay
import good as good
#: Okay
from mod import good as nice, NICE as GOOD, Camel as Memel
-#: N811
+#: N811:1:1
from mod import GOOD as bad
-#: N812
+#: N812:1:1
from mod import good as Bad
-#: N813
+#: N813:1:1
from mod import CamelCase as noncamle
-#: N814
+#: N814:1:1
from mod import CamelCase as CONSTANT
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pep8-naming-0.7.0/testsuite/N81x_py3.py new/pep8-naming-0.8.0/testsuite/N81x_py3.py
--- old/pep8-naming-0.7.0/testsuite/N81x_py3.py 1970-01-01 01:00:00.000000000 +0100
+++ new/pep8-naming-0.8.0/testsuite/N81x_py3.py 2019-01-24 19:23:43.000000000 +0100
@@ -0,0 +1,11 @@
+# python_version >= '3'
+#: Okay
+import good as γ
+#: Okay
+from mod import good as γ
+#: Okay
+import GOOD as Γ
+#: Okay
+from mod import GOOD as Γ
+#: Okay
+from mod import GOOD as Γ1