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..a4fd9a3 --- /dev/null +++ b/Makefile @@ -0,0 +1,34 @@ +.DEFAULT_GOAL := help +.PHONY: docs +SRC_DIRS = ./tutorminio +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/20231004_141745_codewithemad.md b/changelog.d/20231004_141745_codewithemad.md new file mode 100644 index 0000000..952a383 --- /dev/null +++ b/changelog.d/20231004_141745_codewithemad.md @@ -0,0 +1 @@ +- [Improvement] Added Typing to code, Makefile and test action to the 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 859bbf6..32faade 100644 --- a/setup.py +++ b/setup.py @@ -34,6 +34,7 @@ include_package_data=True, python_requires=">=3.8", install_requires=["tutor>=16.0.0,<17.0.0"], + extras_require={"dev": "tutor[dev]>=16.0.0,<17.0.0"}, entry_points={"tutor.plugin.v1": ["minio = tutorminio.plugin"]}, classifiers=[ "Development Status :: 5 - Production/Stable", diff --git a/tutorminio/__about__.py b/tutorminio/__about__.py index d945113..610c111 100644 --- a/tutorminio/__about__.py +++ b/tutorminio/__about__.py @@ -1,2 +1 @@ __version__ = "16.0.1" - diff --git a/tutorminio/plugin.py b/tutorminio/plugin.py index 2f761f7..d8bc7be 100644 --- a/tutorminio/plugin.py +++ b/tutorminio/plugin.py @@ -1,11 +1,10 @@ from __future__ import annotations import os +import typing as t from glob import glob -from typing import Literal import pkg_resources - from tutor import hooks as tutor_hooks from tutor.__about__ import __version_suffix__ @@ -17,52 +16,55 @@ HERE = os.path.abspath(os.path.dirname(__file__)) - -tutor_hooks.Filters.CONFIG_DEFAULTS.add_items( - [ - ("MINIO_VERSION", __version__), - ("MINIO_BUCKET_NAME", "openedx"), - ("MINIO_FILE_UPLOAD_BUCKET_NAME", "openedxuploads"), - ("MINIO_VIDEO_UPLOAD_BUCKET_NAME", "openedxvideos"), - ("MINIO_HOST", "files.{{ LMS_HOST }}"), - ("MINIO_CONSOLE_HOST", "minio.{{ LMS_HOST }}"), +config: dict[str, dict[str, t.Any]] = { + "defaults": { + "VERSION": __version__, + "BUCKET_NAME": "openedx", + "FILE_UPLOAD_BUCKET_NAME": "openedxuploads", + "VIDEO_UPLOAD_BUCKET_NAME": "openedxvideos", + "HOST": "files.{{ LMS_HOST }}", + "CONSOLE_HOST": "minio.{{ LMS_HOST }}", # https://hub.docker.com/r/minio/minio/tags # https://hub.docker.com/r/minio/mc/tags # We must stick to these older releases because they are the last ones that support gateway mode to Azure: # https://blog.min.io/deprecation-of-the-minio-gateway/ # https://min.io/docs/minio/linux/operations/install-deploy-manage/migrate-fs-gateway.html - ( - "MINIO_DOCKER_IMAGE", - "docker.io/minio/minio:RELEASE.2022-03-26T06-49-28Z.hotfix.26ec6a857", - ), - ("MINIO_MC_DOCKER_IMAGE", "docker.io/minio/mc:RELEASE.2022-03-31T04-55-30Z"), - ("MINIO_GATEWAY", None), - ] -) + "DOCKER_IMAGE": "docker.io/minio/minio:RELEASE.2022-03-26T06-49-28Z.hotfix.26ec6a857", + "MC_DOCKER_IMAGE": "docker.io/minio/mc:RELEASE.2022-03-31T04-55-30Z", + "GATEWAY": None, + }, + "unique": { + "AWS_SECRET_ACCESS_KEY": "{{ 24|random_string }}", + }, + "overrides": { + "OPENEDX_AWS_ACCESS_KEY": "openedx", + "OPENEDX_AWS_SECRET_ACCESS_KEY": "{{ MINIO_AWS_SECRET_ACCESS_KEY }}", + }, +} +# Add configuration entries +tutor_hooks.Filters.CONFIG_DEFAULTS.add_items( + [(f"MINIO_{key}", value) for key, value in config.get("defaults", {}).items()] +) tutor_hooks.Filters.CONFIG_UNIQUE.add_items( - [ - ("MINIO_AWS_SECRET_ACCESS_KEY", "{{ 24|random_string }}"), - ] + [(f"MINIO_{key}", value) for key, value in config.get("unique", {}).items()] ) tutor_hooks.Filters.CONFIG_OVERRIDES.add_items( - [ - ("OPENEDX_AWS_ACCESS_KEY", "openedx"), - ("OPENEDX_AWS_SECRET_ACCESS_KEY", "{{ MINIO_AWS_SECRET_ACCESS_KEY }}"), - ] + list(config.get("overrides", {}).items()) ) + @tutor_hooks.Filters.APP_PUBLIC_HOSTS.add() def add_minio_hosts( - hosts: list[str], context_name: Literal["local", "dev"] - ) -> list[str]: + hosts: list[str], context_name: t.Literal["local", "dev"] +) -> list[str]: if context_name == "dev": hosts.append("{{ MINIO_CONSOLE_HOST }}:9001") else: hosts.append("{{ MINIO_CONSOLE_HOST }}") - return hosts + # Add pre-init script as init task with high priority with open( os.path.join(HERE, "templates", "minio", "tasks", "minio", "init.sh"),