Skip to content

Commit

Permalink
Update supported python versions; use native namespace package; lint
Browse files Browse the repository at this point in the history
  • Loading branch information
jamadden committed Nov 12, 2024
1 parent 0c19f72 commit 3f0032f
Show file tree
Hide file tree
Showing 25 changed files with 451 additions and 203 deletions.
2 changes: 2 additions & 0 deletions .coveragerc
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,5 @@ exclude_lines =
raise AssertionError
Python 2
if __name__ == .__main__.:
precision = 2
fail_under = 100
13 changes: 13 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Keep GitHub Actions up to date with GitHub's Dependabot...
# https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot
# https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#package-ecosystem
version: 2
updates:
- package-ecosystem: github-actions
directory: /
groups:
github-actions:
patterns:
- "*" # Group all Actions updates into a single larger pull request
schedule:
interval: monthly
62 changes: 26 additions & 36 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,60 +5,50 @@ on: [push, pull_request]
env:
PYTHONHASHSEED: 1042466059
ZOPE_INTERFACE_STRICT_IRO: 1
# The libuv loop has much better behaved stat
# watchers (they respond faster).
GEVENT_LOOP: libuv
PYTHONDEVMODE: 1
PYTHONUNBUFFERED: 1
PYTHONFAULTHANDLER: 1


jobs:
test:
strategy:
matrix:
python-version: [2.7, pypy2, pypy3, 3.6, 3.7, 3.8, 3.9]
python-version:
- "pypy-3.10"
- "3.11"
- "3.12"
- "3.13"
extras:
- "[test,docs]"
# include:
# - python-version: "3.13"
# extras: "[test,docs,gevent,pyramid]"

runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v2
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Pip cache
uses: actions/cache@v2
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ matrix.python-version }}-${{hashFiles('setup.*') }}
- name: Install system dependencies (ubuntu)
if: startsWith(runner.os, 'Linux')
# for building lxml, typically on PyPy
run: |
sudo apt-get install -y libxml2-dev libxslt-dev
cache: 'pip'
cache-dependency-path: 'setup.py'
- name: Install dependencies
# Fudge needs 2to3 at install time, which went away in
# setuptools 58.
run: |
python -m pip install -U pip "setuptools < 58" wheel
python -m pip install -U pip setuptools wheel
python -m pip install -U coverage
python -m pip install -U -e ".[test,docs]"
python -m pip install -q -U 'faulthandler; python_version == "2.7" and platform_python_implementation == "CPython"'
- name: Test With Coverage
if: matrix.python-version != 'pypy2' && matrix.python-version != 'pypy3'
python -m pip install -v -U -e ".${{ matrix.extras }}"
- name: Test
run: |
coverage run -m zope.testrunner --test-path=src --auto-color -vvv
python -m coverage run -m zope.testrunner --test-path=src --auto-color --auto-progress
coverage run -a -m sphinx -b doctest -d docs/_build/doctrees docs docs/_build/doctests
coverage report -i --fail-under=100
- name: Test Without Coverage
if: startsWith(matrix.python-version, 'pypy')
coverage combine || true
coverage report -i || true
- name: Lint
if: matrix.python-version == '3.12'
run: |
python -m zope.testrunner --test-path=src --auto-color -vvv
python -m sphinx -b doctest -d docs/_build/doctrees docs docs/_build/doctests
python -m pip install -U pylint
pylint src
- name: Submit to Coveralls
# This is a container action, which only runs on Linux.
if: matrix.python-version != 'pypy2' && matrix.python-version != 'pypy3'
uses: AndreMiras/coveralls-python-action@develop
uses: coverallsapp/github-action@v2
with:
parallel: true

Expand All @@ -67,6 +57,6 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Coveralls Finished
uses: AndreMiras/coveralls-python-action@develop
uses: coverallsapp/github-action@v2
with:
parallel-finished: true
220 changes: 220 additions & 0 deletions .pylintrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,220 @@
[MASTER]
load-plugins=pylint.extensions.bad_builtin,
pylint.extensions.check_elif,
pylint.extensions.code_style,
pylint.extensions.dict_init_mutate,
pylint.extensions.docstyle,
pylint.extensions.dunder,
pylint.extensions.comparison_placement,
pylint.extensions.confusing_elif,
pylint.extensions.for_any_all,
pylint.extensions.consider_refactoring_into_while_condition,
pylint.extensions.mccabe,
pylint.extensions.eq_without_hash,
pylint.extensions.redefined_variable_type,
pylint.extensions.overlapping_exceptions,
pylint.extensions.docparams,
pylint.extensions.private_import,
pylint.extensions.set_membership,
pylint.extensions.typing,

