8000 plaintext decoder · core-api/python-client@b928f66 · GitHub
[go: up one dir, main page]

Skip to content
This repository was archived by the owner on Mar 18, 2019. It is now read-only.

Commit b928f66

Browse files
committed
plaintext decoder
1 parent d828fb5 commit b928f66

File tree

7 files changed

+142
-123
lines changed

7 files changed

+142
-123
lines changed

coreapi/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from coreapi import codecs, history, transports
77

88

9-
__version__ = '1.12.0'
9+
__version__ = '1.13.0'
1010
__all__ = [
1111
'Array', 'Document', 'Link', 'Object', 'Error', 'Field',
1212
'ParseError', 'NotAcceptable', 'TransportError', 'ErrorMessage',

coreapi/codecs/__init__.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# coding: utf-8
22
from coreapi.codecs.base import BaseCodec
33
from coreapi.codecs.corejson import CoreJSONCodec
4+
from coreapi.codecs.coretext import CoreTextCodec
45
from coreapi.codecs.hal import HALCodec
56
from coreapi.codecs.html import HTMLCodec
67
from coreapi.codecs.hyperschema import HyperschemaCodec
@@ -12,12 +13,18 @@
1213

1314

1415
__all__ = [
15-
'BaseCodec', 'CoreJSONCodec', 'HALCodec', 'HTMLCodec', 'HyperschemaCodec',
16-
'JSONCodec', 'PlainTextCodec', 'PythonCodec',
16+
'BaseCodec', 'CoreJSONCodec', 'CoreTextCodec', 'HALCodec', 'HTMLCodec',
17+
'HyperschemaCodec', 'JSONCodec', 'PlainTextCodec', 'PythonCodec',
1718
]
1819

19-
default_decoders = itypes.List([CoreJSONCodec(), HALCodec(), HyperschemaCodec(), JSONCodec()])
20-
default_encoders = itypes.List([CoreJSONCodec(), HALCodec(), HTMLCodec(), PlainTextCodec()])
20+
# Default set of decoders for clients to accept.
21+
default_decoders = itypes.List([
22+
CoreJSONCodec(), HALCodec(), HyperschemaCodec(), # Document decoders.
23+
JSONCodec(), PlainTextCodec() # Data decoders.
24+
])
25+
26+
# Default set of encoders for servers to respond with.
27+
default_encoders = itypes.List([CoreJSONCodec(), HALCodec(), HTMLCodec()])
2128

2229

2330
def negotiate_decoder(content_type=None, decoders=None):

coreapi/codecs/coretext.py

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
from __future__ import unicode_literals
2+
from coreapi.codecs.base import BaseCodec
3+
from coreapi.compat import string_types
4+
from coreapi.document import Document, Link, Array, Object, Error
5+
import click
6+
import json
7+
8+
9+
def _colorize_document(text):
10+
return click.style(text, fg='green') # pragma: nocover
11+
12+
13+
def _colorize_error(text):
14+
return click.style(text, fg='red') # pragma: nocover
15+
16+
17+
def _colorize_keys(text):
18+
return click.style(text, fg='cyan') # pragma: nocover
19+
20+
21+
def _to_plaintext(node, indent=0, base_url=None, colorize=False, extra_offset=None):
22+
colorize_document = _colorize_document if colorize else lambda x: x
23+
colorize_error = _colorize_error if colorize else lambda x: x
24+
colorize_keys = _colorize_keys if colorize else lambda x: x
25+
26+
if isinstance(node, Document):
27+
head_indent = ' ' * indent
28+
body_indent = ' ' * (indent + 1)
29+
30+
body = '\n'.join([
31+
body_indent + colorize_keys(str(key) + ': ') +
32+
_to_plaintext(value, indent + 1, base_url=base_url, colorize=colorize, extra_offset=len(str(key)))
33+
for key, value in node.data.items()
34+
] + [
35+
body_indent + colorize_keys(str(key) + '(') +
36+
_fields_to_plaintext(value, colorize=colorize) + colorize_keys(')')
37+
for key, value in node.links.items()
38+
])
39+
40+
head = colorize_document('<%s %s>' % (
41+
node.title.strip() or 'Document',
42+
json.dumps(node.url)
43+
))
44+
45+
return head if (not body) else head + '\n' + body
46+
47+
elif isinstance(node, Object):
48+
head_indent = ' ' * indent
49+
body_indent = ' ' * (indent + 1)
50+
51+
body = '\n'.join([
52+
body_indent + colorize_keys(str(key)) + ': ' +
53+
_to_plaintext(value, indent + 1, base_url=base_url, colorize=colorize, extra_offset=len(str(key)))
54+
for key, value in node.data.items()
55+
] + [
56+
body_indent + colorize_keys(str(key) + '(') +
57+
_fields_to_plaintext(value, colorize=colorize) + colorize_keys(')')
58+
for key, value in node.links.items()
59+
])
60+
61+
return '{}' if (not body) else '{\n' + body + '\n' + head_indent + '}'
62+
63+
if isinstance(node, Error):
64+
head_indent = ' ' * indent
65+
body_indent = ' ' * (indent + 1)
66+
67+
body = '\n'.join([
68+
body_indent + colorize_keys(str(key) + ': ') +
69+
_to_plaintext(value, indent + 1, base_url=base_url, colorize=colorize, extra_offset=len(str(key)))
70+
for key, value in node.items()
71+
])
72+
73+
head = colorize_error('<Error: %s>' % node.title.strip() if node.title else '<Error>')
74+
75+
return head if (not body) else head + '\n' + body
76+
77+
elif isinstance(node, Array):
78+
head_indent = ' ' * indent
79+
body_indent = ' ' * (indent + 1)
80+
81+
body = ',\n'.join([
82+
body_indent + _to_plaintext(value, indent + 1, base_url=base_url, colorize=colorize)
83+
for value in node
84+
])
85+
86+
return '[]' if (not body) else '[\n' + body + '\n' + head_indent + ']'
87+
88+
elif isinstance(node, Link):
89+
return (
90+
colorize_keys('link(') +
91+
_fields_to_plaintext(node, colorize=colorize) +
92+
colorize_keys(')')
93+
)
94+
95+
if isinstance(node, string_types) and (extra_offset is not None) and ('\n' in node):
96+
# Display newlines in strings gracefully.
97+
text = json.dumps(node)
98+
spacing = (' ' * indent) + (' ' * extra_offset) + ' '
99+
return text.replace('\\n', '\n' + spacing)
100+
101+
return json.dumps(node)
102+
103+
104+
def _fields_to_plaintext(link, colorize=False):
105+
colorize_keys = _colorize_keys if colorize else lambda x: x
106+
107+
return colorize_keys(', ').join([
108+
field.name for field in link.fields if field.required
109+
] + [
110+
'[%s]' % field.name for field in link.fields if not field.required
111+
])
112+
113+
114+
class CoreTextCodec(BaseCodec):
115+
"""
116+
A plaintext representation of a Document, intended for readability.
117+
"""
118+
media_type = 'text/plain'
119+
120+
def dump(self, node, colorize=False, **kwargs):
121+
return _to_plaintext(node, colorize=colorize)

coreapi/codecs/hyperschema.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ def _primative_to_document(data, base_url):
7676

7777

7878
class HyperschemaCodec(BaseCodec):
79+
"""
80+
JSON Hyper-Schema.
81+
"""
7982
media_type = 'application/schema+json'
8083

8184
def load(self, bytes, base_url=None):

coreapi/codecs/plaintext.py

Lines changed: 3 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -1,121 +1,9 @@
1-
from __future__ import unicode_literals
1+
# coding: utf-8
22
from coreapi.codecs.base import BaseCodec
3-
from coreapi.compat import string_types
4-
from coreapi.document import Document, Link, Array, Object, Error
5-
import click
6-
import json
7-
8-
9-
def _colorize_document(text):
10-
return click.style(text, fg='green') # pragma: nocover
11-
12-
13-
def _colorize_error(text):
14-
return click.style(text, fg='red') # pragma: nocover
15-
16-
17-
def _colorize_keys(text):
18-
return click.style(text, fg='cyan') # pragma: nocover
19-
20-
21-
def _to_plaintext(node, indent=0, base_url=None, colorize=False, extra_offset=None):
22-
colorize_document = _colorize_document if colorize else lambda x: x
23-
colorize_error = _colorize_error if colorize else lambda x: x
24-
colorize_keys = _colorize_keys if colorize else lambda x: x
25-
26-
if isinstance(node, Document):
27-
head_indent = ' ' * indent
28-
body_indent = ' ' * (indent + 1)
29-
30-
body = '\n'.join([
31-
body_indent + colorize_keys(str(key) + ': ') +
32-
_to_plaintext(value, indent + 1, base_url=base_url, colorize=colorize, extra_offset=len(str(key)))
33-
for key, value in node.data.items()
34-
] + [
35-
body_indent + colorize_keys(str(key) + '(') +
36-
_fields_to_plaintext(value, colorize=colorize) + colorize_keys(')')
37-
for key, value in node.links.items()
38-
])
39-
40-
head = colorize_document('<%s %s>' % (
41-
node.title.strip() or 'Document',
42-
json.dumps(node.url)
43-
))
44-
45-
return head if (not body) else head + '\n' + body
46-
47-
elif isinstance(node, Object):
48-
head_indent = ' ' * indent
49-
body_indent = ' ' * (indent + 1)
50-
51-
body = '\n'.join([
52-
body_indent + colorize_keys(str(key)) + ': ' +
53-
_to_plaintext(value, indent + 1, base_url=base_url, colorize=colorize, extra_offset=len(str(key)))
54-
for key, value in node.data.items()
55-
] + [
56-
body_indent + colorize_keys(str(key) + '(') +
57-
_fields_to_plaintext(value, colorize=colorize) + colorize_keys(')')
58-
for key, value in node.links.items()
59-
])
60-
61-
return '{}' if (not body) else '{\n' + body + '\n' + head_indent + '}'
62-
63-
if isinstance(node, Error):
64-
head_indent = ' ' * indent
65-
body_indent = ' ' * (indent + 1)
66-
67-
body = '\n'.join([
68-
body_indent + colorize_keys(str(key) + ': ') +
69-
_to_plaintext(value, indent + 1, base_url=base_url, colorize=colorize, extra_offset=len(str(key)))
70-
for key, value in node.items()
71-
])
72-
73-
head = colorize_error('<Error: %s>' % node.title.strip() if node.title else '<Error>')
74-
75-
return head if (not body) else head + '\n' + body
76-
77-
elif isinstance(node, Array):
78-
head_indent = ' ' * indent
79-
body_indent = ' ' * (indent + 1)
80-
81-
body = ',\n'.join([
82-
body_indent + _to_plaintext(value, indent + 1, base_url=base_url, colorize=colorize)
83-
for value in node
84-
])
85-
86-
return '[]' if (not body) else '[\n' + body + '\n' + head_indent + ']'
87-
88-
elif isinstance(node, Link):
89-
return (
90-
colorize_keys('link(') +
91-
_fields_to_plaintext(node, colorize=colorize) +
92-
colorize_keys(')')
93-
)
94-
95-
if isinstance(node, string_types) and (extra_offset is not None) and ('\n' in node):
96-
# Display newlines in strings gracefully.
97-
text = json.dumps(node)
98-
spacing = (' ' * indent) + (' ' * extra_offset) + ' '
99-
return text.replace('\\n', '\n' + spacing)
100-
101-
return json.dumps(node)
102-
103-
104-
def _fields_to_plaintext(link, colorize=False):
105-
colorize_keys = _colorize_keys if colorize else lambda x: x
106-
107-
return colorize_keys(', ').join([
108-
field.name for field in link.fields if field.required
109-
] + [
110-
'[%s]' % field.name for field in link.fields if not field.required
111-
])
1123

1134

1145
class PlainTextCodec(BaseCodec):
115-
"""
116-
A plaintext representation of a Document, intended for readability.
117-
"""
1186
media_type = 'text/plain'
1197

120-
def dump(self, node, colorize=False, **kwargs):
121-
return _to_plaintext(node, colorize=colorize)
8+
def load(self, bytes, base_url=None):
9+
return bytes.decode('utf-8')

coreapi/commandline.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ def set_document(doc):
8888

8989
def display(doc):
9090
if isinstance(doc, (coreapi.Document, coreapi.Error)):
91-
codec = coreapi.codecs.PlainTextCodec()
91+
codec = coreapi.codecs.CoreTextCodec()
9292
return codec.dump(doc, colorize=True)
9393
if doc is None:
9494
return ''

coreapi/document.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ def _repr(node):
1919

2020

2121
def _str(node):
22-
from coreapi.codecs.plaintext import PlainTextCodec
23-
return PlainTextCodec().dump(node)
22+
from coreapi.codecs.coretext import CoreTextCodec
23+
return CoreTextCodec().dump(node)
2424

2525

2626
def _key_sorting(item):

0 commit comments

Comments
 (0)
0