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

Modernize Python tooling #36

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions .coveragerc

This file was deleted.

4 changes: 2 additions & 2 deletions .github/workflows/python-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@ jobs:
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install setuptools wheel twine
pip install hatch twine
- name: Build and publish
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
run: |
python setup.py sdist bdist_wheel
hatch build
twine upload dist/*
6 changes: 3 additions & 3 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,15 @@ jobs:
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -e .[tests]
pip install hatch

- name: Lint
run: |
pycodestyle --ignore=E252,W503,W504 spinach tests
hatch run pep8

- name: Test with pytest
run: |
pytest -v --cov=spinach tests/
hatch run ci

- name: Coveralls
uses: AndreMiras/coveralls-python-action@develop
Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# _version is generated by setuptools_scm and requests not to be under a VCS
spinach/_version.py

.hatch
.pyc
__pycache__

Expand Down
5 changes: 3 additions & 2 deletions doc/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
sys.path.insert(0, os.path.abspath('..'))

import spinach
from spinach import _version as spinach_version

# -- General configuration ------------------------------------------------

Expand Down Expand Up @@ -66,9 +67,9 @@
# built documents.
#
# The short X.Y version.
version = spinach.__version__
version = spinach_version.__version__
# The full version, including alpha/beta/rc tags.
release = spinach.__version__
release = spinach_version.__version__

# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
Expand Down
21 changes: 8 additions & 13 deletions doc/hacking/contributing.rst
Original file line number Diff line number Diff line change
Expand Up @@ -30,26 +30,22 @@ Python sources
The code base follows `pep8 <https://www.python.org/dev/peps/pep-0008/>`_ guidelines with lines
wrapping at the 79th character. You can verify that the code follows the conventions with::

$ pycodestyle --ignore=E252,W503,W504 spinach tests
$ hatch run pep8

Running tests is an invaluable help when adding a new feature or when refactoring. Try to add the
proper test cases in ``tests/`` together with your patch. The test suite can be run with pytest::
proper test cases in ``tests/`` together with your patch. Because the Redis broker tests require
a running Redis server, there is a convenience `pyproject.toml` that runs all the tests and pep8
checks for you after starting Redis in a container via docker-compose. Simply running::

$ pytest tests

Because the Redis broker tests require a running Redis server, there is also a convenience
`tox.ini` that runs all the tests and pep8 checks for you after starting Redis in a container via
docker-compose. Simply running::

$ tox
$ hatch run py3

will build a virtualenv, install Spinach and its dependencies into it, start the Redis server in
the container, and run tests and pycodestyle, tearing down the Redis server container when done.
the container, and run tests and pep8, tearing down the Redis server container when done.

Compatibility
-------------

Spinach runs on all versions of Python starting from 3.6. Tests are run via GitHub actions to
Spinach runs on all versions of Python starting from 3.8. Tests are run via GitHub actions to
ensure that.

Documentation sources
Expand All @@ -61,7 +57,6 @@ with `Sphinx <http://www.sphinx-doc.org/en/stable/index.html>`_.

If you modify the docs, make sure it builds without errors::

$ cd doc/
$ make html
$ hatch run docs:build html

The generated HTML pages should land in ``doc/_build/html``.
131 changes: 131 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
[build-system]
requires = ["hatchling", "hatch-vcs"]
build-backend = "hatchling.build"

[project]
name = "spinach"
dynamic = ["version"]
description = "Modern Redis task queue for Python 3"
readme = "README.rst"
license-files = { paths = ["LICENSE"] }
requires-python = ">=3.8.0,<4.0.0"
authors = [
{ name = "Nicolas Le Manchet", email = "[email protected]" },
]
classifiers = [
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"Topic :: Software Development :: Libraries",
"Topic :: System :: Distributed Computing",
"License :: OSI Approved :: BSD License",
"Natural Language :: English",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
]
keywords = ["task", "queue", "jobs", "redis"]
urls.Source = "https://github.com/NicolasLM/spinach"

dependencies = [
"redis",
"blinker"
]

[project.optional-dependencies]
tests = [
"pytest",
"pytest-cov",
"pytest-threadleak",
"ruff",
"flask",
"django"
]

[tool.hatch.version]
source = "vcs"

[tool.hatch.build.hooks.vcs]
version-file = "spinach/_version.py"

[tool.hatch.build.targets.sdist]
ignore-vcs = true
include = ["/spinach", "/tests"]

[tool.hatch.build.targets.wheel]
packages = ["spinach"]

[tool.hatch.build.targets.wheel.package-data]
"spinach.brokers.redis_scripts" = [
"deregister.lua",
"enqueue_job.lua",
"enqueue_jobs_from_dead_broker.lua",
"flush.lua",
"get_jobs_from_queue.lua",
"move_future_jobs.lua",
"register_periodic_tasks.lua",
"remove_job_from_running.lua",
"set_concurrency_keys.lua",
]

[tool.hatch.envs.default]
path = ".hatch"
features = ["tests"]

scripts.pep8 = ["ruff spinach tests"]

scripts.py3 = [
"docker-compose -f tests/docker-compose.yml up -d",
"pytest tests {args}",
"docker-compose -f tests/docker-compose.yml down",
]

# A minimalist pytest runner for Github to use
scripts.ci = ["pytest -v --cov=spinach tests {args}"]

[tool.hatch.envs.docs]
detatched = true
dependencies = [
"sphinx",
"blinker"
]
path = ".hatch"
scripts.build = ["cd doc && make {args}"]

[tool.ruff.lint]
select = ["B", "C9", "D", "E", "F", "S", "W"]
ignore = [
"B018", # Useless expression (seems to have false-positive bugs)
"S101", # Use of `assert` detected (conflicts with pytest)
"D10", # Missing docstring in public function / module / etc.
"D203", # 1 blank line required before class docstring
"D205", # 1 blank line required between summary line and description
"D213", # Multi-line docstring summary should start at the second line
"D40", # First line of docstring complaints
"D415", # First line should end with a period, question mark, or exclamation point
# TODO(nic): The remaining ignores point to actual issues in the code.
# Remove them and fix the issues later.
"B024",
"B027",
"B904",
"D204",
"F401",
"F841",
"S301",
"S311",
]
# Aggregating symbols into a convenient location for import is good practice
# for libraries, we don't care if they look unused
per-file-ignores = { "__init__.py" = ["F401"] }
mccabe.max-complexity = 13

[tool.coverage.run]
relative_files = true
include = ["spinach/*"]
omit = ["spinach/_version.py"]

[tool.pytest.ini_options]
threadleak = true
2 changes: 0 additions & 2 deletions pytest.ini

This file was deleted.

75 changes: 0 additions & 75 deletions setup.py

This file was deleted.

3 changes: 0 additions & 3 deletions spinach/__init__.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
from .brokers.memory import MemoryBroker
from .brokers.redis import RedisBroker
from .const import VERSION
from .engine import Engine
from .task import Tasks, Batch, RetryException, AbortException
from .worker import ThreadWorkers, AsyncioWorkers

__version__ = VERSION
2 changes: 0 additions & 2 deletions spinach/const.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
VERSION = '0.0.24'

DEFAULT_QUEUE = 'spinach'
DEFAULT_NAMESPACE = 'spinach'
DEFAULT_MAX_RETRIES = 0
Expand Down
28 changes: 0 additions & 28 deletions tox.ini

This file was deleted.