ed0998cf6bdb3d9c412588ccdecdd4e438c6e4ec
[redakcja.git] / lib / wlrepo / __init__.py
1 # -*- encoding: utf-8 -*-
2 __author__="Ɓukasz Rekucki"
3 __date__ ="$2009-09-18 10:49:24$"
4 __doc__ = """Main module for the Repository Abstraction Layer"""
5
6 class Library(object):
7
8     def __init__(self, create=False):
9         """Open an existing library, or create a new one. By default, fails if
10         the library doesn't exist."""
11         self.create = create      
12
13     def documents(self):
14         """List all documents in the library."""
15         pass
16
17     def document_for_revision(self, rev):
18         """Retrieve a document in the specified revision."""
19         pass
20
21     def document(self, docid, user=None, rev='latest'):
22         """Retrieve a document from a library."""
23         pass
24
25     def get_revision(self, revid):
26         """Retrieve a handle to a specified revision."""
27         return None
28
29     def document_create(self, docid):
30         """Create a new document. The document will have it's own branch."""
31         
32
33 class Document(object):
34     """A class representing a document package boundled with a revision."""
35
36     def __init__(self, library, revision):
37         """_library_ should be an instance of a Library."""
38         self._library = library
39         if isinstance(revision, Revision):
40             self._revision = revision
41         else:
42             self._revision = library.get_revision(revision)
43
44
45     def take(self, user):
46         """Make a user copy of the document. This is persistant."""
47         pass
48
49     def giveback(self):
50         """Informs the library, that the user no longer needs this document.
51         Should be called on the user version of document. If not, it doesn nothing."""
52        
53     def data(self, entry):
54         """Returns the specified entry as a unicode data."""
55         pass
56
57     @property
58     def library(self):
59         return self._library
60
61     @property
62     def revision(self):
63         return self._revision
64
65     @property
66     def id(self):
67         return self._revision.document_name
68
69     @property
70     def owner(self):
71         return self._revision.user_name
72     
73     def parentof(self, other):
74         return self._revision.parentof(other._revision)
75
76     def parent(self):
77         return self._library.document_for_revision(self._revision.parent())
78
79     def has_parent_from(self, other):
80         return self._revision.has_parent_from(other._revision)
81
82     def ancestorof(self, other):
83         return self._revision.ancestorof(other._revision)
84
85
86 class Revision(object):
87
88     def __init__(self, lib):
89         self._library = lib
90
91     def parentof(self, other):
92         return False
93
94     def ancestorof(self, other):
95         return False
96
97     @property
98     def document_name(self):
99         raise ValueError()
100
101     @property
102     def user_name(self):
103         raise ValueError()
104
105 #
106 # Exception classes
107 #
108
109 class LibraryException(Exception):    
110     def __init__(self, msg, cause=None):
111         Exception.__init__(self, msg)
112         self.cause = cause
113
114 class UpdateException(LibraryException):
115     pass
116
117 class OutdatedException(LibraryException):
118     pass
119
120 class RevisionNotFound(LibraryException):
121     def __init__(self, rev):
122         LibraryException.__init__(self, "Revision %r not found." % rev)
123
124 class RevisionMismatch(LibraryException):
125     def __init__(self, fdi, rev):
126         LibraryException.__init__(self, "No revision %r for document %r." % (rev, fdi))
127     
128 class EntryNotFound(LibraryException):
129     def __init__(self, rev, entry, guesses=[]):
130         LibraryException.__init__(self, \
131             u"Entry '%s' at revision %r not found. %s" % (entry, rev, \
132             (u"Posible values:\n" + u',\n'.join(guesses)) if len(guesses) else u'') )
133
134 class DocumentAlreadyExists(LibraryException):
135     pass
136
137 # import backends to local namespace
138
139 def open_library(path, proto, *args, **kwargs):
140     if proto == 'hg':
141         import wlrepo.mercurial_backend.library
142         return wlrepo.mercurial_backend.library.MercurialLibrary(path, *args, **kwargs)
143
144     raise NotImplemented()