[Checkins] SVN: Sandbox/cklinger/megrok.storm/trunk/ Initial Import

Christian Klinger cklinger at novareto.de
Mon Aug 25 09:05:10 EDT 2008


Log message for revision 90203:
  Initial Import

Changed:
  A   Sandbox/cklinger/megrok.storm/trunk/.installed.cfg
  A   Sandbox/cklinger/megrok.storm/trunk/CHANGES.txt
  A   Sandbox/cklinger/megrok.storm/trunk/README.txt
  A   Sandbox/cklinger/megrok.storm/trunk/bootstrap.py
  A   Sandbox/cklinger/megrok.storm/trunk/buildout.cfg
  A   Sandbox/cklinger/megrok.storm/trunk/setup.cfg
  A   Sandbox/cklinger/megrok.storm/trunk/setup.py
  A   Sandbox/cklinger/megrok.storm/trunk/src/
  A   Sandbox/cklinger/megrok.storm/trunk/src/megrok/
  A   Sandbox/cklinger/megrok.storm/trunk/src/megrok/__init__.py
  A   Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/
  A   Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/__init__.py
  A   Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/component.py
  A   Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/container.py
  A   Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/directive.py
  A   Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/ftesting.zcml
  A   Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/grokker.py
  A   Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/interfaces.py
  A   Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/meta.zcml
  A   Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/tests/
  A   Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/tests/__init__.py
  A   Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/tests/helper.py
  A   Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/tests/test_functional.py
  A   Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/tests/test_storm.py
  A   Sandbox/cklinger/megrok.storm/trunk/versions.cfg

-=-
Added: Sandbox/cklinger/megrok.storm/trunk/.installed.cfg
===================================================================
--- Sandbox/cklinger/megrok.storm/trunk/.installed.cfg	                        (rev 0)
+++ Sandbox/cklinger/megrok.storm/trunk/.installed.cfg	2008-08-25 13:05:09 UTC (rev 90203)
@@ -0,0 +1,34 @@
+[buildout]
+installed_develop_eggs = /Users/cklinger/work/megroks/megrok.storm/develop-eggs/megrok.storm.egg-link
+parts = test interpreter
+
+[test]
+__buildout_installed__ = /Users/cklinger/work/megroks/megrok.storm/parts/test
+	/Users/cklinger/work/megroks/megrok.storm/bin/test
+__buildout_signature__ = zc.recipe.testrunner-1.0.0-py2.4.egg zc.recipe.egg-1.1.0-py2.4.egg setuptools-0.6c8-py2.4.egg zope.testing-3.5.1-py2.4.egg zc.buildout-1.1.1-py2.4.egg zc.buildout-1.1.1-py2.4.egg
+_b = /Users/cklinger/work/megroks/megrok.storm/bin
+_d = /Users/cklinger/work/megroks/megrok.storm/develop-eggs
+_e = /Users/cklinger/work/megroks/megrok.storm/eggs
+bin-directory = /Users/cklinger/work/megroks/megrok.storm/bin
+defaults = ['--tests-pattern', '^f?tests$', '-v']
+develop-eggs-directory = /Users/cklinger/work/megroks/megrok.storm/develop-eggs
+eggs = megrok.storm
+eggs-directory = /Users/cklinger/work/megroks/megrok.storm/eggs
+executable = /Users/cklinger/work/megroks/megrok.storm/../bin/python
+location = /Users/cklinger/work/megroks/megrok.storm/parts/test
+recipe = zc.recipe.testrunner
+script = /Users/cklinger/work/megroks/megrok.storm/bin/test
+
+[interpreter]
+__buildout_installed__ = /Users/cklinger/work/megroks/megrok.storm/bin/python
+__buildout_signature__ = zc.recipe.egg-1.1.0-py2.4.egg setuptools-0.6c8-py2.4.egg zc.buildout-1.1.1-py2.4.egg
+_b = /Users/cklinger/work/megroks/megrok.storm/bin
+_d = /Users/cklinger/work/megroks/megrok.storm/develop-eggs
+_e = /Users/cklinger/work/megroks/megrok.storm/eggs
+bin-directory = /Users/cklinger/work/megroks/megrok.storm/bin
+develop-eggs-directory = /Users/cklinger/work/megroks/megrok.storm/develop-eggs
+eggs = megrok.storm
+eggs-directory = /Users/cklinger/work/megroks/megrok.storm/eggs
+executable = /Users/cklinger/work/megroks/megrok.storm/../bin/python
+interpreter = python
+recipe = zc.recipe.egg

