Rev 3357: Create a registry of versioned file record adapters. in http://people.ubuntu.com/~robertc/baz2.0/versioned_files

Robert Collins robertc at robertcollins.net
Wed Apr 23 04:53:07 BST 2008


At http://people.ubuntu.com/~robertc/baz2.0/versioned_files

------------------------------------------------------------
revno: 3357
revision-id: robertc at robertcollins.net-20080423035302-8dpsshc599ws75qu
parent: robertc at robertcollins.net-20080423025955-5a3v5l4blb55c15d
committer: Robert Collins <robertc at robertcollins.net>
branch nick: data_stream_revamp
timestamp: Wed 2008-04-23 13:53:02 +1000
message:
  Create a registry of versioned file record adapters.
modified:
  bzrlib/knit.py                 knit.py-20051212171256-f056ac8f0fbe1bd9
  bzrlib/tests/test_versionedfile.py test_versionedfile.py-20060222045249-db45c9ed14a1c2e5
  bzrlib/versionedfile.py        versionedfile.py-20060222045106-5039c71ee3b65490
=== modified file 'bzrlib/knit.py'
--- a/bzrlib/knit.py	2008-04-23 02:44:36 +0000
+++ b/bzrlib/knit.py	2008-04-23 03:53:02 +0000
@@ -145,10 +145,16 @@
 class KnitAdapter(object):
     """Base class for knit record adaption."""
 
-    def __init__(self):
+    def __init__(self, basis_vf):
+        """Create an adapter which accesses full texts from basis_vf.
+        
+        :param basis_vf: A versioned file to access basis texts of deltas from.
+            May be None for adapters that do not need to access basis texts.
+        """
         self._data = _KnitData(None)
         self._annotate_factory = KnitAnnotateFactory()
         self._plain_factory = KnitPlainFactory()
+        self._basis_vf = basis_vf
 
 
 class FTAnnotatedToUnannotated(KnitAdapter):
@@ -189,14 +195,6 @@
 class DeltaAnnotatedToFullText(KnitAdapter):
     """An adapter for deltas from annotated to unannotated."""
 
-    def __init__(self, basis_vf):
-        """Create an adapter which accesses full texts from basis_vf.
-        
-        :param basis_vf: A versioned file to access basis texts of deltas from.
-        """
-        KnitAdapter.__init__(self)
-        self._basis_vf = basis_vf
-
     def get_bytes(self, factory, annotated_compressed_bytes):
         rec, contents = \
             self._data._parse_record_unchecked(annotated_compressed_bytes)
@@ -226,14 +224,6 @@
 class DeltaPlainToFullText(KnitAdapter):
     """An adapter for deltas from annotated to unannotated."""
 
-    def __init__(self, basis_vf):
-        """Create an adapter which accesses full texts from basis_vf.
-        
-        :param basis_vf: A versioned file to access basis texts of deltas from.
-        """
-        KnitAdapter.__init__(self)
-        self._basis_vf = basis_vf
-
     def get_bytes(self, factory, compressed_bytes):
         rec, contents = \
             self._data._parse_record_unchecked(compressed_bytes)

=== modified file 'bzrlib/tests/test_versionedfile.py'
--- a/bzrlib/tests/test_versionedfile.py	2008-04-23 02:59:55 +0000
+++ b/bzrlib/tests/test_versionedfile.py	2008-04-23 03:53:02 +0000
@@ -1365,8 +1365,26 @@
 class TestContentFactoryAdaption(TestCaseWithMemoryTransport):
 
     def test_select_adaptor(self):
-        """Test that selecting an adaptor works."""
-        # self.assertEqual(versionedfile.
+        """Test expected adapters exist."""
+        # One scenario for each lookup combination we expect to use.
+        # Each is source_kind, requested_kind, adapter class
+        scenarios = [
+            ('knit-delta-gz', 'fulltext', _mod_knit.DeltaPlainToFullText),
+            ('knit-ft-gz', 'fulltext', _mod_knit.FTPlainToFullText),
+            ('knit-annotated-delta-gz', 'knit-delta-gz',
+                _mod_knit.DeltaAnnotatedToUnannotated),
+            ('knit-annotated-delta-gz', 'fulltext',
+                _mod_knit.DeltaAnnotatedToFullText),
+            ('knit-annotated-ft-gz', 'knit-ft-gz',
+                _mod_knit.FTAnnotatedToUnannotated),
+            ('knit-annotated-ft-gz', 'fulltext',
+                _mod_knit.FTAnnotatedToFullText),
+            ]
+        for source, requested, klass in scenarios:
+            adapter_factory = versionedfile.adapter_registry.get(
+                (source, requested))
+            adapter = adapter_factory(None)
+            self.assertIsInstance(adapter, klass)
 
     def get_knit(self, annotated=True):
         if annotated:
@@ -1394,8 +1412,8 @@
         # we need a full text, and a delta
         f, parents = get_diamond_vf(self.get_knit(), trailing_eol=False)
         ft_data, delta_data = self.helpGetBytes(f,
-            _mod_knit.FTAnnotatedToUnannotated(),
-            _mod_knit.DeltaAnnotatedToUnannotated())
+            _mod_knit.FTAnnotatedToUnannotated(None),
+            _mod_knit.DeltaAnnotatedToUnannotated(None))
         self.assertEqual(
             'version origin 1 b284f94827db1fa2970d9e2014f080413b547a7e\n'
             'origin\n'
@@ -1411,8 +1429,8 @@
         # we need a full text, and a delta
         f, parents = get_diamond_vf(self.get_knit())
         ft_data, delta_data = self.helpGetBytes(f,
-            _mod_knit.FTAnnotatedToUnannotated(),
-            _mod_knit.DeltaAnnotatedToUnannotated())
+            _mod_knit.FTAnnotatedToUnannotated(None),
+            _mod_knit.DeltaAnnotatedToUnannotated(None))
         self.assertEqual(
             'version origin 1 00e364d235126be43292ab09cb4686cf703ddc17\n'
             'origin\n'
@@ -1431,7 +1449,7 @@
         # must have the base lines requested from it.
         logged_vf = versionedfile.RecordingVersionedFileDecorator(f)
         ft_data, delta_data = self.helpGetBytes(f,
-            _mod_knit.FTAnnotatedToFullText(),
+            _mod_knit.FTAnnotatedToFullText(None),
             _mod_knit.DeltaAnnotatedToFullText(logged_vf))
         self.assertEqual('origin', ft_data)
         self.assertEqual('base\nleft\nright\nmerged', delta_data)
@@ -1445,7 +1463,7 @@
         # must have the base lines requested from it.
         logged_vf = versionedfile.RecordingVersionedFileDecorator(f)
         ft_data, delta_data = self.helpGetBytes(f,
-            _mod_knit.FTAnnotatedToFullText(),
+            _mod_knit.FTAnnotatedToFullText(None),
             _mod_knit.DeltaAnnotatedToFullText(logged_vf))
         self.assertEqual('origin\n', ft_data)
         self.assertEqual('base\nleft\nright\nmerged\n', delta_data)
@@ -1462,7 +1480,7 @@
         # must have the base lines requested from it.
         logged_vf = versionedfile.RecordingVersionedFileDecorator(f)
         ft_data, delta_data = self.helpGetBytes(f,
-            _mod_knit.FTPlainToFullText(),
+            _mod_knit.FTPlainToFullText(None),
             _mod_knit.DeltaPlainToFullText(logged_vf))
         self.assertEqual('origin\n', ft_data)
         self.assertEqual('base\nleft\nright\nmerged\n', delta_data)
@@ -1480,7 +1498,7 @@
         # must have the base lines requested from it.
         logged_vf = versionedfile.RecordingVersionedFileDecorator(f)
         ft_data, delta_data = self.helpGetBytes(f,
-            _mod_knit.FTPlainToFullText(),
+            _mod_knit.FTPlainToFullText(None),
             _mod_knit.DeltaPlainToFullText(logged_vf))
         self.assertEqual('origin', ft_data)
         self.assertEqual('base\nleft\nright\nmerged', delta_data)

=== modified file 'bzrlib/versionedfile.py'
--- a/bzrlib/versionedfile.py	2008-04-18 05:02:45 +0000
+++ b/bzrlib/versionedfile.py	2008-04-23 03:53:02 +0000
@@ -37,10 +37,26 @@
 from cStringIO import StringIO
 
 from bzrlib.inter import InterObject
+from bzrlib.registry import Registry
 from bzrlib.symbol_versioning import *
 from bzrlib.textmerge import TextMerge
 
 
+adapter_registry = Registry()
+adapter_registry.register_lazy(('knit-delta-gz', 'fulltext'), 'bzrlib.knit',
+    'DeltaPlainToFullText')
+adapter_registry.register_lazy(('knit-ft-gz', 'fulltext'), 'bzrlib.knit',
+    'FTPlainToFullText')
+adapter_registry.register_lazy(('knit-annotated-delta-gz', 'knit-delta-gz'),
+    'bzrlib.knit', 'DeltaAnnotatedToUnannotated')
+adapter_registry.register_lazy(('knit-annotated-delta-gz', 'fulltext'),
+    'bzrlib.knit', 'DeltaAnnotatedToFullText')
+adapter_registry.register_lazy(('knit-annotated-ft-gz', 'knit-ft-gz'),
+    'bzrlib.knit', 'FTAnnotatedToUnannotated')
+adapter_registry.register_lazy(('knit-annotated-ft-gz', 'fulltext'),
+    'bzrlib.knit', 'FTAnnotatedToFullText')
+
+
 class ContentFactory(object):
     """Abstract interface for insertion and retrieval from a VersionedFile.
     




More information about the bazaar-commits mailing list