Skip to content

Commit 7de2cd3

Browse files
committed
Improve contractions.
1 parent b5aaad5 commit 7de2cd3

File tree

2 files changed

+38
-5
lines changed

2 files changed

+38
-5
lines changed

google/generativeai/string_utils.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import dataclasses
1818
import pprint
19+
import re
1920
import reprlib
2021
import textwrap
2122

@@ -33,17 +34,33 @@ def prettyprint(cls):
3334
return cls
3435

3536

37+
repr = reprlib.Repr()
38+
39+
3640
@reprlib.recursive_repr()
3741
def _prettyprint(self):
38-
"""You can't use `__str__ = pprint.pformat`. That causes a recursion error.
42+
"""A dataclass prettyprint functrion you can use in __str__or __repr__.
43+
44+
Note: You can't set `__str__ = pprint.pformat`. That causes a recursion error.
45+
46+
Mostly identical to pprint but:
3947
40-
This works, but it doesn't handle objects that reference themselves.
48+
* This will contract long lists and dicts to [...] and {...}.
49+
* This will contract object reprs ClassName(...).
4150
"""
4251
fields = []
4352
for f in dataclasses.fields(self):
4453
s = pprint.pformat(getattr(self, f.name))
54+
class_re = r"^(\w+)\(.*\)$"
4555
if s.count("\n") >= 10:
46-
s = "..."
56+
if s.startswith("["):
57+
s = "[...]"
58+
elif s.startswith("{"):
59+
s = "{...}"
60+
elif re.match(class_re, s, flags=re.DOTALL):
61+
s = re.sub(class_re, r"\1(...)", s, flags=re.DOTALL)
62+
else:
63+
s = "..."
4764
else:
4865
width = len(f.name) + 1
4966
s = textwrap.indent(s, " " * width).lstrip(" ")

tests/test_string_utils.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,13 @@ def test_simple(self):
5050
self.assertEqual(pprint.pformat(m), result)
5151
self.assertEqual(repr(m), result)
5252

53-
def test_long(self):
53+
def test_long_list(self):
5454
m = MyClass(a=1, b=1 / 3, c=[1, 2, 3] * 10, d={"a": 1, "b": 2})
5555
expected = textwrap.dedent(
5656
"""
5757
MyClass(a=1,
5858
b=0.3333333333333333,
59-
c=...,
59+
c=[...],
6060
d={'a': 1, 'b': 2})"""
6161
)[1:]
6262
self.assertEqual(expected, str(m))
@@ -80,6 +80,22 @@ def test_nested(self):
8080
self.assertEqual(pprint.pformat(m2), result)
8181
self.assertEqual(repr(m2), result)
8282

83+
def test_long_obj(self):
84+
m = MyClass(a=1, b=1 / 3, c=[1, 2, 3], d=None)
85+
m = MyClass(a=1, b=1 / 3, c=[1, 2, 3], d=m)
86+
m = MyClass(a=1, b=1 / 3, c=[1, 2, 3], d=m)
87+
m = MyClass(a=1, b=1 / 3, c=[1, 2, 3], d=m)
88+
m = MyClass(a=1, b=1 / 3, c=[1, 2, 3], d=m)
89+
90+
expected = textwrap.dedent(
91+
"""
92+
MyClass(a=1,
93+
b=0.3333333333333333,
94+
c=[1, 2, 3],
95+
d=MyClass(...))"""
96+
)[1:]
97+
self.assertEqual(expected, str(m))
98+
8399
def test_recursive(self):
84100
m = MyClass(a=1, b=1 / 3, c=[1, 2, 3], d=None)
85101
m.d = m

0 commit comments

Comments
 (0)