Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/coreapi/codecs/display.py: 18%
52 statements
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
1# Note that `DisplayCodec` is deliberately omitted from the documentation,
2# as it is considered an implementation detail.
3# It may move into a utility function in the future.
4from __future__ import unicode_literals
5from coreapi.codecs.base import BaseCodec
6from coreapi.compat import console_style, string_types
7from coreapi.document import Document, Link, Array, Object, Error
8import json
11def _colorize_document(text):
12 return console_style(text, fg='green') # pragma: nocover
15def _colorize_error(text):
16 return console_style(text, fg='red') # pragma: nocover
19def _colorize_keys(text):
20 return console_style(text, fg='cyan') # pragma: nocover
23def _to_plaintext(node, indent=0, base_url=None, colorize=False, extra_offset=None):
24 colorize_document = _colorize_document if colorize else lambda x: x
25 colorize_error = _colorize_error if colorize else lambda x: x
26 colorize_keys = _colorize_keys if colorize else lambda x: x
28 if isinstance(node, Document):
29 head_indent = ' ' * indent
30 body_indent = ' ' * (indent + 1)
32 body = '\n'.join([
33 body_indent + colorize_keys(str(key) + ': ') +
34 _to_plaintext(value, indent + 1, base_url=base_url, colorize=colorize, extra_offset=len(str(key)))
35 for key, value in node.data.items()
36 ] + [
37 body_indent + colorize_keys(str(key) + '(') +
38 _fields_to_plaintext(value, colorize=colorize) + colorize_keys(')')
39 for key, value in node.links.items()
40 ])
42 head = colorize_document('<%s %s>' % (
43 node.title.strip() or 'Document',
44 json.dumps(node.url)
45 ))
47 return head if (not body) else head + '\n' + body
49 elif isinstance(node, Object):
50 head_indent = ' ' * indent
51 body_indent = ' ' * (indent + 1)
53 body = '\n'.join([
54 body_indent + colorize_keys(str(key)) + ': ' +
55 _to_plaintext(value, indent + 1, base_url=base_url, colorize=colorize, extra_offset=len(str(key)))
56 for key, value in node.data.items()
57 ] + [
58 body_indent + colorize_keys(str(key) + '(') +
59 _fields_to_plaintext(value, colorize=colorize) + colorize_keys(')')
60 for key, value in node.links.items()
61 ])
63 return '{}' if (not body) else '{\n' + body + '\n' + head_indent + '}'
65 if isinstance(node, Error):
66 head_indent = ' ' * indent
67 body_indent = ' ' * (indent + 1)
69 body = '\n'.join([
70 body_indent + colorize_keys(str(key) + ': ') +
71 _to_plaintext(value, indent + 1, base_url=base_url, colorize=colorize, extra_offset=len(str(key)))
72 for key, value in node.items()
73 ])
75 head = colorize_error('<Error: %s>' % node.title.strip() if node.title else '<Error>')
77 return head if (not body) else head + '\n' + body
79 elif isinstance(node, Array):
80 head_indent = ' ' * indent
81 body_indent = ' ' * (indent + 1)
83 body = ',\n'.join([
84 body_indent + _to_plaintext(value, indent + 1, base_url=base_url, colorize=colorize)
85 for value in node
86 ])
88 return '[]' if (not body) else '[\n' + body + '\n' + head_indent + ']'
90 elif isinstance(node, Link):
91 return (
92 colorize_keys('link(') +
93 _fields_to_plaintext(node, colorize=colorize) +
94 colorize_keys(')')
95 )
97 if isinstance(node, string_types) and (extra_offset is not None) and ('\n' in node):
98 # Display newlines in strings gracefully.
99 text = json.dumps(node)
100 spacing = (' ' * indent) + (' ' * extra_offset) + ' '
101 return text.replace('\\n', '\n' + spacing)
103 return json.dumps(node)
106def _fields_to_plaintext(link, colorize=False):
107 colorize_keys = _colorize_keys if colorize else lambda x: x
109 return colorize_keys(', ').join([
110 field.name for field in link.fields if field.required
111 ] + [
112 '[%s]' % field.name for field in link.fields if not field.required
113 ])
116class DisplayCodec(BaseCodec):
117 """
118 A plaintext representation of a Document, intended for readability.
119 """
120 media_type = 'text/plain'
122 def encode(self, document, **options):
123 colorize = options.get('colorize', False)
124 return _to_plaintext(document, colorize=colorize)