Accepting request 882503 from devel:languages:python

- update to 4.0.0:
  * Opted back into using Poetry now that the existing issues have been fixed.
  * Python 2.7 support was no officially dropped. 
- add pycodestyle-indent-size.patch and use pypi tarball to avoid poetry

OBS-URL: https://build.opensuse.org/request/show/882503
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/python-flake8-debugger?expand=0&rev=3
This commit is contained in:
Richard Brown 2021-04-01 12:18:04 +00:00 committed by Git OBS Bridge
commit 1f20713e40
6 changed files with 430 additions and 8 deletions

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:1591897d08b06399fe18bbb631c74b98871b68ca72f230e1e09c3708c026ce9f
size 5969

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e43dc777f7db1481db473210101ec2df2bd39a45b149d7218a618e954177eda6
size 4258

View File

@ -0,0 +1,10 @@
--- a/test_linter.py 2021-04-01 09:11:21.755700607 +0200
+++ b/test_linter.py 2021-04-01 09:11:52.280287278 +0200
@@ -31,6 +31,7 @@
max_doc_length = None
hang_closing = False
verbose = False
+ indent_size = 4
benchmark_keys = {"files": 0, "physical lines": 0, "logical lines": 0}

View File

@ -1,3 +1,11 @@
-------------------------------------------------------------------
Thu Apr 1 07:18:57 UTC 2021 - Dirk Müller <dmueller@suse.com>
- update to 4.0.0:
* Opted back into using Poetry now that the existing issues have been fixed.
* Python 2.7 support was no officially dropped.
- add pycodestyle-indent-size.patch and use pypi tarball to avoid poetry
-------------------------------------------------------------------
Thu Apr 16 10:43:35 UTC 2020 - Tomáš Chvátal <tchvatal@suse.com>

View File

@ -1,7 +1,7 @@
#
# spec file for package python-flake8-debugger
#
# Copyright (c) 2020 SUSE LLC
# Copyright (c) 2021 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@ -17,15 +17,18 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
%global skip_python2 1
Name: python-flake8-debugger
Version: 3.2.1
Version: 4.0.0
Release: 0
Summary: ipdb/pdb statement checker plugin for flake8
License: MIT
URL: https://github.com/jbkahn/flake8-debugger
Source: https://github.com/JBKahn/flake8-debugger/archive/%{version}.tar.gz
Source0: https://files.pythonhosted.org/packages/source/f/flake8-debugger/flake8-debugger-%{version}.tar.gz
Source1: LICENSE
BuildRequires: %{python_module setuptools}
Source2: https://raw.githubusercontent.com/JBKahn/flake8-debugger/4.0.0/test_linter.py
# https://github.com/JBKahn/flake8-debugger/issues/28
Patch1: pycodestyle-indent-size.patch
BuildRequires: fdupes
BuildRequires: python-rpm-macros
BuildArch: noarch
@ -42,7 +45,8 @@ ipdb/pdb statement checker plugin for flake8
%prep
%setup -q -n flake8-debugger-%{version}
cp %{SOURCE1} .
sed -i -e '/pytest-runner/d' setup.py
cp %{SOURCE2} .
%patch1 -p1
%build
%python_build

400
test_linter.py Normal file
View File

