Introduce Ruff github CI with some basic linter rules

And also to help catching syntax errors on older Python versions.
This commit is contained in:
Andrej
2025-05-28 17:31:10 +05:00
parent 7cde9629f8
commit ea7ced738a
5 changed files with 79 additions and 4 deletions
+14 -3
View File
@@ -23,6 +23,8 @@ jobs:
run: | run: |
python3 -m pip install --upgrade pip python3 -m pip install --upgrade pip
python3 -m pip install 'black>=24.10.0' python3 -m pip install 'black>=24.10.0'
curl -LsSf https://astral.sh/uv/install.sh | sh
uv tool install ruff
# black doesn't catch all syntax errors, so we check them explicitly. # black doesn't catch all syntax errors, so we check them explicitly.
- name: Check syntax errors - name: Check syntax errors
@@ -35,18 +37,27 @@ jobs:
continue-on-error: true continue-on-error: true
- name: Black formatter - name: Black formatter
id: linting id: black
run: | run: |
python3 -m black --diff --check . python3 -m black --diff --check .
continue-on-error: true continue-on-error: true
- name: Ruff check
id: ruff
run: |
uvx ruff check
continue-on-error: true
- name: Final check - name: Final check
run: | run: |
ERROR=0 ERROR=0
if [ "${{ steps.syntax-errors.outcome }}" != "success" ]; then if [ "${{ steps.syntax-errors.outcome }}" != "success" ]; then
echo "::error::Syntax errors check failed, see 'syntax-errors' step for the details." && ERROR=1 echo "::error::Syntax errors check failed, see 'syntax-errors' step for the details." && ERROR=1
fi fi
if [ "${{ steps.linting.outcome }}" != "success" ]; then if [ "${{ steps.black.outcome }}" != "success" ]; then
echo "::error::Black formatting check failed, see 'linting' step for the details." && ERROR=1 echo "::error::Black formatting check failed, see 'black' step for the details." && ERROR=1
fi
if [ "${{ steps.ruff.outcome }}" != "success" ]; then
echo "::error::Ruff check failed, see 'ruff' step for the details." && ERROR=1
fi fi
exit $ERROR exit $ERROR
+43
View File
@@ -38,3 +38,46 @@ disableBytesTypePromotions = true
reportUnnecessaryTypeIgnoreComment = true reportUnnecessaryTypeIgnoreComment = true
# Just to add a quick insert of `# pyright: ignore[xxx]` comments in Pylance. # Just to add a quick insert of `# pyright: ignore[xxx]` comments in Pylance.
enableTypeIgnoreComments = false enableTypeIgnoreComments = false
# Define here general ruff settings,
# then they will be inherited projects .toml files.
# This allows using assuming different Python version for different projects.
[tool.ruff]
exclude = [
# Submodules.
"src/ifcopenshell-python/ifcopenshell/express",
"src/ifcopenshell-python/ifcopenshell/mvd",
"src/ifcopenshell-python/ifcopenshell/simple_spf",
"src/svgfill",
#
# Unformatted.
"src/exterior-shell-extractor",
# Incompatible with linter.
"src/ifc2ca/templates",
]
[tool.ruff.lint]
select = [
# Default Ruff rules.
# "E4", # imports
# "E7", # statements
"E9", # io errors
# "F", # pyflakes
#
"FA", # future annotations
"UP", # pyupgrade
]
ignore = [
"FA100", # Conflicts with Blender using annotations for props definitions.
# Maybe will enable later:
"UP006", # deprecated symbols
"UP007", # Optional to X | Y
"UP015", # Unnecessary mode argument
"UP028", # yield for -> yield from
"UP030", # implicit references for positional format fields
"UP031", # Replace % with .format
"UP032", # Replace .format with f-string
"UP035", # List -> list
# Deprecated Ruff rules.
"UP038", # Use X | Y in isinstance
]
@@ -2,7 +2,7 @@ Code style
============ ============
Black code formatter Code formatters
------------------------------- -------------------------------
For Python code formatting, we use `Black code formatter <https://pypi.org/project/black/>`__, For Python code formatting, we use `Black code formatter <https://pypi.org/project/black/>`__,
black settings are stored in the repository's pyproject.toml. black settings are stored in the repository's pyproject.toml.
@@ -19,3 +19,17 @@ We have GitHub workflow `ci-black-formatting` to maintain black formatting acros
# Format only some specific file. # Format only some specific file.
black src/bonsai/bonsai/bim/module/qto/operator.py black src/bonsai/bonsai/bim/module/qto/operator.py
There is also `ruff` with some basic linter rules (checked automatically by the same Github workflow).
Which also helps maintaining consistency across the code base
and ensure new Python syntax doesn't break code on older Python versions.
``ruff`` can be installed using ``pip install ruff`` and files can be formatted with the following example commands:
.. code-block:: bash
# Check issues for the entire repository.
ruff check
# Apply some automatic fixes, if available.
ruff check --fix
# Check only some specific file.
ruff src/bonsai/bonsai/bim/module/qto/operator.py
+4
View File
@@ -13,6 +13,7 @@ keywords = ["IFC", "Blender", "BIM"]
classifiers = [ classifiers = [
"Programming Language :: Python :: 3", "Programming Language :: Python :: 3",
] ]
requires-python = ">=3.11"
dependencies = [ dependencies = [
"ifcopenshell", "ifcopenshell",
] ]
@@ -28,3 +29,6 @@ exclude = ["test*"]
[tool.setuptools.package-data] [tool.setuptools.package-data]
"*" = ["*.*", "libs/desktop/bonsai", "libs/bin/ifcmerge"] "*" = ["*.*", "libs/desktop/bonsai", "libs/bin/ifcmerge"]
[tool.ruff]
extend = "../../pyproject.toml"
+3
View File
@@ -36,3 +36,6 @@ include = ["ifcopenshell*"]
[tool.setuptools.package-data] [tool.setuptools.package-data]
"*" = ["*.*"] "*" = ["*.*"]
[tool.ruff]
extend = "../../pyproject.toml"