Added: Sandbox/cklinger/megrok.storm/trunk/CHANGES.txt
===================================================================
--- Sandbox/cklinger/megrok.storm/trunk/CHANGES.txt	                        (rev 0)
+++ Sandbox/cklinger/megrok.storm/trunk/CHANGES.txt	2008-08-25 13:05:09 UTC (rev 90203)
@@ -0,0 +1,7 @@
+Changelog
+=========
+
+0.1 (2008-07-23)
+----------------
+
+Initial release.

Added: Sandbox/cklinger/megrok.storm/trunk/README.txt
===================================================================
--- Sandbox/cklinger/megrok.storm/trunk/README.txt	                        (rev 0)
+++ Sandbox/cklinger/megrok.storm/trunk/README.txt	2008-08-25 13:05:09 UTC (rev 90203)
@@ -0,0 +1,2 @@
+MEGROK STORM
+============

Added: Sandbox/cklinger/megrok.storm/trunk/bootstrap.py
===================================================================
--- Sandbox/cklinger/megrok.storm/trunk/bootstrap.py	                        (rev 0)
+++ Sandbox/cklinger/megrok.storm/trunk/bootstrap.py	2008-08-25 13:05:09 UTC (rev 90203)
@@ -0,0 +1,62 @@
+##############################################################################
+#
+# 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$
+"""
+
+import os, shutil, sys, tempfile, urllib2
+
+tmpeggs = tempfile.mkdtemp()
+
+try:
+    import pkg_resources
+except ImportError:
+    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
+
+if sys.platform == 'win32':
+    def quote(c):
+        if ' ' in c:
+            return '"%s"' % c # work around spawn lamosity on windows
+        else:
+            return c
+else:
+    def quote (c):
+        return c
+
+cmd = 'from setuptools.command.easy_install import main; main()'
+ws  = pkg_resources.working_set
+assert os.spawnle(
+    os.P_WAIT, sys.executable, quote (sys.executable),
+    '-c', quote (cmd), '-mqNxd', quote (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: Sandbox/cklinger/megrok.storm/trunk/buildout.cfg
===================================================================
--- Sandbox/cklinger/megrok.storm/trunk/buildout.cfg	                        (rev 0)
+++ Sandbox/cklinger/megrok.storm/trunk/buildout.cfg	2008-08-25 13:05:09 UTC (rev 90203)
@@ -0,0 +1,16 @@
+[buildout]
+develop = .
+eggs-directory = eggs
+parts = test interpreter
+extends = versions.cfg
+versions = versions
+
+[interpreter]
+recipe = zc.recipe.egg
+eggs = megrok.storm
+interpreter = python
+
+[test]
+recipe = zc.recipe.testrunner
+eggs = megrok.storm
+defaults = ['--tests-pattern', '^f?tests$', '-v']

Added: Sandbox/cklinger/megrok.storm/trunk/setup.cfg
===================================================================
--- Sandbox/cklinger/megrok.storm/trunk/setup.cfg	                        (rev 0)
+++ Sandbox/cklinger/megrok.storm/trunk/setup.cfg	2008-08-25 13:05:09 UTC (rev 90203)
@@ -0,0 +1,5 @@
+[egg_info]
+tag_build = 
+tag_date = 0
+tag_svn_revision = 0
+

Added: Sandbox/cklinger/megrok.storm/trunk/setup.py
===================================================================
--- Sandbox/cklinger/megrok.storm/trunk/setup.py	                        (rev 0)
+++ Sandbox/cklinger/megrok.storm/trunk/setup.py	2008-08-25 13:05:09 UTC (rev 90203)
@@ -0,0 +1,38 @@
+from setuptools import setup, find_packages
+
+long_description = (open("README.txt").read()
+                    + '\n\n' +
+                    open("CHANGES.txt").read())
+
+setup(name='megrok.storm',
+      version='0.1',
+      description="Grok extension to deal with storm Libraray ",
+      long_description=long_description,
+      # Get more strings from http://www.python.org/pypi?%3Aaction=list_classifiers
+      classifiers=['Programming Language :: Python',
+                   'Environment :: Web Environment',
+                   'Framework :: Zope3',
+                   'License :: OSI Approved :: Zope Public License',
+                   ],
+      keywords='',
+      author='Christian Klinger',
+      author_email='cklinger at novareto.de',
+      url='http://pypi.python.org/pypi/megrok.storm',
+      license='ZPL',
+      packages=find_packages('src'),
+      package_dir = {'': 'src'},
+      namespace_packages=['megrok'],
+      include_package_data=True,
+      zip_safe=False,
+      install_requires=[
+          'setuptools',
+          'martian',
+          'grokcore.component',
+          'grok',  # just for the ViewGrokker
+	  'storm',
+	  'pysqlite',
+      ],
+      entry_points="""
+      # -*- Entry points: -*-
+      """,
+      )

Added: Sandbox/cklinger/megrok.storm/trunk/src/megrok/__init__.py
===================================================================
--- Sandbox/cklinger/megrok.storm/trunk/src/megrok/__init__.py	                        (rev 0)
+++ Sandbox/cklinger/megrok.storm/trunk/src/megrok/__init__.py	2008-08-25 13:05:09 UTC (rev 90203)
@@ -0,0 +1,6 @@
+# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
+try:
+    __import__('pkg_resources').declare_namespace(__name__)
+except ImportError:
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__)

Added: Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/__init__.py
===================================================================
--- Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/__init__.py	                        (rev 0)
+++ Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/__init__.py	2008-08-25 13:05:09 UTC (rev 90203)
@@ -0,0 +1,5 @@
+from megrok.storm.component import AppRoot, Model, Store, store 
+from megrok.storm.directive import *
+
+# Provide these directives here as well:
+from grokcore.component import name, title, description

Added: Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/component.py
===================================================================
--- Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/component.py	                        (rev 0)
+++ Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/component.py	2008-08-25 13:05:09 UTC (rev 90203)
@@ -0,0 +1,92 @@
+import martian.util
+import grokcore.component
+from martian.error import GrokImportError
+import grok
+from storm.locals import *
+from storm.zope.interfaces import IZStorm
+from zope.component import getUtility
+from zope.configuration.name import resolve
+import megrok.storm
+from interfaces import IAppRoot
+
+class AppRoot(grok.Model):
+    grok.implements(IAppRoot)
+
+    def getStore(self):
+	name = megrok.storm.directive.storename.bind().get(self)
+        store = getUtility(IZStorm).get(name)
+        return store
+
+    def keys(self):
+	key = megrok.storm.directive.key.bind().get(self)
+	return [getattr(obj, key) for obj in self.__iter__()]
+
+    def items(self):
+	return [obj for obj in self.__iter__()]
+
+    def __iter__(self):
+        store = self.getStore()
+	object = megrok.storm.directive.rdb_object.bind().get(self)
+        return iter( store.find(object))
+
+    def __getitem__(self, name):
+        store = self.getStore()
+	object = megrok.storm.directive.rdb_object.bind().get(self)
+	key = megrok.storm.directive.key.bind().get(self)
+        key_property = getattr(object, key)
+        item = store.find(object, key_property == name).one()
+        return item
+
+    def  __setitem__(self, name, item):
+        key = self.key
+        setattr(item, key, name)
+        store = self.getStore()
+        store.add(item)
+
+    def add(self, item):
+        store = self.getStore()
+        store.add(item)
+
+    def __len__(self):
+        store = self.getStore()
+	object = megrok.storm.directive.rdb_object.bind().get(self)
+        return store.find(object).count()
+
+    def __delitem__(self, name):
+        store = self.getStore()
+	object = megrok.storm.directive.rdb_object.bind().get(self)
+	obj = store.get(object, name)
+	store.remove(obj)
+
+    def traverse(self, name):
+	return self[name]
+
+    def filter(self, *args, **kwargs):
+        store = self.getStore()
+	object = megrok.storm.directive.rdb_object.bind().get(self)
+	result = store.find(object, *args, **kwargs)
+	return result
+
+
+class Store(object):
+    pass
+
+class store(martian.MultipleTimesDirective):
+    scope = martian.MODULE
+
+    def factory(self, storename, uri):
+	if martian.util.not_unicode_or_ascii(storename):
+	    raise GrokImportError(
+	        "You can only pass unicode or ASCII"
+		"to megrok.storm.Store to the '%s' directive." % self.name)
+	if martian.util.not_unicode_or_ascii(uri):
+	    raise GrokImportError(
+	        "You can only pass unicode or ASCII"
+		"to megrok.storm.Store to the '%s' directive." % self.name)
+	return (storename, uri)
+
+
+class Model(grokcore.component.Context):
+    pass
+
+

Added: Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/container.py
===================================================================
--- Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/container.py	                        (rev 0)
+++ Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/container.py	2008-08-25 13:05:09 UTC (rev 90203)
@@ -0,0 +1,42 @@
+from storm.exceptions import WrongStoreError, NoStoreError, ClassInfoError
+from storm.store import Store, get_where_for_args
+from storm.expr import (
+    Select, Column, Exists, ComparableExpr, LeftJoin, SQLRaw,
+    compare_columns, compile)
+from storm.info import get_cls_info, get_obj_info
+
+
+##
+from storm.references import ReferenceSet, BoundIndirectReferenceSet, BoundReferenceSet
+
+import grok
+
+class CBoundReferenceSet(BoundReferenceSet, grok.Model):
+    def traverse(self, name):
+	print name
+	print self.find(id=int(name))
+	return self.find(id=int(name)).one()
+
+class CReferenceSet(ReferenceSet):
+
+    def __get__(self, local, cls=None):
+        if local is None:
+            return self
+
+        # Don't use local here, as it might be security proxied or something.
+        local = get_obj_info(local).get_obj()
+
+        if self._relation1 is None:
+            self._build_relations(local.__class__)
+
+        #store = Store.of(local)
+        #if store is None:
+        #    return None
+
+        if self._relation2 is None:
+            return CBoundReferenceSet(self._relation1, local, self._order_by)
+        else:
+            return BoundIndirectReferenceSet(self._relation1,
+                                             self._relation2, local,
+                                             self._order_by)
+

Added: Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/directive.py
===================================================================
--- Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/directive.py	                        (rev 0)
+++ Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/directive.py	2008-08-25 13:05:09 UTC (rev 90203)
@@ -0,0 +1,25 @@
+import martian
+
+class storename(martian.Directive):
+    scope = martian.CLASS
+    store = martian.ONCE
+    default = u'megrok.storm.store'
+
+class uri(martian.Directive):
+    scope = martian.CLASS
+    store = martian.ONCE
+
+class tablename(martian.Directive):
+    scope = martian.CLASS
+    store = martian.ONCE
+    default = u''
+
+class key(martian.Directive):
+    scope = martian.CLASS
+    store = martian.ONCE
+    default = u''
+
+class rdb_object(martian.Directive):
+    scope = martian.CLASS
+    store = martian.ONCE
+    default = u''

Added: Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/ftesting.zcml
===================================================================
--- Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/ftesting.zcml	                        (rev 0)
+++ Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/ftesting.zcml	2008-08-25 13:05:09 UTC (rev 90203)
@@ -0,0 +1,39 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:i18n="http://namespaces.zope.org/i18n"
+    xmlns:browser="http://namespaces.zope.org/browser"
+    xmlns:grok="http://namespaces.zope.org/grok">
+
+  <include package="megrok.storm" file="meta.zcml" />
+ 
+  <include package="storm.zope" />
+
+
+  <grok:grok package="megrok.storm.tests" />
+
+  <securityPolicy
+      component="zope.securitypolicy.zopepolicy.ZopeSecurityPolicy"
+      />
+
+  <unauthenticatedPrincipal
+      id="zope.anybody"
+      title="Unauthenticated User"
+      />
+  <grant
+      permission="zope.View"
+      principal="zope.anybody"
+      />
+
+  <principal
+      id="zope.mgr"
+      title="Manager"
+      login="mgr"
+      password="mgrpw"
+      />
+
+  <role id="zope.Manager" title="Site Manager" />
+  <grantAll role="zope.Manager" />
+  <grant role="zope.Manager" principal="zope.mgr" />
+
+
+</configure>

Added: Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/grokker.py
===================================================================
--- Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/grokker.py	                        (rev 0)
+++ Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/grokker.py	2008-08-25 13:05:09 UTC (rev 90203)
@@ -0,0 +1,40 @@
+import martian
+import grokcore.component
+import megrok.storm
+from martian.error import GrokError
+from grok.meta import ViewGrokker, default_view_name
+from zope.configuration.exceptions import ConfigurationError
+
+from storm.zope.metaconfigure import store
+
+class StoreGrokker(martian.ClassGrokker):
+    martian.component(megrok.storm.Store)
+    martian.directive(megrok.storm.storename)
+    martian.directive(megrok.storm.uri)
+
+    def execute(self, factory, config, storename, uri, **kw):
+	store(config, storename, uri)
+	return True
+
+def default_tablename(factory, module, **data):
+    return factory.__name__.lower()
+
+class ModelGrokker(martian.ClassGrokker):
+    martian.component(megrok.storm.Model)
+    martian.directive(megrok.storm.tablename, get_default=default_tablename)
+    
+    def execute(self, class_, tablename,  **kw):
+        class_.__storm_table__ = tablename
+        # we associate the _decl_registry with the metadata object
+        # to make sure it's unique per metadata. A bit of a hack..
+        return True
+
+class AppRootGrokker(martian.ClassGrokker):
+    martian.component(megrok.storm.AppRoot)
+    martian.directive(megrok.storm.key)
+    martian.directive(megrok.storm.rdb_object)
+
+    def execute(self, class_, key, rdb_object, **kw):
+	class_.key = key
+	class_.rdb_object = rdb_object
+	return True

Added: Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/interfaces.py
===================================================================
--- Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/interfaces.py	                        (rev 0)
+++ Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/interfaces.py	2008-08-25 13:05:09 UTC (rev 90203)
@@ -0,0 +1,24 @@
+from grok.interfaces import IApplication
+from zope.app.container.interfaces import IReadContainer
+
+class IAppRoot(IApplication, IReadContainer):
+
+    def getStore(self):
+	""" Return the default store megrok.rdb.store """
+
+    def add(self):
+	""" Add an object to the default store """
+
+    def __delitem__(self, name):
+	""" Delets the object with the pk-key name """
+
+    def traverse(self, name):
+	""" Traverses to db-objects using primary_key = name
+	    as condition
+	"""
+
+    def filter(self, *args, **kwargs):
+	""" Add kw arguments to that method this will turn 
+	    the keywords in a where clause. You will get an
+	    storm ResultSet as result.
+	"""

Added: Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/meta.zcml
===================================================================
--- Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/meta.zcml	                        (rev 0)
+++ Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/meta.zcml	2008-08-25 13:05:09 UTC (rev 90203)
@@ -0,0 +1,12 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:meta="http://namespaces.zope.org/meta"
+    xmlns:grok="http://namespaces.zope.org/grok">
+
+  <include package="grok" />
+  <include package="grok" file="meta.zcml"/>
+  <include package="storm.zope" />
+  <include package="grokcore.component" file="meta.zcml" />
+  <grok:grok package=".grokker" />
+
+</configure>

Added: Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/tests/__init__.py
===================================================================
--- Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/tests/__init__.py	                        (rev 0)
+++ Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/tests/__init__.py	2008-08-25 13:05:09 UTC (rev 90203)
@@ -0,0 +1,8 @@
+import os.path
+import megrok.storm
+from zope.app.testing.functional import ZCMLLayer
+
+ftesting_zcml = os.path.join(os.path.dirname(megrok.storm.__file__),
+                             'ftesting.zcml')
+FunctionalLayer = ZCMLLayer(ftesting_zcml, __name__, 'FunctionalLayer',
+                            allow_teardown=True)

Added: Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/tests/helper.py
===================================================================
--- Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/tests/helper.py	                        (rev 0)
+++ Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/tests/helper.py	2008-08-25 13:05:09 UTC (rev 90203)
@@ -0,0 +1,7 @@
+from storm.locals import *
+
+class Person(object):
+    __storm_table__ = "person"
+
+    name = Unicode(primary=True)
+    age = Int()

Added: Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/tests/test_functional.py
===================================================================
--- Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/tests/test_functional.py	                        (rev 0)
+++ Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/tests/test_functional.py	2008-08-25 13:05:09 UTC (rev 90203)
@@ -0,0 +1,26 @@
+"""
+Let's create a Mammoth object in the root folder so we can access
+views through the publisher:
+
+  >>> from zope.app.testing.functional import getRootFolder
+  >>> root = getRootFolder()
+  >>> root['manfred'] = Mammoth()
+
+As an anonymous user, we only see the unprotected menu items:
+
+  >>> from zope.testbrowser.testing import Browser
+  >>> 1 + 1
+  2
+"""
+import grok
+from zope.component import getUtility
+
+class Mammoth(grok.Model):
+    pass
+
+def test_suite():
+    from zope.testing import doctest
+    from megrok.storm.tests import FunctionalLayer
+    suite = doctest.DocTestSuite()
+    suite.layer = FunctionalLayer
+    return suite

Added: Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/tests/test_storm.py
===================================================================
--- Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/tests/test_storm.py	                        (rev 0)
+++ Sandbox/cklinger/megrok.storm/trunk/src/megrok/storm/tests/test_storm.py	2008-08-25 13:05:09 UTC (rev 90203)
@@ -0,0 +1,163 @@
+"""
+  >>> from zope.component import getUtility
+  >>> from zope.app.publisher.interfaces.browser import IBrowserMenu
+  >>> from zope.publisher.browser import TestRequest
+  >>> from storm.zope.interfaces import IZStorm
+
+  Stores
+  ------
+
+  Get the named Store mydb
+
+  >>> getUtility(IZStorm).get('mydb')
+  <storm.store.Store object at ...>
+
+  Get the default store megrok.storm.store
+
+  >>> store = getUtility(IZStorm).get('megrok.storm.store')
+  >>> store
+  <storm.store.Store object at ...>
+
+  Add a simple Table in the default store
+
+  >>> store.execute("CREATE TABLE person (name VARCHAR(100), age Int(10))", noresult=True)
+  >>> store.commit()
+
+  The AppRoot for megrok.storm Applications 
+  -----------------------------------------
+
+  Setting up an Application
+
+  >>> app = Application()
+  >>> IAppRoot.providedBy(app)
+  True
+
+  >>> megrok.storm.directive.key.bind().get(app)
+  'name'
+
+  >>> megrok.storm.directive.rdb_object.bind().get(app)
+  <class 'megrok.storm.tests.helper.Person'>
+
+  The megrok.storm.AppRoot acts like a container
+  ----------------------------------------------
+
+  We can iterate over the megrok.storm.AppRoot like a container
+
+  >>> [x for x in app]
+  []
+
+  We can also look at the len of our app
+  
+  >>> len(app)
+  0
+
+  We can add Person objects to the app_root
+  
+  >>> joe = Person()
+  >>> joe.name=u"Joe"
+  >>> joe.age=35
+  >>> joe
+  <megrok.storm.tests.helper.Person...>
+  >>> app[u"joe"] = joe
+
+  Now the len of our application should be one
+
+  >>> len(app)
+  1
+
+  and we should find our object if we iterate about the app
+
+  >>> [x for x in app]
+  [<megrok.storm.tests.helper.Person object at ...>]
+
+  We get the object with the container api
+
+  >>> obj = app[u'joe']
+  >>> obj
+  <megrok.storm.tests.helper.Person...>
+
+  >>> obj.name
+  u'joe'
+  >>> obj.age
+  35
+
+  >>> app.keys()
+  [u'joe']
+
+  >>> app.items()
+  [<megrok.storm.tests.helper.Person object at ...>]
+
+  Of course we can use our store to use pure SQL
+
+  >>> obj = store.execute('select count(name) from person')
+  >>> obj
+  <storm.databases.sqlite.SQLiteResult object at ...>
+  
+  >>> obj.get_one()
+  (1,)
+
+  The filer api
+  -------------
+
+  First we create a second entry in the database
+
+  >>> chris = Person()
+  >>> chris.name = u"chris"
+  >>> chris.age = 10
+  >>> app.add(chris)
+
+  We should find one chris
+
+  >>> result = app.filter(name = u'chris')
+  >>> result.count()
+  1
+
+  and we should find 0 tom´s
+
+  >>> result = app.filter(name = u'tom')
+  >>> result.count()
+  0
+
+  we schould find two objects which age > 0
+  
+  >>> result = app.filter('age' > 0)
+  >>> result.count()
+  2
+
+
+  Deleteing an object
+  -------------------
+
+  >>> del app[u'joe']
+  >>> len(app)
+  1
+
+"""
+import grok
+import megrok.storm
+from zope.component import getUtility
+from storm.zope.interfaces import IZStorm
+from megrok.storm.tests.helper import Person
+from megrok.storm.interfaces import IAppRoot
+
+class MyDB(megrok.storm.Store):
+    """ A Store which has the name 'mydb' """
+    megrok.storm.storename('mydb')
+    megrok.storm.uri('sqlite:')
+
+class MegrokStormStore(megrok.storm.Store):
+    """ A Default Store for ORM which has the name
+        'megrok.storm.store' """
+    megrok.storm.uri('sqlite:')
+
+class Application(grok.Application, megrok.storm.AppRoot):
+    megrok.storm.key('name')
+    megrok.storm.rdb_object(Person)
+
+
+def test_suite():
+    from zope.testing import doctest
+    from megrok.storm.tests import FunctionalLayer
+    suite = doctest.DocTestSuite(optionflags=doctest.ELLIPSIS)
+    suite.layer = FunctionalLayer
+    return suite

Added: Sandbox/cklinger/megrok.storm/trunk/versions.cfg
===================================================================
--- Sandbox/cklinger/megrok.storm/trunk/versions.cfg	                        (rev 0)
+++ Sandbox/cklinger/megrok.storm/trunk/versions.cfg	2008-08-25 13:05:09 UTC (rev 90203)
@@ -0,0 +1,107 @@
+[versions]
+grok = 0.13
+ClientForm = 0.2.7
+Pygments = 0.8.1
+RestrictedPython = 3.4.2
+ZConfig = 2.5.1
+ZODB3 = 3.8
+docutils = 0.4
+martian = 0.10
+grokcore.component = 1.4
+mechanize = 0.1.7b
+pytz = 2007k
+simplejson = 1.7.1
+z3c.autoinclude = 0.2.2
+z3c.flashmessage = 1.0
+z3c.testsetup = 0.2.1
+zc.catalog = 1.2
+zdaemon = 2.0.1
+zodbcode = 3.4
+zope.annotation = 3.4
+zope.app.apidoc = 3.4.3
+zope.app.applicationcontrol = 3.4.1
+zope.app.appsetup = 3.4.1
+zope.app.authentication = 3.4.1
+zope.app.basicskin = 3.4
+zope.app.broken = 3.4
+zope.app.catalog = 3.5.1
+zope.app.component = 3.4.1
+zope.app.container = 3.5.3
+zope.app.content = 3.4
+zope.app.debug = 3.4
+zope.app.dependable = 3.4
+zope.app.error = 3.5.1
+zope.app.exception = 3.4.1
+zope.app.file = 3.4.2
+zope.app.folder = 3.4
+zope.app.form = 3.4.1
+zope.app.generations = 3.4.1
+zope.app.http = 3.4.1
+zope.app.i18n = 3.4.4
+zope.app.interface = 3.4
+zope.app.intid = 3.4.1
+zope.app.keyreference = 3.4.1
+zope.app.locales = 3.4.1
+zope.app.onlinehelp = 3.4.1
+zope.app.pagetemplate = 3.4
+zope.app.preference = 3.4.1
+zope.app.principalannotation = 3.4
+zope.app.publication = 3.4.3
+zope.app.publisher = 3.4.1
+zope.app.renderer = 3.4
+zope.app.rotterdam = 3.4.1
+zope.app.schema = 3.4
+zope.app.security = 3.4
+zope.app.securitypolicy = 3.4.6
+zope.app.server = 3.4
+zope.app.session = 3.5.1
+zope.app.skins = 3.4
+zope.app.testing = 3.4.1
+zope.app.tree = 3.4
+zope.app.twisted = 3.4
+zope.app.wsgi = 3.4
+zope.app.zapi = 3.4
+zope.app.zcmlfiles = 3.4.3
+zope.app.zopeappgenerations = 3.4
+zope.cachedescriptors = 3.4
+zope.component = 3.4
+zope.configuration = 3.4
+zope.contentprovider = 3.4
+zope.contenttype = 3.4
+zope.copypastemove = 3.4
+zope.datetime = 3.4
+zope.deferredimport = 3.4
+zope.deprecation = 3.4
+zope.dottedname = 3.4.2
+zope.dublincore = 3.4
+zope.error = 3.5.1
+zope.event = 3.4
+zope.exceptions = 3.4
+zope.filerepresentation = 3.4
+zope.formlib = 3.4
+zope.hookable = 3.4
+zope.i18n = 3.4
+zope.i18nmessageid = 3.4.3
+zope.index = 3.4.1
+zope.interface = 3.4.1
+zope.lifecycleevent = 3.4
+zope.location = 3.4
+zope.minmax = 1.1
+zope.modulealias = 3.4
+zope.pagetemplate = 3.4
+zope.proxy = 3.4
+zope.publisher = 3.4.2
+zope.schema = 3.4
+zope.security = 3.4
+zope.securitypolicy = 3.4
+zope.server = 3.4.1
+zope.session = 3.4.1
+zope.size = 3.4
+zope.structuredtext = 3.4
+zope.tal = 3.4.1
+zope.tales = 3.4
+zope.testbrowser = 3.4.2
+zope.testing = 3.5.1
+zope.thread = 3.4
+zope.traversing = 3.4.0
+zope.viewlet = 3.4.2



More information about the Checkins mailing list