Poprawienienie implementacji obserwatorów.
[redakcja.git] / lib / wlrepo / __init__.py
1 # -*- encoding: utf-8 -*-
2 __author__="Łukasz Rekucki"
3 __date__ ="$2009-09-18 10:49:24$"
4
5 __doc__ = """Main module for the Repository Abstraction Layer"""
6
7 class Library(object):
8
9     def __init__(self, create=False):
10         """Open an existing library, or create a new one. By default, fails if
11         the library doesn't exist."""
12         self.create = create     
13         
14     def main_cabinet(self):
15         """Return the "main" cabinet of the library."""
16         pass
17
18     def cabinets(self):
19         """List all cabinets in the library."""
20         pass
21
22     def cabinet(self, document, user, create=False):
23         """Open a cabinet belonging to the _user_ for a given _document_.
24         If the _document_ is actually a sub-document, it's parent's cabinet is
25         opened istead.
26         
27         If the cabinet doesn't exists and create is False (the default), a 
28         CabinetNotFound exception is raised.
29         
30         If create is True, a new cabinet is created if it doesn't exist yet."""
31         pass
32
33
34 class Cabinet(object):
35
36     def __init__(self, library, name=None, doc=None, user=None):
37         self._library = library
38         if name:
39             self._name = name
40             self._maindoc = ''
41             self._user = self._document = None
42         elif doc and user:
43             self._user = user
44             self._document = doc
45             self._name = user + ':' + doc
46             self._maindoc = doc
47         else:
48             raise ValueError("You must provide either name or doc and user.")
49
50         print "new cab:", self._name, self._user, self._document
51
52     @property
53     def username(self):
54         return self._user
55
56     def __str__(self):
57         return "Cabinet(%s)" % self._name
58
59     def documents(self):
60         """Lists all documents and sub-documents in this cabinet."""
61         pass
62     
63     def retrieve(self, parts=None, shelve=None):
64         """Retrieve a document from a given shelve in the cabinet. If no
65         part is given, the main document is retrieved. If no shelve is given,
66         the top-most shelve is used.
67
68         If parts is a list, all the given parts are retrieved atomicly. Use None
69         as the name for the main document"""
70         pass
71
72     def create(self, name, initial_data=''):
73         """Create a new sub-document in the cabinet with the given name."""
74         pass
75
76     @property
77     def maindoc_name(self):
78         return self._maindoc
79
80     @property
81     def library(self):
82         return self._library
83
84     @property
85     def name(self):
86         return self._name
87
88     def shelf(self, selector=None):
89         pass
90
91 class Document(object):
92     def __init__(self, cabinet, name):
93         self._cabinet = cabinet
94         self._name = name
95
96     def read(self):
97         pass
98
99     def write(self, data):
100         pass
101
102     @property
103     def cabinet(self):
104         return self._cabinet
105
106     @property
107     def library(self):
108         return self._cabinet.library
109
110     @property
111     def name(self):
112         return self._name
113
114     def shelf(self):
115         return self._cabinet.shelf()
116
117     @property
118     def size(self):
119         raise NotImplemented()
120
121     @property
122     def parts(self):
123         raise NotImplemented()
124
125
126 class Shelf(object):
127
128     def __init__(self, lib):
129         self._library = lib        
130     
131 #
132 # Exception classes
133 #
134
135 class LibraryException(Exception):
136     
137     def __init__(self, msg, cause=None):
138         Exception.__init__(self, msg)
139         self.cause = cause
140
141 class CabinetNotFound(LibraryException):
142     def __init__(self, cabname):
143         LibraryException.__init__(self, "Cabinet '%s' not found." % cabname)
144     pass
145
146
147 # import backends to local namespace
148 from backend_mercurial import MercurialLibrary