diff --git a/.commitlintrc.yaml b/.commitlintrc.yaml new file mode 100644 index 00000000..d0b32786 --- /dev/null +++ b/.commitlintrc.yaml @@ -0,0 +1,21 @@ +rules: + body-case: [2, always, sentence-case] + body-full-stop: [2, always] + body-leading-blank: [2, always] + body-max-line-length: [2, always, 72] + footer-leading-blank: [2, always] + footer-max-line-length: [2, always, 72] + header-max-length: [2, always, 72] + scope-case: [2, always, lower-case] + subject-case: + - 2 + - never + - [pascal-case, sentence-case, start-case, upper-case] + subject-empty: [2, never] + subject-full-stop: [2, never, "."] + type-case: [2, always, lower-case] + type-empty: [2, never] + type-enum: + - 2 + - always + - [build, chore, ci, docs, feat, fix, perf, refactor, style, test] diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0b36a5da..bd072f36 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,5 +1,5 @@ # This file is part of REANA. -# Copyright (C) 2020, 2021, 2022, 2023 CERN. +# Copyright (C) 2020, 2021, 2022, 2023, 2024 CERN. # # REANA is free software; you can redistribute it and/or modify it # under the terms of the MIT License; see LICENSE file for more details. @@ -9,211 +9,237 @@ name: CI on: [push, pull_request] jobs: - lint-shellcheck: - runs-on: ubuntu-20.04 - steps: - - uses: actions/checkout@v3 - - - name: Runs shell script static analysis - run: | - sudo apt-get install shellcheck - ./run-tests.sh --check-shellscript - - lint-black: - runs-on: ubuntu-20.04 - steps: - - uses: actions/checkout@v3 - - - name: Setup Python - uses: actions/setup-python@v4 - with: - python-version: '3.8' - - - name: Install Python dependencies - run: pip install black - - - name: Check Python code formatting - run: ./run-tests.sh --check-black - - lint-flake8: - runs-on: ubuntu-20.04 - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Setup Python - uses: actions/setup-python@v4 - with: - python-version: '3.8' - - - name: Check compliance with pep8, pyflakes and circular complexity - run: | - pip install --upgrade pip - pip install flake8 - ./run-tests.sh --check-flake8 - - lint-pydocstyle: - runs-on: ubuntu-20.04 - steps: - - uses: actions/checkout@v3 - - - name: Setup Python - uses: actions/setup-python@v4 - with: - python-version: '3.8' - - - name: Install Python dependencies - run: pip install pydocstyle - - - name: Check compliance with Python docstring conventions - run: ./run-tests.sh --check-pydocstyle - - lint-check-manifest: - runs-on: ubuntu-20.04 - steps: - - uses: actions/checkout@v3 - - - name: Setup Python - uses: actions/setup-python@v4 - with: - python-version: '3.8' - - - name: Install Python dependencies - run: pip install check-manifest - - - name: Check Python manifest completeness - run: ./run-tests.sh --check-manifest - - docs-cli-commands: - runs-on: ubuntu-20.04 - steps: - - uses: actions/checkout@v3 - - - name: Setup Python - uses: actions/setup-python@v4 - with: - python-version: '3.8' - - - name: Install Python dependencies - run: | - pip install --upgrade pip setuptools py - pip install -e .[all] - - - name: Verify reana client commands list - run: ./run-tests.sh --check-cli-cmds - - docs-cli-api: - runs-on: ubuntu-20.04 - steps: - - uses: actions/checkout@v3 - - - name: Setup Python - uses: actions/setup-python@v4 - with: - python-version: '3.8' - - - name: Install Python dependencies - run: | - pip install --upgrade pip setuptools py - pip install -e .[all] - - - name: Verify reana client api docs - run: ./run-tests.sh --check-cli-api - - docs-sphinx: - runs-on: ubuntu-20.04 - steps: - - uses: actions/checkout@v3 - - - name: Setup Python - uses: actions/setup-python@v4 - with: - python-version: '3.8' - - - name: Install Python dependencies - run: | - pip install --upgrade pip setuptools py - pip install -e .[all] - - - name: Run Sphinx documentation with doctests - run: ./run-tests.sh --check-sphinx - - python-tests: - runs-on: ubuntu-20.04 - strategy: - matrix: - include: - - testenv: lowest - python: '3.6' - - - testenv: release - python: '3.6' - - - testenv: lowest - python: '3.7' - - - testenv: release - python: '3.7' - - - testenv: lowest - python: '3.8' - - - testenv: release - python: '3.8' - - - testenv: lowest - python: '3.9' - - - testenv: release - python: '3.9' - - - testenv: lowest - python: '3.10' - - - testenv: release - python: '3.10' - - - testenv: lowest - python: '3.11' - - - testenv: release - python: '3.11' - - - testenv: lowest - python: '3.12' - - - testenv: release - python: '3.12' - steps: - - uses: actions/checkout@v3 - - - name: Set up Python ${{ matrix.python }} - uses: actions/setup-python@v4 - with: - python-version: ${{ matrix.python }} - - - name: Setup requirements builder - run: | - pip install --upgrade pip setuptools py - pip install wheel - pip install requirements-builder - if [[ ${{ matrix.testenv }} == lowest ]]; then - requirements-builder -e all --level=min --req requirements-dev.txt setup.py > .lowest-requirements.txt - fi - if [[ ${{ matrix.testenv }} == release ]]; then - requirements-builder -e all --level=pypi --req requirements-dev.txt setup.py > .release-requirements.txt - fi - - - name: Install Python dependencies - run: | - pip install -r .${{ matrix.testenv }}-requirements.txt - - - name: Run pytest - run: ./run-tests.sh --check-pytest - - - name: Codecov Coverage - if: matrix.python == '3.8' - uses: codecov/codecov-action@v3 - with: - token: ${{ secrets.CODECOV_TOKEN }} - files: coverage.xml + lint-commitlint: + runs-on: ubuntu-20.04 + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Setup Node + uses: actions/setup-node@v4 + + - name: Install commitlint + run: | + npm install conventional-changelog-conventionalcommits + npm install commitlint@latest + + - name: Check commit message compliance of the recently pushed commit + if: github.event_name == 'push' + run: | + ./run-tests.sh --check-commitlint HEAD~1 HEAD + + - name: Check commit message compliance of the pull request + if: github.event_name == 'pull_request' + run: | + ./run-tests.sh --check-commitlint ${{ github.event.pull_request.head.sha }}~${{ github.event.pull_request.commits }} ${{ github.event.pull_request.head.sha }} + + lint-shellcheck: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v3 + + - name: Runs shell script static analysis + run: | + sudo apt-get install shellcheck + ./run-tests.sh --check-shellcheck + + lint-black: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v3 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.8' + + - name: Install Python dependencies + run: pip install black + + - name: Check Python code formatting + run: ./run-tests.sh --check-black + + lint-flake8: + runs-on: ubuntu-20.04 + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.8' + + - name: Check compliance with pep8, pyflakes and circular complexity + run: | + pip install --upgrade pip + pip install flake8 + ./run-tests.sh --check-flake8 + + lint-pydocstyle: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v3 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.8' + + - name: Install Python dependencies + run: pip install pydocstyle + + - name: Check compliance with Python docstring conventions + run: ./run-tests.sh --check-pydocstyle + + lint-check-manifest: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v3 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.8' + + - name: Install Python dependencies + run: pip install check-manifest + + - name: Check Python manifest completeness + run: ./run-tests.sh --check-manifest + + docs-cli-commands: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v3 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.8' + + - name: Install Python dependencies + run: | + pip install --upgrade pip setuptools py + pip install -e .[all] + + - name: Verify reana client commands list + run: ./run-tests.sh --check-cli-cmds + + docs-cli-api: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v3 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.8' + + - name: Install Python dependencies + run: | + pip install --upgrade pip setuptools py + pip install -e .[all] + + - name: Verify reana client api docs + run: ./run-tests.sh --check-cli-api + + docs-sphinx: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v3 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.8' + + - name: Install Python dependencies + run: | + pip install --upgrade pip setuptools py + pip install -e .[all] + + - name: Run Sphinx documentation with doctests + run: ./run-tests.sh --check-sphinx + + python-tests: + runs-on: ubuntu-20.04 + strategy: + matrix: + include: + - testenv: lowest + python: '3.6' + + - testenv: release + python: '3.6' + + - testenv: lowest + python: '3.7' + + - testenv: release + python: '3.7' + + - testenv: lowest + python: '3.8' + + - testenv: release + python: '3.8' + + - testenv: lowest + python: '3.9' + + - testenv: release + python: '3.9' + + - testenv: lowest + python: '3.10' + + - testenv: release + python: '3.10' + + - testenv: lowest + python: '3.11' + + - testenv: release + python: '3.11' + + - testenv: lowest + python: '3.12' + + - testenv: release + python: '3.12' + steps: + - uses: actions/checkout@v3 + + - name: Set up Python ${{ matrix.python }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python }} + + - name: Setup requirements builder + run: | + pip install --upgrade pip setuptools py + pip install wheel + pip install requirements-builder + if [[ ${{ matrix.testenv }} == lowest ]]; then + requirements-builder -e all --level=min --req requirements-dev.txt setup.py > .lowest-requirements.txt + fi + if [[ ${{ matrix.testenv }} == release ]]; then + requirements-builder -e all --level=pypi --req requirements-dev.txt setup.py > .release-requirements.txt + fi + + - name: Install Python dependencies + run: | + pip install -r .${{ matrix.testenv }}-requirements.txt + + - name: Run pytest + run: ./run-tests.sh --check-pytest + + - name: Codecov Coverage + if: matrix.python == '3.8' + uses: codecov/codecov-action@v3 + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: coverage.xml diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml new file mode 100644 index 00000000..253a7a6d --- /dev/null +++ b/.github/workflows/release-please.yml @@ -0,0 +1,20 @@ +on: + push: + branches: + - maint-0.9 + - master + +permissions: + contents: write + pull-requests: write + +name: release-please + +jobs: + release-please: + runs-on: ubuntu-latest + steps: + - uses: google-github-actions/release-please-action@v4 + with: + config-file: .release-please-config.json + target-branch: ${{ github.ref_name }} diff --git a/.release-please-config.json b/.release-please-config.json new file mode 100644 index 00000000..a418abc3 --- /dev/null +++ b/.release-please-config.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "include-v-in-tag": false, + "packages": { + ".": { + "changelog-sections": [ + { "type": "build", "section": "Build", "hidden": false }, + { "type": "feat", "section": "Features", "hidden": false }, + { "type": "fix", "section": "Bug fixes", "hidden": false }, + { "type": "perf", "section": "Performance improvements", "hidden": false }, + { "type": "refactor", "section": "Code refactoring", "hidden": false }, + { "type": "style", "section": "Code style", "hidden": false }, + { "type": "test", "section": "Test suite", "hidden": false }, + { "type": "ci", "section": "Continuous integration", "hidden": false }, + { "type": "docs", "section": "Documentation", "hidden": false }, + { "type": "chore", "section": "Chores", "hidden": true } + ], + "versioning": "always-bump-patch" + } + }, + "pull-request-footer": " ", + "pull-request-header": " ", + "release-type": "python" +} diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 00000000..7e08ec6a --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "0.9.2" +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..e69de29b diff --git a/LICENSE b/LICENSE index 750cb266..f74676a6 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (C) 2017, 2018, 2019, 2020, 2021, 2022, 2023 CERN. +Copyright (C) 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024 CERN. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in diff --git a/MANIFEST.in b/MANIFEST.in index 51862220..7c933526 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,9 +1,11 @@ # This file is part of REANA. -# Copyright (C) 2017, 2018, 2019, 2020, 2021, 2022 CERN. +# Copyright (C) 2017, 2018, 2019, 2020, 2021, 2022, 2024 CERN. # # REANA is free software; you can redistribute it and/or modify it # under the terms of the MIT License; see LICENSE file for more details. +include *.json +include *.md include *.rst include *.sh include *.txt @@ -11,10 +13,10 @@ include *.yaml include *.yml include .flake8 include LICENSE -include docs/cmd_list.txt -include docs/requirements.txt include pytest.ini include tox.ini +include docs/cmd_list.txt +include docs/requirements.txt exclude .readthedocs.yaml prune docs/_build recursive-include docs *.png diff --git a/run-tests.sh b/run-tests.sh index 22c82b03..b6ec165b 100755 --- a/run-tests.sh +++ b/run-tests.sh @@ -1,20 +1,34 @@ -#!/bin/bash +#!/usr/bin/env bash # # This file is part of REANA. -# Copyright (C) 2017, 2018, 2019, 2020, 2022 CERN. +# Copyright (C) 2017, 2018, 2019, 2020, 2022, 2024 CERN. # # REANA is free software; you can redistribute it and/or modify it # under the terms of the MIT License; see LICENSE file for more details. -# Quit on errors set -o errexit - -# Quit on unbound symbols set -o nounset +check_commitlint () { + from=${2:-master} + to=${3:-HEAD} + npx commitlint --from="$from" --to="$to" + found=0 + while IFS= read -r line; do + if echo "$line" | grep -qP "\(\#[0-9]+\)$"; then + true + else + echo "✖ PR number missing in $line" + found=1 + fi + done < <(git log "$from..$to" --format="%s") + if [ $found -gt 0 ]; then + exit 1 + fi +} -check_script () { - shellcheck run-tests.sh +check_shellcheck () { + find . -name "*.sh" -exec shellcheck {} \; } check_black () { @@ -57,7 +71,8 @@ check_pytest () { } check_all() { - check_script + check_commitlint + check_shellcheck check_black check_flake8 check_pydocstyle @@ -73,18 +88,17 @@ if [ $# -eq 0 ]; then exit 0 fi -for arg in "$@" -do - case $arg in - --check-shellscript) check_script;; - --check-black) check_black;; - --check-flake8) check_flake8;; - --check-pydocstyle) check_pydocstyle;; - --check-manifest) check_manifest;; - --check-cli-cmds) check_cli_cmds;; - --check-cli-api) check_cli_api;; - --check-sphinx) check_sphinx;; - --check-pytest) check_pytest;; - *) - esac -done +arg="$1" +case $arg in + --check-commitlint) check_commitlint "$@";; + --check-shellcheck) check_shellcheck;; + --check-black) check_black;; + --check-flake8) check_flake8;; + --check-pydocstyle) check_pydocstyle;; + --check-manifest) check_manifest;; + --check-cli-cmds) check_cli_cmds;; + --check-cli-api) check_cli_api;; + --check-sphinx) check_sphinx;; + --check-pytest) check_pytest;; + *) echo "[ERROR] Invalid argument '$arg'. Exiting." && exit 1;; +esac