Skip to content

Commit f09180c

Browse files
committed
feat: supports to import from another hierarchies
1 parent 310a578 commit f09180c

File tree

4 files changed

+115
-17
lines changed

4 files changed

+115
-17
lines changed

src/json_as_db/Database.py

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,19 @@ class Database(dict):
4040
__memory__ = dict()
4141

4242
def __init__(self, *arg, **kwargs) -> None:
43+
self.__dict__ = self._create_empty()
44+
self.__dict__.update({
45+
self.__data__: dict(*arg, **kwargs),
46+
})
47+
48+
def _create_empty(self) -> dict:
4349
now = datetime.now().isoformat()
44-
self.__dict__ = {
50+
return {
4551
'version': self.__version__,
4652
'creator': package_name,
4753
'created_at': now,
4854
'updated_at': now,
49-
self.__data__: dict(*arg, **kwargs),
55+
self.__data__: dict(),
5056
}
5157

5258
def __getitem__(self, key: str) -> Any:
@@ -289,21 +295,29 @@ def load(
289295
with open(path, **file_args) as f:
290296
raw = json.loads(f.read(), **json_args)
291297

292-
keys_in_raw = set(raw.keys())
293-
field_keys = set(self.__metadata__ + [self.__data__])
294-
if len(field_keys - keys_in_raw) > 0:
295-
raise AttributeError('Invalid database format')
296-
297-
loaded_dict = {
298-
'version': raw['version'],
299-
'creator': raw['creator'],
300-
'created_at': raw['created_at'],
301-
'updated_at': raw['updated_at'],
302-
self.__data__: raw[self.__data__],
303-
}
304-
self.__dict__ = override_dict(loaded_dict, self.__dict__)
298+
self._create(raw)
305299
return self
306300

301+
def _create(self, raw: Union[dict, list]) -> None:
302+
self.__dict__ = self._create_empty()
303+
304+
if type(raw) == dict:
305+
keys_in_raw = set(raw.keys())
306+
field_keys = set(self.__metadata__ + [self.__data__])
307+
is_fields_valid = len(field_keys - keys_in_raw) == 0
308+
if is_fields_valid:
309+
self.__dict__.update({
310+
'version': raw['version'],
311+
'creator': raw['creator'],
312+
'created_at': raw['created_at'],
313+
'updated_at': raw['updated_at'],
314+
self.__data__: raw[self.__data__],
315+
})
316+
else:
317+
self.add(raw)
318+
elif type(raw) == list:
319+
self.add(raw)
320+
307321
def save(
308322
self,
309323
path: str,

tests/database/test_serialization.py

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@
77
CUR_DIR = os.path.dirname(os.path.realpath(__file__))
88

99

10-
def test_db_load() -> Database:
11-
filepath = os.path.join(CUR_DIR, '..', 'samples', 'basic.json')
10+
def test_db_load():
11+
filepath = os.path.join(CUR_DIR, '..', 'samples', 'db.json')
12+
filepath = os.path.abspath(filepath)
1213
logger.debug('setup: (file) '+ filepath)
1314

1415
db = Database().load(filepath)
@@ -26,6 +27,48 @@ def test_db_load() -> Database:
2627
assert item_expected == item
2728

2829

30+
def test_db_load_from_list_json():
31+
filepath = os.path.join(CUR_DIR, '..', 'samples', 'list.json')
32+
filepath = os.path.abspath(filepath)
33+
logger.debug('setup: (file) '+ filepath)
34+
35+
db = Database().load(filepath)
36+
logger.debug(db)
37+
assert len(db) == 2
38+
39+
keys = list(db.keys())
40+
assert len(keys) == 2
41+
42+
item1 = db.get(keys[0])
43+
item2 = db.get(keys[1])
44+
45+
logger.debug(f"db['{keys[0]}'] = {item1}")
46+
logger.debug(f"db['{keys[1]}'] = {item2}")
47+
48+
if 'empty' in item1:
49+
assert item1["randomInteger"] == 123
50+
assert item2["randomInteger"] == 321
51+
else:
52+
assert item1["randomInteger"] == 321
53+
assert item2["randomInteger"] == 123
54+
55+
56+
def test_db_load_from_json():
57+
filepath = os.path.join(CUR_DIR, '..', 'samples', 'sample1.json')
58+
filepath = os.path.abspath(filepath)
59+
logger.debug('setup: (file) '+ filepath)
60+
61+
db = Database().load(filepath)
62+
assert len(db) == 1
63+
64+
items = db.all()
65+
item = items[0]
66+
assert type(item) is dict
67+
68+
assert 'someExtraKey' in item
69+
assert item['someExtraKey'] == 989347
70+
assert len(item['items']) == 2
71+
2972

3073
def test_db_save():
3174
temp_dir = os.path.relpath(os.path.join(CUR_DIR, 'test_save'))
@@ -47,6 +90,7 @@ def test_db_save():
4790
logger.debug(f'[after adding items] {db}')
4891

4992
filepath = os.path.join(temp_dir, 'db.json')
93+
filepath = os.path.abspath(filepath)
5094
logger.debug(f'[saving path] {filepath}')
5195
kwargs = {
5296
'file_args': {'encoding': 'utf-8'},

tests/samples/list.json

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
[
2+
{
3+
"randomInteger": 123,
4+
"randomString": "keyboard-cat",
5+
"booleanTrue": true,
6+
"booleanFalse": false,
7+
"empty": null,
8+
"list": [
9+
"first element"
10+
]
11+
}, {
12+
"randomInteger": 321,
13+
"randomString": "cheshire-cat",
14+
"list": [
15+
"alice", "in", "wonderland"
16+
]
17+
}
18+
]

tests/samples/sample1.json

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"key": "randomKey",
3+
"someExtraKey": 989347,
4+
"items": [
5+
{
6+
"randomInteger": 123,
7+
"randomString": "keyboard-cat",
8+
"booleanTrue": true,
9+
"booleanFalse": false,
10+
"empty": null,
11+
"list": [
12+
"first element"
13+
]
14+
}, {
15+
"randomInteger": 321,
16+
"randomString": "cheshire-cat",
17+
"list": [
18+
"alice", "in", "wonderland"
19+
]
20+
}
21+
]
22+
}

0 commit comments

Comments
 (0)