Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release 0.21.0 #188

Merged
merged 10 commits into from
Oct 6, 2023
Merged
7 changes: 7 additions & 0 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,13 @@ If you want to help development, there is
Releases
========

0.21.0
~~~~~~
- Dropped support for pytest < 7.0 in preparation for pytest 8.0 (should work with it when it comes out)
- Dropped support for pylint < 2.15 to work better with Python 3.11 and drop backwards compatibility code
- Use baked in TOML support with fallback to newer tomli library thanks to `mgorny <https://github.com/mgorny>`__


0.20.0
~~~~~~
- Corrected issues introduced by deprecations in pylint
Expand Down
43 changes: 21 additions & 22 deletions pytest_pylint/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,26 @@
"""


import sys
from collections import defaultdict
from configparser import ConfigParser, NoOptionError, NoSectionError
from os import getcwd, makedirs, sep
from os.path import dirname, exists, getmtime, join
from pathlib import Path

import pytest
import toml
from pylint import config as pylint_config
from pylint import lint

from .pylint_util import ProgrammaticReporter
from .util import PyLintException, get_rel_path, should_include_file

if sys.version_info >= (3, 11):
import tomllib
else:
# pylint: disable=import-error
import tomli as tomllib

HISTKEY = "pylint/mtimes"
PYLINT_CONFIG_CACHE_KEY = "pylintrc"
FILL_CHARS = 80
Expand Down Expand Up @@ -105,14 +111,7 @@ def pytest_configure(self, config):
if config.option.pylint_rcfile:
pylintrc_file = config.option.pylint_rcfile
else:
# handling files apart from pylintrc was only introduced in pylint
# 2.5, if we can't use find_default_config_files(), fall back on PYLINTRC
# once we drop support below 2.5 we can get rid of this
try:
pylintrc_file = next(pylint_config.find_default_config_files(), None)
except AttributeError:
# pylint: disable=no-member
pylintrc_file = pylint_config.PYLINTRC
pylintrc_file = next(pylint_config.find_default_config_files(), None)

if pylintrc_file and not exists(pylintrc_file):
# The directory of pytest.ini got a chance
Expand Down Expand Up @@ -185,10 +184,10 @@ def _load_rc_file(self, pylintrc_file):
pass

def _load_pyproject_toml(self, pylintrc_file):
with open(pylintrc_file, "r", encoding="utf-8") as f_p:
with open(pylintrc_file, "rb") as f_p:
try:
content = toml.load(f_p)
except (TypeError, toml.decoder.TomlDecodeError):
content = tomllib.load(f_p)
except (TypeError, tomllib.TOMLDecodeError):
return

try:
Expand Down Expand Up @@ -226,11 +225,11 @@ def pytest_collect_file(self, path, parent):
if path.ext != ".py":
return None

rel_path = get_rel_path(path.strpath, parent.session.fspath.strpath)
rel_path = get_rel_path(path.strpath, str(parent.session.path))
if should_include_file(
rel_path, self.pylint_ignore, self.pylint_ignore_patterns
):
item = PylintFile.from_parent(parent, fspath=path, plugin=self)
item = PylintFile.from_parent(parent, path=Path(path), plugin=self)
else:
return None

Expand Down Expand Up @@ -305,15 +304,15 @@ class PylintFile(pytest.File):
mtime = None # : float

@classmethod
def from_parent(cls, parent, *, fspath, plugin):
def from_parent(cls, parent, *, path, plugin, **kw):
# pylint: disable=arguments-differ
# We add the ``plugin`` kwarg to get plugin level information so the
# signature differs
# pylint: disable=arguments-differ
_self = getattr(super(), "from_parent", cls)(parent, fspath=fspath)
_self = getattr(super(), "from_parent", cls)(parent, path=path, **kw)
_self.plugin = plugin

_self.rel_path = get_rel_path(fspath.strpath, parent.session.fspath.strpath)
_self.mtime = fspath.mtime()
_self.rel_path = get_rel_path(str(path), str(parent.session.path))
_self.mtime = path.stat().st_mtime
prev_mtime = _self.plugin.mtimes.get(_self.rel_path, 0)
_self.should_skip = prev_mtime == _self.mtime

Expand All @@ -330,8 +329,8 @@ class PyLintItem(pytest.Item):
parent = None # : PylintFile
plugin = None # : PylintPlugin

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def __init__(self, *args, **kw):
super().__init__(*args, **kw)
self.add_marker(MARKER)
self.plugin = self.parent.plugin

Expand Down Expand Up @@ -393,4 +392,4 @@ def repr_failure(self, excinfo, style=None):
def reportinfo(self):
"""Generate our test report"""
# pylint: disable=no-member
return self.fspath, None, f"[pylint] {self.parent.rel_path}"
return self.path, None, f"[pylint] {self.parent.rel_path}"
12 changes: 6 additions & 6 deletions pytest_pylint/tests/test_pytest_pylint.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"""
Unit testing module for pytest-pylint plugin
"""
import os
import pathlib
import re
from textwrap import dedent
from unittest import mock
Expand Down Expand Up @@ -312,8 +312,8 @@ def test_output_file(testdir):
"""Verify pylint report output"""
testdir.makepyfile("import sys")
testdir.runpytest("--pylint", "--pylint-output-file=pylint.report")
output_file = os.path.join(testdir.tmpdir.strpath, "pylint.report")
assert os.path.isfile(output_file)
output_file = pathlib.Path(testdir.tmpdir.strpath) / "pylint.report"
assert output_file.is_file()

with open(output_file, "r", encoding="utf-8") as _file:
report = _file.read()
Expand All @@ -339,10 +339,10 @@ def test_output_file(testdir):
def test_output_file_makes_dirs(testdir):
"""Verify output works with folders properly."""
testdir.makepyfile("import sys")
output_path = os.path.join("reports", "pylint.report")
output_path = pathlib.Path("reports", "pylint.report")
testdir.runpytest("--pylint", f"--pylint-output-file={output_path}")
output_file = os.path.join(testdir.tmpdir.strpath, output_path)
assert os.path.isfile(output_file)
output_file = pathlib.Path(testdir.tmpdir.strpath) / output_path
assert output_file.is_file()
# Run again to make sure we don't crash trying to make a dir that exists
testdir.runpytest("--pylint", f"--pylint-output-file={output_path}")

Expand Down
8 changes: 6 additions & 2 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,18 @@
description="pytest plugin to check source code with pylint",
long_description=LONG_DESCRIPTION,
license="MIT",
version="0.20.0",
version="0.21.0",
author="Carson Gee",
author_email="x@carsongee.com",
url="https://github.com/carsongee/pytest-pylint",
packages=["pytest_pylint"],
entry_points={"pytest11": ["pylint = pytest_pylint.plugin"]},
python_requires=">=3.7",
install_requires=["pytest>=5.4,<8.0", "pylint>=2.3.0", "toml>=0.7.1"],
install_requires=[
"pytest>=7.0",
"pylint>=2.15.0",
"tomli>=1.1.0; python_version < '3.11'",
],
setup_requires=["pytest-runner"],
tests_require=["coverage", "flake8", "black", "isort"],
classifiers=[
Expand Down
14 changes: 5 additions & 9 deletions tox.ini
Original file line number Diff line number Diff line change
@@ -1,25 +1,21 @@
[tox]
envlist =
py3{8, 9}-pylint{26, 30}-pytest{54}
py3{8, 9, 10}-pylint{213, 214, 30}-pytest{71}
py3{8, 9, 10, 11}-pylint{215, latest, main}-pytest{71, latest}
py3{12}-pylint{latest, main}-pytest{71, latest}
py3{8, 9, 10}-pylint{215, 30}-pytest{7}
py3{8, 9, 10, 11}-pylint{215, latest, main}-pytest{7, latest, main}
py3{12}-pylint{latest, main}-pytest{7, latest, main}
coverage
qa
skip_missing_interpreters = true

[testenv]
usedevelop = true
deps =
pylint215: pylint~=2.15.10
pylint30: pylint~=3.0
pylint26: pylint~=2.6.0
pylint213: pylint~=2.13.9
pylint214: pylint~=2.14.5
pylint215: pylint~=2.15.0
pylintlatest: pylint
pylintmain: git+https://github.com/PyCQA/pylint.git@main#egg=pylint
pylintmain: git+https://github.com/PyCQA/astroid.git@main#egg=astroid
pytest7: pytest~=7.1.2
pytest7: pytest~=7.0.0
pytestlatest: pytest
pytestmain: git+https://github.com/pytest-dev/pytest.git@main#egg=pytest
coverage
Expand Down