Skip to content

Instantly share code, notes, and snippets.

@cathalgarvey
Created September 21, 2013 23:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cathalgarvey/6655072 to your computer and use it in GitHub Desktop.
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.
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