Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-eradicate for
openSUSE:Factory checked in at 2023-09-20 13:28:49
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-eradicate (Old)
and /work/SRC/openSUSE:Factory/.python-eradicate.new.16627 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-eradicate"
Wed Sep 20 13:28:49 2023 rev:5 rq:1112072 version:2.3.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-eradicate/python-eradicate.changes
2023-06-14 16:31:59.211444615 +0200
+++
/work/SRC/openSUSE:Factory/.python-eradicate.new.16627/python-eradicate.changes
2023-09-20 13:31:20.767280917 +0200
@@ -1,0 +2,8 @@
+Mon Sep 18 19:58:36 UTC 2023 - Dirk Müller <[email protected]>
+
+- update to 2.3.0:
+ * This is the last release with Python2 support:
+ * True Windows support
+ * New console script
+
+-------------------------------------------------------------------
Old:
----
eradicate-2.1.0.tar.gz
test_eradicate.py
New:
----
eradicate-2.3.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-eradicate.spec ++++++
--- /var/tmp/diff_new_pack.YKHZH3/_old 2023-09-20 13:31:21.943323050 +0200
+++ /var/tmp/diff_new_pack.YKHZH3/_new 2023-09-20 13:31:21.943323050 +0200
@@ -1,7 +1,7 @@
#
# spec file for package python-eradicate
#
-# Copyright (c) 2022 SUSE LLC
+# Copyright (c) 2023 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -18,14 +18,13 @@
%{?sle15_python_module_pythons}
Name: python-eradicate
-Version: 2.1.0
+Version: 2.3.0
Release: 0
Summary: Python utility for removing commented-out code
License: MIT
Group: Development/Languages/Python
URL: https://github.com/myint/eradicate
Source:
https://files.pythonhosted.org/packages/source/e/eradicate/eradicate-%{version}.tar.gz
-Source1:
https://raw.githubusercontent.com/myint/eradicate/v%{version}/test_eradicate.py
BuildRequires: %{python_module setuptools}
BuildRequires: fdupes
BuildRequires: python-rpm-macros
@@ -44,7 +43,6 @@
%prep
%setup -q -n eradicate-%{version}
-cp %{SOURCE1} .
%build
%python_build
++++++ eradicate-2.1.0.tar.gz -> eradicate-2.3.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eradicate-2.1.0/MANIFEST.in
new/eradicate-2.3.0/MANIFEST.in
--- old/eradicate-2.1.0/MANIFEST.in 2022-04-06 11:43:12.000000000 +0200
+++ new/eradicate-2.3.0/MANIFEST.in 2023-06-08 18:50:05.000000000 +0200
@@ -1,3 +1,4 @@
include MANIFEST.in
include README.rst
exclude Makefile
+include test_eradicate.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eradicate-2.1.0/PKG-INFO new/eradicate-2.3.0/PKG-INFO
--- old/eradicate-2.1.0/PKG-INFO 2022-04-06 11:46:41.558620200 +0200
+++ new/eradicate-2.3.0/PKG-INFO 2023-06-09 08:30:42.625560000 +0200
@@ -1,12 +1,12 @@
Metadata-Version: 2.1
Name: eradicate
-Version: 2.1.0
+Version: 2.3.0
Summary: Removes commented-out code.
Home-page: https://github.com/myint/eradicate
Author: Steven Myint
+Maintainer: Nikita Sobolev <[email protected]>
License: Expat License
Keywords: clean,format,commented-out code
-Platform: UNKNOWN
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
@@ -93,5 +93,3 @@
There are different tools, plugins, and integrations for ``eradicate`` users:
- `flake8-eradicate <https://github.com/sobolevn/flake8-eradicate>`_ - Flake8
plugin to find commented out or dead code.
-
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eradicate-2.1.0/eradicate
new/eradicate-2.3.0/eradicate
--- old/eradicate-2.1.0/eradicate 2022-04-06 11:43:12.000000000 +0200
+++ new/eradicate-2.3.0/eradicate 1970-01-01 01:00:00.000000000 +0100
@@ -1,47 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (C) 2012-2018 Steven Myint
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-"""eradicate utility."""
-
-from __future__ import print_function
-
-import signal
-import sys
-
-import eradicate
-
-
-if __name__ == '__main__':
- try:
- # Exit on broken pipe.
- signal.signal(signal.SIGPIPE, signal.SIG_DFL)
- except AttributeError:
- # SIGPIPE is not available on Windows.
- pass
-
- try:
- sys.exit(eradicate.main(sys.argv,
- standard_out=sys.stdout,
- standard_error=sys.stderr))
- except KeyboardInterrupt:
- sys.exit(2)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eradicate-2.1.0/eradicate.egg-info/PKG-INFO
new/eradicate-2.3.0/eradicate.egg-info/PKG-INFO
--- old/eradicate-2.1.0/eradicate.egg-info/PKG-INFO 2022-04-06
11:46:41.000000000 +0200
+++ new/eradicate-2.3.0/eradicate.egg-info/PKG-INFO 2023-06-09
08:30:42.000000000 +0200
@@ -1,12 +1,12 @@
Metadata-Version: 2.1
Name: eradicate
-Version: 2.1.0
+Version: 2.3.0
Summary: Removes commented-out code.
Home-page: https://github.com/myint/eradicate
Author: Steven Myint
+Maintainer: Nikita Sobolev <[email protected]>
License: Expat License
Keywords: clean,format,commented-out code
-Platform: UNKNOWN
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
@@ -93,5 +93,3 @@
There are different tools, plugins, and integrations for ``eradicate`` users:
- `flake8-eradicate <https://github.com/sobolevn/flake8-eradicate>`_ - Flake8
plugin to find commented out or dead code.
-
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eradicate-2.1.0/eradicate.egg-info/SOURCES.txt
new/eradicate-2.3.0/eradicate.egg-info/SOURCES.txt
--- old/eradicate-2.1.0/eradicate.egg-info/SOURCES.txt 2022-04-06
11:46:41.000000000 +0200
+++ new/eradicate-2.3.0/eradicate.egg-info/SOURCES.txt 2023-06-09
08:30:42.000000000 +0200
@@ -1,9 +1,10 @@
MANIFEST.in
README.rst
-eradicate
eradicate.py
setup.py
+test_eradicate.py
eradicate.egg-info/PKG-INFO
eradicate.egg-info/SOURCES.txt
eradicate.egg-info/dependency_links.txt
+eradicate.egg-info/entry_points.txt
eradicate.egg-info/top_level.txt
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eradicate-2.1.0/eradicate.egg-info/entry_points.txt
new/eradicate-2.3.0/eradicate.egg-info/entry_points.txt
--- old/eradicate-2.1.0/eradicate.egg-info/entry_points.txt 1970-01-01
01:00:00.000000000 +0100
+++ new/eradicate-2.3.0/eradicate.egg-info/entry_points.txt 2023-06-09
08:30:42.000000000 +0200
@@ -0,0 +1,2 @@
+[console_scripts]
+eradicate = eradicate:main
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eradicate-2.1.0/eradicate.py
new/eradicate-2.3.0/eradicate.py
--- old/eradicate-2.1.0/eradicate.py 2022-04-06 11:44:17.000000000 +0200
+++ new/eradicate-2.3.0/eradicate.py 2023-06-09 08:24:48.000000000 +0200
@@ -27,10 +27,17 @@
import difflib
import io
import os
+import sys
import re
import tokenize
-__version__ = '2.1.0'
+try:
+ detect_encoding = tokenize.detect_encoding
+except AttributeError:
+ from lib2to3.pgen2 import tokenize as lib2to3_tokenize
+ detect_encoding = lib2to3_tokenize.detect_encoding
+
+__version__ = '2.3.0'
class Eradicator(object):
@@ -57,7 +64,9 @@
r'noqa',
r'nosec',
r'type:\s*ignore',
+ r'mypy:',
r'fmt:\s*(on|off)',
+ r'yapf:\s*(enable|disable)',
r'isort:\s*(on|off|skip|skip_file|split|dont-add-imports(:\s*\[.*?\])?)',
r'TODO',
r'FIXME',
@@ -211,8 +220,7 @@
"""Return file encoding."""
try:
with open(filename, 'rb') as input_file:
- from lib2to3.pgen2 import tokenize as lib2to3_tokenize
- encoding =
lib2to3_tokenize.detect_encoding(input_file.readline)[0]
+ encoding = detect_encoding(input_file.readline)[0]
# Check for correctness of encoding.
with self.open_with_encoding(filename, encoding) as input_file:
@@ -234,7 +242,7 @@
flags=re.IGNORECASE)
-def main(argv, standard_out, standard_error):
+def main(argv=sys.argv, standard_out=sys.stdout, standard_error=sys.stderr):
"""Main entry point."""
import argparse
parser = argparse.ArgumentParser(description=__doc__, prog='eradicate')
@@ -290,5 +298,10 @@
except IOError as exception:
print('{}'.format(exception), file=standard_error)
change_or_error = True
+
if change_or_error and args.error:
return 1
+
+
+if __name__ == '__main__':
+ main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eradicate-2.1.0/setup.py new/eradicate-2.3.0/setup.py
--- old/eradicate-2.1.0/setup.py 2022-04-06 11:43:12.000000000 +0200
+++ new/eradicate-2.3.0/setup.py 2023-06-08 18:50:05.000000000 +0200
@@ -24,6 +24,7 @@
long_description=readme.read(),
license='Expat License',
author='Steven Myint',
+ maintainer='Nikita Sobolev <[email protected]>',
url='https://github.com/myint/eradicate',
classifiers=['Environment :: Console',
'Intended Audience :: Developers',
@@ -33,4 +34,9 @@
'Topic :: Software Development :: Quality Assurance'],
keywords='clean, format, commented-out code',
py_modules=['eradicate'],
- scripts=['eradicate'])
+ entry_points={
+ 'console_scripts': [
+ 'eradicate = eradicate:main',
+ ],
+ },
+ )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eradicate-2.1.0/test_eradicate.py
new/eradicate-2.3.0/test_eradicate.py
--- old/eradicate-2.1.0/test_eradicate.py 1970-01-01 01:00:00.000000000
+0100
+++ new/eradicate-2.3.0/test_eradicate.py 2023-06-09 08:24:34.000000000
+0200
@@ -0,0 +1,623 @@
+#!/usr/bin/env python
+
+"""Test suite for eradicate."""
+
+from __future__ import unicode_literals
+
+import contextlib
+import io
+import subprocess
+import sys
+import tempfile
+import unittest
+try: # pragma: no cover
+ import mock
+except ModuleNotFoundError: # pragma: no cover
+ import unittest.mock as mock
+import re
+
+import eradicate
+
+
+class UnitTests(unittest.TestCase):
+
+ def test_comment_contains_code(self):
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '#'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# This is a (real) comment.'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# 123'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# 123.1'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# 1, 2, 3'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ 'x = 1 # x = 1'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# pylint: disable=redefined-outer-name'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# Issue #999: This is not code'))
+
+ self.assertTrue(eradicate.Eradicator().comment_contains_code(
+ '# x = 1'))
+
+ self.assertTrue(eradicate.Eradicator().comment_contains_code(
+ '#from foo import eradicate'))
+
+ self.assertTrue(eradicate.Eradicator().comment_contains_code(
+ '#import eradicate'))
+
+ self.assertTrue(eradicate.Eradicator().comment_contains_code(
+ '#"key": value,'))
+
+ self.assertTrue(eradicate.Eradicator().comment_contains_code(
+ '#"key": "value",'))
+
+ self.assertTrue(eradicate.Eradicator().comment_contains_code(
+ '#"key": 1 + 1,'))
+
+ self.assertTrue(eradicate.Eradicator().comment_contains_code(
+ "#'key': 1 + 1,"))
+
+ self.assertTrue(eradicate.Eradicator().comment_contains_code(
+ '#"key": {'))
+
+ self.assertTrue(eradicate.Eradicator().comment_contains_code(
+ '#}'))
+
+ self.assertTrue(eradicate.Eradicator().comment_contains_code(
+ '#} )]'))
+
+ self.assertTrue(eradicate.Eradicator().comment_contains_code(
+ '#},'))
+
+ def test_comment_contains_code_with_print(self):
+ self.assertTrue(eradicate.Eradicator().comment_contains_code(
+ '#print'))
+
+ self.assertTrue(eradicate.Eradicator().comment_contains_code(
+ '#print(1)'))
+
+ self.assertTrue(eradicate.Eradicator().comment_contains_code(
+ '#print 1'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '#to print'))
+
+ def test_comment_contains_code_with_return(self):
+ self.assertTrue(eradicate.Eradicator().comment_contains_code(
+ '#return x'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '#to return'))
+
+ def test_comment_contains_code_with_multi_line(self):
+ self.assertTrue(eradicate.Eradicator().comment_contains_code(
+ '#def foo():'))
+
+ self.assertTrue(eradicate.Eradicator().comment_contains_code(
+ '#else:'))
+
+ self.assertTrue(eradicate.Eradicator().comment_contains_code(
+ '# else : '))
+
+ self.assertTrue(eradicate.Eradicator().comment_contains_code(
+ '# "foo %d" % \\'))
+
+ self.assertTrue(eradicate.Eradicator().comment_contains_code(
+ '#elif True:'))
+
+ self.assertTrue(eradicate.Eradicator().comment_contains_code(
+ '#x = foo('))
+
+ self.assertTrue(eradicate.Eradicator().comment_contains_code(
+ '#except Exception:'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# this is = to that :('))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '#else'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '#or else:'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '#else True:'))
+
+ def test_comment_contains_code_with_sentences(self):
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '#code is good'))
+
+ def test_comment_contains_code_with_encoding(self):
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# coding=utf-8'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '#coding= utf-8'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# coding: utf-8'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# encoding: utf8'))
+
+ self.assertTrue(eradicate.Eradicator().comment_contains_code(
+ '# codings=utf-8'))
+
+ def test_comment_contains_code_with_default_whitelist(self):
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# pylint: disable=A0123'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# pylint:disable=A0123'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# pylint: disable = A0123'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# pylint:disable = A0123'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# pyright: reportErrorName=true'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# noqa'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# NOQA'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# noqa: A123'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# noqa:A123'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# nosec'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# fmt: on'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# fmt: off'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# fmt:on'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# fmt:off'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# yapf: enable'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# yapf: disable'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# yapf:enable'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# yapf:disable'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# isort: on'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# isort:on'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# isort: off'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# isort:off'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# isort: skip'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# isort:skip'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# isort: skip_file'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# isort:skip_file'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# isort: split'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# isort:split'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# isort: dont-add-imports'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# isort:dont-add-imports'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# isort: dont-add-imports: ["import os"]'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# isort:dont-add-imports: ["import os"]'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# isort: dont-add-imports:["import os"]'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# isort:dont-add-imports:["import os"]'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# type: ignore'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# type:ignore'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# type: ignore[import]'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# type:ignore[import]'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# mypy: ignore-errors'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# mypy: disable-error-code=['))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# mypy: warn-unreachable, strict-optional'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# TODO: Do that'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# FIXME: Fix that'))
+
+ self.assertFalse(eradicate.Eradicator().comment_contains_code(
+ '# XXX: What ever'))
+
+
+ def test_commented_out_code_line_numbers(self):
+ self.assertEqual(
+ [1, 3],
+ list(eradicate.Eradicator().commented_out_code_line_numbers(
+ """\
+# print(5)
+# This is a comment.
+# x = 1
+
+y = 1 # x = 3
+
+# The below is another comment.
+# 3 / 2 + 21
+""")))
+
+ def test_commented_out_code_line_numbers_with_errors(self):
+ self.assertEqual(
+ [1, 3],
+ list(eradicate.Eradicator().commented_out_code_line_numbers(
+ """\
+# print(5)
+# This is a comment.
+# x = 1
+
+y = 1 # x = 3
+
+# The below is another comment.
+# 3 / 2 + 21
+def foo():
+ 1
+ 2
+""")))
+
+ def test_commented_out_code_line_numbers_with_with_statement(self):
+ self.assertEqual(
+ [1, 2],
+ list(eradicate.Eradicator().commented_out_code_line_numbers("""\
+# with open('filename', 'w') as out_file:
+# json.dump(objects, out_file)
+#
+""")))
+
+ def test_commented_out_code_line_numbers_with_for_statement(self):
+ self.assertEqual(
+ [1, 2],
+ list(eradicate.Eradicator().commented_out_code_line_numbers("""\
+# for x in y:
+# oops = x.ham
+""")))
+
+ def test_filter_commented_out_code(self):
+ self.assertEqual(
+ """\
+# This is a comment.
+
+y = 1 # x = 3
+
+# The below is another comment.
+# 3 / 2 + 21
+""",
+ ''.join(eradicate.Eradicator().filter_commented_out_code(
+ """\
+# print(5)
+# This is a comment.
+# x = 1
+
+y = 1 # x = 3
+
+# The below is another comment.
+# 3 / 2 + 21
+# try:
+# x = 1
+# finally:
+# x = 0
+""")))
+
+ def test_filter_commented_out_code_should_avoid_escaped_newlines(self):
+ line = """\
+if False: \\
+# print(3)
+ print(2)
+ print(3)
+"""
+ self.assertEqual(
+ line,
+ ''.join(eradicate.Eradicator().filter_commented_out_code(line)))
+
+ def test_filter_commented_out_code_with_larger_example(self):
+ self.assertEqual(
+ """\
+# This is a comment.
+
+y = 1 # x = 3
+
+# The below is another comment.
+# 3 / 2 + 21
+""",
+ ''.join(eradicate.Eradicator().filter_commented_out_code(
+ """\
+# print(5)
+# This is a comment.
+# x = 1
+
+y = 1 # x = 3
+
+# The below is another comment.
+# 3 / 2 + 21
+""")))
+
+ def test_filter_commented_out_code_without_aggressive(self):
+ code = """\
+# iterate through choices inside of parenthesis (separated by '|'):
+
+# if the Optional takes a value, format is:
+# -s ARGS, --long ARGS
+"""
+ self.assertEqual(
+ code,
+ ''.join(eradicate.Eradicator().filter_commented_out_code(code,
+ aggressive=False)))
+
+ def test_filter_commented_out_code_with_annotation(self):
+ self.assertEqual(
+ '\n\n\n',
+ ''.join(eradicate.Eradicator().filter_commented_out_code("""\
+# class CommentedClass(object):
+# def __init__(self, prop: int) -> None:
+# self.property = prop
+
+# def __str__(self) -> str:
+# return self.__class__.__name__
+
+# def set_prop(self, prop: int):
+# self.prop = prop
+
+# def get_prop(self):
+# return self.prop
+""")))
+
+ def test_detect_encoding_with_bad_encoding(self):
+ with temporary_file('# -*- coding: blah -*-\n') as filename:
+ self.assertEqual('latin-1',
+ eradicate.Eradicator().detect_encoding(filename))
+
+ def test_extend_whitelist(self):
+ eradicator = eradicate.Eradicator()
+ eradicator.update_whitelist(["foo"], True)
+ self.assertTrue(
+ eradicator.WHITELIST_REGEX == re.compile(
+ r'|'.join(list(eradicator.DEFAULT_WHITELIST) + ["foo"]),
flags=re.IGNORECASE
+ )
+ )
+
+ def test_update_whitelist(self):
+ eradicator = eradicate.Eradicator()
+ eradicator.update_whitelist(["foo"], False)
+ self.assertTrue(eradicator.WHITELIST_REGEX == re.compile("foo",
flags=re.IGNORECASE))
+
+
+class SystemTests(unittest.TestCase):
+
+ def test_diff(self):
+ with temporary_file("""\
+# x * 3 == False
+# x is a variable
+""") as filename:
+ output_file = io.StringIO()
+ eradicate.main(argv=['my_fake_program', filename],
+ standard_out=output_file,
+ standard_error=None)
+ self.assertEqual("""\
+@@ -1,2 +1 @@
+-# x * 3 == False
+ # x is a variable
+""", '\n'.join(output_file.getvalue().split('\n')[2:]))
+
+ def test_recursive(self):
+ with temporary_directory() as directory:
+
+ with temporary_file("""\
+# x * 3 == False
+# x is a variable
+""", directory=directory):
+
+ output_file = io.StringIO()
+ eradicate.main(argv=['my_fake_program',
+ '--recursive',
+ directory],
+ standard_out=output_file,
+ standard_error=None)
+ self.assertEqual("""\
+@@ -1,2 +1 @@
+-# x * 3 == False
+ # x is a variable
+""", '\n'.join(output_file.getvalue().split('\n')[2:]))
+
+ def test_ignore_hidden_directories(self):
+ with temporary_directory() as directory:
+ with temporary_directory(prefix='.',
+ directory=directory) as inner_directory:
+
+ with temporary_file("""\
+# x * 3 == False
+# x is a variable
+""", directory=inner_directory):
+
+ output_file = io.StringIO()
+ eradicate.main(argv=['my_fake_program',
+ '--recursive',
+ directory],
+ standard_out=output_file,
+ standard_error=None)
+ self.assertEqual(
+ '',
+ output_file.getvalue().strip())
+
+ def test_in_place(self):
+ with temporary_file("""\
+# x * 3 == False
+# x is a variable
+""") as filename:
+ output_file = io.StringIO()
+ eradicate.main(argv=['my_fake_program', '--in-place', filename],
+ standard_out=output_file,
+ standard_error=None)
+ with open(filename) as f:
+ self.assertEqual("""\
+# x is a variable
+""", f.read())
+
+ def test_with_missing_file(self):
+ output_file = io.StringIO()
+ ignore = StubFile()
+ eradicate.main(argv=['my_fake_program', '--in-place', '.fake'],
+ standard_out=output_file,
+ standard_error=ignore)
+ self.assertFalse(output_file.getvalue())
+
+ def test_returns_error_code_if_requested(self):
+ with temporary_file("""\
+ # x * 3 == False
+ # x is a variable
+ """) as filename:
+ output_file = io.StringIO()
+ result = eradicate.main(argv=['my_fake_program', filename, "-e"],
+ standard_out=output_file,
+ standard_error=None)
+ self.assertTrue(result)
+
+ def test_returns_None_if_no_error_request(self):
+ with temporary_file("""\
+ # x * 3 == False
+ # x is a variable
+ """) as filename:
+ output_file = io.StringIO()
+ result = eradicate.main(argv=['my_fake_program', filename],
+ standard_out=output_file,
+ standard_error=None)
+ self.assertTrue(result is None)
+
+ def test_end_to_end(self):
+ with temporary_file("""\
+# x * 3 == False
+# x is a variable
+""") as filename:
+ process = subprocess.Popen([sys.executable, '-m'
+ 'eradicate', filename],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ universal_newlines=True)
+ out, err = process.communicate()
+ self.assertEqual("""\
+@@ -1,2 +1 @@
+-# x * 3 == False
+ # x is a variable""",
+ '\n'.join(out.splitlines()[2:]))
+ self.assertEqual(err, '')
+
+ def test_whitelist(self):
+ mock_update = mock.Mock()
+ with mock.patch.object(eradicate.Eradicator, 'update_whitelist',
mock_update):
+ with temporary_file("# empty") as filename:
+ result = eradicate.main(argv=['my_fake_program',
'--whitelist', 'foo# bar', filename],
+ standard_out=None,
+ standard_error=None)
+ self.assertTrue(result is None)
+ mock_update.assert_called_once_with(["foo", " bar"], False)
+
+ def test_whitelist_extend(self):
+ mock_update = mock.Mock()
+ with mock.patch.object(eradicate.Eradicator, 'update_whitelist',
mock_update):
+ with temporary_file("# empty") as filename:
+ result = eradicate.main(argv=['my_fake_program',
'--whitelist-extend', 'foo #bar', filename],
+ standard_out=None,
+ standard_error=None)
+ self.assertTrue(result is None)
+ mock_update.assert_called_once_with(["foo ", "bar"], True)
+
+
[email protected]
+def temporary_file(contents, directory='.', prefix=''):
+ """Write contents to temporary file and yield it."""
+ f = tempfile.NamedTemporaryFile(suffix='.py', prefix=prefix,
+ delete=False, dir=directory)
+ try:
+ f.write(contents.encode())
+ f.close()
+ yield f.name
+ finally:
+ import os
+ os.remove(f.name)
+
+
[email protected]
+def temporary_directory(directory='.', prefix=''):
+ """Create temporary directory and yield its path."""
+ temp_directory = tempfile.mkdtemp(prefix=prefix, dir=directory)
+ try:
+ yield temp_directory
+ finally:
+ import shutil
+ shutil.rmtree(temp_directory)
+
+
+class StubFile(object):
+
+ """Fake file that ignores everything."""
+
+ def write(*_):
+ """Ignore."""
+
+
+if __name__ == '__main__':
+ unittest.main()