# magic_value wants you to not use arbitrary strings and numbers
# inline in the code. But it's overzealous and has way too many false
# positives. Trust people to do the most readable thing.
# pylint.extensions.magic_value

# Empty comment would be good, except it detects blank lines within
# a single comment block.
#
# Those are often used to separate paragraphs, like here.
# pylint.extensions.empty_comment,

# consider_ternary_expression is a nice check, but is also overzealous.
# Trust the human to do the readable thing.
# pylint.extensions.consider_ternary_expression,

# redefined_loop_name tends to catch us with things like
# for name in (a, b, c): name = name + '_column' ...
# pylint.extensions.redefined_loop_name,

# This wants you to turn ``x in (1, 2)`` into ``x in {1, 2}``.
# They both result in the LOAD_CONST bytecode, one a tuple one a
# frozenset. In theory a set lookup using hashing is faster than
# a linear scan of a tuple; but if the tuple is small, it can often
# actually be faster to scan the tuple.
# pylint.extensions.set_membership,

# Fix zope.cachedescriptors.property.Lazy; the property-classes doesn't seem to
# do anything.
# https://stackoverflow.com/questions/51160955/pylint-how-to-specify-a-self-defined-property-decorator-with-property-classes
# For releases prior to 2.14.2, this needs to be a one-line, quoted string. After that,
# a multi-line string.
# - Make zope.cachedescriptors.property.Lazy look like a property;
# fixes pylint thinking it is a method.
# - Run in Pure Python mode (ignore C extensions that respect this);
# fixes some issues with zope.interface, like IFoo.providedby(ob)
# claiming not to have the right number of parameters...except no, it does not.
init-hook =
import astroid.bases
astroid.bases.POSSIBLE_PROPERTIES.add('Lazy')
astroid.bases.POSSIBLE_PROPERTIES.add('LazyOnClass')
astroid.bases.POSSIBLE_PROPERTIES.add('readproperty')
astroid.bases.POSSIBLE_PROPERTIES.add('non_overridable')
import os
os.environ['PURE_PYTHON'] = ("1")
# Ending on a quoted string
# breaks pylint 2.14.5 (it strips the trailing quote. This is
# probably because it tries to handle one-line quoted strings as well as multi-blocks).
# The parens around it fix the issue.


[MESSAGES CONTROL]

# Disable the message, report, category or checker with the given id(s). You
# can either give multiple identifier separated by comma (,) or put this option
# multiple time (only on the command line, not in the configuration file where
# it should appear only once).
# NOTE: comments must go ABOVE the statement. In Python 2, mixing in
# comments disables all directives that follow, while in Python 3, putting
# comments at the end of the line does the same thing (though Py3 supports
# mixing)


# invalid-name, ; We get lots of these, especially in scripts. should fix many of them
# protected-access, ; We have many cases of this; legit ones need to be examinid and commented, then this removed
# no-self-use, ; common in superclasses with extension points
# too-few-public-methods, ; Exception and marker classes get tagged with this
# exec-used, ; should tag individual instances with this, there are some but not too many
# global-statement, ; should tag individual instances
# multiple-statements, ; "from gevent import monkey; monkey.patch_all()"
# locally-disabled, ; yes, we know we're doing this. don't replace one warning with another
# cyclic-import, ; most of these are deferred imports
# too-many-arguments, ; these are almost always because that's what the stdlib does
# redefined-builtin, ; likewise: these tend to be keyword arguments like len= in the stdlib
# undefined-all-variable, ; XXX: This crashes with pylint 1.5.4 on Travis (but not locally on Py2/3
# ; or landscape.io on Py3). The file causing the problem is unclear. UPDATE: identified and disabled
# that file.
# see https://github.com/PyCQA/pylint/issues/846
# useless-suppression: the only way to avoid repeating it for specific statements everywhere that we
# do Py2/Py3 stuff is to put it here. Sadly this means that we might get better but not realize it.
# duplicate-code: Yeah, the compatibility ssl modules are much the same
# In pylint 1.8.0, inconsistent-return-statements are created for the wrong reasons.
# This code raises it, even though there is only one return (the implicit ``return None`` is presumably
# what triggers it):
# def foo():
# if baz:
# return 1
# In Pylint 2dev1, needed for Python 3.7, we get spurious "useless return" errors:
# @property
# def foo(self):
# return None # generates useless-return
# Pylint 2.4 adds import-outside-toplevel. But we do that a lot to defer imports because of patching.
# Pylint 2.4 adds self-assigning-variable. But we do *that* to avoid unused-import when we
# "export" the variable and dont have a __all__.
# Pylint 2.6+ adds some python-3-only things that dont apply: raise-missing-from, super-with-arguments, consider-using-f-string, redundant-u-string-prefix
# cyclic import is added because it pylint is spuriously detecting that
# consider-using-assignment-expr wants you to transform things like:
# foo = get_foo()
# if foo: ...
#
# Into ``if (foo := get_foo()):``
# But there are a *lot* of those. Trust people to do the right, most
# readable, thing
#
# docstring-first-line-empty: That's actually our standard, based on Django.
# XXX: unclear on the docstring warnings, missing-type-doc, missing-param-doc,
# differing-param-doc, differing-type-doc (are the last two replacements for the first two?)
#
# They should be addressed, in general they are a good thing, but sometimes they are
# unnecessary.
disable=wrong-import-position,
wrong-import-order,
missing-docstring,
ungrouped-imports,
invalid-name,
too-few-public-methods,
global-statement,
locally-disabled,
too-many-arguments,
useless-suppression,
duplicate-code,
useless-object-inheritance,
import-outside-toplevel,
self-assigning-variable,
consider-using-f-string,
consider-using-assignment-expr,
use-dict-literal,
missing-type-doc,
missing-param-doc,
differing-param-doc,
differing-type-doc,
compare-to-zero,
docstring-first-line-empty,

