]> kaliko git repositories - mpd-sima.git/blobdiff - sima/utils/startopt.py
Fixed help message typo
[mpd-sima.git] / sima / utils / startopt.py
index e39330431711290d09e4e0095a85146aca8d53b8..7f3a5febdb0d91f9fb8e3a439954e233343a2835 100644 (file)
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-# Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015 Jack Kaliko <kaliko@azylum.org>
+# Copyright (c) 2009-2015, 2021 kaliko <kaliko@azylum.org>
 #
 #  This file is part of sima
 #
 #
 #
 
-from argparse import (ArgumentParser, SUPPRESS)
-
+from argparse import ArgumentParser, RawDescriptionHelpFormatter
 
 from .utils import Wfile, Rfile, Wdir
 
 DESCRIPTION = """
 MPD_sima automagicaly queue new tracks in MPD playlist.
-Command line options override their equivalent in configuration file."""
+
+Command line options override their equivalent in configuration file.
+If a positional arguments is provided MPD_sima execute the command and returns.
+"""
 
 
 def clean_dict(to_clean):
@@ -35,7 +37,6 @@ def clean_dict(to_clean):
         if not to_clean.get(k):
             to_clean.pop(k)
 
-
 # OPTIONS LIST
 # pop out 'sw' value before creating Parser object.
 # PAY ATTENTION:
@@ -46,70 +47,73 @@ def clean_dict(to_clean):
 #   name it is meant to override.
 OPTS = [
     {
-        'sw':['-l', '--log'],
+        'sw': ['-l', '--log'],
         'type': str,
         'dest': 'logfile',
         'action': Wfile,
+        'metavar': 'LOG',
         'help': 'file to log message to, default is stdout/stderr'},
     {
-        'sw':['-v', '--log-level'],
+        'sw': ['-v', '--log-level'],
         'type': str,
         'dest': 'verbosity',
         'choices': ['debug', 'info', 'warning', 'error'],
-        'help': 'Log messages verbosity, default is info'},
+        'help': 'log messages verbosity, default is info'},
     {
         'sw': ['-p', '--pid'],
         'dest': 'pidfile',
         'action': Wfile,
+        'metavar': 'FILE',
         'help': 'file to save PID to, default is not to store pid'},
     {
         'sw': ['-d', '--daemon'],
         'dest': 'daemon',
         'action': 'store_true',
-        'help': 'Daemonize process.'},
+        'help': 'daemonize process'},
     {
         'sw': ['-S', '--host'],
         'dest': 'host',
-        'help': 'Host MPD in running on (IP or FQDN)'},
+        'help': 'host MPD in running on (IP or FQDN)'},
     {
         'sw': ['-P', '--port'],
         'type': int,
         'dest': 'port',
-        'help': 'Port MPD in listening on'},
+        'help': 'port MPD in listening on'},
     {
-        'sw':['-c', '--config'],
+        'sw': ['-c', '--config'],
         'dest': 'conf_file',
         'action': Rfile,
-        'help': 'Configuration file to load'},
+        'metavar': 'CONFIG',
+        'help': 'configuration file to load'},
     {
-        'sw':['--generate-config'],
-        'dest': 'generate_config',
-        'action': 'store_true',
-        'help': 'Generate a sample configuration file to stdout according to the current\
-         configuration. You can put other options with this one to get them in\
-         the generated configuration.'},
-    {
-        'sw':['--var-dir', '--var_dir'],
+        'sw': ['--var-dir', '--var_dir'],
         'dest': 'var_dir',
         'action': Wdir,
-        'help': 'Directory to store var content (ie. database, cache)'},
-    {
-        'sw': ['--create-db'],
-        'action': 'store_true',
-        'dest': 'create_db',
-        'help': '''Create database and exit, use destination
-                   specified in --var_dir or standard location.'''},
-    {
-        'sw':['--queue-mode', '-q'],
-        'dest': 'queue_mode',
-        'choices': ['track', 'top', 'album'],
-        #'help': 'Queue mode in [track, top, album]',
-        'help': SUPPRESS, },
-    {
-        'sw':['--purge-history'],
-        'action': 'store_true',
-        'dest': 'do_purge_history',
-        'help': SUPPRESS},
+        'help': 'directory to store var content (ie. database, cache)'},
+]
+# Commands
+CMDS = [
+        {'config-test': [{}], 'help': 'Test configuration (MPD connection and Tags plugin only)'},
+        {'create-db': [{}], 'help': 'Create the database'},
+        {'generate-config': [{}], 'help': 'Generate a configuration file to stdout'},
+        {'purge-history': [{}], 'help': 'Remove play history'},
+        {'bl-view': [{}], 'help': 'List blocklist IDs'},
+        {'bl-add-artist': [
+            {'name': 'artist', 'type': str, 'nargs': '?',
+             'help': 'If artist is provided use it else use currently playing value'}
+            ], 'help': 'Add artist to the blocklist'},
+        {'bl-add-album': [
+            {'name': 'album', 'type': str, 'nargs': '?',
+             'help': 'If album is provided use it else use currently playing value'}
+         ], 'help': 'Add album to the blocklist'},
+        {'bl-add-track': [
+            {'name': 'track', 'type': str, 'nargs': '?',
+             'help': 'If track is provided use it else use currently playing value'}
+         ], 'help': 'Add track to the blocklist'},
+        {'bl-delete': [
+            {'name': 'id', 'type': int, 'nargs': '?',
+             'help': 'blocklist ID to suppress (use bl-view to list IDs)'}
+         ], 'help': 'Remove entries from the blocklist'},
 ]
 
 
@@ -120,7 +124,7 @@ class StartOpt:
     def __init__(self, script_info,):
         self.parser = None
         self.info = dict(script_info)
-        self.options = dict()
+        self.options = {}
         self.main()
 
     def declare_opts(self):
@@ -130,13 +134,27 @@ class StartOpt:
         self.parser = ArgumentParser(description=DESCRIPTION,
                                      prog=self.info.get('prog'),
                                      epilog='Happy Listening',
-                                    )
+                                     formatter_class=RawDescriptionHelpFormatter,
+                                     )
         self.parser.add_argument('--version', action='version',
                         version='%(prog)s {version}'.format(**self.info))
         # Add all options declare in OPTS
         for opt in OPTS:
             opt_names = opt.pop('sw')
             self.parser.add_argument(*opt_names, **opt)
+        # Add sub commands
+        spa = self.parser.add_subparsers(
+                title=f'{self.info["prog"]} commands as positional arguments',
+                description=f"""Use them after optionnal arguments.\n"{self.info["prog"]} command -h" for more info.""",
+                metavar='', dest='command')
+        for cmd in CMDS:
+            helpmsg = cmd.pop('help')
+            cmd, args = cmd.popitem()
+            _ = spa.add_parser(cmd, description=helpmsg, help=helpmsg)
+            for arg in args:
+                name = arg.pop('name', None)
+                if name:
+                    _.add_argument(name, **arg)
 
     def main(self):
         """