Skip to content

Commit 7fcb502

Browse files
authored
Multidict (#34)
* implementing multidict * fix for py 3.5 * fix timing test
1 parent 20decfd commit 7fcb502

File tree

5 files changed

+54
-8
lines changed

5 files changed

+54
-8
lines changed

.travis.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,11 @@ install:
2222

2323
script:
2424
- make lint
25-
- make test
25+
- # test with and without optional dependencies then combine coverage
26+
- make test && mv .coverage .coverage.extra
27+
- pip uninstall -y multidict
28+
- make test && mv .coverage .coverage.no-extra
29+
- coverage combine
2630
- make docs
2731
- ./tests/check_tag.py
2832

devtools/prettier.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@
1616
else:
1717
pyg_lexer, pyg_formatter = PythonLexer(), Terminal256Formatter(style='vim')
1818

19+
try:
20+
from multidict import MultiDict
21+
except ImportError:
22+
MultiDict = None
23+
1924
__all__ = 'PrettyFormat', 'pformat', 'pprint'
2025

2126
PARENTHESES_LOOKUP = [
@@ -50,13 +55,15 @@ def __init__(self,
5055
self._width = width
5156
self._type_lookup = [
5257
(dict, self._format_dict),
53-
(str, self._format_str_bytes),
54-
(bytes, self._format_str_bytes),
58+
((str, bytes), self._format_str_bytes),
5559
(tuple, self._format_tuples),
5660
((list, set, frozenset), self._format_list_like),
5761
(Generator, self._format_generators),
5862
]
5963

64+
if MultiDict:
65+
self._type_lookup.append((MultiDict, self._format_dict))
66+
6067
def __call__(self, value: Any, *, indent: int = 0, indent_first: bool = False, highlight: bool = False):
6168
self._stream = io.StringIO()
6269
self._format(value, indent_current=indent, indent_first=indent_first)
@@ -86,6 +93,9 @@ def _format_dict(self, value: dict, value_repr: str, indent_current: int, indent
8693
if isinstance(value, OrderedDict):
8794
open_, split_, after_, close_ = 'OrderedDict([\n', ', ', '),\n', '])'
8895
before_ += '('
96+
elif MultiDict and isinstance(value, MultiDict):
97+
open_, close_ = '<{}(\n'.format(value.__class__.__name__), ')>'
98+
8999
self._stream.write(open_)
90100
for k, v in value.items():
91101
self._stream.write(before_)

tests/requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ pytest-mock==1.10.0
1212
pytest-sugar==0.9.2
1313
pytest-toolbox==0.4
1414
numpy # pyup: ignore
15+
multidict # pyup: ignore

tests/test_prettier.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@
99
from devtools.ansi import strip_ansi
1010
from devtools.prettier import PrettyFormat, env_true, pformat, pprint
1111

12+
try:
13+
from multidict import CIMultiDict, MultiDict
14+
except ImportError:
15+
CIMultiDict = None
16+
MultiDict = None
17+
1218

1319
def test_dict():
1420
v = pformat({1: 2, 3: 4})
@@ -249,3 +255,28 @@ def test_call_args_py354():
249255
def test_env_true():
250256
assert env_true('PATH') is False
251257
assert env_true('DOES_NOT_EXIST') is None
258+
259+
260+
@pytest.mark.skipif(MultiDict is None, reason='MultiDict not installed')
261+
def test_multidict():
262+
d = MultiDict({'a': 1, 'b': 2})
263+
d.add('b', 3)
264+
v = pformat(d)
265+
assert set(v.split('\n')) == {
266+
"<MultiDict(",
267+
" 'a': 1,",
268+
" 'b': 2,",
269+
" 'b': 3,",
270+
")>",
271+
}
272+
273+
274+
@pytest.mark.skipif(CIMultiDict is None, reason='CIMultiDict not installed')
275+
def test_cimultidict():
276+
v = pformat(CIMultiDict({'a': 1, 'b': 2}))
277+
assert set(v.split('\n')) == {
278+
"<CIMultiDict(",
279+
" 'a': 1,",
280+
" 'b': 2,",
281+
")>",
282+
}

tests/test_timer.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,16 +40,16 @@ def test_unfinished():
4040
def test_multiple_not_verbose():
4141
f = io.StringIO()
4242
t = Timer(file=f)
43-
for i in [0.001, 0.002, 0.003]:
43+
for i in [0.01, 0.02, 0.03]:
4444
with t(verbose=False):
4545
sleep(i)
4646
t.summary(True)
4747
v = f.getvalue()
4848
assert v == (
49-
' 0.001s elapsed\n'
50-
' 0.002s elapsed\n'
51-
' 0.003s elapsed\n'
52-
'3 times: mean=0.002s stdev=0.001s min=0.001s max=0.003s\n'
49+
' 0.010s elapsed\n'
50+
' 0.020s elapsed\n'
51+
' 0.030s elapsed\n'
52+
'3 times: mean=0.020s stdev=0.010s min=0.010s max=0.030s\n'
5353
)
5454

5555

0 commit comments

Comments
 (0)