[Checkins] SVN: megrok.quarry/ initial import

Kevin Smith kevin at mcweekly.com
Wed May 2 02:54:38 EDT 2007


Log message for revision 74987:
  initial import

Changed:
  A   megrok.quarry/
  A   megrok.quarry/.installed.cfg
  A   megrok.quarry/README.txt
  A   megrok.quarry/bootstrap/
  A   megrok.quarry/bootstrap/bootstrap.py
  A   megrok.quarry/bootstrap/bootstrap.pyo
  A   megrok.quarry/buildout.cfg
  A   megrok.quarry/setup.py
  A   megrok.quarry/src/
  A   megrok.quarry/src/megrok/
  A   megrok.quarry/src/megrok/__init__.py
  A   megrok.quarry/src/megrok/__init__.pyc
  A   megrok.quarry/src/megrok/quarry/
  A   megrok.quarry/src/megrok/quarry/README.txt
  A   megrok.quarry/src/megrok/quarry/__init__.py
  A   megrok.quarry/src/megrok/quarry/__init__.pyc
  A   megrok.quarry/src/megrok/quarry/components.py
  A   megrok.quarry/src/megrok/quarry/components.pyc
  A   megrok.quarry/src/megrok/quarry/configure.zcml
  A   megrok.quarry/src/megrok/quarry/directive.py
  A   megrok.quarry/src/megrok/quarry/directive.pyc
  A   megrok.quarry/src/megrok/quarry/ftests/
  A   megrok.quarry/src/megrok/quarry/ftests/README.txt
  A   megrok.quarry/src/megrok/quarry/ftests/__init__.py
  A   megrok.quarry/src/megrok/quarry/ftests/__init__.pyc
  A   megrok.quarry/src/megrok/quarry/ftests/test_grok_functional.py
  A   megrok.quarry/src/megrok/quarry/ftests/test_grok_functional.pyc
  A   megrok.quarry/src/megrok/quarry/ftests/view/
  A   megrok.quarry/src/megrok/quarry/ftests/view/__init__.py
  A   megrok.quarry/src/megrok/quarry/ftests/view/layer.py
  A   megrok.quarry/src/megrok/quarry/meta.py
  A   megrok.quarry/src/megrok/quarry/meta.pyc
  A   megrok.quarry/src/megrok/quarry/meta.zcml
  A   megrok.quarry/src/megrok.quarry.egg-info/
  A   megrok.quarry/src/megrok.quarry.egg-info/PKG-INFO
  A   megrok.quarry/src/megrok.quarry.egg-info/SOURCES.txt
  A   megrok.quarry/src/megrok.quarry.egg-info/dependency_links.txt
  A   megrok.quarry/src/megrok.quarry.egg-info/entry_points.txt
  A   megrok.quarry/src/megrok.quarry.egg-info/not-zip-safe
  A   megrok.quarry/src/megrok.quarry.egg-info/paster_plugins.txt
  A   megrok.quarry/src/megrok.quarry.egg-info/requires.txt
  A   megrok.quarry/src/megrok.quarry.egg-info/top_level.txt

-=-
Added: megrok.quarry/.installed.cfg
===================================================================
--- megrok.quarry/.installed.cfg	2007-05-02 06:41:09 UTC (rev 74986)
+++ megrok.quarry/.installed.cfg	2007-05-02 06:54:36 UTC (rev 74987)
@@ -0,0 +1,86 @@
+[buildout]
+installed_develop_eggs = /home/notroot/now/now/megrok.quarry/develop-eggs/megrok.quarry.egg-link
+	/home/notroot/now/now/megrok.quarry/develop-eggs/grok.egg-link
+parts = test data instance
+
+[test]
+__buildout_installed__ = /home/notroot/now/now/megrok.quarry/bin/test
+__buildout_signature__ = zc.recipe.testrunner-1.0.0b7-py2.4.egg zc.recipe.egg-1.0.0b6-py2.4.egg setuptools-0.6c5-py2.4.egg zope.testing-3.4-py2.4.egg zc.buildout-1.0.0b23-py2.4.egg zc.buildout-1.0.0b23-py2.4.egg
+_b = /home/notroot/now/now/megrok.quarry/bin
+_d = /home/notroot/now/now/megrok.quarry/develop-eggs
+_e = /root/eggs/
+bin-directory = /home/notroot/now/now/megrok.quarry/bin
+defaults = ['--tests-pattern', '^f?tests$',
+	'-v'
+	]
+develop-eggs-directory = /home/notroot/now/now/megrok.quarry/develop-eggs
+eggs = megrok.quarry
+	grok
+eggs-directory = /root/eggs/
+executable = /usr/bin/python
+extra-paths = /root/zope3/src
+recipe = zc.recipe.testrunner
+script = /home/notroot/now/now/megrok.quarry/bin/test
+working-directory = parts/instance
+
+[data]
+__buildout_installed__ = 
+__buildout_signature__ = zc.recipe.filestorage-1.0a5-py2.4.egg setuptools-0.6c5-py2.4.egg zope.testing-3.4-py2.4.egg zc.buildout-1.0.0b23-py2.4.egg
+path = /home/notroot/now/now/megrok.quarry/parts/data/Data.fs
+recipe = zc.recipe.filestorage
+zconfig = <zodb>
+	%(__buildout_space__)s%(__buildout_space__)s<filestorage>
+	%(__buildout_space__)s%(__buildout_space__)s%(__buildout_space__)s%(__buildout_space__)spath /home/notroot/now/now/megrok.quarry/parts/data/Data.fs
+	%(__buildout_space__)s%(__buildout_space__)s</filestorage>
+	</zodb>%(__buildout_space_n__)s
+
+[instance]
+__buildout_installed__ = /home/notroot/now/now/megrok.quarry/parts/instance
+__buildout_signature__ = zc.recipe.zope3instance-1.0.0a1-py2.4.egg zc.recipe.egg-1.0.0b6-py2.4.egg setuptools-0.6c5-py2.4.egg zope.testing-3.4-py2.4.egg zc.buildout-1.0.0b23-py2.4.egg zc.buildout-1.0.0b23-py2.4.egg
+_b = /home/notroot/now/now/megrok.quarry/bin
+_d = /home/notroot/now/now/megrok.quarry/develop-eggs
+_e = /root/eggs/
+bin-directory = /home/notroot/now/now/megrok.quarry/bin
+database = data
+database-config = <zodb>
+	%(__buildout_space__)s%(__buildout_space__)s<filestorage>
+	%(__buildout_space__)s%(__buildout_space__)s%(__buildout_space__)s%(__buildout_space__)spath /home/notroot/now/now/megrok.quarry/parts/data/Data.fs
+	%(__buildout_space__)s%(__buildout_space__)s</filestorage>
+	</zodb>%(__buildout_space_n__)s
+develop-eggs-directory = /home/notroot/now/now/megrok.quarry/develop-eggs
+eggs = setuptools
+	grok
+	megrok.quarry
+eggs-directory = /root/eggs/
+executable = /usr/bin/python
+location = /home/notroot/now/now/megrok.quarry/parts/instance
+recipe = zc.recipe.zope3instance
+scripts = 
+user = ksmith:123
+zcml = zope.annotation
+	zope.copypastemove
+	zope.formlib
+	zope.i18n-meta
+	zope.i18n.locales
+	zope.publisher
+	zope.security-meta
+	zope.size
+	zope.traversing
+	zope.traversing.browser
+	zope.app
+	zope.app-meta
+	zope.app.securitypolicy
+	zope.app.securitypolicy-meta
+	zope.app.authentication
+	zope.app.catalog
+	zope.app.intid
+	zope.app.keyreference
+	zope.app.twisted
+	megrok.quarry-meta
+	grok
+	grok-meta
+zope3 = zope3
+zope3-directory = /root/zope3
+
+[buildout]
+parts = data instance test

