[Repoze-checkins] r1261 - in repoze.virginia/trunk/repoze/virginia: . tests

Chris McDonough chrism at agendaless.com
Wed Jul 9 19:11:59 EDT 2008


Author: Chris McDonough <chrism at agendaless.com>
Date: Wed Jul  9 19:11:58 2008
New Revision: 1261

Log:
Write tests, get rid of medusa filesystem package.


Added:
   repoze.virginia/trunk/repoze/virginia/tests/
   repoze.virginia/trunk/repoze/virginia/tests/__init__.py   (contents, props changed)
   repoze.virginia/trunk/repoze/virginia/tests/test_browser.py   (contents, props changed)
   repoze.virginia/trunk/repoze/virginia/tests/test_models.py   (contents, props changed)
Removed:
   repoze.virginia/trunk/repoze/virginia/filesys.py
Modified:
   repoze.virginia/trunk/repoze/virginia/__init__.py
   repoze.virginia/trunk/repoze/virginia/browser.py
   repoze.virginia/trunk/repoze/virginia/models.py

Modified: repoze.virginia/trunk/repoze/virginia/__init__.py
==============================================================================
--- repoze.virginia/trunk/repoze/virginia/__init__.py	(original)
+++ repoze.virginia/trunk/repoze/virginia/__init__.py	Wed Jul  9 19:11:58 2008
@@ -4,13 +4,10 @@
     if root is None:
         raise ValueError('repoze.virginia requires a root')
     import os
-    from zope.interface import directlyProvides
     from repoze.bfg.router import make_app
-    from repoze.virginia.interfaces import IFilesystem
     from repoze.virginia.models import Directory
-    from repoze.virginia.filesys import os_filesystem
-    fs = os_filesystem(os.path.abspath(os.path.normpath(root)))
-    directlyProvides(fs, IFilesystem)
+    from repoze.virginia.models import Filesystem
+    fs = Filesystem(os.path.abspath(os.path.normpath(root)))
     def get_root(environ):
         return Directory(fs, root)
     import repoze.virginia

Modified: repoze.virginia/trunk/repoze/virginia/browser.py
==============================================================================
--- repoze.virginia/trunk/repoze/virginia/browser.py	(original)
+++ repoze.virginia/trunk/repoze/virginia/browser.py	Wed Jul  9 19:11:58 2008
@@ -23,10 +23,7 @@
         renderer = getMultiAdapter((self.context, self.request),
                                    IViewFactory, name=ext)
         result = renderer()
-        response = Response(result)
-        mt, encoding = mimetypes.guess_type(filename)
-        response.content_type = mt or 'text/plain'
-        return response
+        return result
 
 class DirectoryView(BrowserView):
     defaults = ('index.html', 'index.stx')
@@ -52,12 +49,20 @@
     def __call__(self, *arg, **kw):
         """ Render source as STX.
         """
-        return stx2html(self.context.source)
+        result = stx2html(self.context.source)
+        response = Response(result)
+        response.content_type = 'text/html'
+        return response
 
 class RawView(BrowserView):
     """ Just return the source raw.
     """
     def __call__(self, *arg, **kw):
