Skip to content

Commit 91e7563

Browse files
committed
Allow tuple/list indexing + Fix test
1 parent dc3cebd commit 91e7563

File tree

3 files changed

+50
-17
lines changed

3 files changed

+50
-17
lines changed

README.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ Basics
4141
# the key is split on '.'s and works on dictionaries
4242
del store['a_dictionary.dict-list']
4343
store['a_dictionary.new_value'] = "old value"
44+
assert store['a_dictionary', 'new_value'] == "old value"
45+
assert store['a_list', 1] == 2
4446
4547
# deep copies are made when assigning values
4648
my_list = ['fun']

jsonstore/__init__.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def __getattr__(self, key):
7171
if key in self._data:
7272
return deepcopy(self._data[key])
7373
else:
74-
raise KeyError(key)
74+
raise AttributeError(key)
7575

7676
@classmethod
7777
def _valid_object(cls, obj, parents=None):
@@ -127,7 +127,10 @@ def __get_obj(self, full_path):
127127
"""
128128
Returns the object which is under the given path
129129
"""
130-
steps = full_path.split(".")
130+
if isinstance(full_path, (tuple, list)):
131+
steps = full_path
132+
else:
133+
steps = full_path.split(".")
131134
path = []
132135
obj = self._data
133136
if not full_path:
@@ -156,7 +159,11 @@ def __getitem__(self, key):
156159
return deepcopy(obj)
157160

158161
def __delitem__(self, name):
159-
path, _, key = name.rpartition(".")
162+
if isinstance(name, (tuple, list)):
163+
path = name[:-1]
164+
key = name[-1]
165+
else:
166+
path, _, key = name.rpartition(".")
160167
obj = self.__get_obj(path)
161168
del obj[key]
162169

jsonstore/tests.py

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,22 @@ def test_new_store(self):
8888
os.remove(store_file)
8989

9090
def test_assign_valid_types(self):
91-
for method in (self._setattr, self._setitem):
92-
for name, value in self.TEST_DATA:
93-
method(name, value)
91+
for name, value in self.TEST_DATA:
92+
self.store[name] = value
93+
self.store[name] == value
94+
getattr(self.store, name) == value
95+
96+
del self.store[name]
97+
self.assertRaises(KeyError, self._getitem(name))
98+
self.assertRaises(AttributeError, self._getattr(name))
99+
100+
setattr(self.store, name, value)
101+
self.store[name] == value
102+
getattr(self.store, name) == value
103+
104+
delattr(self.store, name)
105+
self.assertRaises(KeyError, self._getitem(name))
106+
self.assertRaises(AttributeError, self._getattr(name))
94107

95108
def test_assign_invalid_types(self):
96109
for method in (self._setattr, self._setitem):
@@ -142,16 +155,27 @@ def test_nested_dict_helper(self):
142155
self.assertRaises(KeyError, self._setitem("dictionary.noexist", None))
143156
self.assertRaises(KeyError, self._getitem("dictionary.noexist"))
144157

145-
self.store.dictionary = {"a": 1}
146-
self.store["dictionary.exist"] = None
147-
self.assertIsNone(self.store.dictionary["exist"])
148-
self.assertIsNone(self.store["dictionary.exist"])
149-
150-
self.store["dictionary.a"] = 2
151-
del self.store["dictionary.exist"]
152-
self.assertRaises(KeyError, self._getitem("dictionary.exist"))
153-
self.assertNotIn("exist", self.store.dictionary)
154-
self.assertEqual(self.store.dictionary, {"a": 2})
158+
for access_key in ("dictionary.exist", ("dictionary", "exist"), ["dictionary", "exist"]):
159+
self.store.dictionary = {"a": 1}
160+
self.store["dictionary.exist"] = None
161+
self.assertIsNone(self.store.dictionary["exist"])
162+
self.assertIsNone(self.store[access_key])
163+
164+
self.store["dictionary.a"] = 2
165+
del self.store[access_key]
166+
self.assertRaises(KeyError, self._getitem(access_key))
167+
self.assertNotIn("exist", self.store.dictionary)
168+
self.assertEqual(self.store.dictionary, {"a": 2})
169+
170+
def test_nested_getitem(self):
171+
self.store["list"] = [
172+
{
173+
"key": [None, "value"]
174+
}
175+
]
176+
assert self.store["list", 0, "key", 1] == "value"
177+
assert self.store[["list", 0, "key", 1]] == "value"
178+
self.assertRaises(TypeError, self._getitem("list.0.key.1"))
155179

156180
def test_del(self):
157181
self.store.key = None
@@ -245,7 +269,7 @@ def test_transaction_commit(self):
245269
self.store.value = 2
246270
del self.store.remove_me
247271
self.assertEqual(self.store.value, 2)
248-
self.assertRaises(KeyError, self._getattr("remove_me"))
272+
self.assertRaises(AttributeError, self._getattr("remove_me"))
249273

250274
def test_transaction_write(self):
251275
with self.store:

0 commit comments

Comments
 (0)