diff --git a/.gitignore b/.gitignore
index c208581..aff86fa 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,4 +6,4 @@ build
.cache
.pytest_cache
.tox
-.python-version
+uv.lock
diff --git a/Makefile b/Makefile
deleted file mode 100644
index bf1b7fe..0000000
--- a/Makefile
+++ /dev/null
@@ -1,26 +0,0 @@
-DEFAULT_GOAL := help
-
-.PHONY: help
-help:
- @echo "Available rules:"
- @echo ""
- @fgrep -h "##" Makefile | fgrep -v fgrep | sed 's/\(.*\):.*##/\1:/'
-
-.PHONY: clean
-clean: ## Clean build artifacts
- rm -rf build dist siggen.egg-info .tox .pytest-cache
- rm -rf docs/_build/*
- find siggen/ tests/ -name __pycache__ | xargs rm -rf
- find siggen/ tests/ -name '*.pyc' | xargs rm -rf
-
-.PHONY: format
-format: ## Format Python files
- tox exec -e py39-lint -- ruff format
-
-.PHONY: lint
-lint: ## Lint files
- tox -e py39-lint
-
-.PHONY: test
-test: ## Run tests
- tox
diff --git a/README.rst b/README.rst
index bdf991a..f3af60d 100644
--- a/README.rst
+++ b/README.rst
@@ -16,18 +16,30 @@ This is an extraction of the Socorro crash signature generation code.
Installing
==========
-socorro-siggen is available on `PyPI `_. You
-can install for library usage with::
+socorro-siggen is available on `PyPI `_.
+
+pip
+---
+
+Install library::
$ pip install siggen
-You can install for cli usage with::
+Install library with command-line interface::
$ pip install 'siggen[cli]'
-Install for hacking::
- $ pip install -r requirements-dev.txt
+uv
+--
+
+Install library::
+
+ $ uv tool install siggen
+
+Install library with command-line interface::
+
+ $ uv tool install 'siggen[cli]'
Versioning
@@ -37,9 +49,9 @@ siggen is an extraction of the signature generation code in Socorro. If you are
running signature generation on crash data and you want signatures to match
equivalent crash reports in Socorro, then you need to keep siggen up-to-date.
-siggen uses a calver scheme:
+siggen uses a calver scheme::
-MAJOR.MINOR.yyyymmdd
+ MAJOR.MINOR.yyyymmdd
* MAJOR: indicates incompatible API changes -- listed as "big changes" in
HISTORY.rst
@@ -295,3 +307,18 @@ That produces this output::
"proto_signature": "SomeFunc | SomeOtherFunc",
"signature": "SomeFunc"
}
+
+
+Development
+===========
+
+Requirements: Python, `uv __, `just
+`__
+
+Create a development environment::
+
+ $ just devenv
+
+View `just `__ recipes::
+
+ $ just
diff --git a/justfile b/justfile
new file mode 100644
index 0000000..f66018d
--- /dev/null
+++ b/justfile
@@ -0,0 +1,26 @@
+@_default:
+ just --list
+
+# Build a dev environment
+devenv:
+ uv sync --extra dev --refresh --upgrade
+
+# Clean development and build artifacts
+clean:
+ rm -rf .venv uv.lock
+ rm -rf build dist siggen.egg-info .tox .pytest-cache
+ rm -rf docs/_build/*
+ find siggen/ -name __pycache__ | xargs rm -rf
+ find siggen/ -name '*.pyc' | xargs rm -rf
+
+# Format files
+format: devenv
+ uv run tox exec -e py39-lint -- ruff format
+
+# Lint files
+lint: devenv
+ uv run tox -e py39-lint
+
+# Run tests and linting
+test *args: devenv
+ uv run tox {{args}}
diff --git a/pyproject.toml b/pyproject.toml
index af2cde8..21d0236 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -43,6 +43,7 @@ dev = [
"ruff",
"tox",
"tox-gh-actions",
+ "tox-uv",
"twine",
"wheel",
]
@@ -79,6 +80,7 @@ envlist =
py311
py312
py313
+uv_python_preference = only-managed
[gh-actions]
python =