]> Frank Brehm's Git Trees - pixelpark/puppet-tools.git/commitdiff
Adding dpx_puppettools.pfile_moduleinfo for class PuppetfileModuleInfo
authorFrank Brehm <frank.brehm@pixelpark.com>
Tue, 7 Feb 2023 16:29:42 +0000 (17:29 +0100)
committerFrank Brehm <frank.brehm@pixelpark.com>
Tue, 7 Feb 2023 16:29:42 +0000 (17:29 +0100)
lib/dpx_puppettools/pfile_moduleinfo.py [new file with mode: 0644]

diff --git a/lib/dpx_puppettools/pfile_moduleinfo.py b/lib/dpx_puppettools/pfile_moduleinfo.py
new file mode 100644 (file)
index 0000000..6da7755
--- /dev/null
@@ -0,0 +1,285 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+@author: Frank Brehm
+@contact: frank.brehm@pixelpark.com
+@copyright: © 2023 by Frank Brehm, Digitas Pixelpark GmbH, Berlin
+@summary: A module for encapsulating all information about a Puppet module
+          from a module entry in a Puppetfile
+"""
+from __future__ import absolute_import
+
+# Standard modules
+import logging
+import re
+import copy
+import warnings
+import time
+import datetime
+
+# Third party modules
+import requests
+import pytz
+
+# Own modules
+from fb_tools.common import pp, to_str, to_bool, is_sequence
+
+from .xlate import XLATOR
+
+from .base_moduleinfo import BaseModuleInfoError, BaseModuleInfo
+
+
+__version__ = '0.1.0'
+
+LOG = logging.getLogger(__name__)
+
+_ = XLATOR.gettext
+ngettext = XLATOR.ngettext
+
+
+# =============================================================================
+class ModuleInfoError(BaseModuleInfoError):
+
+    pass
+
+
+# =============================================================================
+class ModuleInfoTypeError(ModuleInfoError, TypeError):
+
+    pass
+
+
+# =============================================================================
+class PuppetfileModuleInfo(BaseModuleInfo):
+    """Class for encapsulating information about a Puppet module entry in a Puppetfile."""
+
+    default_repo_type = 'forge'
+    valid_repo_types = ('forge', 'git', 'svn', 'tarball', 'local')
+
+    # -------------------------------------------------------------------------
+    def __init__(
+        self, appname=None, verbose=0, version=__version__, base_dir=None,
+            initialized=None, name=None, vendor=None, full_name=None,
+            repo_type=None, repo=None, ref=None, use_control_branch=False,
+            forge_version=None, default_branch=None):
+
+        self._repo_type = self.default_repo_type
+        self._repo = None
+        self._ref = None
+        self._use_control_branch = False
+        self._forge_version = None
+        self._default_branch = None
+
+        super(ModuleInfo, self).__init__(
+            appname=appname, verbose=verbose, version=version, base_dir=base_dir,
+            initialized=False, name=name, vendor=vendor, full_name=full_name
+        )
+
+        if repo_type:
+            self.repo_type = repo_type
+        self.repo = repo
+        self.ref = ref
+        self.use_control_branch = use_control_branch
+        self.forge_version = forge_version
+        self.default_branch = default_branch
+
+        if initialized:
+            self.initialized = True
+
+    # -------------------------------------------------------------------------
+    @property
+    def repo_type(self):
+        """The type of the module repository."""
+        return self._repo_type
+
+    @repo_type.setter
+    def repo_type(self, value):
+        if value is None:
+            msg = _("Invalid repository type {!r}.").format('None')
+            raise ModuleInfoTypeError(msg)
+        v = to_str(value).strip().lower()
+        if v not in self.valid_repo_types:
+            msg = _("Invalid repository type {!r}.").format(value)
+            raise ModuleInfoTypeError(msg)
+        self._repo_type = v
+
+    # -------------------------------------------------------------------------
+    @property
+    def repo(self):
+        """The repository URL or the path or filename."""
+        return self._repo
+
+    @repo.setter
+    def repo(self, value):
+        if value is None:
+            self._repo = None
+            return
+        self._repo = to_str(value)
+
+    # -------------------------------------------------------------------------
+    @property
+    def ref(self):
+        """The reference inside a VCS repository (only on Git and SVN repos)."""
+        return self._ref
+
+    @ref.setter
+    def def ref(self, value):
+        if value is None:
+            self._ref = None
+            return
+        self._ref = to_str(value).strip()
+
+    # -------------------------------------------------------------------------
+    @property
+    def forge_version(self):
+        """The current version number of the module from upstream."""
+        return self._forge_version
+
+    @forge_version.setter
+    def forge_version(self, value):
+        if value is None:
+            self._forge_version = None
+            return
+        val = to_str(value).strip()
+        if val == '':
+            val = None
+        self._forge_version = val
+
+    # -------------------------------------------------------------------------
+    @property
+    def use_control_branch(self):
+        """The content should track a branch reference matching thes
+        containing control repo branch."""
+        return self._use_control_branch
+
+    @use_control_branch.setter
+    def use_control_branch(self, value):
+        self._use_control_branch = to_bool(value)
+
+    # -------------------------------------------------------------------------
+    @property
+    def default_branch(self):
+        """The The default branch name of the repository, if the branch name
+        of the control branch does not exists."""
+        return self._default_branch
+
+    @default_branch.setter
+    def default_branch(self, value):
+        if value is None:
+            self._default_branch = None
+            return
+        self._default_branch = to_str(value).strip()
+
+    # -------------------------------------------------------------------------
+    def as_dict(self, short=True):
+        """
+        Transforms the elements of the object into a dict
+
+        @return: structure as dict
+        @rtype:  dict
+        """
+
+        res = super(ModuleInfo, self).as_dict(short=short)
+
+        res['repo_type'] = self.repo_type
+        res['repo'] = self.repo
+        res['ref'] = self.ref
+        res['use_control_branch'] = self.use_control_branch
+        res['forge_version'] = self.forge_version
+        res['default_branch'] = self.default_branch
+
+        return res
+
+    # -------------------------------------------------------------------------
+    def to_data(self):
+        """Returning a dict, which can be used to re-instantiate this module info."""
+
+        res = super(ModuleInfo, self).to_data()
+
+        res['repo_type'] = self.repo_type
+        res['repo'] = self.repo
+        res['ref'] = self.ref
+        res['use_control_branch'] = self.use_control_branch
+        res['forge_version'] = self.forge_version
+        res['default_branch'] = self.default_branch
+
+        return res
+
+    # -------------------------------------------------------------------------
+    def __copy__(self):
+
+        module_info = self.__class__(
+            appname=self.appname, verbose=self.verbose, base_dir=self.base_dir,
+            name=self.name, vendor=self.vendor)
+
+        if self.full_name_orig:
+            module_info.full_name_orig = self.full_name_orig
+
+        if self.repo_type:
+            module_info.repo_type = self.repo_type
+        if self.repo:
+            module_info.repo = self.repo
+        if self.ref:
+            module_info.ref = self.ref
+        if self.use_control_branch:
+            module_info.use_control_branch = True
+        if self.forge_version:
+            module_info.forge_version = self.forge_version
+        if self.default_branch:
+            module_info.repo_type = self.default_branch
+
+        module_info.initialized = self.initialized
+        return module_info
+
+    # -------------------------------------------------------------------------
+    @classmethod
+    def init_from_data(cls, data, appname=None, verbose=0, base_dir=None):
+        """Reverse method of to_data()."""
+
+        if verbose > 3:
+            LOG.debug("Trying to init module_info from:\n{}".format(pp(data)))
+
+        if 'full_name' not in data:
+            LOG.warn(_("Did not found module name in data."))
+            return None
+
+        module_info = None
+
+        try:
+            module_info = cls(
+                appname=appname, verbose=verbose, base_dir=base_dir,
+                full_name=data['full_name'],
+            )
+        except ModuleInfoError as e:
+            LOG.warn("{c}: {e}".format(c=e.__class__.__name__, e=e))
+            return None
+
+        if 'repo_type' in data:
+            module_info.repo_type = data['repo_type']
+
+        if 'repo' in data:
+            module_info.repo = data['repo']
+
+        if 'ref' in data:
+            module_info.ref = data['ref']
+
+        if 'use_control_branch' in data:
+            module_info.use_control_branch = data['use_control_branch']
+
+        if 'forge_version' in data:
+            module_info.forge_version = data['forge_version']
+
+        if 'default_branch' in data:
+            module_info.default_branch = data['default_branch']
+
+        return module_info
+
+
+# =============================================================================
+if __name__ == "__main__":
+
+    pass
+
+# =============================================================================
+
+# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 list