> Here's a short example that really works, with no changes to Publisher:
>
> import _dollar_one, foo, bar
>
> _q_exports = ['foo', 'bar']
>
> _other_exports = {
> '$one': _dollar_one,
> }
>
> _q_exports.extend(_other_exports.keys())
>
> def _q_resolve(name):
> return _other_exports.get(name)
>
> I actually tried this one before posting it to the list. :-;
I like these ideas since they can be handled at the application level, and
no modifications need be made in Qx to accomodate them.
[Is the horse still breathing?]
Along those lines, here's another idea for a helper class that makes the
concept of putting stuff in _q_exports possible, this time with no
modifications to Qx at all (except possibly making the helper class
available somewhere).
It's kinda convoluted, and I don't take it too seriously, and I'm sure it's
sub-optimal from a performance standpoint. BUT, it does make it easy (if
perhaps more verbose than ideal) for an application developer to extend the
functionality of _q_exports without modifying Qx in any way.
class Aliaser:
def __init__(self, globalsDict):
# Store a reference to the globals dict
self._globals = globalsDict
self.mappingsMade = False
self.mappings = {}
def makeMappings(self):
# Have to wait until after the module is loaded,
# or the names may not exist in the module yet
# (typically, _q_exports is at the top of the module,
# before the names have been defined)
for k, v in self.mappings.items():
try:
self._globals[k] = self._globals[v]
except KeyError:
# I'm not in love with this approach,
# but is has the 'advantage' (?) of
# blowing up IMMEDIATELY, instead of
# waiting for someone to browse to this
# 'dead' url.
raise NameError(
("The name '%s' (for '%s') is not defined " + \
"in the namespace used by this Aliaser")
% (v,k))
self.mappingsMade = True
def __call__(self, alias, callableName):
# Make a note of the mapping requested,
# and return self (for later __cmp__ use)
self.mappings[alias] = callableName
return self
def __cmp__(self, other):
# Make sure the mappings have been done
if not self.mappingsMade:
self.makeMappings()
# Indicate that we '==' anything that's in
# our mapping dict.
if self.mappings.has_key(other): return 0
else: return 1
# Need one instance for each namespace that should be
# able to handle aliases
alias = Aliaser(globals())
_q_exports = [
alias("$blah", "blah"),
alias("blah-2", "blah2"),
alias("old-name-for-blah-2", "blah2"),
alias("blah-3", "blah3")
]
# This will bomb when the mappings are made (first call to __cmp__), because
"blah3" doesn't exist.
def blah(request):
return "blah"
def blah2(request):
return "blah2"
Anyway, it's yet another approach...
Jason