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