A versioned domain model framework.
Project description
About
Versioned Domain Model (vdm) is a package which allows you to ‘version’ your domain model in the same way that source code version control systems such as subversion allow you version your code. In particular, versioned domain model versions a complete model and not just individual domain objects (for more on this distinction see below).
At present the package is provided as an extension to SQLAlchemy and SQLObject.
Copyright and License
2007-2008 The Open Knowledge Foundation
Licensed under the MIT license:
A Full Versioned Domain Model
To permit ‘atomic’ changes involving multiple objects at once as well as to facilitate domain object traversal it is necessary to introduce an explicit ‘Revision’ object to represent a single changeset to the domain model.
One also needs to introduce the concept of ‘State’. This allows us to make (some) domain objects stateful, in particular those which are to be versioned (State is necessary to support delete/undelete functionality as well as to implement versioned many-to-many relationships).
For each original domain object that comes versioned we end up with 2 domain objects:
The ‘continuity’: the original domain object.
The ‘version/revision’: the versions/revisions of that domain object.
Often a user will never need to be concerned (explicitly) with the version/revision object as they will just interact with the original domain object, which will, where necessary, ‘proxy’ requests down to the ‘version/revision’.
To give a flavour of all of this here is a pseudo-code example:
# we need a session of some kind to track which objects have been changed # each session then has a single revision rev1 = Revision(author='me') session.revision = rev1 # Book and Author are domain objects which has been made versioned using this library # typo! b1 = Book(name='warandpeace', title='War and Peacee') b2 = Book(name='annakarenina', title='Anna') b3 = Book(name='warandpeace') a1 = Author(name='tolstoy') # this is just shorthand for ending this revision and saving all changes # this may vary depending on the implementation rev1.commit() timestamp1 = rev1.timestamp # some time later rev2 = Revision(author='me') session.revision = rev2 b1 = Book.get(name='warandpeace') # correct typo b1.title = 'War and Peace' # add the author a1 = Author.get(name='tolstoy') b1.authors.append(a1) # duplicate item so delete b3.delete() rev2.commit() # some time even later rev1 = Revision.get(timestamp=timestamp1) b1 = Book.get(name='warandpeace') b1 = b1.get_as_of(rev1) assert b1.title == 'War and Peacee' assert b1.authors == [] # etc
Code in Action
To see some real code in action take a look at:
vdm/sqlalchemy/demo.py vdm/sqlalchemy/demo_test.py vdm/sqlobject/demo.py vdm/sqlobject/demo_test.py
General Conceptual Documentation
A great starting point is Fowler’s Patterns for things that change with time:
<http://www.martinfowler.com/ap2/timeNarrative.html>
In particular Temporal Object:
<http://www.martinfowler.com/ap2/temporalObject.html>
Two possible approaches:
(simpler) Versioned domain objects are versioned independently (like a wiki). This is less of a versioned ‘domain model’ and more of plain versioned domain objects.
(more complex) Have explicit ‘Revision’ object and multiple objects can be changed simultaneously in each revision (atomicity). This is a proper versioned domain model.
Remark: using the first approach it is:
Impossible to support versioning of many-to-many links between versioned domain objects.
Impossible to change multiple objects ‘at once’ – that is as part of one atomic change
Difficult to support domain model traversal, that is the ability to navigate around the domain model at a particular ‘revision’/point-in-time.
More discussions of limitations can be found in this thread [1].
[1]:<http://groups.google.com/group/sqlelixir/browse_thread/thread/50aee902ce3555fb/>
The versioned domain model (vdm) package focuses on supporting the second case (this obviously includes the first one as a subcase) – hence the name.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file vdm-0.3.tar.gz
.
File metadata
- Download URL: vdm-0.3.tar.gz
- Upload date:
- Size: 29.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7e60fb196b074b3b43149cda2d172dafc36b682c85018bd41fa21449cfbc480b |
|
MD5 | 4b3c263febc2770d32dc1cf4d95cb650 |
|
BLAKE2b-256 | 5f0fadc06e82e882b5bed5d3870a47fd1aaafa9d9d05c4f0e64ace394f863fec |
Provenance
File details
Details for the file vdm-0.3-py2.5.egg
.
File metadata
- Download URL: vdm-0.3-py2.5.egg
- Upload date:
- Size: 87.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7d0d5115c3cc95c353e984d24a69ea3775516e6e40614c017d1a73db3cbbcd31 |
|
MD5 | 25b49981b637efe4fba6e66fde28d735 |
|
BLAKE2b-256 | e0eb8b785a99b2e4047a3fd70b2e8e74bb51ad59d8655da5d4c69fd77881c04a |