Skip to content

Commit b50b491

Browse files
committed
Merge pull request #101 from plotly/to-string-quote
To string quote
2 parents ffcfec4 + 7e1e605 commit b50b491

File tree

2 files changed

+97
-16
lines changed

2 files changed

+97
-16
lines changed

Diff for: plotly/graph_objs/graph_objs.py

+66-16
Original file line numberDiff line numberDiff line change
@@ -808,6 +808,7 @@ def to_string(self, level=0, indent=4, eol='\n', pretty=True, max_chars=80):
808808
obj_key = NAME_TO_KEY[self.__class__.__name__]
809809
for key in INFO[obj_key]: # this sets the order of the keys! nice.
810810
if key in self:
811+
index += 1
811812
string += "{eol}{indent}{key}=".format(
812813
eol=eol,
813814
indent=' ' * indent * (level+1),
@@ -819,16 +820,40 @@ def to_string(self, level=0, indent=4, eol='\n', pretty=True, max_chars=80):
819820
pretty=pretty,
820821
max_chars=max_chars)
821822
except AttributeError:
822-
val = repr(self[key])
823-
val_chars = max_chars - (indent*(level+1)) - (len(key)+1)
824-
if pretty and (len(val) > val_chars):
825-
string += val[:val_chars - 5] + '...' + val[-1]
826-
else:
827-
string += val
828-
if index < len(self) - 1:
823+
if pretty: # curtail representation if too many chars
824+
max_len = (max_chars -
825+
indent*(level + 1) -
826+
len(key + "=") -
827+
len(eol))
828+
if index < len(self):
829+
max_len -= len(',') # remember the comma!
830+
if isinstance(self[key], list):
831+
s = "[]"
832+
for iii, entry in enumerate(self[key], 1):
833+
if iii < len(self[key]):
834+
s_sub = graph_objs_tools.curtail_val_repr(
835+
entry,
836+
max_chars=max_len - len(s),
837+
add_delim=True
838+
)
839+
else:
840+
s_sub = graph_objs_tools.curtail_val_repr(
841+
entry,
842+
max_chars=max_len - len(s),
843+
add_delim=False
844+
)
845+
s = s[:-1] + s_sub + s[-1]
846+
if len(s) == max_len:
847+
break
848+
string += s
849+
else:
850+
string += graph_objs_tools.curtail_val_repr(
851+
self[key], max_len)
852+
else: # they want it all!
853+
string += repr(self[key])
854+
if index < len(self):
829855
string += ","
830-
index += 1
831-
if index == len(self):
856+
if index == len(self): # TODO: extraneous...
832857
break
833858
string += "{eol}{indent})".format(eol=eol, indent=' ' * indent * level)
834859
return string
@@ -1341,16 +1366,41 @@ def to_string(self, level=0, indent=4, eol='\n', pretty=True, max_chars=80):
13411366
pretty=pretty,
13421367
max_chars=max_chars)
13431368
except AttributeError:
1344-
val = repr(self[key])
1345-
val_chars = max_chars - (indent*(level+1)) - (len(key)+1)
1346-
if pretty and (len(val) > val_chars):
1347-
string += val[:val_chars - 5] + '...' + val[-1]
1348-
else:
1349-
string += val
1369+
if pretty: # curtail representation if too many chars
1370+
max_len = (max_chars -
1371+
indent*(level + 1) -
1372+
len(key + "=") -
1373+
len(eol))
1374+
if index < len(self):
1375+
max_len -= len(',') # remember the comma!
1376+
if isinstance(self[key], list):
1377+
s = "[]"
1378+
for iii, entry in enumerate(self[key], 1):
1379+
if iii < len(self[key]):
1380+
s_sub = graph_objs_tools.curtail_val_repr(
1381+
entry,
1382+
max_chars=max_len - len(s),
1383+
add_delim=True
1384+
)
1385+
else:
1386+
s_sub = graph_objs_tools.curtail_val_repr(
1387+
entry,
1388+
max_chars=max_len - len(s),
1389+
add_delim=False
1390+
)
1391+
s = s[:-1] + s_sub + s[-1]
1392+
if len(s) == max_len:
1393+
break
1394+
string += s
1395+
else:
1396+
string += graph_objs_tools.curtail_val_repr(
1397+
self[key], max_len)
1398+
else: # they want it all!
1399+
string += repr(self[key])
13501400
if index < len(self) - 1:
13511401
string += ","
13521402
index += 1
1353-
if index == len(self):
1403+
if index == len(self): # TODO: extraneous...
13541404
break
13551405
left_over_keys = [key for key in self if key not in INFO[obj_key]]
13561406
left_over_keys.sort()

Diff for: plotly/graph_objs/graph_objs_tools.py

+31
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import six
2+
13
def update_keys(keys):
24
"""Change keys we used to support to their new equivalent."""
35
updated_keys = list()
@@ -12,3 +14,32 @@ def update_keys(keys):
1214
scl="colorscale",
1315
reversescl="reversescale"
1416
)
17+
18+
19+
def curtail_val_repr(val, max_chars, add_delim=False):
20+
delim = ", "
21+
end = ".."
22+
if isinstance(val, six.string_types):
23+
if max_chars <= len("'" + end + "'"):
24+
return ' ' * max_chars
25+
elif add_delim and max_chars <= len("'" + end + "'") + len(delim):
26+
return "'" + end + "'" + ' ' * (max_chars - len("'" + end + "'"))
27+
else:
28+
if max_chars <= len(end):
29+
return ' ' * max_chars
30+
elif add_delim and max_chars <= len(end) + len(delim):
31+
return end + ' ' * (max_chars - len(end))
32+
if add_delim:
33+
max_chars -= len(delim)
34+
r = repr(val)
35+
if len(r) > max_chars:
36+
if isinstance(val, six.string_types):
37+
# TODO: can we assume this ends in "'"
38+
r = r[:max_chars - len(end + "'")] + end + "'"
39+
elif isinstance(val, list) and max_chars >= len("[{end}]".format(end)):
40+
r = r[:max_chars - len(end + ']')] + end + ']'
41+
else:
42+
r = r[:max_chars - len(end)] + end
43+
if add_delim:
44+
r += delim
45+
return r

0 commit comments

Comments
 (0)