Added: megrok.quarry/README.txt
===================================================================
--- megrok.quarry/README.txt	2007-05-02 06:41:09 UTC (rev 74986)
+++ megrok.quarry/README.txt	2007-05-02 06:54:36 UTC (rev 74987)
@@ -0,0 +1,201 @@
+MEGROK.QUARRY
+=============
+
+author :: Kevin M. Smith
+
+Grok is an rapid application development framework built on top of the enterprise 
+class Zope3's component architecture. http://grok.zope.org
+
+As of 0.9dev, Grok has no way of associating different views with different skins.
+MEGROK.QUARRY is an implementation of skins, layers and template re-use. It is
+useable today and based on discussions from the mailing list. It is hoped these 
+new directives and grokkers will be considered for inclusion in the core one day.
+
+Change Log
+----------
+
+* 0.1 initial checkin
+
+Current Enhancements
+--------------------
+
+* quarry.template directive enhancement
+
+* quarry.View (a skin-aware version of grok.View)
+
+* quarry.layer directive
+
+* quarry.Layer grokker
+
+* quarry.Skin grokker
+
+* quarry.ViewletManager, quarry.Viewlet (based Lennart Regebro's megrok.viewlet)
+
+* quarry.viewletmanager directive
+
+
+Template Sharing and Reuse
+--------------------------
+
+Currently only inline pagetemplates are accessible via grok.template.
+
+	  >>> class Painting(grok.View):
+	  ...     grok.template('cavepainting')
+
+	  >>> cavepainting = grok.PageTemplate("""
+	  ... <html><body><h1>GROK PAINT MAMMOTH!</h1></body</html>
+	  ... """)
+
+This works fine, but you can only access templates located in the same 
+module, which limits template re-use.
+
+Using quarry.template, any template from any module may be accessed. Note,
+grok.View needs to be replaced with quarry.View, since grok.View has no notion
+of quarry.template.
+
+	   >>> class Painting(quarry.View):
+	   ...    quarry.template('myproject.shared.cavepainting')
+
+myproject/shared.py
+
+	  >>> cavepainting = grok.PageTemplate("""
+	  ... <html><body><h1>GROK PAINT MAMMOTH!</h1></body</html>
+	  ... """)
+
+Also works with grok.PageTemplateFile
+
+	  >>> cavepainting = grok.PageTemplateFile(os.path.join('shared', 
+	  ...                             'cavepainting.pt'))
+
+And plain strings
+   
+	  >>> cavepainting = """
+	  ... <html><body><h1>GROK PAINT MAMMOTH!</h1></body</html>
+	  ... """
+
+Even docstrings
+
+	 >>> class Painting(quarry.View):
+	 ...     """<html><body><h1>GROK PAINT MAMMOTH!</h1></body</html>
+	 ...     """
+	 ...     quarry.template('myproject.app.Painting.__doc__')
+
+
+Skins, layers and grok, oh my!
+------------------------------
+
+As mentioned, Grok 0.9dev has no notion of skins or layers. The quarry.View
+grokker recognizes the quarry.layer directive. This directive is both a 
+module level and class level driective.
+	
+First let us define an admin skin, and a public skin.
+
+	>>> class AdminLayer(quarry.Layer, IDebugLayer):
+	...     pass
+
+	>>> class Admin(quarry.Skin):
+	...     grok.name('admin') # default, accessible as ++skin++admin
+	...     grok.layer(AdminLayer)
+
+	>>> class PublicLayer(quarry.Layer):
+	...     pass
+
+	>>> class Public(quarry.Skin):
+	...    grok.name('public') # default name, accessible as ++skin++public
+	...    grok.layer(PublicLayer) # must pass interface     
+
+In our app, we associate layers to views as follows
+
+       >>> from skin import AdminLayer
+
+       >>> class AdminPanel(quarry.View):
+       ...     grok.layer(AdminLayer)
+
+Or we can associate layers at a module level
+
+      >>> grok.layer(PublicLayer)
+
+      >>> class MyPublicView(quarry.View):
+      ...     # defaults to PublicLayer
+
+      
+Viewlets
+--------
+
+Since I'd been hoping Grok would be template neutral to better compete with
+the other frameworks, I've been very resistant to Zope Page Templates. I've
+even come up with multiple scenarios to avoid using macros.  But this is all
+nice and good but once you get hooked on ZPT's power, it's hard to deal with
+other templating options.
+
+Both quarry.ViewletManager and quarry.Viewlet are base on Lennart Regebro's
+megrok.viewlet. 
+
+In this version both quarry.Viewlet and quarry.ViewletManager have been 
+fashioned to be more grok.View-like. This means you can use quarry.template,
+view.url(), static, and any  other methods you might find on a regular view.
+
+Also the quarry.viewletmanager directive has been added to associate viewlet
+with viewletmanager.
+
+     >>> from megrok import quarry
+
+     >>> class MyView(quarry.View):
+     ...    """<html metal:use-macro="context/@@public/page">
+     ...       <body>
+     ...       <metal:block fill-slot="pagecontent">
+     ...       <span tal:replace="structure provider:body" />
+     ...       </metal:block>
+     ...       </body></html>
+     ...    """
+     ...    quarry.template('myproject.app.MyView.__doc__')
+
+     >>> class MenuManager(quarry.ViewletManager):
+     ...    grok.context(MyView) # associate viewletmanager with a view
+     ...    grok.name('body') #fill tal-namespace 'provide:body'
+     
+     >>> class Menu10(quarry.Viewlet):
+     ...    quarry.viewletmanager(MenuManager)
+     ...    def render(self):
+     ...        return "Fish Tacos"
+
+     >>> class Menu20(quarry.Viewlet):
+     ...    quarry.viewletmanager(MenuManager)	
+     ...    def render(self)l
+     ...        return "Buffalo Wings"
+
+     >>> class Menu30(quarry.Viewlet):
+     ...    """<i>Side of Blue Cheese </i>"""
+     ...    quarry.viewletmanager(MenuManager)
+     ...    quary.template('myproject.app.Menu30.__doc__')
+
+The quarry.ViewletManager automatically sorts by viewlet class name. So
+Menu10 appears first and Menu30 appears last.
+
+
+install
+-------
+
+* checkout via subversion
+* add megrok.quarry-meta to zcml of buildout instance
+
+
+Todo
+----
+
+* better documentation
+* quarry.TALNamespace
+* tests, tests, tests, currently they are intertwined in a seperate project
+* currently grok.Layer inherits from IDefaultBrowserLayer, don't do this
+
+
+Thank You
+---------
+
+The entire Grok team and Zope3 communities for making web programming
+fun again.
+
+
+
+
+

Added: megrok.quarry/bootstrap/bootstrap.py
===================================================================
--- megrok.quarry/bootstrap/bootstrap.py	2007-05-02 06:41:09 UTC (rev 74986)
+++ megrok.quarry/bootstrap/bootstrap.py	2007-05-02 06:54:36 UTC (rev 74987)
@@ -0,0 +1,52 @@
+##############################################################################
+#
+# Copyright (c) 2006 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Bootstrap a buildout-based project
+
+Simply run this script in a directory containing a buildout.cfg.
+The script accepts buildout command-line options, so you can
+use the -c option to specify an alternate configuration file.
+
+$Id: bootstrap.py 69908 2006-08-31 21:53:00Z jim $
+"""
+
+import os, shutil, sys, tempfile, urllib2
+
+tmpeggs = tempfile.mkdtemp()
+
+ez = {}
+exec urllib2.urlopen('http://peak.telecommunity.com/dist/ez_setup.py'
+                     ).read() in ez
+ez['use_setuptools'](to_dir=tmpeggs, download_delay=0)
+
+import pkg_resources
+
+cmd = 'from setuptools.command.easy_install import main; main()'
+if sys.platform == 'win32':
+    cmd = '"%s"' % cmd # work around spawn lamosity on windows
+
+ws = pkg_resources.working_set
+assert os.spawnle(
+    os.P_WAIT, sys.executable, sys.executable,
+    '-c', cmd, '-mqNxd', tmpeggs, 'zc.buildout',
+    dict(os.environ,
+         PYTHONPATH=
+         ws.find(pkg_resources.Requirement.parse('setuptools')).location
+         ),
+    ) == 0
+
+ws.add_entry(tmpeggs)
+ws.require('zc.buildout')
+import zc.buildout.buildout
+zc.buildout.buildout.main(sys.argv[1:] + ['bootstrap'])
+shutil.rmtree(tmpeggs)

Added: megrok.quarry/bootstrap/bootstrap.pyo
===================================================================
(Binary files differ)


Property changes on: megrok.quarry/bootstrap/bootstrap.pyo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: megrok.quarry/buildout.cfg
===================================================================
--- megrok.quarry/buildout.cfg	2007-05-02 06:41:09 UTC (rev 74986)
+++ megrok.quarry/buildout.cfg	2007-05-02 06:54:36 UTC (rev 74987)
@@ -0,0 +1,51 @@
+[test]
+working-directory = parts/instance
+eggs = megrok.quarry
+	grok
+recipe = zc.recipe.testrunner
+extra-paths = /root/zope3/src
+defaults = ['--tests-pattern', '^f?tests$',
+	'-v'
+	]
+
+[data]
+recipe = zc.recipe.filestorage
+
+[zope3]
+location = /root/zope3
+
+[buildout]
+parts = data instance test
+develop = .
+          ../grok
+
+[instance]
+database = data
+eggs = setuptools
+	grok
+	megrok.quarry
+recipe = zc.recipe.zope3instance
+user = ksmith:123
+zcml = zope.annotation
+	zope.copypastemove
+	zope.formlib
+	zope.i18n-meta
+	zope.i18n.locales
+	zope.publisher
+	zope.security-meta
+	zope.size
+	zope.traversing
+	zope.traversing.browser
+	zope.app
+	zope.app-meta
+	zope.app.securitypolicy
+	zope.app.securitypolicy-meta
+	zope.app.authentication
+	zope.app.catalog
+	zope.app.intid
+	zope.app.keyreference
+	zope.app.twisted
+	megrok.quarry-meta
+	grok
+	grok-meta
+

Added: megrok.quarry/setup.py
===================================================================
--- megrok.quarry/setup.py	2007-05-02 06:41:09 UTC (rev 74986)
+++ megrok.quarry/setup.py	2007-05-02 06:54:36 UTC (rev 74987)
@@ -0,0 +1,28 @@
+from setuptools import setup, find_packages
+
+version = '0.1'
+
+setup(name='megrok.quarry',
+      version=version,
+      description="Skins and layers for Grok.",
+      long_description="""\
+""",
+      # Get strings from http://www.python.org/pypi?%3Aaction=list_classifiers
+      classifiers=[], 
+      keywords="",
+      author="Kevin Smith",
+      author_email="kevin at mcweekly.com",
+      url="",
+      license="ZPL",
+      package_dir={'': 'src'},
+      packages=find_packages('src'),
+      include_package_data=True,
+      zip_safe=False,
+      install_requires=['setuptools',
+                        'grok',
+                        # -*- Extra requirements: -*-
+                        ],
+      entry_points="""
+      # -*- Entry points: -*-
+      """,
+      )

Added: megrok.quarry/src/megrok/__init__.py
===================================================================
--- megrok.quarry/src/megrok/__init__.py	2007-05-02 06:41:09 UTC (rev 74986)
+++ megrok.quarry/src/megrok/__init__.py	2007-05-02 06:54:36 UTC (rev 74987)
@@ -0,0 +1,6 @@
+# namespace package boilerplate
+try:
+    __import__('pkg_resources').declare_namespace(__name__)
+except ImportError, e:
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__)

Added: megrok.quarry/src/megrok/__init__.pyc
===================================================================
(Binary files differ)


Property changes on: megrok.quarry/src/megrok/__init__.pyc
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: megrok.quarry/src/megrok/quarry/README.txt
===================================================================
--- megrok.quarry/src/megrok/quarry/README.txt	2007-05-02 06:41:09 UTC (rev 74986)
+++ megrok.quarry/src/megrok/quarry/README.txt	2007-05-02 06:54:36 UTC (rev 74987)
@@ -0,0 +1,8 @@
+Put your application code in this Python package.
+
+app_templates
+  Place Page Templates (file extension '.pt') in this directory.  They
+  will automatically be associated as views with the model in app.py.
+
+static
+  Place static resources such as CSS, JS, images, etc. in here.

Added: megrok.quarry/src/megrok/quarry/__init__.py
===================================================================
--- megrok.quarry/src/megrok/quarry/__init__.py	2007-05-02 06:41:09 UTC (rev 74986)
+++ megrok.quarry/src/megrok/quarry/__init__.py	2007-05-02 06:54:36 UTC (rev 74987)
@@ -0,0 +1,5 @@
+# this directory is a package
+
+
+from directive import layer, template
+from components import Layer, Skin, View

Added: megrok.quarry/src/megrok/quarry/__init__.pyc
===================================================================
(Binary files differ)


Property changes on: megrok.quarry/src/megrok/quarry/__init__.pyc
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: megrok.quarry/src/megrok/quarry/components.py
===================================================================
--- megrok.quarry/src/megrok/quarry/components.py	2007-05-02 06:41:09 UTC (rev 74986)
+++ megrok.quarry/src/megrok/quarry/components.py	2007-05-02 06:54:36 UTC (rev 74987)
@@ -0,0 +1,214 @@
+from zope import interface, component
+from zope.publisher.browser import BrowserPage
+from zope.publisher.interfaces.browser import IDefaultBrowserLayer
+from zope.publisher.publish import mapply
+from grok import util, interfaces, formlib
+
+
+class Layer(IDefaultBrowserLayer):
+    pass
+
+
+class Skin(object):
+    pass
+
+
+class View(BrowserPage):
+    interface.implements(interfaces.IGrokView)
+
+    def __init__(self, context, request):
+        super(View, self).__init__(context, request)
+        self.static = component.queryAdapter(
+            self.request,
+            interface.Interface,
+            name=self.module_info.package_dotted_name
+            )
+        
+    @property
+    def response(self):
+        return self.request.response
+
+    def __call__(self):
+        mapply(self.update, (), self.request)
+        if self.request.response.getStatus() in (302, 303):
+            # A redirect was triggered somewhere in update().  Don't
+            # continue rendering the template or doing anything else.
+            return
+        
+        template = getattr(self, 'template', None)
+        if template is not None:
+            return self._render_template()
+        return mapply(self.render, (), self.request)
+    
+    def _render_template(self):
+        namespace = self.template.pt_getContext()
+        namespace['request'] = self.request
+        namespace['view'] = self
+        namespace['context'] = self.context
+        # XXX need to check whether we really want to put None here if missing
+        namespace['static'] = self.static
+        return self.template.pt_render(namespace)
+    
+    def __getitem__(self, key):
+        # XXX give nice error message if template is None
+        return self.template.macros[key]
+    
+    def url(self, obj=None, name=None):
+        # if the first argument is a string, that's the name. There should
+        # be no second argument
+        if isinstance(obj, basestring):
+            if name is not None:
+                raise TypeError(
+                    'url() takes either obj argument, obj, string arguments, '
+                    'or string argument')
+            name = obj
+            obj = None
+
+        if name is None and obj is None:
+            # create URL to view itself
+            obj = self
+        elif name is not None and obj is None:
+            # create URL to view on context
+            obj = self.context
+        return util.url(self.request, obj, name)
+        
+    def redirect(self, url):
+        return self.request.response.redirect(url)
+        
+    def update(self):
+        pass
+    
+
+# class ViewletManager(ViewletManagerBase):
+#     """  A grok.View-like ViewletManager
+#     """
+    
+#     template = None
+
+#     def __init__(self, context, request, view):
+#         super(ViewletManager, self).__init__(context, request, view)
+#         self.static = component.queryAdapter(
+#             self.request,
+#             interface.Interface,
+#             name=self.module_info.package_dotted_name
+#             )
+        
+#     def render(self):
+#         """See zope.contentprovider.interfaces.IContentProvider"""
+#         # Now render the view
+#         if self.template:
+#             #return self.template(viewlets=self.viewlets)
+#             return self._render_template()
+#         else:
+#             return u'\n'.join([viewlet.render() for viewlet in self.viewlets])
+                                                
+#     @property
+#     def response(self):
+#         return self.request.response
+
+#     def _render_template(self):
+#         namespace = self.template.pt_getContext()
+#         namespace['request'] = self.request
+#         namespace['view'] = self
+#         namespace['viewlets'] = self.viewlets
+#         namespace['static'] = self.static
+#         namespace['context'] = self.context
+#         # XXX need to check whether we really want to put None here if missing
+#         return self.template.pt_render(namespace)
+
+#     def sort(self, viewlets):
+#         # sort by viewlet class name as default
+#         return sorted(viewlets, lambda x,y: cmp(x[0], y[0]))
+
+#     def url(self, obj=None, name=None):
+#         # if the first argument is a string, that's the name. There should
+#         # be no second argument
+#         if isinstance(obj, basestring):
+#             if name is not None:
+#                 raise TypeError(
+#                     'url() takes either obj argument, obj, string arguments, '
+#                     'or string argument')
+#             name = obj
+#             obj = None
+
+#         if name is None and obj is None:
+#             # create URL to view itself
+#             obj = self
+#         elif name is not None and obj is None:
+#             # create URL to view on context
+#             obj = self.context
+#         return util.url(self.request, obj, name)
+
+#     def redirect(self, url):
+#         return self.request.response.redirect(url)
+
+
+# class Viewlet(ViewletBase):
+#     """ A grok.View-like viewlet
+#     """
+
+
+#     def __init__(self, context, request, view, manager):
+#         super(Viewlet, self).__init__(context, request, view, manager)
+#         self.static = component.queryAdapter(
+#             self.request,
+#             interface.Interface,
+#             name=self.module_info.package_dotted_name
+#             )
+
+
+#     @property
+#     def response(self):
+#         return self.request.response
+
+
+#     def render(self):
+#         mapply(self.update, (), self.request)
+#         if self.request.response.getStatus() in (302, 303):
+#             # A redirect was triggered somewhere in update().  Don't
+#             # continue rendering the template or doing anything else.
+#             return
+
+#         template = getattr(self, 'template', None)
+#         if template is not None:
+#             return self._render_template()
+
+#     def _render_template(self):
+#         namespace = self.template.pt_getContext()
+#         namespace['request'] = self.request
+#         namespace['view'] = self
+#         namespace['context'] = self.context
+#         # XXX need to check whether we really want to put None here if missing
+#         namespace['static'] = self.static
+#         return self.template.pt_render(namespace)
+
+#     def __getitem__(self, key):
+#         # XXX give nice error message if template is None
+#         return self.template.macros[key]
+
+#     def url(self, obj=None, name=None):
+#         # if the first argument is a string, that's the name. There should
+#         # be no second argument
+#         if isinstance(obj, basestring):
+#             if name is not None:
+#                 raise TypeError(
+#                     'url() takes either obj argument, obj, string arguments, '
+#                     'or string argument')
+#             name = obj
+#             obj = None
+
+#         if name is None and obj is None:
+#             # create URL to view itself
+#             obj = self
+#         elif name is not None and obj is None:
+#             # create URL to view on context
+#             obj = self.context
+#         return util.url(self.request, obj, name)
+
+#     def redirect(self, url):
+#         return self.request.response.redirect(url)
+
+#     def update(self):
+#         pass
+
+

Added: megrok.quarry/src/megrok/quarry/components.pyc
===================================================================
(Binary files differ)


Property changes on: megrok.quarry/src/megrok/quarry/components.pyc
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: megrok.quarry/src/megrok/quarry/configure.zcml
===================================================================
--- megrok.quarry/src/megrok/quarry/configure.zcml	2007-05-02 06:41:09 UTC (rev 74986)
+++ megrok.quarry/src/megrok/quarry/configure.zcml	2007-05-02 06:54:36 UTC (rev 74987)
@@ -0,0 +1,5 @@
+<configure>
+
+<!--<grok package="" xmlns="http://namespaces.zope.org/grok" />-->
+
+</configure>
\ No newline at end of file

Added: megrok.quarry/src/megrok/quarry/directive.py
===================================================================
--- megrok.quarry/src/megrok/quarry/directive.py	2007-05-02 06:41:09 UTC (rev 74986)
+++ megrok.quarry/src/megrok/quarry/directive.py	2007-05-02 06:54:36 UTC (rev 74987)
@@ -0,0 +1,7 @@
+from grok.directive import InterfaceOrClassDirective, ClassOrModuleDirectiveContext
+from grok.directive import SingleTextDirective, ClassDirectiveContext
+
+layer = InterfaceOrClassDirective('quarry.layer',
+                           ClassOrModuleDirectiveContext())
+
+template = SingleTextDirective('quarry.template', ClassDirectiveContext())

Added: megrok.quarry/src/megrok/quarry/directive.pyc
===================================================================
(Binary files differ)


Property changes on: megrok.quarry/src/megrok/quarry/directive.pyc
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: megrok.quarry/src/megrok/quarry/ftests/README.txt
===================================================================
--- megrok.quarry/src/megrok/quarry/ftests/README.txt	2007-05-02 06:41:09 UTC (rev 74986)
+++ megrok.quarry/src/megrok/quarry/ftests/README.txt	2007-05-02 06:54:36 UTC (rev 74987)
@@ -0,0 +1,6 @@
+Creating functional tests
+-------------------------
+
+Unfortunately, functional doctests do not import themselves (as the
+unit-test ones do), so you need to manually import the module in the
+doctest part.

Added: megrok.quarry/src/megrok/quarry/ftests/__init__.py
===================================================================
--- megrok.quarry/src/megrok/quarry/ftests/__init__.py	2007-05-02 06:41:09 UTC (rev 74986)
+++ megrok.quarry/src/megrok/quarry/ftests/__init__.py	2007-05-02 06:54:36 UTC (rev 74987)
@@ -0,0 +1 @@
+# this is a package

Added: megrok.quarry/src/megrok/quarry/ftests/__init__.pyc
===================================================================
(Binary files differ)


Property changes on: megrok.quarry/src/megrok/quarry/ftests/__init__.pyc
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: megrok.quarry/src/megrok/quarry/ftests/test_grok_functional.py
===================================================================
--- megrok.quarry/src/megrok/quarry/ftests/test_grok_functional.py	2007-05-02 06:41:09 UTC (rev 74986)
+++ megrok.quarry/src/megrok/quarry/ftests/test_grok_functional.py	2007-05-02 06:54:36 UTC (rev 74987)
@@ -0,0 +1,65 @@
+import unittest
+from pkg_resources import resource_listdir
+from zope.testing import doctest
+from zope.app.testing.functional import (HTTPCaller, getRootFolder,
+                                         FunctionalTestSetup, sync, Functional)
+
+# XXX bastardized from zope.app.testing.functional.FunctionalDocFileSuite :-(
+def FunctionalDocTestSuite(*paths, **kw):
+    globs = kw.setdefault('globs', {})
+    globs['http'] = HTTPCaller()
+    globs['getRootFolder'] = getRootFolder
+    globs['sync'] = sync
+
+    #kw['package'] = doctest._normalize_module(kw.get('package'))
+
+    kwsetUp = kw.get('setUp')
+    def setUp(test):
+        FunctionalTestSetup().setUp()
+
+        if kwsetUp is not None:
+            kwsetUp(test)
+    kw['setUp'] = setUp
+
+    kwtearDown = kw.get('tearDown')
+    def tearDown(test):
+        if kwtearDown is not None:
+            kwtearDown(test)
+        FunctionalTestSetup().tearDown()
+    kw['tearDown'] = tearDown
+
+    if 'optionflags' not in kw:
+        old = doctest.set_unittest_reportflags(0)
+        doctest.set_unittest_reportflags(old)
+        kw['optionflags'] = (old
+                             | doctest.ELLIPSIS
+                             | doctest.REPORT_NDIFF
+                             | doctest.NORMALIZE_WHITESPACE)
+
+    suite = doctest.DocTestSuite(*paths, **kw)
+    suite.layer = Functional
+    return suite
+
+def suiteFromPackage(name):
+    files = resource_listdir(__name__, name)
+    suite = unittest.TestSuite()
+    for filename in files:
+        if not filename.endswith('.py'):
+            continue
+        if filename == '__init__.py':
+            continue
+
+        dottedname = 'grok.ftests.%s.%s' % (name, filename[:-3])
+        test = FunctionalDocTestSuite(dottedname)
+
+        suite.addTest(test)
+    return suite
+
+def test_suite():
+    suite = unittest.TestSuite()
+    for name in ['view']:
+        suite.addTest(suiteFromPackage(name))
+    return suite
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')

Added: megrok.quarry/src/megrok/quarry/ftests/test_grok_functional.pyc
===================================================================
(Binary files differ)


Property changes on: megrok.quarry/src/megrok/quarry/ftests/test_grok_functional.pyc
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: megrok.quarry/src/megrok/quarry/ftests/view/__init__.py
===================================================================
--- megrok.quarry/src/megrok/quarry/ftests/view/__init__.py	2007-05-02 06:41:09 UTC (rev 74986)
+++ megrok.quarry/src/megrok/quarry/ftests/view/__init__.py	2007-05-02 06:54:36 UTC (rev 74987)
@@ -0,0 +1 @@
+# this is a package

Added: megrok.quarry/src/megrok/quarry/ftests/view/layer.py
===================================================================
--- megrok.quarry/src/megrok/quarry/ftests/view/layer.py	2007-05-02 06:41:09 UTC (rev 74986)
+++ megrok.quarry/src/megrok/quarry/ftests/view/layer.py	2007-05-02 06:54:36 UTC (rev 74987)
@@ -0,0 +1,70 @@
+"""
+  >>> import grok
+  >>> from megrok.quarry.ftests.view.layer import Mammoth
+  >>> grok.grok('megrok.quarry.ftests.view.layer')
+  >>> getRootFolder()["manfred"] = Mammoth()
+
+  >>> from zope.testbrowser.testing import Browser
+  >>> browser = Browser()
+  >>> browser.handleErrors = False
+  >>> browser.open("http://localhost/++skin++Basic/manfred/@@cavedrawings")
+  >>> print browser.contents
+  <html>
+  <body>
+  <h1>Hello, world!</h1>
+  </body>
+  </html>
+  
+  >>> browser.open("http://localhost/++skin++Rotterdam/manfred/@@cavedrawings")
+  Traceback (most recent call last):
+  ...
+  NotFound: Object: <grok.ftests.view.layer.Mammoth object at ...>, name: u'@@cavedrawings'
+  >>> browser.open("http://localhost/++skin++Rotterdam/manfred/@@moredrawings")
+  >>> print browser.contents
+  Pretty
+
+  #>>> browser.open("http://localhost/++skin++MySkin/manfred/@@evenmoredrawings")
+  #>>> print browser.contents
+  #Awesome
+
+"""
+import grok
+from zope.app.basicskin import IBasicSkin
+from zope.publisher.interfaces.browser import IBrowserRequest
+from zope.app.rotterdam import rotterdam
+from zope import interface
+from megrok import quarry
+
+quarry.layer(IBasicSkin)
+
+class MySkinLayer(quarry.Layer):
+    pass
+
+class MySkin(quarry.Skin):
+    quarry.layer(MySkinLayer)
+
+class Mammoth(grok.Model):
+    pass
+
+class CaveDrawings(quarry.View):
+    pass
+
+cavedrawings = grok.PageTemplate("""\
+<html>
+<body>
+<h1>Hello, world!</h1>
+</body>
+</html>
+""")
+
+class MoreDrawings(quarry.View):
+    quarry.layer(rotterdam)
+
+    def render(self):
+        return "Pretty"
+
+class EvenMoreDrawings(quarry.View):
+    quarry.layer(MySkin)
+
+    def render(self):
+        return "Awesome"

Added: megrok.quarry/src/megrok/quarry/meta.py
===================================================================
--- megrok.quarry/src/megrok/quarry/meta.py	2007-05-02 06:41:09 UTC (rev 74986)
+++ megrok.quarry/src/megrok/quarry/meta.py	2007-05-02 06:54:36 UTC (rev 74987)
@@ -0,0 +1,246 @@
+import grok
+from megrok import quarry
+from grok import util, components, formlib
+from grok.error import GrokError
+
+from zope.publisher.interfaces.browser import IBrowserSkinType
+from zope.viewlet.interfaces import IViewletManager, IViewlet
+from zope.security.permission import Permission
+from zope.security.interfaces import IPermission
+from zope.security.checker import NamesChecker, defineChecker
+
+from zope.dottedname.resolve import resolve
+from zope import interface, component
+import zope.component.interface
+
+class LayerGrokker(grok.ClassGrokker):
+    component_class = quarry.Layer
+
+
+class SkinGrokker(grok.ClassGrokker):
+    component_class = quarry.Skin
+
+    def register(self, context, name, factory, module_info, templates):
+        layer = util.class_annotation(factory, 'quarry.layer',
+                                    None) or module_info.getAnnotation('grok.layer',
+                                    None) or grok.IDefaultBrowserLayer
+        name = util.class_annotation(factory, 'grok.name', factory.__name__.lower())
+        zope.component.interface.provideInterface(name, layer, IBrowserSkinType)
+
+
+class ViewGrokker(grok.ClassGrokker):
+    component_class = quarry.View
+
+    def register(self, context, name, factory, module_info, templates):
+        view_context = util.determine_class_context(factory, context)
+
+        factory.module_info = module_info
+        factory_name = factory.__name__.lower()
+
+        if util.check_subclass(factory, components.GrokForm):
+            # setup form_fields from context class if we've encountered a form
+            if getattr(factory, 'form_fields', None) is None:
+                factory.form_fields = formlib.get_auto_fields(view_context)
+
+            if not getattr(factory.render, 'base_method', False):
+                raise GrokError(
+                    "It is not allowed to specify a custom 'render' "
+                    "method for form %r. Forms either use the default "
+                    "template or a custom-supplied one." % factory,
+                    factory)
+
+        # find templates
+        if util.class_annotation(factory, 'grok.template',
+                                 None):
+            raise GrokError(
+                "%s may not use grok.template, use quarry.template instead."
+                % factory.__name__, factory)
+
+        template_name = util.class_annotation(factory, 'quarry.template',
+                                              None)
+        if template_name is None:
+            template_name = factory_name
+            
+        template = templates.get(template_name)
+
+            
+        if factory_name != template_name:
+            # grok.template is being used
+            if templates.get(factory_name):
+                raise GrokError("Multiple possible templates for view %r. It "
+                                "uses grok.template('%s'), but there is also "
+                                "a template called '%s'."
+                                % (factory, template_name, factory_name),
+                                factory)
+            # no conflicts, lets try and load the template
+            # using grok.Template('with.dotted.name')
+            try:
+                factory.template = resolve(template_name)
+                # accept string and unicode objects, useful if .__doc__ is referenced
+                if isinstance(factory.template, (str, unicode)):
+                    factory.template = grok.PageTemplate(factory.template)
+            except ImportError:
+                # verify this is a dotted name
+                if template_name.find('.') >=0:
+                    raise GrokError(
+                        "'%s' is not importable. Check the path and"
+                        "be sure it's a grok.PageTemplate,"
+                        "grok.PageTemplateFile, string, or unicode object"
+                        % template_name, factory)
+
+        # support in-class imports template = grok.PageTemplateFile
+        factory_template =  getattr(factory, 'template', None)
+
+        if template:
+            if (getattr(factory, 'render', None) and not
+                util.check_subclass(factory, components.GrokForm)):
+                # we do not accept render and template both for a view
+                # (unless it's a form, they happen to have render.
+                raise GrokError(
+                    "Multiple possible ways to render view %r. "
+                    "It has both a 'render' method as well as "
+                    "an associated template." % factory, factory)
+
+            templates.markAssociated(template_name)
+            factory.template = template
+        elif factory_template:
+            pass
+        else:
+            if not getattr(factory, 'render', None):
+                # we do not accept a view without any way to render it
+                raise GrokError("View %r has no associated template or "
+                                "'render' method." % factory, factory)
+
+        view_layer = util.class_annotation(factory, 'grok.layer',
+                                           None) or module_info.getAnnotation('grok.layer',
+                                               None) or IDefaultBrowserLayer
+
+        view_name = util.class_annotation(factory, 'grok.name',
+                                          factory_name)
+        # __view_name__ is needed to support IAbsoluteURL on views
+        factory.__view_name__ = view_name
+        component.provideAdapter(factory,
+                                 adapts=(view_context, view_layer),
+                                 provides=interface.Interface,
+                                 name=view_name)
+
+        # protect view, public by default
+        default_permission = util.get_default_permission(factory)
+        util.make_checker(factory, factory, default_permission)
+    
+        # safety belt: make sure that the programmer didn't use
+        # @grok.require on any of the view's methods.
+        methods = util.methods_from_class(factory)
+        for method in methods:
+            if getattr(method, '__grok_require__', None) is not None:
+                raise GrokError('The @grok.require decorator is used for '
+                                'method %r in view %r. It may only be used '
+                                'for XML-RPC methods.'
+                                % (method.__name__, factory), factory)
+
+
+
+
+# class ViewletManagerGrokker(grok.ClassGrokker):
+#     component_class = (grok.ViewletManager, grok.OrderedViewletManager)
+
+#     def register(self, context, name, factory, module_info, templates):
+
+#         factory.module_info = module_info # to make /static available
+
+#         name = grok.util.class_annotation(factory, 'grok.name', factory.__name__.lower())
+#         view_layer = util.class_annotation(factory, 'grok.layer',
+#                                                     None) or module_info.getAnnotation('grok.layer',
+#                                                      None) or IDefaultBrowserLayer
+        
+#         view_context = util.determine_class_context(factory, context)
+#         component.provideAdapter(factory,
+#                                  adapts=(None, # TODO: Make configurable
+#                                          view_layer, # TODO: Make configurable
+#                                          view_context),
+#                                  provides=IViewletManager,
+#                                  name=name)
+
+            
+# class ViewletGrokker(grok.ClassGrokker):
+#     component_class = grok.Viewlet
+                
+#     def register(self, context, name, factory, module_info, templates):
+#         # Try to set up permissions (copied from the View grokker)
+
+#         factory.module_info = module_info # to make /static available
+#         factory_name = factory.__name__.lower()
+        
+#         permissions = grok.util.class_annotation(factory, 'grok.require', [])
+#         if not permissions:
+#             checker = NamesChecker(['update', 'render'])
+#         elif len(permissions) > 1:
+#             raise GrokError('grok.require was called multiple times in viewlet '
+#                             '%r. It may only be called once.' % factory,
+#                             factory)
+#         elif permissions[0] == 'zope.Public':
+#             checker = NamesChecker(['update','render'])
+#         else:
+#             perm = permissions[0]
+#             if component.queryUtility(IPermission, name=perm) is None:
+#                 raise GrokError('Undefined permission %r in view %r. Use '
+#                             'grok.define_permission first.'
+#                             % (perm, factory), factory)
+#             checker = NamesChecker(['update','render'], permissions[0])
+        
+#         defineChecker(factory, checker)
+
+
+#         # find templates
+#         template_name = util.class_annotation(factory, 'grok.template',
+#                                               factory_name)
+#         template = templates.get(template_name)
+
+#         if factory_name != template_name:
+#             # grok.template is being used
+#             if templates.get(factory_name):
+#                 raise GrokError("Multiple possible templates for view %r. It "
+#                                 "uses grok.template('%s'), but there is also "
+#                                 "a template called '%s'."
+#                                 % (factory, template_name, factory_name),
+#                                 factory)
+
+#         factory_template = getattr(factory,'template', None)
+        
+#         if template:
+#             if (getattr(factory, 'render', None) and not
+#                 util.check_subclass(factory, components.GrokForm) and not
+#                 util.check_subclass(factory, components.Viewlet)):
+#                 # we do not accept render and template both for a view
+#                 # (unless it's a form, they happen to have render.)
+#                 # Forms currently not implemented in viewlets.
+#                 raise GrokError(
+#                     "Multiple possible ways to render view %r. "
+#                     "It has both a 'render' method as well as "
+#                     "an associated template." % factory, factory)
+
+#             templates.markAssociated(template_name)
+#             factory.template = template
+#         elif factory_template and isinstance(factory_template, (components.PageTemplate, components.PageTemplateFile)):
+#             pass
+#         else:
+#             if not getattr(factory, 'render', None):
+#                 # we do not accept a view without any way to render it
+#                 raise GrokError("View %r has no associated template or "
+#                                 "'render' method." % factory, factory)
+
+        
+#         # New directive
+#         viewletmanager = grok.util.class_annotation(factory, 'grok.viewletmanager', [])
+#         layer = util.class_annotation(factory, 'grok.layer',
+#                                             None) or module_info.getAnnotation('grok.layer',
+#                                              None) or IDefaultBrowserLayer
+       
+#         component.provideAdapter(factory,
+#                                  adapts=(None, # TODO: Make configurable
+#                                          layer,
+#                                          IBrowserView,
+#                                          viewletmanager),
+#                                  provides=IViewlet,
+#                                  name=name)
+

Added: megrok.quarry/src/megrok/quarry/meta.pyc
===================================================================
(Binary files differ)


Property changes on: megrok.quarry/src/megrok/quarry/meta.pyc
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: megrok.quarry/src/megrok/quarry/meta.zcml
===================================================================
--- megrok.quarry/src/megrok/quarry/meta.zcml	2007-05-02 06:41:09 UTC (rev 74986)
+++ megrok.quarry/src/megrok/quarry/meta.zcml	2007-05-02 06:54:36 UTC (rev 74987)
@@ -0,0 +1 @@
+<grok package=".meta" xmlns="http://namespaces.zope.org/grok" />
\ No newline at end of file

Added: megrok.quarry/src/megrok.quarry.egg-info/PKG-INFO
===================================================================
--- megrok.quarry/src/megrok.quarry.egg-info/PKG-INFO	2007-05-02 06:41:09 UTC (rev 74986)
+++ megrok.quarry/src/megrok.quarry.egg-info/PKG-INFO	2007-05-02 06:54:36 UTC (rev 74987)
@@ -0,0 +1,10 @@
+Metadata-Version: 1.0
+Name: megrok.quarry
+Version: 0.1
+Summary: Enhanced tools for Grok.
+Home-page: UNKNOWN
+Author: UNKNOWN
+Author-email: UNKNOWN
+License: UNKNOWN
+Description: UNKNOWN
+Platform: UNKNOWN

Added: megrok.quarry/src/megrok.quarry.egg-info/SOURCES.txt
===================================================================
--- megrok.quarry/src/megrok.quarry.egg-info/SOURCES.txt	2007-05-02 06:41:09 UTC (rev 74986)
+++ megrok.quarry/src/megrok.quarry.egg-info/SOURCES.txt	2007-05-02 06:54:36 UTC (rev 74987)
@@ -0,0 +1,19 @@
+README.txt
+setup.py
+src/megrok/__init__.py
+src/megrok.quarry.egg-info/PKG-INFO
+src/megrok.quarry.egg-info/SOURCES.txt
+src/megrok.quarry.egg-info/dependency_links.txt
+src/megrok.quarry.egg-info/entry_points.txt
+src/megrok.quarry.egg-info/not-zip-safe
+src/megrok.quarry.egg-info/paster_plugins.txt
+src/megrok.quarry.egg-info/requires.txt
+src/megrok.quarry.egg-info/top_level.txt
+src/megrok/quarry/__init__.py
+src/megrok/quarry/components.py
+src/megrok/quarry/directive.py
+src/megrok/quarry/meta.py
+src/megrok/quarry/ftests/__init__.py
+src/megrok/quarry/ftests/test_grok_functional.py
+src/megrok/quarry/ftests/view/__init__.py
+src/megrok/quarry/ftests/view/layer.py

Added: megrok.quarry/src/megrok.quarry.egg-info/dependency_links.txt
===================================================================
--- megrok.quarry/src/megrok.quarry.egg-info/dependency_links.txt	2007-05-02 06:41:09 UTC (rev 74986)
+++ megrok.quarry/src/megrok.quarry.egg-info/dependency_links.txt	2007-05-02 06:54:36 UTC (rev 74987)
@@ -0,0 +1 @@
+

Added: megrok.quarry/src/megrok.quarry.egg-info/entry_points.txt
===================================================================
--- megrok.quarry/src/megrok.quarry.egg-info/entry_points.txt	2007-05-02 06:41:09 UTC (rev 74986)
+++ megrok.quarry/src/megrok.quarry.egg-info/entry_points.txt	2007-05-02 06:54:36 UTC (rev 74987)
@@ -0,0 +1,3 @@
+
+      # -*- Entry points: -*-
+      
\ No newline at end of file

Added: megrok.quarry/src/megrok.quarry.egg-info/not-zip-safe
===================================================================
--- megrok.quarry/src/megrok.quarry.egg-info/not-zip-safe	2007-05-02 06:41:09 UTC (rev 74986)
+++ megrok.quarry/src/megrok.quarry.egg-info/not-zip-safe	2007-05-02 06:54:36 UTC (rev 74987)
@@ -0,0 +1 @@
+

Added: megrok.quarry/src/megrok.quarry.egg-info/paster_plugins.txt
===================================================================
--- megrok.quarry/src/megrok.quarry.egg-info/paster_plugins.txt	2007-05-02 06:41:09 UTC (rev 74986)
+++ megrok.quarry/src/megrok.quarry.egg-info/paster_plugins.txt	2007-05-02 06:54:36 UTC (rev 74987)
@@ -0,0 +1 @@
+PasteScript

Added: megrok.quarry/src/megrok.quarry.egg-info/requires.txt
===================================================================
--- megrok.quarry/src/megrok.quarry.egg-info/requires.txt	2007-05-02 06:41:09 UTC (rev 74986)
+++ megrok.quarry/src/megrok.quarry.egg-info/requires.txt	2007-05-02 06:54:36 UTC (rev 74987)
@@ -0,0 +1,2 @@
+setuptools
+grok
\ No newline at end of file

Added: megrok.quarry/src/megrok.quarry.egg-info/top_level.txt
===================================================================
--- megrok.quarry/src/megrok.quarry.egg-info/top_level.txt	2007-05-02 06:41:09 UTC (rev 74986)
+++ megrok.quarry/src/megrok.quarry.egg-info/top_level.txt	2007-05-02 06:54:36 UTC (rev 74987)
@@ -0,0 +1 @@
+megrok



More information about the Checkins mailing list