diff --git a/CHANGES.md b/CHANGES.md index e3ca06dd..03365f73 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,8 @@ ## 2.2.0 +- Feature: Add optional `ruff check --fix` support to ruff-format target + [jensens, 2025-11-11] - Feature: Add `qa.ty` domain for Astral's ty type checker. ty is an extremely fast Python type checker (10-100x faster than mypy). Registers with both CHECK_TARGETS and TYPECHECK_TARGETS for fast feedback. diff --git a/Makefile b/Makefile index c703f83e..85670c22 100644 --- a/Makefile +++ b/Makefile @@ -109,6 +109,22 @@ MXMAKE?=-e . # Default: src RUFF_SRC?=src +# Enable ruff check --fix when running ruff-format. +# Set to `true` to enable automatic fixes. +# Default: false +RUFF_FIXES?=false + +# Enable unsafe fixes when RUFF_FIXES is enabled. +# Set to `true` to enable unsafe fixes. +# Default: false +RUFF_UNSAFE_FIXES?=false + +## qa.isort + +# Source folder to scan for Python files to run isort on. +# Default: src +ISORT_SRC?=src + ## docs.sphinx # Documentation source folder. @@ -338,6 +354,15 @@ ifeq ($(RUFF_SRC),src) RUFF_SRC:=$(PYTHON_PROJECT_PREFIX)src endif +# Build ruff check flags based on settings +ifeq ("$(RUFF_FIXES)","true") +ifeq ("$(RUFF_UNSAFE_FIXES)","true") +RUFF_FIX_FLAGS=--fix --unsafe-fixes +else +RUFF_FIX_FLAGS=--fix +endif +endif + RUFF_TARGET:=$(SENTINEL_FOLDER)/ruff.sentinel $(RUFF_TARGET): $(MXENV_TARGET) @echo "Install Ruff" @@ -353,6 +378,10 @@ ruff-check: $(RUFF_TARGET) ruff-format: $(RUFF_TARGET) @echo "Run ruff format" @ruff format $(RUFF_SRC) +ifeq ("$(RUFF_FIXES)","true") + @echo "Run ruff check $(RUFF_FIX_FLAGS)" + @ruff check $(RUFF_FIX_FLAGS) $(RUFF_SRC) +endif .PHONY: ruff-dirty ruff-dirty: diff --git a/src/mxmake/tests/test_topics.py b/src/mxmake/tests/test_topics.py index 92e6d2f1..9565de3c 100644 --- a/src/mxmake/tests/test_topics.py +++ b/src/mxmake/tests/test_topics.py @@ -90,6 +90,28 @@ def test_get_domain(self): domain = topics.get_domain("core.mxenv") self.assertEqual(domain.fqn, "core.mxenv") + def test_ruff_domain_settings(self): + """Test ruff domain has correct settings for check --fix feature.""" + domain = topics.get_domain("qa.ruff") + self.assertEqual(domain.fqn, "qa.ruff") + + settings = {s.name: s for s in domain.settings} + + # Verify RUFF_FIXES setting + self.assertIn("RUFF_FIXES", settings) + ruff_fixes = settings["RUFF_FIXES"] + self.assertEqual(ruff_fixes.default, "false") + self.assertIn("ruff check --fix", ruff_fixes.description) + + # Verify RUFF_UNSAFE_FIXES setting + self.assertIn("RUFF_UNSAFE_FIXES", settings) + ruff_unsafe = settings["RUFF_UNSAFE_FIXES"] + self.assertEqual(ruff_unsafe.default, "false") + self.assertIn("unsafe fixes", ruff_unsafe.description) + + # Verify RUFF_SRC setting still exists + self.assertIn("RUFF_SRC", settings) + @testing.temp_directory def test_Domain(self, tmpdir): domain_path = tmpdir / "domain.mk" diff --git a/src/mxmake/topics/qa/ruff.mk b/src/mxmake/topics/qa/ruff.mk index adda7626..2b53c107 100644 --- a/src/mxmake/topics/qa/ruff.mk +++ b/src/mxmake/topics/qa/ruff.mk @@ -6,10 +6,23 @@ #:[target.ruff] #:description = Run ruff. #: +#:[target.ruff-format] +#:description = Run ruff format. Optionally apply fixes with RUFF_FIXES=true. +#: #:[setting.RUFF_SRC] #:description = Source folder to scan for Python files to run ruff on. #:default = src #: +#:[setting.RUFF_FIXES] +#:description = Enable ruff check --fix when running ruff-format. +#: Set to `true` to enable automatic fixes. +#:default = false +#: +#:[setting.RUFF_UNSAFE_FIXES] +#:description = Enable unsafe fixes when RUFF_FIXES is enabled. +#: Set to `true` to enable unsafe fixes. +#:default = false +#: #:[target.ruff-dirty] #:description = Marks ruff dirty #: @@ -25,6 +38,15 @@ ifeq ($(RUFF_SRC),src) RUFF_SRC:=$(PYTHON_PROJECT_PREFIX)src endif +# Build ruff check flags based on settings +ifeq ("$(RUFF_FIXES)","true") +ifeq ("$(RUFF_UNSAFE_FIXES)","true") +RUFF_FIX_FLAGS=--fix --unsafe-fixes +else +RUFF_FIX_FLAGS=--fix +endif +endif + RUFF_TARGET:=$(SENTINEL_FOLDER)/ruff.sentinel $(RUFF_TARGET): $(MXENV_TARGET) @echo "Install Ruff" @@ -40,6 +62,10 @@ ruff-check: $(RUFF_TARGET) ruff-format: $(RUFF_TARGET) @echo "Run ruff format" @ruff format $(RUFF_SRC) +ifeq ("$(RUFF_FIXES)","true") + @echo "Run ruff check $(RUFF_FIX_FLAGS)" + @ruff check $(RUFF_FIX_FLAGS) $(RUFF_SRC) +endif .PHONY: ruff-dirty ruff-dirty: