diff --git a/.copier-answers.yml b/.copier-answers.yml index dc01ddd5..16cf89fc 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,8 +1,9 @@ # Do NOT update manually; changes here will be overwritten by Copier -_commit: v1.14.2 +_commit: v1.20 _src_path: gh:oca/oca-addons-repo-template +additional_ruff_rules: [] ci: GitHub -dependency_installation_mode: PIP +convert_readme_fragments_to_markdown: false generate_requirements_txt: true github_check_license: true github_ci_extra_env: {} @@ -11,14 +12,16 @@ github_enable_makepot: true github_enable_stale_action: true github_enforce_dev_status_compatibility: true include_wkhtmltopdf: false +odoo_test_flavor: Both odoo_version: 14.0 org_name: Odoo Community Association (OCA) org_slug: OCA rebel_module_groups: [] -repo_description: 'TODO: add repo description.' -repo_name: product-pack +repo_description: Sale and manage product pack (it's closed to kit nomenclature concept + with more options) +repo_name: Product pack repo_slug: product-pack repo_website: https://github.com/OCA/product-pack -travis_apt_packages: [] -travis_apt_sources: [] +use_pyproject_toml: false +use_ruff: true diff --git a/.eslintrc.yml b/.eslintrc.yml index 9429bc68..fed88d70 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -22,6 +22,7 @@ globals: odoo: readonly openerp: readonly owl: readonly + luxon: readonly # Styling is handled by Prettier, so we only need to enable AST rules; # see https://github.com/OCA/maintainer-quality-tools/pull/618#issuecomment-558576890 diff --git a/.flake8 b/.flake8 deleted file mode 100644 index e397e8ed..00000000 --- a/.flake8 +++ /dev/null @@ -1,12 +0,0 @@ -[flake8] -max-line-length = 88 -max-complexity = 16 -# B = bugbear -# B9 = bugbear opinionated (incl line length) -select = C,E,F,W,B,B9 -# E203: whitespace before ':' (black behaviour) -# E501: flake8 line length (covered by bugbear B950) -# W503: line break before binary operator (black behaviour) -ignore = E203,E501,W503 -per-file-ignores= - __init__.py:F401 diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 755f8a22..602ecbca 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -13,8 +13,10 @@ jobs: pre-commit: runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: actions/setup-python@v2 + with: + python-version: "3.11" - name: Get python version run: echo "PY=$(python -VV | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV - uses: actions/cache@v1 @@ -25,6 +27,15 @@ jobs: 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)" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 215b84b0..326c1255 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest name: Detect unreleased dependencies steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - run: | for reqfile in requirements.txt test-requirements.txt ; do if [ -f ${reqfile} ] ; then @@ -36,10 +36,10 @@ jobs: matrix: include: - container: ghcr.io/oca/oca-ci/py3.6-odoo14.0:latest - makepot: "true" name: test with Odoo - container: ghcr.io/oca/oca-ci/py3.6-ocb14.0:latest name: test with OCB + makepot: "true" services: postgres: image: postgres:9.6 @@ -50,7 +50,7 @@ jobs: ports: - 5432:5432 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: persist-credentials: false - name: Install addons and dependencies diff --git a/.gitignore b/.gitignore index 9c283fd4..0090721f 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ __pycache__/ *.py[cod] /.venv /.pytest_cache +/.ruff_cache # C extensions *.so diff --git a/.isort.cfg b/.isort.cfg deleted file mode 100644 index 0ec187ef..00000000 --- a/.isort.cfg +++ /dev/null @@ -1,13 +0,0 @@ -[settings] -; see https://github.com/psf/black -multi_line_output=3 -include_trailing_comma=True -force_grid_wrap=0 -combine_as_imports=True -use_parentheses=True -line_length=88 -known_odoo=odoo -known_odoo_addons=odoo.addons -sections=FUTURE,STDLIB,THIRDPARTY,ODOO,ODOO_ADDONS,FIRSTPARTY,LOCALFOLDER -default_section=THIRDPARTY -ensure_newline_before_comments = True diff --git a/.oca_hooks.cfg b/.oca_hooks.cfg new file mode 100644 index 00000000..1f3e3e42 --- /dev/null +++ b/.oca_hooks.cfg @@ -0,0 +1,2 @@ +[MESSAGES_CONTROL] +disable=xml-deprecated-data-node,xml-deprecated-tree-attribute diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 196c9077..360a873f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,6 +12,10 @@ exclude: | /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/| # You don't usually want a bot to modify your legal texts (LICENSE.*|COPYING.*) default_language_version: @@ -33,27 +37,25 @@ repos: language: fail files: '[a-zA-Z0-9_]*/i18n/en\.po$' - repo: https://github.com/oca/maintainer-tools - rev: ab1d7f6 + rev: 9a170331575a265c092ee6b24b845ec508e8ef75 hooks: # update the NOT INSTALLABLE ADDONS section above - id: oca-update-pre-commit-excluded-addons - id: oca-fix-manifest-website args: ["https://github.com/OCA/product-pack"] - - repo: https://github.com/myint/autoflake - rev: v1.4 - hooks: - - id: autoflake + - id: oca-gen-addon-readme args: - - --expand-star-imports - - --ignore-init-module-imports - - --in-place - - --remove-all-unused-imports - - --remove-duplicate-keys - - --remove-unused-variables - - repo: https://github.com/psf/black - rev: 22.3.0 + - --addons-dir=. + - --branch=14.0 + - --org-name=OCA + - --repo-name=product-pack + - --if-source-changed + - --keep-source-digest + - repo: https://github.com/OCA/odoo-pre-commit-hooks + rev: v0.0.25 hooks: - - id: black + - id: oca-checks-odoo-module + - id: oca-checks-po - repo: https://github.com/pre-commit/mirrors-prettier rev: v2.1.2 hooks: @@ -100,14 +102,6 @@ repos: hooks: - id: pyupgrade args: ["--keep-percent-format"] - - repo: https://github.com/PyCQA/isort - rev: 5.12.0 - hooks: - - id: isort - name: isort except __init__.py - args: - - --settings=. - exclude: /__init__\.py$ - repo: https://github.com/acsone/setuptools-odoo rev: 3.1.8 hooks: @@ -118,12 +112,12 @@ repos: - requirements.txt - --header - "# generated from manifests external_dependencies" - - repo: https://github.com/PyCQA/flake8 - rev: 3.8.3 + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.1.3 hooks: - - id: flake8 - name: flake8 - additional_dependencies: ["flake8-bugbear==20.1.4"] + - id: ruff + args: [--fix, --exit-non-zero-on-fix] + - id: ruff-format - repo: https://github.com/OCA/pylint-odoo rev: 7.0.2 hooks: diff --git a/.ruff.toml b/.ruff.toml new file mode 100644 index 00000000..d75c6d97 --- /dev/null +++ b/.ruff.toml @@ -0,0 +1,28 @@ + +fix = true + +[lint] +extend-select = [ + "B", + "C90", + "E501", # line too long (default 88) + "I", # isort +] +exclude = ["setup/*"] + +[format] +exclude = ["setup/*"] + +[per-file-ignores] +"__init__.py" = ["F401", "I001"] # ignore unused and unsorted imports in __init__.py +"__manifest__.py" = ["B018"] # useless expression + +[isort] +section-order = ["future", "standard-library", "third-party", "odoo", "odoo-addons", "first-party", "local-folder"] + +[isort.sections] +"odoo" = ["odoo"] +"odoo-addons" = ["odoo.addons"] + +[mccabe] +max-complexity = 16 diff --git a/README.md b/README.md index 86f80b0a..64c9de74 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,9 @@ -# product-pack +# Product pack -TODO: add repo description. +Sale and manage product pack (it's closed to kit nomenclature concept with more options) diff --git a/product_pack/models/product_pricelist.py b/product_pack/models/product_pricelist.py index ee72a6f9..ffb4132f 100644 --- a/product_pack/models/product_pricelist.py +++ b/product_pack/models/product_pricelist.py @@ -15,7 +15,7 @@ def _compute_price_rule(self, products_qty_partner, date=False, uom_id=False): products_qty_partner_super = [ (s[0], s[1], s[2]) for s in products_qty_partner - if not s[0] in s[0].split_pack_products()[0] + if s[0] not in s[0].split_pack_products()[0] ] res = super()._compute_price_rule( products_qty_partner_super, date=date, uom_id=uom_id diff --git a/product_pack/tests/test_product_pack.py b/product_pack/tests/test_product_pack.py index 3e4231e1..caf5e2c0 100644 --- a/product_pack/tests/test_product_pack.py +++ b/product_pack/tests/test_product_pack.py @@ -62,7 +62,7 @@ def test_get_pack_line_price(self): self.assertEqual( 30.0, self.cpu_detailed.pack_line_ids.filtered( - lambda l: l.product_id == component.product_id + lambda pack_line: pack_line.product_id == component.product_id ).get_price(), ) diff --git a/sale_product_pack/models/sale_order.py b/sale_product_pack/models/sale_order.py index 9e9a5785..a37d1dda 100644 --- a/sale_product_pack/models/sale_order.py +++ b/sale_product_pack/models/sale_order.py @@ -11,7 +11,7 @@ def copy(self, default=None): sale_copy = super().copy(default) # we unlink pack lines that should not be copied pack_copied_lines = sale_copy.order_line.filtered( - lambda l: l.pack_parent_line_id.order_id == self + lambda order_line: order_line.pack_parent_line_id.order_id == self ) pack_copied_lines.unlink() return sale_copy diff --git a/sale_product_pack/models/sale_order_line.py b/sale_product_pack/models/sale_order_line.py index 663eeb71..b6a6b072 100644 --- a/sale_product_pack/models/sale_order_line.py +++ b/sale_product_pack/models/sale_order_line.py @@ -32,7 +32,10 @@ class SaleOrderLine(models.Model): do_no_expand_pack_lines = fields.Boolean( compute="_compute_do_no_expand_pack_lines", - help="This is a technical field in order to check if pack lines has to be expanded", + help=( + "This is a technical field in order to check if pack lines has " + "to be expanded" + ), ) @api.depends_context("update_prices", "update_pricelist") @@ -57,7 +60,8 @@ def expand_pack_line(self, write=False): if write: existing_subline = first( self.pack_child_line_ids.filtered( - lambda child: child.product_id == subline.product_id + lambda child, pack_line=subline: child.product_id + == pack_line.product_id ) ) # if subline already exists we update, if not we create