Author: reebalazs
Date: Sun Dec 30 15:41:02 2007
New Revision: 50203

Added:
   kukit/kss.demo/branch/finish-closures/docs/
      - copied from r50168, kukit/kss.demo/trunk/docs/
   kukit/kss.demo/branch/finish-closures/kss/demo/browser/kss_demo_suite.pt
      - copied unchanged from r50168, 
kukit/kss.demo/trunk/kss/demo/browser/kss_demo_suite.pt
   kukit/kss.demo/branch/finish-closures/kss/demo/browser/setDevMode.html
      - copied unchanged from r50168, 
kukit/kss.demo/trunk/kss/demo/browser/setDevMode.html
   kukit/kss.demo/branch/finish-closures/kss/demo/browser/setProdMode.html
      - copied unchanged from r50168, 
kukit/kss.demo/trunk/kss/demo/browser/setProdMode.html
   kukit/kss.demo/branch/finish-closures/kss/demo/selenium_utils/builder.py
      - copied unchanged from r50168, 
kukit/kss.demo/trunk/kss/demo/selenium_utils/builder.py
Removed:
   kukit/kss.demo/branch/finish-closures/kss/demo/docs/
Modified:
   kukit/kss.demo/branch/finish-closures/docs/HISTORY.txt
   kukit/kss.demo/branch/finish-closures/docs/INSTALL.txt
   kukit/kss.demo/branch/finish-closures/docs/LICENSE.GPL
   kukit/kss.demo/branch/finish-closures/docs/LICENSE.txt
   kukit/kss.demo/branch/finish-closures/kss/demo/browser/configure.zcml
   kukit/kss.demo/branch/finish-closures/kss/demo/browser/kss_demo_index.pt
   kukit/kss.demo/branch/finish-closures/kss/demo/browser/registry.py
   kukit/kss.demo/branch/finish-closures/kss/demo/interfaces.py
   kukit/kss.demo/branch/finish-closures/kss/demo/meta.zcml
   kukit/kss.demo/branch/finish-closures/kss/demo/registry.py
Log:
Merge changes from trunk -r49476:50168
This includes:
- usage of the registry for demos and selenium directories
- allowing to go to selenium directly from the demo page

Modified: kukit/kss.demo/branch/finish-closures/docs/HISTORY.txt
==============================================================================

Modified: kukit/kss.demo/branch/finish-closures/docs/INSTALL.txt
==============================================================================

Modified: kukit/kss.demo/branch/finish-closures/docs/LICENSE.GPL
==============================================================================

Modified: kukit/kss.demo/branch/finish-closures/docs/LICENSE.txt
==============================================================================

Modified: kukit/kss.demo/branch/finish-closures/kss/demo/browser/configure.zcml
==============================================================================
--- kukit/kss.demo/branch/finish-closures/kss/demo/browser/configure.zcml       
(original)
+++ kukit/kss.demo/branch/finish-closures/kss/demo/browser/configure.zcml       
Sun Dec 30 15:41:02 2007
@@ -55,10 +55,24 @@
 
   <!-- View for accessing the utility -->
   <page
-    for="*"
+    for="kss.demo.interfaces.ISimpleContent"
     name="kss_demo_registry"
     class=".registry.KSSDemoRegistryView"
-    allowed_attributes="getSortedDemos getDemoGroups"
+    allowed_attributes="getSortedDemos getDemoGroups getSeleniumTests"
+    permission="zope.View"
+    />
+  <page
+    for="kss.demo.interfaces.ISimpleContent"
+    name="resource"
+    class=".registry.KSSDemoRegistryView"
+    attribute="getSeleniumTestResource"
+    permission="zope.View"
+    />
+  <page
+    for="kss.demo.interfaces.ISimpleContent"
+    name="zuite.html"
+    class=".registry.KSSDemoRegistryView"
+    attribute="getZuiteHomePage"
     permission="zope.View"
     />
 
@@ -76,5 +90,29 @@
     permission="demo.Manager"
     />
 
+  <!-- Resources for automated selenium tests -->
+  
+  <page
+      for="kss.demo.interfaces.ISimpleContent"
+      template="kss_demo_suite.pt"
+      name="suite.html"
+      permission="zope.View"
+      />
+
+  <page
+      for="kss.demo.interfaces.ISimpleContent"
+      template="setDevMode.html"
+      name="setDevMode.html"
+      permission="zope.View"
+      />
+
+  <page
+      for="kss.demo.interfaces.ISimpleContent"
+      template="setProdMode.html"
+      name="setProdMode.html"
+      permission="zope.View"
+      />
+
+
 </configure>
 

Modified: 
kukit/kss.demo/branch/finish-closures/kss/demo/browser/kss_demo_index.pt
==============================================================================
--- kukit/kss.demo/branch/finish-closures/kss/demo/browser/kss_demo_index.pt    
(original)
+++ kukit/kss.demo/branch/finish-closures/kss/demo/browser/kss_demo_index.pt    
Sun Dec 30 15:41:02 2007
@@ -8,10 +8,20 @@
   <body>
     <h1>KSS demos</h1>
     <p metal:use-macro="context/@@body_macros/kss_mode">Kss mode</p>
-    <h2>Unit tests</h2>
+    <h2>Tests</h2>
     <ul style="background-color:#E0E0C0;">
-     <li><a href="@@kukittestsuite">Run all tests</a></li>
+     <li><a href="@@kukittestsuite">Run all ECMA unittests</a></li>
+     <li>Link to Zelenium object:
+       <form tal:attributes="action string:${context/absolute_url}/zuite.html">
+          <input type="text" name="path" value="zuite" />
+          <input type="submit" name="submit" value="Run all Selenium tests" />
+       </form>
+      </li>
     </ul>
+    <p class="help">
+      Zelenium object link must be an absolute path from the domain root, 
+      or a relative path from the demo SimpleContent's parent.
+    </p>
       <tal:groups repeat="demo_group 
context/@@kss_demo_registry/getDemoGroups">
         <tal:plugin condition="python:demo_group['is_first_plugin_namespace'] 
and demo_group['plugin_namespace']==''">
              <h2>Core plugin</h2>

Modified: kukit/kss.demo/branch/finish-closures/kss/demo/browser/registry.py
==============================================================================
--- kukit/kss.demo/branch/finish-closures/kss/demo/browser/registry.py  
(original)
+++ kukit/kss.demo/branch/finish-closures/kss/demo/browser/registry.py  Sun Dec 
30 15:41:02 2007
@@ -4,6 +4,8 @@
 from zope.publisher.interfaces import NotFound
 from zope.component import getUtility
 from zope.interface import implements
+from kss.demo.selenium_utils.builder import cookSeleniumTests
+import os.path
 try:
     from Products.Five import BrowserView
     BrowserView         # make pyflakes happy
@@ -54,6 +56,57 @@
             group.append(demo)
         return demo_groups
 
+    @staticmethod
+    def _filename_to_title(filename):
+        """Automatic conversion of filename to readable title"""
+        if filename.lower().endswith('.html'):
+            filename = filename[:-5]
+        elif filename.lower().endswith('.htm'):
+            filename = filename[:-4]
+        words = os.path.basename(filename).split('_')
+        result = ' '.join([word.capitalize() for word in words])
+        return result
+
+    @staticmethod
+    def _filename_to_href(filename):
+        """Automatic conversion of filename to publication href"""
+        return "@@resource?filename=%s" % (filename, )
+
+    def getSeleniumTests(self):
+        """Get selenium tests annotated with title and href."""
+        return [dict(
+                    href = self._filename_to_href(filename),
+                    title=self._filename_to_title(filename),
+                    )
+                    for filename in self.selenium_test_filenames]
+
+    @property
+    def selenium_test_filenames(self):
+        """A cached representation of all filenames."""
+        try:
+            return self._cooked_selenium_test_filenames
+        except AttributeError:
+            registry = getUtility(IKSSDemoRegistry)
+            self._cooked_selenium_test_filenames =  filenames = \
+                    registry.selenium_tests
+            return filenames
+
+    def getSeleniumTestResource(self, filename):
+        """Return the html resource, whose absolute filename is given,"""
+        # First of all, let's check if this is one of our file.
+        # (Refuse otherwise - we don't want access to all files on the server.)
+        if filename not in self.selenium_test_filenames:
+            raise Exception, "Nonexistent resource"
+        # Return the file's content.
+        self.request.response.setHeader('Content-type', 
'text/html;charset=utf-8')
+        return file(filename).read()
+
+    def getZuiteHomePage(self, path):
+        """Redirects to the Zuite home page, Zuite object is found from 
path."""
+        zuite = self.context.aq_inner.aq_parent.restrictedTraverse(path)
+        html = "%s/core/TestRunner.html?test=%s/suite.html" % 
(zuite.absolute_url(), self.context.absolute_url())
+        return self.request.response.redirect(html)
+
 class KSSDemoRegistryAdminView(BrowserView):
     """Things that only admin should do"""
     implements(IBrowserPublisher)
