mirror of
https://github.com/django-polymorphic/django-polymorphic.git
synced 2025-12-06 01:13:55 +03:00
242 lines
6.5 KiB
Makefile
242 lines
6.5 KiB
Makefile
set windows-shell := ["powershell.exe", "-NoLogo", "-Command"]
|
|
set unstable := true
|
|
set script-interpreter := ['uv', 'run', '--script']
|
|
|
|
export PYTHONPATH := source_directory()
|
|
|
|
[private]
|
|
default:
|
|
@just --list --list-submodules
|
|
|
|
# run the django admin
|
|
[script]
|
|
manage *COMMAND:
|
|
import os
|
|
import sys
|
|
from django.core import management
|
|
sys.path.append(os.getcwd())
|
|
os.environ["DJANGO_SETTINGS_MODULE"] = "polymorphic.tests.settings"
|
|
os.environ["SQLITE_DATABASES"] = "test1.db,test2.db"
|
|
management.execute_from_command_line(sys.argv + "{{ COMMAND }}".split(" "))
|
|
|
|
# install the uv package manager
|
|
[linux]
|
|
[macos]
|
|
install_uv:
|
|
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
|
|
# install the uv package manager
|
|
[windows]
|
|
install_uv:
|
|
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
|
|
|
|
# setup the venv, pre-commit hooks and playwright dependencies
|
|
setup python="python":
|
|
uv venv -p {{ python }}
|
|
@just run pre-commit install
|
|
@just run playwright install
|
|
|
|
# install git pre-commit hooks
|
|
install-precommit:
|
|
@just run pre-commit install
|
|
|
|
# update and install development dependencies
|
|
install *OPTS:
|
|
uv sync {{ OPTS }}
|
|
@just run pre-commit install
|
|
|
|
# install documentation dependencies
|
|
install-docs:
|
|
uv sync --group docs --all-extras
|
|
|
|
# run static type checking
|
|
check-types:
|
|
#TODO @just run mypy src/polymorphic
|
|
|
|
# run package checks
|
|
check-package:
|
|
@just run pip check
|
|
|
|
# remove doc build artifacts-
|
|
[script]
|
|
clean-docs:
|
|
import shutil
|
|
shutil.rmtree('./docs/_build', ignore_errors=True)
|
|
|
|
# remove the virtual environment
|
|
[script]
|
|
clean-env:
|
|
import shutil
|
|
import sys
|
|
shutil.rmtree(".venv", ignore_errors=True)
|
|
|
|
# remove all git ignored files
|
|
clean-git-ignored:
|
|
git clean -fdX
|
|
|
|
# remove all non repository artifacts
|
|
clean: clean-docs clean-env clean-git-ignored
|
|
|
|
# build html documentation
|
|
build-docs-html: install-docs
|
|
@just run sphinx-build --fresh-env --builder html --doctree-dir ./docs/_build/doctrees ./docs/ ./docs/_build/html
|
|
|
|
# build pdf documentation
|
|
build-docs-pdf: install-docs
|
|
@just run sphinx-build --fresh-env --builder latex --doctree-dir ./docs/_build/doctrees ./docs/ ./docs/_build/pdf
|
|
cd docs/_build/pdf && make
|
|
|
|
# build the docs
|
|
build-docs: build-docs-html
|
|
|
|
# build docs and package
|
|
build: build-docs-html
|
|
@just manage compilemessages --ignore ".venv/*"
|
|
uv build
|
|
|
|
# open the html documentation
|
|
[script]
|
|
open-docs:
|
|
import os
|
|
import webbrowser
|
|
webbrowser.open(f'file://{os.getcwd()}/docs/_build/html/index.html')
|
|
|
|
# build and open the documentation
|
|
docs: build-docs-html open-docs
|
|
|
|
# serve the documentation, with auto-reload
|
|
docs-live: install-docs
|
|
@just run sphinx-autobuild docs docs/_build --open-browser --watch src --port 8000 --delay 1
|
|
|
|
_link_check:
|
|
-uv run sphinx-build -b linkcheck -Q -D linkcheck_timeout=10 ./docs/ ./docs/_build
|
|
|
|
# check the documentation links for broken links
|
|
[script]
|
|
check-docs-links: _link_check
|
|
import os
|
|
import sys
|
|
import json
|
|
from pathlib import Path
|
|
# The json output isn't valid, so we have to fix it before we can process.
|
|
data = json.loads(f"[{','.join((Path(os.getcwd()) / 'docs/_build/output.json').read_text().splitlines())}]")
|
|
broken_links = [link for link in data if link["status"] not in {"working", "redirected", "unchecked", "ignored"}]
|
|
if broken_links:
|
|
for link in broken_links:
|
|
print(f"[{link['status']}] {link['filename']}:{link['lineno']} -> {link['uri']}", file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
# lint the documentation
|
|
check-docs:
|
|
@just run doc8 --ignore-path ./docs/_build --max-line-length 100 -q ./docs
|
|
|
|
# lint the code
|
|
check-lint:
|
|
@just run ruff check --select I
|
|
@just run ruff check
|
|
|
|
# check if the code needs formatting
|
|
check-format:
|
|
@just run ruff format --check
|
|
|
|
# check that the readme renders
|
|
check-readme:
|
|
@just run -m readme_renderer ./README.md -o /tmp/README.html
|
|
|
|
_check-readme-quiet:
|
|
@just --quiet check-readme
|
|
|
|
# sort the python imports
|
|
sort-imports:
|
|
@just run ruff check --fix --select I
|
|
|
|
# format the code and sort imports
|
|
format: sort-imports
|
|
just --fmt --unstable
|
|
@just run ruff format
|
|
|
|
# sort the imports and fix linting issues
|
|
lint: sort-imports
|
|
@just run ruff check --fix
|
|
|
|
# fix formatting, linting issues and import sorting
|
|
fix: lint format
|
|
|
|
# run all static checks
|
|
check: check-lint check-format check-types check-package check-docs check-docs-links _check-readme-quiet
|
|
|
|
[script]
|
|
_lock-python:
|
|
import tomlkit
|
|
import sys
|
|
f='pyproject.toml'
|
|
d=tomlkit.parse(open(f).read())
|
|
d['project']['requires-python']='=={}'.format(sys.version.split()[0])
|
|
open(f,'w').write(tomlkit.dumps(d))
|
|
|
|
# lock to specific python and versions of given dependencies
|
|
test-lock +PACKAGES: _lock-python
|
|
uv add {{ PACKAGES }}
|
|
|
|
# run tests
|
|
test *TESTS:
|
|
@just run pytest --cov-append {{ TESTS }}
|
|
|
|
test-db DB_CLIENT="dev" *TESTS:
|
|
# No Optional Dependency Unit Tests
|
|
# todo clean this up, rerunning a lot of tests
|
|
uv sync --group {{ DB_CLIENT }}
|
|
@just run pytest --cov-append {{ TESTS }}
|
|
|
|
# run the pre-commit checks
|
|
precommit:
|
|
@just run pre-commit
|
|
|
|
# generate the test coverage report
|
|
coverage:
|
|
@just run coverage combine --keep *.coverage
|
|
@just run coverage report
|
|
@just run coverage xml
|
|
|
|
[script]
|
|
fetch-refs LIB: install-docs
|
|
import os
|
|
from pathlib import Path
|
|
import logging as _logging
|
|
import sys
|
|
import runpy
|
|
from sphinx.ext.intersphinx import inspect_main
|
|
_logging.basicConfig()
|
|
|
|
libs = runpy.run_path(Path(os.getcwd()) / "docs/conf.py").get("intersphinx_mapping")
|
|
url = libs.get("{{ LIB }}", None)
|
|
if not url:
|
|
sys.exit(f"Unrecognized {{ LIB }}, must be one of: {', '.join(libs.keys())}")
|
|
if url[1] is None:
|
|
url = f"{url[0].rstrip('/')}/objects.inv"
|
|
else:
|
|
url = url[1]
|
|
|
|
raise SystemExit(inspect_main([url]))
|
|
|
|
# run the command in the virtual environment
|
|
run +ARGS:
|
|
uv run {{ ARGS }}
|
|
|
|
# validate the given version string against the lib version
|
|
[script]
|
|
validate_version VERSION:
|
|
import re
|
|
import tomllib
|
|
import polymorphic
|
|
version = re.match(r"v?(\d+[.]\d+[.]\w+)", "{{ VERSION }}").groups()[0]
|
|
assert version == tomllib.load(open('pyproject.toml', 'rb'))['project']['version']
|
|
assert version == polymorphic.__version__
|
|
print(version)
|
|
|
|
# issue a release for the given semver string (e.g. 2.1.0)
|
|
release VERSION:
|
|
@just validate_version v{{ VERSION }}
|
|
git tag -s v{{ VERSION }} -m "{{ VERSION }} Release"
|
|
git push upstream v{{ VERSION }}
|