From 5f548b1e1a6af371f1599c031f92dbc2e3eb79b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Dlouh=C3=BD?= Date: Wed, 22 May 2024 09:59:33 +0200 Subject: [PATCH] establish GitHub actions testing with TOX --- .coveragerc | 9 ++++ .github/workflows/linters.yml | 81 ++++++++++++++++++++++++++++++++++- example/project/settings.py | 29 ++++++++----- requirements_test.txt | 7 +++ tox.ini | 38 ++++++++++++++++ 5 files changed, 153 insertions(+), 11 deletions(-) create mode 100644 .coveragerc create mode 100644 requirements_test.txt create mode 100644 tox.ini diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 0000000..835e4c8 --- /dev/null +++ b/.coveragerc @@ -0,0 +1,9 @@ +[run] +omit = + */virtualenvs/*, + */migrations/*, + */site-packages/* +include = import_export_celery/* +plugins = + django_coverage_plugin +branch = True diff --git a/.github/workflows/linters.yml b/.github/workflows/linters.yml index 43caacd..1cbe2ef 100644 --- a/.github/workflows/linters.yml +++ b/.github/workflows/linters.yml @@ -1,4 +1,4 @@ -name: Flake8 +name: CI on: [push, pull_request] @@ -7,6 +7,85 @@ concurrency: cancel-in-progress: true jobs: + test: + runs-on: ubuntu-latest + + services: + postgres: + image: postgres:13 + ports: + - 5432:5432 + env: + POSTGRES_DB: pguser + POSTGRES_USER: pguser + POSTGRES_PASSWORD: foobar + options: >- + --health-cmd "pg_isready -U pguser" + --health-interval 10s + --health-timeout 5s + --health-retries 5 + + redis: + image: redis:latest + ports: + - 6379:6379 + options: >- + --health-cmd "redis-cli ping" + --health-interval 10s + --health-timeout 5s + --health-retries 5 + + strategy: + fail-fast: false + matrix: + python-version: ["3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12"] + django-version: ["3.2", "4.0", "4.1", "4.2", "5.0", "5.1"] + exclude: + - python-version: "3.6" + django-version: "4.0" + - python-version: "3.6" + django-version: "4.1" + - python-version: "3.6" + django-version: "4.2" + - python-version: "3.6" + django-version: "5.0" + - python-version: "3.6" + django-version: "5.1" + - python-version: "3.7" + django-version: "5.0" + - python-version: "3.7" + django-version: "5.1" + - python-version: "3.11" + django-version: "3.2" + - python-version: "3.12" + django-version: "3.2" + - python-version: "3.12" + django-version: "4.0" + + steps: + - uses: actions/checkout@v2 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install tox tox-gh-actions + + - name: Run Tox + run: | + tox -e py${{ matrix.python-version | replace('.', '') }}-django${{ matrix.django-version | replace('.', '') }} + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v2 + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: coverage.xml + fail_ci_if_error: true + flake8: name: flake8 runs-on: ubuntu-latest diff --git a/example/project/settings.py b/example/project/settings.py index 249a8cf..355d63e 100644 --- a/example/project/settings.py +++ b/example/project/settings.py @@ -67,6 +67,7 @@ "django.contrib.auth.context_processors.auth", "django.contrib.messages.context_processors.messages", ], + "debug": DEBUG, }, }, ] @@ -78,16 +79,24 @@ # Database # https://docs.djangoproject.com/en/1.10/ref/settings/#databases -DATABASES = { - "default": { - "ENGINE": "django.db.backends.postgresql_psycopg2", - "NAME": os.environ.get("DATABASE_NAME", "pguser"), - "USER": os.environ.get("DATABASE_USER", "pguser"), - "PASSWORD": os.environ.get("DATABASE_PASSWORD", "foobar"), - "HOST": os.environ.get("DATABASE_HOST", "postgres"), - "PORT": os.environ.get("DATABASE_PORT", ""), - }, -} +if os.environ.get("DATABASE_TYPE") == "sqlite": + DATABASES = { + "default": { + "ENGINE": "django.db.backends.sqlite3", + "NAME": os.environ.get("DATABASE_NAME", os.path.join(BASE_DIR, "db.sqlite3")), + } + } +else: + DATABASES = { + "default": { + "ENGINE": "django.db.backends.postgresql_psycopg2", + "NAME": os.environ.get("DATABASE_NAME", "pguser"), + "USER": os.environ.get("DATABASE_USER", "pguser"), + "PASSWORD": os.environ.get("DATABASE_PASSWORD", "foobar"), + "HOST": os.environ.get("DATABASE_HOST", "postgres"), + "PORT": os.environ.get("DATABASE_PORT", ""), + }, + } STORAGES = { "IMPORT_EXPORT_CELERY_STORAGE": { diff --git a/requirements_test.txt b/requirements_test.txt new file mode 100644 index 0000000..9a18bf2 --- /dev/null +++ b/requirements_test.txt @@ -0,0 +1,7 @@ +Django +django-import-export +django-author +html2text +celery +psycopg2-binary +django-admin-smoke-tests diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..c7da49c --- /dev/null +++ b/tox.ini @@ -0,0 +1,38 @@ +[tox] +envlist = + py{36,37,38,39,310}-django32 + py{38,39,310}-django40 + py{38,39,310,311}-django41 + py{38,39,310,311,312}-django42 + py{310,311,312}-django50 + py{310,311,312}-django51 + +[testenv] +deps = + -rrequirements_test.txt + coverage + django-coverage-plugin + django32: django>=3.2,<3.3 + django40: django>=4.0,<4.1 + django41: django>=4.1,<4.2 + django42: django>=4.2,<4.3 + django50: django>=5.0,<5.1 + django51: git+https://github.com/django/django@main # TODO: update when Django 5.1 is released + +setenv = + DATABASE_TYPE=sqlite + REDIS_URL=redis://127.0.0.1:6379/0 + +allowlist_externals = coverage + +test-executable = + python --version + python -c "import django; print(django.get_version())" + pip install -r requirements_test.txt + {envbindir}/python -Wall {envbindir}/coverage run --append + +commands = + python example/manage.py migrate + {[testenv]test-executable} example/manage.py test winners + coverage report + coverage xml -o coverage.xml