]> Frank Brehm's Git Trees - pixelpark/puppet-tools.git/commitdiff
Fixed parsing of Puppetfile module lines in class PuppetfileModuleInfo
authorFrank Brehm <frank.brehm@pixelpark.com>
Wed, 8 Feb 2023 14:52:51 +0000 (15:52 +0100)
committerFrank Brehm <frank.brehm@pixelpark.com>
Wed, 8 Feb 2023 14:52:51 +0000 (15:52 +0100)
lib/dpx_puppettools/pfile_moduleinfo.py

index 644ef963803df69a784575bf6ffccff79ba58da0..837f6da3ecca11cb737e1d5aedbdac1f77b1d744 100644 (file)
@@ -30,7 +30,7 @@ from .errors import BaseModuleInfoError
 from .base_moduleinfo import BaseModuleInfo
 
 
-__version__ = '0.2.1'
+__version__ = '0.3.0'
 
 LOG = logging.getLogger(__name__)
 
@@ -57,12 +57,15 @@ class PuppetfileModuleInfo(BaseModuleInfo):
     default_repo_type = 'forge'
     valid_repo_types = ('forge', 'git', 'svn', 'tarball', 'local')
 
+    re_empty_mod_pf_line = re.compile(r'\s*mod\s+\'([^\']+)\'\s*$', re.IGNORECASE)
     re_mod_pf_line = re.compile(r'\s*mod\s+\'([^\']+)\'\s*,\s*(\S+.*)\s*$', re.IGNORECASE)
     re_pf_line_version = re.compile(r"^\s*'([^']+)'")
     re_def_token = re.compile(r'^\s*(?:,\s*)?([^,]+)(?:\s*,|$)')
     re_empty = re.compile(r'^\s*(?:,\s*)?$')
-    re_key_val_pair = re.compile(r'^\s*:?([a-z]+)\s*=>\s*[\'"]([^\'"]+)[\'"]\s*$', re.IGNORECASE)
-    re_key_val_pair_unquoted = re.compile(r'^\s*:?([a-z]+)\s*=>\s*(\S+)\s*$', re.IGNORECASE)
+    re_key_val_pair = re.compile(r'^\s*:?([a-z_]+)\s*=>\s*[\'"]([^\'"]+)[\'"]\s*$', re.IGNORECASE)
+    re_key_val_pair_old = re.compile(r'^\s*([a-z_]+)\s*:\s*[\'"]([^\'"]+)[\'"]\s*$', re.IGNORECASE)
+    re_key_val_pair_unquoted = re.compile(r'^\s*:?([a-z_]+)\s*=>\s*(\S+)\s*$', re.IGNORECASE)
+    re_key_latest = re.compile(r'^\s*:latest\s*$', re.IGNORECASE)
     re_v_at_start = re.compile(r"^v", re.IGNORECASE)
 
     re_newline = re.compile(r'(?:\r\n?|\n\r?)+')
@@ -248,6 +251,41 @@ class PuppetfileModuleInfo(BaseModuleInfo):
 
         return res
 
+    # -------------------------------------------------------------------------
+    def __repr__(self):
+        """Typecasting into a string for reproduction."""
+        out = "<%s(" % (self.__class__.__name__)
+
+        fields = []
+        fields.append("appname={!r}".format(self.appname))
+        fields.append("verbose={!r}".format(self.verbose))
+        fields.append("version={!r}".format(self.version))
+        fields.append("base_dir={!r}".format(self.base_dir))
+        if self.full_name_orig:
+            fields.append("full_name={!r}".format(self.full_name_orig))
+        else:
+            fields.append("full_name={!r}".format(self.full_name))
+        fields.append("initialized={!r}".format(self.initialized))
+        if self.repo_type:
+            fields.append("repo_type={!r}".format(self.repo_type))
+        if self.repo:
+            fields.append("repo={!r}".format(self.repo))
+        if self.ref:
+            fields.append("ref={!r}".format(self.ref))
+        if self.use_control_branch:
+            fields.append("use_control_branch={!r}".format(True))
+        if self.forge_version:
+            fields.append("forge_version={!r}".format(self.forge_version))
+        if self.default_branch:
+            fields.append("default_branch={!r}".format(self.default_branch))
+        if self.exclude_spec:
+            fields.append("exclude_spec={!r}".format(True))
+        if self.install_path:
+            fields.append("install_path={!r}".format(self.install_path))
+
+        out += ", ".join(fields) + ")>"
+        return out
+
     # -------------------------------------------------------------------------
     def __copy__(self):
 
@@ -366,9 +404,40 @@ class PuppetfileModuleInfo(BaseModuleInfo):
             if match:
                 key = match.group(1)
                 val = match.group(2)
+                if verbose > 4:
+                    LOG.debug("Matched re_key_val_pair {key!r} => {val!r}.".format(
+                        key=key, val=val))
+                defs[key] = val
+                continue
+
+            match = cls.re_key_val_pair_old.match(token)
+            if match:
+                key = match.group(1)
+                val = match.group(2)
+                if verbose > 4:
+                    LOG.debug("Matched re_key_val_pair_old {key!r} => {val!r}.".format(
+                        key=key, val=val))
                 defs[key] = val
-            else:
-                LOG.warn(_("Could not analyze definition token {!r}.").format(token))
+                continue
+
+            match = cls.re_key_val_pair_unquoted.match(token)
+            if match:
+                key = match.group(1)
+                val = match.group(2)
+                if verbose > 4:
+                    LOG.debug("Matched re_key_val_pair_unquoted {key!r} => {val!r}.".format(
+                        key=key, val=val))
+                defs[key] = val
+                continue
+
+            match = cls.re_key_latest.match(token)
+            if match:
+                if verbose > 4:
+                    LOG.debug("Matched re_key_latest 'latest' => True.")
+                defs['latest'] = True
+                continue
+
+            LOG.warn(_("Could not analyze definition token {!r}.").format(token))
 
         if verbose > 4:
             LOG.debug("Got definitions:\n{}".format(pp(defs)))
@@ -377,15 +446,24 @@ class PuppetfileModuleInfo(BaseModuleInfo):
 
     # -------------------------------------------------------------------------
     @classmethod
-    def init_from_puppetfile_line(cls, line, env, appname=None, verbose=0, base_dir=None):
+    def init_from_puppetfile_line(cls, line, appname=None, verbose=0, base_dir=None):
 
         # Removing all newlines
-        mline = self.re_newline.sub(' ', line)
+        mline = cls.re_newline.sub(' ', line)
+
+        match = cls.re_empty_mod_pf_line.match(mline)
+        if match:
+            fullname_orig = match.group(1)
+            module_info = cls(
+                appname=appname, verbose=verbose, base_dir=base_dir,
+                full_name=fullname_orig, repo_type='forge',
+            )
+            return module_info
 
         match = cls.re_mod_pf_line.search(mline)
         if not match:
             if verbose > 2:
-                LOG.debug("Line {!r} is not a module definition line.".format(line))
+                LOG.warn("Line {!r} is not a module definition line.".format(line))
             return None
 
         fullname_orig = match.group(1)
@@ -449,6 +527,9 @@ class PuppetfileModuleInfo(BaseModuleInfo):
             if 'commit' in definitions:
                 module_info.ref = definitions['commit']
 
+            if 'latest' in definitions:
+                module_info.forge_version = 'latest'
+
             if 'version' in definitions:
                 module_info.ref = definitions['version']