Tuesday, January 4, 2011

Cartesian

I see your hacky method overloading ...

Luckily with Python you can implement your own hacky little overloads.


from itertools import product

def argslist(args):
return [ tuple(t) for t in product(*[a.split('|') for a in args]) ]

class Signatures(defaultdict):
def __init__(self):
self.seen = defaultdict(set)
defaultdict.__init__(self, list)

def __setitem__(self, key, item):
if isinstance(key, tuple):
m, args = key
for k in argslist(args):self.seen[m].add(k)
self[m].append(item)
else:
defaultdict.__setitem__(self, key, item)

def __contains__(self, (m, args)):
for k in argslist(args):
if k in self.seen[m]:
return True


def parse_sigs():
api = PyQuery(filename='api.xml')
sigs = Signatures()

for sig in api('entries entry[type=method] signature'):
entry = sig.getparent()
name = entry.get('name')

for args in arg_combinations(PyQuery(sig)('argument')):
k, v = parse_sig(name, args)
v.update({'sig': PyQuery(sig)})

if k:
key = (k, tuple(v['types']))

if key not in sigs:
sigs[key] = v

return dict(sigs)

'toggle': [{'args': ['handler(eventObject)', 'handler(eventObject)'],
'name': 'toggle',
'sig': [<signature>],
'sig_str': 'toggle(handler(eventObject), handler(eventObject))',
'types': ['Function', 'Function']},
{'args': ['handler(eventObject)',
'handler(eventObject)',
'handler(eventObject)'],
'name': 'toggle',
'sig': [<signature>],
'sig_str': 'toggle(handler(eventObject), handler(eventObject), handler(eventObject))',
'types': ['Function', 'Function', 'Function']},
{'args': [],
'name': 'toggle',
'sig': [<signature>],
'sig_str': 'toggle()',
'types': []},
{'args': ['duration'],
'name': 'toggle',
'sig': [<signature>],
'sig_str': 'toggle(duration)',
'types': ['String']},
{'args': ['callback'],
'name': 'toggle',
'sig': [<signature>],
'sig_str': 'toggle(callback)',
'types': ['Callback']},
{'args': ['duration', 'callback'],
'name': 'toggle',
'sig': [<signature>],
'sig_str': 'toggle(duration, callback)',
'types': ['String', 'Callback']},
{'args': ['duration', 'easing'],
'name': 'toggle',
'sig': [<signature>],
'sig_str': 'toggle(duration, easing)',
'types': ['String', 'String']},
{'args': ['duration', 'easing', 'callback'],
'name': 'toggle',
'sig': [<signature>],
'sig_str': 'toggle(duration, easing, callback)',
'types': ['String', 'String', 'Callback']},
{'args': ['showOrHide'],
'name': 'toggle',
'sig': [<signature>],
'sig_str': 'toggle(showOrHide)',
'types': ['Boolean']}],

I haven't written tests (in javascript) but those sigs look fairly legit

No comments: