Hello community,
here is the log from the commit of package python-autopep8 for openSUSE:Factory
checked in at 2020-08-18 15:08:19
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-autopep8 (Old)
and /work/SRC/openSUSE:Factory/.python-autopep8.new.3399 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-autopep8"
Tue Aug 18 15:08:19 2020 rev:20 rq:826935 version:1.5.4
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-autopep8/python-autopep8.changes
2020-06-10 00:49:08.787059615 +0200
+++
/work/SRC/openSUSE:Factory/.python-autopep8.new.3399/python-autopep8.changes
2020-08-18 15:08:27.059976126 +0200
@@ -1,0 +2,21 @@
+Sat Aug 15 16:46:41 UTC 2020 - Arun Persaud <[email protected]>
+
+- update to version 1.5.4:
+ * Merge pull request #565 from hhatto/fix-issue-564
+ * ignore SyntaxWarning in Python3.8+ when calling built-in compile()
+ method
+ * fix pytest command
+ * fix coverage and upload codecov
+ * install depends
+ * flake8 target only autopep8.py
+ * Fix pycodestyle
+ * Revert formatting changes outside scope of this feature
+ * Move the on-off tests to under unit-tests
+ * Correct line number weirdness
+ * Add tests
+ * Improved efficiency of search for enabled/disable
+ * added basic on-off functionality to autopep8
+ * Merge pull request #553 from hhatto/issue-551
+ * fix: ignoring w292 with in-place option
+
+-------------------------------------------------------------------
Old:
----
autopep8-1.5.3.tar.gz
New:
----
autopep8-1.5.4.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-autopep8.spec ++++++
--- /var/tmp/diff_new_pack.U51EpP/_old 2020-08-18 15:08:28.975976919 +0200
+++ /var/tmp/diff_new_pack.U51EpP/_new 2020-08-18 15:08:28.979976920 +0200
@@ -18,7 +18,7 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-autopep8
-Version: 1.5.3
+Version: 1.5.4
Release: 0
Summary: Automatic generated to pep8 checked code
License: MIT
++++++ autopep8-1.5.3.tar.gz -> autopep8-1.5.4.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/autopep8-1.5.3/AUTHORS.rst
new/autopep8-1.5.4/AUTHORS.rst
--- old/autopep8-1.5.3/AUTHORS.rst 2017-03-07 15:47:51.000000000 +0100
+++ new/autopep8-1.5.4/AUTHORS.rst 2020-08-02 04:15:48.000000000 +0200
@@ -22,3 +22,27 @@
- Fabio Zadrozny (https://github.com/fabioz)
- Alex Chernetz (https://github.com/achernet)
- Marc Schlaich (https://github.com/schlamar)
+- E. M. Bray (https://github.com/embray)
+- Thomas Hisch (https://github.com/thisch)
+- Florian Best (https://github.com/spaceone)
+- Ian Clark (https://github.com/evenicoulddoit)
+- Khairi Hafsham (https://github.com/khairihafsham)
+- Neil Halelamien (https://github.com/neilsh)
+- Hashem Nasarat (https://github.com/Hnasar)
+- Hugo van Kemenade (https://github.com/hugovk)
+- gmbnomis (https://github.com/gmbnomis)
+- Samuel Lelièvre (https://github.com/slel)
+- bigredengineer (https://github.com/bigredengineer)
+- Kai Chen (https://github.com/kx-chen)
+- Anthony Sottile (https://github.com/asottile)
+- 秋葉 (https://github.com/Hanaasagi)
+- Christian Clauss (https://github.com/cclauss)
+- tobixx (https://github.com/tobixx)
+- bigredengineer (https://github.com/bigredengineer)
+- Bastien Gérard (https://github.com/bagerard)
+- nicolasbonifas (https://github.com/nicolasbonifas)
+- Andrii Yurchuk (https://github.com/Ch00k)
+- José M. Guisado (https://github.com/pvxe)
+- Dai Truong (https://github.com/NovaDev94)
+- jnozsc (https://github.com/jnozsc)
+- Edwin Shepherd (https://github.com/shardros)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/autopep8-1.5.3/PKG-INFO new/autopep8-1.5.4/PKG-INFO
--- old/autopep8-1.5.3/PKG-INFO 2020-05-31 16:15:33.755008500 +0200
+++ new/autopep8-1.5.4/PKG-INFO 2020-08-02 06:28:35.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: autopep8
-Version: 1.5.3
+Version: 1.5.4
Summary: A tool that automatically formats Python code to conform to the PEP 8
style guide
Home-page: https://github.com/hhatto/autopep8
Author: Hideo Hattori
@@ -14,10 +14,14 @@
:target: https://pypi.org/project/autopep8/
:alt: PyPI Version
- .. image:: https://travis-ci.org/hhatto/autopep8.svg?branch=master
- :target: https://travis-ci.org/hhatto/autopep8
+ .. image::
https://github.com/hhatto/autopep8/workflows/Python%20package/badge.svg
+ :target: https://github.com/hhatto/autopep8/actions
:alt: Build status
+ .. image::
https://codecov.io/gh/hhatto/autopep8/branch/master/graph/badge.svg
+ :target: https://codecov.io/gh/hhatto/autopep8
+ :alt: Code Coverage
+
autopep8 automatically formats Python code to conform to the `PEP 8`_
style
guide. It uses the pycodestyle_ utility to determine what parts of the
code
needs to be formatted. autopep8 is capable of fixing most of the
formatting
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/autopep8-1.5.3/README.rst
new/autopep8-1.5.4/README.rst
--- old/autopep8-1.5.3/README.rst 2020-05-31 15:08:01.000000000 +0200
+++ new/autopep8-1.5.4/README.rst 2020-07-31 08:06:41.000000000 +0200
@@ -6,10 +6,14 @@
:target: https://pypi.org/project/autopep8/
:alt: PyPI Version
-.. image:: https://travis-ci.org/hhatto/autopep8.svg?branch=master
- :target: https://travis-ci.org/hhatto/autopep8
+.. image::
https://github.com/hhatto/autopep8/workflows/Python%20package/badge.svg
+ :target: https://github.com/hhatto/autopep8/actions
:alt: Build status
+.. image:: https://codecov.io/gh/hhatto/autopep8/branch/master/graph/badge.svg
+ :target: https://codecov.io/gh/hhatto/autopep8
+ :alt: Code Coverage
+
autopep8 automatically formats Python code to conform to the `PEP 8`_ style
guide. It uses the pycodestyle_ utility to determine what parts of the code
needs to be formatted. autopep8 is capable of fixing most of the formatting
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/autopep8-1.5.3/autopep8.egg-info/PKG-INFO
new/autopep8-1.5.4/autopep8.egg-info/PKG-INFO
--- old/autopep8-1.5.3/autopep8.egg-info/PKG-INFO 2020-05-31
16:15:33.000000000 +0200
+++ new/autopep8-1.5.4/autopep8.egg-info/PKG-INFO 2020-08-02
06:28:35.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: autopep8
-Version: 1.5.3
+Version: 1.5.4
Summary: A tool that automatically formats Python code to conform to the PEP 8
style guide
Home-page: https://github.com/hhatto/autopep8
Author: Hideo Hattori
@@ -14,10 +14,14 @@
:target: https://pypi.org/project/autopep8/
:alt: PyPI Version
- .. image:: https://travis-ci.org/hhatto/autopep8.svg?branch=master
- :target: https://travis-ci.org/hhatto/autopep8
+ .. image::
https://github.com/hhatto/autopep8/workflows/Python%20package/badge.svg
+ :target: https://github.com/hhatto/autopep8/actions
:alt: Build status
+ .. image::
https://codecov.io/gh/hhatto/autopep8/branch/master/graph/badge.svg
+ :target: https://codecov.io/gh/hhatto/autopep8
+ :alt: Code Coverage
+
autopep8 automatically formats Python code to conform to the `PEP 8`_
style
guide. It uses the pycodestyle_ utility to determine what parts of the
code
needs to be formatted. autopep8 is capable of fixing most of the
formatting
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/autopep8-1.5.3/autopep8.py
new/autopep8-1.5.4/autopep8.py
--- old/autopep8-1.5.3/autopep8.py 2020-05-31 16:00:34.000000000 +0200
+++ new/autopep8-1.5.4/autopep8.py 2020-08-02 04:24:44.000000000 +0200
@@ -58,6 +58,7 @@
import textwrap
import token
import tokenize
+import warnings
import ast
try:
from configparser import ConfigParser as SafeConfigParser
@@ -77,7 +78,7 @@
unicode = str
-__version__ = '1.5.3'
+__version__ = '1.5.4'
CR = '\r'
@@ -92,6 +93,8 @@
BARE_EXCEPT_REGEX = re.compile(r'except\s*:')
STARTSWITH_DEF_REGEX = re.compile(r'^(async\s+def|def)\s.*\):')
DOCSTRING_START_REGEX = re.compile(r'^u?r?(?P<kind>["\']{3})')
+ENABLE_REGEX = re.compile(r'# *(fmt|autopep8): *on')
+DISABLE_REGEX = re.compile(r'# *(fmt|autopep8): *off')
EXIT_CODE_OK = 0
EXIT_CODE_ERROR = 1
@@ -3222,6 +3225,73 @@
return False
+def find_with_line_numbers(pattern, contents):
+ """A wrapper around 're.finditer' to find line numbers.
+
+ Returns a list of line numbers where pattern was found in contents.
+ """
+ matches = list(re.finditer(pattern, contents))
+ if not matches:
+ return []
+
+ end = matches[-1].start()
+
+ # -1 so a failed `rfind` maps to the first line.
+ newline_offsets = {
+ -1: 0
+ }
+ for line_num, m in enumerate(re.finditer(r'\n', contents), 1):
+ offset = m.start()
+ if offset > end:
+ break
+ newline_offsets[offset] = line_num
+
+ def get_line_num(match, contents):
+ """Get the line number of string in a files contents.
+
+ Failing to find the newline is OK, -1 maps to 0
+
+ """
+ newline_offset = contents.rfind('\n', 0, match.start())
+ return newline_offsets[newline_offset]
+
+ return [get_line_num(match, contents) + 1 for match in matches]
+
+
+def get_disabled_ranges(source):
+ """Returns a list of tuples representing the disabled ranges.
+
+ If disabled and no re-enable will disable for rest of file.
+
+ """
+ enable_line_nums = find_with_line_numbers(ENABLE_REGEX, source)
+ disable_line_nums = find_with_line_numbers(DISABLE_REGEX, source)
+ total_lines = len(re.findall("\n", source)) + 1
+
+ enable_commands = {}
+ for num in enable_line_nums:
+ enable_commands[num] = True
+ for num in disable_line_nums:
+ enable_commands[num] = False
+
+ disabled_ranges = []
+ currently_enabled = True
+ disabled_start = None
+
+ for line, commanded_enabled in sorted(enable_commands.items()):
+ if currently_enabled is True and commanded_enabled is False:
+ disabled_start = line
+ currently_enabled = False
+ elif currently_enabled is False and commanded_enabled is True:
+ disabled_ranges.append((disabled_start, line))
+ currently_enabled = True
+
+ if currently_enabled is False:
+ disabled_ranges.append((disabled_start, total_lines))
+
+ return disabled_ranges
+
+
def filter_results(source, results, aggressive):
"""Filter out spurious reports from pycodestyle.
@@ -3235,6 +3305,14 @@
commented_out_code_line_numbers = commented_out_code_lines(source)
+ # Filter out the disabled ranges
+ disabled_ranges = get_disabled_ranges(source)
+ if len(disabled_ranges) > 0:
+ results = [result for result in results
+ if any(result['line'] not in range(*disabled_range)
+ for disabled_range in disabled_ranges)
+ ]
+
has_e901 = any(result['id'].lower() == 'e901' for result in results)
for r in results:
@@ -3335,12 +3413,18 @@
if token_type == tokenize.COMMENT:
stripped_line = token_string.lstrip('#').strip()
- if (
- ' ' in stripped_line and
- '#' not in stripped_line and
- check_syntax(stripped_line)
- ):
- line_numbers.append(start_row)
+ with warnings.catch_warnings():
+ # ignore SyntaxWarning in Python3.8+
+ # refs:
+ # https://bugs.python.org/issue15248
+ #
https://docs.python.org/3.8/whatsnew/3.8.html#other-language-changes
+ warnings.filterwarnings("ignore", category=SyntaxWarning)
+ if (
+ ' ' in stripped_line and
+ '#' not in stripped_line and
+ check_syntax(stripped_line)
+ ):
+ line_numbers.append(start_row)
except (SyntaxError, tokenize.TokenError):
pass
@@ -3534,7 +3618,13 @@
elif options.in_place:
original = "".join(original_source).splitlines()
fixed = fixed_source.splitlines()
- if original != fixed:
+ original_source_last_line = (
+ original_source[-1].split("\n")[-1] if original_source else ""
+ )
+ fixed_source_last_line = fixed_source.split("\n")[-1]
+ if original != fixed or (
+ original_source_last_line != fixed_source_last_line
+ ):
with open_with_encoding(filename, 'w', encoding=encoding) as fp:
fp.write(fixed_source)
return fixed_source
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/autopep8-1.5.3/test/test_autopep8.py
new/autopep8-1.5.4/test/test_autopep8.py
--- old/autopep8-1.5.3/test/test_autopep8.py 2020-05-31 16:00:11.000000000
+0200
+++ new/autopep8-1.5.4/test/test_autopep8.py 2020-07-31 08:06:41.000000000
+0200
@@ -5175,6 +5175,216 @@
with autopep8_context(line) as result:
self.assertEqual(line, result)
+ def test_autopep8_disable(self):
+ test_code = """\
+# autopep8: off
+def f():
+ aaaaaaaaaaa.bbbbbbb([
+ ('xxxxxxxxxx', 'yyyyyy',
+ 'Heaven hath no wrath like love to hatred turned. Nor hell a fury
like a woman scorned.'),
+ ('xxxxxxx', 'yyyyyyyyyyy', "To the last I grapple with thee. From
hell's heart I stab at thee. For hate's sake I spit my last breath at thee!")])
+# autopep8: on
+"""
+ expected_output = """\
+# autopep8: off
+def f():
+ aaaaaaaaaaa.bbbbbbb([
+ ('xxxxxxxxxx', 'yyyyyy',
+ 'Heaven hath no wrath like love to hatred turned. Nor hell a fury
like a woman scorned.'),
+ ('xxxxxxx', 'yyyyyyyyyyy', "To the last I grapple with thee. From
hell's heart I stab at thee. For hate's sake I spit my last breath at thee!")])
+# autopep8: on
+"""
+ with autopep8_context(test_code) as result:
+ self.assertEqual(expected_output, result)
+
+ def test_fmt_disable(self):
+ test_code = """\
+# fmt: off
+def f():
+ aaaaaaaaaaa.bbbbbbb([
+ ('xxxxxxxxxx', 'yyyyyy',
+ 'Heaven hath no wrath like love to hatred turned. Nor hell a fury
like a woman scorned.'),
+ ('xxxxxxx', 'yyyyyyyyyyy', "To the last I grapple with thee. From
hell's heart I stab at thee. For hate's sake I spit my last breath at thee!")])
+# fmt: on
+"""
+ expected_output = """\
+# fmt: off
+def f():
+ aaaaaaaaaaa.bbbbbbb([
+ ('xxxxxxxxxx', 'yyyyyy',
+ 'Heaven hath no wrath like love to hatred turned. Nor hell a fury
like a woman scorned.'),
+ ('xxxxxxx', 'yyyyyyyyyyy', "To the last I grapple with thee. From
hell's heart I stab at thee. For hate's sake I spit my last breath at thee!")])
+# fmt: on
+"""
+ with autopep8_context(test_code) as result:
+ self.assertEqual(expected_output, result)
+
+ def test_fmt_disable_without_reenable(self):
+ test_code = """\
+# fmt: off
+print(123)
+"""
+ expected_output = """\
+# fmt: off
+print(123)
+"""
+ with autopep8_context(test_code) as result:
+ self.assertEqual(expected_output, result)
+
+ def test_fmt_disable_with_double_reenable(self):
+ test_code = """\
+# fmt: off
+print( 123 )
+# fmt: on
+print( 123 )
+# fmt: on
+print( 123 )
+"""
+ expected_output = """\
+# fmt: off
+print( 123 )
+# fmt: on
+print(123)
+# fmt: on
+print(123)
+"""
+ with autopep8_context(test_code) as result:
+ self.assertEqual(expected_output, result)
+
+ def test_fmt_double_disable_and_reenable(self):
+ test_code = """\
+# fmt: off
+print( 123 )
+# fmt: off
+print( 123 )
+# fmt: on
+print( 123 )
+"""
+ expected_output = """\
+# fmt: off
+print( 123 )
+# fmt: off
+print( 123 )
+# fmt: on
+print(123)
+"""
+ with autopep8_context(test_code) as result:
+ self.assertEqual(expected_output, result)
+
+ def test_general_disable(self):
+ test_code = """\
+# fmt: off
+
+import math, sys;
+
+def example1():
+ # This is a long comment. This should be wrapped to fit within 72
characters.
+ some_tuple=( 1,2, 3,'a' );
+ some_variable={'long':'Long code lines should be wrapped within 79
characters.',
+ 'other':[math.pi, 100,200,300,9876543210,'This is a long string that goes
on'],
+ 'more':{'inner':'This whole logical line should be wrapped.',some_tuple:[1,
+ 20,300,40000,500000000,60000000000000000]}}
+ return (some_tuple, some_variable)
+def example2(): return {'has_key() is deprecated':True}.has_key(
+ {'f':2}.has_key(''));
+class Example3( object ):
+ def __init__ ( self, bar ):
+ # Comments should have a space after the hash.
+ if bar : bar+=1; bar=bar* bar ; return bar
+ else:
+ some_string = '''
+ Indentation in multiline strings should not be touched.
+Only actual code should be reindented.
+'''
+ return (sys.path, some_string)
+# fmt: on
+
+import math, sys;
+
+def example1():
+ # This is a long comment. This should be wrapped to fit within 72
characters.
+ some_tuple=( 1,2, 3,'a' );
+ some_variable={'long':'Long code lines should be wrapped within 79
characters.',
+ 'other':[math.pi, 100,200,300,9876543210,'This is a long string that goes
on'],
+ 'more':{'inner':'This whole logical line should be wrapped.',some_tuple:[1,
+ 20,300,40000,500000000,60000000000000000]}}
+ return (some_tuple, some_variable)
+def example2(): return {'has_key() is deprecated':True}.has_key(
+ {'f':2}.has_key(''));
+class Example3( object ):
+ def __init__ ( self, bar ):
+ # Comments should have a space after the hash.
+ if bar : bar+=1; bar=bar* bar ; return bar
+ else:
+ some_string = '''
+ Indentation in multiline strings should not be touched.
+Only actual code should be reindented.
+'''
+ return (sys.path, some_string)
+
+
+"""
+ expected_output = """\
+# fmt: off
+
+import sys
+import math
+import math, sys;
+
+def example1():
+ # This is a long comment. This should be wrapped to fit within 72
characters.
+ some_tuple=( 1,2, 3,'a' );
+ some_variable={'long':'Long code lines should be wrapped within 79
characters.',
+ 'other':[math.pi, 100,200,300,9876543210,'This is a long string that goes
on'],
+ 'more':{'inner':'This whole logical line should be wrapped.',some_tuple:[1,
+ 20,300,40000,500000000,60000000000000000]}}
+ return (some_tuple, some_variable)
+def example2(): return {'has_key() is deprecated':True}.has_key(
+ {'f':2}.has_key(''));
+class Example3( object ):
+ def __init__ ( self, bar ):
+ # Comments should have a space after the hash.
+ if bar : bar+=1; bar=bar* bar ; return bar
+ else:
+ some_string = '''
+ Indentation in multiline strings should not be touched.
+Only actual code should be reindented.
+'''
+ return (sys.path, some_string)
+# fmt: on
+
+
+def example1():
+ # This is a long comment. This should be wrapped to fit within 72
characters.
+ some_tuple = (1, 2, 3, 'a')
+ some_variable = {'long': 'Long code lines should be wrapped within 79
characters.',
+ 'other': [math.pi, 100, 200, 300, 9876543210, 'This is a
long string that goes on'],
+ 'more': {'inner': 'This whole logical line should be
wrapped.', some_tuple: [1,
+
20, 300, 40000, 500000000, 60000000000000000]}}
+ return (some_tuple, some_variable)
+
+
+def example2(): return {'has_key() is deprecated': True}.has_key(
+ {'f': 2}.has_key(''))
+
+
+class Example3(object):
+ def __init__(self, bar):
+ # Comments should have a space after the hash.
+ if bar:
+ bar += 1
+ bar = bar * bar
+ return bar
+ else:
+ some_string = '''
+ Indentation in multiline strings should not be touched.
+Only actual code should be reindented.
+'''
+ return (sys.path, some_string)
+"""
+ with autopep8_context(test_code) as result:
+ self.assertEqual(expected_output, result)
+
class UtilityFunctionTests(unittest.TestCase):
@@ -5360,6 +5570,28 @@
self.assertEqual(err, b'')
self.assertEqual(p.returncode, autopep8.EXIT_CODE_OK)
+ def test_in_place_no_modifications_no_writes_with_empty_file(self):
+ with temporary_file_context('') as filename:
+ # ensure that noops do not do writes by making writing an error
+ os.chmod(filename, 0o444)
+ p = Popen(
+ list(AUTOPEP8_CMD_TUPLE) + [filename, '--in-place'],
+ stderr=PIPE,
+ )
+ _, err = p.communicate()
+ self.assertEqual(err, b'')
+ self.assertEqual(p.returncode, autopep8.EXIT_CODE_OK)
+
+ def test_in_place_with_w292(self):
+ line = "import os"
+ fixed = "import os\n"
+
+ with temporary_file_context(line) as filename:
+ p = Popen(list(AUTOPEP8_CMD_TUPLE) + [filename, '--in-place'])
+ p.wait()
+ with open(filename) as f:
+ self.assertEqual(fixed, f.read())
+
def test_in_place_with_exit_code_option(self):
line = "'abc' \n"
fixed = "'abc'\n"