22import time
33import click
44import jmespath
5+ from natsort import natsorted , ns
56from cloudscale import Cloudscale , CloudscaleApiException
6- from ..util import to_table , to_pretty_json , tags_to_dict
7+ from ..util import to_table , to_pretty_json , tags_to_dict , format_json
78
89if sys .stdout .isatty ():
910 from yaspin import yaspin as Spinner
@@ -38,6 +39,9 @@ def __init__(self, cloud_resource_name=None, api_token=None, profile=None, debug
3839 # Alternate key to look for the resource as 'name'
3940 self .resource_name_key = 'name'
4041
42+ # Usually we want to sort the table by the key used as name
43+ self .resource_table_sort_key = None
44+
4145 self .response_transform_json = None
4246
4347 def get_client_resource (self ):
@@ -49,7 +53,16 @@ def _format_output(self, response):
4953 else :
5054 if isinstance (response , dict ):
5155 response = [response ]
52- return to_table (response , self .headers , self .response_transform_json )
56+
57+ if response :
58+ response = format_json (response , self .response_transform_json )
59+ sort_by_key = self .resource_table_sort_key or self .resource_name_key
60+ if sort_by_key :
61+ if 'zone' in self .headers :
62+ response = natsorted (response , key = lambda x : (x ['zone' ], x [sort_by_key ]), alg = ns .IGNORECASE )
63+ else :
64+ response = natsorted (response , key = lambda x : x [sort_by_key ], alg = ns .IGNORECASE )
65+ return to_table (response , self .headers )
5366
5467 def cmd_list (self , filter_tag = None , filter_json = None , action = None , delete = False , force = False , wait = False ):
5568 if action and delete :
0 commit comments