diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index 57f560613..9cfe58485 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -1,7 +1,10 @@ name: Checks "on": - push: + pull_request: + +env: + PYTHON_VERSION_DEFAULT: "3.10.8" jobs: test: @@ -25,7 +28,7 @@ jobs: uses: actions/cache@v3 with: path: .venv - key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }} + key: venv-${{ runner.os }}-${{ env.PYTHON_VERSION_DEFAULT }}-${{ hashFiles('**/poetry.lock') }} - name: Validate project dependencies run: poetry check - name: Install dependencies diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 710d740c7..d3ea65798 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -3,36 +3,6 @@ name: Release "on": push: branches: ["main", "master"] - workflow_dispatch: - inputs: - release_force: - description: | - Force release be one of: [major | minor | patch] - Leave empty for auto-detect based on commit messages. - type: choice - options: - - "" # auto-detect - - major # force major - - minor # force minor - - patch # force patch - default: "" - required: false - prerelease_token: - description: | - 'The "prerelease identifier" to use as a prefix for the "prerelease" \ - part of a semver. Like the rc in `1.2.0-rc.8`.' - type: choice - options: - - rc - - beta - - alpha - default: rc - required: false - prerelease: - description: "Is a pre-release" - type: boolean - default: false - required: false concurrency: group: deploy @@ -81,7 +51,7 @@ jobs: Release: needs: Test - if: "!contains(github.event.head_commit.message, 'chore(release):')" + if: github.event_name == 'push' && !contains(github.event.head_commit.message, 'chore(release):') runs-on: ubuntu-latest permissions: # NOTE: this enables trusted publishing. @@ -121,21 +91,19 @@ jobs: - name: Install dependencies if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' run: poetry install --no-interaction --no-root - - name: Python Semantic Release - id: release - # see https://python-semantic-release.readthedocs.io/en/latest/automatic-releases/github-actions.html - # see https://github.com/python-semantic-release/python-semantic-release - uses: python-semantic-release/python-semantic-release@v8.5.0 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - force: ${{ github.event.inputs.release_force }} - prerelease: ${{ github.event.inputs.prerelease }} - prerelease_token: ${{ github.event.inputs.prerelease_token }} + run: | + git config --global user.name "github-actions" + git config --global user.email "action@github.com" + poetry run semantic-release --noop publish -D commit_author="github-actions " + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # PyPI_TOKEN: ${{secrets.PyPI_TOKEN}} Documentation: needs: Release runs-on: ubuntu-latest + if: github.ref == 'refs/heads/main' steps: - uses: actions/checkout@v4 with: diff --git a/pyproject.toml b/pyproject.toml index 700e35d18..623507ab2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,9 +8,7 @@ license = "Apache-2.0" readme = "README.md" documentation = "https://opentargets.github.io/genetics_etl_python/" repository = "https://github.com/opentargets/genetics_etl_python" -packages = [ - { include = "otg", from = "src"}, -] +packages = [{ include = "otg", from = "src" }] [tool.poetry.urls] "Bug Tracker" = "http://github.com/opentargets/issues" @@ -80,8 +78,7 @@ yamllint = "^1.33.0" [tool.semantic_release] logging_use_named_masks = true -commit_author = "opentargets " -build_command = "pip install poetry && poetry build" +build_command = "poetry build" assets = [] version_variable = ["src/otg/__init__.py:__version__"] version_toml = ["pyproject.toml:tool.poetry.version"] @@ -92,15 +89,18 @@ upload_to_release = true match = "(main|master)" prerelease = false +[tool.semantic_release.branches."0.x.x"] +match = "0.x.x" +prerelease = true +prerelease_token = "rc" + [tool.semantic_release.publish] dist_glob_patterns = ["dist/*"] upload_to_vcs_release = true [tool.semantic_release.changelog] changelog_file = "CHANGELOG.md" -exclude_commit_patterns = [ - "chore\\(release\\):", -] +exclude_commit_patterns = ["chore\\(release\\):"] [tool.semantic_release.branches."step"] match = "(build|chore|ci|docs|feat|fix|perf|style|refactor|test)" @@ -124,10 +124,7 @@ exclude = ["dist"] [tool.pytest.ini_options] addopts = "-n auto --doctest-modules --cov=src/ --cov-report=xml" -pythonpath = [ - ".", - "./src/airflow/dags" -] +pythonpath = [".", "./src/airflow/dags"] # Semi-strict mode for mypy [tool.mypy] @@ -143,108 +140,108 @@ disallow_untyped_defs = true [[tool.mypy.overrides]] module = [ - "google.cloud", - "yaml", - "hail", - "pyliftover", - "dbldatagen", - "scipy", - "scipy.stats", - "chardet", - "omegaconf", - "xgboost", - "sklearn", + "google.cloud", + "yaml", + "hail", + "pyliftover", + "dbldatagen", + "scipy", + "scipy.stats", + "chardet", + "omegaconf", + "xgboost", + "sklearn", ] ignore_missing_imports = true [tool.ruff] select = [ - "B002", # Python does not support the unary prefix increment - "B007", # Loop control variable {name} not used within loop body - "B014", # Exception handler with duplicate exception - "B023", # Function definition does not bind loop variable {name} - "B026", # Star-arg unpacking after a keyword argument is strongly discouraged - "C", # complexity - "COM818", # Trailing comma on bare tuple prohibited - "D", # docstrings - "DTZ003", # Use datetime.now(tz=) instead of datetime.utcnow() - "DTZ004", # Use datetime.fromtimestamp(ts, tz=) instead of datetime.utcfromtimestamp(ts) - "E", # pycodestyle - "F", # pyflakes/autoflake - "G", # flake8-logging-format - "I", # isort - "ICN001", # import concentions; {name} should be imported as {asname} - "ISC001", # Implicitly concatenated string literals on one line - "N804", # First argument of a class method should be named cls - "N805", # First argument of a method should be named self - "N815", # Variable {name} in class scope should not be mixedCase - "PGH001", # No builtin eval() allowed - "PGH004", # Use specific rule codes when using noqa - "PLC0414", # Useless import alias. Import alias does not rename original package. - "PLC", # pylint - "PLE", # pylint - "PLR", # pylint - "PLW", # pylint - "Q000", # Double quotes found but single quotes preferred - "RUF006", # Store a reference to the return value of asyncio.create_task - "S102", # Use of exec detected - "S103", # bad-file-permissions - "S108", # hardcoded-temp-file - "S306", # suspicious-mktemp-usage - "S307", # suspicious-eval-usage - "S313", # suspicious-xmlc-element-tree-usage - "S314", # suspicious-xml-element-tree-usage - "S315", # suspicious-xml-expat-reader-usage - "S316", # suspicious-xml-expat-builder-usage - "S317", # suspicious-xml-sax-usage - "S318", # suspicious-xml-mini-dom-usage - "S319", # suspicious-xml-pull-dom-usage - "S320", # suspicious-xmle-tree-usage - "S601", # paramiko-call - "S602", # subprocess-popen-with-shell-equals-true - "S604", # call-with-shell-equals-true - "S608", # hardcoded-sql-expression - "S609", # unix-command-wildcard-injection - "SIM105", # Use contextlib.suppress({exception}) instead of try-except-pass - "SIM117", # Merge with-statements that use the same scope - "SIM118", # Use {key} in {dict} instead of {key} in {dict}.keys() - "SIM201", # Use {left} != {right} instead of not {left} == {right} - "SIM208", # Use {expr} instead of not (not {expr}) - "SIM212", # Use {a} if {a} else {b} instead of {b} if not {a} else {a} - "SIM300", # Yoda conditions. Use 'age == 42' instead of '42 == age'. - "SIM401", # Use get from dict with default instead of an if block - "T100", # Trace found: {name} used - "T20", # flake8-print - "TID251", # Banned imports - "TRY004", # Prefer TypeError exception for invalid type - "TRY200", # Use raise from to specify exception cause - "TRY302", # Remove exception handler; error is immediately re-raised - "UP", # pyupgrade - "W", # pycodestyle + "B002", # Python does not support the unary prefix increment + "B007", # Loop control variable {name} not used within loop body + "B014", # Exception handler with duplicate exception + "B023", # Function definition does not bind loop variable {name} + "B026", # Star-arg unpacking after a keyword argument is strongly discouraged + "C", # complexity + "COM818", # Trailing comma on bare tuple prohibited + "D", # docstrings + "DTZ003", # Use datetime.now(tz=) instead of datetime.utcnow() + "DTZ004", # Use datetime.fromtimestamp(ts, tz=) instead of datetime.utcfromtimestamp(ts) + "E", # pycodestyle + "F", # pyflakes/autoflake + "G", # flake8-logging-format + "I", # isort + "ICN001", # import concentions; {name} should be imported as {asname} + "ISC001", # Implicitly concatenated string literals on one line + "N804", # First argument of a class method should be named cls + "N805", # First argument of a method should be named self + "N815", # Variable {name} in class scope should not be mixedCase + "PGH001", # No builtin eval() allowed + "PGH004", # Use specific rule codes when using noqa + "PLC0414", # Useless import alias. Import alias does not rename original package. + "PLC", # pylint + "PLE", # pylint + "PLR", # pylint + "PLW", # pylint + "Q000", # Double quotes found but single quotes preferred + "RUF006", # Store a reference to the return value of asyncio.create_task + "S102", # Use of exec detected + "S103", # bad-file-permissions + "S108", # hardcoded-temp-file + "S306", # suspicious-mktemp-usage + "S307", # suspicious-eval-usage + "S313", # suspicious-xmlc-element-tree-usage + "S314", # suspicious-xml-element-tree-usage + "S315", # suspicious-xml-expat-reader-usage + "S316", # suspicious-xml-expat-builder-usage + "S317", # suspicious-xml-sax-usage + "S318", # suspicious-xml-mini-dom-usage + "S319", # suspicious-xml-pull-dom-usage + "S320", # suspicious-xmle-tree-usage + "S601", # paramiko-call + "S602", # subprocess-popen-with-shell-equals-true + "S604", # call-with-shell-equals-true + "S608", # hardcoded-sql-expression + "S609", # unix-command-wildcard-injection + "SIM105", # Use contextlib.suppress({exception}) instead of try-except-pass + "SIM117", # Merge with-statements that use the same scope + "SIM118", # Use {key} in {dict} instead of {key} in {dict}.keys() + "SIM201", # Use {left} != {right} instead of not {left} == {right} + "SIM208", # Use {expr} instead of not (not {expr}) + "SIM212", # Use {a} if {a} else {b} instead of {b} if not {a} else {a} + "SIM300", # Yoda conditions. Use 'age == 42' instead of '42 == age'. + "SIM401", # Use get from dict with default instead of an if block + "T100", # Trace found: {name} used + "T20", # flake8-print + "TID251", # Banned imports + "TRY004", # Prefer TypeError exception for invalid type + "TRY200", # Use raise from to specify exception cause + "TRY302", # Remove exception handler; error is immediately re-raised + "UP", # pyupgrade + "W", # pycodestyle ] ignore = [ - "E501", # line too long - "E731", # do not assign a lambda expression, use a def - - # Ignore ignored, as the rule is now back in preview/nursery, which cannot - # be ignored anymore without warnings. - # https://github.com/astral-sh/ruff/issues/7491 - # "PLC1901", # Lots of false positives - - # False positives https://github.com/astral-sh/ruff/issues/5386 - "PLC0208", # Use a sequence type instead of a `set` when iterating over values - "PLR0911", # Too many return statements ({returns} > {max_returns}) - "PLR0912", # Too many branches ({branches} > {max_branches}) - "PLR0913", # Too many arguments to function call ({c_args} > {max_args}) - "PLR0915", # Too many statements ({statements} > {max_statements}) - "PLR2004", # Magic value used in comparison, consider replacing {value} with a constant variable - "PLW2901", # Outer {outer_kind} variable {name} overwritten by inner {inner_kind} target - "UP006", # keep type annotation style as is - "UP007", # keep type annotation style as is - # Ignored due to performance: https://github.com/charliermarsh/ruff/issues/2923 - "UP038", # Use `X | Y` in `isinstance` call instead of `(X, Y)` + "E501", # line too long + "E731", # do not assign a lambda expression, use a def + + # Ignore ignored, as the rule is now back in preview/nursery, which cannot + # be ignored anymore without warnings. + # https://github.com/astral-sh/ruff/issues/7491 + # "PLC1901", # Lots of false positives + + # False positives https://github.com/astral-sh/ruff/issues/5386 + "PLC0208", # Use a sequence type instead of a `set` when iterating over values + "PLR0911", # Too many return statements ({returns} > {max_returns}) + "PLR0912", # Too many branches ({branches} > {max_branches}) + "PLR0913", # Too many arguments to function call ({c_args} > {max_args}) + "PLR0915", # Too many statements ({statements} > {max_statements}) + "PLR2004", # Magic value used in comparison, consider replacing {value} with a constant variable + "PLW2901", # Outer {outer_kind} variable {name} overwritten by inner {inner_kind} target + "UP006", # keep type annotation style as is + "UP007", # keep type annotation style as is + # Ignored due to performance: https://github.com/charliermarsh/ruff/issues/2923 + "UP038", # Use `X | Y` in `isinstance` call instead of `(X, Y)` ]