Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-flake8-pep3101 for openSUSE:Factory checked in at 2022-10-10 18:46:52 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-flake8-pep3101 (Old) and /work/SRC/openSUSE:Factory/.python-flake8-pep3101.new.2275 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-flake8-pep3101" Mon Oct 10 18:46:52 2022 rev:3 rq:1008957 version:2.0.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-flake8-pep3101/python-flake8-pep3101.changes 2020-04-16 23:05:03.995771627 +0200 +++ /work/SRC/openSUSE:Factory/.python-flake8-pep3101.new.2275/python-flake8-pep3101.changes 2022-10-10 18:47:17.207221297 +0200 @@ -1,0 +2,16 @@ +Sat Oct 8 16:43:35 UTC 2022 - Daniel Garcia <daniel.gar...@suse.com> + +- Update to 2.0.0: + * Update dependencies. [gforcada] + * Test the code on GitHub actions. [gforcada] + * Drop python 2.7 and only support python 3.7+. [gforcada] + * Use linters and formatters to keep code sane and beautiful. [gforcada] + * Simplify the amount of code to write a test. [gforcada] +- Delete 29.patch, not needed anymore + +------------------------------------------------------------------- +Tue Oct 4 16:20:28 UTC 2022 - Daniel Garcia <daniel.gar...@suse.com> + +- Add 29.patch to fix tests + +------------------------------------------------------------------- Old: ---- flake8-pep3101-1.3.0.tar.gz New: ---- flake8-pep3101-2.0.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-flake8-pep3101.spec ++++++ --- /var/tmp/diff_new_pack.G3iRGc/_old 2022-10-10 18:47:17.635222228 +0200 +++ /var/tmp/diff_new_pack.G3iRGc/_new 2022-10-10 18:47:17.643222246 +0200 @@ -1,7 +1,7 @@ # # spec file for package python-flake8-pep3101 # -# Copyright (c) 2020 SUSE LLC +# Copyright (c) 2022 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -18,7 +18,7 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-flake8-pep3101 -Version: 1.3.0 +Version: 2.0.0 Release: 0 Summary: Checks for old string formatting License: GPL-2.0-only @@ -41,7 +41,7 @@ Checks for old string formatting. %prep -%setup -q -n flake8-pep3101-%{version} +%autosetup -p1 -n flake8-pep3101-%{version} %build %python_build @@ -55,7 +55,7 @@ %files %{python_files} %doc CHANGES.rst README.rst -%license LICENSE LICENSE.rst +%license LICENSE %{python_sitelib}/* %changelog ++++++ flake8-pep3101-1.3.0.tar.gz -> flake8-pep3101-2.0.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/flake8-pep3101-1.3.0/CHANGES.rst new/flake8-pep3101-2.0.0/CHANGES.rst --- old/flake8-pep3101-1.3.0/CHANGES.rst 2019-12-15 00:32:11.000000000 +0100 +++ new/flake8-pep3101-2.0.0/CHANGES.rst 2022-10-08 18:13:28.000000000 +0200 @@ -3,6 +3,19 @@ Changelog ========= +2.0.0 (2022-10-08) +------------------ + +- Update dependencies. [gforcada] + +- Test the code on GitHub actions. [gforcada] + +- Drop python 2.7 and only support python 3.7+. [gforcada] + +- Use linters and formatters to keep code sane and beautiful. [gforcada] + +- Simplify the amount of code to write a test. [gforcada] + 1.3.0 (2019-12-15) ------------------ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/flake8-pep3101-1.3.0/LICENSE.rst new/flake8-pep3101-2.0.0/LICENSE.rst --- old/flake8-pep3101-1.3.0/LICENSE.rst 2019-12-15 00:32:11.000000000 +0100 +++ new/flake8-pep3101-2.0.0/LICENSE.rst 1970-01-01 01:00:00.000000000 +0100 @@ -1,17 +0,0 @@ -.. -*- coding: utf-8 -*- - -flake8-pep3101 Copyright 2015, Gil Forcada - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License version 2 -as published by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, -MA 02111-1307 USA. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/flake8-pep3101-1.3.0/MANIFEST.in new/flake8-pep3101-2.0.0/MANIFEST.in --- old/flake8-pep3101-1.3.0/MANIFEST.in 2019-12-15 00:32:11.000000000 +0100 +++ new/flake8-pep3101-2.0.0/MANIFEST.in 1970-01-01 01:00:00.000000000 +0100 @@ -1,3 +0,0 @@ -include MANIFEST.in LICENSE *.rst *.py *.ini -exclude .installed.cfg .coveragerc *.pyc - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/flake8-pep3101-1.3.0/PKG-INFO new/flake8-pep3101-2.0.0/PKG-INFO --- old/flake8-pep3101-1.3.0/PKG-INFO 2019-12-15 00:32:11.000000000 +0100 +++ new/flake8-pep3101-2.0.0/PKG-INFO 2022-10-08 18:13:29.138121800 +0200 @@ -1,178 +1,204 @@ Metadata-Version: 2.1 Name: flake8-pep3101 -Version: 1.3.0 +Version: 2.0.0 Summary: Checks for old string formatting. Home-page: https://github.com/gforcada/flake8-pep3101 Author: Gil Forcada Author-email: gil.gn...@gmail.com License: GPL version 2 -Description: .. -*- coding: utf-8 -*- - - .. image:: https://travis-ci.org/gforcada/flake8-pep3101.svg?branch=master - :target: https://travis-ci.org/gforcada/flake8-pep3101 - - .. image:: https://coveralls.io/repos/gforcada/flake8-pep3101/badge.svg?branch=master&service=github - :target: https://coveralls.io/github/gforcada/flake8-pep3101?branch=master - - Flake8 PEP 3101 plugin - ====================== - Python has two string formatting options, - either the old percent operator or the new ``.format()`` string method. - - Being the new one more powerful, expressive and a drop-in replacement - over the old one. - - See `pyformat website`_ for lots of examples of old vs new formatting. - - For a more format definition see the `PEP 3101`_. - - This plugin is based on a python checker that was in `plone.recipe.codeanalysis`_. - - Install - ------- - Install with pip:: - - $ pip install flake8-pep3101 - - Requirements - ------------ - - Python 2.7, 3.5, 3.6 - - flake8 - - Extras - ------ - If you want to check whether your new style formatting are correctly defined, - check `flake8-string-format`_ plugin. - - License - ------- - GPL 2.0 - - .. _`pyformat website`: https://pyformat.info - .. _`PEP 3101`: https://www.python.org/dev/peps/pep-3101 - .. _`flake8-string-format`: https://pypi.python.org/pypi/flake8-string-format - .. _`plone.recipe.codeanalysis`: https://pypi.python.org/pypi/plone.recipe.codeanalysis - - .. -*- coding: utf-8 -*- - - Changelog - ========= - - 1.3.0 (2019-12-15) - ------------------ - - - Warn about `"string %i" % 33` which was previously ignored. - Reported by @unformatt. - [gforcada] - - - 1.2.1 (2018-04-05) - ------------------ - - - Fix text on the error message. - [icemac] - - 1.2 (2017-12-12) - ---------------- - - - Handle when there are numbers in either side of the modulo operator. - [gforcada] - - 1.1 (2017-05-12) - ---------------- - - - Handle variable formatting (i.e. ``my_string_variable % ('one', 'two', )``). - [gforcada] - - - Test againsta Python 3.6. - [gforcada] - - - Release universal wheels as well. - [gforcada] - - 1.0 (2016-11-27) - ---------------- - - Remove tox and use plain travis matrix to test. - [gforcada] - - - Test on python 2.7, python 3.5, pypy and pypy3. - [gforcada] - - - Require flake8 3.0. - [gforcada] - - - Use ast to analyze the code. - The regular expression used so far was mostly a hit or miss, - with each corner case making it even more difficult to read. - The new checker with ast is simple, elegant and so much easy to read. - [gforcada] - - 0.6 (2016-10-29) - ---------------- - - Handle edge case when a single or double quoted string - has another pair of quotes inside ('lala "lu" la') with - some % symbol inside as well. - [gforcada] - - 0.5 (2016-10-26) - ---------------- - - Add all possible string formatters. - [gforcada] - - - Fix extension to work with flake8 > 3.0. - [gforcada] - - - Fix crash when the % symbol was the last character of a line. - [gforcada] - - 0.4 (2016-07-03) - ---------------- - - Rename pep8 to pycodestyle. - [alefteris] - - - Add support for python 3.5. - [alefteris] - - - Add flake8 pypi classifier. - [alefteris] - - - Drop python 3.3 and 3.4 support (only testing it probably works just fine). - [gforcada] - - - Fix travis and coveralls to work properly with python 3.5. - [gforcada] - - 0.3 (2016-03-05) - ---------------- - - Allow stdin processing, this way text editor can pass input to flake8. - [mjacksonw] - - 0.2 (2015-09-16) - ---------------- - - 0.1 was a brown bag release. - [gforcada] - - 0.1 (2015-09-16) - ---------------- - - Initial release - [gforcada] - - - Create the flake8 plugin per se. - [gforcada] - -Keywords: pep8 pycodestyle flake8 string formatting +Keywords: pep8 pycodestyle flake8 python string formatting Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Console Classifier: Framework :: Flake8 +Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: GNU General Public License v2 (GPLv2) Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Software Development Classifier: Topic :: Software Development :: Quality Assurance Provides-Extra: test +License-File: LICENSE + + +.. -*- coding: utf-8 -*- + +.. image:: https://github.com/gforcada/flake8-pep3101/actions/workflows/testing.yml/badge.svg?event=push + :target: https://github.com/gforcada/flake8-pep3101/actions/workflows/testing.yml + +.. image:: https://coveralls.io/repos/gforcada/flake8-pep3101/badge.svg?branch=master&service=github + :target: https://coveralls.io/github/gforcada/flake8-pep3101?branch=master + +Flake8 PEP 3101 plugin +====================== +Python has three string formatting options: + +- the old percent operator +- the ``.format()`` string method +- `f-strings`_ (only since python 3.6+) + +Although f-strings are more ergonomic, there a certain scenarios where the +``.format()`` method is still the only viable option. + +See `pyformat website`_ for examples of the percent operator vs the ``format()`` method. + +For a more format definition see the `PEP 3101`_. + +This plugin is based on a python checker that was in `plone.recipe.codeanalysis`_. + +Install +------- +Install with pip:: + + $ pip install flake8-pep3101 + +Requirements +------------ +- Python 3.7, 3.8, 3.9, 3.10 and pypy3 +- flake8 + +Extras +------ +If you want to check whether your new style formatting are correctly defined, +check `flake8-string-format`_ plugin. + +License +------- +GPL 2.0 + +.. _`pyformat website`: https://pyformat.info +.. _`PEP 3101`: https://www.python.org/dev/peps/pep-3101 +.. _`f-strings`: https://peps.python.org/pep-0498/ +.. _`flake8-string-format`: https://pypi.python.org/pypi/flake8-string-format +.. _`plone.recipe.codeanalysis`: https://pypi.python.org/pypi/plone.recipe.codeanalysis + +.. -*- coding: utf-8 -*- + +Changelog +========= + +2.0.0 (2022-10-08) +------------------ + +- Update dependencies. [gforcada] + +- Test the code on GitHub actions. [gforcada] + +- Drop python 2.7 and only support python 3.7+. [gforcada] + +- Use linters and formatters to keep code sane and beautiful. [gforcada] + +- Simplify the amount of code to write a test. [gforcada] + +1.3.0 (2019-12-15) +------------------ + +- Warn about `"string %i" % 33` which was previously ignored. + Reported by @unformatt. + [gforcada] + + +1.2.1 (2018-04-05) +------------------ + +- Fix text on the error message. + [icemac] + +1.2 (2017-12-12) +---------------- + +- Handle when there are numbers in either side of the modulo operator. + [gforcada] + +1.1 (2017-05-12) +---------------- + +- Handle variable formatting (i.e. ``my_string_variable % ('one', 'two', )``). + [gforcada] + +- Test againsta Python 3.6. + [gforcada] + +- Release universal wheels as well. + [gforcada] + +1.0 (2016-11-27) +---------------- +- Remove tox and use plain travis matrix to test. + [gforcada] + +- Test on python 2.7, python 3.5, pypy and pypy3. + [gforcada] + +- Require flake8 3.0. + [gforcada] + +- Use ast to analyze the code. + The regular expression used so far was mostly a hit or miss, + with each corner case making it even more difficult to read. + The new checker with ast is simple, elegant and so much easy to read. + [gforcada] + +0.6 (2016-10-29) +---------------- +- Handle edge case when a single or double quoted string + has another pair of quotes inside ('lala "lu" la') with + some % symbol inside as well. + [gforcada] + +0.5 (2016-10-26) +---------------- +- Add all possible string formatters. + [gforcada] + +- Fix extension to work with flake8 > 3.0. + [gforcada] + +- Fix crash when the % symbol was the last character of a line. + [gforcada] + +0.4 (2016-07-03) +---------------- +- Rename pep8 to pycodestyle. + [alefteris] + +- Add support for python 3.5. + [alefteris] + +- Add flake8 pypi classifier. + [alefteris] + +- Drop python 3.3 and 3.4 support (only testing it probably works just fine). + [gforcada] + +- Fix travis and coveralls to work properly with python 3.5. + [gforcada] + +0.3 (2016-03-05) +---------------- +- Allow stdin processing, this way text editor can pass input to flake8. + [mjacksonw] + +0.2 (2015-09-16) +---------------- +- 0.1 was a brown bag release. + [gforcada] + +0.1 (2015-09-16) +---------------- +- Initial release + [gforcada] + +- Create the flake8 plugin per se. + [gforcada] + + + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/flake8-pep3101-1.3.0/README.rst new/flake8-pep3101-2.0.0/README.rst --- old/flake8-pep3101-1.3.0/README.rst 2019-12-15 00:32:11.000000000 +0100 +++ new/flake8-pep3101-2.0.0/README.rst 2022-10-08 18:13:28.000000000 +0200 @@ -1,20 +1,23 @@ .. -*- coding: utf-8 -*- -.. image:: https://travis-ci.org/gforcada/flake8-pep3101.svg?branch=master - :target: https://travis-ci.org/gforcada/flake8-pep3101 +.. image:: https://github.com/gforcada/flake8-pep3101/actions/workflows/testing.yml/badge.svg?event=push + :target: https://github.com/gforcada/flake8-pep3101/actions/workflows/testing.yml .. image:: https://coveralls.io/repos/gforcada/flake8-pep3101/badge.svg?branch=master&service=github :target: https://coveralls.io/github/gforcada/flake8-pep3101?branch=master Flake8 PEP 3101 plugin ====================== -Python has two string formatting options, -either the old percent operator or the new ``.format()`` string method. +Python has three string formatting options: -Being the new one more powerful, expressive and a drop-in replacement -over the old one. +- the old percent operator +- the ``.format()`` string method +- `f-strings`_ (only since python 3.6+) -See `pyformat website`_ for lots of examples of old vs new formatting. +Although f-strings are more ergonomic, there a certain scenarios where the +``.format()`` method is still the only viable option. + +See `pyformat website`_ for examples of the percent operator vs the ``format()`` method. For a more format definition see the `PEP 3101`_. @@ -28,7 +31,7 @@ Requirements ------------ -- Python 2.7, 3.5, 3.6 +- Python 3.7, 3.8, 3.9, 3.10 and pypy3 - flake8 Extras @@ -42,5 +45,6 @@ .. _`pyformat website`: https://pyformat.info .. _`PEP 3101`: https://www.python.org/dev/peps/pep-3101 +.. _`f-strings`: https://peps.python.org/pep-0498/ .. _`flake8-string-format`: https://pypi.python.org/pypi/flake8-string-format .. _`plone.recipe.codeanalysis`: https://pypi.python.org/pypi/plone.recipe.codeanalysis diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/flake8-pep3101-1.3.0/flake8_pep3101.egg-info/PKG-INFO new/flake8-pep3101-2.0.0/flake8_pep3101.egg-info/PKG-INFO --- old/flake8-pep3101-1.3.0/flake8_pep3101.egg-info/PKG-INFO 2019-12-15 00:32:11.000000000 +0100 +++ new/flake8-pep3101-2.0.0/flake8_pep3101.egg-info/PKG-INFO 2022-10-08 18:13:29.000000000 +0200 @@ -1,178 +1,204 @@ Metadata-Version: 2.1 Name: flake8-pep3101 -Version: 1.3.0 +Version: 2.0.0 Summary: Checks for old string formatting. Home-page: https://github.com/gforcada/flake8-pep3101 Author: Gil Forcada Author-email: gil.gn...@gmail.com License: GPL version 2 -Description: .. -*- coding: utf-8 -*- - - .. image:: https://travis-ci.org/gforcada/flake8-pep3101.svg?branch=master - :target: https://travis-ci.org/gforcada/flake8-pep3101 - - .. image:: https://coveralls.io/repos/gforcada/flake8-pep3101/badge.svg?branch=master&service=github - :target: https://coveralls.io/github/gforcada/flake8-pep3101?branch=master - - Flake8 PEP 3101 plugin - ====================== - Python has two string formatting options, - either the old percent operator or the new ``.format()`` string method. - - Being the new one more powerful, expressive and a drop-in replacement - over the old one. - - See `pyformat website`_ for lots of examples of old vs new formatting. - - For a more format definition see the `PEP 3101`_. - - This plugin is based on a python checker that was in `plone.recipe.codeanalysis`_. - - Install - ------- - Install with pip:: - - $ pip install flake8-pep3101 - - Requirements - ------------ - - Python 2.7, 3.5, 3.6 - - flake8 - - Extras - ------ - If you want to check whether your new style formatting are correctly defined, - check `flake8-string-format`_ plugin. - - License - ------- - GPL 2.0 - - .. _`pyformat website`: https://pyformat.info - .. _`PEP 3101`: https://www.python.org/dev/peps/pep-3101 - .. _`flake8-string-format`: https://pypi.python.org/pypi/flake8-string-format - .. _`plone.recipe.codeanalysis`: https://pypi.python.org/pypi/plone.recipe.codeanalysis - - .. -*- coding: utf-8 -*- - - Changelog - ========= - - 1.3.0 (2019-12-15) - ------------------ - - - Warn about `"string %i" % 33` which was previously ignored. - Reported by @unformatt. - [gforcada] - - - 1.2.1 (2018-04-05) - ------------------ - - - Fix text on the error message. - [icemac] - - 1.2 (2017-12-12) - ---------------- - - - Handle when there are numbers in either side of the modulo operator. - [gforcada] - - 1.1 (2017-05-12) - ---------------- - - - Handle variable formatting (i.e. ``my_string_variable % ('one', 'two', )``). - [gforcada] - - - Test againsta Python 3.6. - [gforcada] - - - Release universal wheels as well. - [gforcada] - - 1.0 (2016-11-27) - ---------------- - - Remove tox and use plain travis matrix to test. - [gforcada] - - - Test on python 2.7, python 3.5, pypy and pypy3. - [gforcada] - - - Require flake8 3.0. - [gforcada] - - - Use ast to analyze the code. - The regular expression used so far was mostly a hit or miss, - with each corner case making it even more difficult to read. - The new checker with ast is simple, elegant and so much easy to read. - [gforcada] - - 0.6 (2016-10-29) - ---------------- - - Handle edge case when a single or double quoted string - has another pair of quotes inside ('lala "lu" la') with - some % symbol inside as well. - [gforcada] - - 0.5 (2016-10-26) - ---------------- - - Add all possible string formatters. - [gforcada] - - - Fix extension to work with flake8 > 3.0. - [gforcada] - - - Fix crash when the % symbol was the last character of a line. - [gforcada] - - 0.4 (2016-07-03) - ---------------- - - Rename pep8 to pycodestyle. - [alefteris] - - - Add support for python 3.5. - [alefteris] - - - Add flake8 pypi classifier. - [alefteris] - - - Drop python 3.3 and 3.4 support (only testing it probably works just fine). - [gforcada] - - - Fix travis and coveralls to work properly with python 3.5. - [gforcada] - - 0.3 (2016-03-05) - ---------------- - - Allow stdin processing, this way text editor can pass input to flake8. - [mjacksonw] - - 0.2 (2015-09-16) - ---------------- - - 0.1 was a brown bag release. - [gforcada] - - 0.1 (2015-09-16) - ---------------- - - Initial release - [gforcada] - - - Create the flake8 plugin per se. - [gforcada] - -Keywords: pep8 pycodestyle flake8 string formatting +Keywords: pep8 pycodestyle flake8 python string formatting Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Console Classifier: Framework :: Flake8 +Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: GNU General Public License v2 (GPLv2) Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Software Development Classifier: Topic :: Software Development :: Quality Assurance Provides-Extra: test +License-File: LICENSE + + +.. -*- coding: utf-8 -*- + +.. image:: https://github.com/gforcada/flake8-pep3101/actions/workflows/testing.yml/badge.svg?event=push + :target: https://github.com/gforcada/flake8-pep3101/actions/workflows/testing.yml + +.. image:: https://coveralls.io/repos/gforcada/flake8-pep3101/badge.svg?branch=master&service=github + :target: https://coveralls.io/github/gforcada/flake8-pep3101?branch=master + +Flake8 PEP 3101 plugin +====================== +Python has three string formatting options: + +- the old percent operator +- the ``.format()`` string method +- `f-strings`_ (only since python 3.6+) + +Although f-strings are more ergonomic, there a certain scenarios where the +``.format()`` method is still the only viable option. + +See `pyformat website`_ for examples of the percent operator vs the ``format()`` method. + +For a more format definition see the `PEP 3101`_. + +This plugin is based on a python checker that was in `plone.recipe.codeanalysis`_. + +Install +------- +Install with pip:: + + $ pip install flake8-pep3101 + +Requirements +------------ +- Python 3.7, 3.8, 3.9, 3.10 and pypy3 +- flake8 + +Extras +------ +If you want to check whether your new style formatting are correctly defined, +check `flake8-string-format`_ plugin. + +License +------- +GPL 2.0 + +.. _`pyformat website`: https://pyformat.info +.. _`PEP 3101`: https://www.python.org/dev/peps/pep-3101 +.. _`f-strings`: https://peps.python.org/pep-0498/ +.. _`flake8-string-format`: https://pypi.python.org/pypi/flake8-string-format +.. _`plone.recipe.codeanalysis`: https://pypi.python.org/pypi/plone.recipe.codeanalysis + +.. -*- coding: utf-8 -*- + +Changelog +========= + +2.0.0 (2022-10-08) +------------------ + +- Update dependencies. [gforcada] + +- Test the code on GitHub actions. [gforcada] + +- Drop python 2.7 and only support python 3.7+. [gforcada] + +- Use linters and formatters to keep code sane and beautiful. [gforcada] + +- Simplify the amount of code to write a test. [gforcada] + +1.3.0 (2019-12-15) +------------------ + +- Warn about `"string %i" % 33` which was previously ignored. + Reported by @unformatt. + [gforcada] + + +1.2.1 (2018-04-05) +------------------ + +- Fix text on the error message. + [icemac] + +1.2 (2017-12-12) +---------------- + +- Handle when there are numbers in either side of the modulo operator. + [gforcada] + +1.1 (2017-05-12) +---------------- + +- Handle variable formatting (i.e. ``my_string_variable % ('one', 'two', )``). + [gforcada] + +- Test againsta Python 3.6. + [gforcada] + +- Release universal wheels as well. + [gforcada] + +1.0 (2016-11-27) +---------------- +- Remove tox and use plain travis matrix to test. + [gforcada] + +- Test on python 2.7, python 3.5, pypy and pypy3. + [gforcada] + +- Require flake8 3.0. + [gforcada] + +- Use ast to analyze the code. + The regular expression used so far was mostly a hit or miss, + with each corner case making it even more difficult to read. + The new checker with ast is simple, elegant and so much easy to read. + [gforcada] + +0.6 (2016-10-29) +---------------- +- Handle edge case when a single or double quoted string + has another pair of quotes inside ('lala "lu" la') with + some % symbol inside as well. + [gforcada] + +0.5 (2016-10-26) +---------------- +- Add all possible string formatters. + [gforcada] + +- Fix extension to work with flake8 > 3.0. + [gforcada] + +- Fix crash when the % symbol was the last character of a line. + [gforcada] + +0.4 (2016-07-03) +---------------- +- Rename pep8 to pycodestyle. + [alefteris] + +- Add support for python 3.5. + [alefteris] + +- Add flake8 pypi classifier. + [alefteris] + +- Drop python 3.3 and 3.4 support (only testing it probably works just fine). + [gforcada] + +- Fix travis and coveralls to work properly with python 3.5. + [gforcada] + +0.3 (2016-03-05) +---------------- +- Allow stdin processing, this way text editor can pass input to flake8. + [mjacksonw] + +0.2 (2015-09-16) +---------------- +- 0.1 was a brown bag release. + [gforcada] + +0.1 (2015-09-16) +---------------- +- Initial release + [gforcada] + +- Create the flake8 plugin per se. + [gforcada] + + + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/flake8-pep3101-1.3.0/flake8_pep3101.egg-info/SOURCES.txt new/flake8-pep3101-2.0.0/flake8_pep3101.egg-info/SOURCES.txt --- old/flake8-pep3101-1.3.0/flake8_pep3101.egg-info/SOURCES.txt 2019-12-15 00:32:11.000000000 +0100 +++ new/flake8-pep3101-2.0.0/flake8_pep3101.egg-info/SOURCES.txt 2022-10-08 18:13:29.000000000 +0200 @@ -1,9 +1,8 @@ CHANGES.rst LICENSE -LICENSE.rst -MANIFEST.in README.rst flake8_pep3101.py +requirements.txt run_tests.py setup.cfg setup.py diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/flake8-pep3101-1.3.0/flake8_pep3101.egg-info/requires.txt new/flake8-pep3101-2.0.0/flake8_pep3101.egg-info/requires.txt --- old/flake8-pep3101-1.3.0/flake8_pep3101.egg-info/requires.txt 2019-12-15 00:32:11.000000000 +0100 +++ new/flake8-pep3101-2.0.0/flake8_pep3101.egg-info/requires.txt 2022-10-08 18:13:29.000000000 +0200 @@ -1,5 +1,4 @@ -flake8>=3.0 +flake8 [test] pytest -testfixtures diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/flake8-pep3101-1.3.0/flake8_pep3101.py new/flake8-pep3101-2.0.0/flake8_pep3101.py --- old/flake8-pep3101-1.3.0/flake8_pep3101.py 2019-12-15 00:32:11.000000000 +0100 +++ new/flake8-pep3101-2.0.0/flake8_pep3101.py 2022-10-08 18:13:28.000000000 +0200 @@ -1,10 +1,9 @@ -# -*- coding: utf-8 -*- import ast -import pycodestyle +from flake8 import utils as stdin_utils -class Flake8Pep3101(object): +class Flake8Pep3101: name = 'flake8_pep3101' version = '1.2.1' message = 'S001 found modulo formatter' @@ -14,14 +13,11 @@ self.tree = tree def run(self): + tree = self.tree + if self.filename == 'stdin': - lines = pycodestyle.stdin_get_value() + lines = stdin_utils.stdin_get_value() tree = ast.parse(lines) - elif self.tree: - tree = self.tree - else: - with open(self.filename) as f: - tree = ast.parse(f.read()) for stmt in ast.walk(tree): if self._is_module_operation(stmt): @@ -50,5 +46,4 @@ @staticmethod def _is_modulo_variable_and_number(stmt): """Check if it is a case of `var % 44`.""" - return isinstance(stmt.right, ast.Num) and \ - isinstance(stmt.left, ast.Name) + return isinstance(stmt.right, ast.Num) and isinstance(stmt.left, ast.Name) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/flake8-pep3101-1.3.0/requirements.txt new/flake8-pep3101-2.0.0/requirements.txt --- old/flake8-pep3101-1.3.0/requirements.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/flake8-pep3101-2.0.0/requirements.txt 2022-10-08 18:13:28.000000000 +0200 @@ -0,0 +1,175 @@ +# +# This file is autogenerated by pip-compile with python 3.7 +# To update, run: +# +# pip-compile requirements.in +# +attrs==22.1.0 + # via + # flake8-bugbear + # pytest +bandit==1.7.4 + # via -r requirements.in +black==22.10.0 + # via -r requirements.in +certifi==2022.9.24 + # via requests +charset-normalizer==2.1.1 + # via requests +click==8.1.3 + # via + # black + # safety +codespell==2.2.1 + # via -r requirements.in +coverage[toml]==6.5.0 + # via + # coveralls + # pytest-cov +coveralls==3.3.1 + # via -r requirements.in +docopt==0.6.2 + # via coveralls +dparse==0.6.2 + # via safety +flake8==5.0.4 + # via + # flake8-bugbear + # flake8-builtins + # flake8-comprehensions + # flake8-debugger + # flake8-deprecated + # flake8-isort + # flake8-pep3101 + # flake8-print + # flake8-quotes +flake8-blind-except==0.2.1 + # via -r requirements.in +flake8-bugbear==22.9.23 + # via -r requirements.in +flake8-builtins==2.0.0 + # via -r requirements.in +flake8-comprehensions==3.10.0 + # via -r requirements.in +flake8-debugger==4.1.2 + # via -r requirements.in +flake8-deprecated==1.3 + # via -r requirements.in +flake8-isort==4.2.0 + # via -r requirements.in +flake8-pep3101==1.3.0 + # via -r requirements.in +flake8-print==5.0.0 + # via -r requirements.in +flake8-quotes==3.3.1 + # via -r requirements.in +flake8-todo==0.7 + # via -r requirements.in +gitdb==4.0.9 + # via gitpython +gitpython==3.1.28 + # via bandit +idna==3.4 + # via requests +importlib-metadata==4.2.0 ; python_version < "3.8" + # via + # -r requirements.in + # click + # flake8 + # flake8-comprehensions + # pluggy + # pytest + # stevedore +iniconfig==1.1.1 + # via pytest +isort==5.10.1 + # via + # -r requirements.in + # flake8-isort +mccabe==0.7.0 + # via flake8 +mypy==0.982 + # via -r requirements.in +mypy-extensions==0.4.3 + # via + # black + # mypy +packaging==21.3 + # via + # dparse + # pytest + # safety +pathspec==0.10.1 + # via black +pbr==5.10.0 + # via stevedore +platformdirs==2.5.2 + # via black +pluggy==1.0.0 + # via pytest +py==1.11.0 + # via pytest +pycodestyle==2.9.1 + # via + # flake8 + # flake8-debugger + # flake8-print + # flake8-todo +pyflakes==2.5.0 + # via flake8 +pyparsing==3.0.9 + # via packaging +pytest==7.1.3 + # via + # -r requirements.in + # pytest-cov +pytest-cov==4.0.0 + # via -r requirements.in +pyupgrade==3.0.0 + # via -r requirements.in +pyyaml==6.0 + # via bandit +requests==2.28.1 + # via + # coveralls + # safety +ruamel-yaml==0.17.21 + # via safety +ruamel-yaml-clib==0.2.6 + # via ruamel-yaml +safety==2.3.1 + # via -r requirements.in +smmap==5.0.0 + # via gitdb +stevedore==3.5.0 + # via bandit +tokenize-rt==5.0.0 + # via pyupgrade +toml==0.10.2 + # via dparse +tomli==2.0.1 + # via + # black + # coverage + # mypy + # pytest +typed-ast==1.5.4 ; python_version < "3.8" + # via + # -r requirements.in + # black + # mypy +typing-extensions==4.4.0 + # via + # black + # gitpython + # importlib-metadata + # mypy +urllib3==1.26.12 + # via requests +zipp==3.8.1 ; python_version < "3.8" + # via + # -r requirements.in + # importlib-metadata + +# The following packages are considered to be unsafe in a requirements file: +# setuptools diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/flake8-pep3101-1.3.0/run_tests.py new/flake8-pep3101-2.0.0/run_tests.py --- old/flake8-pep3101-1.3.0/run_tests.py 2019-12-15 00:32:11.000000000 +0100 +++ new/flake8-pep3101-2.0.0/run_tests.py 2022-10-08 18:13:28.000000000 +0200 @@ -1,127 +1,123 @@ -# -*- coding: utf-8 -*- -from flake8_pep3101 import Flake8Pep3101 -from flake8.main import application -from tempfile import mkdtemp -from testfixtures import OutputCapture - -import os +import ast +import textwrap import unittest +from unittest import mock +from flake8_pep3101 import Flake8Pep3101 -class TestFlake8Pep3101(unittest.TestCase): - @staticmethod - def _given_a_file_in_test_dir(contents): - test_dir = os.path.realpath(mkdtemp()) - file_path = os.path.join(test_dir, 'test.py') - with open(file_path, 'w') as a_file: - a_file.write(contents) +class NewTestFlake8Pep3101(unittest.TestCase): + def check_code(self, source, expected_codes=None): + """Check if the given source code generates the given flake8 errors - return file_path + If `expected_codes` is a string is converted to a list, + if it is not given, then it is expected to **not** generate any error. + """ + if isinstance(expected_codes, str): + expected_codes = [expected_codes] + elif expected_codes is None: + expected_codes = [] + tree = ast.parse(textwrap.dedent(source)) + checker = Flake8Pep3101(tree, '/home/script.py') + return_statements = list(checker.run()) - def test_no_old_formatter(self): - file_path = self._given_a_file_in_test_dir( - 'b = 3\n' + self.assertEqual( + len(return_statements), len(expected_codes), f'Got {return_statements}' ) - app = application.Application() - with OutputCapture() as output: - app.run([file_path, ]) + for item, code in zip(return_statements, expected_codes): + self.assertTrue( + item[2].startswith(f'{code} '), + f'Actually got {item[2]} rather than {code}', + ) + + @mock.patch('flake8.utils.stdin_get_value') + def test_stdin(self, stdin_get_value): + source = 'a = "hello %s" % ("world")' + stdin_get_value.return_value = source + checker = Flake8Pep3101('', 'stdin') + ret = list(checker.run()) self.assertEqual( - output.captured, - '' + len(ret), + 1, ) - def test_new_formatting_no_problem(self): - file_path = self._given_a_file_in_test_dir('\n'.join([ - 'print("hello {0:s}".format("world"))\n', - ])) - app = application.Application() - with OutputCapture() as output: - app.run([file_path, ]) + def test_no_old_formatter(self): + source = 'b = 3' + self.check_code(source) - self.assertEqual( - output.captured, - '' - ) + def test_new_formatter(self): + source = 'print("hello {0:s}".format("world"))' + self.check_code(source) + + def test_error(self): + source = 'print("hello %s" % ("world"))' + self.check_code(source, 'S001') + + def test_line_number(self): + source = """ + a = 2 + open = 4 + msg = "hello %s" % ("world") + """ + tree = ast.parse(textwrap.dedent(source)) + checker = Flake8Pep3101(tree, '/home/script.py') + ret = list(checker.run()) + self.assertEqual(ret[0][0], 4) - def test_s_formatter(self): - file_path = self._given_a_file_in_test_dir('\n'.join([ - 'print("hello %s" % (\'lo\'))', - ])) - checker = Flake8Pep3101(None, file_path) + def test_offset(self): + source = """ + def bla(): + msg = "hello %s" % ("world") + """ + tree = ast.parse(textwrap.dedent(source)) + checker = Flake8Pep3101(tree, '/home/script.py') ret = list(checker.run()) - self.assertEqual(len(ret), 1) - self.assertEqual(ret[0][0], 1) - self.assertEqual(ret[0][1], 6) - self.assertEqual(ret[0][2], 'S001 found modulo formatter') + self.assertEqual(ret[0][1], 10) + + def test_s_formatter(self): + source = 'print("hello %s" % (\'lo\'))' + self.check_code(source, 'S001') def test_multiline_formatter(self): - file_path = self._given_a_file_in_test_dir('\n'.join([ - 'print("hello %s"', - '% (\'world\'))', - ])) - app = application.Application() - with OutputCapture() as output: - app.run([file_path, ]) - - self.assertIn( - '1:7: S001 found modulo formatter', - output.captured + source = """ + print("hello %s" + % ('world') ) + """ + self.check_code(source, 'S001') def test_multiline_aligned_formatter(self): - file_path = self._given_a_file_in_test_dir('\n'.join([ - 'print("hello %s"', - ' % (\'world\'))', - ])) - checker = Flake8Pep3101(None, file_path) - ret = list(checker.run()) - self.assertEqual(len(ret), 1) - self.assertEqual(ret[0][0], 1) - self.assertEqual(ret[0][1], 6) - self.assertEqual(ret[0][2], 'S001 found modulo formatter') + source = """ + print("hello %s" + % ('world') + ) + """ + self.check_code(source, 'S001') def test_logging_module(self): - file_path = self._given_a_file_in_test_dir('\n'.join([ - 'import logging', - 'logger = logging.getLogger()', - 'logger.info("%s is bad", "me")' - ])) - checker = Flake8Pep3101(None, file_path) - ret = list(checker.run()) - self.assertEqual(len(ret), 0) + source = """ + import logging + logger = logging.getLogger() + logger.info("%s world", "hello") + """ + self.check_code(source) def test_multiple_strings(self): - file_path = self._given_a_file_in_test_dir('\n'.join([ - '"""""""1" if "%" else "2"' - ])) - checker = Flake8Pep3101(None, file_path) - ret = list(checker.run()) - self.assertEqual(len(ret), 0) + source = '"""""""1" if "%" else "2"' + self.check_code(source) def test_multiple_single_quotes_strings(self): - file_path = self._given_a_file_in_test_dir('\n'.join([ - "'''''''1' if '%' else '2'" - ])) - checker = Flake8Pep3101(None, file_path) - ret = list(checker.run()) - self.assertEqual(len(ret), 0) + source = "'''''''1' if '%' else '2'" + self.check_code(source) def test_multiple_strings_with_old_formatting(self): """Check that multiple quoting is handled properly. In this case correctly detecting it. """ - file_path = self._given_a_file_in_test_dir('\n'.join([ - '"""""""1" if "%" else "2%s" % "x"' - ])) - checker = Flake8Pep3101(None, file_path) - ret = list(checker.run()) - self.assertEqual(len(ret), 1) - self.assertEqual(ret[0][0], 1) - self.assertEqual(ret[0][1], 22) - self.assertEqual(ret[0][2], 'S001 found modulo formatter') + source = '"""""""1" if "%" else "2%s" % "x"' + self.check_code(source, 'S001') def test_percent_on_string(self): """Check that multiple quoting is handled properly. @@ -130,74 +126,51 @@ Found in plone.app.drafts.tests """ - file_path = self._given_a_file_in_test_dir('\n'.join([ - 'a = \'"%2B%2Badd%2B%2BMyDocument"\'' - ])) - checker = Flake8Pep3101(None, file_path) - ret = list(checker.run()) - self.assertEqual(len(ret), 0) + + source = 'a = \'"%2B%2Badd%2B%2BMyDocument"\'' + self.check_code(source) def test_percent_as_last_character_on_line(self): """Check that a percent symbol as the last character on a line is handled properly. """ - file_path = self._given_a_file_in_test_dir('\n'.join([ - "a = 'my string %s %s' \\", - " %\\", - " ('3', '4', )", - ])) - checker = Flake8Pep3101(None, file_path) - ret = list(checker.run()) - self.assertEqual(len(ret), 1) - self.assertEqual(ret[0][0], 1) - self.assertEqual(ret[0][1], 4) - self.assertEqual(ret[0][2], 'S001 found modulo formatter') + source = """ + a = 'my string %s %s' \ + % \ + ('3', '4', ) + """ + self.check_code(source, 'S001') def test_variable(self): - file_path = self._given_a_file_in_test_dir('\n'.join([ - "a = 'my string %s %s'", - "a % ('3', '4', )", - ])) - checker = Flake8Pep3101(None, file_path) - ret = list(checker.run()) - self.assertEqual(len(ret), 1) - self.assertEqual(ret[0][0], 2) - self.assertEqual(ret[0][1], 0) - self.assertEqual(ret[0][2], 'S001 found modulo formatter') + source = """ + a = 'my string %s %s' + a % ('3', '4', ) + """ + self.check_code(source, 'S001') def test_right_hand_number_modulo(self): - file_path = self._given_a_file_in_test_dir('\n'.join([ - 'var = 40', - 'if var % 50 == 0:', - ' print(var)', - ])) - checker = Flake8Pep3101(None, file_path) - ret = list(checker.run()) - self.assertEqual(len(ret), 0) + source = """ + var = 40 + if var % 50 == 0: + print(var) + """ + self.check_code(source) def test_left_hand_number_modulo(self): - file_path = self._given_a_file_in_test_dir('\n'.join([ - 'var = 40', - 'if 50 % var == 0:', - ' print(var)', - ])) - checker = Flake8Pep3101(None, file_path) - ret = list(checker.run()) - self.assertEqual(len(ret), 0) + source = """ + var = 40 + if 50 % var == 0: + print(var) + """ + self.check_code(source) def test_right_hand_string_left_hand_number(self): - file_path = self._given_a_file_in_test_dir('\n'.join([ - 'print("asd %s" % 1)', - ])) - checker = Flake8Pep3101(None, file_path) - ret = list(checker.run()) - self.assertEqual(len(ret), 1) + source = 'print("asd %s" % 1)' + self.check_code(source, 'S001') def test_right_hand_string_left_hand_variable(self): - file_path = self._given_a_file_in_test_dir('\n'.join([ - 'a = 44', - 'print("asd %s" % a)', - ])) - checker = Flake8Pep3101(None, file_path) - ret = list(checker.run()) - self.assertEqual(len(ret), 1) + source = """ + a = 44 + print("asd %s" % a) + """ + self.check_code(source, 'S001') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/flake8-pep3101-1.3.0/setup.cfg new/flake8-pep3101-2.0.0/setup.cfg --- old/flake8-pep3101-1.3.0/setup.cfg 2019-12-15 00:32:11.000000000 +0100 +++ new/flake8-pep3101-2.0.0/setup.cfg 2022-10-08 18:13:29.138121800 +0200 @@ -1,9 +1,13 @@ -[bdist_wheel] -universal = 1 - [zest.releaser] create-wheel = yes +[check-manifest] +ignore = + .installed.cfg + +[isort] +profile = black + [egg_info] tag_build = tag_date = 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/flake8-pep3101-1.3.0/setup.py new/flake8-pep3101-2.0.0/setup.py --- old/flake8-pep3101-1.3.0/setup.py 2019-12-15 00:32:11.000000000 +0100 +++ new/flake8-pep3101-2.0.0/setup.py 2022-10-08 18:13:28.000000000 +0200 @@ -1,54 +1,55 @@ -# -*- coding: utf-8 -*- from setuptools import setup - short_description = 'Checks for old string formatting.' -long_description = '{0}\n{1}'.format( - open('README.rst').read(), - open('CHANGES.rst').read() -) + +def read_file(filename): + with open(filename) as file_obj: + file_contents = file_obj.read() + return file_contents + + +long_description = f""" +{read_file('README.rst')} +{read_file('CHANGES.rst')} +""" + setup( name='flake8-pep3101', - version='1.3.0', + version='2.0.0', description=short_description, long_description=long_description, - # Get more from http://pypi.python.org/pypi?%3Aaction=list_classifiers + # Get more from https://pypi.org/classifiers/ classifiers=[ 'Development Status :: 5 - Production/Stable', + 'Environment :: Console', 'Framework :: Flake8', + 'Intended Audience :: Developers', 'License :: OSI Approved :: GNU General Public License v2 (GPLv2)', 'Operating System :: OS Independent', 'Programming Language :: Python', - 'Programming Language :: Python :: 2', - 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.5', - 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3 :: Only', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.9', + 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: Implementation :: CPython', 'Programming Language :: Python :: Implementation :: PyPy', + 'Topic :: Software Development', 'Topic :: Software Development :: Quality Assurance', ], - keywords='pep8 pycodestyle flake8 string formatting', + keywords='pep8 pycodestyle flake8 python string formatting', author='Gil Forcada', author_email='gil.gn...@gmail.com', url='https://github.com/gforcada/flake8-pep3101', license='GPL version 2', - py_modules=['flake8_pep3101', ], + py_modules=['flake8_pep3101'], include_package_data=True, test_suite='run_tests', zip_safe=False, - install_requires=[ - 'flake8 >= 3.0', - ], - extras_require={ - 'test': [ - 'pytest', - 'testfixtures', - ], - }, - entry_points={ - 'flake8.extension': ['S001 = flake8_pep3101:Flake8Pep3101'], - }, + install_requires=['flake8'], + extras_require={'test': ['pytest']}, + entry_points={'flake8.extension': ['S001 = flake8_pep3101:Flake8Pep3101']}, )