Skip to content

Commit bab6ac5

Browse files
author
hartsantler
committed
added special "property" keyword to getattr and setattr, for setting or getting an attribute on an instance that should have been exposed using property decorators.
1 parent 9b6a89e commit bab6ac5

3 files changed

Lines changed: 66 additions & 15 deletions

File tree

pythonjs.js

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// PythonScript Runtime - regenerated on: Mon Nov 4 21:44:15 2013
1+
// PythonScript Runtime - regenerated on: Tue Nov 5 17:54:04 2013
22
var jsrange = function(num) {
33
"Emulates Python's range function";
44
var i, r;
@@ -575,19 +575,33 @@ kwargs = Object();
575575
}
576576

577577
var signature, arguments;
578-
signature = {"kwargs": Object(), "args": create_array("ob", "attr")};
578+
signature = {"kwargs": {"property": false}, "args": create_array("ob", "attr", "property")};
579579
signature["function_name"] = "getattr";
580580
arguments = get_arguments(signature, args, kwargs);
581581
var ob = arguments['ob'];
582582
var attr = arguments['attr'];
583+
var property = arguments['property'];
584+
if(property) {
585+
prop = _get_upstream_property( ob.__class__,attr );
586+
if(prop && prop["get"]) {
587+
return prop[ "get" ]( [ob],{ } );
588+
}
589+
else {
590+
console.log("ERROR: getattr property error", prop);
591+
}
592+
593+
}
594+
else {
583595
return get_attribute( ob,attr );
596+
}
597+
584598
}
585599
window["getattr"] = getattr
586600

587601
getattr.NAME = "getattr";
588-
getattr.args_signature = ["ob", "attr"];
589-
getattr.kwargs_signature = { };
590-
getattr.types_signature = { };
602+
getattr.args_signature = ["ob", "attr", "property"];
603+
getattr.kwargs_signature = { property:false };
604+
getattr.types_signature = { property:"False" };
591605
getattr.pythonscript_function = true;
592606
var setattr = function(args, kwargs) {
593607
if(args instanceof Array && {}.toString.call(kwargs) === '[object Object]' && arguments.length == 2) {
@@ -599,20 +613,34 @@ kwargs = Object();
599613
}
600614

601615
var signature, arguments;
602-
signature = {"kwargs": Object(), "args": create_array("ob", "attr", "value")};
616+
signature = {"kwargs": {"property": false}, "args": create_array("ob", "attr", "value", "property")};
603617
signature["function_name"] = "setattr";
604618
arguments = get_arguments(signature, args, kwargs);
605619
var ob = arguments['ob'];
606620
var attr = arguments['attr'];
607621
var value = arguments['value'];
608-
return set_attribute( ob,attr,value );
622+
var property = arguments['property'];
623+
if(property) {
624+
prop = _get_upstream_property( ob.__class__,attr );
625+
if(prop && prop["set"]) {
626+
prop[ "set" ]( [ob, value],{ } );
627+
}
628+
else {
629+
console.log("ERROR: setattr property error", prop);
630+
}
631+
632+
}
633+
else {
634+
set_attribute( ob,attr,value );
635+
}
636+
609637
}
610638
window["setattr"] = setattr
611639

612640
setattr.NAME = "setattr";
613-
setattr.args_signature = ["ob", "attr", "value"];
614-
setattr.kwargs_signature = { };
615-
setattr.types_signature = { };
641+
setattr.args_signature = ["ob", "attr", "value", "property"];
642+
setattr.kwargs_signature = { property:false };
643+
setattr.types_signature = { property:"False" };
616644
setattr.pythonscript_function = true;
617645
var issubclass = function(args, kwargs) {
618646
var i, bases;

runtime/builtins.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,27 @@ def type(ob_or_class_name, bases=None, class_dict=None):
1616
else:
1717
return create_class(ob_or_class_name, bases, class_dict) ## TODO rename create_class to _pyjs_create_class
1818

19-
def getattr(ob, attr):
19+
def getattr(ob, attr, property=False):
2020
with javascript:
21-
return get_attribute(ob, attr) ## TODO rename to _pyjs_get_attribute
21+
if property:
22+
prop = _get_upstream_property( ob.__class__, attr )
23+
if prop and prop['get']:
24+
return prop['get']( [ob], {} )
25+
else:
26+
print "ERROR: getattr property error", prop
27+
else:
28+
return get_attribute(ob, attr) ## TODO rename to _pyjs_get_attribute
2229

23-
def setattr(ob, attr, value):
30+
def setattr(ob, attr, value, property=False):
2431
with javascript:
25-
return set_attribute(ob, attr, value)
32+
if property:
33+
prop = _get_upstream_property( ob.__class__, attr )
34+
if prop and prop['set']:
35+
prop['set']( [ob, value], {} )
36+
else:
37+
print "ERROR: setattr property error", prop
38+
else:
39+
set_attribute(ob, attr, value)
2640

2741
def issubclass(C, B):
2842
if C is B:

tests/property_decorator.html

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
return self._x
1818
@x.setter
1919
def x(self,value):
20+
print '--calling x setter: ', value
2021
self._x = value + 1000
2122

2223
@property
@@ -69,7 +70,15 @@
6970
print 'unknown get_attribute is OK'
7071

7172
c.x = 101 ## TODO fix setters on unknown types
72-
print( c.x )
73+
print( c.x ) ## this prints 101 but the setter was not called
74+
with javascript:
75+
print c.__dict__._x
76+
77+
print 'testing setattr(c,"x", property=True)'
78+
setattr( c, 'x', 10, property=True )
79+
with javascript:
80+
print c.__dict__._x
81+
print getattr( c, 'x', property=True )
7382

7483
</script>
7584
</head>

0 commit comments

Comments
 (0)