Skip to content

Commit

Permalink
Merge pull request #188 from carsongee/rc/0.21.0
Browse files Browse the repository at this point in the history
Release 0.21.0
  • Loading branch information
carsongee committed Oct 6, 2023
2 parents db22192 + ea70b07 commit 229b64f
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 39 deletions.
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

0 comments on commit 229b64f

Please sign in to comment.