commit 6fdeb820b1d763afe9c5f5d9d4f7735290258a4a Author: Luc De Meyer Date: Sun Mar 1 20:52:57 2026 +0100 [INIT] 19.0: CI config diff --git a/.copier-answers.yml b/.copier-answers.yml new file mode 100644 index 0000000..bca23c1 --- /dev/null +++ b/.copier-answers.yml @@ -0,0 +1,13 @@ +# Do NOT update manually; changes here will be overwritten by Copier +_commit: v7.3.0 +_src_path: git@github.com:Noviat-CI/addons-repo-template.git +ci_disable_autoinstall_modules: '' +odoo_test_flavor: Both +odoo_version: 19.0 +org_slug: Noviat-Generic +rebel_module_groups: [] +repo_name: account_ebics +repo_slug: Modules dedicated to manage the EBICS protocol +repo_type: customer +weblate_project_name: noviat-generic-account-ebics-v19 + diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..bfd7ac5 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,20 @@ +# Configuration for known file extensions +[*.{css,js,json,less,md,py,rst,sass,scss,xml,yaml,yml}] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.{json,yml,yaml,rst,md}] +indent_size = 2 + +# Do not configure editor for libs and autogenerated content +[{*/static/{lib,src/lib}/**,*/static/description/index.html,*/readme/../README.rst}] +charset = unset +end_of_line = unset +indent_size = unset +indent_style = unset +insert_final_newline = false +trim_trailing_whitespace = false diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml new file mode 100644 index 0000000..5036672 --- /dev/null +++ b/.github/workflows/pre-commit.yml @@ -0,0 +1,47 @@ +name: pre-commit + +on: + pull_request: + branches: + - "19.0*" + push: + branches: + - "19.0" + +jobs: + pre-commit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + 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 + with: + path: ~/.cache/pre-commit + key: pre-commit|${{ env.PY }}|${{ hashFiles('.pre-commit-config.yaml') }} + - name: Install pre-commit + run: pip install pre-commit + - name: Run pre-commit + run: pre-commit run --all-files --show-diff-on-failure --color=always + env: + # Consider valid a PR that changes README fragments but doesn't + # change the README.rst file itself. It's not really a problem + # because the bot will update it anyway after merge. This way, we + # lower the barrier for functional contributors that want to fix the + # readme fragments, while still letting developers get README + # auto-generated (which also helps functionals when using runboat). + # DOCS https://pre-commit.com/#temporarily-disabling-hooks + SKIP: oca-gen-addon-readme + - name: Check that all files generated by pre-commit are in git + run: | + newfiles="$(git ls-files --others --exclude-from=.gitignore)" + if [ "$newfiles" != "" ] ; then + echo "Please check-in the following files:" + echo "$newfiles" + exit 1 + fi diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..343ae8f --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,137 @@ +name: tests + +on: + pull_request: + branches: + - "19.0*" + push: + branches: + - "19.0" + +jobs: + unreleased-deps: + runs-on: ubuntu-latest + name: Detect unreleased dependencies + steps: + - uses: actions/checkout@v4 + - 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) + # 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 + fi + fi + done + test: + runs-on: ubuntu-latest + container: ${{ matrix.container }} + name: ${{ matrix.name }} + permissions: + pull-requests: write + contents: write + strategy: + fail-fast: false + matrix: + include: + - container: ghcr.io/oca/oca-ci/py3.10-odoo19.0:latest + name: test with Odoo Community + odoo_enterprise : 0 + exclude_modules : "" + - container: ghcr.io/oca/oca-ci/py3.10-odoo19.0:latest + name: test with Odoo Enterprise + odoo_enterprise : 1 + exclude_modules : "" + makepot: "true" + services: + postgres: + image: postgres:12.0 + env: + POSTGRES_USER: odoo + POSTGRES_PASSWORD: odoo + POSTGRES_DB: odoo + ports: + - 5432:5432 + env: + INSTALL_ADDONS_DIR: "/tmp/addons-merged" + ADDITIONAL_ADDONS_DIR: "/tmp/additional-addons" + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + - 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 + 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 19.0 /opt/enterprise + - name: Clone Noviat Dependencies + env: + PRIVATE_TOKEN: ${{ secrets.PRIVATE_TOKEN }} + run: clone_oca_dependencies_by_noviat + - name: Create addons path + run: | + mkdir -p ${{ env.INSTALL_ADDONS_DIR }}/setup + find $(realpath $ADDONS_DIR) $(realpath ${{ env.ADDITIONAL_ADDONS_DIR }}) -name __manifest__.py -exec sh -c 'ln -s "$(dirname "$0")" "${{ env.INSTALL_ADDONS_DIR }}"' {} \; + find $(realpath $ADDONS_DIR) $(realpath ${{ env.ADDITIONAL_ADDONS_DIR }}) -iwholename '*/setup/*/setup.py' -exec sh -c 'ln -s "$(dirname "$0")" "${{ env.INSTALL_ADDONS_DIR }}/setup"' {} \; + if [ -n ${{ matrix.exclude}} ] + then + remove_excluded_modules ${{ env.INSTALL_ADDONS_DIR }} ${{ matrix.exclude }} + fi + - name: Update addons path with enterprise + if: ${{ matrix.odoo_enterprise == 1 }} + run: | + echo "ADDONS_PATH=/opt/odoo/addons,/opt/enterprise,${{ env.INSTALL_ADDONS_DIR }}" >> $GITHUB_ENV + - name: Update addons path without enterprise + if: ${{ matrix.odoo_enterprise == 0 }} + run: | + echo "ADDONS_PATH=/opt/odoo/addons,${{ env.INSTALL_ADDONS_DIR }}" >> $GITHUB_ENV + - name: Add addons to EXCLUDE PATH + if: ${{ matrix.EXCLUDE_MODULES }} + 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: Initialize test db + run: oca_init_test_database + - name: Run tests + run: oca_run_tests + - name: Generate coverage files + run: | + coverage report -m + coverage xml -o coverage.xml + - name: Code Coverage Summary Report + uses: irongut/CodeCoverageSummary@v1.3.0 + with: + filename: 'coverage.xml' + badge: true + format: 'markdown' + output: 'both' + hide_complexity: true + - name: Write to Job Summary + 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 }} + 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..44e4010 --- /dev/null +++ b/.github/workflows/update-addons-table.yml @@ -0,0 +1,41 @@ +name: Update addons table after merge + +on: + push: + branches: + - "19.0" + paths-ignore: + - "README.md" + +permissions: + contents: write + +jobs: + gen-addons-table: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + fetch-depth: 0 + - uses: actions/setup-python@v5 + 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: + PUSH_URL: https://x-access-token:${{ secrets.PRIVATE_TOKEN }}@github.com/${{ github.repository }}.git + 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" + git remote set-url origin "$PUSH_URL" + git config --global --add safe.directory "$GITHUB_WORKSPACE" + git push origin HEAD:19.0 + fi diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fa3b868 --- /dev/null +++ b/.gitignore @@ -0,0 +1,85 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +/.venv +/.pytest_cache +/.ruff_cache + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +bin/ +build/ +develop-eggs/ +dist/ +eggs/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg +*.eggs + +# Windows installers +*.msi + +# Debian packages +*.deb + +# Redhat packages +*.rpm + +# MacOS packages +*.dmg +*.pkg + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.cache +nosetests.xml +coverage.xml + +# Translations +*.mo + +# Pycharm +.idea + +# Eclipse +.settings + +# Visual Studio cache/options directory +.vs/ +.vscode + +# OSX Files +.DS_Store + +# Django stuff: +*.log + +# Mr Developer +.mr.developer.cfg +.project +.pydevproject + +# Rope +.ropeproject + +# Sphinx documentation +docs/_build/ + +# Backup files +*~ +*.swp diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..7f8d6c1 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,139 @@ + + +exclude: | + (?x) + # NOT INSTALLABLE ADDONS + # END NOT INSTALLABLE ADDONS + # Files and folders generated by bots, to avoid loops + ^setup/|/static/description/index\.html$| + # We don't want to mess with tool-generated files + .svg$|/tests/([^/]+/)?cassettes/|^.copier-answers.yml$|^.github/|^eslint.config.cjs|^prettier.config.cjs| + # Maybe reactivate this when all README files include prettier ignore tags? + ^README\.md$| + # Library files can have extraneous formatting (even minimized) + /static/(src/)?lib/| + # Repos using Sphinx to generate docs don't need prettying + ^docs/_templates/.*\.html$| + # Don't bother non-technical authors with formatting issues in docs + readme/.*\.(rst|md)$| + # Ignore build and dist directories in addons + /build/|/dist/| + # Ignore test files in addons + /tests/samples/.*| + # You don't usually want a bot to modify your legal texts + (LICENSE.*|COPYING.*) +default_language_version: + python: python3 + node: "22.9.0" +repos: + - repo: local + hooks: + # These files are most likely copier diff rejection junks; if found, + # review them manually, fix the problem (if needed) and remove them + - id: forbidden-files + name: forbidden files + entry: found forbidden files; remove them + language: fail + files: "\\.rej$" + - id: en-po-files + name: en.po files cannot exist + entry: found a en.po file + language: fail + files: '[a-zA-Z0-9_]*/i18n/en\.po$' + - repo: https://github.com/sbidoul/whool + rev: v1.3 + hooks: + - id: whool-init + - repo: https://github.com/oca/maintainer-tools + rev: 71aa4caec15e8c1456b4da19e9f39aa0aa7377a9 + 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 + - id: oca-gen-addons-table + stages: [manual] + - repo: https://github.com/OCA/odoo-pre-commit-hooks + rev: v0.2.20 + hooks: + - id: oca-checks-odoo-module + - id: oca-checks-po + args: + - --disable=po-pretty-format + - --fix + - repo: local + hooks: + - id: prettier + name: prettier (with plugin-xml) + entry: prettier + args: + - --write + - --list-different + - --ignore-unknown + types: [text] + files: \.(css|htm|html|js|json|jsx|less|md|scss|toml|ts|xml|yaml|yml)$ + language: node + additional_dependencies: + - "prettier@3.8.1" + - "@prettier/plugin-xml@3.4.2" + - repo: local + hooks: + - id: eslint + name: eslint + entry: eslint + args: + - --color + - --fix + verbose: true + types: [javascript] + language: node + additional_dependencies: + - "eslint@9.39.3" + - "eslint-plugin-jsdoc@62.7.1" + - "globals@16.0.0" + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v6.0.0 + hooks: + - id: trailing-whitespace + # exclude autogenerated files + exclude: /README\.rst$|\.pot?$ + - id: end-of-file-fixer + # exclude autogenerated files + exclude: /README\.rst$|\.pot?$ + - id: debug-statements + - id: check-case-conflict + - id: check-docstring-first + - id: check-executables-have-shebangs + - id: check-merge-conflict + # exclude files where underlines are not distinguishable from merge conflicts + exclude: /README\.rst$|^docs/.*\.rst$ + - id: check-symlinks + - 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.15.2 + hooks: + - id: ruff + args: [--fix, --exit-non-zero-on-fix] + - id: ruff-format + - repo: https://github.com/OCA/pylint-odoo + rev: v10.0.1 + hooks: + - id: pylint_odoo + 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 new file mode 100644 index 0000000..03a264c --- /dev/null +++ b/.pylintrc @@ -0,0 +1,110 @@ +[MASTER] +ignore-patterns=["^.*/TODO/.*$"] +load-plugins=pylint_odoo +score=n + +[ODOOLINT] +#readme-template-url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst" +manifest-required-authors=Noviat +manifest-required-keys=license +manifest-deprecated-keys=description,active +license-allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3 +valid-odoo-versions=19.0 + +[MESSAGES CONTROL] +disable=all + +# This .pylintrc contains optional AND mandatory checks and is meant to be +# loaded in an IDE to have it check everything, in the hope this will make +# optional checks more visible to contributors who otherwise never look at a +# green travis to see optional checks that failed. +# .pylintrc-mandatory containing only mandatory checks is used the pre-commit +# config as a blocking check. + +enable = + anomalous-backslash-in-string, + assignment-from-none, + attribute-deprecated, + dangerous-default-value, + development-status-allowed, + duplicate-key, + eval-used, + license-allowed, + manifest-author-string, + manifest-deprecated-key, + # manifest-required-author, + manifest-required-key, + manifest-version-format, + method-compute, + method-inverse, + method-required-super, + method-search, + pointless-statement, + pointless-string-statement, + print-used, + redundant-keyword-arg, + reimported, + return-in-init, + sql-injection, + too-few-format-args, + translation-field, + translation-required, + unreachable, + use-vim-comment, + # >= 15 + attribute-string-redundant, + consider-merging-classes-inherited, + context-overridden, + except-pass, + invalid-commit, + manifest-maintainers-list, + missing-readme, + missing-return, + odoo-addons-relative-import, + renamed-field-parameter, + resource-not-exist, + test-folder-imported, + translation-contains-variable, + translation-positional-used, + website-manifest-key-not-valid-uri, + # >= 16 + external-request-timeout, + # >= 19 + bad-builtin-groupby, + category-allowed, + deprecated-name-get, + deprecated-odoo-model-method, + 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-fstring-interpolation, + translation-not-lazy, + translation-too-few-args, + translation-too-many-args, + translation-unsupported-format, + no-write-in-compute, + odoolint, + # messages that do not cause the lint step to fail + consider-merging-classes-inherited, + deprecated-module, + invalid-commit, + missing-readme, + odoo-addons-relative-import, + redefined-builtin, + manifest-external-assets + + +[REPORTS] +msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg} +output-format=colorized +reports=no diff --git a/.pylintrc-mandatory b/.pylintrc-mandatory new file mode 100644 index 0000000..c75030d --- /dev/null +++ b/.pylintrc-mandatory @@ -0,0 +1,94 @@ +[MASTER] +ignore-patterns=["^.*/TODO/.*$"] +load-plugins=pylint_odoo +score=n + +[ODOOLINT] +#readme-template-url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst" +manifest-required-authors=Noviat +manifest-required-keys=license +manifest-deprecated-keys=description,active +license-allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3 +valid-odoo-versions=19.0 + +[MESSAGES CONTROL] +disable=all + +enable = + anomalous-backslash-in-string, + assignment-from-none, + attribute-deprecated, + dangerous-default-value, + development-status-allowed, + duplicate-key, + eval-used, + license-allowed, + manifest-author-string, + manifest-deprecated-key, + # manifest-required-author, + manifest-required-key, + manifest-version-format, + method-compute, + method-inverse, + method-required-super, + method-search, + pointless-statement, + pointless-string-statement, + print-used, + redundant-keyword-arg, + reimported, + return-in-init, + sql-injection, + too-few-format-args, + translation-field, + translation-required, + unreachable, + use-vim-comment, + # >= 15 + attribute-string-redundant, + consider-merging-classes-inherited, + context-overridden, + except-pass, + invalid-commit, + manifest-maintainers-list, + missing-readme, + missing-return, + odoo-addons-relative-import, + renamed-field-parameter, + resource-not-exist, + test-folder-imported, + translation-contains-variable, + translation-positional-used, + website-manifest-key-not-valid-uri, + # >= 16 + external-request-timeout, + # >= 19 + bad-builtin-groupby, + category-allowed, + deprecated-name-get, + deprecated-odoo-model-method, + 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-fstring-interpolation, + translation-not-lazy, + translation-too-few-args, + translation-too-many-args, + translation-unsupported-format, + no-write-in-compute, + odoolint + +[REPORTS] +msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg} +output-format=colorized +reports=no diff --git a/.ruff.toml b/.ruff.toml new file mode 100644 index 0000000..5e63128 --- /dev/null +++ b/.ruff.toml @@ -0,0 +1,31 @@ + +target-version = "py310" +fix = true + +[lint] +extend-select = [ + "B", + "C90", + "E501", # line too long (default 88) + "I", # isort + "UP", # pyupgrade +] +extend-safe-fixes = ["UP008"] +exclude = ["setup/*"] + +[format] +exclude = ["setup/*"] + +[lint.per-file-ignores] +"__init__.py" = ["F401", "I001"] # ignore unused and unsorted imports in __init__.py +"__manifest__.py" = ["B018"] # useless expression + +[lint.isort] +section-order = ["future", "standard-library", "third-party", "odoo", "odoo-addons", "first-party", "local-folder"] + +[lint.isort.sections] +"odoo" = ["odoo"] +"odoo-addons" = ["odoo.addons"] + +[lint.mccabe] +max-complexity = 16 diff --git a/README.md b/README.md new file mode 100644 index 0000000..d793dd7 --- /dev/null +++ b/README.md @@ -0,0 +1,20 @@ +[![Pre-commit Status](https://github.com/Noviat-Generic/Modules dedicated to manage the EBICS protocol/actions/workflows/pre-commit.yml/badge.svg?branch=19.0)](https://github.com/Noviat-Generic/Modules dedicated to manage the EBICS protocol/actions/workflows/pre-commit.yml?query=branch%3A19.0) +[![Build Status](https://github.com/Noviat-Generic/Modules dedicated to manage the EBICS protocol/actions/workflows/test.yml/badge.svg?branch=19.0)](https://github.com/Noviat-Generic/Modules dedicated to manage the EBICS protocol/actions/workflows/test.yml?query=branch%3A19.0) +[![Translation state](https://translation.noviat.com/widget/noviat-generic-account-ebics-v19/multi-auto.svg)](https://translation.noviat.com/engage/noviat-generic-account-ebics-v19/) + + +# account_ebics + + + + + +[//]: # (addons) + +This part will be replaced when running the oca-gen-addons-table script from OCA/maintainer-tools. + +[//]: # (end addons) + + + +---- diff --git a/eslint.config.cjs b/eslint.config.cjs new file mode 100644 index 0000000..0d5731f --- /dev/null +++ b/eslint.config.cjs @@ -0,0 +1,202 @@ +jsdoc = require("eslint-plugin-jsdoc"); + +const config = [{ + plugins: { + jsdoc, + }, + + languageOptions: { + globals: { + _: "readonly", + $: "readonly", + fuzzy: "readonly", + jQuery: "readonly", + moment: "readonly", + odoo: "readonly", + openerp: "readonly", + owl: "readonly", + luxon: "readonly", + }, + + ecmaVersion: 2024, + sourceType: "script", + }, + + rules: { + "accessor-pairs": "warn", + "array-callback-return": "warn", + "callback-return": "warn", + "capitalized-comments": ["warn", "always", { + ignoreConsecutiveComments: true, + ignoreInlineComments: true, + }], + complexity: ["warn", 15], + "constructor-super": "warn", + "dot-notation": "warn", + eqeqeq: "warn", + "global-require": "warn", + "handle-callback-err": "warn", + "id-blacklist": "warn", + "id-match": "warn", + "init-declarations": "error", + "max-depth": "warn", + "max-nested-callbacks": "warn", + "max-statements-per-line": "warn", + "no-alert": "warn", + "no-array-constructor": "warn", + "no-caller": "warn", + "no-case-declarations": "warn", + "no-class-assign": "warn", + "no-cond-assign": "error", + "no-const-assign": "error", + "no-constant-condition": "warn", + "no-control-regex": "warn", + "no-debugger": "error", + "no-delete-var": "warn", + "no-div-regex": "warn", + "no-dupe-args": "error", + "no-dupe-class-members": "error", + "no-dupe-keys": "error", + "no-duplicate-case": "error", + "no-duplicate-imports": "error", + "no-else-return": "warn", + "no-empty-character-class": "warn", + "no-empty-function": "error", + "no-empty-pattern": "error", + "no-empty": "warn", + "no-eq-null": "error", + "no-eval": "error", + "no-ex-assign": "error", + "no-extend-native": "warn", + "no-extra-bind": "warn", + "no-extra-boolean-cast": "warn", + "no-extra-label": "warn", + "no-fallthrough": "warn", + "no-func-assign": "error", + "no-global-assign": "error", + "no-implicit-coercion": ["warn", { + allow: ["~"], + }], + "no-implicit-globals": "warn", + "no-implied-eval": "warn", + "no-inline-comments": "warn", + "no-inner-declarations": "warn", + "no-invalid-regexp": "warn", + "no-irregular-whitespace": "warn", + "no-iterator": "warn", + "no-label-var": "warn", + "no-labels": "warn", + "no-lone-blocks": "warn", + "no-lonely-if": "error", + "no-mixed-requires": "error", + "no-multi-str": "warn", + "no-native-reassign": "error", + "no-negated-condition": "warn", + "no-negated-in-lhs": "error", + "no-new-func": "warn", + "no-new-object": "warn", + "no-new-require": "warn", + "no-new-symbol": "warn", + "no-new-wrappers": "warn", + "no-new": "warn", + "no-obj-calls": "warn", + "no-octal-escape": "warn", + "no-octal": "warn", + "no-param-reassign": "warn", + "no-path-concat": "warn", + "no-process-env": "warn", + "no-process-exit": "warn", + "no-proto": "warn", + "no-prototype-builtins": "warn", + "no-redeclare": "warn", + "no-regex-spaces": "warn", + "no-restricted-globals": "warn", + "no-restricted-imports": "warn", + "no-restricted-modules": "warn", + "no-restricted-syntax": "warn", + "no-return-assign": "error", + "no-script-url": "warn", + "no-self-assign": "warn", + "no-self-compare": "warn", + "no-sequences": "warn", + "no-shadow-restricted-names": "warn", + "no-shadow": "warn", + "no-sparse-arrays": "warn", + "no-sync": "warn", + "no-this-before-super": "warn", + "no-throw-literal": "warn", + "no-undef-init": "warn", + "no-undef": "error", + "no-unmodified-loop-condition": "warn", + "no-unneeded-ternary": "error", + "no-unreachable": "error", + "no-unsafe-finally": "error", + "no-unused-expressions": "error", + "no-unused-labels": "error", + "no-unused-vars": "error", + "no-use-before-define": "error", + "no-useless-call": "warn", + "no-useless-computed-key": "warn", + "no-useless-concat": "warn", + "no-useless-constructor": "warn", + "no-useless-escape": "warn", + "no-useless-rename": "warn", + "no-void": "warn", + "no-with": "warn", + "operator-assignment": ["error", "always"], + "prefer-const": "warn", + radix: "warn", + "require-yield": "warn", + "sort-imports": "warn", + "spaced-comment": ["error", "always"], + strict: ["error", "function"], + "use-isnan": "error", + + "jsdoc/check-tag-names": "warn", + "jsdoc/check-types": "warn", + "jsdoc/require-param-description": "off", + "jsdoc/require-return": "off", + "jsdoc/require-return-description": "off", + "jsdoc/require-return-type": "off", + + "valid-typeof": "warn", + yoda: "warn", + }, + + settings: { + jsdoc: { + tagNamePreference: { + arg: "param", + argument: "param", + augments: "extends", + constructor: "class", + exception: "throws", + func: "function", + method: "function", + prop: "property", + return: "returns", + virtual: "abstract", + yield: "yields", + }, + preferredTypes: { + array: "Array", + bool: "Boolean", + boolean: "Boolean", + number: "Number", + object: "Object", + str: "String", + string: "String", + }, + }, + }, + +}, { + files: ["**/*.esm.js"], + + languageOptions: { + ecmaVersion: 2024, + sourceType: "module", + }, +}]; + +module.exports = config diff --git a/oca_dependencies.txt b/oca_dependencies.txt new file mode 100644 index 0000000..f7b0d50 --- /dev/null +++ b/oca_dependencies.txt @@ -0,0 +1,10 @@ +# See https://github.com/OCA/maintainer-quality-tools/blob/master/travis/clone_oca_dependencies +# The expected format for oca_dependencies.txt: +# * comment lines start with # and are ignored +# * a dependency line contains: +# - the name of the OCA project +# - (optional) the URL to the git repository (defaulting to the OCA repository) +# - (optional) the name of the branch to use (defaulting to ${VERSION}). It is +# required if you want to select a commit SHA in the next parameter. +# - (optional) the commit SHA1 to use. If you set this option you MUST specify +# the branch diff --git a/prettier.config.cjs b/prettier.config.cjs new file mode 100644 index 0000000..e66cd82 --- /dev/null +++ b/prettier.config.cjs @@ -0,0 +1,14 @@ +/** @type {import('prettier').Config} */ + +const config = { + // https://github.com/prettier/prettier/issues/15388#issuecomment-1717746872 + plugins: [require.resolve("@prettier/plugin-xml")], + bracketSpacing: false, + printWidth: 88, + proseWrap: "always", + semi: true, + trailingComma: "es5", + xmlWhitespaceSensitivity: "preserve", +}; + +module.exports = config; diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..9cd1629 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +# generated from manifests external_dependencies diff --git a/test-requirements.txt b/test-requirements.txt new file mode 100644 index 0000000..d2fce6c --- /dev/null +++ b/test-requirements.txt @@ -0,0 +1,3 @@ +odoo-addon-module_change_auto_install +openupgradelib +lxml_html_clean