]> Frank Brehm's Git Trees - pixelpark/puppet-tools.git/commitdiff
Completing Output of Forge module information
authorFrank Brehm <frank.brehm@pixelpark.com>
Tue, 14 Feb 2023 16:20:46 +0000 (17:20 +0100)
committerFrank Brehm <frank.brehm@pixelpark.com>
Tue, 14 Feb 2023 16:20:46 +0000 (17:20 +0100)
lib/dpx_puppettools/app/__init__.py
lib/dpx_puppettools/forge/cur_mod_release_info.py
lib/dpx_puppettools/forge/mod_info.py
lib/dpx_puppettools/forge/mod_release_info.py
lib/dpx_puppettools/forge/mod_release_list.py

index 75c743d6c6c8ac80b7dc1a08031a3380f422a1ce..1b03d6fcd56227f6cd46656b0e0bcd68b4e9d2c8 100644 (file)
@@ -12,6 +12,7 @@ import logging
 import copy
 import pipes
 import os
+import shutil
 
 from email.mime.text import MIMEText
 from email import charset
@@ -44,7 +45,7 @@ LOG = logging.getLogger(__name__)
 _ = XLATOR.gettext
 ngettext = XLATOR.ngettext
 
-__version__ = '0.3.2'
+__version__ = '0.3.3'
 
 
 # =============================================================================
index a05d7565b84c8964c1ba659bb6684deebfb75f4d..611bd6cad8879d3c415cac86b70361446635e060 100644 (file)
@@ -13,12 +13,13 @@ import logging
 import copy
 import datetime
 import textwrap
+import shutil
 
 # Thisrd party modules
 from fb_tools.common import to_bool
 
 # Own modules
-from .. import pp
+from .. import pp, print_out, line
 from .. import DEFAULT_TERMINAL_WIDTH, DEFAULT_TERMINAL_HEIGHT
 
 from ..xlate import XLATOR
@@ -31,7 +32,7 @@ from .mod_release_info import ModuleReleaseInfo
 
 from .base_module_info import BaseForgeModuleInfo
 
-__version__ = '0.2.1'
+__version__ = '0.3.0'
 
 LOG = logging.getLogger(__name__)
 
@@ -185,7 +186,7 @@ class CurrentModuleReleaseInfo(ModuleReleaseInfo):
     # -------------------------------------------------------------------------
     @property
     def pdk(self):
-        """The pdk of this release."""
+        """Does this module use PDK."""
         return self._pdk
 
     @pdk.setter
@@ -446,6 +447,66 @@ class CurrentModuleReleaseInfo(ModuleReleaseInfo):
                 self.tasks.append(copy.copy(task))
 
     # -------------------------------------------------------------------------
+    def show(self, detail=False, file=None, flush=False):
+
+        msg = _("Current revision of module on Puppet forge:")
+        print_out(msg, file=file, flush=flush)
+        line(width=len(msg), file=file, flush=flush)
+        print_out('', file=file, flush=flush)
+
+        labels = {}
+        max_len_label = 1
+        labels['release_version'] = _("Version:")
+        labels['created_at'] = _("Created at:")
+        labels['updated_at'] = _("Updated at:")
+        labels['file_size'] = _("File size:")
+        labels['supported'] = _("Supported:")
+        labels['pdk'] = _("Using PDK:")
+        labels['validation_score'] = _("Validation score:")
+        labels['downloads'] = _("Downloads:")
+        if detail:
+            labels['deleted_for'] = _("Deleted for:")
+            labels['file_uri'] = _("File URI:")
+            labels['file_md5'] = _("File MD5:")
+            labels['readme'] = _("File README:")
+
+        labels_sorted = (
+            'release_version', 'created_at', 'updated_at', 'deleted_for', 'file_size',
+            'supported', 'pdk', 'validation_score', 'downloads', 'deleted_for',
+            'file_uri', 'file_md5', 'readme',
+        )
+
+        for label in labels.keys():
+            if len(labels[label]) > max_len_label:
+                max_len_label = len(labels[label])
+
+        term_size = shutil.get_terminal_size((DEFAULT_TERMINAL_WIDTH, DEFAULT_TERMINAL_HEIGHT))
+        width = term_size.columns
+        indent = ' ' * (max_len_label + 1)
+
+        for label in labels_sorted:
+            if label not in labels:
+                continue
+            lbl = labels[label]
+            val = getattr(self, label, None)
+
+            if label in ('supported', 'pdk') and val is not None:
+                if val:
+                    val = _('Yes')
+                else:
+                    val = _('No')
+
+            if label == 'readme' and val is not None:
+                val = textwrap.fill(
+                    val, width=width, subsequent_indent=indent, replace_whitespace=False)
+
+            if val is None:
+                val = '~'
+
+            msg = "{lbl:<{max}} {val}".format(lbl=lbl, max=max_len_label, val=val)
+            print_out(msg, file=file, flush=flush)
+
+        print_out('', file=file, flush=flush)
 
 
 # =============================================================================
index 7cab1762f704a97822e8a70cd45fa3a076977789..081bdde5085357143868d44cbd0376e2df406914 100644 (file)
@@ -54,7 +54,7 @@ from .mod_release_list import ModuleReleaseList
 from .cur_mod_release_info import CurrentModuleReleaseInfo
 from .owner_info import ForgeOwnerInfo
 
-__version__ = '0.6.1'
+__version__ = '0.6.2'
 
 LOG = logging.getLogger(__name__)
 
@@ -878,21 +878,9 @@ class ForgeModuleInfo(BaseModuleInfo):
 
         return module_info
 
-
     # -------------------------------------------------------------------------
     def show(self, detail=False, file=None, flush=False):
 