@ -0,0 +1,400 @@
import pycodestyle
from flake8_debugger import DebuggerChecker
import pytest
import sys
class CaptureReport(pycodestyle.BaseReport):
"""Collect the results of the checks."""
def __init__(self, options):
self._results = []
super(CaptureReport, self).__init__(options)
def error(self, line_number, offset, text, check):
"""Store each error."""
code = super(CaptureReport, self).error(line_number, offset, text, check)
if code:
record = {"line": line_number, "col": offset, "message": "{0} {1}".format(code, text[5:])}
self._results.append(record)
return code
class DebuggerTestStyleGuide(pycodestyle.StyleGuide):
logical_checks = []
physical_checks = []
ast_checks = [("debugger_usage", DebuggerChecker, ["tree", "filename", "lines"])]
max_line_length = None
max_doc_length = None
hang_closing = False
verbose = False
benchmark_keys = {"files": 0, "physical lines": 0, "logical lines": 0}
_debugger_test_style = DebuggerTestStyleGuide()
def check_code_for_debugger_statements(code):
"""Process code using pycodestyle Checker and return all errors."""
from tempfile import NamedTemporaryFile
test_file = NamedTemporaryFile(delete=False)
test_file.write(code.encode())
test_file.flush()
report = CaptureReport(options=_debugger_test_style)
lines = [line + "\n" for line in code.split("\n")]
checker = pycodestyle.Checker(filename=test_file.name, lines=lines, options=_debugger_test_style, report=report)
checker.check_all()
return report._results
class TestQA(object):
def test_catches_simple_debugger(self):
result = check_code_for_debugger_statements("from ipdb import set_trace as r\nr()")
expected_result = [
{"line": 2, "message": "T100 trace found: set_trace used as r", "col": 0},
{"line": 1, "message": "T100 import for set_trace found as r", "col": 0},
]
assert result == expected_result
def test_catches_simple_debugger_when_called_off_lib(self):
result = check_code_for_debugger_statements("import ipdb\nipdb.set_trace()")
expected_result = [
{"line": 2, "message": "T100 trace found: ipdb.set_trace used", "col": 0},
{"line": 1, "message": "T100 import for ipdb found", "col": 0},
]
assert result == expected_result
def test_catches_simple_debugger_when_called_off_global(self):
result = check_code_for_debugger_statements("__import__('ipdb').set_trace()")
expected_result = [{"line": 1, "message": "T100 trace found: set_trace used", "col": 0}]
assert result == expected_result
@pytest.mark.skipif(True, reason="Not supported just yet")
def test_catches_simple_debugger_when_called_off_var(self):
result = check_code_for_debugger_statements("import ipdb\ntest = ipdb.set_trace\ntest()")
expected_result = [
{"line": 1, "message": "T100 import for ipdb found", "col": 0},
{"line": 3, "message": "T100 trace found: ipdb.set_trace used", "col": 0},
]
assert result == expected_result
class TestBreakpoint(object):
@pytest.mark.skipif(sys.version_info < (3, 7), reason="breakpoint builtin introduced in 3.7")
def test_catches_breakpoint_call_for_python_3_7_and_above(self):
result = check_code_for_debugger_statements("breakpoint()")
expected_result = [{"line": 1, "message": "T100 trace found: breakpoint used", "col": 0}]
assert result == expected_result
@pytest.mark.skipif(sys.version_info < (3, 7), reason="breakpoint builtin introduced in 3.7")
def test_catches_breakpoint_import(self):
result = check_code_for_debugger_statements("from builtins import breakpoint")
expected_result = [{"line": 1, "message": "T100 import for breakpoint found", "col": 0}]
assert result == expected_result
@pytest.mark.skipif(sys.version_info < (3, 7), reason="breakpoint builtin introduced in 3.7")
def test_allows_builtins_import(self):
result = check_code_for_debugger_statements("import builtins")
expected_result = []
assert result == expected_result
@pytest.mark.skipif(sys.version_info < (3, 7), reason="breakpoint builtin introduced in 3.7")
def test_catches_breakpoint_usage_from_builtins(self):
result = check_code_for_debugger_statements("import builtins\nbuiltins.breakpoint()")
expected_result = [{"col": 0, "line": 2, "message": "T100 trace found: breakpoint used"}]
assert result == expected_result
@pytest.mark.skipif(sys.version_info < (3, 7), reason="breakpoint builtin introduced in 3.7")
def test_catches_breakpoint_imported_as_other_name(self):
result = check_code_for_debugger_statements("from builtins import breakpoint as b\nb()")
expected_result = [
{"line": 2, "message": "T100 trace found: breakpoint used as b", "col": 0},
{"line": 1, "message": "T100 import for breakpoint found as b", "col": 0},
]
assert result == expected_result
@pytest.mark.skipif(sys.version_info >= (3, 7), reason="breakpoint builtin introduced in 3.7")
def test_allows_breakpoint_call_for_python_below_3_7(self):
result = check_code_for_debugger_statements("breakpoint()")
expected_result = []
assert result == expected_result
class TestNoQA(object):
@pytest.mark.skipif(sys.version_info < (2, 7), reason="Python 2.6 does not support noqa")
def test_skip_import(self):
result = check_code_for_debugger_statements("from ipdb import set_trace as r # noqa\nr()")
expected_result = [{"line": 2, "message": "T100 trace found: set_trace used as r", "col": 0}]
assert result == expected_result
@pytest.mark.skipif(sys.version_info < (2, 7), reason="Python 2.6 does not support noqa")
def test_skip_usage(self):
result = check_code_for_debugger_statements("from ipdb import set_trace as r\nr() # noqa")
expected_result = [{"line": 1, "message": "T100 import for set_trace found as r", "col": 0}]
assert result == expected_result
@pytest.mark.skipif(sys.version_info < (2, 7), reason="Python 2.6 does not support noqa")
def test_skip_import_and_usage(self):
result = check_code_for_debugger_statements("from ipdb import set_trace as r # noqa\nr() # noqa")
expected_result = []
assert result == expected_result
class TestImportCases(object):
def test_import_multiple(self):
result = check_code_for_debugger_statements("import math, ipdb, collections")
assert result == [{"col": 0, "line": 1, "message": "T100 import for ipdb found"}]
def test_import(self):
result = check_code_for_debugger_statements("import pdb")
assert result == [{"col": 0, "line": 1, "message": "T100 import for pdb found"}]
def test_import_interactive_shell_embed(self):
result = check_code_for_debugger_statements("from IPython.terminal.embed import InteractiveShellEmbed")
assert result == [{"col": 0, "line": 1, "message": "T100 import for InteractiveShellEmbed found"}]
def test_import_both_same_line(self):
result = check_code_for_debugger_statements("import pdb, ipdb")
result = sorted(result, key=lambda debugger: debugger["message"])
expected_result = [
{"col": 0, "line": 1, "message": "T100 import for ipdb found"},
{"col": 0, "line": 1, "message": "T100 import for pdb found"},
]
assert result == expected_result
def test_import_math(self):
result = check_code_for_debugger_statements("import math")
assert result == []
def test_import_noqa(self):
result = check_code_for_debugger_statements("import ipdb # noqa")
assert result == []
class TestModuleSetTraceCases(object):
def test_import_ipython_terminal_embed_use_InteractiveShellEmbed(self):
result = check_code_for_debugger_statements(
"from IPython.terminal.embed import InteractiveShellEmbed; InteractiveShellEmbed()()"
)
expected_result = [
{"col": 58, "line": 1, "message": "T100 trace found: InteractiveShellEmbed used"},
{"col": 0, "line": 1, "message": "T100 import for InteractiveShellEmbed found"},
]
try:
assert result == expected_result
except AssertionError:
for item in expected_result:
item["col"] = 0
assert result == expected_result
def test_import_ipdb_use_set_trace(self):
result = check_code_for_debugger_statements("import ipdb;ipdb.set_trace();")
expected_result = [
{"col": 12, "line": 1, "message": "T100 trace found: ipdb.set_trace used"},
{"col": 0, "line": 1, "message": "T100 import for ipdb found"},
]
try:
assert result == expected_result
except AssertionError:
for item in expected_result:
item["col"] = 0
assert result == expected_result
def test_import_pdb_use_set_trace(self):
result = check_code_for_debugger_statements("import pdb;pdb.set_trace();")
expected_result = [
{"col": 11, "line": 1, "message": "T100 trace found: pdb.set_trace used"},
{"col": 0, "line": 1, "message": "T100 import for pdb found"},
]
try:
assert result == expected_result
except AssertionError:
for item in expected_result:
item["col"] = 0
assert result == expected_result
def test_import_pdb_use_set_trace_twice(self):
result = check_code_for_debugger_statements("import pdb;pdb.set_trace() and pdb.set_trace();")
expected_result = [
{"col": 11, "line": 1, "message": "T100 trace found: pdb.set_trace used"},
{"col": 31, "line": 1, "message": "T100 trace found: pdb.set_trace used"},
{"col": 0, "line": 1, "message": "T100 import for pdb found"},
]
try:
assert result == expected_result
except AssertionError:
for item in expected_result:
item["col"] = 0
assert result == expected_result
def test_import_other_module_as_set_trace_and_use_it(self):
result = check_code_for_debugger_statements("from math import Max as set_trace\nset_trace()")
assert result == []
class TestImportAsCases(object):
def test_import_ipdb_as(self):
result = check_code_for_debugger_statements("import math, ipdb as sif, collections")
assert result == [{"col": 0, "line": 1, "message": "T100 import for ipdb found as sif"}]
class TestModuleASSetTraceCases(object):
def test_import_ipdb_as_use_set_trace(self):
result = check_code_for_debugger_statements("import ipdb as sif;sif.set_trace();")
expected_result = [
{"col": 19, "line": 1, "message": "T100 trace found: sif.set_trace used"},
{"col": 0, "line": 1, "message": "T100 import for ipdb found as sif"},
]
try:
assert result == expected_result
except AssertionError:
for item in expected_result:
item["col"] = 0
assert result == expected_result
class TestImportSetTraceCases(object):
def test_import_set_trace_ipdb(self):
result = check_code_for_debugger_statements("from ipdb import run, set_trace;set_trace();")
expected_result = [
{"col": 32, "line": 1, "message": "T100 trace found: set_trace used"},
{"col": 0, "line": 1, "message": "T100 import for set_trace found"},
]
try:
assert result == expected_result
except AssertionError:
for item in expected_result:
item["col"] = 0
assert result == expected_result
def test_import_set_trace_pdb(self):
result = check_code_for_debugger_statements("from pdb import set_trace; set_trace();")
expected_result = [
{"col": 27, "line": 1, "message": "T100 trace found: set_trace used"},
{"col": 0, "line": 1, "message": "T100 import for set_trace found"},
]
try:
assert result == expected_result
except AssertionError:
for item in expected_result:
item["col"] = 0
assert result == expected_result
def test_import_set_trace_ipdb_as_and_use(self):
result = check_code_for_debugger_statements("from ipdb import run, set_trace as sif; sif();")
expected_result = [
{"col": 40, "line": 1, "message": "T100 trace found: set_trace used as sif"},
{"col": 0, "line": 1, "message": "T100 import for set_trace found as sif"},
]
try:
assert result == expected_result
except AssertionError:
for item in expected_result:
item["col"] = 0
assert result == expected_result
def test_import_set_trace_ipdb_as_and_use_with_conjunction_and(self):
result = check_code_for_debugger_statements("from ipdb import run, set_trace as sif; True and sif();")
expected_result = [
{"col": 49, "line": 1, "message": "T100 trace found: set_trace used as sif"},
{"col": 0, "line": 1, "message": "T100 import for set_trace found as sif"},
]
try:
assert result == expected_result
except AssertionError:
for item in expected_result:
item["col"] = 0
assert result == expected_result
def test_import_set_trace_ipdb_as_and_use_with_conjunction_or(self):
result = check_code_for_debugger_statements("from ipdb import run, set_trace as sif; True or sif();")
expected_result = [
{"col": 48, "line": 1, "message": "T100 trace found: set_trace used as sif"},
{"col": 0, "line": 1, "message": "T100 import for set_trace found as sif"},
]
try:
assert result == expected_result
except AssertionError:
for item in expected_result:
item["col"] = 0
assert result == expected_result
def test_import_set_trace_ipdb_as_and_use_with_conjunction_or_noqa(self):
result = check_code_for_debugger_statements("from ipdb import run, set_trace as sif; True or sif(); # noqa")
try:
assert result == []
except AssertionError:
pass
def test_import_set_trace_ipdb_as_and_use_with_conjunction_or_noqa_import_only(self):
result = check_code_for_debugger_statements("from ipdb import run, set_trace as sif # noqa\nTrue or sif()")
expected_result = [{"col": 8, "line": 2, "message": "T100 trace found: set_trace used as sif"}]
try:
assert result == expected_result
except AssertionError:
for item in expected_result:
item["col"] = 0
assert result == expected_result