Unverified Commit e87a04e3 authored by Jerry Jiarui XU's avatar Jerry Jiarui XU Committed by GitHub
Browse files

add pretty_text (#220)

* add pretty_text

* add test cases

* add argument indent

* change pretty_text to property

* fixed format end
parent 9895a1af
...@@ -191,6 +191,68 @@ class Config(object): ...@@ -191,6 +191,68 @@ class Config(object):
def text(self): def text(self):
return self._text return self._text
@property
def pretty_text(self):
indent = 4
def _indent(s_, num_spaces):
s = s_.split('\n')
if len(s) == 1:
return s_
first = s.pop(0)
s = [(num_spaces * ' ') + line for line in s]
s = '\n'.join(s)
s = first + '\n' + s
return s
def _format_basic_types(k, v):
if isinstance(v, str):
v_str = "'{}'".format(v)
else:
v_str = str(v)
attr_str = '{}={}'.format(str(k), v_str)
attr_str = _indent(attr_str, indent)
return attr_str
def _format_list(k, v):
# check if all items in the list are dict
if all(isinstance(_, dict) for _ in v):
v_str = '[\n'
v_str += '\n'.join(
'dict({}),'.format(_indent(_format_dict(v_), indent))
for v_ in v).rstrip(',')
attr_str = '{}={}'.format(str(k), v_str)
attr_str = _indent(attr_str, indent) + ']'
else:
attr_str = _format_basic_types(k, v)
return attr_str
def _format_dict(d, outest_level=False):
r = ''
s = []
for idx, (k, v) in enumerate(d.items()):
is_last = idx >= len(d) - 1
end = '' if outest_level or is_last else ','
if isinstance(v, dict):
v_str = '\n' + _format_dict(v)
attr_str = '{}=dict({}'.format(str(k), v_str)
attr_str = _indent(attr_str, indent) + ')' + end
elif isinstance(v, list):
attr_str = _format_list(k, v) + end
else:
attr_str = _format_basic_types(k, v) + end
s.append(attr_str)
r += '\n'.join(s)
return r
cfg_dict = self._cfg_dict.to_dict()
text = _format_dict(cfg_dict, outest_level=True)
return text
def __repr__(self): def __repr__(self):
return 'Config (path: {}): {}'.format(self.filename, return 'Config (path: {}): {}'.format(self.filename,
self._cfg_dict.__repr__()) self._cfg_dict.__repr__())
......
_base_ = ['./l1.py', './l2.yaml', './l3.json'] _base_ = ['./l1.py', './l2.yaml', './l3.json', './l4.py']
item3 = False item3 = False
item4 = 'test' item4 = 'test'
item5 = dict(a=0, b=1)
item6 = [dict(a=0), dict(b=1)]
item7 = dict(a=[0, 1, 2], b=dict(c=[3.1, 4.2, 5.3]))
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
import json import json
import os.path as osp import os.path as osp
import sys import sys
import tempfile
import pytest import pytest
...@@ -78,6 +79,9 @@ def test_merge_from_multiple_bases(): ...@@ -78,6 +79,9 @@ def test_merge_from_multiple_bases():
assert cfg.item2.a == 0 assert cfg.item2.a == 0
assert cfg.item3 is False assert cfg.item3 is False
assert cfg.item4 == 'test' assert cfg.item4 == 'test'
assert cfg.item5 == dict(a=0, b=1)
assert cfg.item6 == [dict(a=0), dict(b=1)]
assert cfg.item7 == dict(a=[0, 1, 2], b=dict(c=[3.1, 4.2, 5.3]))
with pytest.raises(KeyError): with pytest.raises(KeyError):
Config.fromfile(osp.join(osp.dirname(__file__), 'data/config/m.py')) Config.fromfile(osp.join(osp.dirname(__file__), 'data/config/m.py'))
...@@ -171,3 +175,14 @@ def test_setattr(): ...@@ -171,3 +175,14 @@ def test_setattr():
assert cfg.item2.a == 0 assert cfg.item2.a == 0
assert cfg._cfg_dict['item5'] == {'a': {'b': None}} assert cfg._cfg_dict['item5'] == {'a': {'b': None}}
assert cfg.item5.a.b is None assert cfg.item5.a.b is None
def test_pretty_text():
cfg_file = osp.join(osp.dirname(__file__), 'data/config/l.py')
cfg = Config.fromfile(cfg_file)
with tempfile.TemporaryDirectory() as temp_config_dir:
text_cfg_filename = osp.join(temp_config_dir, '_text_config.py')
with open(text_cfg_filename, 'w') as f:
f.write(cfg.pretty_text)
text_cfg = Config.fromfile(text_cfg_filename)
assert text_cfg._cfg_dict == cfg._cfg_dict
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment