diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6f2bcf5..88fdace 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -43,33 +43,6 @@ jobs: cache: 'pip' cache-dependency-path: 'pyproject.toml' - # Needed for `pueblo.ngr`. - - name: Set up Elixir - uses: erlef/setup-beam@v1 - with: - otp-version: '22.2' - elixir-version: '1.9.4' - - name: Retrieve Mix Dependencies Cache - uses: actions/cache@v3 - id: elixir-mix-cache - with: - path: tests/ngr/elixir/deps - key: ${{ runner.os }}-${{ matrix.otp }}-${{ matrix.elixir }}-mix-${{ hashFiles(format('{0}{1}', github.workspace, '/mix.lock')) }} - - # Needed for `pueblo.ngr`. - - name: Set up Java - uses: actions/setup-java@v3 - with: - distribution: "temurin" - java-version: "17" - - # Needed for `pueblo.ngr`. - - name: Set up Ruby - uses: ruby/setup-ruby@v1 - with: - ruby-version: "3.2" - bundler-cache: true - - name: Set up project run: | diff --git a/.github/workflows/ngr.yml b/.github/workflows/ngr.yml new file mode 100644 index 0000000..9a89b75 --- /dev/null +++ b/.github/workflows/ngr.yml @@ -0,0 +1,103 @@ +--- +name: Tests for pueblo.ngr + +on: + pull_request: + branches: ~ + paths: + - '.github/workflows/ngr.yml' + - 'pueblo/ngr/**' + - 'tests/ngr/**' + push: + branches: [ main ] + paths: + - '.github/workflows/ngr.yml' + - 'pueblo/ngr/**' + - 'tests/ngr/**' + + # Allow job to be triggered manually. + workflow_dispatch: + +# Cancel in-progress jobs when pushing to the same branch. +concurrency: + cancel-in-progress: true + group: ${{ github.workflow }}-${{ github.ref }} + +jobs: + + tests: + + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: ["ubuntu-latest"] + python-version: ["3.11"] + + env: + OS: ${{ matrix.os }} + PYTHON: ${{ matrix.python-version }} + + name: Python ${{ matrix.python-version }} on OS ${{ matrix.os }} + steps: + + - name: Acquire sources + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + architecture: x64 + cache: 'pip' + cache-dependency-path: 'pyproject.toml' + + # Needed for `pueblo.ngr`. + - name: Set up Elixir + uses: erlef/setup-beam@v1 + with: + otp-version: '26.1' + elixir-version: '1.15' + - name: Retrieve Mix Dependencies Cache + uses: actions/cache@v3 + id: elixir-mix-cache + with: + path: tests/ngr/elixir/deps + key: ${{ runner.os }}-${{ matrix.otp }}-${{ matrix.elixir }}-mix-${{ hashFiles(format('{0}{1}', github.workspace, '/mix.lock')) }} + + # Needed for `pueblo.ngr`. + - name: Set up Java + uses: actions/setup-java@v3 + with: + distribution: "temurin" + java-version: "17" + + # Needed for `pueblo.ngr`. + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: "3.2" + bundler-cache: true + + - name: Set up project + run: | + + # `setuptools 0.64.0` adds support for editable install hooks (PEP 660). + # https://github.com/pypa/setuptools/blob/main/CHANGES.rst#v6400 + pip install --upgrade 'setuptools>=64' + + # Install package in editable mode. + pip install --use-pep517 --prefer-binary --editable='.[all,develop,test]' + + - name: Run linter and software tests + run: | + pytest -m ngr + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v3 + with: + files: ./coverage.xml + flags: unittests + env_vars: OS,PYTHON + name: codecov-umbrella + fail_ci_if_error: false diff --git a/pyproject.toml b/pyproject.toml index 53a6927..c91448a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -140,6 +140,7 @@ log_cli_level = "DEBUG" testpaths = ["tests"] xfail_strict = true markers = [ + "ngr", ] [tool.coverage.run] @@ -230,11 +231,11 @@ lint = [ { cmd = "validate-pyproject pyproject.toml" }, { cmd = "mypy" }, ] -test = [ - { cmd = "pytest" }, -] +test = "pytest -m 'not ngr'" +test-full = "pytest" build = { cmd = "python -m build" } check = ["lint", "test"] +check-full = ["lint", "test-full"] release = [ { cmd = "python -m build" }, diff --git a/tests/test_ngr.py b/tests/test_ngr.py index 1df6225..54846be 100644 --- a/tests/test_ngr.py +++ b/tests/test_ngr.py @@ -12,6 +12,7 @@ HERE = Path(__file__).parent +@pytest.mark.ngr def test_ngr_version(): """ Invoke `ngr --version`. @@ -36,6 +37,7 @@ def list_target_samples(path: Path): return [sample for sample in samples if ".pytest_cache" not in str(sample)] +@pytest.mark.ngr @pytest.mark.parametrize("sample", list_target_samples(HERE), ids=map(str, list_target_samples(HERE))) def test_ngr_sample(sample: Path): """