--- /dev/null
+#!/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