Skip to content

Commit

Permalink
Merge pull request #10 from builder555/master
Browse files Browse the repository at this point in the history
fetch only specific keys from all data
  • Loading branch information
Adwaith-Rajesh authored Dec 1, 2023
2 parents 59338e9 + 1c24f95 commit 4399314
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 2 deletions.
19 changes: 18 additions & 1 deletion pysondb/db.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ def add(self, data: object) -> str:
keys = db_data['keys']
if not isinstance(keys, list):
raise SchemaTypeError(
f"keys must of type 'list' and not {type(keys)}")
f"keys must be of type 'list' and not {type(keys)}")
if len(keys) == 0:
db_data['keys'] = sorted(list(data.keys()))
else:
Expand Down Expand Up @@ -164,6 +164,23 @@ def add_many(self, data: object, json_response: bool = False) -> Union[SingleDat

return new_data if json_response else None

def get_all_select_keys(self, keys: List[str]) -> ReturnWithIdType:
with self.lock:
file_data = self._load_file()
data = file_data['data']
existing_keys = file_data['keys']
if not isinstance(existing_keys, list):
raise SchemaTypeError(
f"keys must be of type 'list' and not {type(existing_keys)}")
if not set(keys).issubset(existing_keys):
raise UnknownKeyError(
f'Unrecognized key(s) {set(keys) ^ set(existing_keys)}'
'(Unable to find the key(s) in the DB)'
)
if isinstance(data, dict):
return {k: {i: v[i] for i in keys} for k, v in data.items()}
return {}

def get_all(self) -> ReturnWithIdType:
with self.lock:
data = self._load_file()['data']
Expand Down
2 changes: 1 addition & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[metadata]
name = pysondb-v2
version = 2.1.0
version = 2.2.0
author = Adwaith Rajesh
author_email = [email protected]
description = A Simple, Lightweight, Efficent JSON based database for Python.
Expand Down
63 changes: 63 additions & 0 deletions tests/test_db_get_all_select_keys.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import json
import pytest
from pysondb.db import PysonDB
from pysondb.errors import UnknownKeyError


TEST_DATA = {
'version': 2,
'keys': ['age', 'name', 'toy'],
'data': {
'2352346': {
'age': 4,
'name': 'mathew_first',
'toy': 'car',
},
'1234567': {
'age': 9,
'name': 'new_user',
'toy': 'ball',
}
}
}


def test_get_all_select_keys(tmpdir):
f = tmpdir.join('test.json')
f.write(json.dumps(TEST_DATA))

db = PysonDB(f.strpath)
assert db.get_all_select_keys(['age']) == {
'2352346': {
'age': 4,
},
'1234567': {
'age': 9,
}
}
assert db.get_all_select_keys(['name', 'toy']) == {
'2352346': {
'name': 'mathew_first',
'toy': 'car',
},
'1234567': {
'name': 'new_user',
'toy': 'ball',
}
}


def test_get_all_select_keys_empty_file(tmpdir):
f = tmpdir.join('test.json')
f.write(json.dumps({'version': 2, 'keys': [], 'data': {}}))

db = PysonDB(f.strpath)
assert db.get_all_select_keys([]) == {}

def test_get_all_select_keys_wrong_key(tmpdir):
f = tmpdir.join('test.json')
f.write(json.dumps(TEST_DATA))

db = PysonDB(f.strpath)
with pytest.raises(UnknownKeyError):
db.get_all_select_keys(['wrong_key'])

0 comments on commit 4399314

Please sign in to comment.