feat: migrate from pylint/black to ruff (#64)

* feat: migrate from pylint/black to ruff
Linked Epic: overhangio/tutor#1251

Some new rules that have been added are:

I: sort imports
N: check for pep8-naming standards
W292: check for missing extra line at EOF

Some of our lines, particularly in config break the 88 character line length limit. For that, we add a # noqa: E501 to let ruff know to ignore the rule for that line

* test: python package distribution build when running make test
Pushing to pypi would occasionally fail because of breaking distribution build.
We verify the build in the github CI now so that we can mitigate those errors later on.

* fix: install ruff instead of pylint/black as optional dev dependency
This commit is contained in:
Abdul-Muqadim-Arbisoft 2025-09-07 19:44:37 +05:00
parent cfee151f6b
commit a539ca2693
5 changed files with 38 additions and 13 deletions

View File

@ -18,5 +18,5 @@ def load_about() -> dict[str, str]:
with open( with open(
os.path.join(HERE, "tutorandroid", "__about__.py"), "rt", encoding="utf-8" os.path.join(HERE, "tutorandroid", "__about__.py"), "rt", encoding="utf-8"
) as f: ) as f:
exec(f.read(), about) # pylint: disable=exec-used exec(f.read(), about)
return about return about

View File

@ -1,25 +1,30 @@
.DEFAULT_GOAL := help .DEFAULT_GOAL := help
.PHONY: docs .PHONY: docs
SRC_DIRS = ./tutorandroid SRC_DIRS = ./tutorandroid
BLACK_OPTS = --exclude templates ${SRC_DIRS}
# Warning: These checks are not necessarily run on every PR. # Warning: These checks are not necessarily run on every PR.
test: test-lint test-types test-format # Run some static checks. test: test-lint test-types test-format test-pythonpackage # Run some static checks.
test-format: ## Run code formatting tests test-format: ## Run code formatting tests
black --check --diff $(BLACK_OPTS) ruff format --check --diff ${SRC_DIRS}
test-lint: ## Run code linting tests test-lint: ## Run code linting tests
pylint --errors-only --enable=unused-import,unused-argument --ignore=templates --ignore=docs/_ext ${SRC_DIRS} ruff check ${SRC_DIRS}
test-types: ## Run type checks. test-types: ## Run type checks.
mypy --exclude=templates --ignore-missing-imports --implicit-reexport --strict ${SRC_DIRS} mypy --exclude=templates --ignore-missing-imports --implicit-reexport --strict ${SRC_DIRS}
format: ## Format code automatically build-pythonpackage: ## Build the "tutor-android" python package for upload to pypi
black $(BLACK_OPTS) python -m build --sdist
isort: ## Sort imports. This target is not mandatory because the output may be incompatible with black formatting. Provided for convenience purposes. test-pythonpackage: build-pythonpackage ## Test that package can be uploaded to pypi
isort --skip=templates ${SRC_DIRS} twine check dist/tutor_android-$(shell make version).tar.gz
format: ## Format code automatically
ruff format ${SRC_DIRS}
fix-lint: ## Fix lint errors automatically
ruff check --fix ${SRC_DIRS}
changelog-entry: ## Create a new changelog entry. changelog-entry: ## Create a new changelog entry.
scriv create scriv create
@ -27,6 +32,9 @@ changelog-entry: ## Create a new changelog entry.
changelog: ## Collect changelog entries in the CHANGELOG.md file. changelog: ## Collect changelog entries in the CHANGELOG.md file.
scriv collect scriv collect
version: ## Print the current tutor-android version
@python -c 'import io, os; about = {}; exec(io.open(os.path.join("tutorandroid", "__about__.py"), "rt", encoding="utf-8").read(), about); print(about["__version__"])'
ESCAPE =  ESCAPE = 
help: ## Print this help help: ## Print this help
@grep -E '^([a-zA-Z_-]+:.*?## .*|######* .+)$$' Makefile \ @grep -E '^([a-zA-Z_-]+:.*?## .*|######* .+)$$' Makefile \

View File

@ -0,0 +1,2 @@
- [Improvement] Migrate from pylint and black to ruff. (by @Abdul-Muqadim-Arbisoft)
- [Improvement] Test python package distribution build when running make test. (by @Abdul-Muqadim-Arbisoft)

View File

@ -35,8 +35,7 @@ dynamic = ["version"]
[project.optional-dependencies] [project.optional-dependencies]
dev = [ dev = [
"tutor[dev]>=20.0.0,<21.0.0", "tutor[dev]>=20.0.0,<21.0.0",
"pylint", "ruff",
"black"
] ]
[project.entry-points."tutor.plugin.v1"] [project.entry-points."tutor.plugin.v1"]
@ -66,3 +65,19 @@ exclude = [ "tests*" ]
[tool.hatch.build.targets.wheel] [tool.hatch.build.targets.wheel]
packages = ["tutorandroid"] packages = ["tutorandroid"]
[tool.ruff]
exclude = ["templates", "docs/_ext"]
[tool.ruff.lint]
# E: pycodestyle errors
# I: isort
# N: pep8-naming
select = ["E", "I", "N"]
# F401: unused-import
# F841: unused-variable
# W292: missing-newline-at-end-of-file
extend-select = ["F401", "F841", "W292"]
[tool.ruff.format]

View File

@ -23,8 +23,8 @@ config: t.Dict[str, t.Dict[str, t.Any]] = {
# Version 4.0.0 is not working: # Version 4.0.0 is not working:
# https://github.com/overhangio/tutor-android/pull/6#issuecomment-1541510489 # https://github.com/overhangio/tutor-android/pull/6#issuecomment-1541510489
"APP_VERSION": "3.1.4", "APP_VERSION": "3.1.4",
"DOCKER_IMAGE": "{{ DOCKER_REGISTRY }}overhangio/openedx-android:{{ ANDROID_VERSION }}", "DOCKER_IMAGE": "{{ DOCKER_REGISTRY }}overhangio/openedx-android:{{ ANDROID_VERSION }}", # noqa: E501
"APP_DOCKER_IMAGE": "{{ DOCKER_REGISTRY }}overhangio/openedx-android-app:{{ ANDROID_VERSION }}", "APP_DOCKER_IMAGE": "{{ DOCKER_REGISTRY }}overhangio/openedx-android-app:{{ ANDROID_VERSION }}", # noqa: E501
"ENABLE_RELEASE_MODE": False, "ENABLE_RELEASE_MODE": False,
"RELEASE_STORE_PASSWORD": "android store password", "RELEASE_STORE_PASSWORD": "android store password",
"RELEASE_KEY_PASSWORD": "android release key password", "RELEASE_KEY_PASSWORD": "android release key password",