1010import sys
1111
1212
13+ def codec_sorting_func (item ):
14+ key , codec = item
15+ if key == 'corejson' :
16+ return (0 , codec .media_type .count ('*' ), codec .media_type )
17+
18+ if ('decoding' in codec .supports and 'encoding' in codec .supports ):
19+ return (1 , codec .media_type .count ('*' ), codec .media_type )
20+ elif ('decoding' in codec .supports ):
21+ return (2 , codec .media_type .count ('*' ), codec .media_type )
22+ elif ('encoding' in codec .supports ):
23+ return (3 , codec .media_type .count ('*' ), codec .media_type )
24+ elif ('data' in codec .supports ):
25+ return (4 , codec .media_type .count ('*' ), codec .media_type )
26+
27+ return (5 , codec .media_type .count ('*' ), codec .media_type )
28+
29+
1330def get_codecs ():
1431 unsorted_codecs = {}
1532 for package in pkg_resources .iter_entry_points (group = 'coreapi.codecs' ):
1633 codec_class = package .load ()
1734 unsorted_codecs [package .name ] = codec_class ()
1835
1936 codecs = collections .OrderedDict ()
20- for name , codec in sorted (unsorted_codecs .items (), key = lambda item : - len ( item [ 1 ]. media_type ) ):
37+ for name , codec in sorted (unsorted_codecs .items (), key = codec_sorting_func ):
2138 codecs [name ] = codec
2239
2340 return codecs
@@ -32,7 +49,9 @@ def get_codecs():
3249bookmarks_path = None
3350
3451codec_lookup = get_codecs ()
35- codec_keys = [key for key in codec_lookup .keys () if key not in ('json' , 'text' )]
52+ decoder_formats = [key for key , codec in codec_lookup .items () if ('decoding' in codec .supports )]
53+ encoder_formats = [key for key , codec in codec_lookup .items () if ('encoding' in codec .supports )]
54+ data_formats = [key for key , codec in codec_lookup .items () if ('data' in codec .supports )]
3655
3756
3857def setup_paths ():
@@ -139,7 +158,11 @@ def get_client(decoders=None, debug=False):
139158 callbacks = {}
140159
141160 if decoders is None :
142- decoders = list (codec_lookup .values ())
161+ decoders = [
162+ codec_lookup [key ] for key in decoder_formats
163+ ] + [
164+ codec_lookup [key ] for key in data_formats
165+ ]
143166
144167 http_transport = coreapi .transports .HTTPTransport (credentials , headers , ** callbacks )
145168 return coreapi .Client (decoders = decoders , transports = [http_transport ])
@@ -203,13 +226,13 @@ def client(ctx, version):
203226@click .command (help = 'Fetch a document from the given URL.' )
204227@click .argument ('url' )
205228@click .option ('--debug' , '-d' , is_flag = True , help = 'Display the request/response' )
206- @click .option ('--format' , default = None , type = click .Choice (codec_keys ))
229+ @click .option ('--format' , default = None , type = click .Choice (decoder_formats ))
207230def get (url , debug , format ):
208231 if format :
209232 decoders = [codec_lookup [format ]]
210233 force_codec = True
211234 else :
212- decoders = [codec_lookup [key ] for key in codec_keys ]
235+ decoders = [codec_lookup [key ] for key in decoder_formats ]
213236 force_codec = False
214237 client = get_client (decoders = decoders , debug = debug )
215238 history = get_history ()
@@ -227,7 +250,7 @@ def get(url, debug, format):
227250
228251@click .command (help = 'Load a document from disk.' )
229252@click .argument ('input_file' , type = click .File ('rb' ))
230- @click .option ('--format' , default = 'corejson' , type = click .Choice (codec_keys ))
253+ @click .option ('--format' , default = 'corejson' , type = click .Choice (decoder_formats ))
231254def load (input_file , format ):
232255 input_bytes = input_file .read ()
233256 input_file .close ()
@@ -242,6 +265,19 @@ def load(input_file, format):
242265 set_history (history )
243266
244267
268+ @click .command (help = 'Dump a document to console.' )
269+ @click .option ('--format' , default = 'corejson' , type = click .Choice (encoder_formats ))
270+ def dump (format ):
271+ doc = get_document ()
272+ if doc is None :
273+ click .echo ('No current document. Use `coreapi get` to fetch a document first.' )
274+ sys .exit (1 )
275+
276+ encoder = codec_lookup [format ]
277+ output = encoder .dump (doc )
278+ click .echo (output )
279+
280+
245281@click .command (help = 'Clear the active document and other state.\n \n This includes the current document, history, credentials, headers and bookmarks.' )
246282def clear ():
247283 for path in [
@@ -429,7 +465,7 @@ def action(path, params, strings, data, files, action, encoding, transform, debu
429465
430466@click .command (help = 'Reload the current document.' )
431467@click .option ('--debug' , '-d' , is_flag = True , help = 'Display the request/response' )
432- @click .option ('--format' , default = None , type = click .Choice (codec_keys ))
468+ @click .option ('--format' , default = None , type = click .Choice (decoder_formats ))
433469def reload_document (debug , format ):
434470 doc = get_document ()
435471 if doc is None :
@@ -440,7 +476,7 @@ def reload_document(debug, format):
440476 decoders = [codec_lookup [format ]]
441477 force_codec = True
442478 else :
443- decoders = [codec_lookup [key ] for key in codec_keys ]
479+ decoders = [codec_lookup [key ] for key in decoder_formats ]
444480 force_codec = False
445481
446482 client = get_client (debug = debug , decoders = decoders )
@@ -747,8 +783,12 @@ def codecs():
747783def codecs_show ():
748784 # Note that this omits the data codecs of JSON and Text.
749785 click .echo (click .style ('Codecs' , bold = True ))
750- for key in codec_keys :
751- click .echo ('%s "%s"' % (key , codec_lookup [key ].media_type ))
786+ col_1_len = max ([len (key ) for key in codec_lookup .keys ()])
787+ col_2_len = max ([len (codec .media_type ) for codec in codec_lookup .values ()])
788+ fmt = '{key:%d} {media_type:%s} {supports}' % (col_1_len , col_2_len )
789+ for key , codec in codec_lookup .items ():
790+ supports = ', ' .join (codec .supports )
791+ click .echo (fmt .format (key = key , media_type = codec .media_type , supports = supports ))
752792
753793
754794client .add_command (get )
@@ -757,6 +797,7 @@ def codecs_show():
757797client .add_command (reload_document , name = 'reload' )
758798client .add_command (clear )
759799client .add_command (load )
800+ client .add_command (dump )
760801client .add_command (describe )
761802
762803client .add_command (credentials )
0 commit comments