فهرست منبع

Add info cli argument

Bertrand Chenal 7 سال پیش
والد
کامیت
55a2040e71
1فایلهای تغییر یافته به همراه41 افزوده شده و 0 حذف شده
  1. 41 0
      baker.py

+ 41 - 0
baker.py

@@ -2,6 +2,7 @@ from getpass import getpass
 from hashlib import md5
 from hashlib import md5
 from itertools import chain
 from itertools import chain
 from collections import ChainMap, OrderedDict, defaultdict
 from collections import ChainMap, OrderedDict, defaultdict
+from string import Formatter
 import argparse
 import argparse
 import io
 import io
 import logging
 import logging
@@ -763,6 +764,8 @@ def load_cli(args=None):
                         default=0, help='Decrease verbosity')
                         default=0, help='Decrease verbosity')
     parser.add_argument('-n', '--no-color', action='store_true',
     parser.add_argument('-n', '--no-color', action='store_true',
                         help='Disable colored logs')
                         help='Disable colored logs')
+    parser.add_argument('-i', '--info', action='store_true',
+                        help='Print info')
     cli = parser.parse_args(args=args)
     cli = parser.parse_args(args=args)
     cli = ObjectDict(vars(cli))
     cli = ObjectDict(vars(cli))
 
 
@@ -813,6 +816,40 @@ def get_hosts_and_tasks(cli, cfg):
     return dict(hosts=hosts, tasks=tasks)
     return dict(hosts=hosts, tasks=tasks)
 
 
 
 
+def info(cli):
+    formatter = Formatter()
+    for name, attr in cli.cfg.tasks.items():
+        kind = 'remote'
+        if attr.python:
+            kind = 'python'
+        elif attr.local:
+            kind = 'local'
+        elif attr.multi:
+            kind = 'multi'
+        elif attr.send:
+            kind = 'send file'
+
+        print(f'{name} [{kind}]:\n\tDescription: {attr.desc}')
+
+        values = []
+        for v in attr.values():
+            if isinstance(v, list):
+                values.extend(v)
+            elif isinstance(v, dict):
+                values.extend(v.values())
+            else:
+                values.append(v)
+        values = filter(lambda x: isinstance(x, str), values)
+        fmt_fields = [i[1] for v in values for i in formatter.parse(v) if i[1]]
+        if fmt_fields:
+            variables = ', '.join(sorted(set(fmt_fields)))
+        else:
+            variables = None
+
+        if variables:
+            print(f'\tVariables: {variables}')
+
+
 def main():
 def main():
     cli = None
     cli = None
     try:
     try:
@@ -824,6 +861,10 @@ def main():
         log_handler.setLevel(level)
         log_handler.setLevel(level)
         logger.setLevel(level)
         logger.setLevel(level)
 
 
+        if cli.info:
+            info(cli)
+            return
+
         base_env = Env(
         base_env = Env(
             cli.env, # Highest-priority
             cli.env, # Highest-priority
             cli.cfg.get('env'),
             cli.cfg.get('env'),