diff --git a/odoo_scripts/__init__.py b/odoo_scripts/__init__.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL19faW5pdF9fLnB5..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL19faW5pdF9fLnB5 100644 --- a/odoo_scripts/__init__.py +++ b/odoo_scripts/__init__.py @@ -1,5 +1,6 @@ """Odoo Scripts""" # expose some useful functions +from ._parsing import logging_from_verbose # noqa: F401 from ._version import __version__ # noqa: F401 from .odoo import odoo_connect, odoo_connect_parser, odoo_login # noqa: F401 @@ -4,5 +5,4 @@ from ._version import __version__ # noqa: F401 from .odoo import odoo_connect, odoo_connect_parser, odoo_login # noqa: F401 -from .parsing import logging_from_verbose # noqa: F401 __author__ = "XCG Consulting" diff --git a/odoo_scripts/docker_client.py b/odoo_scripts/_docker_client.py similarity index 98% rename from odoo_scripts/docker_client.py rename to odoo_scripts/_docker_client.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL2RvY2tlcl9jbGllbnQucHk=..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL19kb2NrZXJfY2xpZW50LnB5 100644 --- a/odoo_scripts/docker_client.py +++ b/odoo_scripts/_docker_client.py @@ -53,7 +53,7 @@ _logger.debug("Volume %s already exists", volume_name) return volumes[0], False _logger.debug("Creating volume %s", volume_name) - labels = dict(odoo_scripts="") + labels = {"odoo_scripts": ""} if extra_labels: labels.update(extra_labels) return docker.volume.create(volume_name, labels=labels), True @@ -73,7 +73,7 @@ :param user: User to execute command as. :param interactive: True if the container needs to be interactive """ - with capture_docker_exit_code() as exit_code: + with CaptureDockerExitCode() as exit_code: container.execute(command, user=user, interactive=interactive, tty=True) return int(exit_code) @@ -213,7 +213,7 @@ image = docker.image.list(config.local_image_name) if not image: raise Exception( - "Image %s is not built, needed to be inspected", config.local_image_name + f"Image {config.local_image_name} is not built, needed to be inspected" ) if isinstance(image[0].config.env, list): for env in image[0].config.env: @@ -413,11 +413,11 @@ self._log_process = process def _create_param(self) -> Dict: - return dict( - name=self.name, - networks="host", - image=self.base_image, - ) + return { + "name": self.name, + "networks": "host", + "image": self.base_image, + } def _start(self) -> None: self._container = docker.container.create(**self._create_param()) @@ -554,7 +554,7 @@ return bool(self.value) -class capture_docker_exit_code: +class CaptureDockerExitCode: """Context manager to get error code when using docker::run""" def __init__(self, print_exc: bool = True): diff --git a/odoo_scripts/importing.py b/odoo_scripts/_importing.py similarity index 94% rename from odoo_scripts/importing.py rename to odoo_scripts/_importing.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL2ltcG9ydGluZy5weQ==..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL19pbXBvcnRpbmcucHk= 100644 --- a/odoo_scripts/importing.py +++ b/odoo_scripts/_importing.py @@ -81,5 +81,5 @@ file_list.extend(files) if directories: for directory in directories: - for root, subdirectories, files in os.walk(directory, followlinks=True): + for root, subdirectories, dir_files in os.walk(directory, followlinks=True): subdirectories.sort() @@ -85,5 +85,5 @@ subdirectories.sort() - file_list.extend(os.path.join(root, f) for f in sorted(files)) + file_list.extend(os.path.join(root, f) for f in sorted(dir_files)) for filename in file_list: _logger.debug("%s to import", filename) diff --git a/odoo_scripts/logpipe.py b/odoo_scripts/_logpipe.py similarity index 74% rename from odoo_scripts/logpipe.py rename to odoo_scripts/_logpipe.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL2xvZ3BpcGUucHk=..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL19sb2dwaXBlLnB5 100644 --- a/odoo_scripts/logpipe.py +++ b/odoo_scripts/_logpipe.py @@ -13,9 +13,9 @@ self.daemon = False self.logger = logger self.level = level - self.fdRead, self.fdWrite = os.pipe() - self.pipeReader = os.fdopen(self.fdRead) + self.fd_read, self.fd_write = os.pipe() + self.pipe_reader = os.fdopen(self.fd_read) self.start() def fileno(self): """Return the write file descriptor of the pipe""" @@ -18,8 +18,8 @@ self.start() def fileno(self): """Return the write file descriptor of the pipe""" - return self.fdWrite + return self.fd_write def run(self): """Run the thread, logging everything.""" @@ -23,6 +23,6 @@ def run(self): """Run the thread, logging everything.""" - for line in iter(self.pipeReader.readline, ""): + for line in iter(self.pipe_reader.readline, ""): self.logger.log(self.level, line.strip("\n")) @@ -27,6 +27,6 @@ self.logger.log(self.level, line.strip("\n")) - self.pipeReader.close() + self.pipe_reader.close() def close(self): """Close the write end of the pipe.""" @@ -30,4 +30,4 @@ def close(self): """Close the write end of the pipe.""" - os.close(self.fdWrite) + os.close(self.fd_write) diff --git a/odoo_scripts/parsing.py b/odoo_scripts/_parsing.py similarity index 97% rename from odoo_scripts/parsing.py rename to odoo_scripts/_parsing.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL3BhcnNpbmcucHk=..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL19wYXJzaW5nLnB5 100644 --- a/odoo_scripts/parsing.py +++ b/odoo_scripts/_parsing.py @@ -37,5 +37,5 @@ level = logging.WARNING elif verbosity == -2: level = logging.ERROR - elif verbosity == -3: + elif verbosity <= -3: level = logging.CRITICAL @@ -41,5 +41,5 @@ level = logging.CRITICAL - elif verbosity > 0: + else: level = logging.DEBUG coloredlogs.install(level, fmt="%(asctime)s %(levelname)8s %(name)s %(message)s") diff --git a/odoo_scripts/postgres.py b/odoo_scripts/_postgres.py similarity index 100% rename from odoo_scripts/postgres.py rename to odoo_scripts/_postgres.py diff --git a/odoo_scripts/toml.py b/odoo_scripts/_toml.py similarity index 71% rename from odoo_scripts/toml.py rename to odoo_scripts/_toml.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL3RvbWwucHk=..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL190b21sLnB5 100644 --- a/odoo_scripts/toml.py +++ b/odoo_scripts/_toml.py @@ -1,6 +1,5 @@ try: # Python 3.11+ from tomllib import load as toml_load - from tomllib import loads as toml_loads load = toml_load @@ -5,5 +4,4 @@ load = toml_load - loads = toml_loads except ImportError: from tomli import load as tomli_load # type: ignore[import] @@ -8,5 +6,4 @@ except ImportError: from tomli import load as tomli_load # type: ignore[import] - from tomli import loads as tomli_loads # type: ignore[import] load = tomli_load @@ -11,3 +8,2 @@ load = tomli_load - loads = tomli_loads diff --git a/odoo_scripts/which.py b/odoo_scripts/_which.py similarity index 100% rename from odoo_scripts/which.py rename to odoo_scripts/_which.py diff --git a/odoo_scripts/conf2reST.py b/odoo_scripts/conf2reST.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL2NvbmYycmVTVC5weQ==..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL2NvbmYycmVTVC5weQ== 100755 --- a/odoo_scripts/conf2reST.py +++ b/odoo_scripts/conf2reST.py @@ -10,4 +10,5 @@ import yaml +from ._parsing import apply, basic_parser from .config import Configuration @@ -13,5 +14,4 @@ from .config import Configuration -from .parsing import apply, basic_parser _logger = logging.getLogger(__name__) @@ -45,6 +45,7 @@ default="..", ) parser.add_argument("-o", "--output", help="Output file name") + parser.add_argument("--encoding", help="Output file encoding", default="utf-8") nmspc = parser.parse_args(argv) apply(nmspc) @@ -48,7 +49,7 @@ nmspc = parser.parse_args(argv) apply(nmspc) - conf2rst(nmspc.directory, nmspc.output) + conf2rst(nmspc.directory, nmspc.output, nmspc.encoding) return 0 @@ -52,7 +53,7 @@ return 0 -def conf2rst(directory: str, output=None): +def conf2rst(directory: str, output=None, encoding: Optional[str] = None): """ :param directory: destination directory :param output: file to write to, else prints in stdout @@ -143,7 +144,7 @@ # output the rst if output: - with open(output, "w") as output_file: + with open(output, "w", encoding=encoding) as output_file: write_rst(output_file, rst) else: write_rst(sys.stdout, rst) diff --git a/odoo_scripts/config.py b/odoo_scripts/config.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL2NvbmZpZy5weQ==..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL2NvbmZpZy5weQ== 100644 --- a/odoo_scripts/config.py +++ b/odoo_scripts/config.py @@ -14,7 +14,7 @@ from packaging.version import Version, parse from . import __version__ as version -from .toml import loads as toml_loads +from ._toml import load as toml_load SECTION = "odoo_scripts" OTHER_SOURCES_KEY = "other_sources" @@ -84,9 +84,8 @@ "config.toml", ) if os.path.exists(global_setup_path): - with open(global_setup_path, "r") as f: - global_setup_str = f.read() - self._global_setup = dict(toml_loads(global_setup_str)) + with open(global_setup_path, "rb") as f: + self._global_setup = dict(toml_load(f)) # read expanded configurations information expanded_info: defaultdict[Any, Dict] = defaultdict(dict) @@ -154,7 +153,6 @@ self.modules: List[str] self.dependencies: List[str] self.other_sources: List[str] - self.excluded_in_sources: List[str] for key in ( "modules", "dependencies", @@ -172,7 +170,10 @@ set_values.update( set_from_glob_values(path, values, key != OTHER_SOURCES_KEY) ) - setattr(self, key, list(set_values)) + if key == EXCLUDED_IN_SOURCES_KEY: + self.excluded_paths = {Path(excluded) for excluded in set_values} + else: + setattr(self, key, list(set_values)) def read_expanded( key: str, @@ -396,6 +397,5 @@ def sources_modules(self) -> List[str]: """modules without those matching excluded_in_sources""" if self.__sources_modules is None: - excluded_paths = [Path(excluded) for excluded in self.excluded_in_sources] self.__sources_modules = list( filter( @@ -400,11 +400,8 @@ self.__sources_modules = list( filter( - lambda module: not any( - excluded_path in Path(module).parents - for excluded_path in excluded_paths - ), + lambda module: self.included(Path(module)), self.modules, ) ) return self.__sources_modules @@ -406,8 +403,17 @@ self.modules, ) ) return self.__sources_modules + def included(self, module_path: Path) -> bool: + """ + :return: True if the module Path is to be included + """ + return all( + excluded_path not in module_path.parents + for excluded_path in self.excluded_paths + ) + class Singleton(type): """Singleton metaclass. From diff --git a/odoo_scripts/do_tests.py b/odoo_scripts/do_tests.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL2RvX3Rlc3RzLnB5..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL2RvX3Rlc3RzLnB5 100755 --- a/odoo_scripts/do_tests.py +++ b/odoo_scripts/do_tests.py @@ -12,9 +12,10 @@ from odoo_scripts.docker_postgresql import docker_run_postgresql +from ._parsing import apply, basic_parser from .config import Config from .docker_build import add_build_options, get_build_options from .docker_dev_start import main as docker_dev_start_main from .docker_flake8 import apply_flake8, parser_add_flake8_group from .docker_isort import apply_isort, parser_add_isort_group from .docker_postgresql import POSTGRES_PASSWORD @@ -15,10 +16,9 @@ from .config import Config from .docker_build import add_build_options, get_build_options from .docker_dev_start import main as docker_dev_start_main from .docker_flake8 import apply_flake8, parser_add_flake8_group from .docker_isort import apply_isort, parser_add_isort_group from .docker_postgresql import POSTGRES_PASSWORD -from .parsing import apply, basic_parser _logger = logging.getLogger(__name__) diff --git a/odoo_scripts/docker_black.py b/odoo_scripts/docker_black.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL2RvY2tlcl9ibGFjay5weQ==..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL2RvY2tlcl9ibGFjay5weQ== 100644 --- a/odoo_scripts/docker_black.py +++ b/odoo_scripts/docker_black.py @@ -7,5 +7,7 @@ from argparse import ArgumentParser from typing import List, Optional +from ._docker_client import DockerClient, get_volumes +from ._parsing import apply, basic_parser from .config import ODOO_11, ODOO_12, ODOO_13, ODOO_14, ODOO_15, ODOO_16, Config from .docker_build import add_build_options, build_local_image, get_build_options @@ -10,7 +12,5 @@ from .config import ODOO_11, ODOO_12, ODOO_13, ODOO_14, ODOO_15, ODOO_16, Config from .docker_build import add_build_options, build_local_image, get_build_options -from .docker_client import DockerClient, get_volumes -from .parsing import apply, basic_parser __version__ = "2.3.0" __date__ = "2022-03-03" diff --git a/odoo_scripts/docker_build.py b/odoo_scripts/docker_build.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL2RvY2tlcl9idWlsZC5weQ==..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL2RvY2tlcl9idWlsZC5weQ== 100644 --- a/odoo_scripts/docker_build.py +++ b/odoo_scripts/docker_build.py @@ -14,7 +14,9 @@ from python_on_whales import docker from ._cvs import get_repo +from ._docker_client import CaptureDockerExitCode +from ._parsing import apply, basic_parser from .config import ODOO_7, ODOO_8, ODOO_10, ODOO_11, ODOO_13, ODOO_14, Config from .docker_build_clean import clean from .docker_build_copy import Configuration as CopyConfiguration from .docker_build_copy import add_build_copy_options, copy, get_build_copy_options @@ -17,10 +19,8 @@ from .config import ODOO_7, ODOO_8, ODOO_10, ODOO_11, ODOO_13, ODOO_14, Config from .docker_build_clean import clean from .docker_build_copy import Configuration as CopyConfiguration from .docker_build_copy import add_build_copy_options, copy, get_build_copy_options -from .docker_client import capture_docker_exit_code -from .parsing import apply, basic_parser from .storage import get_orus_api_token _logger = logging.getLogger(__name__) @@ -23,6 +23,6 @@ from .storage import get_orus_api_token _logger = logging.getLogger(__name__) -__version__ = "1.7.0" +__version__ = "1.7.1" __date__ = "2018-04-04" @@ -28,5 +28,5 @@ __date__ = "2018-04-04" -__updated__ = "2024-01-17" +__updated__ = "2024-10-10" def add_build_options(parser: argparse.ArgumentParser): @@ -193,7 +193,8 @@ debug_dockerfile = "Dockerfile.debug" call(["cp", dockerfile, debug_dockerfile]) - with open(debug_dockerfile, "a") as myfile: + # expect Dockerfile to be in utf-8 too + with open(debug_dockerfile, "a", encoding="utf-8") as myfile: myfile.write("\n# Developer helpers\nENV PIP_CACHE_DIR=/var/cache/pip\n") if odoo_type in ( ODOO_7, @@ -250,7 +251,7 @@ pull = not nmspc.no_pull _logger.debug("Docker Pull %s", pull) full_tags = [repository] if nmspc.local else [f"{repository}:{tag}" for tag in tags] - with capture_docker_exit_code() as exit_code: + with CaptureDockerExitCode() as exit_code: if docker.buildx.is_installed(): _logger.info("Using docker buildx") docker.buildx.build( diff --git a/odoo_scripts/docker_build_clean.py b/odoo_scripts/docker_build_clean.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL2RvY2tlcl9idWlsZF9jbGVhbi5weQ==..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL2RvY2tlcl9idWlsZF9jbGVhbi5weQ== 100644 --- a/odoo_scripts/docker_build_clean.py +++ b/odoo_scripts/docker_build_clean.py @@ -7,5 +7,6 @@ import sys from typing import List, Optional +from ._parsing import apply, basic_parser from .docker_build_copy import _PYTHON_PACKAGES_DIR from .list_modules import MODULES_LIST_FILE @@ -10,6 +11,5 @@ from .docker_build_copy import _PYTHON_PACKAGES_DIR from .list_modules import MODULES_LIST_FILE -from .parsing import apply, basic_parser _logger = logging.getLogger(__name__) diff --git a/odoo_scripts/docker_build_copy.py b/odoo_scripts/docker_build_copy.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL2RvY2tlcl9idWlsZF9jb3B5LnB5..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL2RvY2tlcl9idWlsZF9jb3B5LnB5 100644 --- a/odoo_scripts/docker_build_copy.py +++ b/odoo_scripts/docker_build_copy.py @@ -14,6 +14,6 @@ import hglib -from odoo_scripts.logpipe import LogPipe +from odoo_scripts._logpipe import LogPipe from ._cvs import get_repo @@ -18,4 +18,6 @@ from ._cvs import get_repo +from ._parsing import apply, basic_parser +from ._toml import load from .config import Config from .list_modules import list_modules @@ -20,4 +22,3 @@ from .config import Config from .list_modules import list_modules -from .parsing import apply, basic_parser from .storage import get_orus_api_token @@ -23,5 +24,4 @@ from .storage import get_orus_api_token -from .toml import load _logger = logging.getLogger(__name__) @@ -25,5 +25,5 @@ _logger = logging.getLogger(__name__) -__version__ = "2.6.1" +__version__ = "2.6.2" __date__ = "2020-06-30" @@ -29,5 +29,5 @@ __date__ = "2020-06-30" -__updated__ = "2024-09-16" +__updated__ = "2024-10-10" _ODOO_MODULES_DIR = "odoo_modules" _PYTHON_PACKAGES_DIR = "python_packages" @@ -137,7 +137,9 @@ list_modules() if empty: # Add empty requirements - with open(os.path.join(_PYTHON_PACKAGES_DIR, "requirements"), "wt") as f: + with open( + os.path.join(_PYTHON_PACKAGES_DIR, "requirements"), "wt", encoding="utf-8" + ) as f: f.write("") return @@ -218,7 +220,7 @@ # Write requirements file # pip needs to be run with pip install -r <target>/requirements for the paths in the # file to be valid - with open(os.path.join(target, "requirements"), "wt") as f: + with open(os.path.join(target, "requirements"), "wt", encoding="utf-8") as f: f.write("\n".join(requirements)) # copy setup files to odoo_setup @@ -503,7 +505,7 @@ with open(toml_file, "rb") as f: package_name = load(f).get("project", {}).get("name", "") if package_name: - _logger.debug(f"Package name {package_name} for {package}") + _logger.debug("Package name %s for %s", package_name, package) # try to find out version hg_root = run(["hg", "root"], cwd=package, capture_output=True) if not hg_root.returncode: diff --git a/odoo_scripts/docker_build_doc.py b/odoo_scripts/docker_build_doc.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL2RvY2tlcl9idWlsZF9kb2MucHk=..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL2RvY2tlcl9idWlsZF9kb2MucHk= 100644 --- a/odoo_scripts/docker_build_doc.py +++ b/odoo_scripts/docker_build_doc.py @@ -7,5 +7,7 @@ import sys from typing import List, Optional +from ._docker_client import DockerClient, get_volumes +from ._parsing import apply, basic_parser from .config import Config from .docker_build import add_build_options, build_local_image, get_build_options @@ -10,7 +12,5 @@ from .config import Config from .docker_build import add_build_options, build_local_image, get_build_options -from .docker_client import DockerClient, get_volumes -from .parsing import apply, basic_parser __version__ = "1.0.1" __date__ = "2022-11-10" diff --git a/odoo_scripts/docker_dev_start.py b/odoo_scripts/docker_dev_start.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL2RvY2tlcl9kZXZfc3RhcnQucHk=..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL2RvY2tlcl9kZXZfc3RhcnQucHk= 100755 --- a/odoo_scripts/docker_dev_start.py +++ b/odoo_scripts/docker_dev_start.py @@ -22,6 +22,17 @@ from psycopg2.errors import DuplicateDatabase, DuplicateObject from python_on_whales import docker +from ._docker_client import ( + CaptureDockerExitCode, + DockerClient, + Mount, + anthem_mounts, + modules_mount, + mount, + odoo_source_mounts, +) +from ._parsing import apply, basic_parser +from ._toml import load from .config import ( ODOO_7, ODOO_8, @@ -35,15 +46,6 @@ Config, ) from .docker_build import add_build_options, build_local_image, get_build_options -from .docker_client import ( - DockerClient, - Mount, - anthem_mounts, - capture_docker_exit_code, - modules_mount, - mount, - odoo_source_mounts, -) from .docker_flake8 import apply_flake8, parser_add_flake8_group from .docker_isort import apply_isort, parser_add_isort_group from .docker_postgresql import POSTGRES_PASSWORD, docker_run_postgresql @@ -51,8 +53,6 @@ from .docker_pylint import apply_pylint, parser_add_pylint_group from .docker_redis import DockerRedis from .docker_rednerd import DockerRednerd, get_default_redner_database -from .parsing import apply, basic_parser -from .toml import load # TODO auto create list of module @@ -1015,7 +1015,7 @@ inside_restore_filename = "/tmp/{}".format(restore_basename) docker.copy(restore_filename, (pg, inside_restore_filename)) _logger.info("Restoring database %s", database) - with capture_docker_exit_code() as exit_code: + with CaptureDockerExitCode() as exit_code: pg.execute( [ "pg_restore", @@ -1086,7 +1086,7 @@ pre_sql_script_basename, database, ) - with capture_docker_exit_code() as exit_code: + with CaptureDockerExitCode() as exit_code: pg.execute( [ "psql", @@ -1135,13 +1135,13 @@ if start_postgresql: # uses the unix socket connect_kwargs.update( - dict( - user="postgres", - host=db_host, - port="5432", - password=POSTGRES_PASSWORD, - ) + { + "user": "postgres", + "host": db_host, + "port": "5432", + "password": POSTGRES_PASSWORD, + } ) else: loginname = pwd.getpwuid(os.getuid())[0] # use socket to create user @@ -1144,8 +1144,8 @@ ) else: loginname = pwd.getpwuid(os.getuid())[0] # use socket to create user - connect_kwargs.update(dict(user=loginname)) + connect_kwargs.update({"user": loginname}) connection = connect(**connect_kwargs) connection.autocommit = True with connection.cursor() as cursor: @@ -1525,7 +1525,7 @@ arg = [nmspc.anthem_song, *arg] _logger.info("Starting Odoo") - with capture_docker_exit_code() as exit_code: + with CaptureDockerExitCode() as exit_code: docker.container.run( image, command=arg, diff --git a/odoo_scripts/docker_flake8.py b/odoo_scripts/docker_flake8.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL2RvY2tlcl9mbGFrZTgucHk=..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL2RvY2tlcl9mbGFrZTgucHk= 100644 --- a/odoo_scripts/docker_flake8.py +++ b/odoo_scripts/docker_flake8.py @@ -7,6 +7,8 @@ import sys from typing import List, Optional, Tuple +from ._docker_client import DockerClient +from ._parsing import apply, basic_parser from .config import ( ODOO_7, ODOO_8, @@ -21,8 +23,6 @@ Config, Configuration, ) -from .docker_client import DockerClient -from .parsing import apply, basic_parser __version__ = "1.5.0" __date__ = "2020-09-10" @@ -76,7 +76,7 @@ if uses_flake8(config): flake8(config) else: - _logger.warning(f"No flake8 for {config.odoo_type}, ignoring running it") + _logger.warning("No flake8 for %s, ignoring running it", config.odoo_type) def main(argv: Optional[List[str]] = None) -> int: @@ -92,6 +92,6 @@ """determine image to use based on odoo version""" if config.odoo_type in (ODOO_7, ODOO_8, ODOO_9, ODOO_10): return "xcgd/flake8", "2" - elif config.odoo_type in (ODOO_14, ODOO_15, ODOO_16): + if config.odoo_type in (ODOO_14, ODOO_15, ODOO_16): return config.local_image, config.local_tag # TODO vérifier ce qu’il faut faire en v11 et 13 @@ -96,6 +96,6 @@ return config.local_image, config.local_tag # TODO vérifier ce qu’il faut faire en v11 et 13 - elif config.odoo_type in (ODOO_11, ODOO_12, ODOO_13): + if config.odoo_type in (ODOO_11, ODOO_12, ODOO_13): return "xcgd/flake8", "3" return None diff --git a/odoo_scripts/docker_isort.py b/odoo_scripts/docker_isort.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL2RvY2tlcl9pc29ydC5weQ==..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL2RvY2tlcl9pc29ydC5weQ== 100644 --- a/odoo_scripts/docker_isort.py +++ b/odoo_scripts/docker_isort.py @@ -7,6 +7,8 @@ import sys from typing import List, Optional +from ._docker_client import DockerClient, get_volumes +from ._parsing import apply, basic_parser from .config import ( ODOO_7, ODOO_8, @@ -21,8 +23,6 @@ Config, ) from .docker_build import add_build_options, build_local_image, get_build_options -from .docker_client import DockerClient, get_volumes -from .parsing import apply, basic_parser __version__ = "3.1.0" __date__ = "2020-09-10" @@ -139,8 +139,7 @@ directory=getattr(namespace, _ISORT_DIR_DEST), config=config, ) - else: - _logger.warning(f"No isort for {config.odoo_type}, ignoring running it") + _logger.warning("No isort for %s, ignoring running it", config.odoo_type) return 0 diff --git a/odoo_scripts/docker_postgresql.py b/odoo_scripts/docker_postgresql.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL2RvY2tlcl9wb3N0Z3Jlc3FsLnB5..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL2RvY2tlcl9wb3N0Z3Jlc3FsLnB5 100644 --- a/odoo_scripts/docker_postgresql.py +++ b/odoo_scripts/docker_postgresql.py @@ -14,4 +14,6 @@ from python_on_whales import Container, docker from python_on_whales.exceptions import NoSuchContainer +from ._docker_client import DockerClient, Mount, mount +from ._parsing import apply, basic_parser from .config import Config @@ -17,6 +19,4 @@ from .config import Config -from .docker_client import DockerClient, Mount, mount -from .parsing import apply, basic_parser _logger = logging.getLogger(__name__) diff --git a/odoo_scripts/docker_prettier.py b/odoo_scripts/docker_prettier.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL2RvY2tlcl9wcmV0dGllci5weQ==..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL2RvY2tlcl9wcmV0dGllci5weQ== 100644 --- a/odoo_scripts/docker_prettier.py +++ b/odoo_scripts/docker_prettier.py @@ -6,5 +6,7 @@ import sys from typing import List, Optional +from ._docker_client import DockerClient, get_volumes +from ._parsing import apply, basic_parser from .config import ODOO_7, ODOO_8, ODOO_9, ODOO_10, Config from .docker_build import add_build_options, build_local_image, get_build_options @@ -9,7 +11,5 @@ from .config import ODOO_7, ODOO_8, ODOO_9, ODOO_10, Config from .docker_build import add_build_options, build_local_image, get_build_options -from .docker_client import DockerClient, get_volumes -from .parsing import apply, basic_parser __version__ = "1.1.1" __date__ = "2022-02-17" diff --git a/odoo_scripts/docker_py3o.py b/odoo_scripts/docker_py3o.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL2RvY2tlcl9weTNvLnB5..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL2RvY2tlcl9weTNvLnB5 100644 --- a/odoo_scripts/docker_py3o.py +++ b/odoo_scripts/docker_py3o.py @@ -6,7 +6,7 @@ from python_on_whales import docker -from .docker_client import capture_docker_exit_code, find_container, stop_remove +from ._docker_client import CaptureDockerExitCode, find_container, stop_remove _logger = logging.getLogger(__name__) @@ -17,7 +17,7 @@ fusion_version = "1.0.0" fusion_name = "py3o_fusion" fusion_image = f"{fusion_repository}:{fusion_version}" - with capture_docker_exit_code() as exit_code: + with CaptureDockerExitCode() as exit_code: _logger.debug("Pulling %s", fusion_repository) docker.image.pull(f"{fusion_repository}:{fusion_version}") if exit_code: diff --git a/odoo_scripts/docker_pylint.py b/odoo_scripts/docker_pylint.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL2RvY2tlcl9weWxpbnQucHk=..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL2RvY2tlcl9weWxpbnQucHk= 100644 --- a/odoo_scripts/docker_pylint.py +++ b/odoo_scripts/docker_pylint.py @@ -6,5 +6,7 @@ import sys from typing import Dict, List, Optional +from ._docker_client import DockerClient, Mount, anthem_mounts, modules_mount, mount +from ._parsing import apply, basic_parser from .config import Config, Configuration from .docker_build import add_build_options, build_local_image, get_build_options @@ -9,7 +11,5 @@ from .config import Config, Configuration from .docker_build import add_build_options, build_local_image, get_build_options -from .docker_client import DockerClient, Mount, anthem_mounts, modules_mount, mount -from .parsing import apply, basic_parser __version__ = "1.2.0" __date__ = "2022-01-26" diff --git a/odoo_scripts/docker_redis.py b/odoo_scripts/docker_redis.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL2RvY2tlcl9yZWRpcy5weQ==..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL2RvY2tlcl9yZWRpcy5weQ== 100644 --- a/odoo_scripts/docker_redis.py +++ b/odoo_scripts/docker_redis.py @@ -9,8 +9,8 @@ import time from typing import List, Optional -from .docker_client import DockerClient, DockerService, mount -from .parsing import apply, basic_parser +from ._docker_client import DockerClient, DockerService, mount +from ._parsing import apply, basic_parser __version__ = "1.1.0" __date__ = "2023-03-20" @@ -85,7 +85,9 @@ def _start(self) -> None: super()._start() if os.path.exists("/proc/sys/vm/overcommit_memory"): - with open("/proc/sys/vm/overcommit_memory", "r") as f: + # if the file exists, it uses the default system encoding, so disable the + # error in pylint + with open("/proc/sys/vm/overcommit_memory", "r") as f: # pylint: disable=unspecified-encoding data = f.read() if data == "0\n": _logger.info( @@ -99,7 +101,7 @@ def __parser() -> argparse.ArgumentParser: program_version_message = f"%(prog)s {__version__} ({__updated__})" - program_short_description = __doc__.split(".")[0] + program_short_description = __doc__.split(".", maxsplit=1)[0] program_license = f"""{program_short_description} Created by Vincent Hatakeyama on {__date__}. diff --git a/odoo_scripts/docker_rednerd.py b/odoo_scripts/docker_rednerd.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL2RvY2tlcl9yZWRuZXJkLnB5..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL2RvY2tlcl9yZWRuZXJkLnB5 100644 --- a/odoo_scripts/docker_rednerd.py +++ b/odoo_scripts/docker_rednerd.py @@ -18,4 +18,7 @@ from psycopg2 import OperationalError from python_on_whales import docker +from ._docker_client import DockerClient, DockerService, Mount, mount +from ._parsing import apply, basic_parser +from ._postgres import host_from_dsn, postgres_connect_args, postgres_connect_parser from .config import Config @@ -21,7 +24,4 @@ from .config import Config -from .docker_client import DockerClient, DockerService, Mount, mount -from .parsing import apply, basic_parser -from .postgres import host_from_dsn, postgres_connect_args, postgres_connect_parser _logger = logging.getLogger(__name__) @@ -133,13 +133,13 @@ # base parameters for container creation ports: List[Tuple[str, str]] = [] mounts: List[Mount] = [] - create_param: Dict[str, Any] = dict( - name=self.name, - publish=ports, - envs=self.environment, - mounts=mounts, - networks="host", - ) + create_param: Dict[str, Any] = { + "name": self.name, + "publish": ports, + "envs": self.environment, + "mounts": mounts, + "networks": "host", + } if self.db_is_socket_path: if self.db_host: mounts.append(mount(self.db_host, self.db_host, "bind")) @@ -307,7 +307,7 @@ def __parser() -> argparse.ArgumentParser: """Return a parser for docker_rednerd""" program_version_message = f"%(prog)s {__version__} ({__updated__})" - program_short_description = __doc__.split(".")[0] + program_short_description = __doc__.split(".", maxsplit=1)[0] program_license = f"""{program_short_description} Created by Oury Balde on {__date__}. diff --git a/odoo_scripts/import_base_import.py b/odoo_scripts/import_base_import.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL2ltcG9ydF9iYXNlX2ltcG9ydC5weQ==..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL2ltcG9ydF9iYXNlX2ltcG9ydC5weQ== 100755 --- a/odoo_scripts/import_base_import.py +++ b/odoo_scripts/import_base_import.py @@ -11,8 +11,8 @@ from requests_toolbelt import MultipartEncoder # type: ignore[import] from . import odoo_connect_parser, odoo_login -from .importing import add_importing_file_parsing, extract_model_lang_from_parsed -from .parsing import apply +from ._importing import add_importing_file_parsing, extract_model_lang_from_parsed +from ._parsing import apply _logger = logging.getLogger(__name__) diff --git a/odoo_scripts/import_jsonrpc.py b/odoo_scripts/import_jsonrpc.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL2ltcG9ydF9qc29ucnBjLnB5..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL2ltcG9ydF9qc29ucnBjLnB5 100644 --- a/odoo_scripts/import_jsonrpc.py +++ b/odoo_scripts/import_jsonrpc.py @@ -11,5 +11,6 @@ from dateutil.parser import isoparse from odoorpc.error import RPCError # type: ignore[import] -from .importing import add_importing_file_parsing, extract_model_lang_from_parsed +from ._importing import add_importing_file_parsing, extract_model_lang_from_parsed +from ._parsing import apply from .odoo import odoo_connect_parser, odoo_login @@ -15,5 +16,4 @@ from .odoo import odoo_connect_parser, odoo_login -from .parsing import apply _logger = logging.getLogger(__name__) @@ -17,5 +17,5 @@ _logger = logging.getLogger(__name__) -__version__ = "1.2.2" +__version__ = "1.3.0" __date__ = "2020-02-17" @@ -21,5 +21,5 @@ __date__ = "2020-02-17" -__updated__ = "2022-12-16" +__updated__ = "2024-10-10" def import_with_jsonrpc( @@ -35,6 +35,7 @@ extra_context: Optional[Dict[str, str]] = None, allow_import_errors: bool = False, allow_missing_refs: bool = False, + encoding: str = "utf-8", ) -> int: if extra_context is None: extra_context = {} @@ -173,7 +174,7 @@ "Importing - reading options from yaml file %s", yaml_filename, ) - with open(yaml_filename, "r") as stream: + with open(yaml_filename, "r", encoding="utf-8") as stream: data = yaml.load(stream, Loader=yaml.BaseLoader) import_yaml_cache[yaml_filename] = data if data is not None else {} else: @@ -197,7 +198,7 @@ wrote: List[int] = [] import_errors: List[str] = [] # used with allow_import_errors this_file_delimiter = yaml_delimiter if yaml_delimiter else delimiter - with open(csv_file, "r") as csvfile: + with open(csv_file, "r", encoding=encoding) as csvfile: reader = csv.DictReader( csvfile, delimiter=this_file_delimiter, quotechar='"' ) @@ -312,7 +313,7 @@ _logger.info("%s: created %d, wrote %d", model, len(created), len(wrote)) if import_errors: _logger.warning("%s: %d errors", model, len(import_errors)) - with open(f"{csv_file}-errors.txt", "w") as error_f: + with open(f"{csv_file}-errors.txt", "w", encoding=encoding) as error_f: error_f.write("\n".join(import_errors)) if old_context: key_to_pop = [] diff --git a/odoo_scripts/import_sql.py b/odoo_scripts/import_sql.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL2ltcG9ydF9zcWwucHk=..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL2ltcG9ydF9zcWwucHk= 100644 --- a/odoo_scripts/import_sql.py +++ b/odoo_scripts/import_sql.py @@ -6,11 +6,11 @@ import sys from typing import Dict, List, Optional -from .importing import add_importing_file_parsing, extract_model_table_from_parsed -from .parsing import apply, basic_parser -from .postgres import postgres_apply, postgres_connect_parser +from ._importing import add_importing_file_parsing, extract_model_table_from_parsed +from ._parsing import apply, basic_parser +from ._postgres import postgres_apply, postgres_connect_parser _logger = logging.getLogger(__name__) __version__ = "1.2.0" __date__ = "2020-06-08" @@ -12,9 +12,9 @@ _logger = logging.getLogger(__name__) __version__ = "1.2.0" __date__ = "2020-06-08" -__updated__ = "2023-12-06" +__updated__ = "2024-10-10" def _execute(cursor, query, parameters): @@ -35,7 +35,7 @@ def sql_import( - connection, table_filenames: List[Dict[str, str]], delimiter: str + connection, table_filenames: List[Dict[str, str]], delimiter: str, encoding: str ) -> None: # quick check to fail quicker with connection.cursor() as cur: @@ -51,7 +51,7 @@ _logger.info("Importing - %s in %s (table %s)", csv_file, model, table) has_date_init = _column_exists(cur, "ir_model_data", "date_init") has_date_update = _column_exists(cur, "ir_model_data", "date_update") - with open(csv_file, "r") as file: + with open(csv_file, "r", encoding=encoding) as file: reader = csv.DictReader(file, delimiter=delimiter, quotechar='"') headers_check = False created = written = 0 @@ -216,6 +216,9 @@ parser.add_argument( "--delimiter", help="CSV delimiter [default: %(default)s]", default="," ) + parser.add_argument( + "--encoding", help="CSV encoding [default: %(default)s]", default="utf-8" + ) nmspc = parser.parse_args(argv) apply(nmspc) @@ -225,6 +228,7 @@ connection=conn, table_filenames=extract_model_table_from_parsed(nmspc), delimiter=nmspc.delimiter, + encoding=nmspc.encoding, ) conn.close() return 0 diff --git a/odoo_scripts/list_modules.py b/odoo_scripts/list_modules.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL2xpc3RfbW9kdWxlcy5weQ==..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL2xpc3RfbW9kdWxlcy5weQ== 100644 --- a/odoo_scripts/list_modules.py +++ b/odoo_scripts/list_modules.py @@ -5,4 +5,5 @@ import sys from typing import List, Optional +from ._parsing import apply, basic_parser from .config import Config @@ -8,5 +9,4 @@ from .config import Config -from .parsing import apply, basic_parser MODULES_LIST_FILE = "odoo_modules_list" @@ -54,7 +54,7 @@ filename is provided.""" output = ",".join(Config().module_list) if filename: - with open(filename, "w") as f: + with open(filename, "w", encoding="utf-8") as f: f.write(output) else: print(output) diff --git a/odoo_scripts/odoo.py b/odoo_scripts/odoo.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL29kb28ucHk=..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL29kb28ucHk= 100644 --- a/odoo_scripts/odoo.py +++ b/odoo_scripts/odoo.py @@ -7,7 +7,7 @@ import odoorpc # type: ignore[import] -from .parsing import basic_parser +from ._parsing import basic_parser _logger = logging.getLogger(__name__) diff --git a/odoo_scripts/odoo_conf_inject_env_var.py b/odoo_scripts/odoo_conf_inject_env_var.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL29kb29fY29uZl9pbmplY3RfZW52X3Zhci5weQ==..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL29kb29fY29uZl9pbmplY3RfZW52X3Zhci5weQ== 100644 --- a/odoo_scripts/odoo_conf_inject_env_var.py +++ b/odoo_scripts/odoo_conf_inject_env_var.py @@ -7,7 +7,7 @@ from configparser import ConfigParser from typing import Collection, Optional, Sequence, Tuple -from .parsing import apply, basic_parser +from ._parsing import apply, basic_parser __version__ = "1.0.1" __date__ = "2022-02-22" diff --git a/odoo_scripts/storage.py b/odoo_scripts/storage.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL3N0b3JhZ2UucHk=..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL3N0b3JhZ2UucHk= 100644 --- a/odoo_scripts/storage.py +++ b/odoo_scripts/storage.py @@ -8,5 +8,5 @@ try: import secretstorage - __secretstorage_available = True + __SECRETSTORAGE_AVAILABLE = True except ModuleNotFoundError: @@ -12,5 +12,5 @@ except ModuleNotFoundError: - __secretstorage_available = False + __SECRETSTORAGE_AVAILABLE = False __version__ = "1.0.0" @@ -29,7 +29,7 @@ """Retrieve Orus API token from secret service. :return: None if there is no token""" - if not __secretstorage_available: + if not __SECRETSTORAGE_AVAILABLE: return None with closing(secretstorage.dbus_init()) as conn: collection = secretstorage.get_default_collection(conn) diff --git a/odoo_scripts/update_duplicate_sources.py b/odoo_scripts/update_duplicate_sources.py index 4c06cab4ed4c92fc946894d42b3fe5a8768cd4cf_b2Rvb19zY3JpcHRzL3VwZGF0ZV9kdXBsaWNhdGVfc291cmNlcy5weQ==..e017508c34f0554fae435e6714493cd75fda42f3_b2Rvb19zY3JpcHRzL3VwZGF0ZV9kdXBsaWNhdGVfc291cmNlcy5weQ== 100644 --- a/odoo_scripts/update_duplicate_sources.py +++ b/odoo_scripts/update_duplicate_sources.py @@ -11,5 +11,6 @@ from typing import List, Optional from ._cvs import Repo, clone_from, get_repo +from ._parsing import apply, basic_parser from .config import Config, Configuration from .docker_build_copy import _find_cvs_parent @@ -14,6 +15,5 @@ from .config import Config, Configuration from .docker_build_copy import _find_cvs_parent -from .parsing import apply, basic_parser _logger = logging.getLogger(__name__)