Mercurial > scratch
changeset 26:b7037cd0f375
Added support for exposing object properties to JS.
author | Atul Varma <varmaa@toolness.com> |
---|---|
date | Mon, 07 Sep 2009 22:17:57 -0700 |
parents | 64fb84017d87 |
children | 7f12db104246 |
files | pydershell/pydershell.py pydershell/test.js pydershell/test.py |
diffstat | 3 files changed, 44 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/pydershell/pydershell.py Mon Sep 07 17:20:24 2009 -0700 +++ b/pydershell/pydershell.py Mon Sep 07 22:17:57 2009 -0700 @@ -336,6 +336,32 @@ pyproto = type(value) if pyproto not in self.__type_protos: jsproto = self.cx.new_object() + if hasattr(pyproto, '__jsprops__'): + define_getter = self.cx.get_property(jsproto, + '__defineGetter__') + define_setter = self.cx.get_property(jsproto, + '__defineSetter__') + for name in pyproto.__jsprops__: + prop = getattr(pyproto, name) + if not type(prop) == property: + raise TypeError("Expected attribute '%s' to " + "be a property" % name) + getter = None + setter = None + if prop.fget: + getter = self.__wrap_pycallable(prop.fget, + pyproto) + if prop.fset: + setter = self.__wrap_pycallable(prop.fset, + pyproto) + if getter: + self.cx.call_function(jsproto, + define_getter, + (name, getter)) + if setter: + self.cx.call_function(jsproto, + define_setter, + (name, setter,)) for name in dir(pyproto): attr = getattr(pyproto, name) if (isinstance(attr, types.UnboundMethodType) and
--- a/pydershell/test.js Mon Sep 07 17:20:24 2009 -0700 +++ b/pydershell/test.js Mon Sep 07 22:17:57 2009 -0700 @@ -17,3 +17,7 @@ var mybaz = baz(); print(mybaz.woozle(5)); ensureBaz(mybaz); +print(mybaz.moose); +print(mybaz.moose); +mybaz.moose = 0; +print(mybaz.moose);
--- a/pydershell/test.py Mon Sep 07 17:20:24 2009 -0700 +++ b/pydershell/test.py Mon Sep 07 22:17:57 2009 -0700 @@ -11,6 +11,20 @@ sandbox = JsSandbox() class Baz(JsExposedObject): + __jsprops__ = ['moose'] + + def __init__(self): + self._moose = 0 + + def get_moose(self): + self._moose += 1 + return self._moose + + def set_moose(self, value): + self._moose = value + + moose = property(get_moose, set_moose) + @jsexposed def woozle(self, blap): return blap + 5