-        if self.verbose > 2:
-            msg = "Base classes of {}:".format(BaseForgeObject)
-            msg += '\n' + pp(inspect.getmro(BaseForgeObject))
-            LOG.debug(msg)
-            msg = "Base classes of {}:".format(BaseModuleInfo)
-            msg += '\n' + pp(inspect.getmro(BaseModuleInfo))
-            LOG.debug(msg)
-            msg = "Base classes of {}:".format(self.__class__.__name__)
-            msg += '\n' + pp(inspect.getmro(self.__class__))
-            LOG.debug(msg)
-
         if not self.exists_on_forge:
             msg = _("Module {!r} not found on Puppet forge.").format(self.full_name)
             print_out(msg, file=file, flush=flush)
@@ -933,8 +921,15 @@ class ForgeModuleInfo(BaseModuleInfo):
                 val = '~'
             msg = "{lbl:<{max}} {val}".format(lbl=lbl, max=max_len_label, val=val)
             print_out(msg, file=file, flush=flush)
+
         print_out('', file=file, flush=flush)
 
+        if self.current_release:
+            self.current_release.show(detail=detail, file=file, flush=flush)
+
+        if detail and self.releases:
+            self.releases.show(file=file, flush=flush)
+
 
 # =============================================================================
 if __name__ == "__main__":
index 64a3315d40d6d7bdda9bf97704e619bc57d1fdab..69768d0f04c5d94e08ec08f417ff1fc8e6f94bbc 100644 (file)
@@ -16,12 +16,14 @@ import datetime
 from fb_tools.common import to_bool
 
 # Own modules
+from .. import print_out
+
 from ..xlate import XLATOR
 
 from . import parse_forge_date
 from . import BaseForgeObject
 
-__version__ = '0.2.1'
+__version__ = '0.3.0'
 
 LOG = logging.getLogger(__name__)
 
@@ -168,7 +170,7 @@ class ModuleReleaseInfo(BaseForgeObject):
     # -------------------------------------------------------------------------
     @property
     def supported(self):
-        """The URI of this release."""
+        """Is this a supported release."""
         return self._supported
 
     @supported.setter
@@ -267,6 +269,48 @@ class ModuleReleaseInfo(BaseForgeObject):
         if 'version' in data and data['version']:
             self.release_version = data['version']
 
+    # -------------------------------------------------------------------------
+    def show(self, width_label=None, width_size=None, file=None, flush=False):
+
+        if width_label is None:
+            width_label = len(self.release_version) + 1
+        else:
+            width_label += 1
+
+        size_str = "{}".format(self.file_size)
+        if self.file_size is None:
+            size_str = '~'
+        else:
+            size_str = "{}".format(self.file_size)
+        if width_size is None:
+            width_size = len(size_str)
+        else:
+            if width_size < len(size_str):
+                width_size = len(size_str)
+
+        vals = {}
+        vals['ver'] = self.release_version + ':'
+        vals['with'] = width_label + 1
+        vals['cr_l'] = _("Created at:")
+        vals['cr_v'] = self.created_at
+        if self.deleted_at:
+            vals['del_l'] = _("Deleted at:")
+            vals['del_v'] = self.deleted_at
+        vals['fs_l'] = _("File size:")
+        vals['fs_v'] = size_str
+        vals['fs_w'] = width_size
+        vals['sup_l'] = _("Supported:")
+        vals['sup_v'] = _('No')
+        if self.supported:
+            vals['sup_v'] = _('Yes')
+
+        msg = ' * {ver:<{with}} {cr_l} {cr_v}, {fs_l} {fs_v:>{fs_w}}, {sup_l} {sup_v}'
+        if self.deleted_at:
+            msg += ', {del_l} {del_v}'
+
+        line = msg.format(**vals)
+        print_out(line, file=file, flush=flush)
+
 
 # =============================================================================
 if __name__ == "__main__":
index 33b84422415575eba31a610c5f1c1764645a02b0..4ce1e76e2c5181c5c39a464b1d3392a7c1ccc14c 100644 (file)
@@ -17,15 +17,22 @@ try:
 except ImportError:
     from collections import MutableSequence
 
+try:
+    from packaging.version import Version
+except ImportError:
+    from distutils.version import LooseVersion as Version
+
 # Third party modules
 from fb_tools.obj import FbBaseObject
 
 # Own modules
+from .. import print_out, line
+
 from ..xlate import XLATOR
 
 from .mod_release_info import ModuleReleaseInfo
 
-__version__ = '0.2.0'
+__version__ = '0.3.0'
 
 LOG = logging.getLogger(__name__)
 
@@ -207,6 +214,30 @@ class ModuleReleaseList(MutableSequence, FbBaseObject):
             new_list.append(copy.copy(release))
         return new_list
 
+    # -------------------------------------------------------------------------
+    def show(self, file=None, flush=False):
+
+        msg = _("All revisions of module on Puppet forge:")
+        print_out(msg, file=file, flush=flush)
+        line(width=len(msg), file=file, flush=flush)
+        print_out('', file=file, flush=flush)
+
+        max_len_version = 1
+        max_len_size = 1
+        for release in self._list:
+            if len(release.release_version) > max_len_version:
+                max_len_version = len(release.release_version)
+            if release.file_size:
+                size_str = "{}".format(release.file_size)
+                if len(size_str) > max_len_size:
+                    max_len_size = len(size_str)
+
+        for release in sorted(self._list, key=lambda x: Version(x.release_version)):
+            release.show(
+                width_label=max_len_version, width_size=max_len_size, file=file, flush=flush)
+
+        print_out('', file=file, flush=flush)
+
 
 # =============================================================================
 if __name__ == "__main__":