FIX: Nie można było zaakceptować pull request.
[redakcja.git] / lib / wlrepo / __init__.py
old mode 100644 (file)
new mode 100755 (executable)
index 5c27dc9..ed0998c
@@ -1,7 +1,6 @@
 # -*- encoding: utf-8 -*-
 __author__="Łukasz Rekucki"
 __date__ ="$2009-09-18 10:49:24$"
-
 __doc__ = """Main module for the Repository Abstraction Layer"""
 
 class Library(object):
@@ -9,103 +8,137 @@ class Library(object):
     def __init__(self, create=False):
         """Open an existing library, or create a new one. By default, fails if
         the library doesn't exist."""
-        self.create = create     
-        
-    def main_cabinet(self):
-        """Return the "main" cabinet of the library."""
+        self.create = create      
+
+    def documents(self):
+        """List all documents in the library."""
         pass
 
-    def cabinets(self):
-        """List all cabinets in the library."""
+    def document_for_revision(self, rev):
+        """Retrieve a document in the specified revision."""
         pass
 
-    def cabinet(self, document, user, create=False):
-        """Open a cabinet belonging to the _user_ for a given _document_.
-        If the _document_ is actually a sub-document, it's parent's cabinet is
-        opened istead.
-        
-        If the cabinet doesn't exists and create is False (the default), a 
-        CabinetNotFound exception is raised.
-        
-        If create is True, a new cabinet is created if it doesn't exist yet."""
+    def document(self, docid, user=None, rev='latest'):
+        """Retrieve a document from a library."""
         pass
 
+    def get_revision(self, revid):
+        """Retrieve a handle to a specified revision."""
+        return None
 
-class Cabinet(object):
+    def document_create(self, docid):
+        """Create a new document. The document will have it's own branch."""
+        
 
-    def __init__(self, library, name=None, doc=None, user=None):
+class Document(object):
+    """A class representing a document package boundled with a revision."""
+
+    def __init__(self, library, revision):
+        """_library_ should be an instance of a Library."""
         self._library = library
-        if name:
-            self._name = name
-            self._maindoc = ''
-        elif doc and user:
-            self._name = user + ':' + doc
-            self._maindoc = doc
+        if isinstance(revision, Revision):
+            self._revision = revision
         else:
-            raise ValueError("You must provide either name or doc and user.")
+            self._revision = library.get_revision(revision)
 
-    def documents(self):
-        """Lists all documents and sub-documents in this cabinet."""
-        pass
-    
-    def retrieve(self, parts=None, shelve=None):
-        """Retrieve a document from a given shelve in the cabinet. If no
-        part is given, the main document is retrieved. If no shelve is given,
-        the top-most shelve is used.
 
-        If parts is a list, all the given parts are retrieved atomicly. Use None
-        as the name for the main document"""
+    def take(self, user):
+        """Make a user copy of the document. This is persistant."""
         pass
 
-    def create(self, name):
-        """Create a new sub-document in the cabinet with the given name."""
+    def giveback(self):
+        """Informs the library, that the user no longer needs this document.
+        Should be called on the user version of document. If not, it doesn nothing."""
+       
+    def data(self, entry):
+        """Returns the specified entry as a unicode data."""
         pass
-    
-    def maindoc_name(self):
-        return self._maindoc
-
 
     @property
     def library(self):
         return self._library
 
     @property
-    def name(self):
-        return self._name
+    def revision(self):
+        return self._revision
 
-class Document(object):
-    def __init__(self, cabinet, name):
-        self._cabinet = cabinet
-        self._name = name
+    @property
+    def id(self):
+        return self._revision.document_name
 
-    def read(self):
-        pass
+    @property
+    def owner(self):
+        return self._revision.user_name
+    
+    def parentof(self, other):
+        return self._revision.parentof(other._revision)
 
-    def write(self, data):
-        pass
+    def parent(self):
+        return self._library.document_for_revision(self._revision.parent())
 
-    @property
-    def cabinet(self):
-        return self._cabinet
+    def has_parent_from(self, other):
+        return self._revision.has_parent_from(other._revision)
+
+    def ancestorof(self, other):
+        return self._revision.ancestorof(other._revision)
+
+
+class Revision(object):
+
+    def __init__(self, lib):
+        self._library = lib
+
+    def parentof(self, other):
+        return False
+
+    def ancestorof(self, other):
+        return False
 
     @property
-    def library(self):
-        return self._cabinet.library
+    def document_name(self):
+        raise ValueError()
 
+    @property
+    def user_name(self):
+        raise ValueError()
 
 #
 # Exception classes
 #
 
-class LibraryException(Exception):
-    
+class LibraryException(Exception):    
     def __init__(self, msg, cause=None):
         Exception.__init__(self, msg)
         self.cause = cause
 
-class CabinetNotFound(LibraryException):
+class UpdateException(LibraryException):
+    pass
+
+class OutdatedException(LibraryException):
     pass
 
+class RevisionNotFound(LibraryException):
+    def __init__(self, rev):
+        LibraryException.__init__(self, "Revision %r not found." % rev)
+
+class RevisionMismatch(LibraryException):
+    def __init__(self, fdi, rev):
+        LibraryException.__init__(self, "No revision %r for document %r." % (rev, fdi))
+    
+class EntryNotFound(LibraryException):
+    def __init__(self, rev, entry, guesses=[]):
+        LibraryException.__init__(self, \
+            u"Entry '%s' at revision %r not found. %s" % (entry, rev, \
+            (u"Posible values:\n" + u',\n'.join(guesses)) if len(guesses) else u'') )
+
+class DocumentAlreadyExists(LibraryException):
+    pass
 
 # import backends to local namespace
-from backend_mercurial import MercurialLibrary
\ No newline at end of file
+
+def open_library(path, proto, *args, **kwargs):
+    if proto == 'hg':
+        import wlrepo.mercurial_backend.library
+        return wlrepo.mercurial_backend.library.MercurialLibrary(path, *args, **kwargs)
+
+    raise NotImplemented()
\ No newline at end of file