Skip to content

Commit 95afeac

Browse files
committed
Added list + bracket notation support to sns.from_dict(), used in json.read()
1 parent 43639cb commit 95afeac

14 files changed

Lines changed: 45 additions & 21 deletions

File tree

remove-json-keys/src/remove_json_keys/lib/data/json.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33

44
import json5
55

6-
from . import file
6+
from . import file, sns
77

88
def read(file_path, encoding='utf-8'):
99
with open(file_path, 'r', encoding=encoding) as file:
10-
return json5.load(file)
10+
return sns.from_dict(json5.load(file))
1111

1212
def remove_keys(json_dir, keys):
1313
keys_removed, keys_skipped, files_processed_cnt = [], [], 0
Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,18 @@
11
from types import SimpleNamespace as sn
22

3+
class flex_ns(sn): # to access by dot or bracket
4+
def __getitem__(self, key):
5+
return getattr(self, key)
6+
def __setitem__(self, key, val):
7+
setattr(self, key, val)
8+
def __contains__(self, key):
9+
return hasattr(self, key)
10+
def items(self):
11+
return self.__dict__.items()
12+
313
def from_dict(obj):
4-
for key, val in obj.items():
5-
if isinstance(val, dict):
6-
obj[key] = from_dict(val)
7-
return sn(**obj)
14+
if isinstance(obj, dict):
15+
return flex_ns(**{key: from_dict(val) for key, val in obj.items()})
16+
if isinstance(obj, list):
17+
return [from_dict(item) for item in obj]
18+
return obj

remove-json-keys/src/remove_json_keys/lib/init.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from . import data, language, log, settings
44

55
def cli(caller_file):
6-
cli = data.sns.from_dict(data.json.read(Path(__file__).parent.parent / 'assets/data/package_data.json'))
6+
cli = data.json.read(Path(__file__).parent.parent / 'assets/data/package_data.json')
77
cli.msgs = language.get_msgs()
88
settings.load(cli, caller_file)
99
return cli

remove-json-keys/src/remove_json_keys/lib/language.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@
55

66
def get_msgs():
77
msgs_path = Path(__file__).parent.parent / 'assets' / 'data' / 'messages.json'
8-
return sn(**{ key:val['message'] for key,val in data.json.read(msgs_path).items() })
8+
return sn(**{ key: val.message for key, val in data.json.read(msgs_path).items() })

remove-json-keys/src/remove_json_keys/lib/settings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ def load(cli, caller_file):
4747
config_path = Path(cli.project_root) / filename
4848
if config_path.exists():
4949
cli.config_filepath = str(config_path)
50-
cli.config = data.sns.from_dict(data.json.read(cli.config_filepath))
50+
cli.config = data.json.read(cli.config_filepath)
5151
cli.config_filename = filename
5252
break
5353
if hasattr(cli, 'config_filename'):

remove-json-keys/utils/bump.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
from remove_json_keys.lib import data, log # type: ignore
1414

15-
msgs = sn(**{ key:val['message'] for key,val in data.json.read(paths.msgs)['bump'].items() })
15+
msgs = sn(**{ key: val.message for key, val in data.json.read(paths.msgs).bump.items() })
1616

1717
def parse_args():
1818
argp = argparse.ArgumentParser(description=msgs.app_DESC, add_help=False)

remove-json-keys/utils/clean.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ def main():
99

1010
from remove_json_keys.lib import data, log # type: ignore
1111

12-
msgs = sn(**{ key:val['message'] for key,val in data.json.read(paths.msgs)['clean'].items() })
12+
msgs = sn(**{ key: val.message for key, val in data.json.read(paths.msgs).clean.items() })
1313

1414
for target in ['dist', 'build', '*_cache', '__pycache__', '*.egg-info']:
1515
for path in Path('.').rglob(target):

translate-messages/src/translate_messages/lib/data/json.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33

44
import json5
55

6+
from . import sns
7+
68
def read(file_path, encoding='utf-8'):
79
with open(file_path, 'r', encoding=encoding) as file:
8-
return json5.load(file)
10+
return sns.from_dict(json5.load(file))
911

1012
def write(file_path, data, encoding='utf-8'):
1113
Path(file_path).parent.mkdir(parents=True, exist_ok=True)
Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,18 @@
11
from types import SimpleNamespace as sn
22

3+
class flex_ns(sn): # to access by dot or bracket
4+
def __getitem__(self, key):
5+
return getattr(self, key)
6+
def __setitem__(self, key, val):
7+
setattr(self, key, val)
8+
def __contains__(self, key):
9+
return hasattr(self, key)
10+
def items(self):
11+
return self.__dict__.items()
12+
313
def from_dict(obj):
4-
for key, val in obj.items():
5-
if isinstance(val, dict):
6-
obj[key] = from_dict(val)
7-
return sn(**obj)
14+
if isinstance(obj, dict):
15+
return flex_ns(**{key: from_dict(val) for key, val in obj.items()})
16+
if isinstance(obj, list):
17+
return [from_dict(item) for item in obj]
18+
return obj

translate-messages/src/translate_messages/lib/init.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from . import data, language, log, settings
55

66
def cli(caller_file):
7-
cli = data.sns.from_dict(data.json.read(Path(__file__).parent.parent / 'assets/data/package_data.json'))
7+
cli = data.json.read(Path(__file__).parent.parent / 'assets/data/package_data.json')
88
cli.msgs = language.get_msgs()
99
settings.load(cli, caller_file)
1010
return cli

0 commit comments

Comments
 (0)