[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