-        """ Render html.
+        """ Render the result, guess content type.
         """
-        return self.context.source
+        response = Response(self.context.source)
+        dirname, filename = os.path.split(self.context.path)
+        name, ext = os.path.splitext(filename)
+        mt, encoding = mimetypes.guess_type(filename)
+        response.content_type = mt or 'text/plain'
+        return response

Modified: repoze.virginia/trunk/repoze/virginia/models.py
==============================================================================
--- repoze.virginia/trunk/repoze/virginia/models.py	(original)
+++ repoze.virginia/trunk/repoze/virginia/models.py	Wed Jul  9 19:11:58 2008
@@ -4,30 +4,51 @@
 
 from repoze.virginia.interfaces import IFile
 from repoze.virginia.interfaces import IDirectory
+from repoze.virginia.interfaces import IFilesystem
+
+class Filesystem(object):
+    implements(IFilesystem)
+    def __init__(self, root_path):
+        self.root_path = os.path.abspath(os.path.normpath(root_path))
+    join = staticmethod(os.path.join)
+    dirname = staticmethod(os.path.dirname)
+    realpath = staticmethod(os.path.realpath)
+    islink = staticmethod(os.path.islink)
+    isfile = staticmethod(os.path.isfile)
+    isdir = staticmethod(os.path.isdir)
+    def open(self, path):
+        if path.startswith(self.root_path):
+            return open(path, 'rb')
+    def read(self, path):
+        return self.open(path).read()
 
 class Directory(object):
     implements(IDirectory)
     def __init__(self, filesystem, path):
         self.filesystem = filesystem
-        self.path = path
+        self.path = os.path.abspath(os.path.normpath(path))
 
     def __getitem__(self, name):
-        self.filesystem.cwd(self.path)
-        nextpath = os.path.join(self.path, name)
-        if self.filesystem.islink(name):
-            realpath = os.path.realpath(os.path.join(self.path, name))
-            if realpath.startswith(self.path):
-                realdir = os.path.dirname(realpath)
+        nextpath = self.filesystem.join(self.path, name)
+        if self.filesystem.islink(nextpath):
+            realpath = self.filesystem.realpath(nextpath)
+            if  ( realpath.startswith(self.path) and
+                  self.filesystem.isfile(realpath) ):
+                realdir = self.filesystem.dirname(realpath)
                 if len(self.path.split(os.sep)) == len(realdir.split(os.sep)):
-                    # if this symlink is in the same directory as the
-                    # original, treat it as a primitive alias; use the
-                    # link target as the filename so we get the right
-                    # renderer (eg. stx vs html).
-                    ignored, truename = os.path.split(realpath)
-                    return File(self.filesystem, truename)
-        elif self.filesystem.isdir(name):
+                    # if this symlink to a file is in the same
+                    # directory as the original file, treat it as a
+                    # primitive alias; use the link target as the
+                    # filename so we get the right renderer (eg. stx
+                    # vs html).
+                    return File(self.filesystem, realpath)
+                else:
+                    raise KeyError(name)
+            else:
+                raise KeyError(name)
+        elif self.filesystem.isdir(nextpath):
             return Directory(self.filesystem, nextpath)
-        elif self.filesystem.isfile(name):
+        elif self.filesystem.isfile(nextpath):
             return File(self.filesystem, nextpath)
         else:
             raise KeyError(name)
@@ -36,11 +57,9 @@
     implements(IFile)
     def __init__(self, filesystem, path):
         self.filesystem = filesystem
-        self.path = path
+        self.path = os.path.abspath(os.path.normpath(path))
 
     def _source(self):
-        dir, name = os.path.split(self.path)
-        self.filesystem.cwd(dir)
-        return self.filesystem.open(name, 'r').read()
+        return self.filesystem.read(self.path)
         
     source = property(_source)

Added: repoze.virginia/trunk/repoze/virginia/tests/__init__.py
==============================================================================
--- (empty file)
+++ repoze.virginia/trunk/repoze/virginia/tests/__init__.py	Wed Jul  9 19:11:58 2008
@@ -0,0 +1 @@
+# package

Added: repoze.virginia/trunk/repoze/virginia/tests/test_browser.py
==============================================================================
--- (empty file)
+++ repoze.virginia/trunk/repoze/virginia/tests/test_browser.py	Wed Jul  9 19:11:58 2008
@@ -0,0 +1,150 @@
+import unittest
+from zope.component.testing import PlacelessSetup
+
+class FileViewTests(unittest.TestCase, PlacelessSetup):
+    def setUp(self):
+        PlacelessSetup.setUp(self)
+
+    def tearDown(self):
+        PlacelessSetup.tearDown(self)
+
+    def _getTargetClass(self):
+        from repoze.virginia.browser import FileView
+        return FileView
+
+    def _makeOne(self, *arg, **kw):
+        klass = self._getTargetClass()
+        return klass(*arg, **kw)
+
+    def _registerViewFactory(self, app, name, *for_):
+        import zope.component
+        gsm = zope.component.getGlobalSiteManager()
+        from repoze.bfg.interfaces import IViewFactory
+        gsm.registerAdapter(app, for_, IViewFactory, name)
+
+    def test___call__(self):
+        response = DummyResponse()
+        viewfactory = make_view_factory(response)
+        context = DummyFile('/foo/bar.ext')
+        self._registerViewFactory(viewfactory, '.ext', None, None)
+        view = self._makeOne(context, None)
+        self.assertEqual(view(), response)
+
+class DirectoryViewTests(unittest.TestCase, PlacelessSetup):
+    def setUp(self):
+        PlacelessSetup.setUp(self)
+
+    def tearDown(self):
+        PlacelessSetup.tearDown(self)
+
+    def _getTargetClass(self):
+        from repoze.virginia.browser import DirectoryView
+        return DirectoryView
+
+    def _makeOne(self, *arg, **kw):
+        klass = self._getTargetClass()
+        return klass(*arg, **kw)
+
+    def _registerViewFactory(self, app, name, *for_):
+        import zope.component
+        gsm = zope.component.getGlobalSiteManager()
+        from repoze.bfg.interfaces import IViewFactory
+        gsm.registerAdapter(app, for_, IViewFactory, name)
+
+    def test___call___index_html(self):
+        context = DummyDirectory('/',{'index.html':DummyFile('/index.html')})
+        response = DummyResponse()
+        viewfactory = make_view_factory(response)
+        self._registerViewFactory(viewfactory, '.html', None, None)
+        view = self._makeOne(context, None)
+        self.assertEqual(view(), response)
+
+    def test___call___index_stx(self):
+        context = DummyDirectory('/',{'index.stx':DummyFile('/index.stx')})
+        response = DummyResponse()
+        viewfactory = make_view_factory(response)
+        self._registerViewFactory(viewfactory, '.stx', None, None)
+        view = self._makeOne(context, None)
+        self.assertEqual(view(), response)
+
+    def test___call___noindex(self):
+        context = DummyDirectory('/',{})
+        view = self._makeOne(context, None)
+        response = view()
+        self.assertEqual(response.app_iter, ['No default view for /'])
+
+class StructuredTextViewTests(unittest.TestCase):
+    def _getTargetClass(self):
+        from repoze.virginia.browser import StructuredTextView
+        return StructuredTextView
+
+    def _makeOne(self, *arg, **kw):
+        klass = self._getTargetClass()
+        return klass(*arg, **kw)
+
+    def test___call__(self):
+        context = DummyFile('/foo/bar.ext')
+        context.source = 'abcdef'
+        view = self._makeOne(context, None)
+        response = view()
+        self.assertEqual(response.app_iter,
+                         ['<html>\n<body>\n<p>abcdef</p>\n</body>\n</html>\n']
+                         )
+        headers = response.headerlist
+        self.assertEqual(headers[0],
+                         ('Content-Length', '44')
+                         )
+        self.assertEqual(headers[1],
+                         ('content-type', 'text/html; charset=UTF-8')
+                         )
+
+class RawViewTests(unittest.TestCase):
+    def _getTargetClass(self):
+        from repoze.virginia.browser import RawView
+        return RawView
+
+    def _makeOne(self, *arg, **kw):
+        klass = self._getTargetClass()
+        return klass(*arg, **kw)
+
+    def test___call__(self):
+        context = DummyFile('/foo/bar.txt')
+        context.source = 'abcdef'
+        view = self._makeOne(context, None)
+        response = view()
+        self.assertEqual(response.app_iter, ['abcdef'])
+        headers = response.headerlist
+        self.assertEqual(headers[0],
+                         ('Content-Length', '6')
+                         )
+        self.assertEqual(headers[1],
+                         ('content-type', 'text/plain; charset=UTF-8')
+                         )
+        
+class DummyDirectory:
+    def __init__(self, path, subs):
+        self.path = path
+        self.subs = subs
+
+    def __getitem__(self, name):
+        return self.subs[name]
+
+class DummyFile:
+    source = None
+    def __init__(self, path):
+        self.path = path
+    
+class DummyResponse:
+    status = '200 OK'
+    headerlist = ()
+    app_iter = ()
+
+def make_view_factory(response):
+    class DummyViewFactory:
+        def __init__(self, context, request):
+            self.context = context
+            self.request = request
+
+        def __call__(self):
+            return response
+    return DummyViewFactory

Added: repoze.virginia/trunk/repoze/virginia/tests/test_models.py
==============================================================================
--- (empty file)
+++ repoze.virginia/trunk/repoze/virginia/tests/test_models.py	Wed Jul  9 19:11:58 2008
@@ -0,0 +1,132 @@
+import unittest
+
+class FilesystemTests(unittest.TestCase):
+    def _getTargetClass(self):
+        from repoze.virginia.models import Filesystem
+        return Filesystem
+
+    def _makeOne(self, *arg, **kw):
+        klass = self._getTargetClass()
+        return klass(*arg, **kw)
+
+    def test_open_allows(self):
+        import os
+        import tempfile
+        f = tempfile.NamedTemporaryFile()
+        f.write('hello')
+        f.flush()
+        fs = self._makeOne(os.path.abspath(os.path.dirname(f.name)))
+        self.assertEqual(fs.open(f.name).read(), 'hello')
+        f.close()
+
+    def test_open_denies(self):
+        import os
+        import tempfile
+        tempdir = tempfile.tempdir
+        fs = self._makeOne(tempdir)
+        here = os.path.abspath(__file__)
+        self.assertEqual(fs.open(here), None)
+
+    def test_read(self):
+        import os
+        import tempfile
+        f = tempfile.NamedTemporaryFile()
+        f.write('hello')
+        f.flush()
+        fs = self._makeOne(os.path.dirname(f.name))
+        self.assertEqual(fs.open(f.name).read(), 'hello')
+        f.close()
+
+class DirectoryTests(unittest.TestCase):
+    def _getTargetClass(self):
+        from repoze.virginia.models import Directory
+        return Directory
+
+    def _makeOne(self, *arg, **kw):
+        klass = self._getTargetClass()
+        return klass(*arg, **kw)
+    
+    def test_getitem_islink_tofile_samedir(self):
+        links = {'/foo/bar':'/foo/baz'}
+        files= ['/foo/baz']
+        fs = DummyFilesystem(links, files)
+        directory = self._makeOne(fs, '/foo')
+        result = directory['bar']
+        from repoze.virginia.models import File
+        self.failUnless(isinstance(result, File))
+        self.assertEqual(result.path, '/foo/baz')
+
+    def test_getitem_islink_tofile_diffdir(self):
+        links = {'/foo/bar':'/buz/baz'}
+        fs = DummyFilesystem(links)
+        directory = self._makeOne(fs, '/foo')
+        self.assertRaises(KeyError, directory.__getitem__, 'bar')
+
+    def test_getitem_islink_tofile_diffdir(self):
+        links = {'/foo/bar':'/buz/baz'}
+        fs = DummyFilesystem(links)
+        directory = self._makeOne(fs, '/foo')
+        self.assertRaises(KeyError, directory.__getitem__, 'bar')
+
+    def test_getitem_isdir(self):
+        fs = DummyFilesystem(dirs=['/foo/dir'])
+        directory = self._makeOne(fs, '/foo')
+        result = directory['dir']
+        from repoze.virginia.models import Directory
+        self.failUnless(isinstance(result, Directory))
+        self.assertEqual(result.path, '/foo/dir')
+
+    def test_getitem_isfile(self):
+        fs = DummyFilesystem(files=['/foo/file'])
+        directory = self._makeOne(fs, '/foo')
+        result = directory['file']
+        from repoze.virginia.models import File
+        self.failUnless(isinstance(result, File))
+        self.assertEqual(result.path, '/foo/file')
+
+class FileTests(unittest.TestCase):
+    def _getTargetClass(self):
+        from repoze.virginia.models import File
+        return File
+
+    def _makeOne(self, *arg, **kw):
+        klass = self._getTargetClass()
+        return klass(*arg, **kw)
+
+    def test_source(self):
+        import tempfile
+        named = tempfile.NamedTemporaryFile()
+        named.write('silly')
+        named.flush()
+        name = named.name
+        fs = DummyFilesystem()
+        f = self._makeOne(fs, name)
+        self.assertEqual(f.source, 'silly')
+        named.close()
+    
+class DummyFilesystem:
+    import os
+    dirname = staticmethod(os.path.dirname)
+    join = staticmethod(os.path.join)
+    def __init__(self, links=None, files=(), dirs=()):
+        if links is None:
+            links = {}
+        self.links = links
+        self.files = files
+        self.dirs = dirs
+
+    def islink(self, path):
+        return path in self.links.keys()
+
+    def isdir(self, path):
+        return path in self.dirs
+
+    def isfile(self, path):
+        return path in self.files
+    
+    def realpath(self, path):
+        return self.links[path]
+
+    def read(self, path):
+        return open(path, 'rb').read()
+    


More information about the Repoze-checkins mailing list