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

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 

9 

10 

11def _colorize_document(text): 

12 return console_style(text, fg='green') # pragma: nocover 

13 

14 

15def _colorize_error(text): 

16 return console_style(text, fg='red') # pragma: nocover 

17 

18 

19def _colorize_keys(text): 

20 return console_style(text, fg='cyan') # pragma: nocover 

21 

22 

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 

27 

28 if isinstance(node, Document): 

29 head_indent = ' ' * indent 

30 body_indent = ' ' * (indent + 1) 

31 

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 ]) 

41 

42 head = colorize_document('<%s %s>' % ( 

43 node.title.strip() or 'Document', 

44 json.dumps(node.url) 

45 )) 

46 

47 return head if (not body) else head + '\n' + body 

48 

49 elif isinstance(node, Object): 

50 head_indent = ' ' * indent 

51 body_indent = ' ' * (indent + 1) 

52 

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 ]) 

62 

63 return '{}' if (not body) else '{\n' + body + '\n' + head_indent + '}' 

64 

65 if isinstance(node, Error): 

66 head_indent = ' ' * indent 

67 body_indent = ' ' * (indent + 1) 

68 

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 ]) 

74 

75 head = colorize_error('<Error: %s>' % node.title.strip() if node.title else '<Error>') 

76 

77 return head if (not body) else head + '\n' + body 

78 

79 elif isinstance(node, Array): 

80 head_indent = ' ' * indent 

81 body_indent = ' ' * (indent + 1) 

82 

83 body = ',\n'.join([ 

84 body_indent + _to_plaintext(value, indent + 1, base_url=base_url, colorize=colorize) 

85 for value in node 

86 ]) 

87 

88 return '[]' if (not body) else '[\n' + body + '\n' + head_indent + ']' 

89 

90 elif isinstance(node, Link): 

91 return ( 

92 colorize_keys('link(') + 

93 _fields_to_plaintext(node, colorize=colorize) + 

94 colorize_keys(')') 

95 ) 

96 

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) 

102 

103 return json.dumps(node) 

104 

105 

106def _fields_to_plaintext(link, colorize=False): 

107 colorize_keys = _colorize_keys if colorize else lambda x: x 

108 

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 ]) 

114 

115 

116class DisplayCodec(BaseCodec): 

117 """ 

118 A plaintext representation of a Document, intended for readability. 

119 """ 

120 media_type = 'text/plain' 

121 

122 def encode(self, document, **options): 

123 colorize = options.get('colorize', False) 

124 return _to_plaintext(document, colorize=colorize)