Skip to content

Commit 4fd622b

Browse files
committed
add pin.pin.use_strict() to enable strict pin value getting mode (#241)
1 parent fae206b commit 4fd622b

File tree

3 files changed

+26
-4
lines changed

3 files changed

+26
-4
lines changed

pywebio/pin.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@
135135

136136
def check_name(name):
137137
assert all(i in _html_value_chars for i in name), "pin `name` can only contain letters, digits and underscore"
138+
assert name != 'use_strict', "'use_strict' is a reserve name, can't use as pin widget name"
138139
assert name[0] in string.ascii_letters, "pin `name` can only starts with letters"
139140

140141

@@ -231,13 +232,28 @@ def get_client_val():
231232
return res['data']
232233

233234

235+
@chose_impl
236+
def get_pin_value(name, strict):
237+
send_msg('pin_value', spec=dict(name=name))
238+
data = yield get_client_val()
239+
assert not strict or data, 'pin widget "%s" doesn\'t exist.' % name
240+
return (data or {}).get('value')
241+
242+
234243
class Pin_:
244+
_strict = False
245+
246+
def use_strict(self):
247+
"""
248+
Enable strict mode for getting pin widget value.
249+
An AssertionError will be raised when try to get value of pin widgets that are currently not in the page.
250+
"""
251+
self._strict = True
235252

236253
def __getattr__(self, name):
237254
"""__getattr__ is only invoked if the attribute wasn't found the usual ways"""
238255
check_name(name)
239-
send_msg('pin_value', spec=dict(name=name))
240-
return get_client_val()
256+
return get_pin_value(name, self._strict)
241257

242258
def __getitem__(self, name):
243259
return self.__getattr__(name)
@@ -246,6 +262,9 @@ def __setattr__(self, name, value):
246262
"""
247263
__setattr__ will be invoked regardless of whether the attribute be found
248264
"""
265+
if name == '_strict':
266+
return object.__setattr__(self, name, value)
267+
249268
check_name(name)
250269
send_msg('pin_update', spec=dict(name=name, attributes={"value": value}))
251270

webiojs/src/handlers/pin.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ export class PinHandler implements CommandHandler {
1515

1616
handle_message(msg: Command) {
1717
if (msg.command === 'pin_value') {
18-
let val = GetPinValue(msg.spec.name)
19-
state.CurrentSession.send_message({event: "js_yield", task_id: msg.task_id, data: val});
18+
let val = GetPinValue(msg.spec.name);
19+
let data = val===undefined? null : {value: val};
20+
state.CurrentSession.send_message({event: "js_yield", task_id: msg.task_id, data: data});
2021
} else if (msg.command === 'pin_update') {
2122
PinUpdate(msg.spec.name, msg.spec.attributes);
2223
} else if (msg.command === 'pin_wait') {

webiojs/src/models/pin.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import {AfterCurrentOutputWidgetShow} from "../handlers/output";
77
let name2input: { [k: string]: InputItem } = {};
88

99
export function GetPinValue(name: string) {
10+
if(!document.contains(name2input[name].element[0]))
11+
return undefined;
1012
return name2input[name].get_value();
1113
}
1214

0 commit comments

Comments
 (0)