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..9a6f3742 --- /dev/null +++ b/.isort.cfg @@ -0,0 +1,9 @@ +[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_third_party=pkg_resources,pytest,setuptools diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..0800d522 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,39 @@ +exclude: ^tests/data/ +default_language_version: + python: python3 +repos: +- repo: https://github.com/psf/black + rev: 19.10b0 + hooks: + - id: black +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v2.4.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: debug-statements + - id: flake8 + additional_dependencies: ["flake8-bugbear==19.8.0"] + - id: fix-encoding-pragma + - 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/asottile/pyupgrade + rev: v1.25.1 + 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$ diff --git a/.travis.yml b/.travis.yml index c0bfadaa..86c542a0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,12 +5,14 @@ python: - "2.7" - "3.5" - "3.6" - - "3.7-dev" + - "3.7" matrix: include: - - python: 3.5 + - python: 3.7 env: TOXENV=check_readme + - python: 3.7 + env: TOXENV=pre_commit install: - pip install tox-travis diff --git a/README.rst b/README.rst index ced7ce43..3793eb59 100644 --- a/README.rst +++ b/README.rst @@ -35,7 +35,7 @@ The following prerequisites apply: * For any advanced use such as installing from source, installing from git, packaging wheels etc, you need a recent version of pip (>= 9.0.1). * Finally, you need to install `odoo-autodiscover - `_ + `_ (``pip install odoo-autodiscover``) to provide automatic extension of the addons path (and workaround a bug with setuptools > 31 and Odoo 10). @@ -356,7 +356,7 @@ Available options:: other Odoo versions, remove metapackage setup if there are no installable addons. --commit Git commit changes, if any. - + Versioning ~~~~~~~~~~ diff --git a/docs/conf.py b/docs/conf.py index e6add0bb..c72a850c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -21,6 +21,7 @@ # sys.path.insert(0, os.path.abspath('.')) from datetime import date + from pkg_resources import get_distribution # -- General configuration ------------------------------------------------ @@ -33,36 +34,36 @@ # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'sphinx.ext.autodoc', + "sphinx.ext.autodoc", ] # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # # source_suffix = ['.rst', '.md'] -source_suffix = '.rst' +source_suffix = ".rst" # The encoding of source files. # # source_encoding = 'utf-8-sig' # The master toctree document. -master_doc = 'index' +master_doc = "index" # General information about the project. -project = u'setuptools-odoo' -copyright = u'2015-%s, Stéphane Bidoul (ACSONE)' % (date.today().year,) -author = u'Stéphane Bidoul (ACSONE)' +project = u"setuptools-odoo" +copyright = u"2015-{}, Stéphane Bidoul (ACSONE)".format(date.today().year) +author = u"Stéphane Bidoul (ACSONE)" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # -release = get_distribution('setuptools-odoo').version -version = '.'.join(release.split('.')[:2]) +release = get_distribution("setuptools-odoo").version +version = ".".join(release.split(".")[:2]) # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -83,7 +84,7 @@ # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] # The reST default role (used for this markup: `text`) to use for all # documents. @@ -105,7 +106,7 @@ # show_authors = False # The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' +pygments_style = "sphinx" # A list of ignored prefixes for module index sorting. # modindex_common_prefix = [] @@ -122,7 +123,7 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = 'alabaster' +html_theme = "alabaster" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the @@ -156,7 +157,7 @@ # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] +html_static_path = ["_static"] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied @@ -236,7 +237,7 @@ # html_search_scorer = 'scorer.js' # Output file base name for HTML help builder. -htmlhelp_basename = 'setuptools-odoodoc' +htmlhelp_basename = "setuptools-odoodoc" # -- Options for LaTeX output --------------------------------------------- @@ -244,15 +245,12 @@ # The paper size ('letterpaper' or 'a4paper'). # # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). # # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. # # 'preamble': '', - # Latex figure (float) alignment # # 'figure_align': 'htbp', @@ -262,8 +260,13 @@ # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'setuptools-odoo.tex', u'setuptools-odoo Documentation', - u'Stéphane Bidoul (ACSONE)', 'manual'), + ( + master_doc, + "setuptools-odoo.tex", + u"setuptools-odoo Documentation", + u"Stéphane Bidoul (ACSONE)", + "manual", + ), ] # The name of an image file (relative to this directory) to place at the top of @@ -304,8 +307,7 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - (master_doc, 'setuptools-odoo', u'setuptools-odoo Documentation', - [author], 1) + (master_doc, "setuptools-odoo", u"setuptools-odoo Documentation", [author], 1) ] # If true, show URL addresses after external links. @@ -319,9 +321,15 @@ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'setuptools-odoo', u'setuptools-odoo Documentation', - author, 'setuptools-odoo', 'One line description of project.', - 'Miscellaneous'), + ( + master_doc, + "setuptools-odoo", + u"setuptools-odoo Documentation", + author, + "setuptools-odoo", + "One line description of project.", + "Miscellaneous", + ), ] # Documents to append as an appendix to all manuals. diff --git a/docs/index.rst b/docs/index.rst index 9ff54383..3134ce40 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -8,4 +8,3 @@ .. include:: ../CHANGES.rst .. include:: ../DEVELOP.rst - diff --git a/mk_base_addons b/mk_base_addons index 0b10eab4..b7d000c5 100755 --- a/mk_base_addons +++ b/mk_base_addons @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +# -*- coding: utf-8 -*- import os import subprocess import tempfile @@ -8,20 +9,20 @@ from setuptools_odoo import manifest SERIES = [ # branch, suffix, enterprise - ('master', '14', True), - ('13.0', '13', True), - ('12.0', '12', True), - ('11.0', '11', True), - #('10.0', '10', True), - #('9.0', '9', True), - #('8.0', '8', False), - #('7.0', '7', False), + ("master", "14", True), + ("13.0", "13", True), + ("12.0", "12", True), + ("11.0", "11", True), + # ('10.0', '10', True), + # ('9.0', '9', True), + # ('8.0', '8', False), + # ('7.0', '7', False), ] def _list_addons(addons_dir, add_base): if add_base: - yield 'base' + yield "base" for addon_name in os.listdir(addons_dir): addon_dir = os.path.join(addons_dir, addon_name) if manifest.get_manifest_path(addon_dir): @@ -29,7 +30,7 @@ def _list_addons(addons_dir, add_base): def _write_addons_list(addons_dir, suffix, add_base): - with open('addons-%s.txt' % suffix, 'w') as f: + with open("addons-%s.txt" % suffix, "w") as f: print("# generated on", time.asctime(), file=f) for addon_name in sorted(_list_addons(addons_dir, add_base)): print(addon_name, file=f) @@ -43,24 +44,32 @@ def check_call(cmd): def main(): for branch, suffix, enterprise in SERIES: with tempfile.TemporaryDirectory() as tmpdir: - check_call([ - 'git', 'clone', - '--branch', branch, - 'https://github.com/odoo/odoo', - tmpdir, - ]) - addons_dir = os.path.join(tmpdir, 'addons') - _write_addons_list(addons_dir, suffix + 'c', add_base=True) + check_call( + [ + "git", + "clone", + "--branch", + branch, + "https://github.com/odoo/odoo", + tmpdir, + ] + ) + addons_dir = os.path.join(tmpdir, "addons") + _write_addons_list(addons_dir, suffix + "c", add_base=True) if enterprise: with tempfile.TemporaryDirectory() as tmpdir: - check_call([ - 'git', 'clone', - '--branch', branch, - 'git@github.com:odoo/enterprise', - tmpdir, - ]) + check_call( + [ + "git", + "clone", + "--branch", + branch, + "git@github.com:odoo/enterprise", + tmpdir, + ] + ) addons_dir = tmpdir - _write_addons_list(addons_dir, suffix + 'e', add_base=False) + _write_addons_list(addons_dir, suffix + "e", add_base=False) main() diff --git a/setup.py b/setup.py index 270b3a3e..eccbc8b6 100644 --- a/setup.py +++ b/setup.py @@ -3,53 +3,44 @@ # License LGPLv3 (http://www.gnu.org/licenses/lgpl-3.0-standalone.html) import os -import setuptools +import setuptools here = os.path.abspath(os.path.dirname(__file__)) long_description = [] -with open(os.path.join('README.rst')) as f: +with open(os.path.join("README.rst")) as f: long_description.append(f.read()) -with open(os.path.join('CHANGES.rst')) as f: +with open(os.path.join("CHANGES.rst")) as f: long_description.append(f.read()) setuptools.setup( - name='setuptools-odoo', + name="setuptools-odoo", use_scm_version=True, - description='A library to help package Odoo addons with setuptools', - long_description='\n'.join(long_description), + description="A library to help package Odoo addons with setuptools", + long_description="\n".join(long_description), classifiers=[ - 'Development Status :: 5 - Production/Stable', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: ' - 'GNU Lesser General Public License v3 (LGPLv3)', - 'Operating System :: POSIX', # because we use symlinks - 'Programming Language :: Python', - 'Framework :: Odoo', - ], - license='LGPLv3', - author='ACSONE SA/NV', - author_email='info@acsone.eu', - url='http://github.com/acsone/setuptools-odoo', - packages=[ - 'setuptools_odoo', + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: " "GNU Lesser General Public License v3 (LGPLv3)", + "Operating System :: POSIX", # because we use symlinks + "Programming Language :: Python", + "Framework :: Odoo", ], + license="LGPLv3", + author="ACSONE SA/NV", + author_email="info@acsone.eu", + url="http://github.com/acsone/setuptools-odoo", + packages=["setuptools_odoo",], include_package_data=True, - install_requires=[ - 'setuptools', - 'setuptools_scm>=2.1', - ], - python_requires='>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*', - setup_requires=[ - 'setuptools-scm', - ], - test_suite='tests', + install_requires=["setuptools", "setuptools_scm>=2.1",], + python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", + setup_requires=["setuptools-scm",], + test_suite="tests", entry_points={ - 'console_scripts': [ - "setuptools-odoo-make-default=" - "setuptools_odoo.make_default_setup:main", + "console_scripts": [ + "setuptools-odoo-make-default=" "setuptools_odoo.make_default_setup:main", ], "distutils.setup_keywords": [ "odoo_addon = setuptools_odoo.setup_keywords:odoo_addon", diff --git a/setuptools_odoo/__init__.py b/setuptools_odoo/__init__.py index a4f3295e..3f6719f5 100644 --- a/setuptools_odoo/__init__.py +++ b/setuptools_odoo/__init__.py @@ -3,11 +3,7 @@ # License LGPLv3 (http://www.gnu.org/licenses/lgpl-3.0-standalone.html) -from .core import ( - get_addon_metadata -) +from .core import get_addon_metadata -__all__ = [ - get_addon_metadata.__name__ -] +__all__ = [get_addon_metadata.__name__] diff --git a/setuptools_odoo/base_addons.py b/setuptools_odoo/base_addons.py index 8539dbfb..e71d8f46 100644 --- a/setuptools_odoo/base_addons.py +++ b/setuptools_odoo/base_addons.py @@ -9,32 +9,30 @@ def _addons(suffix): - b = resource_string('setuptools_odoo', 'addons-%s.txt' % suffix) - return set( - a for a in b.decode('ascii').split('\n') if not a.startswith('#') - ) + b = resource_string("setuptools_odoo", "addons-%s.txt" % suffix) + return {a for a in b.decode("ascii").split("\n") if not a.startswith("#")} -openerp7 = _addons('7c') +openerp7 = _addons("7c") -odoo8 = _addons('8c') +odoo8 = _addons("8c") -odoo9c = _addons('9c') -odoo9e = _addons('9e') +odoo9c = _addons("9c") +odoo9e = _addons("9e") odoo9 = odoo9c | odoo9e -odoo10c = _addons('10c') -odoo10e = _addons('10e') +odoo10c = _addons("10c") +odoo10e = _addons("10e") odoo10 = odoo10c | odoo10e -odoo11c = _addons('11c') -odoo11e = _addons('11e') +odoo11c = _addons("11c") +odoo11e = _addons("11e") odoo11 = odoo11c | odoo11e -odoo12c = _addons('12c') -odoo12e = _addons('12e') +odoo12c = _addons("12c") +odoo12e = _addons("12e") odoo12 = odoo12c | odoo12e -odoo13c = _addons('13c') -odoo13e = _addons('13e') +odoo13c = _addons("13c") +odoo13e = _addons("13e") odoo13 = odoo13c | odoo13e diff --git a/setuptools_odoo/core.py b/setuptools_odoo/core.py index bfdfc72b..85b79395 100644 --- a/setuptools_odoo/core.py +++ b/setuptools_odoo/core.py @@ -2,94 +2,91 @@ # Copyright © 2015-2018 ACSONE SA/NV # License LGPLv3 (http://www.gnu.org/licenses/lgpl-3.0-standalone.html) -from email.message import Message import email.parser import io import os from distutils.core import DistutilsSetupError +from email.message import Message from warnings import warn import setuptools -from . import base_addons -from . import external_dependencies -from .manifest import read_manifest, is_installable_addon -from .git_postversion import ( - get_git_postversion, STRATEGY_99_DEVN, STRATEGY_P1_DEVN -) +from . import base_addons, external_dependencies +from .git_postversion import STRATEGY_99_DEVN, STRATEGY_P1_DEVN, get_git_postversion +from .manifest import is_installable_addon, read_manifest ODOO_VERSION_INFO = { - '7.0': { - 'odoo_dep': 'openerp>=7.0a,<8.0a', - 'base_addons': base_addons.openerp7, - 'pkg_name_pfx': 'openerp7-addon-', - 'addons_ns': 'openerp_addons', - 'namespace_packages': ['openerp_addons'], - 'python_requires': '~=2.7', - 'universal_wheel': False, - 'git_postversion_strategy': STRATEGY_99_DEVN, + "7.0": { + "odoo_dep": "openerp>=7.0a,<8.0a", + "base_addons": base_addons.openerp7, + "pkg_name_pfx": "openerp7-addon-", + "addons_ns": "openerp_addons", + "namespace_packages": ["openerp_addons"], + "python_requires": "~=2.7", + "universal_wheel": False, + "git_postversion_strategy": STRATEGY_99_DEVN, }, - '8.0': { - 'odoo_dep': 'odoo>=8.0a,<9.0a', - 'base_addons': base_addons.odoo8, - 'pkg_name_pfx': 'odoo8-addon-', - 'addons_ns': 'odoo_addons', - 'namespace_packages': ['odoo_addons'], - 'python_requires': '~=2.7', - 'universal_wheel': False, - 'git_postversion_strategy': STRATEGY_99_DEVN, + "8.0": { + "odoo_dep": "odoo>=8.0a,<9.0a", + "base_addons": base_addons.odoo8, + "pkg_name_pfx": "odoo8-addon-", + "addons_ns": "odoo_addons", + "namespace_packages": ["odoo_addons"], + "python_requires": "~=2.7", + "universal_wheel": False, + "git_postversion_strategy": STRATEGY_99_DEVN, }, - '9.0': { - 'odoo_dep': 'odoo>=9.0a,<9.1a', - 'base_addons': base_addons.odoo9, - 'pkg_name_pfx': 'odoo9-addon-', - 'addons_ns': 'odoo_addons', - 'namespace_packages': ['odoo_addons'], - 'python_requires': '~=2.7', - 'universal_wheel': False, - 'git_postversion_strategy': STRATEGY_99_DEVN, + "9.0": { + "odoo_dep": "odoo>=9.0a,<9.1a", + "base_addons": base_addons.odoo9, + "pkg_name_pfx": "odoo9-addon-", + "addons_ns": "odoo_addons", + "namespace_packages": ["odoo_addons"], + "python_requires": "~=2.7", + "universal_wheel": False, + "git_postversion_strategy": STRATEGY_99_DEVN, }, - '10.0': { - 'odoo_dep': 'odoo>=10.0,<10.1dev', - 'base_addons': base_addons.odoo10, - 'pkg_name_pfx': 'odoo10-addon-', - 'addons_ns': 'odoo.addons', - 'namespace_packages': ['odoo', 'odoo.addons'], - 'python_requires': '~=2.7', - 'universal_wheel': False, - 'git_postversion_strategy': STRATEGY_99_DEVN, + "10.0": { + "odoo_dep": "odoo>=10.0,<10.1dev", + "base_addons": base_addons.odoo10, + "pkg_name_pfx": "odoo10-addon-", + "addons_ns": "odoo.addons", + "namespace_packages": ["odoo", "odoo.addons"], + "python_requires": "~=2.7", + "universal_wheel": False, + "git_postversion_strategy": STRATEGY_99_DEVN, }, - '11.0': { - 'odoo_dep': 'odoo>=11.0a,<11.1dev', - 'base_addons': base_addons.odoo11, - 'pkg_name_pfx': 'odoo11-addon-', - 'addons_ns': 'odoo.addons', - 'namespace_packages': None, - 'python_requires': ', '.join([ - '>=2.7', '!=3.0.*', '!=3.1.*', '!=3.2.*', '!=3.3.*', '!=3.4.*' - ]), - 'universal_wheel': True, - 'git_postversion_strategy': STRATEGY_99_DEVN, + "11.0": { + "odoo_dep": "odoo>=11.0a,<11.1dev", + "base_addons": base_addons.odoo11, + "pkg_name_pfx": "odoo11-addon-", + "addons_ns": "odoo.addons", + "namespace_packages": None, + "python_requires": ", ".join( + [">=2.7", "!=3.0.*", "!=3.1.*", "!=3.2.*", "!=3.3.*", "!=3.4.*"] + ), + "universal_wheel": True, + "git_postversion_strategy": STRATEGY_99_DEVN, }, - '12.0': { - 'odoo_dep': 'odoo>=12.0a,<12.1dev', - 'base_addons': base_addons.odoo12, - 'pkg_name_pfx': 'odoo12-addon-', - 'addons_ns': 'odoo.addons', - 'namespace_packages': None, - 'python_requires': '>=3.5', - 'universal_wheel': False, - 'git_postversion_strategy': STRATEGY_99_DEVN, + "12.0": { + "odoo_dep": "odoo>=12.0a,<12.1dev", + "base_addons": base_addons.odoo12, + "pkg_name_pfx": "odoo12-addon-", + "addons_ns": "odoo.addons", + "namespace_packages": None, + "python_requires": ">=3.5", + "universal_wheel": False, + "git_postversion_strategy": STRATEGY_99_DEVN, }, - '13.0': { - 'odoo_dep': 'odoo>=13.0a,<13.1dev', - 'base_addons': base_addons.odoo13, - 'pkg_name_pfx': 'odoo13-addon-', - 'addons_ns': 'odoo.addons', - 'namespace_packages': None, - 'python_requires': '>=3.5', - 'universal_wheel': False, - 'git_postversion_strategy': STRATEGY_P1_DEVN, + "13.0": { + "odoo_dep": "odoo>=13.0a,<13.1dev", + "base_addons": base_addons.odoo13, + "pkg_name_pfx": "odoo13-addon-", + "addons_ns": "odoo.addons", + "namespace_packages": None, + "python_requires": ">=3.5", + "universal_wheel": False, + "git_postversion_strategy": STRATEGY_P1_DEVN, }, } @@ -103,40 +100,47 @@ def _get_odoo_version_info(addons_dir, odoo_version_override=None): if is_installable_addon(addon_dir): manifest = read_manifest(addon_dir) _, _, addon_odoo_version_info = _get_version( - addon_dir, manifest, odoo_version_override, - git_post_version=False) - if odoo_version_info is not None and \ - odoo_version_info != addon_odoo_version_info: - raise DistutilsSetupError("Not all addons are for the same " - "odoo version in %s (error detected " - "in %s)" % (addons_dir, addon)) + addon_dir, manifest, odoo_version_override, git_post_version=False + ) + if ( + odoo_version_info is not None + and odoo_version_info != addon_odoo_version_info + ): + raise DistutilsSetupError( + "Not all addons are for the same " + "odoo version in %s (error detected " + "in %s)" % (addons_dir, addon) + ) odoo_version_info = addon_odoo_version_info return odoo_version_info -def _get_version(addon_dir, manifest, odoo_version_override=None, - git_post_version=True): +def _get_version( + addon_dir, manifest, odoo_version_override=None, git_post_version=True +): """ Get addon version information from an addon directory """ - version = manifest.get('version') + version = manifest.get("version") if not version: warn("No version in manifest in %s" % addon_dir) - version = '0.0.0' + version = "0.0.0" if not odoo_version_override: - if len(version.split('.')) < 5: - raise DistutilsSetupError("Version in manifest must have at least " - "5 components and start with " - "the Odoo series number in %s" % - addon_dir) - odoo_version = '.'.join(version.split('.')[:2]) + if len(version.split(".")) < 5: + raise DistutilsSetupError( + "Version in manifest must have at least " + "5 components and start with " + "the Odoo series number in %s" % addon_dir + ) + odoo_version = ".".join(version.split(".")[:2]) else: odoo_version = odoo_version_override if odoo_version not in ODOO_VERSION_INFO: - raise DistutilsSetupError("Unsupported odoo version '%s' in %s" % - (odoo_version, addon_dir)) + raise DistutilsSetupError( + "Unsupported odoo version '{}' in {}".format(odoo_version, addon_dir) + ) odoo_version_info = ODOO_VERSION_INFO[odoo_version] if git_post_version: version = get_git_postversion( - addon_dir, odoo_version_info['git_postversion_strategy'] + addon_dir, odoo_version_info["git_postversion_strategy"] ) return version, odoo_version, odoo_version_info @@ -148,57 +152,58 @@ def _no_nl(s): def _get_description(addon_dir, manifest): - s = manifest.get('summary', '').strip() or manifest.get('name').strip() + s = manifest.get("summary", "").strip() or manifest.get("name").strip() return _no_nl(s) def _get_long_description(addon_dir, manifest): - readme_path = os.path.join(addon_dir, 'README.rst') + readme_path = os.path.join(addon_dir, "README.rst") if os.path.exists(readme_path): with open(readme_path) as rf: return rf.read() else: - return manifest.get('description') + return manifest.get("description") def _get_author(manifest): - return _no_nl(manifest.get('author')) + return _no_nl(manifest.get("author")) def _get_author_email(manifest): author = _get_author(manifest) - if author and 'Odoo Community Association (OCA)' in author: - return 'support@odoo-community.org' + if author and "Odoo Community Association (OCA)" in author: + return "support@odoo-community.org" def make_pkg_name(odoo_version_info, addon_name): - name = odoo_version_info['pkg_name_pfx'] + addon_name + name = odoo_version_info["pkg_name_pfx"] + addon_name return name def make_pkg_requirement(addon_dir, odoo_version_override=None): manifest = read_manifest(addon_dir) addon_name = os.path.basename(addon_dir) - _, _, odoo_version_info = _get_version(addon_dir, - manifest, - odoo_version_override, - git_post_version=False) + _, _, odoo_version_info = _get_version( + addon_dir, manifest, odoo_version_override, git_post_version=False + ) return make_pkg_name(odoo_version_info, addon_name) -def _get_install_requires(odoo_version_info, - manifest, - no_depends=[], - depends_override={}, - external_dependencies_override={}): +def _get_install_requires( + odoo_version_info, + manifest, + no_depends=[], + depends_override={}, + external_dependencies_override={}, +): install_requires = [] # dependency on Odoo - odoo_dep = odoo_version_info['odoo_dep'] + odoo_dep = odoo_version_info["odoo_dep"] if odoo_dep: install_requires.append(odoo_dep) # dependencies on other addons (except Odoo official addons) - for depend in manifest.get('depends', []): - if depend in odoo_version_info['base_addons']: + for depend in manifest.get("depends", []): + if depend in odoo_version_info["base_addons"]: continue if depend in no_depends: continue @@ -209,37 +214,42 @@ def _get_install_requires(odoo_version_info, if install_require: install_requires.append(install_require) # python external_dependencies - for dep in manifest.get('external_dependencies', {}).get('python', []): - if dep in external_dependencies_override.get('python', {}): - dep = external_dependencies_override.get('python', {})[dep] + for dep in manifest.get("external_dependencies", {}).get("python", []): + if dep in external_dependencies_override.get("python", {}): + dep = external_dependencies_override.get("python", {})[dep] else: dep = external_dependencies.EXTERNAL_DEPENDENCIES_MAP.get(dep, dep) install_requires.append(dep) return sorted(install_requires) -def get_install_requires_odoo_addon(addon_dir, - no_depends=[], - depends_override={}, - external_dependencies_override={}, - odoo_version_override=None): +def get_install_requires_odoo_addon( + addon_dir, + no_depends=[], + depends_override={}, + external_dependencies_override={}, + odoo_version_override=None, +): """ Get the list of requirements for an addon """ manifest = read_manifest(addon_dir) - _, _, odoo_version_info = _get_version(addon_dir, - manifest, - odoo_version_override, - git_post_version=False) - return _get_install_requires(odoo_version_info, - manifest, - no_depends, - depends_override, - external_dependencies_override) - - -def get_install_requires_odoo_addons(addons_dir, - depends_override={}, - external_dependencies_override={}, - odoo_version_override=None): + _, _, odoo_version_info = _get_version( + addon_dir, manifest, odoo_version_override, git_post_version=False + ) + return _get_install_requires( + odoo_version_info, + manifest, + no_depends, + depends_override, + external_dependencies_override, + ) + + +def get_install_requires_odoo_addons( + addons_dir, + depends_override={}, + external_dependencies_override={}, + odoo_version_override=None, +): """ Get the list of requirements for a directory containing addons """ addon_dirs = [] addons = os.listdir(addons_dir) @@ -267,11 +277,12 @@ def _find_addons_dir(): """ res = set() for odoo_version_info in ODOO_VERSION_INFO.values(): - addons_ns = odoo_version_info['addons_ns'] - addons_dir = os.path.join(*addons_ns.split('.')) + addons_ns = odoo_version_info["addons_ns"] + addons_dir = os.path.join(*addons_ns.split(".")) if os.path.isdir(addons_dir): - if not odoo_version_info['namespace_packages'] or \ - os.path.isfile(os.path.join(addons_dir, '__init__.py')): + if not odoo_version_info["namespace_packages"] or os.path.isfile( + os.path.join(addons_dir, "__init__.py") + ): res.add((addons_dir, addons_ns)) if len(res) == 0: raise RuntimeError("No addons namespace found.") @@ -282,44 +293,31 @@ def _find_addons_dir(): def _make_classifiers(manifest): classifiers = [ - 'Programming Language :: Python', - 'Framework :: Odoo', + "Programming Language :: Python", + "Framework :: Odoo", ] # commonly used licenses in OCA LICENSES = { - 'agpl-3': - 'License :: OSI Approved :: ' - 'GNU Affero General Public License v3', - 'agpl-3 or any later version': - 'License :: OSI Approved :: ' - 'GNU Affero General Public License v3 or later (AGPLv3+)', - 'gpl-2': - 'License :: OSI Approved :: ' - 'GNU General Public License v2 (GPLv2)', - 'gpl-2 or any later version': - 'License :: OSI Approved :: ' - 'GNU General Public License v2 or later (GPLv2+)', - 'gpl-3': - 'License :: OSI Approved :: ' - 'GNU General Public License v3 (GPLv3)', - 'gpl-3 or any later version': - 'License :: OSI Approved :: ' - 'GNU General Public License v3 or later (GPLv3+)', - 'lgpl-2': - 'License :: OSI Approved :: ' - 'GNU Lesser General Public License v2 (LGPLv2)', - 'lgpl-2 or any later version': - 'License :: OSI Approved :: ' - 'GNU Lesser General Public License v2 or later (LGPLv2+)', - 'lgpl-3': - 'License :: OSI Approved :: ' - 'GNU Lesser General Public License v3 (LGPLv3)', - 'lgpl-3 or any later version': - 'License :: OSI Approved :: ' - 'GNU Lesser General Public License v3 or later (LGPLv3+)', + "agpl-3": "License :: OSI Approved :: " "GNU Affero General Public License v3", + "agpl-3 or any later version": "License :: OSI Approved :: " + "GNU Affero General Public License v3 or later (AGPLv3+)", + "gpl-2": "License :: OSI Approved :: " "GNU General Public License v2 (GPLv2)", + "gpl-2 or any later version": "License :: OSI Approved :: " + "GNU General Public License v2 or later (GPLv2+)", + "gpl-3": "License :: OSI Approved :: " "GNU General Public License v3 (GPLv3)", + "gpl-3 or any later version": "License :: OSI Approved :: " + "GNU General Public License v3 or later (GPLv3+)", + "lgpl-2": "License :: OSI Approved :: " + "GNU Lesser General Public License v2 (LGPLv2)", + "lgpl-2 or any later version": "License :: OSI Approved :: " + "GNU Lesser General Public License v2 or later (LGPLv2+)", + "lgpl-3": "License :: OSI Approved :: " + "GNU Lesser General Public License v3 (LGPLv3)", + "lgpl-3 or any later version": "License :: OSI Approved :: " + "GNU Lesser General Public License v3 or later (LGPLv3+)", } - license = manifest.get('license') + license = manifest.get("license") if license: license_classifier = LICENSES.get(license.lower()) if license_classifier: @@ -327,17 +325,18 @@ def _make_classifiers(manifest): # commonly used development status in OCA DEVELOPMENT_STATUSES = { - 'alpha': 'Development Status :: 3 - Alpha', - 'beta': 'Development Status :: 4 - Beta', - 'production/stable': 'Development Status :: 5 - Production/Stable', - 'stable': 'Development Status :: 5 - Production/Stable', - 'production': 'Development Status :: 5 - Production/Stable', - 'mature': 'Development Status :: 6 - Mature', + "alpha": "Development Status :: 3 - Alpha", + "beta": "Development Status :: 4 - Beta", + "production/stable": "Development Status :: 5 - Production/Stable", + "stable": "Development Status :: 5 - Production/Stable", + "production": "Development Status :: 5 - Production/Stable", + "mature": "Development Status :: 6 - Mature", } - development_status = manifest.get('development_status') + development_status = manifest.get("development_status") if development_status: - development_status_classifer = \ - DEVELOPMENT_STATUSES.get(development_status.lower()) + development_status_classifer = DEVELOPMENT_STATUSES.get( + development_status.lower() + ) if development_status_classifer: classifiers.append(development_status_classifer) @@ -348,8 +347,8 @@ def _setuptools_find_packages(odoo_version_info): # setuptools.find_package() does not find namespace packages # without __init__.py, apparently, so work around that pkg = setuptools.find_packages() - if odoo_version_info['addons_ns'] not in pkg: - pkg.append(odoo_version_info['addons_ns']) + if odoo_version_info["addons_ns"] not in pkg: + pkg.append(odoo_version_info["addons_ns"]) return pkg @@ -406,19 +405,21 @@ def get_addon_setuptools_keywords( addon_dir, depends_override={}, external_dependencies_override={}, - odoo_version_override=None + odoo_version_override=None, ): addon_name = os.path.basename(os.path.abspath(addon_dir)) manifest = read_manifest(addon_dir) - if os.path.exists('PKG-INFO'): - with io.open('PKG-INFO', encoding='utf-8') as fp: + if os.path.exists("PKG-INFO"): + with io.open("PKG-INFO", encoding="utf-8") as fp: pkg_info = email.parser.HeaderParser().parse(fp) - version = pkg_info['Version'] + version = pkg_info["Version"] _, _, odoo_version_info = _get_version( - addon_dir, manifest, odoo_version_override, git_post_version=False) + addon_dir, manifest, odoo_version_override, git_post_version=False + ) else: version, _, odoo_version_info = _get_version( - addon_dir, manifest, odoo_version_override, git_post_version=True) + addon_dir, manifest, odoo_version_override, git_post_version=True + ) install_requires = get_install_requires_odoo_addon( addon_dir, depends_override=depends_override, @@ -426,47 +427,56 @@ def get_addon_setuptools_keywords( odoo_version_override=odoo_version_override, ) setup_keywords = { - 'name': make_pkg_name(odoo_version_info, addon_name), - 'version': version, - 'description': _get_description(addon_dir, manifest), - 'long_description': _get_long_description(addon_dir, manifest), - 'url': manifest.get('website'), - 'license': manifest.get('license'), - 'packages': _setuptools_find_packages(odoo_version_info), - 'include_package_data': True, - 'namespace_packages': odoo_version_info['namespace_packages'], - 'zip_safe': False, - 'install_requires': install_requires, - 'python_requires': odoo_version_info['python_requires'], - 'author': _get_author(manifest), - 'author_email': _get_author_email(manifest), - 'classifiers': _make_classifiers(manifest) + "name": make_pkg_name(odoo_version_info, addon_name), + "version": version, + "description": _get_description(addon_dir, manifest), + "long_description": _get_long_description(addon_dir, manifest), + "url": manifest.get("website"), + "license": manifest.get("license"), + "packages": _setuptools_find_packages(odoo_version_info), + "include_package_data": True, + "namespace_packages": odoo_version_info["namespace_packages"], + "zip_safe": False, + "install_requires": install_requires, + "python_requires": odoo_version_info["python_requires"], + "author": _get_author(manifest), + "author_email": _get_author_email(manifest), + "classifiers": _make_classifiers(manifest), } # import pprint; pprint.pprint(setup_keywords) return {k: v for k, v in setup_keywords.items() if v is not None} -def prepare_odoo_addon(depends_override={}, - external_dependencies_override={}, - odoo_version_override=None): +def prepare_odoo_addon( + depends_override={}, external_dependencies_override={}, odoo_version_override=None +): addons_dir, addons_ns = _find_addons_dir() potential_addons = os.listdir(addons_dir) # list installable addons, except auto-installable ones # in case we want to combine an addon and it's glue modules # in a package named after the main addon - addons = [a for a in potential_addons - if is_installable_addon(os.path.join(addons_dir, a), - unless_auto_installable=True)] + addons = [ + a + for a in potential_addons + if is_installable_addon( + os.path.join(addons_dir, a), unless_auto_installable=True + ) + ] if len(addons) == 0: # if no addon is found, it may mean we are trying to package # a single module that is marked auto-install, so let's try # listing all installable modules - addons = [a for a in potential_addons - if is_installable_addon(os.path.join(addons_dir, a))] + addons = [ + a + for a in potential_addons + if is_installable_addon(os.path.join(addons_dir, a)) + ] if len(addons) != 1: - raise DistutilsSetupError('%s must contain exactly one ' - 'installable Odoo addon dir, found %s' % - (os.path.abspath(addons_dir), addons)) + raise DistutilsSetupError( + "%s must contain exactly one " + "installable Odoo addon dir, found %s" + % (os.path.abspath(addons_dir), addons) + ) addon_name = addons[0] addon_dir = os.path.join(addons_dir, addon_name) return get_addon_setuptools_keywords( @@ -477,12 +487,11 @@ def prepare_odoo_addon(depends_override={}, ) -def prepare_odoo_addons(depends_override={}, - external_dependencies_override={}, - odoo_version_override=None): +def prepare_odoo_addons( + depends_override={}, external_dependencies_override={}, odoo_version_override=None +): addons_dir, addons_ns = _find_addons_dir() - odoo_version_info = _get_odoo_version_info( - addons_dir, odoo_version_override) + odoo_version_info = _get_odoo_version_info(addons_dir, odoo_version_override) install_requires = get_install_requires_odoo_addons( addons_dir, depends_override=depends_override, @@ -490,12 +499,12 @@ def prepare_odoo_addons(depends_override={}, odoo_version_override=odoo_version_override, ) setup_keywords = { - 'packages': _setuptools_find_packages(odoo_version_info), - 'include_package_data': True, - 'namespace_packages': odoo_version_info['namespace_packages'], - 'zip_safe': False, - 'install_requires': install_requires, - 'python_requires': odoo_version_info['python_requires'], + "packages": _setuptools_find_packages(odoo_version_info), + "include_package_data": True, + "namespace_packages": odoo_version_info["namespace_packages"], + "zip_safe": False, + "install_requires": install_requires, + "python_requires": odoo_version_info["python_requires"], } # import pprint; pprint.pprint(setup_keywords) return {k: v for k, v in setup_keywords.items() if v is not None} diff --git a/setuptools_odoo/external_dependencies.py b/setuptools_odoo/external_dependencies.py index 1c87de3a..216713a2 100644 --- a/setuptools_odoo/external_dependencies.py +++ b/setuptools_odoo/external_dependencies.py @@ -5,14 +5,14 @@ # map names of common python external dependencies in Odoo manifest files # to actual python package names EXTERNAL_DEPENDENCIES_MAP = { - 'Asterisk': 'py-Asterisk', - 'coda': 'pycoda', - 'cups': 'pycups', - 'dateutil': 'python-dateutil', - 'ldap': 'python-ldap', - 'serial': 'pyserial', - 'suds': 'suds-jurko', - 'stdnum': 'python-stdnum', - 'Crypto.Cipher.DES3': 'pycrypto', - 'OpenSSL': 'pyOpenSSL', + "Asterisk": "py-Asterisk", + "coda": "pycoda", + "cups": "pycups", + "dateutil": "python-dateutil", + "ldap": "python-ldap", + "serial": "pyserial", + "suds": "suds-jurko", + "stdnum": "python-stdnum", + "Crypto.Cipher.DES3": "pycrypto", + "OpenSSL": "pyOpenSSL", } diff --git a/setuptools_odoo/git_postversion.py b/setuptools_odoo/git_postversion.py index c9a457bb..7e1598f8 100644 --- a/setuptools_odoo/git_postversion.py +++ b/setuptools_odoo/git_postversion.py @@ -4,45 +4,44 @@ import os import subprocess + from pkg_resources import parse_version -from .manifest import ( - MANIFEST_NAMES, read_manifest, parse_manifest, NoManifestFound -) +from .manifest import MANIFEST_NAMES, NoManifestFound, parse_manifest, read_manifest STRATEGY_99_DEVN = 1 STRATEGY_P1_DEVN = 2 def _run_git_command_exit_code(args, cwd=None, stderr=None): - return subprocess.call(['git'] + args, cwd=cwd, stderr=stderr) + return subprocess.call(["git"] + args, cwd=cwd, stderr=stderr) def _run_git_command_bytes(args, cwd=None, stderr=None): output = subprocess.check_output( - ['git'] + args, cwd=cwd, universal_newlines=True, stderr=stderr) + ["git"] + args, cwd=cwd, universal_newlines=True, stderr=stderr + ) return output.strip() def _run_git_command_lines(args, cwd=None, stderr=None): output = _run_git_command_bytes(args, cwd=cwd, stderr=stderr) - return output.split('\n') + return output.split("\n") def is_git_controlled(path): - with open(os.devnull, 'w') as devnull: - r = _run_git_command_exit_code(['rev-parse'], cwd=path, stderr=devnull) + with open(os.devnull, "w") as devnull: + r = _run_git_command_exit_code(["rev-parse"], cwd=path, stderr=devnull) return r == 0 def get_git_uncommitted(path): - r = _run_git_command_exit_code(['diff', '--quiet', '--exit-code', '.'], - cwd=path) + r = _run_git_command_exit_code(["diff", "--quiet", "--exit-code", "."], cwd=path) return r != 0 def get_git_root(path): - return _run_git_command_bytes(['rev-parse', '--show-toplevel'], cwd=path) + return _run_git_command_bytes(["rev-parse", "--show-toplevel"], cwd=path) def git_log_iterator(path): @@ -50,12 +49,12 @@ def git_log_iterator(path): N = 10 count = 0 while True: - lines = _run_git_command_lines(['log', '--oneline', - '-n', str(N), - '--skip', str(count), - '--', '.'], cwd=path) + lines = _run_git_command_lines( + ["log", "--oneline", "-n", str(N), "--skip", str(count), "--", "."], + cwd=path, + ) for line in lines: - sha = line.split(' ', 1)[0] + sha = line.split(" ", 1)[0] count += 1 yield sha if len(lines) < N: @@ -67,10 +66,10 @@ def read_manifest_from_sha(sha, addon_dir, git_root): for manifest_name in MANIFEST_NAMES: manifest_path = os.path.join(rel_addon_dir, manifest_name) try: - with open(os.devnull, 'w') as devnull: - s = _run_git_command_bytes([ - 'show', sha + ':' + manifest_path, - ], cwd=git_root, stderr=devnull) + with open(os.devnull, "w") as devnull: + s = _run_git_command_bytes( + ["show", sha + ":" + manifest_path,], cwd=git_root, stderr=devnull + ) except subprocess.CalledProcessError: continue try: @@ -78,7 +77,7 @@ def read_manifest_from_sha(sha, addon_dir, git_root): except Exception: # invalid manifest break - raise NoManifestFound("no manifest found in %s:%s" % (sha, addon_dir)) + raise NoManifestFound("no manifest found in {}:{}".format(sha, addon_dir)) def _bump_last(version): @@ -109,7 +108,7 @@ def get_git_postversion(addon_dir, strategy): this is not PEP 440 compliant and is therefore misinterpreted by pip. """ addon_dir = os.path.realpath(addon_dir) - last_version = read_manifest(addon_dir).get('version', '0.0.0') + last_version = read_manifest(addon_dir).get("version", "0.0.0") last_version_parsed = parse_version(last_version) if not is_git_controlled(addon_dir): return last_version @@ -126,7 +125,7 @@ def get_git_postversion(addon_dir, strategy): manifest = read_manifest_from_sha(sha, addon_dir, git_root) except NoManifestFound: break - version = manifest.get('version', '0.0.0') + version = manifest.get("version", "0.0.0") version_parsed = parse_version(version) if version_parsed != last_version_parsed: break diff --git a/setuptools_odoo/make_default_setup.py b/setuptools_odoo/make_default_setup.py index 683098f0..d547d988 100644 --- a/setuptools_odoo/make_default_setup.py +++ b/setuptools_odoo/make_default_setup.py @@ -9,8 +9,8 @@ import subprocess import sys -from .core import is_installable_addon, _get_version, make_pkg_requirement -from .manifest import read_manifest, NoManifestFound +from .core import _get_version, is_installable_addon, make_pkg_requirement +from .manifest import NoManifestFound, read_manifest SETUP_PY = """\ import setuptools @@ -21,7 +21,7 @@ ) """ -METAPACKAGE_SETUP_DIR = '_metapackage' +METAPACKAGE_SETUP_DIR = "_metapackage" SETUP_PY_METAPACKAGE = """\ import setuptools @@ -60,14 +60,14 @@ # setuptools-odoo-make-default (one addon per line) """ -IGNORE_FILENAME = '.setuptools-odoo-make-default-ignore' +IGNORE_FILENAME = ".setuptools-odoo-make-default-ignore" def _load_ignore_file(ignore_path): ignore = set() if os.path.exists(ignore_path): for line in open(ignore_path): - if line.startswith('#'): + if line.startswith("#"): continue ignore.add(line.strip()) return ignore @@ -78,14 +78,14 @@ def _odoo_version_to_series(odoo_version): def make_ns_pkg_dirs(root, pkgs, force, with_ns_init_py): - for pkg in pkgs.split('.'): + for pkg in pkgs.split("."): root = os.path.join(root, pkg) if not os.path.isdir(root): os.mkdir(root) - init_path = os.path.join(root, '__init__.py') + init_path = os.path.join(root, "__init__.py") if with_ns_init_py: if not os.path.exists(init_path) or force: - with open(init_path, 'w') as f: + with open(init_path, "w") as f: f.write(NS_INIT_PY) else: if os.path.exists(init_path): @@ -93,24 +93,25 @@ def make_ns_pkg_dirs(root, pkgs, force, with_ns_init_py): return root -def make_default_setup_addon(addon_setup_dir, addon_dir, force, - odoo_version_override): +def make_default_setup_addon(addon_setup_dir, addon_dir, force, odoo_version_override): manifest = read_manifest(addon_dir) - _, _, odoo_version_info = _get_version(addon_dir, - manifest, - odoo_version_override, - git_post_version=False) + _, _, odoo_version_info = _get_version( + addon_dir, manifest, odoo_version_override, git_post_version=False + ) addon_name = os.path.basename(os.path.realpath(addon_dir)) - setup_path = os.path.join(addon_setup_dir, 'setup.py') - odoo_addon = 'True' + setup_path = os.path.join(addon_setup_dir, "setup.py") + odoo_addon = "True" if odoo_version_override: odoo_addon = "{'odoo_version_override': '%s'}" % odoo_version_override if not os.path.exists(setup_path) or force: - with open(setup_path, 'w') as f: + with open(setup_path, "w") as f: f.write(SETUP_PY.format(odoo_addon=odoo_addon)) odoo_addons_path = make_ns_pkg_dirs( - addon_setup_dir, odoo_version_info['addons_ns'], force, - with_ns_init_py=bool(odoo_version_info['namespace_packages'])) + addon_setup_dir, + odoo_version_info["addons_ns"], + force, + with_ns_init_py=bool(odoo_version_info["namespace_packages"]), + ) link_path = os.path.join(odoo_addons_path, addon_name) # symlink to the main addon directory so we have a canonical structure: # odoo_addons/addon_name/... @@ -119,18 +120,17 @@ def make_default_setup_addon(addon_setup_dir, addon_dir, force, if not os.path.exists(link_path): os.symlink(os.path.relpath(addon_dir, odoo_addons_path), link_path) # setup.cfg - if odoo_version_info['universal_wheel']: - setup_cfg_path = os.path.join(addon_setup_dir, 'setup.cfg') - with open(setup_cfg_path, 'w') as f: + if odoo_version_info["universal_wheel"]: + setup_cfg_path = os.path.join(addon_setup_dir, "setup.cfg") + with open(setup_cfg_path, "w") as f: f.write(SETUP_CFG_UNIVERSAL) -def make_default_setup_addons_dir(addons_dir, force, - odoo_version_override): - addons_setup_dir = os.path.join(addons_dir, 'setup') +def make_default_setup_addons_dir(addons_dir, force, odoo_version_override): + addons_setup_dir = os.path.join(addons_dir, "setup") if not os.path.exists(addons_setup_dir): os.mkdir(addons_setup_dir) - readme_path = os.path.join(addons_setup_dir, 'README') + readme_path = os.path.join(addons_setup_dir, "README") if not os.path.exists(readme_path): with open(readme_path, "w") as f: f.write(README) @@ -148,18 +148,19 @@ def make_default_setup_addons_dir(addons_dir, force, addon_setup_dir = os.path.join(addons_setup_dir, addon_name) if not os.path.exists(addon_setup_dir): os.mkdir(addon_setup_dir) - make_default_setup_addon(addon_setup_dir, addon_dir, force, - odoo_version_override) + make_default_setup_addon( + addon_setup_dir, addon_dir, force, odoo_version_override + ) def make_default_meta_package(addons_dir, name, odoo_version_override): meta_install_requires = [] odoo_versions = set() - addons_setup_dir = os.path.join(addons_dir, 'setup') + addons_setup_dir = os.path.join(addons_dir, "setup") metapackage_dir = os.path.join(addons_setup_dir, METAPACKAGE_SETUP_DIR) - setup_py_file = os.path.join(metapackage_dir, 'setup.py') - setup_cfg_file = os.path.join(metapackage_dir, 'setup.cfg') - version_txt_file = os.path.join(metapackage_dir, 'VERSION.txt') + setup_py_file = os.path.join(metapackage_dir, "setup.py") + setup_cfg_file = os.path.join(metapackage_dir, "setup.cfg") + version_txt_file = os.path.join(metapackage_dir, "VERSION.txt") ignore_path = os.path.join(addons_setup_dir, IGNORE_FILENAME) ignore = _load_ignore_file(ignore_path) @@ -172,99 +173,100 @@ def make_default_meta_package(addons_dir, name, odoo_version_override): meta_install_requires.append(make_pkg_requirement(addon_dir)) manifest = read_manifest(addon_dir) _, odoo_version, odoo_version_info = _get_version( - addon_dir, manifest, + addon_dir, + manifest, odoo_version_override=odoo_version_override, - git_post_version=False) + git_post_version=False, + ) odoo_versions.add(odoo_version) if len(odoo_versions) == 0: - sys.stderr.write( - "No installable addon found, not generating metapackage.\n") + sys.stderr.write("No installable addon found, not generating metapackage.\n") return if len(odoo_versions) > 1: - raise RuntimeError("not all addon are for the same " - "Odoo version: %s" % (odoo_versions,)) + raise RuntimeError( + "not all addon are for the same " "Odoo version: %s" % (odoo_versions,) + ) odoo_version = list(odoo_versions)[0] odoo_series = _odoo_version_to_series(odoo_version) - install_requires_str = '[\n%s%s]' % ( - ''.join([ - ' ' * 8 + '\'' + install_require + '\',\n' - for install_require in sorted(meta_install_requires) - ]), - ' ' * 4, + install_requires_str = "[\n{}{}]".format( + "".join( + [ + " " * 8 + "'" + install_require + "',\n" + for install_require in sorted(meta_install_requires) + ] + ), + " " * 4, ) setup_py = SETUP_PY_METAPACKAGE.format( - name=name, - odoo_series=odoo_series, - install_requires=install_requires_str, + name=name, odoo_series=odoo_series, install_requires=install_requires_str, ) if not os.path.exists(metapackage_dir): os.mkdir(metapackage_dir) if os.path.exists(setup_py_file): - with open(setup_py_file, 'r') as f: + with open(setup_py_file, "r") as f: original_file_content = f.read() else: original_file_content = None if original_file_content is None or original_file_content != setup_py: if os.path.exists(version_txt_file): - with open(version_txt_file, 'r') as f: + with open(version_txt_file, "r") as f: old_version = f.read().strip() else: old_version = None new_version = get_next_version(odoo_version, old_version) - with open(version_txt_file, 'w') as f: + with open(version_txt_file, "w") as f: f.write(new_version) - with open(setup_py_file, 'w') as f: + with open(setup_py_file, "w") as f: f.write(setup_py) - if odoo_version_info['universal_wheel']: - with open(setup_cfg_file, 'w') as f: + if odoo_version_info["universal_wheel"]: + with open(setup_cfg_file, "w") as f: f.write(SETUP_CFG_UNIVERSAL) def get_next_version(odoo_version, old_version): - version_date = datetime.date.today().strftime('%Y%m%d') + version_date = datetime.date.today().strftime("%Y%m%d") if old_version: - version_re = r'^[0-9]{1,2}\.0.(?P[0-9]{8})\.(?P[0-9]+)$' + version_re = r"^[0-9]{1,2}\.0.(?P[0-9]{8})\.(?P[0-9]+)$" mo = re.match(version_re, old_version) if not mo: - raise RuntimeError('Could not parse version %s' % (old_version, )) - if mo.group('date') == version_date: - index = int(mo.group('index')) + 1 + raise RuntimeError("Could not parse version {}".format(old_version)) + if mo.group("date") == version_date: + index = int(mo.group("index")) + 1 else: index = 0 else: index = 0 - return '{odoo_version}.{version_date}.{index}'.format(**locals()) + return "{odoo_version}.{version_date}.{index}".format(**locals()) def clean_setup_addons_dir(addons_dir, odoo_version_override): paths_to_remove = [] empty = True - addons_setup_dir = os.path.join(addons_dir, 'setup') + addons_setup_dir = os.path.join(addons_dir, "setup") for addon_name in os.listdir(addons_setup_dir): addon_setup_dir = os.path.join(addons_setup_dir, addon_name) - addon_setup_file = os.path.join(addon_setup_dir, 'setup.py') + addon_setup_file = os.path.join(addon_setup_dir, "setup.py") odoo_lt_10_module_link = os.path.join( - addon_setup_dir, 'odoo_addons', addon_name) + addon_setup_dir, "odoo_addons", addon_name + ) odoo_gt_10_module_link = os.path.join( - addon_setup_dir, 'odoo', 'addons', addon_name) + addon_setup_dir, "odoo", "addons", addon_name + ) - is_setup_dir = ( - os.path.exists(addon_setup_file) and - ( - os.path.islink(odoo_lt_10_module_link) or - os.path.islink(odoo_gt_10_module_link) - ) + is_setup_dir = os.path.exists(addon_setup_file) and ( + os.path.islink(odoo_lt_10_module_link) + or os.path.islink(odoo_gt_10_module_link) ) if not is_setup_dir: # The entry will be skipped in case it's a file or @@ -287,25 +289,24 @@ def clean_setup_addons_dir(addons_dir, odoo_version_override): empty = False _, odoo_version, odoo_version_info = _get_version( - addon_dir, manifest, + addon_dir, + manifest, odoo_version_override=odoo_version_override, - git_post_version=False) + git_post_version=False, + ) odoo_series = _odoo_version_to_series(odoo_version) if odoo_series < 10: - paths_to_remove.append( - os.path.join(addon_setup_dir, 'odoo')) + paths_to_remove.append(os.path.join(addon_setup_dir, "odoo")) if odoo_series >= 10: - paths_to_remove.append( - os.path.join(addon_setup_dir, 'odoo_addons')) + paths_to_remove.append(os.path.join(addon_setup_dir, "odoo_addons")) if odoo_series >= 11: + paths_to_remove.append(os.path.join(addon_setup_dir, "odoo", "__init__.py")) paths_to_remove.append( - os.path.join(addon_setup_dir, 'odoo', '__init__.py')) - paths_to_remove.append( - os.path.join(addon_setup_dir, 'odoo', 'addons', '__init__.py')) - if not odoo_version_info['universal_wheel']: - paths_to_remove.append( - os.path.join(addon_setup_dir, 'setup.cfg')) + os.path.join(addon_setup_dir, "odoo", "addons", "__init__.py") + ) + if not odoo_version_info["universal_wheel"]: + paths_to_remove.append(os.path.join(addon_setup_dir, "setup.cfg")) if empty: metapackage_dir = os.path.join(addons_setup_dir, METAPACKAGE_SETUP_DIR) @@ -314,22 +315,24 @@ def clean_setup_addons_dir(addons_dir, odoo_version_override): # XXX we may want to clean metapackage_dir/setup.cfg if not universal_wheel paths_to_remove = [os.path.abspath(p) for p in paths_to_remove] - subprocess.check_call([ - 'rm', '-rf', - ] + paths_to_remove) + subprocess.check_call(["rm", "-rf",] + paths_to_remove) def check_setup_dir_is_git_clean(addons_dir): - cmd = ['git', 'diff', '--quiet', '--exit-code', '--', 'setup'] + cmd = ["git", "diff", "--quiet", "--exit-code", "--", "setup"] if subprocess.call(cmd, cwd=addons_dir) != 0: return False - cmd = ['git', 'diff', '--quiet', '--exit-code', '--cached', '--', 'setup'] + cmd = ["git", "diff", "--quiet", "--exit-code", "--cached", "--", "setup"] if subprocess.call(cmd, cwd=addons_dir) != 0: return False cmd = [ - 'git', 'ls-files', - '--other', '--exclude-standard', '--directory', - '--', 'setup', + "git", + "ls-files", + "--other", + "--exclude-standard", + "--directory", + "--", + "setup", ] out = subprocess.check_output(cmd, cwd=addons_dir) if out: @@ -338,61 +341,67 @@ def check_setup_dir_is_git_clean(addons_dir): def make_default_setup_commit_files(addons_dir): - subprocess.check_call(['git', 'add', 'setup'], cwd=addons_dir) - commit_needed = subprocess.call([ - 'git', 'diff', '--quiet', '--cached', '--exit-code', - '--', 'setup', - ], cwd=addons_dir) != 0 + subprocess.check_call(["git", "add", "setup"], cwd=addons_dir) + commit_needed = ( + subprocess.call( + ["git", "diff", "--quiet", "--cached", "--exit-code", "--", "setup",], + cwd=addons_dir, + ) + != 0 + ) if commit_needed: - subprocess.check_call([ - 'git', 'commit', '-m', '[ADD] setup.py', '--', 'setup', - ], cwd=addons_dir) + subprocess.check_call( + ["git", "commit", "-m", "[ADD] setup.py", "--", "setup",], cwd=addons_dir + ) def main(args=None): parser = argparse.ArgumentParser( - description='Generate default setup.py for all addons in an ' - 'Odoo addons directory' + description="Generate default setup.py for all addons in an " + "Odoo addons directory" ) - parser.add_argument('--addons-dir', '-d', required=True) - parser.add_argument('--force', '-f', action='store_true') + parser.add_argument("--addons-dir", "-d", required=True) + parser.add_argument("--force", "-f", action="store_true") parser.add_argument( - '--odoo-version-override', + "--odoo-version-override", help="Force Odoo version for situations where some " - "addons versions do not start with the odoo " - "version.", + "addons versions do not start with the odoo " + "version.", ) parser.add_argument( - '--metapackage', '-m', + "--metapackage", + "-m", help="Create a metapackage using the given name. This " - "package depends on all installable addons in ADDONS_DIR.", + "package depends on all installable addons in ADDONS_DIR.", ) parser.add_argument( - '--clean', '-c', - action='store_true', + "--clean", + "-c", + action="store_true", help="Clean the setup directory: remove setups of uninstallable " - "addons, remove files corresponding to other Odoo versions, " - "remove metapackage setup if there are no installable addons.", + "addons, remove files corresponding to other Odoo versions, " + "remove metapackage setup if there are no installable addons.", ) parser.add_argument( - '--commit', - action='store_true', - help="Git commit changes, if any.", + "--commit", action="store_true", help="Git commit changes, if any.", ) args = parser.parse_args(args) if args.commit and not check_setup_dir_is_git_clean(args.addons_dir): sys.stderr.write( "You asked to git commit changes but the setup directory " - "already has uncommitted changes, aborting.\n") + "already has uncommitted changes, aborting.\n" + ) sys.exit(1) make_default_setup_addons_dir( - args.addons_dir, args.force, args.odoo_version_override) + args.addons_dir, args.force, args.odoo_version_override + ) if args.metapackage: make_default_meta_package( - args.addons_dir, args.metapackage, args.odoo_version_override) + args.addons_dir, args.metapackage, args.odoo_version_override + ) if args.clean: # clean after so an empty meta package is removed @@ -402,5 +411,5 @@ def main(args=None): make_default_setup_commit_files(args.addons_dir) -if __name__ == '__main__': +if __name__ == "__main__": main(sys.argv[1:]) diff --git a/setuptools_odoo/manifest.py b/setuptools_odoo/manifest.py index c1a84e44..2cd7a108 100644 --- a/setuptools_odoo/manifest.py +++ b/setuptools_odoo/manifest.py @@ -5,7 +5,7 @@ import ast import os -MANIFEST_NAMES = ('__manifest__.py', '__openerp__.py', '__terp__.py') +MANIFEST_NAMES = ("__manifest__.py", "__openerp__.py", "__terp__.py") class NoManifestFound(Exception): @@ -34,9 +34,9 @@ def read_manifest(addon_dir): def is_installable_addon(addon_dir, unless_auto_installable=False): try: manifest = read_manifest(addon_dir) - r = manifest.get('installable', True) + r = manifest.get("installable", True) if unless_auto_installable: - r = r and not manifest.get('auto_install', False) + r = r and not manifest.get("auto_install", False) return r except Exception: return False diff --git a/setuptools_odoo/setup_keywords.py b/setuptools_odoo/setup_keywords.py index 3ec23baa..f9809946 100644 --- a/setuptools_odoo/setup_keywords.py +++ b/setuptools_odoo/setup_keywords.py @@ -4,10 +4,7 @@ import warnings -from .core import ( - prepare_odoo_addon, - prepare_odoo_addons, -) +from .core import prepare_odoo_addon, prepare_odoo_addons def _set_dist_keyword(dist, key, val): @@ -32,7 +29,7 @@ def _set_dist_keywords(dist, setup_keywords): elif hasattr(dist, key): _set_dist_keyword(dist, key, val) else: - msg = 'Unknown distribution option: %s' % repr(key) + msg = "Unknown distribution option: %s" % repr(key) warnings.warn(msg) @@ -41,12 +38,9 @@ def _parse_options(value): external_dependencies_override = {} odoo_version_override = None if isinstance(value, dict): - depends_override = \ - value.get('depends_override', {}) - external_dependencies_override = \ - value.get('external_dependencies_override', {}) - odoo_version_override = \ - value.get('odoo_version_override') + depends_override = value.get("depends_override", {}) + external_dependencies_override = value.get("external_dependencies_override", {}) + odoo_version_override = value.get("odoo_version_override") return ( depends_override, external_dependencies_override, @@ -55,8 +49,11 @@ def _parse_options(value): def odoo_addon(dist, attr, value): - depends_override, external_dependencies_override, odoo_version_override = \ - _parse_options(value) + ( + depends_override, + external_dependencies_override, + odoo_version_override, + ) = _parse_options(value) setup_keywords = prepare_odoo_addon( depends_override=depends_override, external_dependencies_override=external_dependencies_override, @@ -66,8 +63,11 @@ def odoo_addon(dist, attr, value): def odoo_addons(dist, attr, value): - depends_override, external_dependencies_override, odoo_version_override = \ - _parse_options(value) + ( + depends_override, + external_dependencies_override, + odoo_version_override, + ) = _parse_options(value) setup_keywords = prepare_odoo_addons( depends_override=depends_override, external_dependencies_override=external_dependencies_override, diff --git a/tests/__init__.py b/tests/__init__.py index 2612cd07..ece92f51 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -4,7 +4,7 @@ from contextlib import contextmanager import os -DATA_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data') +DATA_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "data") @contextmanager diff --git a/tests/test_get_addon_metadata.py b/tests/test_get_addon_metadata.py index 3de3f51d..2b40e5fa 100644 --- a/tests/test_get_addon_metadata.py +++ b/tests/test_get_addon_metadata.py @@ -3,15 +3,16 @@ # License LGPLv3 (http://www.gnu.org/licenses/lgpl-3.0-standalone.html) import os -try: - from itertools import zip_longest -except ImportError: # py27 - from itertools import izip_longest as zip_longest from setuptools_odoo import get_addon_metadata from . import DATA_DIR +try: + from itertools import zip_longest +except ImportError: # py27 + from itertools import izip_longest as zip_longest + def _assert_msg(msg, expected_items, expected_payload=None): for msg_item, expected_item in zip_longest(msg.items(), expected_items): @@ -40,8 +41,7 @@ def test_addon1(): ("Classifier", "Framework :: Odoo"), ( "Classifier", - "License :: OSI Approved :: " - "GNU Affero General Public License v3", + "License :: OSI Approved :: " "GNU Affero General Public License v3", ), ("Classifier", "Development Status :: 4 - Beta"), ], diff --git a/tests/test_git_postversion.py b/tests/test_git_postversion.py index 576eca40..ceafeea6 100644 --- a/tests/test_git_postversion.py +++ b/tests/test_git_postversion.py @@ -7,45 +7,47 @@ import pytest +from setuptools_odoo import manifest from setuptools_odoo.git_postversion import ( - get_git_postversion, STRATEGY_99_DEVN, STRATEGY_P1_DEVN + STRATEGY_99_DEVN, + STRATEGY_P1_DEVN, + get_git_postversion, ) -from setuptools_odoo import manifest from . import DATA_DIR def test_addon1(): """ addon1 has 4 commit after version 8.0.1.0.0 """ - addon1_dir = os.path.join(DATA_DIR, 'addon1') + addon1_dir = os.path.join(DATA_DIR, "addon1") version = get_git_postversion(addon1_dir, STRATEGY_99_DEVN) - assert version == '8.0.1.0.0.99.dev4' + assert version == "8.0.1.0.0.99.dev4" version = get_git_postversion(addon1_dir, STRATEGY_P1_DEVN) - assert version == '8.0.1.0.1.dev4' + assert version == "8.0.1.0.1.dev4" def test_addon2(): """ addon2 has not changed since 8.0.1.0.1 """ - addon2_dir = os.path.join(DATA_DIR, 'addon2') + addon2_dir = os.path.join(DATA_DIR, "addon2") version = get_git_postversion(addon2_dir, STRATEGY_99_DEVN) - assert version == '8.0.1.0.1' + assert version == "8.0.1.0.1" version = get_git_postversion(addon2_dir, STRATEGY_P1_DEVN) - assert version == '8.0.1.0.1' + assert version == "8.0.1.0.1" def test_addon2_uncommitted_version_change(): """ test with a local uncommitted version change """ - addon2_dir = os.path.join(DATA_DIR, 'addon2') - manifest_path = os.path.join(addon2_dir, '__openerp__.py') + addon2_dir = os.path.join(DATA_DIR, "addon2") + manifest_path = os.path.join(addon2_dir, "__openerp__.py") with open(manifest_path) as f: manifest = f.read() try: with open(manifest_path, "w") as f: f.write(manifest.replace("8.0.1.0.1", "8.0.1.0.2")) version = get_git_postversion(addon2_dir, STRATEGY_99_DEVN) - assert version == '8.0.1.0.2.dev1' + assert version == "8.0.1.0.2.dev1" version = get_git_postversion(addon2_dir, STRATEGY_P1_DEVN) - assert version == '8.0.1.0.2.dev1' + assert version == "8.0.1.0.2.dev1" finally: with open(manifest_path, "w") as f: f.write(manifest) @@ -53,17 +55,17 @@ def test_addon2_uncommitted_version_change(): def test_addon1_uncommitted_change(): """ test with a local uncommitted change without version change """ - addon1_dir = os.path.join(DATA_DIR, 'addon1') - manifest_path = os.path.join(addon1_dir, '__openerp__.py') + addon1_dir = os.path.join(DATA_DIR, "addon1") + manifest_path = os.path.join(addon1_dir, "__openerp__.py") with open(manifest_path) as f: manifest = f.read() try: with open(manifest_path, "w") as f: f.write(manifest.replace("summary", "great summary")) version = get_git_postversion(addon1_dir, STRATEGY_99_DEVN) - assert version == '8.0.1.0.0.99.dev5' + assert version == "8.0.1.0.0.99.dev5" version = get_git_postversion(addon1_dir, STRATEGY_P1_DEVN) - assert version == '8.0.1.0.1.dev5' + assert version == "8.0.1.0.1.dev5" finally: with open(manifest_path, "w") as f: f.write(manifest) @@ -71,15 +73,19 @@ def test_addon1_uncommitted_change(): def test_no_git(tmpdir): """ get version outisde of git repo, get it from manifest """ - tmpdir.join('__openerp__.py').write(textwrap.dedent("""\ + tmpdir.join("__openerp__.py").write( + textwrap.dedent( + """\ { 'version': '10.0.1.2.3', } - """)) + """ + ) + ) version = get_git_postversion(str(tmpdir), STRATEGY_99_DEVN) - assert version == '10.0.1.2.3' + assert version == "10.0.1.2.3" version = get_git_postversion(str(tmpdir), STRATEGY_P1_DEVN) - assert version == '10.0.1.2.3' + assert version == "10.0.1.2.3" def test_no_manifest(): diff --git a/tests/test_install_requires.py b/tests/test_install_requires.py index e8772782..a049266d 100644 --- a/tests/test_install_requires.py +++ b/tests/test_install_requires.py @@ -5,7 +5,8 @@ import unittest from setuptools_odoo.core import ( - get_install_requires_odoo_addon, get_install_requires_odoo_addons + get_install_requires_odoo_addon, + get_install_requires_odoo_addons, ) from . import DATA_DIR @@ -16,28 +17,32 @@ class TestInstallRequires(unittest.TestCase): def test_addons_dir(self): r = get_install_requires_odoo_addons(DATA_DIR) - self.assertEqual(set(r), set([ - 'astropy', - # we have a mix of addons version, so two versions of Odoo - # are pulled here (not realistic but good enough for a test) - 'odoo>=12.0a,<12.1dev', - 'odoo>=11.0a,<11.1dev', - 'odoo>=10.0,<10.1dev', - 'odoo>=8.0a,<9.0a', - 'python-dateutil'])) + self.assertEqual( + set(r), + { + "astropy", + # we have a mix of addons version, so two versions of Odoo + # are pulled here (not realistic but good enough for a test) + "odoo>=12.0a,<12.1dev", + "odoo>=11.0a,<11.1dev", + "odoo>=10.0,<10.1dev", + "odoo>=8.0a,<9.0a", + "python-dateutil", + }, + ) def test_addon1(self): - addon_dir = os.path.join(DATA_DIR, 'addon1') + addon_dir = os.path.join(DATA_DIR, "addon1") r = get_install_requires_odoo_addon(addon_dir) - self.assertEqual(r, ['odoo>=8.0a,<9.0a']) + self.assertEqual(r, ["odoo>=8.0a,<9.0a"]) def test_addon2(self): - addon_dir = os.path.join(DATA_DIR, 'addon2') + addon_dir = os.path.join(DATA_DIR, "addon2") r = get_install_requires_odoo_addon(addon_dir) - self.assertEqual(r, ['odoo8-addon-addon1', - 'odoo>=8.0a,<9.0a', - 'python-dateutil']) + self.assertEqual( + r, ["odoo8-addon-addon1", "odoo>=8.0a,<9.0a", "python-dateutil"] + ) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/tests/test_make_default_setup.py b/tests/test_make_default_setup.py index b96a08a9..b3fbd5fc 100644 --- a/tests/test_make_default_setup.py +++ b/tests/test_make_default_setup.py @@ -17,30 +17,37 @@ class TestMakeDefaultSetup(unittest.TestCase): - def _assert_no_diff(self, dc): def _filter(l): - return [i for i in l - if not i.endswith('.pyc') and - not i.endswith('.egg-info') and - not i.endswith('.eggs')] - if dc.right.endswith('addon4'): + return [ + i + for i in l + if not i.endswith(".pyc") + and not i.endswith(".egg-info") + and not i.endswith(".eggs") + ] + + if dc.right.endswith("addon4"): # in addon4, we have a customized # setup.py to test depends and external_dependencies overrides return - self.assertFalse(_filter(dc.left_only), - "missing %s in %s" % (dc.left_only, dc.right)) - self.assertFalse(_filter(dc.right_only), - "unexpected %s in %s" % (dc.right_only, dc.right)) - self.assertFalse(_filter(dc.diff_files), - "differing %s in %s" % (dc.diff_files, dc.right)) + self.assertFalse( + _filter(dc.left_only), "missing {} in {}".format(dc.left_only, dc.right) + ) + self.assertFalse( + _filter(dc.right_only), + "unexpected {} in {}".format(dc.right_only, dc.right), + ) + self.assertFalse( + _filter(dc.diff_files), "differing {} in {}".format(dc.diff_files, dc.right) + ) for sub_dc in dc.subdirs.values(): self._assert_no_diff(sub_dc) def test1(self): - expected_dir = os.path.join(DATA_DIR, 'setup_reusable_addons') - generated_dir = os.path.join(DATA_DIR, 'setup') - make_default_setup.main(['--addons-dir', DATA_DIR, '-f']) + expected_dir = os.path.join(DATA_DIR, "setup_reusable_addons") + generated_dir = os.path.join(DATA_DIR, "setup") + make_default_setup.main(["--addons-dir", DATA_DIR, "-f"]) dc = filecmp.dircmp(expected_dir, generated_dir) try: self._assert_no_diff(dc) @@ -51,11 +58,10 @@ def test_make_ns_pkg_dirs_1(self): opj = os.path.join tmpdir = tempfile.mkdtemp() try: - d = make_default_setup.make_ns_pkg_dirs( - tmpdir, 'odoo_addons', False, True) - self.assertEqual(d, opj(tmpdir, 'odoo_addons')) + d = make_default_setup.make_ns_pkg_dirs(tmpdir, "odoo_addons", False, True) + self.assertEqual(d, opj(tmpdir, "odoo_addons")) self.assertTrue(os.path.isdir(d)) - self.assertTrue(os.path.isfile(opj(d, '__init__.py'))) + self.assertTrue(os.path.isfile(opj(d, "__init__.py"))) finally: shutil.rmtree(tmpdir) @@ -63,13 +69,11 @@ def test_make_ns_pkg_dirs_2(self): opj = os.path.join tmpdir = tempfile.mkdtemp() try: - d = make_default_setup.make_ns_pkg_dirs( - tmpdir, 'odoo.addons', False, True) - self.assertEqual(d, opj(tmpdir, 'odoo', 'addons')) + d = make_default_setup.make_ns_pkg_dirs(tmpdir, "odoo.addons", False, True) + self.assertEqual(d, opj(tmpdir, "odoo", "addons")) self.assertTrue(os.path.isdir(d)) - self.assertTrue( - os.path.exists(opj(tmpdir, 'odoo', '__init__.py'))) - self.assertTrue(os.path.isfile(opj(d, '__init__.py'))) + self.assertTrue(os.path.exists(opj(tmpdir, "odoo", "__init__.py"))) + self.assertTrue(os.path.isfile(opj(d, "__init__.py"))) finally: shutil.rmtree(tmpdir) @@ -77,27 +81,26 @@ def test_make_ns_pkg_dirs_3(self): opj = os.path.join tmpdir = tempfile.mkdtemp() try: - d = make_default_setup.make_ns_pkg_dirs( - tmpdir, 'odoo.addons', False, False) - self.assertEqual(d, opj(tmpdir, 'odoo', 'addons')) + d = make_default_setup.make_ns_pkg_dirs(tmpdir, "odoo.addons", False, False) + self.assertEqual(d, opj(tmpdir, "odoo", "addons")) self.assertTrue(os.path.isdir(d)) - self.assertFalse( - os.path.exists(opj(tmpdir, 'odoo', '__init__.py'))) - self.assertFalse(os.path.exists(opj(d, '__init__.py'))) + self.assertFalse(os.path.exists(opj(tmpdir, "odoo", "__init__.py"))) + self.assertFalse(os.path.exists(opj(d, "__init__.py"))) finally: shutil.rmtree(tmpdir) def test_make_default_setup_metapackage(self): tmpdir = tempfile.mkdtemp() source_addons_path = os.path.join( - os.getcwd(), - 'tests', 'data', 'setup_custom_project', 'odoo_addons') - addons_path = os.path.join(tmpdir, 'tests') - metapackage_dir = os.path.join(addons_path, 'setup', '_metapackage') - setup_file = os.path.join(metapackage_dir, 'setup.py') - version_file = os.path.join(metapackage_dir, 'VERSION.txt') - today_date = datetime.date.today().strftime('%Y%m%d') - expected_setup_file = textwrap.dedent("""\ + os.getcwd(), "tests", "data", "setup_custom_project", "odoo_addons" + ) + addons_path = os.path.join(tmpdir, "tests") + metapackage_dir = os.path.join(addons_path, "setup", "_metapackage") + setup_file = os.path.join(metapackage_dir, "setup.py") + version_file = os.path.join(metapackage_dir, "VERSION.txt") + today_date = datetime.date.today().strftime("%Y%m%d") + expected_setup_file = textwrap.dedent( + """\ import setuptools with open('VERSION.txt', 'r') as f: @@ -115,66 +118,66 @@ def test_make_default_setup_metapackage(self): 'Framework :: Odoo', ] ) - """) + """ + ) try: shutil.copytree(source_addons_path, addons_path) - make_default_setup.make_default_setup_addons_dir( - addons_path, False, False) + make_default_setup.make_default_setup_addons_dir(addons_path, False, False) with open( os.path.join( - addons_path, - 'setup', - '.setuptools-odoo-make-default-ignore', + addons_path, "setup", ".setuptools-odoo-make-default-ignore", ), - 'a', + "a", ) as f: f.write("addon2\n") make_default_setup.make_default_meta_package( - addons_path, 'tests', odoo_version_override=None) + addons_path, "tests", odoo_version_override=None + ) - with open(setup_file, 'r') as f: + with open(setup_file, "r") as f: setup_file_content = f.read() self.assertEqual(setup_file_content, expected_setup_file) - with open(version_file, 'r') as f: + with open(version_file, "r") as f: version = f.read().strip() - self.assertEqual(version, '8.0.%s.0' % today_date) + self.assertEqual(version, "8.0.%s.0" % today_date) # Create a new addon - addon1_path = os.path.join(addons_path, 'addon1') - new_addon_path = os.path.join(addons_path, 'addon99') + addon1_path = os.path.join(addons_path, "addon1") + new_addon_path = os.path.join(addons_path, "addon99") shutil.copytree(addon1_path, new_addon_path) - make_default_setup.make_default_setup_addons_dir( - addons_path, False, False) + make_default_setup.make_default_setup_addons_dir(addons_path, False, False) make_default_setup.make_default_meta_package( - addons_path, 'tests', odoo_version_override=None) + addons_path, "tests", odoo_version_override=None + ) - with open(version_file, 'r') as f: + with open(version_file, "r") as f: version = f.read().strip() self.assertEqual( - version, '8.0.%s.1' % today_date, - msg="The version should have been incremented") + version, + "8.0.%s.1" % today_date, + msg="The version should have been incremented", + ) finally: shutil.rmtree(tmpdir) def test_make_default_setup_commit(tmpdir): with tmpdir.as_cwd(): - subprocess.check_call(['git', 'init']) - subprocess.check_call(['git', 'config', 'user.name', 'test']) - subprocess.check_call([ - 'git', 'config', 'user.email', 'test@example.com' - ]) - make_default_setup.main(['--addons-dir', '.', '--commit']) - out = subprocess.check_output( - ['git', 'ls-files'], universal_newlines=True) - assert out == textwrap.dedent("""\ + subprocess.check_call(["git", "init"]) + subprocess.check_call(["git", "config", "user.name", "test"]) + subprocess.check_call(["git", "config", "user.email", "test@example.com"]) + make_default_setup.main(["--addons-dir", ".", "--commit"]) + out = subprocess.check_output(["git", "ls-files"], universal_newlines=True) + assert out == textwrap.dedent( + """\ setup/.setuptools-odoo-make-default-ignore setup/README - """) + """ + ) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/tests/test_manifest.py b/tests/test_manifest.py index b22372db..09b3e34c 100644 --- a/tests/test_manifest.py +++ b/tests/test_manifest.py @@ -6,25 +6,26 @@ import unittest from setuptools_odoo.manifest import ( - read_manifest, is_installable_addon, NoManifestFound + NoManifestFound, + is_installable_addon, + read_manifest, ) from . import DATA_DIR class TestManifest(unittest.TestCase): - def test_read(self): - addon_dir = os.path.join(DATA_DIR, 'addon1') + addon_dir = os.path.join(DATA_DIR, "addon1") manifest = read_manifest(addon_dir) - assert 'version' in manifest + assert "version" in manifest def test_no_manifest(self): with self.assertRaises(NoManifestFound): read_manifest(DATA_DIR) def test_is_installable(self): - addon1_dir = os.path.join(DATA_DIR, 'addon1') + addon1_dir = os.path.join(DATA_DIR, "addon1") assert is_installable_addon(addon1_dir) - addon3_dir = os.path.join(DATA_DIR, 'addon3_bad') + addon3_dir = os.path.join(DATA_DIR, "addon3_bad") assert not is_installable_addon(addon3_dir) diff --git a/tests/test_prepare.py b/tests/test_prepare.py index da349644..4c174c42 100644 --- a/tests/test_prepare.py +++ b/tests/test_prepare.py @@ -4,135 +4,125 @@ import os from setuptools_odoo.core import ( - prepare_odoo_addon, - prepare_odoo_addons, + ODOO_VERSION_INFO, make_pkg_name, make_pkg_requirement, - ODOO_VERSION_INFO, + prepare_odoo_addon, + prepare_odoo_addons, ) from . import DATA_DIR, working_directory_keeper def test_make_pkg_name(): - pkg_name = make_pkg_name(ODOO_VERSION_INFO['8.0'], 'addon1') - assert pkg_name == 'odoo8-addon-addon1' + pkg_name = make_pkg_name(ODOO_VERSION_INFO["8.0"], "addon1") + assert pkg_name == "odoo8-addon-addon1" def test_make_pkg_requirement(): - addon_dir = os.path.join(DATA_DIR, 'addon1') + addon_dir = os.path.join(DATA_DIR, "addon1") requirement = make_pkg_requirement(addon_dir) - assert requirement == 'odoo8-addon-addon1' + assert requirement == "odoo8-addon-addon1" def test_addon1(): - addon_dir = os.path.join(DATA_DIR, 'setup_reusable_addons', 'addon1') + addon_dir = os.path.join(DATA_DIR, "setup_reusable_addons", "addon1") with working_directory_keeper(): os.chdir(addon_dir) keywords = prepare_odoo_addon() assert keywords == { - 'author': 'ACSONE SA/NV, Odoo Community Association (OCA)', - 'author_email': 'support@odoo-community.org', - 'classifiers': [ - 'Programming Language :: Python', - 'Framework :: Odoo', - 'License :: OSI Approved :: ' - 'GNU Affero General Public License v3', - 'Development Status :: 4 - Beta', + "author": "ACSONE SA/NV, Odoo Community Association (OCA)", + "author_email": "support@odoo-community.org", + "classifiers": [ + "Programming Language :: Python", + "Framework :: Odoo", + "License :: OSI Approved :: " "GNU Affero General Public License v3", + "Development Status :: 4 - Beta", ], - 'description': 'addon 1 summary', - 'include_package_data': True, - 'install_requires': ['odoo>=8.0a,<9.0a'], - 'python_requires': '~=2.7', - 'license': 'AGPL-3', - 'long_description': 'addon 1 readme content\n', - 'name': 'odoo8-addon-addon1', - 'namespace_packages': ['odoo_addons'], - 'packages': ['odoo_addons'], - 'url': 'https://acsone.eu/', - 'version': '8.0.1.0.0.99.dev4', - 'zip_safe': False, + "description": "addon 1 summary", + "include_package_data": True, + "install_requires": ["odoo>=8.0a,<9.0a"], + "python_requires": "~=2.7", + "license": "AGPL-3", + "long_description": "addon 1 readme content\n", + "name": "odoo8-addon-addon1", + "namespace_packages": ["odoo_addons"], + "packages": ["odoo_addons"], + "url": "https://acsone.eu/", + "version": "8.0.1.0.0.99.dev4", + "zip_safe": False, } def test_addon2(): - addon_dir = os.path.join(DATA_DIR, 'setup_reusable_addons', 'addon2') + addon_dir = os.path.join(DATA_DIR, "setup_reusable_addons", "addon2") with working_directory_keeper(): os.chdir(addon_dir) keywords = prepare_odoo_addon() assert keywords == { - 'classifiers': [ - 'Programming Language :: Python', - 'Framework :: Odoo', + "classifiers": ["Programming Language :: Python", "Framework :: Odoo",], + "description": "addon 2 summary", + "include_package_data": True, + "install_requires": [ + "odoo8-addon-addon1", + "odoo>=8.0a,<9.0a", + "python-dateutil", ], - 'description': 'addon 2 summary', - 'include_package_data': True, - 'install_requires': ['odoo8-addon-addon1', - 'odoo>=8.0a,<9.0a', - 'python-dateutil'], - 'python_requires': '~=2.7', - 'name': 'odoo8-addon-addon2', - 'namespace_packages': ['odoo_addons'], - 'packages': ['odoo_addons'], - 'version': '8.0.1.0.1', - 'zip_safe': False, + "python_requires": "~=2.7", + "name": "odoo8-addon-addon2", + "namespace_packages": ["odoo_addons"], + "packages": ["odoo_addons"], + "version": "8.0.1.0.1", + "zip_safe": False, } def test_addon7(): - addon_dir = os.path.join(DATA_DIR, 'setup_reusable_addons', 'addon7') + addon_dir = os.path.join(DATA_DIR, "setup_reusable_addons", "addon7") with working_directory_keeper(): os.chdir(addon_dir) keywords = prepare_odoo_addon() assert keywords == { - 'classifiers': [ - 'Programming Language :: Python', - 'Framework :: Odoo', - ], - 'description': 'addon 7 summary', - 'include_package_data': True, - 'install_requires': ['odoo>=11.0a,<11.1dev'], - 'python_requires': '>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, ' - '!=3.3.*, !=3.4.*', - 'name': 'odoo11-addon-addon7', - 'packages': ['odoo.addons'], - 'version': '11.0.1.0.1', - 'zip_safe': False, + "classifiers": ["Programming Language :: Python", "Framework :: Odoo",], + "description": "addon 7 summary", + "include_package_data": True, + "install_requires": ["odoo>=11.0a,<11.1dev"], + "python_requires": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, " "!=3.3.*, !=3.4.*", + "name": "odoo11-addon-addon7", + "packages": ["odoo.addons"], + "version": "11.0.1.0.1", + "zip_safe": False, } def test_addon8(): - addon_dir = os.path.join(DATA_DIR, 'setup_reusable_addons', 'addon8') + addon_dir = os.path.join(DATA_DIR, "setup_reusable_addons", "addon8") with working_directory_keeper(): os.chdir(addon_dir) keywords = prepare_odoo_addon() assert keywords == { - 'classifiers': [ - 'Programming Language :: Python', - 'Framework :: Odoo', - ], - 'description': 'addon 8 summary', - 'include_package_data': True, - 'install_requires': ['odoo>=12.0a,<12.1dev'], - 'python_requires': '>=3.5', - 'name': 'odoo12-addon-addon8', - 'packages': ['odoo.addons'], - 'version': '12.0.1.0.1', - 'zip_safe': False, + "classifiers": ["Programming Language :: Python", "Framework :: Odoo",], + "description": "addon 8 summary", + "include_package_data": True, + "install_requires": ["odoo>=12.0a,<12.1dev"], + "python_requires": ">=3.5", + "name": "odoo12-addon-addon8", + "packages": ["odoo.addons"], + "version": "12.0.1.0.1", + "zip_safe": False, } def test_addons_dir(): - addons_dir = os.path.join(DATA_DIR, 'setup_custom_project') + addons_dir = os.path.join(DATA_DIR, "setup_custom_project") with working_directory_keeper(): os.chdir(addons_dir) keywords = prepare_odoo_addons() assert keywords == { - 'include_package_data': True, - 'install_requires': ['odoo>=8.0a,<9.0a', - 'python-dateutil'], - 'python_requires': '~=2.7', - 'namespace_packages': ['odoo_addons'], - 'packages': ['odoo_addons'], - 'zip_safe': False, + "include_package_data": True, + "install_requires": ["odoo>=8.0a,<9.0a", "python-dateutil"], + "python_requires": "~=2.7", + "namespace_packages": ["odoo_addons"], + "packages": ["odoo_addons"], + "zip_safe": False, } diff --git a/tests/test_setup_keywords.py b/tests/test_setup_keywords.py index fbe66148..ef7ff12a 100644 --- a/tests/test_setup_keywords.py +++ b/tests/test_setup_keywords.py @@ -21,50 +21,52 @@ class TestSetupKeywords(unittest.TestCase): """ test the new setup() keywords (odoo_addon, odoo_addons) """ def test_odoo_addon1(self): - addon1_dir = os.path.join(DATA_DIR, 'setup_reusable_addons', 'addon1') - subprocess.check_call([sys.executable, 'setup.py', 'egg_info'], - cwd=addon1_dir) - egg_info_dir = os.path.join(addon1_dir, - 'odoo8_addon_addon1.egg-info') + addon1_dir = os.path.join(DATA_DIR, "setup_reusable_addons", "addon1") + subprocess.check_call([sys.executable, "setup.py", "egg_info"], cwd=addon1_dir) + egg_info_dir = os.path.join(addon1_dir, "odoo8_addon_addon1.egg-info") assert os.path.isdir(egg_info_dir) try: dist = next(pkg_resources.find_distributions(addon1_dir)) - self.assertEqual(dist.key, 'odoo8-addon-addon1') - self.assertEqual(dist.requires(), - [pkg_resources.Requirement.parse(r) for r in - ['odoo>=8.0a,<9.0a']]) - self.assertTrue(dist.has_metadata('not-zip-safe')) + self.assertEqual(dist.key, "odoo8-addon-addon1") + self.assertEqual( + dist.requires(), + [pkg_resources.Requirement.parse(r) for r in ["odoo>=8.0a,<9.0a"]], + ) + self.assertTrue(dist.has_metadata("not-zip-safe")) self.assertEqual(dist.version, "8.0.1.0.0.99.dev4") finally: shutil.rmtree(egg_info_dir) def test_odoo_addon1_sdist(self): - addon1_dir = os.path.join(DATA_DIR, 'setup_reusable_addons', 'addon1') + addon1_dir = os.path.join(DATA_DIR, "setup_reusable_addons", "addon1") dist_dir = tempfile.mkdtemp() assert os.path.isdir(dist_dir) try: - subprocess.check_call([ - sys.executable, 'setup.py', 'sdist', '-d', dist_dir, - ], cwd=addon1_dir) + subprocess.check_call( + [sys.executable, "setup.py", "sdist", "-d", dist_dir,], cwd=addon1_dir + ) sdist_file = os.path.join( - dist_dir, - 'odoo8-addon-addon1-8.0.1.0.0.99.dev4.tar.gz') + dist_dir, "odoo8-addon-addon1-8.0.1.0.0.99.dev4.tar.gz" + ) assert os.path.isfile(sdist_file) # dist from the tar file, must produce an identical tar file - with tarfile.open(sdist_file, 'r') as tf: + with tarfile.open(sdist_file, "r") as tf: tar_dir = tempfile.mkdtemp() try: tar_setup_dir = os.path.join( - tar_dir, 'odoo8-addon-addon1-8.0.1.0.0.99.dev4') + tar_dir, "odoo8-addon-addon1-8.0.1.0.0.99.dev4" + ) tf.extractall(tar_dir) - subprocess.check_call([ - sys.executable, 'setup.py', 'sdist', - ], cwd=tar_setup_dir) + subprocess.check_call( + [sys.executable, "setup.py", "sdist",], cwd=tar_setup_dir + ) sdist_file2 = os.path.join( - tar_setup_dir, 'dist', - 'odoo8-addon-addon1-8.0.1.0.0.99.dev4.tar.gz') + tar_setup_dir, + "dist", + "odoo8-addon-addon1-8.0.1.0.0.99.dev4.tar.gz", + ) assert os.path.isfile(sdist_file2) - with tarfile.open(sdist_file2, 'r') as tf2: + with tarfile.open(sdist_file2, "r") as tf2: assert sorted(tf.getnames()) == sorted(tf2.getnames()) finally: shutil.rmtree(tar_dir) @@ -72,66 +74,73 @@ def test_odoo_addon1_sdist(self): shutil.rmtree(dist_dir) def test_odoo_addon2(self): - addon2_dir = os.path.join(DATA_DIR, 'setup_reusable_addons', 'addon2') - subprocess.check_call([sys.executable, 'setup.py', 'egg_info'], - cwd=addon2_dir) - egg_info_dir = os.path.join(addon2_dir, - 'odoo8_addon_addon2.egg-info') + addon2_dir = os.path.join(DATA_DIR, "setup_reusable_addons", "addon2") + subprocess.check_call([sys.executable, "setup.py", "egg_info"], cwd=addon2_dir) + egg_info_dir = os.path.join(addon2_dir, "odoo8_addon_addon2.egg-info") assert os.path.isdir(egg_info_dir) try: dist = next(pkg_resources.find_distributions(addon2_dir)) - self.assertEqual(dist.key, 'odoo8-addon-addon2') - self.assertEqual(dist.requires(), - [pkg_resources.Requirement.parse(r) for r in - ['odoo8-addon-addon1', - 'odoo>=8.0a,<9.0a', - 'python-dateutil']]) - self.assertTrue(dist.has_metadata('not-zip-safe')) + self.assertEqual(dist.key, "odoo8-addon-addon2") + self.assertEqual( + dist.requires(), + [ + pkg_resources.Requirement.parse(r) + for r in [ + "odoo8-addon-addon1", + "odoo>=8.0a,<9.0a", + "python-dateutil", + ] + ], + ) + self.assertTrue(dist.has_metadata("not-zip-safe")) self.assertEqual(dist.version, "8.0.1.0.1") finally: shutil.rmtree(egg_info_dir) def test_odoo_addon4(self): - addon4_dir = os.path.join(DATA_DIR, 'setup_reusable_addons', 'addon4') - subprocess.check_call([sys.executable, 'setup.py', 'egg_info'], - cwd=addon4_dir) - egg_info_dir = os.path.join(addon4_dir, - 'odoo8_addon_addon4.egg-info') + addon4_dir = os.path.join(DATA_DIR, "setup_reusable_addons", "addon4") + subprocess.check_call([sys.executable, "setup.py", "egg_info"], cwd=addon4_dir) + egg_info_dir = os.path.join(addon4_dir, "odoo8_addon_addon4.egg-info") assert os.path.isdir(egg_info_dir) try: dist = next(pkg_resources.find_distributions(addon4_dir)) - self.assertEqual(dist.key, 'odoo8-addon-addon4') - self.assertEqual(dist.requires(), - [pkg_resources.Requirement.parse(r) for r in - ['astropy>=1.0', - 'odoo8-addon-addon1>=8.0.3.0.0', - 'odoo>=8.0a,<9.0a', - 'python-dateutil']]) - self.assertTrue(dist.has_metadata('not-zip-safe')) + self.assertEqual(dist.key, "odoo8-addon-addon4") + self.assertEqual( + dist.requires(), + [ + pkg_resources.Requirement.parse(r) + for r in [ + "astropy>=1.0", + "odoo8-addon-addon1>=8.0.3.0.0", + "odoo>=8.0a,<9.0a", + "python-dateutil", + ] + ], + ) + self.assertTrue(dist.has_metadata("not-zip-safe")) self.assertEqual(dist.version, "8.0.2.0.0") finally: shutil.rmtree(egg_info_dir) def test_odoo_addon5(self): - addon5_dir = os.path.join(DATA_DIR, 'setup_reusable_addons', 'addon5') - subprocess.check_call([sys.executable, 'setup.py', 'egg_info'], - cwd=addon5_dir) - egg_info_dir = os.path.join(addon5_dir, - 'odoo8_addon_addon5.egg-info') + addon5_dir = os.path.join(DATA_DIR, "setup_reusable_addons", "addon5") + subprocess.check_call([sys.executable, "setup.py", "egg_info"], cwd=addon5_dir) + egg_info_dir = os.path.join(addon5_dir, "odoo8_addon_addon5.egg-info") assert os.path.isdir(egg_info_dir) try: dist = next(pkg_resources.find_distributions(addon5_dir)) - self.assertEqual(dist.key, 'odoo8-addon-addon5') + self.assertEqual(dist.key, "odoo8-addon-addon5") finally: shutil.rmtree(egg_info_dir) def test_odoo_addon5_wheel(self): - addon5_dir = os.path.join(DATA_DIR, 'setup_reusable_addons', 'addon5') + addon5_dir = os.path.join(DATA_DIR, "setup_reusable_addons", "addon5") # add a file that is not under git control notingit_fname = os.path.join( - addon5_dir, 'odoo_addons', 'addon5', 'data', 'notingit.xml') - with open(notingit_fname, 'w') as f: - f.write('') + addon5_dir, "odoo_addons", "addon5", "data", "notingit.xml" + ) + with open(notingit_fname, "w") as f: + f.write("") self.assertTrue(os.path.isfile(notingit_fname)) try: bdist_dir = tempfile.mkdtemp() @@ -140,29 +149,34 @@ def test_odoo_addon5_wheel(self): dist_dir = tempfile.mkdtemp() assert os.path.isdir(dist_dir) try: - subprocess.check_call([sys.executable, - 'setup.py', 'bdist_wheel', - '-b', bdist_dir, '-d', dist_dir], - cwd=addon5_dir) - wheel_fname = glob.glob(os.path.join(dist_dir, '*.whl'))[0] + subprocess.check_call( + [ + sys.executable, + "setup.py", + "bdist_wheel", + "-b", + bdist_dir, + "-d", + dist_dir, + ], + cwd=addon5_dir, + ) + wheel_fname = glob.glob(os.path.join(dist_dir, "*.whl"))[0] with ZipFile(wheel_fname) as zf: namelist = zf.namelist() - assert 'odoo_addons/addon5/__openerp__.py' \ - in namelist + assert "odoo_addons/addon5/__openerp__.py" in namelist # some non python file was included because # # it is under git control - assert 'odoo_addons/addon5/data/somedata.xml' \ - in namelist + assert "odoo_addons/addon5/data/somedata.xml" in namelist # this file is not under git control, # so its not in the wheel - assert 'odoo_addons/addon5/data/notingit.xml' \ - not in namelist + assert "odoo_addons/addon5/data/notingit.xml" not in namelist finally: shutil.rmtree(dist_dir) - shutil.rmtree(os.path.join( - addon5_dir, 'build')) - shutil.rmtree(os.path.join( - addon5_dir, 'odoo8_addon_addon5.egg-info')) + shutil.rmtree(os.path.join(addon5_dir, "build")) + shutil.rmtree( + os.path.join(addon5_dir, "odoo8_addon_addon5.egg-info") + ) finally: if os.path.isdir(bdist_dir): shutil.rmtree(bdist_dir) @@ -170,21 +184,21 @@ def test_odoo_addon5_wheel(self): os.unlink(notingit_fname) def test_custom_project(self): - project_dir = os.path.join(DATA_DIR, 'setup_custom_project') - subprocess.check_call([sys.executable, 'setup.py', 'egg_info'], - cwd=project_dir) - egg_info_dir = os.path.join(project_dir, - 'test_custom_project.egg-info') + project_dir = os.path.join(DATA_DIR, "setup_custom_project") + subprocess.check_call([sys.executable, "setup.py", "egg_info"], cwd=project_dir) + egg_info_dir = os.path.join(project_dir, "test_custom_project.egg-info") assert os.path.isdir(egg_info_dir) dist = next(pkg_resources.find_distributions(project_dir)) - self.assertEqual(dist.requires(), - [pkg_resources.Requirement.parse(r) for r in - ['pyflakes', - 'odoo>=8.0a,<9.0a', - 'python-dateutil']]) - self.assertFalse(dist.has_metadata('not-zip-safe')) + self.assertEqual( + dist.requires(), + [ + pkg_resources.Requirement.parse(r) + for r in ["pyflakes", "odoo>=8.0a,<9.0a", "python-dateutil"] + ], + ) + self.assertFalse(dist.has_metadata("not-zip-safe")) shutil.rmtree(egg_info_dir) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/tox.ini b/tox.ini index c305e7fd..4d2ccf35 100644 --- a/tox.ini +++ b/tox.ini @@ -4,7 +4,7 @@ # and then run "tox" from this directory. [tox] -envlist = +envlist = py27 py35 py36 @@ -14,11 +14,10 @@ envlist = [testenv] skip_missing_interpreters = True usedevelop = True -commands = pytest --cov=setuptools_odoo --cov-branch --cov-report=html --flake8 --ignore=tests/data {posargs} +commands = pytest --cov=setuptools_odoo --cov-branch --cov-report=html --ignore=tests/data {posargs} deps = pytest pytest-cov - pytest-flake8 [testenv:check_readme] skip_install=True @@ -26,3 +25,9 @@ deps= readme_renderer commands= python setup.py check -r -s + +[testenv:pre_commit] +deps = + pre-commit +commands = + pre-commit run --all-files --show-diff-on-failure