From 71c22f2d6daecdf3b22f06d07c112fc7a01ffb87 Mon Sep 17 00:00:00 2001
From: Martijn Vermaat <martijn@vermaat.name>
Date: Mon, 10 Feb 2014 17:59:59 +0100
Subject: [PATCH] Group mutalyzer-admin subcommands in subsubcommands

---
 mutalyzer/entrypoints/admin.py | 105 ++++++++++++++++++++++-----------
 1 file changed, 70 insertions(+), 35 deletions(-)

diff --git a/mutalyzer/entrypoints/admin.py b/mutalyzer/entrypoints/admin.py
index ce0445ab..1d8fea65 100644
--- a/mutalyzer/entrypoints/admin.py
+++ b/mutalyzer/entrypoints/admin.py
@@ -3,15 +3,6 @@ Command line interface to Mutalyzer administrative tools.
 """
 
 
-# Todo: Group subcommands to subsubcommands. For example:
-#
-#     mutalyzer-admin announcement unset
-#
-# instead of
-#
-#     mutalyzer-admin unset-announcement
-
-
 import argparse
 import json
 import os
@@ -35,9 +26,9 @@ class UserError(Exception):
     pass
 
 
-def import_assembly(assembly_file):
+def add_assembly(assembly_file):
     """
-    Import genome assembly definition from a JSON file.
+    Add genome assembly definition from a JSON file.
     """
     try:
         definition = json.load(assembly_file)
@@ -75,6 +66,24 @@ def import_assembly(assembly_file):
     session.commit()
 
 
+def list_assemblies():
+    """
+    List genome assemblies.
+    """
+    assemblies = Assembly.query \
+        .order_by(Assembly.taxonomy_common_name.asc(),
+                  Assembly.name.asc()) \
+        .all()
+
+    for assembly in assemblies:
+        if assembly.alias:
+            name = '%s (%s)' % (assembly.name, assembly.alias)
+        else:
+            name = assembly.name
+        print '%s, %s (%s)' % (name, assembly.taxonomy_common_name,
+                               assembly.taxonomy_id)
+
+
 def import_mapview(assembly_name_or_alias, mapview_file, group_label):
     """
     Import transcript mappings from an NCBI mapview file.
@@ -179,16 +188,30 @@ def main():
     subparsers = parser.add_subparsers(
         title='subcommands', dest='subcommand', help='subcommand help')
 
-    p = subparsers.add_parser(
-        'import-assembly', help='import assembly definition from JSON file',
-        description=import_assembly.__doc__.split('\n\n')[0])
-    p.set_defaults(func=import_assembly)
+    # Subparsers for 'assemblies'.
+    s = subparsers.add_parser(
+        'assemblies', help='manage genome assemblies',
+        description='Manage genome assemblies and their transcript mappings.'
+        ).add_subparsers()
+
+    # Subparser 'assemblies list'.
+    p = s.add_parser(
+        'list', help='list assemblies',
+        description=list_assemblies.__doc__.split('\n\n')[0])
+    p.set_defaults(func=list_assemblies)
+
+    # Subparser 'assemblies add'.
+    p = s.add_parser(
+        'add', help='add assembly definition from JSON file',
+        description=add_assembly.__doc__.split('\n\n')[0])
+    p.set_defaults(func=add_assembly)
     p.add_argument(
         'assembly_file', metavar='FILE', type=argparse.FileType('r'),
         help='genome assembly definition JSON file (example: '
         'extras/assemblies/GRCh37.json)')
 
-    p = subparsers.add_parser(
+    # Subparser 'assemblies import-mapview'.
+    p = s.add_parser(
         'import-mapview', help='import mappings from NCBI mapview file',
         parents=[assembly_parser],
         description=import_mapview.__doc__.split('\n\n')[0],
@@ -204,7 +227,8 @@ def main():
         help='use only entries with this group label (example: '
         'GRCh37.p2-Primary Assembly)')
 
-    p = subparsers.add_parser(
+    # Subparser 'assemblies import-gene'.
+    p = s.add_parser(
         'import-gene', help='import mappings by gene from UCSC database',
         parents=[assembly_parser],
         description=import_gene.__doc__.split('\n\n')[0],
@@ -217,7 +241,8 @@ def main():
         help='gene to import all transcript mappings for from the UCSC '
         'database (example: TTN)')
 
-    p = subparsers.add_parser(
+    # Subparser 'assemblies import-reference'.
+    p = s.add_parser(
         'import-reference', help='import mappings from reference',
         parents=[assembly_parser],
         description=import_reference.__doc__.split('\n\n')[0],
@@ -230,6 +255,32 @@ def main():
         help='genomic reference to import all genes from (example: '
         'NC_012920.1)')
 
+    # Subparsers for 'announcement'.
+    s = subparsers.add_parser(
+        'announcement', help='manage user announcement',
+        description='Manage announcement to show to the user.',
+        epilog='The announcement is shown on every page of the website.'
+        ).add_subparsers()
+
+    # Subparser 'announcement set'.
+    p = s.add_parser(
+        'set', help='set user announcement',
+        description=set_announcement.__doc__.split('\n\n')[0])
+    p.set_defaults(func=set_announcement)
+    p.add_argument(
+        'body', metavar='ANNOUNCEMENT',
+        help='announcement text to show to the user')
+    p.add_argument(
+        '--url', metavar='URL', dest='url',
+        help='URL to more information on the announcement')
+
+    # Subparser 'announcement unset'.
+    p = s.add_parser(
+        'unset', help='unset user announcement',
+        description=unset_announcement.__doc__.split('\n\n')[0])
+    p.set_defaults(func=unset_announcement)
+
+    # Subparser 'sync-cache'.
     p = subparsers.add_parser(
         'sync-cache', help='synchronize cache with remote Mutalyzer',
         description=sync_cache.__doc__.split('\n\n')[0],
@@ -246,23 +297,7 @@ def main():
         default=7, help='number of days to go back in the remote cache '
         '(default: 7)')
 
-    p = subparsers.add_parser(
-        'set-announcement', help='set user announcement',
-        description=set_announcement.__doc__.split('\n\n')[0],
-        epilog='The announcement is shown on every page of the website.')
-    p.set_defaults(func=set_announcement)
-    p.add_argument(
-        'body', metavar='ANNOUNCEMENT',
-        help='announcement text to show to the user')
-    p.add_argument(
-        '--url', metavar='URL', dest='url',
-        help='URL to more information on the announcement')
-
-    p = subparsers.add_parser(
-        'unset-announcement', help='unset user announcement',
-        description=unset_announcement.__doc__.split('\n\n')[0])
-    p.set_defaults(func=unset_announcement)
-
+    # Subparser 'setup-database'.
     p = subparsers.add_parser(
         'setup-database', help='setup database',
         description=setup_database.__doc__.split('\n\n')[0],
-- 
GitLab