@@ -34,6 +34,8 @@ def _ljust(s, n):
3434
3535
3636def  format_table (cmd , installs ):
37+     "Lists as a user-friendly table" 
38+ 
3739    columns  =  {
3840        "tag-with-co" : "Tag" ,
3941        "default-star" : " " ,
@@ -143,6 +145,7 @@ def _csv_filter_and_expand(installs, *, exclude=CSV_EXCLUDE, expand=CSV_EXPAND):
143145
144146
145147def  format_csv (cmd , installs ):
148+     "List as a comma-separated value table" 
146149    import  csv 
147150    installs  =  list (_csv_filter_and_expand (installs ))
148151    if  not  installs :
@@ -160,15 +163,18 @@ def write(s):
160163
161164
162165def  format_json (cmd , installs ):
166+     "Lists as a single JSON object" 
163167    LOGGER .print_raw (json .dumps ({"versions" : installs }, default = str ))
164168
165169
166170def  format_json_lines (cmd , installs ):
171+     "Lists as JSON on each line" 
167172    for  i  in  installs :
168173        LOGGER .print_raw (json .dumps (i , default = str ))
169174
170175
171176def  format_bare_id (cmd , installs ):
177+     "Lists the runtime ID" 
172178    for  i  in  installs :
173179        # Don't print useless values (__active-virtual-env, __unmanaged-) 
174180        if  i ["id" ].startswith ("__" ):
@@ -177,11 +183,13 @@ def format_bare_id(cmd, installs):
177183
178184
179185def  format_bare_exe (cmd , installs ):
186+     "Lists the main executable path" 
180187    for  i  in  installs :
181188        LOGGER .print_raw (i ["executable" ])
182189
183190
184191def  format_bare_prefix (cmd , installs ):
192+     "Lists the prefix directory" 
185193    for  i  in  installs :
186194        try :
187195            LOGGER .print_raw (i ["prefix" ])
@@ -190,14 +198,33 @@ def format_bare_prefix(cmd, installs):
190198
191199
192200def  format_bare_url (cmd , installs ):
201+     "Lists the original source URL" 
193202    for  i  in  installs :
194203        try :
195204            LOGGER .print_raw (i ["url" ])
196205        except  KeyError :
197206            pass 
198207
199208
209+ def  list_formats (cmd , installs ):
210+     "List the available list formats" 
211+     max_key_width  =  len ("Format" )
212+     items  =  []
213+     for  k , v  in  FORMATTERS .items ():
214+         try :
215+             doc  =  v .__doc__ .partition ("\n " )[0 ].strip ()
216+         except  AttributeError :
217+             doc  =  "" 
218+         if  len (k ) >  max_key_width :
219+             max_key_width  =  len (k )
220+         items .append ((k , doc ))
221+     LOGGER .print (f"!B!{ 'Format' :<{max_key_width }}   Description!W!" , always = True )
222+     for  k , doc  in  items :
223+         LOGGER .print (f"{ k :<{max_key_width }}   { doc }  " , always = True )
224+ 
225+ 
200226def  format_legacy (cmd , installs , paths = False ):
227+     "List runtimes using the old format" 
201228    seen_default  =  False 
202229    # TODO: Filter out unmanaged runtimes that have managed equivalents 
203230    # The default order (which should be preserved) of 'installs' will put the 
@@ -219,6 +246,11 @@ def format_legacy(cmd, installs, paths=False):
219246        LOGGER .print_raw (tag .ljust (17 ), i ["executable" ] if  paths  else  i ["display-name" ])
220247
221248
249+ def  format_legacy_paths (cmd , installs ):
250+     "List runtime paths using the old format" 
251+     return  format_legacy (cmd , installs , paths = True )
252+ 
253+ 
222254FORMATTERS  =  {
223255    "table" : format_table ,
224256    "csv" : format_csv ,
@@ -229,7 +261,8 @@ def format_legacy(cmd, installs, paths=False):
229261    "prefix" : format_bare_prefix ,
230262    "url" : format_bare_url ,
231263    "legacy" : format_legacy ,
232-     "legacy-paths" : lambda  cmd , i : format_legacy (cmd , i , paths = True ),
264+     "legacy-paths" : format_legacy_paths ,
265+     "formats" : list_formats ,
233266}
234267
235268
0 commit comments