From f287d8395d8aca1471a4cc8441f170573870bdbe Mon Sep 17 00:00:00 2001 From: Luc De Meyer Date: Sun, 25 Oct 2026 14:48:40 +0100 Subject: [PATCH] [18.0][IMP] copier update --- .copier-answers.yml | 3 +- .github/workflows/check-version-bump.yml | 29 ++++++++ .github/workflows/pre-commit.yml | 14 +++- .github/workflows/test.yml | 55 ++++++++++---- .github/workflows/update-addons-table.yml | 42 +++++++++++ .pre-commit-config.yaml | 49 +++++++++---- .pylintrc | 89 +++++++++++------------ .pylintrc-mandatory | 76 ++++++++++--------- .ruff.toml | 9 ++- README.md | 1 - test-requirements.txt | 1 + 11 files changed, 252 insertions(+), 116 deletions(-) create mode 100644 .github/workflows/check-version-bump.yml create mode 100644 .github/workflows/update-addons-table.yml diff --git a/.copier-answers.yml b/.copier-answers.yml index c0d82c1..0dad1bf 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,5 +1,5 @@ # Do NOT update manually; changes here will be overwritten by Copier -_commit: v5.0 +_commit: v8.0.2 _src_path: git@github.com:Noviat-CI/addons-repo-template.git ci_disable_autoinstall_modules: account_asset odoo_test_flavor: Both @@ -9,4 +9,5 @@ rebel_module_groups: [] repo_name: Modules dedicated to manage the EBICS protocol repo_slug: account_ebics repo_type: customer +weblate_project_name: '' diff --git a/.github/workflows/check-version-bump.yml b/.github/workflows/check-version-bump.yml new file mode 100644 index 0000000..d31d3f5 --- /dev/null +++ b/.github/workflows/check-version-bump.yml @@ -0,0 +1,29 @@ +name: Check module version bump + +on: + pull_request: + branches: + - "18.0*" + +jobs: + check-version-bump: + runs-on: ubuntu-latest + name: Check module version bump + steps: + - uses: actions/checkout@v7 + with: + # HEAD is the PR merge commit, HEAD^1 the tip of the base branch + fetch-depth: 2 + persist-credentials: false + - name: Configure git authentication + # Header instead of URL credentials, see test.yml + env: + TOKEN: ${{ secrets.PRIVATE_TOKEN }} + run: | + git config --global http.https://github.com/.extraheader "AUTHORIZATION: basic $(printf 'x-access-token:%s' "$TOKEN" | base64 -w0)" + - name: Add Noviat CI Tools to PATH + run: | + git clone https://github.com/Noviat-CI/noviat-ci-tools.git /opt/noviat-ci-tools + echo "/opt/noviat-ci-tools" >> $GITHUB_PATH + - name: Check module version bump + run: check_module_version_bump diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index aca0b83..a58efe7 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -8,17 +8,23 @@ on: branches: - "18.0" +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: pre-commit: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 + - uses: actions/checkout@v7 + - uses: actions/setup-python@v7 with: python-version: "3.11" + cache: 'pip' + cache-dependency-path: '.pre-commit-config.yaml' - name: Get python version run: echo "PY=$(python -VV | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV - - uses: actions/cache@v4 + - uses: actions/cache@v6 with: path: ~/.cache/pre-commit key: pre-commit|${{ env.PY }}|${{ hashFiles('.pre-commit-config.yaml') }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ddf69aa..b13a7eb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,18 +8,23 @@ on: branches: - "18.0" +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: unreleased-deps: runs-on: ubuntu-latest name: Detect unreleased dependencies steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 - run: | for reqfile in requirements.txt test-requirements.txt ; do if [ -f ${reqfile} ] ; then result=0 # reject non-comment lines that contain a / (i.e. URLs, relative paths) - grep "^[^#].*/" ${reqfile} || result=$? + # unless they have a "# SKIP TEST" comment + grep "^[^#].*/" ${reqfile} | grep -v "# SKIP TEST" || result=$? if [ $result -eq 0 ] ; then echo "Unreleased dependencies found in ${reqfile}." exit 1 @@ -27,7 +32,7 @@ jobs: fi done test: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest container: ${{ matrix.container }} name: ${{ matrix.name }} permissions: @@ -49,7 +54,7 @@ jobs: makepot: "true" services: postgres: - image: postgres:12.0 + image: postgres:12 env: POSTGRES_USER: odoo POSTGRES_PASSWORD: odoo @@ -60,20 +65,34 @@ jobs: INSTALL_ADDONS_DIR: "/tmp/addons-merged" ADDITIONAL_ADDONS_DIR: "/tmp/additional-addons" steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 with: persist-credentials: false + - name: Configure git authentication + env: + TOKEN: ${{ secrets.PRIVATE_TOKEN }} + run: | + git config --global http.https://github.com/.extraheader "AUTHORIZATION: basic $(printf 'x-access-token:%s' "$TOKEN" | base64 -w0)" + - name: Set pip constraints (pyOpenSSL / cryptography) + run: | + cat > /tmp/constraints.txt <<'EOF' + pyOpenSSL == 22.1.0 + cryptography == 38.0.4 + EOF + echo "PIP_CONSTRAINT=/tmp/constraints.txt" >> $GITHUB_ENV + - name: Upgrade pip in container + run: python -m pip install --upgrade pip + - name: Install Odoo upgrade util + run: python -m pip install git+https://github.com/odoo/upgrade-util@master - name: Add Noviat CI Tools to PATH run: | - git clone https://${{ secrets.PRIVATE_TOKEN }}@github.com/Noviat-CI/noviat-ci-tools.git /opt/noviat-ci-tools + git clone https://github.com/Noviat-CI/noviat-ci-tools.git /opt/noviat-ci-tools echo "/opt/noviat-ci-tools" >> $GITHUB_PATH - name: Clone Odoo Enterprise if: ${{ matrix.odoo_enterprise == 1 }} run : | - git clone https://${{ secrets.PRIVATE_TOKEN }}@github.com/odoo/enterprise.git --depth 1 -b 18.0 /opt/enterprise + git clone https://github.com/odoo/enterprise.git --depth 1 -b 18.0 /opt/enterprise - name: Clone Noviat Dependencies - env: - PRIVATE_TOKEN: ${{ secrets.PRIVATE_TOKEN }} run: clone_oca_dependencies_by_noviat - name: Create addons path run: | @@ -97,21 +116,30 @@ jobs: run: | echo "server_wide_modules = web,module_change_auto_install" >> ${ODOO_RC} echo "ODOO_MODULES_AUTO_INSTALL_DISABLED=${{ matrix.EXCLUDE_MODULES }}" >> $GITHUB_ENV - - name: Inject GitHub token for Noviat orgs in test-requirements.txt - run: | - sed -i -E "s#https://github.com/(Noviat-(Projects|Generic|ARP|Internal))#https://${{ secrets.PRIVATE_TOKEN }}@github.com/\1#g" test-requirements.txt - name: Install addons and dependencies run: | (ADDONS_PATH=${ADDONS_PATH} ADDONS_DIR=${INSTALL_ADDONS_DIR} oca_install_addons) + - name: Install external dependencies of core addons (not in Odoo requirements.txt) + run: | + (ADDONS_DIR=${INSTALL_ADDONS_DIR} noviat_install_odoo_external_dependencies) - name: Initialize test db run: oca_init_test_database - name: Run tests run: oca_run_tests - name: Generate coverage files + id: coverage run: | + # oca_run_tests exits early without coverage data when there is no + # addon to test (e.g. a freshly scaffolded version branch). + if [ -z "$(oca_list_addons_to_test)" ]; then + echo "No addon to test, skipping coverage report." + exit 0 + fi coverage report -m coverage xml -o coverage.xml + echo "report=true" >> "$GITHUB_OUTPUT" - name: Code Coverage Summary Report + if: steps.coverage.outputs.report == 'true' uses: irongut/CodeCoverageSummary@v1.3.0 with: filename: 'coverage.xml' @@ -120,7 +148,8 @@ jobs: output: 'both' hide_complexity: true - name: Write to Job Summary + if: steps.coverage.outputs.report == 'true' run: cat code-coverage-results.md >> $GITHUB_STEP_SUMMARY - name: Update .pot files - run: noviat_export_and_push_pot https://x-access-token:${{ secrets.PRIVATE_TOKEN }}@github.com/${{ github.repository }} + run: noviat_export_and_push_pot https://github.com/${{ github.repository }} if: ${{ matrix.makepot == 'true' && github.event_name == 'push' }} diff --git a/.github/workflows/update-addons-table.yml b/.github/workflows/update-addons-table.yml new file mode 100644 index 0000000..55fd435 --- /dev/null +++ b/.github/workflows/update-addons-table.yml @@ -0,0 +1,42 @@ +name: Update addons table after merge + +on: + push: + branches: + - "18.0" + paths-ignore: + - "README.md" + +permissions: + contents: write + +jobs: + gen-addons-table: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + with: + persist-credentials: false + fetch-depth: 0 + - uses: actions/setup-python@v7 + with: + python-version: "3.11" + - name: Install pre-commit + run: pip install pre-commit + - name: Run the manual hook to (re)generate the addons table + run: pre-commit run -a --hook-stage manual oca-gen-addons-table + continue-on-error: true + - name: Commit & push if changed + env: + TOKEN: ${{ secrets.PRIVATE_TOKEN }} + run: | + if ! git diff --quiet; then + git config user.name "noviat-ci-bot" + git config user.email "bot+ci@noviat.com" + git add -A + git commit -m "update addons table" + # Header instead of URL credentials, see test.yml + git config http.https://github.com/.extraheader "AUTHORIZATION: basic $(printf 'x-access-token:%s' "$TOKEN" | base64 -w0)" + git config --global --add safe.directory "$GITHUB_WORKSPACE" + git push origin HEAD:18.0 + fi diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index bff66f6..9cc3fae 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -22,7 +22,7 @@ exclude: | (LICENSE.*|COPYING.*) default_language_version: python: python3 - node: "22.9.0" + node: "22.23.3" repos: - repo: local hooks: @@ -39,25 +39,38 @@ repos: language: fail files: '[a-zA-Z0-9_]*/i18n/en\.po$' - repo: https://github.com/sbidoul/whool - rev: v1.2 + rev: v1.3 hooks: - id: whool-init + additional_dependencies: + # force a fresh pre-commit env: up-to-date core addons lists and + # Odoo 20 support (since v1.16.0) + - manifestoo-core>=1.16.1 - repo: https://github.com/oca/maintainer-tools - rev: b89f767503be6ab2b11e4f50a7557cb20066e667 + rev: b8311a95009805a6e5593f0390f52c0fa350117f hooks: # update the NOT INSTALLABLE ADDONS section above - id: oca-update-pre-commit-excluded-addons - id: oca-fix-manifest-website args: ["https://www.noviat.com/"] - id: oca-gen-external-dependencies + additional_dependencies: + # an outdated manifestoo-core ignores recent core addons, and wipes + # requirements.txt on an Odoo series it does not know + - manifestoo-core>=1.16.1 - id: oca-gen-addons-table + stages: [manual] - repo: https://github.com/OCA/odoo-pre-commit-hooks - rev: v0.0.33 + rev: v0.2.27 hooks: - id: oca-checks-odoo-module + - id: oca-checks-odoo-module-fixit + args: + - --disable=use-header-comments - id: oca-checks-po args: - --disable=po-pretty-format + - --fix - repo: local hooks: - id: prettier @@ -71,8 +84,8 @@ repos: files: \.(css|htm|html|js|json|jsx|less|md|scss|toml|ts|xml|yaml|yml)$ language: node additional_dependencies: - - "prettier@3.3.3" - - "@prettier/plugin-xml@3.4.1" + - "prettier@3.9.9" + - "@prettier/plugin-xml@3.4.2" - repo: local hooks: - id: eslint @@ -85,10 +98,11 @@ repos: types: [javascript] language: node additional_dependencies: - - "eslint@9.12.0" - - "eslint-plugin-jsdoc@50.3.1" + - "eslint@10.11.0" + - "eslint-plugin-jsdoc@65.0.0" + - "globals@17.12.0" - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.6.0 + rev: v6.0.0 hooks: - id: trailing-whitespace # exclude autogenerated files @@ -97,8 +111,6 @@ repos: # exclude autogenerated files exclude: /README\.rst$|\.pot?$ - id: debug-statements - - id: fix-encoding-pragma - args: ["--remove"] - id: check-case-conflict - id: check-docstring-first - id: check-executables-have-shebangs @@ -109,21 +121,30 @@ repos: - id: check-xml - id: mixed-line-ending args: ["--fix=lf"] + - repo: https://github.com/asottile/pyupgrade + rev: v3.21.2 + hooks: + - id: pyupgrade - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.6.8 + rev: v0.16.9 hooks: - id: ruff args: [--fix, --exit-non-zero-on-fix] - id: ruff-format + # markdown is prettier's job (ruff >= 0.16 also formats its code blocks) + types_or: [python, pyi, jupyter] - repo: https://github.com/OCA/pylint-odoo - rev: v9.1.3 + rev: v10.0.11 hooks: - id: pylint_odoo - name: pylint with optional checks + name: pylint (optional, core only) args: - --rcfile=.pylintrc - --exit-zero verbose: true - id: pylint_odoo + name: pylint-odoo (mandatory, blocking) args: + - --disable=missing-readme - --rcfile=.pylintrc-mandatory + verbose: true diff --git a/.pylintrc b/.pylintrc index 6f3a412..b3e77fc 100644 --- a/.pylintrc +++ b/.pylintrc @@ -1,9 +1,11 @@ - [MASTER] ignore-patterns=["^.*/TODO/.*$"] load-plugins=pylint_odoo score=n +[IMPORTS] +deprecated-modules=pdb,pudb,ipdb,bs4 + [ODOOLINT] #readme-template-url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst" manifest-required-authors=Noviat @@ -22,22 +24,15 @@ disable=all # .pylintrc-mandatory containing only mandatory checks is used the pre-commit # config as a blocking check. -enable=anomalous-backslash-in-string, - api-one-deprecated, - api-one-multi-together, +enable = + anomalous-backslash-in-string, assignment-from-none, attribute-deprecated, - class-camelcase, dangerous-default-value, - dangerous-view-replace-wo-priority, + deprecated-module, development-status-allowed, - duplicate-id-csv, duplicate-key, - duplicate-xml-fields, - duplicate-xml-record-id, - eval-referenced, eval-used, - incoherent-interpreter-exec-perm, license-allowed, manifest-author-string, manifest-deprecated-key, @@ -48,73 +43,73 @@ enable=anomalous-backslash-in-string, method-inverse, method-required-super, method-search, - openerp-exception-warning, pointless-statement, pointless-string-statement, print-used, redundant-keyword-arg, - redundant-modulename-xml, reimported, - relative-import, return-in-init, - rst-syntax-error, sql-injection, too-few-format-args, translation-field, translation-required, unreachable, use-vim-comment, - wrong-tabs-instead-of-spaces, - xml-syntax-error, + # >= 15 attribute-string-redundant, - character-not-valid-in-resource-link, consider-merging-classes-inherited, context-overridden, - create-user-wo-reset-password, - dangerous-filter-wo-user, - dangerous-qweb-replace-wo-priority, - deprecated-data-xml-node, - deprecated-openerp-xml-node, - duplicate-po-message-definition, except-pass, - file-not-used, invalid-commit, + manifest-external-assets, manifest-maintainers-list, - missing-newline-extrafiles, - # missing-readme, + missing-readme, missing-return, odoo-addons-relative-import, - old-api7-method-defined, - po-msgstr-variables, - po-syntax-error, + odoo-exception-warning, renamed-field-parameter, resource-not-exist, - str-format-used, test-folder-imported, translation-contains-variable, translation-positional-used, - unnecessary-utf8-coding-comment, website-manifest-key-not-valid-uri, - xml-attribute-translatable, - xml-deprecated-qweb-directive, - xml-deprecated-tree-attribute, + # >= 16 external-request-timeout, + # >= 19 + bad-builtin-groupby, + category-allowed, + deprecated-name-get, + deprecated-odoo-model-method, + deprecated-self-cr, + inheritable-method-lambda, + inheritable-method-string, + invalid-email, + manifest-behind-migrations, + manifest-data-duplicated, + missing-odoo-file, + no-raise-unlink, + no-search-all, + no-wizard-in-models, + prohibited-method-override, + prefer-env-translation, + translation-format-interpolation, + translation-format-truncated, + translation-injection, + translation-fstring-interpolation, + translation-not-lazy, + translation-too-few-args, + translation-too-many-args, + translation-unsupported-format, + no-write-in-compute, + odoolint, + # >= 20 + manifest-summary-multiline, # messages that do not cause the lint step to fail consider-merging-classes-inherited, - create-user-wo-reset-password, - dangerous-filter-wo-user, - deprecated-module, - file-not-used, invalid-commit, - missing-manifest-dependency, - missing-newline-extrafiles, - # missing-readme, - no-utf8-coding-comment, + missing-readme, odoo-addons-relative-import, - old-api7-method-defined, - redefined-builtin, - too-complex, - unnecessary-utf8-coding-comment + redefined-builtin [REPORTS] diff --git a/.pylintrc-mandatory b/.pylintrc-mandatory index ef3d59a..cd769dc 100644 --- a/.pylintrc-mandatory +++ b/.pylintrc-mandatory @@ -3,6 +3,9 @@ ignore-patterns=["^.*/TODO/.*$"] load-plugins=pylint_odoo score=n +[IMPORTS] +deprecated-modules=pdb,pudb,ipdb,bs4 + [ODOOLINT] #readme-template-url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst" manifest-required-authors=Noviat @@ -14,22 +17,15 @@ valid-odoo-versions=18.0 [MESSAGES CONTROL] disable=all -enable=anomalous-backslash-in-string, - api-one-deprecated, - api-one-multi-together, +enable = + anomalous-backslash-in-string, assignment-from-none, attribute-deprecated, - class-camelcase, dangerous-default-value, - dangerous-view-replace-wo-priority, + deprecated-module, development-status-allowed, - duplicate-id-csv, duplicate-key, - duplicate-xml-fields, - duplicate-xml-record-id, - eval-referenced, eval-used, - incoherent-interpreter-exec-perm, license-allowed, manifest-author-string, manifest-deprecated-key, @@ -40,57 +36,67 @@ enable=anomalous-backslash-in-string, method-inverse, method-required-super, method-search, - openerp-exception-warning, pointless-statement, pointless-string-statement, print-used, redundant-keyword-arg, - redundant-modulename-xml, reimported, - relative-import, return-in-init, - rst-syntax-error, sql-injection, too-few-format-args, translation-field, translation-required, unreachable, use-vim-comment, - wrong-tabs-instead-of-spaces, - xml-syntax-error, + # >= 15 attribute-string-redundant, - character-not-valid-in-resource-link, consider-merging-classes-inherited, context-overridden, - create-user-wo-reset-password, - dangerous-filter-wo-user, - dangerous-qweb-replace-wo-priority, - deprecated-data-xml-node, - deprecated-openerp-xml-node, - duplicate-po-message-definition, except-pass, - file-not-used, invalid-commit, + manifest-external-assets, manifest-maintainers-list, - missing-newline-extrafiles, - # missing-readme, + missing-readme, missing-return, odoo-addons-relative-import, - old-api7-method-defined, - po-msgstr-variables, - po-syntax-error, + odoo-exception-warning, renamed-field-parameter, resource-not-exist, - str-format-used, test-folder-imported, translation-contains-variable, translation-positional-used, - unnecessary-utf8-coding-comment, website-manifest-key-not-valid-uri, - xml-attribute-translatable, - xml-deprecated-qweb-directive, - xml-deprecated-tree-attribute, - external-request-timeout + # >= 16 + external-request-timeout, + # >= 19 + bad-builtin-groupby, + category-allowed, + deprecated-name-get, + deprecated-odoo-model-method, + deprecated-self-cr, + inheritable-method-lambda, + inheritable-method-string, + invalid-email, + manifest-behind-migrations, + manifest-data-duplicated, + missing-odoo-file, + no-raise-unlink, + no-search-all, + no-wizard-in-models, + prohibited-method-override, + prefer-env-translation, + translation-format-interpolation, + translation-format-truncated, + translation-injection, + translation-fstring-interpolation, + translation-not-lazy, + translation-too-few-args, + translation-too-many-args, + translation-unsupported-format, + no-write-in-compute, + odoolint, + # >= 20 + manifest-summary-multiline [REPORTS] msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg} diff --git a/.ruff.toml b/.ruff.toml index 5e63128..b153261 100644 --- a/.ruff.toml +++ b/.ruff.toml @@ -3,7 +3,14 @@ target-version = "py310" fix = true [lint] -extend-select = [ +# Explicit rule set: ruff >= 0.16 enables 413 rules by default, many of which go +# against Odoo idioms (naive UTC datetimes, `self = self.with_context()`, list +# `_inherit`). "E4", "E7", "E9" and "F" are the defaults of ruff < 0.16. +select = [ + "E4", + "E7", + "E9", + "F", "B", "C90", "E501", # line too long (default 88) diff --git a/README.md b/README.md index 9794660..0a56c04 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ [![Pre-commit Status](https://github.com/Noviat/account_ebics/actions/workflows/pre-commit.yml/badge.svg?branch=18.0)](https://github.com/Noviat/account_ebics/actions/workflows/pre-commit.yml?query=branch%3A18.0) [![Build Status](https://github.com/Noviat/account_ebics/actions/workflows/test.yml/badge.svg?branch=18.0)](https://github.com/Noviat/account_ebics/actions/workflows/test.yml?query=branch%3A18.0) - # Modules dedicated to manage the EBICS protocol diff --git a/test-requirements.txt b/test-requirements.txt index 3626b17..b00c004 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1,3 +1,4 @@ odoo-addon-module_change_auto_install openupgradelib cryptography<37 +lxml_html_clean