diff --git a/src/molecule/api.py b/src/molecule/api.py index 52931e3973..48cc93f39b 100644 --- a/src/molecule/api.py +++ b/src/molecule/api.py @@ -31,9 +31,9 @@ def __getitem__(self, i): def get(self, key, default): return self.__dict__.get(key, default) - def append(self, element) -> None: - self.__dict__[str(element)] = element - super(UserListMap, self).append(element) + def append(self, item) -> None: + self.__dict__[str(item)] = item + super(UserListMap, self).append(item) @lru_cache() diff --git a/src/molecule/config.py b/src/molecule/config.py index d926b8c728..d7e1682f55 100644 --- a/src/molecule/config.py +++ b/src/molecule/config.py @@ -282,8 +282,8 @@ def _combine(self, env=os.environ, keep_string=None) -> MutableMapping: environment variables. 1. Loads Molecule defaults. - 2. Loads a base config (if provided) and merges ontop of defaults. - 3. Loads the scenario's ``molecule file`` and merges ontop of previous + 2. Loads a base config (if provided) and merges on top of defaults. + 3. Loads the scenario's ``molecule file`` and merges on top of previous merge. :return: dict diff --git a/src/molecule/dependency/ansible_galaxy/base.py b/src/molecule/dependency/ansible_galaxy/base.py index 753bd4e4be..3de72d5a78 100644 --- a/src/molecule/dependency/ansible_galaxy/base.py +++ b/src/molecule/dependency/ansible_galaxy/base.py @@ -44,11 +44,13 @@ def __init__(self, config): self.command = "ansible-galaxy" - @abc.abstractproperty + @property + @abc.abstractmethod def install_path(self): # noqa cover pass - @abc.abstractproperty + @property + @abc.abstractmethod def requirements_file(self): # noqa cover pass diff --git a/src/molecule/dependency/base.py b/src/molecule/dependency/base.py index 0a857764fb..9e4010ffa4 100644 --- a/src/molecule/dependency/base.py +++ b/src/molecule/dependency/base.py @@ -89,7 +89,8 @@ def execute(self): # pragma: no cover :return: None """ - @abc.abstractproperty + @property + @abc.abstractmethod def default_options(self): # pragma: no cover """ Get default CLI arguments provided to ``cmd`` as a dict. diff --git a/src/molecule/driver/base.py b/src/molecule/driver/base.py index 357b08803e..85a7b7f177 100644 --- a/src/molecule/driver/base.py +++ b/src/molecule/driver/base.py @@ -19,9 +19,9 @@ # DEALINGS IN THE SOFTWARE. """Base Driver Module.""" -import abc import inspect import os +from abc import ABCMeta, abstractmethod import pkg_resources @@ -32,7 +32,7 @@ class Driver(object): """Driver Class.""" - __metaclass__ = abc.ABCMeta + __metaclass__ = ABCMeta def __init__(self, config=None): """ @@ -43,27 +43,18 @@ def __init__(self, config=None): """ self._config = config self._path = os.path.abspath(os.path.dirname(inspect.getfile(self.__class__))) - self.module = self.__module__.split(".")[0] + self.module = self.__module__.split(".", maxsplit=1)[0] self.version = pkg_resources.get_distribution(self.module).version - @property # type: ignore - @abc.abstractmethod - def name(self): # pragma: no cover + @property + @abstractmethod + def name(self) -> str: # pragma: no cover """ Name of the driver and returns a string. :returns: str """ - @name.setter # type: ignore - @abc.abstractmethod - def name(self, value): # pragma: no cover - """ - Driver name setter and returns None. - - :returns: None - """ - @property def testinfra_options(self): """ @@ -76,7 +67,8 @@ def testinfra_options(self): "ansible-inventory": self._config.provisioner.inventory_directory, } - @abc.abstractproperty + @property + @abstractmethod def login_cmd_template(self): # pragma: no cover """ Get the login command template to be populated by ``login_options`` as \ @@ -85,7 +77,8 @@ def login_cmd_template(self): # pragma: no cover :returns: str """ - @abc.abstractproperty + @property + @abstractmethod def default_ssh_connection_options(self): # pragma: no cover """ SSH client options and returns a list. @@ -93,7 +86,8 @@ def default_ssh_connection_options(self): # pragma: no cover :returns: list """ - @abc.abstractproperty + @property + @abstractmethod def default_safe_files(self): # pragma: no cover """ Generate files to be preserved. @@ -101,7 +95,7 @@ def default_safe_files(self): # pragma: no cover :returns: list """ - @abc.abstractmethod + @abstractmethod def login_options(self, instance_name): # pragma: no cover """ Options used in the login command and returns a dict. @@ -110,7 +104,7 @@ def login_options(self, instance_name): # pragma: no cover :returns: dict """ - @abc.abstractmethod + @abstractmethod def ansible_connection_options(self, instance_name): # pragma: no cover """ Ansible specific connection options supplied to inventory and returns a \ @@ -120,7 +114,7 @@ def ansible_connection_options(self, instance_name): # pragma: no cover :returns: dict """ - @abc.abstractmethod + @abstractmethod def sanity_checks(self): """ Confirm that driver is usable. diff --git a/src/molecule/lint/base.py b/src/molecule/lint/base.py index 9d22b7e3ba..b0737ffb90 100644 --- a/src/molecule/lint/base.py +++ b/src/molecule/lint/base.py @@ -38,7 +38,8 @@ def __init__(self, config): """ self._config = config - @abc.abstractproperty + @property + @abc.abstractmethod def default_options(self): # pragma: no cover """ Provide Default CLI arguments to ``cmd`` and returns a dict. @@ -46,7 +47,8 @@ def default_options(self): # pragma: no cover :return: dict """ - @abc.abstractproperty + @property + @abc.abstractmethod def default_env(self): # pragma: no cover """ Provide default env variables to ``cmd`` and returns a dict. diff --git a/src/molecule/provisioner/base.py b/src/molecule/provisioner/base.py index 9d19cd7b2d..c10441c1ac 100644 --- a/src/molecule/provisioner/base.py +++ b/src/molecule/provisioner/base.py @@ -36,7 +36,8 @@ def __init__(self, config): """ self._config = config - @abc.abstractproperty + @property + @abc.abstractmethod def default_options(self): # pragma: no cover """ Get default CLI arguments provided to ``cmd`` as a dict. @@ -44,7 +45,8 @@ def default_options(self): # pragma: no cover :return: dict """ - @abc.abstractproperty + @property + @abc.abstractmethod def default_env(self): # pragma: no cover """ Get default env variables provided to ``cmd`` as a dict. diff --git a/src/molecule/scenario.py b/src/molecule/scenario.py index 90597a336a..5a39c57dcc 100644 --- a/src/molecule/scenario.py +++ b/src/molecule/scenario.py @@ -166,22 +166,22 @@ def ephemeral_directory(self): path = ephemeral_directory(project_scenario_directory) if os.environ.get("MOLECULE_PARALLEL", False) and not self._lock: - self._lock = open(os.path.join(path, ".lock"), "w") - for i in range(1, 5): - try: - fcntl.lockf(self._lock, fcntl.LOCK_EX | fcntl.LOCK_NB) - break - except OSError: - delay = 30 * i - LOG.warning( - "Retrying to acquire lock on %s, waiting for %s seconds", - path, - delay, - ) - sleep(delay) - else: - LOG.warning("Timedout trying to acquire lock on %s", path) - raise SystemExit(RC_TIMEOUT) + with open(os.path.join(path, ".lock"), "w") as self._lock: + for i in range(1, 5): + try: + fcntl.lockf(self._lock, fcntl.LOCK_EX | fcntl.LOCK_NB) + break + except OSError: + delay = 30 * i + LOG.warning( + "Retrying to acquire lock on %s, waiting for %s seconds", + path, + delay, + ) + sleep(delay) + else: + LOG.warning("Timedout trying to acquire lock on %s", path) + raise SystemExit(RC_TIMEOUT) return path diff --git a/src/molecule/verifier/base.py b/src/molecule/verifier/base.py index fac1f60806..97f7d0d92c 100644 --- a/src/molecule/verifier/base.py +++ b/src/molecule/verifier/base.py @@ -40,7 +40,8 @@ def __init__(self, config=None): """ self._config = config - @abc.abstractproperty + @property + @abc.abstractmethod def name(self): # pragma: no cover """ Name of the verifier and returns a string. @@ -48,7 +49,8 @@ def name(self): # pragma: no cover :returns: str """ - @abc.abstractproperty + @property + @abc.abstractmethod def default_options(self): # pragma: no cover """ Get default CLI arguments provided to ``cmd`` as a dict. @@ -56,7 +58,8 @@ def default_options(self): # pragma: no cover :return: dict """ - @abc.abstractproperty + @property + @abc.abstractmethod def default_env(self): # pragma: no cover """ Get default env variables provided to ``cmd`` as a dict.