From da81943ba6abe4e494c9fa5920ff7e3c80959af60cd291b695f5a821a497b14f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mark=C3=A9ta=20Machov=C3=A1?= Date: Fri, 26 Aug 2022 06:37:05 +0000 Subject: [PATCH] Accepting request 999222 from home:bnavigator:branches:devel:languages:python - Update to 2.1.0 * New class-based API. - No further release notes OBS-URL: https://build.opensuse.org/request/show/999222 OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-eradicate?expand=0&rev=7 --- eradicate-1.0.tar.gz | 3 - eradicate-2.1.0.tar.gz | 3 + python-eradicate.changes | 7 + python-eradicate.spec | 13 +- test_eradicate.py | 278 +++++++++++++++++++++++++++++++-------- 5 files changed, 243 insertions(+), 61 deletions(-) delete mode 100644 eradicate-1.0.tar.gz create mode 100644 eradicate-2.1.0.tar.gz diff --git a/eradicate-1.0.tar.gz b/eradicate-1.0.tar.gz deleted file mode 100644 index 291db79..0000000 --- a/eradicate-1.0.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4ffda82aae6fd49dfffa777a857cb758d77502a1f2e0f54c9ac5155a39d2d01a -size 4644 diff --git a/eradicate-2.1.0.tar.gz b/eradicate-2.1.0.tar.gz new file mode 100644 index 0000000..393bdf3 --- /dev/null +++ b/eradicate-2.1.0.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aac7384ab25b1bf21c4c012de9b4bf8398945a14c98c911545b2ea50ab558014 +size 6007 diff --git a/python-eradicate.changes b/python-eradicate.changes index 95c0cfe..071c920 100644 --- a/python-eradicate.changes +++ b/python-eradicate.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Thu Aug 25 09:45:28 UTC 2022 - Ben Greiner + +- Update to 2.1.0 + * New class-based API. +- No further release notes + ------------------------------------------------------------------- Thu Feb 14 01:29:57 UTC 2019 - Jan Engelhardt diff --git a/python-eradicate.spec b/python-eradicate.spec index 3ad4abc..675988b 100644 --- a/python-eradicate.spec +++ b/python-eradicate.spec @@ -1,7 +1,7 @@ # # spec file for package python-eradicate # -# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. +# 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-eradicate -Version: 1.0 +Version: 2.1.0 Release: 0 Summary: Python utility for removing commented-out code License: MIT @@ -30,7 +30,7 @@ BuildRequires: %{python_module setuptools} BuildRequires: fdupes BuildRequires: python-rpm-macros Requires(post): update-alternatives -Requires(postun): update-alternatives +Requires(postun):update-alternatives BuildArch: noarch %python_subpackages @@ -62,12 +62,13 @@ cp %{SOURCE1} . %python_uninstall_alternative eradicate %check -export PYTHONPATH=. -%python_exec %{SOURCE1} +%pyunittest -v %files %{python_files} %doc README.rst %python_alternative %{_bindir}/eradicate -%{python_sitelib}/* +%{python_sitelib}/eradicate.py* +%pycache_only %{python_sitelib}/__pycache__/eradicate*.pyc +%{python_sitelib}/eradicate-%{version}*-info %changelog diff --git a/test_eradicate.py b/test_eradicate.py index 41b2899..2248d07 100644 --- a/test_eradicate.py +++ b/test_eradicate.py @@ -10,6 +10,11 @@ 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 @@ -17,141 +22,254 @@ import eradicate class UnitTests(unittest.TestCase): def test_comment_contains_code(self): - self.assertFalse(eradicate.comment_contains_code( + self.assertFalse(eradicate.Eradicator().comment_contains_code( '#')) - self.assertFalse(eradicate.comment_contains_code( + self.assertFalse(eradicate.Eradicator().comment_contains_code( '# This is a (real) comment.')) - self.assertFalse(eradicate.comment_contains_code( + self.assertFalse(eradicate.Eradicator().comment_contains_code( '# 123')) - self.assertFalse(eradicate.comment_contains_code( + self.assertFalse(eradicate.Eradicator().comment_contains_code( '# 123.1')) - self.assertFalse(eradicate.comment_contains_code( + self.assertFalse(eradicate.Eradicator().comment_contains_code( '# 1, 2, 3')) - self.assertFalse(eradicate.comment_contains_code( + self.assertFalse(eradicate.Eradicator().comment_contains_code( 'x = 1 # x = 1')) - self.assertFalse(eradicate.comment_contains_code( + self.assertFalse(eradicate.Eradicator().comment_contains_code( '# pylint: disable=redefined-outer-name')) - self.assertFalse(eradicate.comment_contains_code( + self.assertFalse(eradicate.Eradicator().comment_contains_code( '# Issue #999: This is not code')) - self.assertTrue(eradicate.comment_contains_code( + self.assertTrue(eradicate.Eradicator().comment_contains_code( '# x = 1')) - self.assertTrue(eradicate.comment_contains_code( + self.assertTrue(eradicate.Eradicator().comment_contains_code( '#from foo import eradicate')) - self.assertTrue(eradicate.comment_contains_code( + self.assertTrue(eradicate.Eradicator().comment_contains_code( '#import eradicate')) - self.assertTrue(eradicate.comment_contains_code( + self.assertTrue(eradicate.Eradicator().comment_contains_code( '#"key": value,')) - self.assertTrue(eradicate.comment_contains_code( + self.assertTrue(eradicate.Eradicator().comment_contains_code( '#"key": "value",')) - self.assertTrue(eradicate.comment_contains_code( + self.assertTrue(eradicate.Eradicator().comment_contains_code( '#"key": 1 + 1,')) - self.assertTrue(eradicate.comment_contains_code( + self.assertTrue(eradicate.Eradicator().comment_contains_code( "#'key': 1 + 1,")) - self.assertTrue(eradicate.comment_contains_code( + self.assertTrue(eradicate.Eradicator().comment_contains_code( '#"key": {')) - self.assertTrue(eradicate.comment_contains_code( + self.assertTrue(eradicate.Eradicator().comment_contains_code( '#}')) - self.assertTrue(eradicate.comment_contains_code( + self.assertTrue(eradicate.Eradicator().comment_contains_code( '#} )]')) - self.assertTrue(eradicate.comment_contains_code( + self.assertTrue(eradicate.Eradicator().comment_contains_code( '#},')) def test_comment_contains_code_with_print(self): - self.assertTrue(eradicate.comment_contains_code( + self.assertTrue(eradicate.Eradicator().comment_contains_code( '#print')) - self.assertTrue(eradicate.comment_contains_code( + self.assertTrue(eradicate.Eradicator().comment_contains_code( '#print(1)')) - self.assertTrue(eradicate.comment_contains_code( + self.assertTrue(eradicate.Eradicator().comment_contains_code( '#print 1')) - self.assertFalse(eradicate.comment_contains_code( + self.assertFalse(eradicate.Eradicator().comment_contains_code( '#to print')) def test_comment_contains_code_with_return(self): - self.assertTrue(eradicate.comment_contains_code( + self.assertTrue(eradicate.Eradicator().comment_contains_code( '#return x')) - self.assertFalse(eradicate.comment_contains_code( + self.assertFalse(eradicate.Eradicator().comment_contains_code( '#to return')) def test_comment_contains_code_with_multi_line(self): - self.assertTrue(eradicate.comment_contains_code( + self.assertTrue(eradicate.Eradicator().comment_contains_code( '#def foo():')) - self.assertTrue(eradicate.comment_contains_code( + self.assertTrue(eradicate.Eradicator().comment_contains_code( '#else:')) - self.assertTrue(eradicate.comment_contains_code( + self.assertTrue(eradicate.Eradicator().comment_contains_code( '# else : ')) - self.assertTrue(eradicate.comment_contains_code( + self.assertTrue(eradicate.Eradicator().comment_contains_code( '# "foo %d" % \\')) - self.assertTrue(eradicate.comment_contains_code( + self.assertTrue(eradicate.Eradicator().comment_contains_code( '#elif True:')) - self.assertTrue(eradicate.comment_contains_code( + self.assertTrue(eradicate.Eradicator().comment_contains_code( '#x = foo(')) - self.assertTrue(eradicate.comment_contains_code( + self.assertTrue(eradicate.Eradicator().comment_contains_code( '#except Exception:')) - self.assertFalse(eradicate.comment_contains_code( + self.assertFalse(eradicate.Eradicator().comment_contains_code( '# this is = to that :(')) - self.assertFalse(eradicate.comment_contains_code( + self.assertFalse(eradicate.Eradicator().comment_contains_code( '#else')) - self.assertFalse(eradicate.comment_contains_code( + self.assertFalse(eradicate.Eradicator().comment_contains_code( '#or else:')) - self.assertFalse(eradicate.comment_contains_code( + self.assertFalse(eradicate.Eradicator().comment_contains_code( '#else True:')) def test_comment_contains_code_with_sentences(self): - self.assertFalse(eradicate.comment_contains_code( + self.assertFalse(eradicate.Eradicator().comment_contains_code( '#code is good')) def test_comment_contains_code_with_encoding(self): - self.assertFalse(eradicate.comment_contains_code( + self.assertFalse(eradicate.Eradicator().comment_contains_code( '# coding=utf-8')) - self.assertFalse(eradicate.comment_contains_code( + self.assertFalse(eradicate.Eradicator().comment_contains_code( '#coding= utf-8')) - self.assertFalse(eradicate.comment_contains_code( + self.assertFalse(eradicate.Eradicator().comment_contains_code( '# coding: utf-8')) - self.assertFalse(eradicate.comment_contains_code( + self.assertFalse(eradicate.Eradicator().comment_contains_code( '# encoding: utf8')) - self.assertTrue(eradicate.comment_contains_code( + 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( + '# 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( + '# 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.commented_out_code_line_numbers( + list(eradicate.Eradicator().commented_out_code_line_numbers( """\ # print(5) # This is a comment. @@ -166,7 +284,7 @@ y = 1 # x = 3 def test_commented_out_code_line_numbers_with_errors(self): self.assertEqual( [1, 3], - list(eradicate.commented_out_code_line_numbers( + list(eradicate.Eradicator().commented_out_code_line_numbers( """\ # print(5) # This is a comment. @@ -184,7 +302,7 @@ def foo(): def test_commented_out_code_line_numbers_with_with_statement(self): self.assertEqual( [1, 2], - list(eradicate.commented_out_code_line_numbers("""\ + list(eradicate.Eradicator().commented_out_code_line_numbers("""\ # with open('filename', 'w') as out_file: # json.dump(objects, out_file) # @@ -193,7 +311,7 @@ def foo(): def test_commented_out_code_line_numbers_with_for_statement(self): self.assertEqual( [1, 2], - list(eradicate.commented_out_code_line_numbers("""\ + list(eradicate.Eradicator().commented_out_code_line_numbers("""\ # for x in y: # oops = x.ham """))) @@ -208,7 +326,7 @@ y = 1 # x = 3 # The below is another comment. # 3 / 2 + 21 """, - ''.join(eradicate.filter_commented_out_code( + ''.join(eradicate.Eradicator().filter_commented_out_code( """\ # print(5) # This is a comment. @@ -233,7 +351,7 @@ if False: \\ """ self.assertEqual( line, - ''.join(eradicate.filter_commented_out_code(line))) + ''.join(eradicate.Eradicator().filter_commented_out_code(line))) def test_filter_commented_out_code_with_larger_example(self): self.assertEqual( @@ -245,7 +363,7 @@ y = 1 # x = 3 # The below is another comment. # 3 / 2 + 21 """, - ''.join(eradicate.filter_commented_out_code( + ''.join(eradicate.Eradicator().filter_commented_out_code( """\ # print(5) # This is a comment. @@ -266,13 +384,13 @@ y = 1 # x = 3 """ self.assertEqual( code, - ''.join(eradicate.filter_commented_out_code(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.filter_commented_out_code("""\ + ''.join(eradicate.Eradicator().filter_commented_out_code("""\ # class CommentedClass(object): # def __init__(self, prop: int) -> None: # self.property = prop @@ -290,7 +408,21 @@ y = 1 # x = 3 def test_detect_encoding_with_bad_encoding(self): with temporary_file('# -*- coding: blah -*-\n') as filename: self.assertEqual('latin-1', - eradicate.detect_encoding(filename)) + 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): @@ -372,6 +504,28 @@ class SystemTests(unittest.TestCase): 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 @@ -386,6 +540,26 @@ class SystemTests(unittest.TestCase): # x is a variable """, '\n'.join(process.communicate()[0].decode().split('\n')[2:])) + 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) + @contextlib.contextmanager def temporary_file(contents, directory='.', prefix=''):