diff --git a/.eslintrc b/.eslintrc
new file mode 100644
index 00000000..28a0808b
--- /dev/null
+++ b/.eslintrc
@@ -0,0 +1,291 @@
+{
+ "globals": {
+ "$": false,
+ "_": false,
+ "fuzzy": false,
+ "jQuery": false,
+ "moment": false,
+ "odoo": false,
+ "openerp": false,
+ "self": false
+ },
+ "env": {
+ "browser": true
+ },
+ "rules": {
+ "no-alert": "warn",
+ "no-array-constructor": "warn",
+ "no-bitwise": "off",
+ "no-caller": "warn",
+ "no-case-declarations": "warn",
+ "no-catch-shadow": "warn",
+ "no-class-assign": "warn",
+ "no-cond-assign": "warn",
+ "no-confusing-arrow": "warn",
+ "no-console": "off",
+ "no-const-assign": "warn",
+ "no-constant-condition": "warn",
+ "no-continue": "off",
+ "no-control-regex": "warn",
+ "no-debugger": "warn",
+ "no-delete-var": "warn",
+ "no-div-regex": "warn",
+ "no-dupe-args": "warn",
+ "no-dupe-class-members": "warn",
+ "no-dupe-keys": "warn",
+ "no-duplicate-case": "warn",
+ "no-duplicate-imports": "warn",
+ "no-else-return": "warn",
+ "no-empty": "warn",
+ "no-empty-character-class": "warn",
+ "no-empty-function": "warn",
+ "no-empty-pattern": "warn",
+ "no-eq-null": "warn",
+ "no-eval": "warn",
+ "no-ex-assign": "warn",
+ "no-extend-native": "warn",
+ "no-extra-bind": "warn",
+ "no-extra-boolean-cast": "warn",
+ "no-extra-label": "warn",
+ "no-extra-parens": "warn",
+ "no-extra-semi": "warn",
+ "no-fallthrough": "warn",
+ "no-floating-decimal": "warn",
+ "no-func-assign": "warn",
+ "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-invalid-this": "off",
+ "no-irregular-whitespace": "warn",
+ "no-iterator": "warn",
+ "no-label-var": "warn",
+ "no-labels": "warn",
+ "no-lone-blocks": "warn",
+ "no-lonely-if": "warn",
+ "no-loop-func": "off",
+ "no-magic-numbers": "off",
+ "no-mixed-operators": "warn",
+ "no-mixed-requires": "warn",
+ "no-mixed-spaces-and-tabs": "warn",
+ "no-multi-spaces": "warn",
+ "no-multi-str": "warn",
+ "no-multiple-empty-lines": "warn",
+ "no-native-reassign": "warn",
+ "no-negated-condition": "warn",
+ "no-negated-in-lhs": "warn",
+ "no-nested-ternary": "off",
+ "no-new": "warn",
+ "no-new-func": "warn",
+ "no-new-object": "warn",
+ "no-new-require": "warn",
+ "no-new-symbol": "warn",
+ "no-new-wrappers": "warn",
+ "no-obj-calls": "warn",
+ "no-octal": "warn",
+ "no-octal-escape": "warn",
+ "no-param-reassign": "warn",
+ "no-path-concat": "warn",
+ "no-plusplus": "off",
+ "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": "warn",
+ "no-script-url": "warn",
+ "no-self-assign": "warn",
+ "no-self-compare": "warn",
+ "no-sequences": "warn",
+ "no-shadow": "warn",
+ "no-shadow-restricted-names": "warn",
+ "no-whitespace-before-property": "warn",
+ "no-spaced-func": "warn",
+ "no-sparse-arrays": "warn",
+ "no-sync": "warn",
+ "no-tabs": "warn",
+ "no-ternary": "off",
+ "no-trailing-spaces": "warn",
+ "no-this-before-super": "warn",
+ "no-throw-literal": "warn",
+ "no-undef": "warn",
+ "no-undef-init": "warn",
+ "no-undefined": "off",
+ "no-unexpected-multiline": "warn",
+ "no-underscore-dangle": "off",
+ "no-unmodified-loop-condition": "warn",
+ "no-unneeded-ternary": "warn",
+ "no-unreachable": "warn",
+ "no-unsafe-finally": "warn",
+ "no-unused-expressions": "warn",
+ "no-unused-labels": "warn",
+ "no-unused-vars": "warn",
+ "no-use-before-define": "warn",
+ "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-var": "off",
+ "no-warning-comments": "off",
+ "no-with": "warn",
+ "array-bracket-spacing": "off",
+ "array-callback-return": "warn",
+ "arrow-body-style": "warn",
+ "arrow-parens": "warn",
+ "arrow-spacing": "off",
+ "accessor-pairs": "warn",
+ "block-scoped-var": "off",
+ "block-spacing": ["warn", "always"],
+ "brace-style": "warn",
+ "callback-return": "warn",
+ "camelcase": "off",
+ "capitalized-comments": ["warn", "always", {
+ "ignoreConsecutiveComments": true,
+ "ignoreInlineComments": true
+ }],
+ "comma-dangle": ["warn", "always-multiline"],
+ "comma-spacing": ["warn", {
+ "before": false,
+ "after": true
+ }],
+ "comma-style": "warn",
+ "complexity": [
+ "warn",
+ 15
+ ],
+ "computed-property-spacing": "off",
+ "consistent-return": "off",
+ "consistent-this": "off",
+ "constructor-super": "warn",
+ "curly": "warn",
+ "default-case": "off",
+ "dot-location": ["warn", "property"],
+ "dot-notation": "warn",
+ "eol-last": "warn",
+ "eqeqeq": "warn",
+ "func-names": "off",
+ "func-style": "off",
+ "generator-star-spacing": "off",
+ "global-require": "warn",
+ "guard-for-in": "off",
+ "handle-callback-err": "warn",
+ "id-blacklist": "warn",
+ "id-length": "off",
+ "id-match": "warn",
+ "indent": "warn",
+ "init-declarations": "warn",
+ "jsx-quotes": "warn",
+ "key-spacing": "off",
+ "keyword-spacing": "warn",
+ "linebreak-style": [
+ "warn",
+ "unix"
+ ],
+ "lines-around-comment": "warn",
+ "max-depth": "warn",
+ "max-len": ["warn", {
+ "code": 88,
+ "ignorePattern": "odoo\\.define\\(",
+ "tabWidth": 4
+ }],
+ "max-lines": "off",
+ "max-nested-callbacks": "warn",
+ "max-params": "off",
+ "max-statements": "off",
+ "max-statements-per-line": "warn",
+ "multiline-ternary": "off",
+ "new-cap": "off",
+ "new-parens": "warn",
+ "newline-after-var": "off",
+ "newline-before-return": "off",
+ "newline-per-chained-call": "off",
+ "object-curly-newline": ["warn", { "consistent": true }],
+ "object-curly-spacing": ["warn", "never"],
+ "object-property-newline": ["warn", {
+ "allowAllPropertiesOnSameLine": true
+ }],
+ "object-shorthand": "off",
+ "one-var": "off",
+ "one-var-declaration-per-line": "off",
+ "operator-assignment": "warn",
+ "operator-linebreak": "warn",
+ "padded-blocks": "off",
+ "prefer-arrow-callback": "off",
+ "prefer-const": "warn",
+ "prefer-reflect": "off",
+ "prefer-rest-params": "off",
+ "prefer-spread": "off",
+ "prefer-template": "off",
+ "quote-props": "off",
+ "quotes": "off",
+ "radix": "warn",
+ "require-yield": "warn",
+ "rest-spread-spacing": "off",
+ "semi": [
+ "warn",
+ "always"
+ ],
+ "semi-spacing": "warn",
+ "sort-imports": "warn",
+ "sort-vars": "off",
+ "space-before-blocks": "warn",
+ "space-before-function-paren": "warn",
+ "space-in-parens": "off",
+ "space-infix-ops": "off",
+ "space-unary-ops": "off",
+ "spaced-comment": ["warn", "always"],
+ "strict": ["warn", "function"],
+ "template-curly-spacing": "off",
+ "unicode-bom": "warn",
+ "use-isnan": "warn",
+ "valid-jsdoc": ["warn", {
+ "prefer": {
+ "arg": "param",
+ "argument": "param",
+ "augments": "extends",
+ "constructor": "class",
+ "exception": "throws",
+ "func": "function",
+ "method": "function",
+ "prop": "property",
+ "return": "returns",
+ "virtual": "abstract",
+ "yield": "yields"
+ },
+ "preferType": {
+ "array": "Array",
+ "bool": "Boolean",
+ "boolean": "Boolean",
+ "number": "Number",
+ "object": "Object",
+ "str": "String",
+ "string": "String"
+ },
+ "requireParamDescription": false,
+ "requireReturn": false,
+ "requireReturnDescription": false,
+ "requireReturnType": false
+ }],
+ "valid-typeof": "warn",
+ "vars-on-top": "off",
+ "wrap-iife": "warn",
+ "wrap-regex": "warn",
+ "yield-star-spacing": "off",
+ "yoda": "warn"
+ },
+ "parserOptions": {
+ "ecmaVersion": 2017
+ }
+}
diff --git a/.flake8 b/.flake8
new file mode 100644
index 00000000..44ed868f
--- /dev/null
+++ b/.flake8
@@ -0,0 +1,10 @@
+[flake8]
+max-line-length = 80
+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
diff --git a/.isort.cfg b/.isort.cfg
new file mode 100644
index 00000000..5751c40d
--- /dev/null
+++ b/.isort.cfg
@@ -0,0 +1,12 @@
+[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
+known_third_party=
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 00000000..876d1e98
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,68 @@
+exclude: "^setup/|/static/lib/|/static/src/lib/"
+default_language_version:
+ python: python3
+repos:
+- repo: https://github.com/psf/black
+ rev: 19.3b0
+ hooks:
+ - id: black
+- repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v2.3.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: flake8
+ name: flake8 except __init__.py
+ exclude: /__init__\.py$
+ additional_dependencies: ["flake8-bugbear==19.8.0"]
+ - id: flake8
+ name: flake8 only __init__.py
+ args: ["--extend-ignore=F401"] # ignore unused imports in __init__.py
+ files: /__init__\.py$
+ additional_dependencies: ["flake8-bugbear==19.8.0"]
+ - id: fix-encoding-pragma
+ args: ["--remove"]
+ - id: check-case-conflict
+ - id: check-docstring-first
+ - id: check-executables-have-shebangs
+ - id: check-merge-conflict
+ - id: check-symlinks
+ - id: check-xml
+ - id: mixed-line-ending
+ args: ["--fix=lf"]
+- repo: https://github.com/pre-commit/mirrors-pylint
+ rev: v2.3.1
+ hooks:
+ - id: pylint
+ name: pylint with optional checks
+ args: ["--rcfile=.pylintrc", "--exit-zero"]
+ verbose: true
+ additional_dependencies: ["pylint-odoo==3.0.3"]
+ - id: pylint
+ name: pylint with mandatory checks
+ args: ["--rcfile=.pylintrc-mandatory"]
+ additional_dependencies: ["pylint-odoo==3.0.3"]
+- repo: https://github.com/asottile/pyupgrade
+ rev: v1.24.0
+ hooks:
+ - id: pyupgrade
+- repo: https://github.com/asottile/seed-isort-config
+ rev: v1.9.3
+ hooks:
+ - id: seed-isort-config
+- repo: https://github.com/pre-commit/mirrors-isort
+ rev: v4.3.21
+ hooks:
+ - id: isort
+ name: isort except __init__.py
+ exclude: /__init__\.py$
+- repo: https://github.com/pre-commit/mirrors-eslint
+ rev: v6.5.1
+ hooks:
+ - id: eslint
+ verbose: true
diff --git a/.pylintrc b/.pylintrc
new file mode 100644
index 00000000..f9ddbaa3
--- /dev/null
+++ b/.pylintrc
@@ -0,0 +1,87 @@
+[MASTER]
+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=Odoo Community Association (OCA)
+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=13.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,
+ api-one-deprecated,
+ api-one-multi-together,
+ assignment-from-none,
+ attribute-deprecated,
+ class-camelcase,
+ dangerous-default-value,
+ dangerous-view-replace-wo-priority,
+ 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,
+ manifest-required-author,
+ manifest-required-key,
+ manifest-version-format,
+ method-compute,
+ method-inverse,
+ method-required-super,
+ method-search,
+ missing-import-error,
+ missing-manifest-dependency,
+ 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,
+ # 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-newline-extrafiles,
+ missing-readme,
+ no-utf8-coding-comment,
+ odoo-addons-relative-import,
+ old-api7-method-defined,
+ redefined-builtin,
+ too-complex,
+ unnecessary-utf8-coding-comment
+
+[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 00000000..7635cbb1
--- /dev/null
+++ b/.pylintrc-mandatory
@@ -0,0 +1,65 @@
+[MASTER]
+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=Odoo Community Association (OCA)
+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=13.0
+
+[MESSAGES CONTROL]
+disable=all
+
+enable=anomalous-backslash-in-string,
+ api-one-deprecated,
+ api-one-multi-together,
+ assignment-from-none,
+ attribute-deprecated,
+ class-camelcase,
+ dangerous-default-value,
+ dangerous-view-replace-wo-priority,
+ 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,
+ manifest-required-author,
+ manifest-required-key,
+ manifest-version-format,
+ method-compute,
+ method-inverse,
+ method-required-super,
+ method-search,
+ missing-import-error,
+ missing-manifest-dependency,
+ 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
+
+[REPORTS]
+msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg}
+output-format=colorized
+reports=no
diff --git a/.travis.yml b/.travis.yml
index 0cab4f44..7048b77b 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,28 +1,40 @@
-sudo: false
-cache: pip
+language: python
+cache:
+ directories:
+ - $HOME/.cache/pip
+ - $HOME/.cache/pre-commit
+
+python:
+ - "3.6"
addons:
postgresql: "9.6"
apt:
packages:
- expect-dev # provides unbuffer utility
- - python-lxml # because pip installation is slow
- - pdftk
- - libreoffice
-language: python
+stages:
+ - linting
+ - test
-python:
- - "3.5"
+jobs:
+ include:
+ - stage: linting
+ name: "pre-commit"
+ before_install:
+ install: pip install pre-commit
+ script: pre-commit run --all --show-diff-on-failure
+ after_success:
+ - stage: test
+ env:
+ - TESTS="1" ODOO_REPO="odoo/odoo" MAKEPOT="1"
+ - stage: test
+ env:
+ - TESTS="1" ODOO_REPO="OCA/OCB"
env:
global:
- VERSION="13.0" TESTS="0" LINT_CHECK="0" MAKEPOT="0"
- - WKHTMLTOPDF_VERSION="0.12.4"
- matrix:
- - LINT_CHECK="1"
- - MALLOC_ARENA_MAX=4 TESTS="1" ODOO_REPO="OCA/OCB"
- - MALLOC_ARENA_MAX=4 TESTS="1" ODOO_REPO="odoo/odoo" MAKEPOT="1"
install:
- git clone --depth=1 https://github.com/OCA/maintainer-quality-tools.git ${HOME}/maintainer-quality-tools
diff --git a/LICENSE b/LICENSE
index 8410c200..e20b431b 100644
--- a/LICENSE
+++ b/LICENSE
@@ -658,4 +658,4 @@ specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
-.
\ No newline at end of file
+.
diff --git a/README.md b/README.md
index 08c5533b..4804d36c 100644
--- a/README.md
+++ b/README.md
@@ -20,8 +20,8 @@ It can contain also another utilities directly involved with reports (like merge
----
-OCA, or the Odoo Community Association, is a nonprofit organization whose
-mission is to support the collaborative development of Odoo features and
+OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
promote its widespread use.
https://odoo-community.org/