[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