@@ -90,5 +143,8 @@
         of kss.demo.selenium_utils .
         """
         registry = getUtility(IKSSDemoRegistry)
-        registry.cookSeleniumTests()
-        return "Selenium tests cooked OK. (%i)" % 
(len(registry.selenium_tests), )
+        filenames = registry.selenium_tests
+        # Cook them. This will create seltest_all.py. 
+        cookSeleniumTests(filenames)
+        # We are done.
+        return "Selenium tests cooked OK. (%i)" % (len(filenames), )

Modified: kukit/kss.demo/branch/finish-closures/kss/demo/interfaces.py
==============================================================================
--- kukit/kss.demo/branch/finish-closures/kss/demo/interfaces.py        
(original)
+++ kukit/kss.demo/branch/finish-closures/kss/demo/interfaces.py        Sun Dec 
30 15:41:02 2007
@@ -126,13 +126,6 @@
     def unregisterSeleniumTestFile(test_filename):
         """Unregister the given test directory."""
 
-    def cookSeleniumTests():
-        """Cook selenium tests
-
-        The *.html tests from each plugin are produced
-        into the file seltest_all.pty in the directory
-        of kss.demo.selenium_utils .
-        """
 
 # --
 # Event that gets redispatched, for allowing

Modified: kukit/kss.demo/branch/finish-closures/kss/demo/meta.zcml
==============================================================================
--- kukit/kss.demo/branch/finish-closures/kss/demo/meta.zcml    (original)
+++ kukit/kss.demo/branch/finish-closures/kss/demo/meta.zcml    Sun Dec 30 
15:41:02 2007
@@ -1,6 +1,11 @@
 <configure
      xmlns="http://namespaces.zope.org/meta";>
 
+   <!-- provide a feature that can be used for plugins
+        to check if we are on this version:
+   -->
+   <provides feature="kss_demo_version_1_2" />
+
    <include package=".configfeature" file="meta.zcml"/>
 
 </configure>

Modified: kukit/kss.demo/branch/finish-closures/kss/demo/registry.py
==============================================================================
--- kukit/kss.demo/branch/finish-closures/kss/demo/registry.py  (original)
+++ kukit/kss.demo/branch/finish-closures/kss/demo/registry.py  Sun Dec 30 
15:41:02 2007
@@ -16,25 +16,12 @@
     IRegistered,
     IUnregistered,
     )
-import sys, os, re, textwrap
-from elementtree import HTMLTreeBuilder
-from string import Template
-import kss.demo.selenium_utils
-# shut the mouth of pyflakes
-kss.demo.selenium_utils
+from kss.demo.selenium_utils.builder import getSeleniumTestsFromSuite
 
 # --
 # Registry implementation for use with Zope
 # --
 
-def getRootDirOfModule(module_name):
-    return os.path.dirname(sys.modules[module_name].__file__)
-
-def getRootDirOfClass(cls):
-    return getRootDirOfModule(cls.__module__)
-
-def getRootDirOfInstance(obj):
-    return getRootDirOfClass(obj.__class__)
 
 # Create a mesh of provided interfaces
 # This is needed, because an utility must have a single interface.
@@ -76,6 +63,8 @@
         for name, plugin in site.getUtilitiesFor(IKSSDemoResource):
             for demo in plugin.demos:
                 self.registerDemo(demo)
+            for test_filename in self._getSeleniumTestsFromPlugin(plugin):
+                self.registerSeleniumTestFile(test_filename)
 
     @adapter(IKSSDemoResource, IUtilityRegistration, IRegistered, 
IKSSDemoRegistrationEvent)
     def registerDemosFromPlugin(self, plugin, registration=None, event=None, 
new_event=None):
@@ -142,13 +131,9 @@
     @staticmethod
     def _getSeleniumTestsFromPlugin(plugin):
         test_filenames = []
-        root_dir = getRootDirOfInstance(plugin)
-        for selenium_test_directory in plugin.selenium_tests:
-            tests_root_dir = os.path.join(root_dir, 
selenium_test_directory.test_directory)
-            for test_filename in os.listdir(tests_root_dir):
-                if test_filename.lower().endswith('.html') or \
-                        test_filename.endswith('.htm'):
-                    test_filenames.append(os.path.join(tests_root_dir, 
test_filename))
+        for selenium_test_suite in plugin.selenium_tests:
+            filenames = getSeleniumTestsFromSuite(plugin,  selenium_test_suite)
+            test_filenames.extend(filenames)
         return test_filenames
 
     @adapter(IKSSSeleniumTestResource, IUtilityRegistration, IRegistered, 
IKSSDemoRegistrationEvent)
@@ -178,77 +163,3 @@
             del self.selenium_tests[test_filename]
         except KeyError:
             raise Exception, 'The selenium test for %s is yet unregistered. 
Cannot remove.' % (test_filename, )
-
-    template = Template(textwrap.dedent('''\
-            from seleniumtestcase import SeleniumTestCase
-            import unittest, time
-
-            class seltest_$testname(SeleniumTestCase):
-
-            $tests
-
-            def test_suite():
-                return unittest.makeSuite(seltest_$testname)
-
-            if __name__ == "__main__":
-                unittest.main()
-            '''))
-
-    variable_regexp = re.compile('\$\{(?P<varname>\w*)\}')
-    @classmethod
-    def formatcommand(cls, command, *args):
-        if not command:
-            return '' # Change this to raise an exception?
-
-        arguments = []
-        for arg in args:
-            if not arg:
-                continue
-            matched = cls.variable_regexp.match(arg)
-            if matched is None:
-                arguments.append('"%s"'%arg)
-            else:
-                arguments.append("self.getVar('%s')"%matched.group('varname'))
-        return 'self.%s(%s)' % (command, ', '.join(arguments))
-
-    def cookSeleniumTests(self):
-        """Cook selenium tests
-
-        The *.html tests from each plugin are produced
-        into the file seltest_all.pty in the directory
-        of kss.demo.selenium_utils .
-        """
-        # Try to open the file for writing.
-        output_dir =  getRootDirOfModule('kss.demo.selenium_utils')
-        output_filename = os.path.join(output_dir, 'seltest_all.py')
-        try:
-            f = open(output_filename, 'wb')
-        except IOError, exc:
-            raise IOError, ('Cannot open file "%s" for writing. '
-                            'Make sure zope process has write access in 
directory. '
-                            '["%s"]') \
-                            % (output_filename, exc)
-
-        htmlparser = HTMLTreeBuilder.TreeBuilder()
-        tests = []
-        for filename in self.selenium_tests:
-            tree = HTMLTreeBuilder.parse(filename)
-            root = tree.getroot()
-
-            try:
-                testname = root.find('.//title').text
-            except AttributeError:
-                continue
-            commands = []
-            for row in root.findall('.//tbody/tr'):
-                commands.append(self.formatcommand(*[td.text for td in 
row.findall('td')]))
-
-            testfilename = 'seltest_%s.py' % testname
-            testbody='    def test_%s(self):\n'%testname+' '*8+'\n        
'.join(commands)+'\n'
-            tests.append(testbody)
-
-        f.write(self.template.substitute(dict(
-            testname=testname,
-            tests='\n'.join(tests),
-            )))
-        f.close()
_______________________________________________
Kukit-checkins mailing list
[email protected]
http://codespeak.net/mailman/listinfo/kukit-checkins

Reply via email to