PersistentObjects 0.1.6__tar.gz → 0.1.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PersistentObjects
3
- Version: 0.1.6
3
+ Version: 0.1.7
4
4
  Summary: JSON-backed attribute-persistent object with namespace support
5
5
  Author: Tornado300
6
6
  License-Expression: MIT
@@ -23,6 +23,7 @@ class _PersistentState:
23
23
  self._path = os.path.abspath(path)
24
24
  self._lock = threading.Lock()
25
25
  self._data = {}
26
+ self._defaults = {}
26
27
  self._load()
27
28
 
28
29
  def _load(self):
@@ -96,6 +97,7 @@ class _Namespace:
96
97
  self._initialized = True
97
98
  self._root = root
98
99
  self._key = key
100
+ self._defaults = {}
99
101
 
100
102
  def __getattr__(self, name):
101
103
  if name.startswith("_"):
@@ -126,10 +128,64 @@ class _Namespace:
126
128
  bucket[name] = value
127
129
  self._root._save()
128
130
 
131
+ def setdefault(self, name: str, value):
132
+ """Set a value only if the key doesn't already exist. Registers the value as the default for reset()."""
133
+ self._defaults[name] = value
134
+ with self._root._lock:
135
+ bucket = self._root._data.setdefault(self._key, {})
136
+ if name not in bucket:
137
+ bucket[name] = value
138
+ self._root._save()
139
+ return self._root._data[self._key][name]
140
+
141
+ def reset(self, name: str | None = None):
142
+ """Reset a key to its default value, or all keys if no name is given.
143
+
144
+ Raises KeyError if the key has no registered default.
145
+ """
146
+ with self._root._lock:
147
+ bucket = self._root._data.setdefault(self._key, {})
148
+ if name is not None:
149
+ if name not in self._defaults:
150
+ raise KeyError(
151
+ f"No default registered for '{name}'. Use setdefault() first."
152
+ )
153
+ bucket[name] = self._defaults[name]
154
+ else:
155
+ for key, value in self._defaults.items():
156
+ bucket[key] = value
157
+ self._root._save()
158
+
129
159
 
130
160
  class PersistentObject(_PersistentState):
131
161
  def namespace(self, name) -> _Namespace:
132
162
  return _Namespace(self, name)
133
163
 
164
+ def setdefault(self, name: str, value):
165
+ """Set a value only if the key doesn't already exist. Registers the value as the default for reset()."""
166
+ self._defaults[name] = value
167
+ with self._lock:
168
+ if name not in self._data:
169
+ self._data[name] = value
170
+ self._save()
171
+ return self._data[name]
172
+
173
+ def reset(self, name: str | None = None):
174
+ """Reset a key to its default value, or all keys if no name is given.
175
+
176
+ Raises KeyError if the key has no registered default.
177
+ """
178
+ with self._lock:
179
+ if name is not None:
180
+ if name not in self._defaults:
181
+ raise KeyError(
182
+ f"No default registered for '{name}'. Use setdefault() first."
183
+ )
184
+ self._data[name] = self._defaults[name]
185
+ else:
186
+ for key, value in self._defaults.items():
187
+ self._data[key] = value
188
+ self._save()
189
+
134
190
 
135
191
  __all__ = ["PersistentObject"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PersistentObjects
3
- Version: 0.1.6
3
+ Version: 0.1.7
4
4
  Summary: JSON-backed attribute-persistent object with namespace support
5
5
  Author: Tornado300
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "PersistentObjects"
7
- version = "0.1.6"
7
+ version = "0.1.7"
8
8
  description = "JSON-backed attribute-persistent object with namespace support"
9
9
  authors = [
10
10
  { name="Tornado300" }