enable=consider-using-augmented-assign

[FORMAT]
max-line-length=100
max-module-lines=1100

[MISCELLANEOUS]
# List of note tags to take in consideration, separated by a comma.
#notes=FIXME,XXX,TODO
# Disable that, we don't want them to fail the lint CI job.
notes=

[VARIABLES]

dummy-variables-rgx=_.*
init-import=true

[TYPECHECK]

# List of members which are set dynamically and missed by pylint inference
# system, and so shouldnt trigger E1101 when accessed. Python regular
# expressions are accepted.
generated-members=REQUEST,acl_users,aq_parent,providedBy


# Tells whether missing members accessed in mixin class should be ignored. A
# mixin class is detected if its name ends with "mixin" (case insensitive).
# XXX: deprecated in 2.14; replaced with ignored-checks-for-mixins.
# The defaults for that value seem to be what we want
#ignore-mixin-members=yes

# List of classes names for which member attributes should not be checked
# (useful for classes with attributes dynamically set). This can work
# with qualified names.
#ignored-classes=SSLContext, SSLSocket, greenlet, Greenlet, parent, dead


# List of module names for which member attributes should not be checked
# (useful for modules/projects where namespaces are manipulated during runtime
# and thus existing member attributes cannot be deduced by static analysis. It
# supports qualified module names, as well as Unix pattern matching.
#ignored-modules=gevent._corecffi,gevent.os,os,greenlet,threading,gevent.libev.corecffi,gevent.socket,gevent.core,gevent.testing.support
ignored-modules=psycopg2.errors

[DESIGN]
max-attributes=12
max-parents=10
# Bump complexity up one.
max-complexity=11

[BASIC]
# Prospector turns ot unsafe-load-any-extension by default, but
# pylint leaves it off. This is the proximal cause of the
# undefined-all-variable crash.
unsafe-load-any-extension = yes
# This does not seem to work, hence the init-hook
property-classes=zope.cachedescriptors.property.Lazy,zope.cachedescriptors.property.Cached

[CLASSES]
# List of interface methods to ignore, separated by a comma. This is used for
# instance to not check methods defines in Zope's Interface base class.



# Local Variables:
# mode: conf
# End:
37 changes: 37 additions & 0 deletions .readthedocs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# .readthedocs.yml
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details

# Some things can only be configured on the RTD dashboard.
# Those that we may have changed from the default include:

# Analytics code:
# Show Version Warning: False
# Single Version: True

# Required
version: 2

# Build documentation in the docs/ directory with Sphinx
sphinx:
builder: html
configuration: docs/conf.py

# Set the version of Python and other tools you might need
build:
os: ubuntu-22.04
tools:
python: "3.11"
# You can also specify other tool versions:
# nodejs: "19"
# rust: "1.64"
# golang: "1.19"

# Set the version of Python and requirements required to build your
# docs
python:
install:
- method: pip
path: .
extra_requirements:
- docs
5 changes: 3 additions & 2 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@
Changes
=========

0.0.1a3 (unreleased)
1.0.0 (unreleased)
====================

- Nothing changed yet.
- Drop support for Python < 3.10.
- Use native namespace packages.


0.0.1a2 (2021-09-07)
Expand Down
Empty file removed INSTALL
Empty file.
3 changes: 0 additions & 3 deletions Jenkinsfile

This file was deleted.

Empty file removed TODO
Empty file.
7 changes: 0 additions & 7 deletions babel.cfg

This file was deleted.

Loading

0 comments on commit 3f0032f

Please sign in to comment.