This library solves your need to write JavaScript in Python.
In most cases, you shouldn’t.
See the demo in main.py.
Expect:
Initial widgets:
[Widget(name='alpha', category='system', enabled=True), Widget(name='beta', category='system', enabled=True), Widget(name='gamma', category='user', enabled=True)]
Disable all system widgets:
[DISABLE] beta
[DISABLE] alpha
State after disabling system widgets:
[Widget(name='alpha', category='system', enabled=False), Widget(name='beta', category='system', enabled=False), Widget(name='gamma', category='user', enabled=True)]
Rename widgets whose name starts with 'g' or 'd':
[RENAME] gamma -> renamed
State after rename:
[Widget(name='alpha', category='system', enabled=False), Widget(name='beta', category='system', enabled=False), Widget(name='renamed', category='user', enabled=True)]
Enable all widgets NOT in category 'system':
[ENABLE] renamed
State after reverse selection:
[Widget(name='alpha', category='system', enabled=False), Widget(name='beta', category='system', enabled=False), Widget(name='renamed', category='user', enabled=True)]
Delete first disabled widget:
[DELETE] alpha
State after delete:
[Widget(name='beta', category='system', enabled=False), Widget(name='renamed', category='user', enabled=True)]
Calling methods on an empty selection (no crash):
Final widgets:
[Widget(name='beta', category='system', enabled=False), Widget(name='renamed', category='user', enabled=True)]Python 3.10+
Earlier versions relied on inspect.getsource() and runtime callsite parsing; the current implementation is stable and unlikely to change.