Created
September 21, 2013 23:10
-
-
Save cathalgarvey/6655072 to your computer and use it in GitHub Desktop.
A revision-enabled dict subclass, so your dicts don't forget their prior entries.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class VersionedDict(dict): | |
'''A dictionary sublcass that remembers all or a defined number of prior entries for a key. | |
Allows reversion by number from "head" or by absolute reference in revision list. | |
Allows retrieval of currently retained revision history for a key. | |
Deletion deletes all revisions, not merely the most recent. | |
If instantiated with the "revisions" keyword and an integer argument, only retains that many revisions per entry.''' | |
def __init__(self, *args, **kwargs): | |
revisions = kwargs.pop('revisions', None) | |
self._allowed_revisions = abs(int(revisions)) | |
dict.__init__(self, *args, **kwargs) | |
def __getitem__(self, key): | |
return dict.__getitem__(self, key)[-1] | |
def __setitem__(self, key, value): | |
if dict.get(self, key, [])[-1:] != [value]: | |
dict.setdefault(self, key, []).append(value) | |
if self._allowed_revisions and len(dict.__getitem__(self, key)) > self._allowed_revisions: | |
dict.__setitem__(self, key, dict.__getitem__(self, key)[-self._allowed_revisions:]) | |
def revert_back_by(self, key, revert_by): | |
self[key] = dict.__getitem__(self, key)[-(revert_by+1)] | |
def revert_to(self, key, revert_to): | |
self[key] = dict.__getitem__(self, key)[revert_to] | |
def trim_revisions(self, number): | |
for key in self: | |
dict.__setitem__(self, key, dict.__getitem__(self, key)[-number:]) | |
def get_revisions(self, key): | |
return dict.__getitem__(self, key) | |
def del_revision(self, key, number): | |
del(dict.__getitem__(self, key)[number]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment