From jvloothuis at codespeak.net Thu May 1 18:00:08 2008 From: jvloothuis at codespeak.net (jvloothuis at codespeak.net) Date: Thu, 1 May 2008 18:00:08 +0200 (CEST) Subject: [KSS-checkins] r54307 - kukit/kss.base/trunk/src/kss/base Message-ID: <20080501160008.123F616856F@codespeak.net> Author: jvloothuis Date: Thu May 1 18:00:07 2008 New Revision: 54307 Modified: kukit/kss.base/trunk/src/kss/base/commands.py kukit/kss.base/trunk/src/kss/base/commands.txt Log: Added support for BeautifulSoup, this can be toggled either on or off. It will automatically run BeautifulSoup on any HTML or XML values passed to the client if it is turned on (and BeautifulSoup is available). Modified: kukit/kss.base/trunk/src/kss/base/commands.py ============================================================================== --- kukit/kss.base/trunk/src/kss/base/commands.py (original) +++ kukit/kss.base/trunk/src/kss/base/commands.py Thu May 1 18:00:07 2008 @@ -1,7 +1,16 @@ from xml.sax.saxutils import quoteattr, escape + +try: + from BeautifulSoup import BeautifulSoup + from BeautifulSoup import BeautifulStoneSoup +except ImportError: # no soup support + BeautifulSoup = BeautifulStoneSoup = lambda v: v + from kss.base.registry import command_set_registry from kss.base.selectors import Selector +soup_enabled = False + kss_response_header = ''' ''' @@ -28,10 +37,16 @@ return "%s('%s')" % (self.__class__.__name__, self.value) class htmldata(cdatadata): - pass + def __init__(self, value): + if soup_enabled: + value = str(BeautifulSoup(value)) + super(htmldata, self).__init__(value) class xmldata(cdatadata): - pass + def __init__(self, value): + if soup_enabled: + value = str(BeautifulStoneSoup(value)) + super(xmldata, self).__init__(value) class KSSCommands(object): '''Command renderer for creating KSS responses''' Modified: kukit/kss.base/trunk/src/kss/base/commands.txt ============================================================================== --- kukit/kss.base/trunk/src/kss/base/commands.txt (original) +++ kukit/kss.base/trunk/src/kss/base/commands.txt Thu May 1 18:00:07 2008 @@ -225,3 +225,39 @@ Let us clean up. >>> command_set_registry.unregister('core') + + +Soup support +============ + +If you are outputting faulty HTML you might want to automatically fix +it up. This can be done with a library called BeautifulSoup. The +command system has code for integration with BeautifulSoup +automatically. This means that all calls to replace HTML or other +commands which manipulate HTML / XML use BeautifulSoup on the data. + +By default the system is turned off. To enable it you can set a flag. + + >>> from kss.base import commands + >>> commands.soup_enabled = True + +The XML and HTML now use BeautifulSoup. To demonstrate this we shall +load them and show how this works. + + >>> from kss.base.commands import htmldata, xmldata + + >>> htmldata('

some text') + htmldata('

some text

') + + >>> xmldata('sdfsdfdsf') + xmldata('sdfsdfdsf') + +If we disable soup mode it should no longer change our HTML and XML. + + >>> commands.soup_enabled = False + >>> htmldata('

some text') + htmldata('

some text') + + >>> xmldata('sdfsdfdsf') + xmldata('sdfsdfdsf') + From jvloothuis at codespeak.net Fri May 2 10:20:09 2008 From: jvloothuis at codespeak.net (jvloothuis at codespeak.net) Date: Fri, 2 May 2008 10:20:09 +0200 (CEST) Subject: [KSS-checkins] r54314 - in kukit/kss.core/trunk/kss/core/plugins/core/demo: . selenium_tests Message-ID: <20080502082009.A393D4980FC@codespeak.net> Author: jvloothuis Date: Fri May 2 10:20:09 2008 New Revision: 54314 Modified: kukit/kss.core/trunk/kss/core/plugins/core/demo/configure.zcml kukit/kss.core/trunk/kss/core/plugins/core/demo/demoview.py kukit/kss.core/trunk/kss/core/plugins/core/demo/protocol.kss kukit/kss.core/trunk/kss/core/plugins/core/demo/protocol.pt kukit/kss.core/trunk/kss/core/plugins/core/demo/selenium_tests/protocol.html Log: Added tests for named entities to make sure both kss.core and kss.base work with these properly (especially in IE). Modified: kukit/kss.core/trunk/kss/core/plugins/core/demo/configure.zcml ============================================================================== --- kukit/kss.core/trunk/kss/core/plugins/core/demo/configure.zcml (original) +++ kukit/kss.core/trunk/kss/core/plugins/core/demo/configure.zcml Fri May 2 10:20:09 2008 @@ -545,5 +545,21 @@ permission="zope.View" /> + + + + Modified: kukit/kss.core/trunk/kss/core/plugins/core/demo/demoview.py ============================================================================== --- kukit/kss.core/trunk/kss/core/plugins/core/demo/demoview.py (original) +++ kukit/kss.core/trunk/kss/core/plugins/core/demo/demoview.py Fri May 2 10:20:09 2008 @@ -266,3 +266,12 @@ '#character-attr-output', 'title', 'before ]]> after') return self.render() + def protocolAgrave(self): + self.getCommandSet('core').replaceInnerHTML( + '#named-entity-output', 'à') + return self.render() + + def protocolEacute(self): + self.getCommandSet('core').replaceInnerHTML( + '#named-entity-output', 'é') + return self.render() Modified: kukit/kss.core/trunk/kss/core/plugins/core/demo/protocol.kss ============================================================================== --- kukit/kss.core/trunk/kss/core/plugins/core/demo/protocol.kss (original) +++ kukit/kss.core/trunk/kss/core/plugins/core/demo/protocol.kss Fri May 2 10:20:09 2008 @@ -56,4 +56,14 @@ #attr-endcdata:click { evt-click-preventdefault: true; action-server: protocolAttributeENDCDATA; +} + +#agrave:click { + evt-click-preventdefault: true; + action-server: protocolAgrave; +} + +#eacute:click { + evt-click-preventdefault: true; + action-server: protocolEacute; } \ No newline at end of file Modified: kukit/kss.core/trunk/kss/core/plugins/core/demo/protocol.pt ============================================================================== --- kukit/kss.core/trunk/kss/core/plugins/core/demo/protocol.pt (original) +++ kukit/kss.core/trunk/kss/core/plugins/core/demo/protocol.pt Fri May 2 10:20:09 2008 @@ -86,6 +86,20 @@ Link which get a title attribute + +

Named entities

+

Named entities should work. The next example demonstrates that + the server can send data with named entities.

+ +
    +
  1. Command with an à
  2. +
  3. Command with a é
  4. +
+ +
+ test data will appear here +
+ Modified: kukit/kss.core/trunk/kss/core/plugins/core/demo/selenium_tests/protocol.html ============================================================================== --- kukit/kss.core/trunk/kss/core/plugins/core/demo/selenium_tests/protocol.html (original) +++ kukit/kss.core/trunk/kss/core/plugins/core/demo/selenium_tests/protocol.html Fri May 2 10:20:09 2008 @@ -163,6 +163,26 @@ character-attr-output at title before ]]> after + + click + agrave + + + + waitForText + named-entity-output + à + + + click + eacute + + + + waitForText + named-entity-output + é + From el_gringo at codespeak.net Fri May 2 15:08:11 2008 From: el_gringo at codespeak.net (el_gringo at codespeak.net) Date: Fri, 2 May 2008 15:08:11 +0200 (CEST) Subject: [KSS-checkins] r54322 - kukit/kukit.js/branch/el_gringo-memory-leaks-squeeze/kukit Message-ID: <20080502130811.3E56B169E4B@codespeak.net> Author: el_gringo Date: Fri May 2 15:08:10 2008 New Revision: 54322 Modified: kukit/kukit.js/branch/el_gringo-memory-leaks-squeeze/kukit/eventreg.js kukit/kukit.js/branch/el_gringo-memory-leaks-squeeze/kukit/forms.js kukit/kukit.js/branch/el_gringo-memory-leaks-squeeze/kukit/plugin.js kukit/kukit.js/branch/el_gringo-memory-leaks-squeeze/kukit/resourcedata.js kukit/kukit.js/branch/el_gringo-memory-leaks-squeeze/kukit/utils.js Log: fixes some memory leaks on IE. I've moved nodeHashes method to utils.js for dependences reason. The main goal is to stores events and unregister them when unloading. There's still memory leaks remaining, we also should unregister events when removing / replacing nodes. I've used sIEve to detect leaks: Modified: kukit/kukit.js/branch/el_gringo-memory-leaks-squeeze/kukit/eventreg.js ============================================================================== --- kukit/kukit.js/branch/el_gringo-memory-leaks-squeeze/kukit/eventreg.js (original) +++ kukit/kukit.js/branch/el_gringo-memory-leaks-squeeze/kukit/eventreg.js Fri May 2 15:08:10 2008 @@ -886,7 +886,7 @@ // name and nodeHash are for speedup. if (typeof(nodeHash) == 'undefined') { name = oper.eventRule.kssSelector.name; - nodeHash = kukit.rd.hashNode(oper.node); + nodeHash = kukit.ut.hashNode(oper.node); } var rulesPerName = info[name]; if (typeof(rulesPerName) == 'undefined') { @@ -903,7 +903,7 @@ this.bindOper = function (oper) { // Marks binding between binder, eventName, node. var name = oper.eventRule.kssSelector.name; - var nodeHash = kukit.rd.hashNode(oper.node); + var nodeHash = kukit.ut.hashNode(oper.node); var rulesPerName = this.checkOperBindable(oper, name, nodeHash); rulesPerName[nodeHash] = oper; // also store per node info @@ -946,7 +946,7 @@ if (typeof(rulesPerName) == 'undefined') { return null; } - var nodeHash = kukit.rd.hashNode(node); + var nodeHash = kukit.ut.hashNode(node); var oper = rulesPerName[nodeHash]; if (typeof(oper) == 'undefined') { return null; Modified: kukit/kukit.js/branch/el_gringo-memory-leaks-squeeze/kukit/forms.js ============================================================================== --- kukit/kukit.js/branch/el_gringo-memory-leaks-squeeze/kukit/forms.js (original) +++ kukit/kukit.js/branch/el_gringo-memory-leaks-squeeze/kukit/forms.js Fri May 2 15:08:10 2008 @@ -312,7 +312,7 @@ }; this.register = function(node, editor) { - var hash = kukit.rd.hashNode(node); + var hash = kukit.ut.hashNode(node); if (typeof(this.editors[hash]) != 'undefined') { ;;; kukit.E = 'Double registration of editor update on node.'; throw new Error(kukit.E); @@ -324,7 +324,7 @@ }; this.doUpdate = function(node) { - var hash = kukit.rd.hashNode(node); + var hash = kukit.ut.hashNode(node); var editor = this.editors[hash]; if (typeof(editor) != 'undefined') { editor.doUpdate(node); Modified: kukit/kukit.js/branch/el_gringo-memory-leaks-squeeze/kukit/plugin.js ============================================================================== --- kukit/kukit.js/branch/el_gringo-memory-leaks-squeeze/kukit/plugin.js (original) +++ kukit/kukit.js/branch/el_gringo-memory-leaks-squeeze/kukit/plugin.js Fri May 2 15:08:10 2008 @@ -368,7 +368,7 @@ phase = 1; } else { // get the phase from the node - phase = oper.node._kukitMark; + phase = kukit.ut.data(oper.node, 'kukitMark'); } if (phase == 1 && ! oper.parms.initial) { ;;; var msg = 'EventRule #' + oper.eventRule.getIndex() + ' mergeId ['; @@ -453,7 +453,7 @@ kukit.engine.bindScheduler.addPost(func_to_bind, remark); } if (iloadoper) { - var phase = iloadoper.node._kukitMark; + var phase = kukit.ut.data(iloadoper.node, 'kukitMark'); // For phase 2 we need to execute posponed, for phase1 immediately. // XXX it would be better not need this and do always postponed. if (phase == 2 || (phase == 1 && kukit.engine.initializedOnDOMLoad)) { Modified: kukit/kukit.js/branch/el_gringo-memory-leaks-squeeze/kukit/resourcedata.js ============================================================================== --- kukit/kukit.js/branch/el_gringo-memory-leaks-squeeze/kukit/resourcedata.js (original) +++ kukit/kukit.js/branch/el_gringo-memory-leaks-squeeze/kukit/resourcedata.js Fri May 2 15:08:10 2008 @@ -321,7 +321,7 @@ // XXX never rebind to any node again! // this compensates that cssQuery is returning // results out of the subtree - if (typeof(node._kukitMark) == 'undefined') { + if (typeof(kukit.ut.data(node, 'kukitMark')) == 'undefined') { ruletable.add(node, this); counter += 1; } @@ -871,7 +871,7 @@ this.add = function(node, eventRule) { // look up node - var nodehash = rd.hashNode(node); + var nodehash = kukit.ut.hashNode(node); var nodeval = this.nodes[nodehash]; if (typeof(nodeval) == 'undefined') { nodeval = {'node': node, 'val': {}}; @@ -888,7 +888,7 @@ for (var nodehash in this.nodes) { var nodeval = this.nodes[nodehash]; // XXX Mark the node, disabling rebinding in a second round - nodeval.node._kukitMark = phase; + kukit.ut.data(nodeval.node, 'kukitMark', phase); for (var id in nodeval.val) { var eventRule = nodeval.val[id]; eventRule.bind(nodeval.node); @@ -907,25 +907,6 @@ this.initialize.apply(this, arguments); }; -rd.uid = 0; - -rd.hashNode = function(node) { - // It is, generally, not possible to use a node as a key. - // However we try to set this right. - // We generate an uniqueID on the node. This does not work - // on MSIE but it already has an uniqueID. - if (node == null) { - // null represents the document - return '<>'; - } - var id = node.uniqueID; - if (typeof(id) == 'undefined') { - id = rd.uid; - node.uniqueID = id; - rd.uid ++; - } - return id; -}; /* * class MethodTable Modified: kukit/kukit.js/branch/el_gringo-memory-leaks-squeeze/kukit/utils.js ============================================================================== --- kukit/kukit.js/branch/el_gringo-memory-leaks-squeeze/kukit/utils.js (original) +++ kukit/kukit.js/branch/el_gringo-memory-leaks-squeeze/kukit/utils.js Fri May 2 15:08:10 2008 @@ -564,7 +564,38 @@ /* extracted from Plone */ // cross browser function for registering event handlers +ut.cache = {}; +ut.uid = 0; +ut.data = function(node, key, value) { + var hash = ut.hashNode(node); + if (arguments.length == 3) + ut.cache[hash][key] = value; + + return ut.cache[hash][key]; +}; +ut.hashNode = function(node) { + // It is, generally, not possible to use a node as a key. + // However we try to set this right. + // We generate an uniqueID on the node. This does not work + // on MSIE but it already has an uniqueID. + if (node == null) { + // null represents the document + return '<>'; + } + var id = node.uniqueID; + if (typeof(ut.cache[id]) == 'undefined') { + if (!id) { + id = ut.uid++; + node.uniqueID = id; + } + ut.cache[id] = { node: node }; + } + return id; +}; ut.registerEventListener = function(elem, event, func) { + var events = ut.data(elem, 'events') || []; + events.push({type: event, func: func}); + ut.data(elem, 'events', events); if (elem.addEventListener) { elem.addEventListener(event, func, false); return true; @@ -576,6 +607,36 @@ return false; }; +ut.unRegisterEventListener = function(elem, event, func) { + if (elem.removeEventListener) { + elem.removeEventListener(event, func, false); + return true; + } else if (elem.detachEvent) { + var result = elem.detachEvent("on"+event, func); + return result; + } + return false; +}; + +ut.registerEventListener(window, 'unload', function() { + var t = []; + for (uid in ut.cache) { + var data = ut.cache[uid]; + var node = data.node; + data.node = null; + if (typeof(data.events) != 'undefined') + for (var i = 0;i < data.events.length;++i) { + var event = data.events[i]; + ut.unRegisterEventListener(node, event.type, event.func); + } + try { + delete node.uniqueID; + } catch(ex) {} + t.push(uid); + delete ut.cache[uid]; + } +}); + if (typeof(window) != 'undefined') { ut.registerEventListener(window, "load", kukit.bootstrap); } From jvloothuis at codespeak.net Fri May 2 17:04:48 2008 From: jvloothuis at codespeak.net (jvloothuis at codespeak.net) Date: Fri, 2 May 2008 17:04:48 +0200 (CEST) Subject: [KSS-checkins] r54327 - kukit/kss.base/trunk Message-ID: <20080502150448.5DA7C169EEE@codespeak.net> Author: jvloothuis Date: Fri May 2 17:04:47 2008 New Revision: 54327 Modified: kukit/kss.base/trunk/setup.py Log: Added namespace info the setup file Modified: kukit/kss.base/trunk/setup.py ============================================================================== --- kukit/kss.base/trunk/setup.py (original) +++ kukit/kss.base/trunk/setup.py Fri May 2 17:04:47 2008 @@ -35,6 +35,7 @@ license='GPL', package_dir={'': 'src'}, packages=find_packages('src'), + namespace_packages=['kss'], include_package_data=True, zip_safe=False, From jvloothuis at codespeak.net Fri May 2 17:05:36 2008 From: jvloothuis at codespeak.net (jvloothuis at codespeak.net) Date: Fri, 2 May 2008 17:05:36 +0200 (CEST) Subject: [KSS-checkins] r54328 - kukit/kss.base/trunk Message-ID: <20080502150536.D0F2E169EEE@codespeak.net> Author: jvloothuis Date: Fri May 2 17:05:36 2008 New Revision: 54328 Modified: kukit/kss.base/trunk/buildout.cfg Log: Added beautiful soup to the buildout config for testing that support Modified: kukit/kss.base/trunk/buildout.cfg ============================================================================== --- kukit/kss.base/trunk/buildout.cfg (original) +++ kukit/kss.base/trunk/buildout.cfg Fri May 2 17:05:36 2008 @@ -1,11 +1,13 @@ [buildout] parts = test-runner scripts python develop = . -eggs = +eggs = BeautifulSoup [test-runner] recipe = zc.recipe.testrunner -eggs = kss.base +eggs = + kss.base + BeautifulSoup script = test [scripts] From jvloothuis at codespeak.net Fri May 2 17:08:15 2008 From: jvloothuis at codespeak.net (jvloothuis at codespeak.net) Date: Fri, 2 May 2008 17:08:15 +0200 (CEST) Subject: [KSS-checkins] r54329 - kukit/kss.base/tags/grokkerdam-api-tweaks Message-ID: <20080502150815.AE0AF169EEE@codespeak.net> Author: jvloothuis Date: Fri May 2 17:08:15 2008 New Revision: 54329 Added: kukit/kss.base/tags/grokkerdam-api-tweaks/ - copied from r54328, kukit/kss.base/trunk/ Log: New branch for the tweaks resulting from the discussion From jvloothuis at codespeak.net Fri May 2 17:13:31 2008 From: jvloothuis at codespeak.net (jvloothuis at codespeak.net) Date: Fri, 2 May 2008 17:13:31 +0200 (CEST) Subject: [KSS-checkins] r54330 - in kukit/kss.base/tags/grokkerdam-api-tweaks: docs src/kss/base Message-ID: <20080502151331.14BE92A00DB@codespeak.net> Author: jvloothuis Date: Fri May 2 17:13:30 2008 New Revision: 54330 Added: kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/core.py - copied, changed from r52364, kukit/kss.base/trunk/src/kss/base/corecommands.py kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/core.txt - copied, changed from r52364, kukit/kss.base/trunk/src/kss/base/corecommands.txt Removed: kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/corecommands.py kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/corecommands.txt Modified: kukit/kss.base/tags/grokkerdam-api-tweaks/docs/HISTORY.txt kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/__init__.py kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/commands.py kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/commands.txt kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/config.py kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/plugin.py kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/plugin.txt kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/registry.py kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/selectors.py kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/tests.py Log: Based on the discussions we (Godefroid, Martijn Faassen and I) had at the Grokkerdam sprint I changed the concept of command sets from classes to modules. Modified: kukit/kss.base/tags/grokkerdam-api-tweaks/docs/HISTORY.txt ============================================================================== --- kukit/kss.base/tags/grokkerdam-api-tweaks/docs/HISTORY.txt (original) +++ kukit/kss.base/tags/grokkerdam-api-tweaks/docs/HISTORY.txt Fri May 2 17:13:30 2008 @@ -4,6 +4,15 @@ kss.base - 0.4dev Unreleased + - changed the concept of command sets from classes to + modules. This means you now need to import the helpers + directly. For the core this would mean doing something like + this:: + + from kss.base import core, KSSCommands + commands = KSSCommands() + core.replaceInnerHTML(commands, '#some-node', 'some value') + - renamed `load_plugins`, `unload_plugins`, and `activated_plugins` to respectively `activate`, `deactivate`, and `active_plugins` [gotcha] Modified: kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/__init__.py ============================================================================== --- kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/__init__.py (original) +++ kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/__init__.py Fri May 2 17:13:30 2008 @@ -1,4 +1,3 @@ from kss.base.commands import KSSCommands -from kss.base.selectors import selectors from kss.base.plugin import activate from kss.base.commands import xmldata, htmldata, cdatadata Modified: kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/commands.py ============================================================================== --- kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/commands.py (original) +++ kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/commands.py Fri May 2 17:13:30 2008 @@ -6,7 +6,6 @@ except ImportError: # no soup support BeautifulSoup = BeautifulStoneSoup = lambda v: v -from kss.base.registry import command_set_registry from kss.base.selectors import Selector soup_enabled = False @@ -122,9 +121,3 @@ lines.append(line + ')') return '\n'.join(lines) - def __getattr__(self, name): - return command_set_registry.get(name)(self) - -class KSSCommandSet(object): - def __init__(self, commands): - self.commands = commands Modified: kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/commands.txt ============================================================================== --- kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/commands.txt (original) +++ kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/commands.txt Fri May 2 17:13:30 2008 @@ -172,61 +172,6 @@ replaceHTML('#someid', html='some value') -Command sets -============ - -Command sets wrap the commands system and provide a highlevel API to -communicate with the browser. Command sets are responsible for escaping and -validating data. - -Let us take a look at the base class for all commandsets. - - >>> from kss.base.commands import KSSCommandSet - >>> commands = KSSCommands() - >>> commandset = KSSCommandSet(commands) - -It wraps commands in the command set. We can still access the -commands directly by using the `commands` attribute. - - >>> commandset.commands - <...KSSCommands object at ...> - -Take a look at the core command set for a better understanding of the usage pattern. - - -Using command sets -================== - -In the previous examples, we saw how to load command sets directly. Usually, we -do not need to do this. This is because the command renderer can also look -them up by name. This is done by using the KSS plugin registry. - -We will now demonstrate this in the next example. First we need to load the -registry. - - >>> from kss.base.corecommands import KSSCoreCommands - >>> from kss.base.registry import command_set_registry - -Now we can register our command set. (For more information about the registry -look at the documentation of kss.pluginregistry.) - - >>> command_set_registry.register('core', KSSCoreCommands) - -Command sets are accessed as attributes on the command renderer. - - >>> commands = KSSCommands() - >>> commands.core.replaceInnerHTML(css('div'), 'example') - >>> print commands - replaceInnerHTML(css('div'), html=htmldata('example')) - -In this case, we used `replaceInnerHTML` method that is defined in the core -command set. This is equivalent but shorter than explicitely adding a command. - -Let us clean up. - - >>> command_set_registry.unregister('core') - - Soup support ============ Modified: kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/config.py ============================================================================== --- kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/config.py (original) +++ kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/config.py Fri May 2 17:13:30 2008 @@ -1,7 +1,7 @@ import os from kss.base.plugin import Plugin -from kss.base.corecommands import KSSCoreCommands +from kss.base import core from kss.base.selectors import css, htmlid, samenode, parentnode kukit_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'kukit') @@ -43,7 +43,7 @@ for f in third_party_js] commandsets = { - 'core': KSSCoreCommands, + 'core': core, } selectors = {None: [css, htmlid, samenode, parentnode]} Copied: kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/core.py (from r52364, kukit/kss.base/trunk/src/kss/base/corecommands.py) ============================================================================== --- kukit/kss.base/trunk/src/kss/base/corecommands.py (original) +++ kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/core.py Fri May 2 17:13:30 2008 @@ -1,91 +1,85 @@ -from kss.base.commands import KSSCommandSet from kss.base import htmldata -class KSSCoreCommands(KSSCommandSet): +def setAttribute(commands, selector, name, value): + commands.add('setAttribute', selector, name=name, value=value) - def setAttribute(self, selector, name, value): - self.commands.add('setAttribute', selector, name=name, value=value) +def setStyle(commands, selector, name, value): + if ' ' in name: + raise ValueError('Style properties cannot contain spaces') + commands.add('setStyle', selector, name=name, value=value) - def setStyle(self, selector, name, value): - if ' ' in name: - raise ValueError('Style properties cannot contain spaces') - self.commands.add('setStyle', selector, name=name, value=value) +def addClass(commands, selector, value): + commands.add('addClass', selector, value=value) - def addClass(self, selector, value): - self.commands.add('addClass', selector, value=value) +def removeClass(commands, selector, value): + commands.add('removeClass', selector, value=value) - def removeClass(self, selector, value): - self.commands.add('removeClass', selector, value=value) +def toggleClass(commands, selector, value): + commands.add('toggleClass', selector, value=value) - def toggleClass(self, selector, value): - self.commands.add('toggleClass', selector, value=value) +def focus(commands, selector): + commands.add('focus', selector) - def focus(self, selector): - self.commands.add('focus', selector) +def replaceInnerHTML(commands, selector, value, withKssSetup=True): + """Replace the contents of a node (selector) with the new `value`""" + extra_args = {} + if not withKssSetup: + extra_args['withKssSetup'] = 'False' + commands.add('replaceInnerHTML', selector, html=htmldata(value), + **extra_args) - def replaceInnerHTML(self, selector, value, withKssSetup=True): - """Replace the contents of a node (selector) with the new `value`""" - extra_args = {} - if not withKssSetup: - extra_args['withKssSetup'] = 'False' - self.commands.add('replaceInnerHTML', selector, html=htmldata(value), - **extra_args) +def replaceHTML(commands, selector, value, withKssSetup=True): + extra_args = {} + if not withKssSetup: + extra_args['withKssSetup'] = 'False' + commands.add('replaceHTML', selector, html=value, **extra_args) - def replaceHTML(self, selector, value, withKssSetup=True): - extra_args = {} - if not withKssSetup: - extra_args['withKssSetup'] = 'False' - self.commands.add('replaceHTML', selector, html=value, - **extra_args) +def insertHTMLBefore(commands, selector, value): + commands.add('insertHTMLBefore', selector, html=value) - def insertHTMLBefore(self, selector, value): - self.commands.add('insertHTMLBefore', selector, html=value) +def insertHTMLAfter(commands, selector, value): + commands.add('insertHTMLAfter', selector, html=value) - def insertHTMLAfter(self, selector, value): - self.commands.add('insertHTMLAfter', selector, html=value) +def insertHTMLAsFirstChild(commands, selector, value): + commands.add('insertHTMLAsFirstChild', selector, html=value) - def insertHTMLAsFirstChild(self, selector, value): - self.commands.add('insertHTMLAsFirstChild', selector, html=value) +def insertHTMLAsLastChild(commands, selector, value): + commands.add('insertHTMLAsLastChild', selector, html=value) - def insertHTMLAsLastChild(self, selector, value): - self.commands.add('insertHTMLAsLastChild', selector, html=value) +def deleteNode(commands, selector): + commands.add('deleteNode', selector) - def deleteNode(self, selector): - self.commands.add('deleteNode', selector) +def deleteNodeBefore(commands, selector): + commands.add('deleteNodeBefore', selector) - def deleteNodeBefore(self, selector): - self.commands.add('deleteNodeBefore', selector) +def deleteNodeAfter(commands, selector): + commands.add('deleteNodeAfter', selector) - def deleteNodeAfter(self, selector): - self.commands.add('deleteNodeAfter', selector) - - def clearChildNodes(self, selector): - self.commands.add('clearChildNodes', selector) +def clearChildNodes(commands, selector): + commands.add('clearChildNodes', selector) - def copyChildNodesFrom(self, selector, id): - self.commands.add('copyChildNodesFrom', selector, html_id=id) - - def copyChildNodesTo(self, selector, id): - self.commands.add('copyChildNodesTo', selector, html_id=id) - +def copyChildNodesFrom(commands, selector, id): + commands.add('copyChildNodesFrom', selector, html_id=id) +def copyChildNodesTo(commands, selector, id): + commands.add('copyChildNodesTo', selector, html_id=id) - def moveNodeBefore(self, selector, id): - self.commands.add('moveNodeBefore', selector, html_id=id) - def moveNodeAfter(self, selector, id): - self.commands.add('moveNodeAfter', selector, html_id=id) +def moveNodeBefore(commands, selector, id): + commands.add('moveNodeBefore', selector, html_id=id) - def setStateVar(self, varname, value): - self.commands.add('setStateVar', None, varname=varname, value=value) +def moveNodeAfter(commands, selector, id): + commands.add('moveNodeAfter', selector, html_id=id) - def triggerEvent(self, name, **kwargs): - self.commands.add('triggerEvent', None, name=name, **kwargs) +def setStateVar(commands, varname, value): + commands.add('setStateVar', None, varname=varname, value=value) +def triggerEvent(commands, name, **kwargs): + commands.add('triggerEvent', None, name=name, **kwargs) Copied: kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/core.txt (from r52364, kukit/kss.base/trunk/src/kss/base/corecommands.txt) ============================================================================== --- kukit/kss.base/trunk/src/kss/base/corecommands.txt (original) +++ kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/core.txt Fri May 2 17:13:30 2008 @@ -2,22 +2,21 @@ Core commands ============= -The core commands wrap all KSS commands provided by the core plugin. -They are always available. -These do not contain any effects and focus mostly on DOM manipulation. +The core commands wrap all KSS commands provided by the core plugin. +They are always available. These do not contain any effects and focus +mostly on DOM manipulation. -First we instantiate the command set. +First we instantiate the commands object. - >>> from kss.base.corecommands import KSSCoreCommands + >>> from kss.base import core >>> from kss.base import KSSCommands >>> from kss.base.selectors import css >>> commands = KSSCommands() - >>> core = KSSCoreCommands(commands) Let us look at the individual methods provided by the core commands. - >>> core.replaceInnerHTML(css('div'), 'some <h1>html</h1>') + >>> core.replaceInnerHTML(commands, css('div'), 'some <h1>html</h1>') >>> commands.render() '...replaceInnerHTML......' @@ -29,7 +28,7 @@ ------------- >>> commands.clear() - >>> core.setAttribute(css('div'), 'some name', 'some value') + >>> core.setAttribute(commands, css('div'), 'some name', 'some value') >>> print commands setAttribute(css('div'), name='some name', value='some value') @@ -39,14 +38,14 @@ You can use `setStyle` to change the look off an element. >>> commands.clear() - >>> core.setStyle(css('div'), 'somename', 'some value') + >>> core.setStyle(commands, css('div'), 'somename', 'some value') >>> print commands setStyle(css('div'), name='somename', value='some value') It also has some validation so that you do not accidentily do an unallowed thing. - >>> core.setStyle(css('div'), 'some name', 'some value') + >>> core.setStyle(commands, css('div'), 'some name', 'some value') Traceback (most recent call last): ... ValueError: Style properties cannot contain spaces @@ -56,7 +55,7 @@ --------- >>> commands.clear() - >>> core.addClass(css('div'), 'somename') + >>> core.addClass(commands, css('div'), 'somename') >>> print commands addClass(css('div'), value='somename') @@ -65,7 +64,7 @@ ------------ >>> commands.clear() - >>> core.removeClass(css('div'), 'somename') + >>> core.removeClass(commands, css('div'), 'somename') >>> print commands removeClass(css('div'), value='somename') @@ -73,7 +72,7 @@ ------------ >>> commands.clear() - >>> core.toggleClass(css('div'), 'somename') + >>> core.toggleClass(commands, css('div'), 'somename') >>> print commands toggleClass(css('div'), value='somename') @@ -86,14 +85,14 @@ ------------------ >>> commands.clear() - >>> core.replaceInnerHTML(css('div'), 'some html') + >>> core.replaceInnerHTML(commands, css('div'), 'some html') >>> print commands replaceInnerHTML(css('div'), html=htmldata('some html')) You can also avoid KSS event setup. Use this only if you really need the speedup, as the KSS resource will not be bound to those new nodes. - >>> core.replaceInnerHTML(css('div'), 'some html', withKssSetup=False) + >>> core.replaceInnerHTML(commands, css('div'), 'some html', withKssSetup=False) >>> print commands replaceInnerHTML(css('div'), html=htmldata('some html')) replaceInnerHTML(css('div'), html=htmldata('some html'), withKssSetup='False') @@ -103,13 +102,13 @@ ------------ >>> commands.clear() - >>> core.replaceHTML(css('div'), 'some html') + >>> core.replaceHTML(commands, css('div'), 'some html') >>> print commands replaceHTML(css('div'), html='some html') You can also pass withKssSetup here (see replace inner HTML). - >>> core.replaceHTML(css('div'), 'some html', withKssSetup=False) + >>> core.replaceHTML(commands, css('div'), 'some html', withKssSetup=False) >>> print commands replaceHTML(css('div'), html='some html') replaceHTML(css('div'), html='some html', withKssSetup='False') @@ -123,7 +122,7 @@ ------------------ >>> commands.clear() - >>> core.insertHTMLBefore(css('div'), 'some html') + >>> core.insertHTMLBefore(commands, css('div'), 'some html') >>> print commands insertHTMLBefore(css('div'), html='some html') @@ -131,7 +130,7 @@ ----------------- >>> commands.clear() - >>> core.insertHTMLAfter(css('div'), 'some html') + >>> core.insertHTMLAfter(commands, css('div'), 'some html') >>> print commands insertHTMLAfter(css('div'), html='some html') @@ -139,7 +138,7 @@ -------------------------- >>> commands.clear() - >>> core.insertHTMLAsFirstChild(css('div'), 'some html') + >>> core.insertHTMLAsFirstChild(commands, css('div'), 'some html') >>> print commands insertHTMLAsFirstChild(css('div'), html='some html') @@ -147,7 +146,7 @@ -------------------------- >>> commands.clear() - >>> core.insertHTMLAsLastChild(css('div'), 'some html') + >>> core.insertHTMLAsLastChild(commands, css('div'), 'some html') >>> print commands insertHTMLAsLastChild(css('div'), html='some html') @@ -160,7 +159,7 @@ ----------- >>> commands.clear() - >>> core.deleteNode(css('div')) + >>> core.deleteNode(commands, css('div')) >>> print commands deleteNode(css('div')) @@ -168,7 +167,7 @@ ------------------ >>> commands.clear() - >>> core.deleteNodeBefore(css('div')) + >>> core.deleteNodeBefore(commands, css('div')) >>> print commands deleteNodeBefore(css('div')) @@ -176,7 +175,7 @@ ----------------- >>> commands.clear() - >>> core.deleteNodeAfter(css('div')) + >>> core.deleteNodeAfter(commands, css('div')) >>> print commands deleteNodeAfter(css('div')) @@ -184,7 +183,7 @@ ----------------- >>> commands.clear() - >>> core.clearChildNodes(css('div')) + >>> core.clearChildNodes(commands, css('div')) >>> print commands clearChildNodes(css('div')) @@ -196,7 +195,7 @@ ----- >>> commands.clear() - >>> core.focus(css('div')) + >>> core.focus(commands, css('div')) >>> print commands focus(css('div')) @@ -209,7 +208,7 @@ ---------------------- >>> commands.clear() - >>> core.copyChildNodesFrom(css('div'), 'nodeid') + >>> core.copyChildNodesFrom(commands, css('div'), 'nodeid') >>> print commands copyChildNodesFrom(css('div'), html_id='nodeid') @@ -218,7 +217,7 @@ ------------------- >>> commands.clear() - >>> core.copyChildNodesTo(css('div'), 'nodeid') + >>> core.copyChildNodesTo(commands, css('div'), 'nodeid') >>> print commands copyChildNodesTo(css('div'), html_id='nodeid') @@ -231,7 +230,7 @@ ---------------- >>> commands.clear() - >>> core.moveNodeBefore(css('div'), 'nodeid') + >>> core.moveNodeBefore(commands, css('div'), 'nodeid') >>> print commands moveNodeBefore(css('div'), html_id='nodeid') @@ -239,7 +238,7 @@ --------------- >>> commands.clear() - >>> core.moveNodeAfter(css('div'), 'nodeid') + >>> core.moveNodeAfter(commands, css('div'), 'nodeid') >>> print commands moveNodeAfter(css('div'), html_id='nodeid') @@ -252,7 +251,7 @@ ------------------- >>> commands.clear() - >>> core.setStateVar('varname', 'value') + >>> core.setStateVar(commands, 'varname', 'value') >>> print commands setStateVar(varname='varname', value='value') @@ -260,6 +259,6 @@ ------------- >>> commands.clear() - >>> core.triggerEvent('eventname') + >>> core.triggerEvent(commands, 'eventname') >>> print commands triggerEvent(name='eventname') Deleted: /kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/corecommands.py ============================================================================== --- /kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/corecommands.py Fri May 2 17:13:30 2008 +++ (empty file) @@ -1,91 +0,0 @@ -from kss.base.commands import KSSCommandSet -from kss.base import htmldata - -class KSSCoreCommands(KSSCommandSet): - - def setAttribute(self, selector, name, value): - self.commands.add('setAttribute', selector, name=name, value=value) - - def setStyle(self, selector, name, value): - if ' ' in name: - raise ValueError('Style properties cannot contain spaces') - self.commands.add('setStyle', selector, name=name, value=value) - - def addClass(self, selector, value): - self.commands.add('addClass', selector, value=value) - - def removeClass(self, selector, value): - self.commands.add('removeClass', selector, value=value) - - def toggleClass(self, selector, value): - self.commands.add('toggleClass', selector, value=value) - - def focus(self, selector): - self.commands.add('focus', selector) - - def replaceInnerHTML(self, selector, value, withKssSetup=True): - """Replace the contents of a node (selector) with the new `value`""" - extra_args = {} - if not withKssSetup: - extra_args['withKssSetup'] = 'False' - self.commands.add('replaceInnerHTML', selector, html=htmldata(value), - **extra_args) - - def replaceHTML(self, selector, value, withKssSetup=True): - extra_args = {} - if not withKssSetup: - extra_args['withKssSetup'] = 'False' - self.commands.add('replaceHTML', selector, html=value, - **extra_args) - - def insertHTMLBefore(self, selector, value): - self.commands.add('insertHTMLBefore', selector, html=value) - - def insertHTMLAfter(self, selector, value): - self.commands.add('insertHTMLAfter', selector, html=value) - - def insertHTMLAsFirstChild(self, selector, value): - self.commands.add('insertHTMLAsFirstChild', selector, html=value) - - def insertHTMLAsLastChild(self, selector, value): - self.commands.add('insertHTMLAsLastChild', selector, html=value) - - - - def deleteNode(self, selector): - self.commands.add('deleteNode', selector) - - def deleteNodeBefore(self, selector): - self.commands.add('deleteNodeBefore', selector) - - def deleteNodeAfter(self, selector): - self.commands.add('deleteNodeAfter', selector) - - def clearChildNodes(self, selector): - self.commands.add('clearChildNodes', selector) - - - - def copyChildNodesFrom(self, selector, id): - self.commands.add('copyChildNodesFrom', selector, html_id=id) - - def copyChildNodesTo(self, selector, id): - self.commands.add('copyChildNodesTo', selector, html_id=id) - - - - def moveNodeBefore(self, selector, id): - self.commands.add('moveNodeBefore', selector, html_id=id) - - def moveNodeAfter(self, selector, id): - self.commands.add('moveNodeAfter', selector, html_id=id) - - - def setStateVar(self, varname, value): - self.commands.add('setStateVar', None, varname=varname, value=value) - - def triggerEvent(self, name, **kwargs): - self.commands.add('triggerEvent', None, name=name, **kwargs) - - - Deleted: /kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/corecommands.txt ============================================================================== --- /kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/corecommands.txt Fri May 2 17:13:30 2008 +++ (empty file) @@ -1,265 +0,0 @@ -============= -Core commands -============= - -The core commands wrap all KSS commands provided by the core plugin. -They are always available. -These do not contain any effects and focus mostly on DOM manipulation. - -First we instantiate the command set. - - >>> from kss.base.corecommands import KSSCoreCommands - >>> from kss.base import KSSCommands - >>> from kss.base.selectors import css - - >>> commands = KSSCommands() - >>> core = KSSCoreCommands(commands) - -Let us look at the individual methods provided by the core commands. - - >>> core.replaceInnerHTML(css('div'), 'some <h1>html</h1>') - >>> commands.render() - '...replaceInnerHTML......' - ------------------ -Node modification ------------------ - -Set attribute -------------- - - >>> commands.clear() - >>> core.setAttribute(css('div'), 'some name', 'some value') - >>> print commands - setAttribute(css('div'), name='some name', value='some value') - -Set style ---------- - -You can use `setStyle` to change the look off an element. - - >>> commands.clear() - >>> core.setStyle(css('div'), 'somename', 'some value') - >>> print commands - setStyle(css('div'), name='somename', value='some value') - -It also has some validation so that you do not accidentily do an -unallowed thing. - - >>> core.setStyle(css('div'), 'some name', 'some value') - Traceback (most recent call last): - ... - ValueError: Style properties cannot contain spaces - - -Add class ---------- - - >>> commands.clear() - >>> core.addClass(css('div'), 'somename') - >>> print commands - addClass(css('div'), value='somename') - - -Remove class ------------- - - >>> commands.clear() - >>> core.removeClass(css('div'), 'somename') - >>> print commands - removeClass(css('div'), value='somename') - -Toggle class ------------- - - >>> commands.clear() - >>> core.toggleClass(css('div'), 'somename') - >>> print commands - toggleClass(css('div'), value='somename') - - ----------------- -HTML replacement ----------------- - -Replace inner HTML ------------------- - - >>> commands.clear() - >>> core.replaceInnerHTML(css('div'), 'some html') - >>> print commands - replaceInnerHTML(css('div'), html=htmldata('some html')) - -You can also avoid KSS event setup. Use this only if you really need -the speedup, as the KSS resource will not be bound to those new nodes. - - >>> core.replaceInnerHTML(css('div'), 'some html', withKssSetup=False) - >>> print commands - replaceInnerHTML(css('div'), html=htmldata('some html')) - replaceInnerHTML(css('div'), html=htmldata('some html'), withKssSetup='False') - - -Replace HTML ------------- - - >>> commands.clear() - >>> core.replaceHTML(css('div'), 'some html') - >>> print commands - replaceHTML(css('div'), html='some html') - -You can also pass withKssSetup here (see replace inner HTML). - - >>> core.replaceHTML(css('div'), 'some html', withKssSetup=False) - >>> print commands - replaceHTML(css('div'), html='some html') - replaceHTML(css('div'), html='some html', withKssSetup='False') - - --------------- -HTML insertion --------------- - -Insert HTML before ------------------- - - >>> commands.clear() - >>> core.insertHTMLBefore(css('div'), 'some html') - >>> print commands - insertHTMLBefore(css('div'), html='some html') - -Insert HTML after ------------------ - - >>> commands.clear() - >>> core.insertHTMLAfter(css('div'), 'some html') - >>> print commands - insertHTMLAfter(css('div'), html='some html') - -Insert HTML as first child --------------------------- - - >>> commands.clear() - >>> core.insertHTMLAsFirstChild(css('div'), 'some html') - >>> print commands - insertHTMLAsFirstChild(css('div'), html='some html') - -Insert HTML as last child --------------------------- - - >>> commands.clear() - >>> core.insertHTMLAsLastChild(css('div'), 'some html') - >>> print commands - insertHTMLAsLastChild(css('div'), html='some html') - - ------------- -Node removal ------------- - -Delete node ------------ - - >>> commands.clear() - >>> core.deleteNode(css('div')) - >>> print commands - deleteNode(css('div')) - -Delete node before ------------------- - - >>> commands.clear() - >>> core.deleteNodeBefore(css('div')) - >>> print commands - deleteNodeBefore(css('div')) - -Delete node after ------------------ - - >>> commands.clear() - >>> core.deleteNodeAfter(css('div')) - >>> print commands - deleteNodeAfter(css('div')) - -Clear child nodes ------------------ - - >>> commands.clear() - >>> core.clearChildNodes(css('div')) - >>> print commands - clearChildNodes(css('div')) - -------- -Special -------- - -Focus ------ - - >>> commands.clear() - >>> core.focus(css('div')) - >>> print commands - focus(css('div')) - - -------------- -Copying nodes -------------- - -Copy child nodes from ----------------------- - - >>> commands.clear() - >>> core.copyChildNodesFrom(css('div'), 'nodeid') - >>> print commands - copyChildNodesFrom(css('div'), html_id='nodeid') - - -Copy child nodes to -------------------- - - >>> commands.clear() - >>> core.copyChildNodesTo(css('div'), 'nodeid') - >>> print commands - copyChildNodesTo(css('div'), html_id='nodeid') - - ------------- -Moving nodes ------------- - -Move node before ----------------- - - >>> commands.clear() - >>> core.moveNodeBefore(css('div'), 'nodeid') - >>> print commands - moveNodeBefore(css('div'), html_id='nodeid') - -Move node after ---------------- - - >>> commands.clear() - >>> core.moveNodeAfter(css('div'), 'nodeid') - >>> print commands - moveNodeAfter(css('div'), html_id='nodeid') - - --------------- -Global actions --------------- - -Set client variable -------------------- - - >>> commands.clear() - >>> core.setStateVar('varname', 'value') - >>> print commands - setStateVar(varname='varname', value='value') - -Trigger event -------------- - - >>> commands.clear() - >>> core.triggerEvent('eventname') - >>> print commands - triggerEvent(name='eventname') Modified: kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/plugin.py ============================================================================== --- kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/plugin.py (original) +++ kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/plugin.py Fri May 2 17:13:30 2008 @@ -2,8 +2,7 @@ from pkg_resources import iter_entry_points -from kss.base.registry import command_set_registry, plugin_registry -from kss.base import selectors as selector_registry +from kss.base.registry import plugin_registry class Plugin(object): priority = 100 @@ -13,28 +12,6 @@ selectors = {} commandsets = {} - def register_commandsets(self, registry): - for name, commandset in self.commandsets.iteritems(): - registry.register(name, commandset) - - def unregister_commandsets(self, registry): - for name, commandset in self.commandsets.iteritems(): - registry.unregister(name) - - def _selectors(self): - for name, selectors in self.selectors.iteritems(): - for selector in selectors: - yield selector.type, selector - - def register_selectors(self): - for id, selector in self._selectors(): - selector_registry.register(id, selector) - - def unregister_selectors(self): - for id, selector in self._selectors(): - selector_registry.unregister(id) - - def javascripts_from(path): javascripts = [] if not os.path.isdir(path): @@ -70,9 +47,6 @@ plugin = plugin_factory() plugin_registry.register(name, plugin) - # Setup of all hooks - plugin.register_commandsets(command_set_registry) - plugin.register_selectors() return raise KeyError("Plugin is not registered: %s" % name) @@ -85,10 +59,6 @@ plugin_factory = entry_point.load() plugin = plugin_factory() - # Tear down of all hooks - plugin.unregister_commandsets(command_set_registry) - plugin.unregister_selectors() - plugin_registry.unregister(name) Modified: kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/plugin.txt ============================================================================== --- kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/plugin.txt (original) +++ kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/plugin.txt Fri May 2 17:13:30 2008 @@ -26,7 +26,7 @@ example.) >>> import kss.base - >>> from kss.base.corecommands import KSSCoreCommands + >>> from kss.base import core >>> from kss.base.selectors import Selector >>> class Silly(Selector): @@ -40,7 +40,7 @@ ... 'javascript/plugin.js')] ... extra_javascripts = [] ... commandsets = { - ... 'example': KSSCoreCommands, + ... 'example': core, ... } ... selectors = {'example': [Silly]} @@ -87,14 +87,6 @@ >>> tuple(active_plugins()) (('kss-testing', ),) -The additional selector we registered is now available in the selector -registry. It can be looked up based on the class name with the key -from the registrion as the namespace. - - >>> from kss.base import selectors - >>> print selectors['example-silly']('testing') - example-silly('testing') - Finally we deactivate our plugin to clean up. >>> from kss.base.plugin import deactivate Modified: kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/registry.py ============================================================================== --- kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/registry.py (original) +++ kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/registry.py Fri May 2 17:13:30 2008 @@ -18,5 +18,4 @@ __getitem__ = get -command_set_registry = Registry() plugin_registry = Registry() Modified: kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/selectors.py ============================================================================== --- kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/selectors.py (original) +++ kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/selectors.py Fri May 2 17:13:30 2008 @@ -1,5 +1,3 @@ -from kss.base.registry import Registry - class Selector(object): """A base for selectors. Plugins that implement this, need to implement __init__ themselves, and set type as a string. @@ -40,5 +38,3 @@ def __init__(self, value): self.value = value - -selectors = Registry() Modified: kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/tests.py ============================================================================== --- kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/tests.py (original) +++ kukit/kss.base/tags/grokkerdam-api-tweaks/src/kss/base/tests.py Fri May 2 17:13:30 2008 @@ -6,7 +6,7 @@ doctest.DocFileSuite( 'selectors.txt', 'registry.txt', 'plugin.txt', - 'commands.txt', 'corecommands.txt', + 'commands.txt', 'core.txt', 'javascript.txt', 'utils.txt', package='kss.base', optionflags=doctest.ELLIPSIS|doctest.REPORT_ONLY_FIRST_FAILURE, From jvloothuis at codespeak.net Fri May 2 17:15:59 2008 From: jvloothuis at codespeak.net (jvloothuis at codespeak.net) Date: Fri, 2 May 2008 17:15:59 +0200 (CEST) Subject: [KSS-checkins] r54331 - kukit/kss.zope/tags Message-ID: <20080502151559.7D7202A00DB@codespeak.net> Author: jvloothuis Date: Fri May 2 17:15:59 2008 New Revision: 54331 Added: kukit/kss.zope/tags/ Log: Added missing tags dir From jvloothuis at codespeak.net Fri May 2 17:16:50 2008 From: jvloothuis at codespeak.net (jvloothuis at codespeak.net) Date: Fri, 2 May 2008 17:16:50 +0200 (CEST) Subject: [KSS-checkins] r54332 - kukit/kss.zope/branches Message-ID: <20080502151650.51C902A00DB@codespeak.net> Author: jvloothuis Date: Fri May 2 17:16:49 2008 New Revision: 54332 Added: kukit/kss.zope/branches/ Log: Added missing branches dir From jvloothuis at codespeak.net Fri May 2 17:17:07 2008 From: jvloothuis at codespeak.net (jvloothuis at codespeak.net) Date: Fri, 2 May 2008 17:17:07 +0200 (CEST) Subject: [KSS-checkins] r54333 - kukit/kss.zope/branches/grokkerdam-api-tweaks Message-ID: <20080502151707.A0E482A00DB@codespeak.net> Author: jvloothuis Date: Fri May 2 17:17:07 2008 New Revision: 54333 Added: kukit/kss.zope/branches/grokkerdam-api-tweaks/ Log: Branch for handling the changes in the Grokkerdam branch of kss.base From jvloothuis at codespeak.net Fri May 2 17:18:10 2008 From: jvloothuis at codespeak.net (jvloothuis at codespeak.net) Date: Fri, 2 May 2008 17:18:10 +0200 (CEST) Subject: [KSS-checkins] r54334 - kukit/kss.zope/branches/grokkerdam-api-tweaks Message-ID: <20080502151810.26A342A00DB@codespeak.net> Author: jvloothuis Date: Fri May 2 17:18:09 2008 New Revision: 54334 Removed: kukit/kss.zope/branches/grokkerdam-api-tweaks/ Log: Silly action on my part (before From jvloothuis at codespeak.net Fri May 2 17:19:00 2008 From: jvloothuis at codespeak.net (jvloothuis at codespeak.net) Date: Fri, 2 May 2008 17:19:00 +0200 (CEST) Subject: [KSS-checkins] r54335 - kukit/kss.zope/branches/grokkerdam-api-tweaks Message-ID: <20080502151900.4BBDA2A00DB@codespeak.net> Author: jvloothuis Date: Fri May 2 17:18:59 2008 New Revision: 54335 Added: kukit/kss.zope/branches/grokkerdam-api-tweaks/ - copied from r54334, kukit/kss.zope/trunk/ Log: Branch for handling the changes in the Grokkerdam branch of kss.base From jvloothuis at codespeak.net Fri May 2 17:22:42 2008 From: jvloothuis at codespeak.net (jvloothuis at codespeak.net) Date: Fri, 2 May 2008 17:22:42 +0200 (CEST) Subject: [KSS-checkins] r54336 - in kukit/kss.zope/trunk/kss/zope: . bbb Message-ID: <20080502152242.4A6F52A00DB@codespeak.net> Author: jvloothuis Date: Fri May 2 17:22:41 2008 New Revision: 54336 Modified: kukit/kss.zope/trunk/kss/zope/bbb/commandset.py kukit/kss.zope/trunk/kss/zope/registry.py kukit/kss.zope/trunk/kss/zope/registry.txt Log: Made adjustments for the changes in the grokkerdam branch of kss.base Modified: kukit/kss.zope/trunk/kss/zope/bbb/commandset.py ============================================================================== --- kukit/kss.zope/trunk/kss/zope/bbb/commandset.py (original) +++ kukit/kss.zope/trunk/kss/zope/bbb/commandset.py Fri May 2 17:22:41 2008 @@ -1,12 +1,26 @@ +#from deprecated import deprecated + +from kss.base import core -# BBB selector compat wrapper from kss.zope.commandset import ZopeCommandSet -from kss.base.corecommands import KSSCoreCommands -##from deprecated import deprecated -when = 'after 2008-08-01' +class CommandWrapper(object): + def __init__(self, command, commands): + self.command = command + self.commands = commands + + def __call__(self, *args, **kwargs): + self.command(self.commands, *args, **kwargs) + +# BBB core command compat +class KSSCoreCommands(ZopeCommandSet): + def __getattr__(self, name): + return CommandWrapper(getattr(core, name), self.commands) -class CompatCommandSet(ZopeCommandSet, KSSCoreCommands): + +# BBB selector compat wrapper +pwhen = 'after 2008-08-01' +class CompatCommandSet(KSSCoreCommands): ## Don't BBB yet. Uncommenting the next line will activate BBB. ##@deprecated('use getattr(view.selectors, type)(value) instead', when) Modified: kukit/kss.zope/trunk/kss/zope/registry.py ============================================================================== --- kukit/kss.zope/trunk/kss/zope/registry.py (original) +++ kukit/kss.zope/trunk/kss/zope/registry.py Fri May 2 17:22:41 2008 @@ -2,8 +2,9 @@ from kss.base.plugin import available_plugins from kss.zope.interfaces import IKSSPluginRegistry -# BBB registries for configuration of plugins through ZCML -BBB_commandsets = {} +# BBB registries for configuration of plugins through ZCML etc. +from kss.zope.bbb.commandset import KSSCoreCommands +BBB_commandsets = {'core': KSSCoreCommands} BBB_javascripts = [] class GlobalPluginRegistry(object): @@ -65,8 +66,8 @@ return self._extra_javascripts def lookup_commandset(self, id): - commandsets = BBB_commandsets.copy() - commandsets.update(self._commandsets) + commandsets = dict(self._commandsets) + commandsets.update(BBB_commandsets.copy()) return commandsets[id] def lookup_selector(self, id): Modified: kukit/kss.zope/trunk/kss/zope/registry.txt ============================================================================== --- kukit/kss.zope/trunk/kss/zope/registry.txt (original) +++ kukit/kss.zope/trunk/kss/zope/registry.txt Fri May 2 17:22:41 2008 @@ -58,7 +58,7 @@ Loading the commandset for the core should be possible. >>> registry.lookup_commandset('core') - + As you can see it returns a factory (in this case the class) for the commandset. @@ -105,8 +105,8 @@ registration is a simple call to the registry with a commandset factory. - >>> from kss.base.commands import KSSCommandSet - >>> class CheeseCommandSet(KSSCommandSet): + >>> from kss.zope.commandset import ZopeCommandSet + >>> class CheeseCommandSet(ZopeCommandSet): ... pass >>> BBB_register_commandset('cheese', CheeseCommandSet) >>> registry.lookup_commandset('cheese') From jvloothuis at codespeak.net Fri May 2 17:36:13 2008 From: jvloothuis at codespeak.net (jvloothuis at codespeak.net) Date: Fri, 2 May 2008 17:36:13 +0200 (CEST) Subject: [KSS-checkins] r54337 - in kukit/kss.base: branches/grokkerdam-api-tweaks tags/grokkerdam-api-tweaks Message-ID: <20080502153613.3DF2E169EB4@codespeak.net> Author: jvloothuis Date: Fri May 2 17:36:10 2008 New Revision: 54337 Added: kukit/kss.base/branches/grokkerdam-api-tweaks/ - copied from r54336, kukit/kss.base/tags/grokkerdam-api-tweaks/ Removed: kukit/kss.base/tags/grokkerdam-api-tweaks/ Log: It's a branch, not a tag From jvloothuis at codespeak.net Fri May 2 18:01:09 2008 From: jvloothuis at codespeak.net (jvloothuis at codespeak.net) Date: Fri, 2 May 2008 18:01:09 +0200 (CEST) Subject: [KSS-checkins] r54338 - in kukit/kss.zope/trunk/kss/zope: . bbb Message-ID: <20080502160109.0B4BC2A00DB@codespeak.net> Author: jvloothuis Date: Fri May 2 18:01:08 2008 New Revision: 54338 Modified: kukit/kss.zope/trunk/kss/zope/bbb/commandset.py kukit/kss.zope/trunk/kss/zope/registry.py kukit/kss.zope/trunk/kss/zope/registry.txt Log: Reverting my change on trunk Modified: kukit/kss.zope/trunk/kss/zope/bbb/commandset.py ============================================================================== --- kukit/kss.zope/trunk/kss/zope/bbb/commandset.py (original) +++ kukit/kss.zope/trunk/kss/zope/bbb/commandset.py Fri May 2 18:01:08 2008 @@ -1,26 +1,12 @@ -#from deprecated import deprecated - -from kss.base import core +# BBB selector compat wrapper from kss.zope.commandset import ZopeCommandSet +from kss.base.corecommands import KSSCoreCommands +##from deprecated import deprecated -class CommandWrapper(object): - def __init__(self, command, commands): - self.command = command - self.commands = commands - - def __call__(self, *args, **kwargs): - self.command(self.commands, *args, **kwargs) - -# BBB core command compat -class KSSCoreCommands(ZopeCommandSet): - def __getattr__(self, name): - return CommandWrapper(getattr(core, name), self.commands) +when = 'after 2008-08-01' - -# BBB selector compat wrapper -pwhen = 'after 2008-08-01' -class CompatCommandSet(KSSCoreCommands): +class CompatCommandSet(ZopeCommandSet, KSSCoreCommands): ## Don't BBB yet. Uncommenting the next line will activate BBB. ##@deprecated('use getattr(view.selectors, type)(value) instead', when) Modified: kukit/kss.zope/trunk/kss/zope/registry.py ============================================================================== --- kukit/kss.zope/trunk/kss/zope/registry.py (original) +++ kukit/kss.zope/trunk/kss/zope/registry.py Fri May 2 18:01:08 2008 @@ -2,9 +2,8 @@ from kss.base.plugin import available_plugins from kss.zope.interfaces import IKSSPluginRegistry -# BBB registries for configuration of plugins through ZCML etc. -from kss.zope.bbb.commandset import KSSCoreCommands -BBB_commandsets = {'core': KSSCoreCommands} +# BBB registries for configuration of plugins through ZCML +BBB_commandsets = {} BBB_javascripts = [] class GlobalPluginRegistry(object): @@ -66,8 +65,8 @@ return self._extra_javascripts def lookup_commandset(self, id): - commandsets = dict(self._commandsets) - commandsets.update(BBB_commandsets.copy()) + commandsets = BBB_commandsets.copy() + commandsets.update(self._commandsets) return commandsets[id] def lookup_selector(self, id): Modified: kukit/kss.zope/trunk/kss/zope/registry.txt ============================================================================== --- kukit/kss.zope/trunk/kss/zope/registry.txt (original) +++ kukit/kss.zope/trunk/kss/zope/registry.txt Fri May 2 18:01:08 2008 @@ -58,7 +58,7 @@ Loading the commandset for the core should be possible. >>> registry.lookup_commandset('core') - + As you can see it returns a factory (in this case the class) for the commandset. @@ -105,8 +105,8 @@ registration is a simple call to the registry with a commandset factory. - >>> from kss.zope.commandset import ZopeCommandSet - >>> class CheeseCommandSet(ZopeCommandSet): + >>> from kss.base.commands import KSSCommandSet + >>> class CheeseCommandSet(KSSCommandSet): ... pass >>> BBB_register_commandset('cheese', CheeseCommandSet) >>> registry.lookup_commandset('cheese') From jvloothuis at codespeak.net Fri May 2 18:04:55 2008 From: jvloothuis at codespeak.net (jvloothuis at codespeak.net) Date: Fri, 2 May 2008 18:04:55 +0200 (CEST) Subject: [KSS-checkins] r54339 - in kukit/kss.zope/branches/grokkerdam-api-tweaks/kss/zope: . bbb Message-ID: <20080502160455.B03BD2A00DB@codespeak.net> Author: jvloothuis Date: Fri May 2 18:04:55 2008 New Revision: 54339 Modified: kukit/kss.zope/branches/grokkerdam-api-tweaks/kss/zope/bbb/commandset.py kukit/kss.zope/branches/grokkerdam-api-tweaks/kss/zope/registry.py kukit/kss.zope/branches/grokkerdam-api-tweaks/kss/zope/registry.txt Log: Made adjustments for the changes in the grokkerdam branch of kss.base Modified: kukit/kss.zope/branches/grokkerdam-api-tweaks/kss/zope/bbb/commandset.py ============================================================================== --- kukit/kss.zope/branches/grokkerdam-api-tweaks/kss/zope/bbb/commandset.py (original) +++ kukit/kss.zope/branches/grokkerdam-api-tweaks/kss/zope/bbb/commandset.py Fri May 2 18:04:55 2008 @@ -1,12 +1,26 @@ +#from deprecated import deprecated + +from kss.base import core -# BBB selector compat wrapper from kss.zope.commandset import ZopeCommandSet -from kss.base.corecommands import KSSCoreCommands -##from deprecated import deprecated -when = 'after 2008-08-01' +class CommandWrapper(object): + def __init__(self, command, commands): + self.command = command + self.commands = commands + + def __call__(self, *args, **kwargs): + self.command(self.commands, *args, **kwargs) + +# BBB core command compat +class KSSCoreCommands(ZopeCommandSet): + def __getattr__(self, name): + return CommandWrapper(getattr(core, name), self.commands) -class CompatCommandSet(ZopeCommandSet, KSSCoreCommands): + +# BBB selector compat wrapper +pwhen = 'after 2008-08-01' +class CompatCommandSet(KSSCoreCommands): ## Don't BBB yet. Uncommenting the next line will activate BBB. ##@deprecated('use getattr(view.selectors, type)(value) instead', when) Modified: kukit/kss.zope/branches/grokkerdam-api-tweaks/kss/zope/registry.py ============================================================================== --- kukit/kss.zope/branches/grokkerdam-api-tweaks/kss/zope/registry.py (original) +++ kukit/kss.zope/branches/grokkerdam-api-tweaks/kss/zope/registry.py Fri May 2 18:04:55 2008 @@ -2,8 +2,9 @@ from kss.base.plugin import available_plugins from kss.zope.interfaces import IKSSPluginRegistry -# BBB registries for configuration of plugins through ZCML -BBB_commandsets = {} +# BBB registries for configuration of plugins through ZCML etc. +from kss.zope.bbb.commandset import KSSCoreCommands +BBB_commandsets = {'core': KSSCoreCommands} BBB_javascripts = [] class GlobalPluginRegistry(object): @@ -65,8 +66,8 @@ return self._extra_javascripts def lookup_commandset(self, id): - commandsets = BBB_commandsets.copy() - commandsets.update(self._commandsets) + commandsets = dict(self._commandsets) + commandsets.update(BBB_commandsets.copy()) return commandsets[id] def lookup_selector(self, id): Modified: kukit/kss.zope/branches/grokkerdam-api-tweaks/kss/zope/registry.txt ============================================================================== --- kukit/kss.zope/branches/grokkerdam-api-tweaks/kss/zope/registry.txt (original) +++ kukit/kss.zope/branches/grokkerdam-api-tweaks/kss/zope/registry.txt Fri May 2 18:04:55 2008 @@ -58,7 +58,7 @@ Loading the commandset for the core should be possible. >>> registry.lookup_commandset('core') - + As you can see it returns a factory (in this case the class) for the commandset. @@ -105,8 +105,8 @@ registration is a simple call to the registry with a commandset factory. - >>> from kss.base.commands import KSSCommandSet - >>> class CheeseCommandSet(KSSCommandSet): + >>> from kss.zope.commandset import ZopeCommandSet + >>> class CheeseCommandSet(ZopeCommandSet): ... pass >>> BBB_register_commandset('cheese', CheeseCommandSet) >>> registry.lookup_commandset('cheese') From kukit-checkins at codespeak.net Thu May 8 18:10:24 2008 From: kukit-checkins at codespeak.net (VIAGRA INC) Date: Thu, 8 May 2008 18:10:24 +0200 (CEST) Subject: [KSS-checkins] SALE 89% OFF Message-ID: <20080508050852.5783.qmail@host86-155-162-111.range86-155.btcentralplus.com> An HTML attachment was scrubbed... URL: http://codespeak.net/pipermail/kukit-checkins/attachments/20080508/4aa014b9/attachment.htm From kukit-checkins at codespeak.net Sun May 18 21:21:02 2008 From: kukit-checkins at codespeak.net (VIAGRA ® Official Site) Date: Sun, 18 May 2008 21:21:02 +0200 (CEST) Subject: [KSS-checkins] Dear kukit-checkins@codespeak.net May 87% 0FF Message-ID: <20020518101651.6600.qmail@ajw100.neoplus.adsl.tpnet.pl> An HTML attachment was scrubbed... URL: http://codespeak.net/pipermail/kukit-checkins/attachments/20080518/56211840/attachment-0001.htm From kukit-checkins at codespeak.net Sat May 24 13:06:35 2008 From: kukit-checkins at codespeak.net (Viagra.com Inc ®) Date: Sat, 24 May 2008 13:06:35 +0200 (CEST) Subject: [KSS-checkins] Official Site Message-ID: <1876674318.2774782.188460768-6183@cimail96.msn.com> An HTML attachment was scrubbed... URL: http://codespeak.net/pipermail/kukit-checkins/attachments/20080524/1dc3949e/attachment.htm From kukit-checkins at codespeak.net Sat May 24 18:58:26 2008 From: kukit-checkins at codespeak.net (VIAGRA ® Official Site) Date: Sat, 24 May 2008 18:58:26 +0200 (CEST) Subject: [KSS-checkins] May 72% OFF Message-ID: <20080524075647.13610.qmail@div110.neoplus.adsl.tpnet.pl> An HTML attachment was scrubbed... URL: http://codespeak.net/pipermail/kukit-checkins/attachments/20080524/d64918f3/attachment.htm From kukit-checkins at codespeak.net Sun May 25 18:29:31 2008 From: kukit-checkins at codespeak.net (VIAGRA ® Official Site) Date: Sun, 25 May 2008 18:29:31 +0200 (CEST) Subject: [KSS-checkins] Dear kukit-checkins@codespeak.net May 85% 0FF Message-ID: <20080525112749.2661.qmail@ppp83-237-172-206.pppoe.mtu-net.ru> An HTML attachment was scrubbed... URL: http://codespeak.net/pipermail/kukit-checkins/attachments/20080525/fb81c7ad/attachment.htm