diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..829f613 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,22 @@ +name: Run tests + +on: + pull_request: + branches: [master] + +jobs: + tests: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up Python 3.8 + uses: actions/setup-python@v2 + with: + python-version: 3.8 + - name: Upgrade pip + run: python -m pip install --upgrade pip setuptools + - name: Install dependencies + run: | + pip install .[dev] + - name: Test lint, types, and format + run: make test diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..50d4e72 --- /dev/null +++ b/Makefile @@ -0,0 +1,34 @@ +.DEFAULT_GOAL := help +.PHONY: docs +SRC_DIRS = ./tutorwebui +BLACK_OPTS = --exclude templates ${SRC_DIRS} + +# Warning: These checks are not necessarily run on every PR. +test: test-lint test-types test-format # Run some static checks. + +test-format: ## Run code formatting tests + black --check --diff $(BLACK_OPTS) + +test-lint: ## Run code linting tests + pylint --errors-only --enable=unused-import,unused-argument --ignore=templates --ignore=docs/_ext ${SRC_DIRS} + +test-types: ## Run type checks. + mypy --exclude=templates --ignore-missing-imports --implicit-reexport --strict ${SRC_DIRS} + +format: ## Format code automatically + black $(BLACK_OPTS) + +isort: ## Sort imports. This target is not mandatory because the output may be incompatible with black formatting. Provided for convenience purposes. + isort --skip=templates ${SRC_DIRS} + +changelog-entry: ## Create a new changelog entry. + scriv create + +changelog: ## Collect changelog entries in the CHANGELOG.md file. + scriv collect + +ESCAPE =  +help: ## Print this help + @grep -E '^([a-zA-Z_-]+:.*?## .*|######* .+)$$' Makefile \ + | sed 's/######* \(.*\)/@ $(ESCAPE)[1;31m\1$(ESCAPE)[0m/g' | tr '@' '\n' \ + | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[33m%-30s\033[0m %s\n", $$1, $$2}' diff --git a/changelog.d/20231005_153050_codewithemad.md b/changelog.d/20231005_153050_codewithemad.md new file mode 100644 index 0000000..81ca4f1 --- /dev/null +++ b/changelog.d/20231005_153050_codewithemad.md @@ -0,0 +1 @@ +- [Improvement] Added Makefile and test action to repository and formatted code with Black and isort. (by @CodeWithEmad) \ No newline at end of file diff --git a/setup.py b/setup.py index 9271dea..8ed7927 100644 --- a/setup.py +++ b/setup.py @@ -45,6 +45,7 @@ def load_about(): include_package_data=True, python_requires=">=3.8", install_requires=["tutor>=16.0.0,<17.0.0", "click_repl>=0.2.0"], + extras_require={"dev": "tutor[dev]>=16.0.0,<17.0.0"}, entry_points={ "tutor.plugin.v1": ["webui = tutorwebui.plugin"], }, diff --git a/tutorwebui/__about__.py b/tutorwebui/__about__.py index 1722f39..5e5e910 100644 --- a/tutorwebui/__about__.py +++ b/tutorwebui/__about__.py @@ -1,2 +1 @@ __version__ = "16.0.0" - diff --git a/tutorwebui/cli.py b/tutorwebui/cli.py index 4ee40eb..7c940ee 100644 --- a/tutorwebui/cli.py +++ b/tutorwebui/cli.py @@ -117,7 +117,8 @@ def shell() -> None: # incorrectly calls the `commands` attribute. Note that this enables us to # run shell within shell, which is cool but a little weird... ctx = click.get_current_context() - ctx.parent.command.commands = {} + if ctx.parent and ctx.parent.command: + ctx.parent.command.commands = {} # type: ignore while True: try: diff --git a/tutorwebui/plugin.py b/tutorwebui/plugin.py index 7848821..3cf4de5 100644 --- a/tutorwebui/plugin.py +++ b/tutorwebui/plugin.py @@ -1,7 +1,8 @@ from tutor import hooks as tutor_hooks from tutor.__about__ import __version_suffix__ -from .__about__ import __version__ + from . import cli +from .__about__ import __version__ # Handle version suffix in nightly mode, just like tutor core if __version_suffix__: