@@ -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