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