ex4nicegui 0.8.0__py3-none-any.whl → 0.8.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ex4nicegui/reactive/__init__.py +2 -1
- ex4nicegui/reactive/base.py +108 -50
- ex4nicegui/reactive/mixins/backgroundColor.py +4 -8
- ex4nicegui/reactive/mixins/disableable.py +4 -8
- ex4nicegui/reactive/mixins/textColor.py +8 -10
- ex4nicegui/reactive/officials/checkbox.py +0 -1
- ex4nicegui/reactive/officials/input.py +1 -1
- ex4nicegui/reactive/officials/textarea.py +2 -2
- ex4nicegui/reactive/services/reactive_service.py +2 -1
- ex4nicegui/reactive/vfor.py +4 -0
- ex4nicegui/reactive/view_model.py +147 -6
- ex4nicegui/utils/proxy/__init__.py +19 -0
- ex4nicegui/utils/proxy/base.py +9 -0
- ex4nicegui/utils/proxy/bool.py +58 -0
- ex4nicegui/utils/proxy/date.py +88 -0
- ex4nicegui/utils/proxy/descriptor.py +126 -0
- ex4nicegui/utils/proxy/dict.py +110 -0
- ex4nicegui/utils/proxy/float.py +153 -0
- ex4nicegui/utils/proxy/int.py +223 -0
- ex4nicegui/utils/proxy/list.py +147 -0
- ex4nicegui/utils/proxy/string.py +430 -0
- ex4nicegui/utils/proxy/utils.py +6 -0
- ex4nicegui/utils/signals.py +9 -1
- {ex4nicegui-0.8.0.dist-info → ex4nicegui-0.8.1.dist-info}/METADATA +508 -290
- {ex4nicegui-0.8.0.dist-info → ex4nicegui-0.8.1.dist-info}/RECORD +27 -16
- {ex4nicegui-0.8.0.dist-info → ex4nicegui-0.8.1.dist-info}/LICENSE +0 -0
- {ex4nicegui-0.8.0.dist-info → ex4nicegui-0.8.1.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from typing import (
|
|
3
|
+
Literal,
|
|
4
|
+
Optional,
|
|
5
|
+
SupportsIndex,
|
|
6
|
+
Tuple,
|
|
7
|
+
Union,
|
|
8
|
+
)
|
|
9
|
+
import sys
|
|
10
|
+
from . import utils
|
|
11
|
+
from .base import Proxy
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class IntProxy(Proxy):
|
|
15
|
+
# def __new__(cls, value):
|
|
16
|
+
# return super().__new__(cls, value)
|
|
17
|
+
|
|
18
|
+
def __init__(self, value: int):
|
|
19
|
+
from ex4nicegui.utils.signals import to_ref
|
|
20
|
+
|
|
21
|
+
self._ref = to_ref(value)
|
|
22
|
+
|
|
23
|
+
def __str__(self) -> str:
|
|
24
|
+
return str(self._ref.value)
|
|
25
|
+
|
|
26
|
+
def as_integer_ratio(self) -> Tuple[int, Literal[1]]:
|
|
27
|
+
return self._ref.value.as_integer_ratio()
|
|
28
|
+
|
|
29
|
+
@property
|
|
30
|
+
def real(self) -> int:
|
|
31
|
+
return self._ref.value.real
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def imag(self) -> Literal[0]:
|
|
35
|
+
return 0
|
|
36
|
+
|
|
37
|
+
@property
|
|
38
|
+
def numerator(self) -> int:
|
|
39
|
+
return self._ref.value.numerator
|
|
40
|
+
|
|
41
|
+
@property
|
|
42
|
+
def denominator(self) -> Literal[1]:
|
|
43
|
+
return 1
|
|
44
|
+
|
|
45
|
+
def conjugate(self) -> int:
|
|
46
|
+
return self._ref.value.conjugate()
|
|
47
|
+
|
|
48
|
+
def bit_length(self) -> int:
|
|
49
|
+
return self._ref.value.bit_length()
|
|
50
|
+
|
|
51
|
+
if sys.version_info >= (3, 10):
|
|
52
|
+
|
|
53
|
+
def bit_count(self) -> int:
|
|
54
|
+
return self._ref.value.bit_count()
|
|
55
|
+
|
|
56
|
+
if sys.version_info >= (3, 11):
|
|
57
|
+
|
|
58
|
+
def to_bytes(
|
|
59
|
+
self,
|
|
60
|
+
length: SupportsIndex = 1,
|
|
61
|
+
byteorder: Literal["little", "big"] = "big",
|
|
62
|
+
*,
|
|
63
|
+
signed: bool = False,
|
|
64
|
+
) -> bytes:
|
|
65
|
+
return self._ref.value.to_bytes(length, byteorder, signed=signed)
|
|
66
|
+
|
|
67
|
+
else:
|
|
68
|
+
|
|
69
|
+
def to_bytes(
|
|
70
|
+
self,
|
|
71
|
+
length: SupportsIndex,
|
|
72
|
+
byteorder: Literal["little", "big"],
|
|
73
|
+
*,
|
|
74
|
+
signed: bool = False,
|
|
75
|
+
) -> bytes:
|
|
76
|
+
return self._ref.value.to_bytes(length, byteorder, signed=signed)
|
|
77
|
+
|
|
78
|
+
if sys.version_info >= (3, 12):
|
|
79
|
+
|
|
80
|
+
def is_integer(self) -> Literal[True]:
|
|
81
|
+
return True
|
|
82
|
+
|
|
83
|
+
def __add__(self, value: Union[int, IntProxy]) -> int:
|
|
84
|
+
return self._ref.value.__add__(int(utils.to_value(value)))
|
|
85
|
+
|
|
86
|
+
def __sub__(self, value: Union[int, IntProxy]) -> int:
|
|
87
|
+
return self._ref.value.__sub__(int(utils.to_value(value)))
|
|
88
|
+
|
|
89
|
+
def __mul__(self, value: Union[int, IntProxy]) -> int:
|
|
90
|
+
return self._ref.value.__mul__(int(utils.to_value(value)))
|
|
91
|
+
|
|
92
|
+
def __floordiv__(self, value: Union[int, IntProxy]) -> int:
|
|
93
|
+
return self._ref.value.__floordiv__(int(utils.to_value(value)))
|
|
94
|
+
|
|
95
|
+
def __truediv__(self, value: Union[int, IntProxy]) -> float:
|
|
96
|
+
return self._ref.value.__truediv__(int(utils.to_value(value)))
|
|
97
|
+
|
|
98
|
+
def __mod__(self, value: Union[int, IntProxy]) -> int:
|
|
99
|
+
return self._ref.value.__mod__(int(utils.to_value(value)))
|
|
100
|
+
|
|
101
|
+
def __divmod__(self, value: Union[int, IntProxy]) -> Tuple[int, int]:
|
|
102
|
+
return self._ref.value.__divmod__(int(utils.to_value(value)))
|
|
103
|
+
|
|
104
|
+
def __radd__(self, value: Union[int, IntProxy]) -> int:
|
|
105
|
+
return self._ref.value.__radd__(int(utils.to_value(value)))
|
|
106
|
+
|
|
107
|
+
def __rsub__(self, value: Union[int, IntProxy]) -> int:
|
|
108
|
+
return self._ref.value.__rsub__(int(utils.to_value(value)))
|
|
109
|
+
|
|
110
|
+
def __rmul__(self, value: Union[int, IntProxy]) -> int:
|
|
111
|
+
return self._ref.value.__rmul__(int(utils.to_value(value)))
|
|
112
|
+
|
|
113
|
+
def __rfloordiv__(self, value: Union[int, IntProxy]) -> int:
|
|
114
|
+
return self._ref.value.__rfloordiv__(int(utils.to_value(value)))
|
|
115
|
+
|
|
116
|
+
def __rtruediv__(self, value: Union[int, IntProxy]) -> float:
|
|
117
|
+
return self._ref.value.__rtruediv__(int(utils.to_value(value)))
|
|
118
|
+
|
|
119
|
+
def __rmod__(self, value: Union[int, IntProxy]) -> int:
|
|
120
|
+
return self._ref.value.__rmod__(int(utils.to_value(value)))
|
|
121
|
+
|
|
122
|
+
def __rdivmod__(self, value: Union[int, IntProxy]) -> Tuple[int, int]:
|
|
123
|
+
return self._ref.value.__rdivmod__(int(utils.to_value(value)))
|
|
124
|
+
|
|
125
|
+
def __pow__(
|
|
126
|
+
self, value: Union[int, IntProxy], mod: Optional[int] = None
|
|
127
|
+
) -> Union[int, float]:
|
|
128
|
+
return self._ref.value.__pow__(int(utils.to_value(value)), mod)
|
|
129
|
+
|
|
130
|
+
def __rpow__(
|
|
131
|
+
self, value: Union[int, IntProxy], mod: Optional[int] = None
|
|
132
|
+
) -> Union[int, float]:
|
|
133
|
+
return self._ref.value.__rpow__(int(utils.to_value(value)), mod)
|
|
134
|
+
|
|
135
|
+
def __and__(self, value: Union[int, IntProxy]) -> int:
|
|
136
|
+
return self._ref.value.__and__(int(utils.to_value(value)))
|
|
137
|
+
|
|
138
|
+
def __or__(self, value: Union[int, IntProxy]) -> int:
|
|
139
|
+
return self._ref.value.__or__(int(utils.to_value(value)))
|
|
140
|
+
|
|
141
|
+
def __xor__(self, value: Union[int, IntProxy]) -> int:
|
|
142
|
+
return self._ref.value.__xor__(int(utils.to_value(value)))
|
|
143
|
+
|
|
144
|
+
def __lshift__(self, value: Union[int, IntProxy]) -> int:
|
|
145
|
+
return self._ref.value.__lshift__(int(utils.to_value(value)))
|
|
146
|
+
|
|
147
|
+
def __rshift__(self, value: Union[int, IntProxy]) -> int:
|
|
148
|
+
return self._ref.value.__rshift__(int(utils.to_value(value)))
|
|
149
|
+
|
|
150
|
+
def __rand__(self, value: Union[int, IntProxy]) -> int:
|
|
151
|
+
return self._ref.value.__rand__(int(utils.to_value(value)))
|
|
152
|
+
|
|
153
|
+
def __ror__(self, value: Union[int, IntProxy]) -> int:
|
|
154
|
+
return self._ref.value.__ror__(int(utils.to_value(value)))
|
|
155
|
+
|
|
156
|
+
def __rxor__(self, value: Union[int, IntProxy]) -> int:
|
|
157
|
+
return self._ref.value.__rxor__(int(utils.to_value(value)))
|
|
158
|
+
|
|
159
|
+
def __rlshift__(self, value: Union[int, IntProxy]) -> int:
|
|
160
|
+
return self._ref.value.__rlshift__(int(utils.to_value(value)))
|
|
161
|
+
|
|
162
|
+
def __rrshift__(self, value: Union[int, IntProxy]) -> int:
|
|
163
|
+
return self._ref.value.__rrshift__(int(utils.to_value(value)))
|
|
164
|
+
|
|
165
|
+
def __neg__(self) -> int:
|
|
166
|
+
return self._ref.value.__neg__()
|
|
167
|
+
|
|
168
|
+
def __pos__(self) -> int:
|
|
169
|
+
return self._ref.value.__pos__()
|
|
170
|
+
|
|
171
|
+
def __invert__(self) -> int:
|
|
172
|
+
return self._ref.value.__invert__()
|
|
173
|
+
|
|
174
|
+
def __trunc__(self) -> int:
|
|
175
|
+
return self._ref.value.__trunc__()
|
|
176
|
+
|
|
177
|
+
def __ceil__(self) -> int:
|
|
178
|
+
return self._ref.value.__ceil__()
|
|
179
|
+
|
|
180
|
+
def __floor__(self) -> int:
|
|
181
|
+
return self._ref.value.__floor__()
|
|
182
|
+
|
|
183
|
+
def __round__(self, ndigits: SupportsIndex = 0) -> int:
|
|
184
|
+
return self._ref.value.__round__(ndigits)
|
|
185
|
+
|
|
186
|
+
def __getnewargs__(self) -> Tuple[int]:
|
|
187
|
+
return self._ref.value.__getnewargs__()
|
|
188
|
+
|
|
189
|
+
def __eq__(self, value: object) -> bool:
|
|
190
|
+
return self._ref.value.__eq__(int(utils.to_value(value)))
|
|
191
|
+
|
|
192
|
+
def __ne__(self, value: object) -> bool:
|
|
193
|
+
return self._ref.value.__ne__(int(utils.to_value(value)))
|
|
194
|
+
|
|
195
|
+
def __lt__(self, value) -> bool:
|
|
196
|
+
return self._ref.value.__lt__(int(utils.to_value(value)))
|
|
197
|
+
|
|
198
|
+
def __le__(self, value) -> bool:
|
|
199
|
+
return self._ref.value.__le__(int(utils.to_value(value)))
|
|
200
|
+
|
|
201
|
+
def __gt__(self, value) -> bool:
|
|
202
|
+
return self._ref.value.__gt__(int(utils.to_value(value)))
|
|
203
|
+
|
|
204
|
+
def __ge__(self, value) -> bool:
|
|
205
|
+
return self._ref.value.__ge__(int(utils.to_value(value)))
|
|
206
|
+
|
|
207
|
+
def __float__(self) -> float:
|
|
208
|
+
return self._ref.value.__float__()
|
|
209
|
+
|
|
210
|
+
def __int__(self) -> int:
|
|
211
|
+
return self._ref.value.__int__()
|
|
212
|
+
|
|
213
|
+
def __abs__(self) -> int:
|
|
214
|
+
return self._ref.value.__abs__()
|
|
215
|
+
|
|
216
|
+
def __hash__(self) -> int:
|
|
217
|
+
return self._ref.value.__hash__()
|
|
218
|
+
|
|
219
|
+
def __bool__(self) -> bool:
|
|
220
|
+
return self._ref.value.__bool__()
|
|
221
|
+
|
|
222
|
+
def __index__(self) -> int:
|
|
223
|
+
return self._ref.value.__index__()
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
from typing import (
|
|
3
|
+
Any,
|
|
4
|
+
Callable,
|
|
5
|
+
Iterable,
|
|
6
|
+
Iterator,
|
|
7
|
+
List,
|
|
8
|
+
SupportsIndex,
|
|
9
|
+
TypeVar,
|
|
10
|
+
Generic,
|
|
11
|
+
Union,
|
|
12
|
+
overload,
|
|
13
|
+
)
|
|
14
|
+
from typing_extensions import Self
|
|
15
|
+
from . import utils
|
|
16
|
+
from .base import Proxy
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
_T = TypeVar("_T")
|
|
20
|
+
_S = TypeVar("_S")
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ListProxy(Proxy, list, Generic[_T]):
|
|
24
|
+
def __init__(self, value: List[_T]):
|
|
25
|
+
from ex4nicegui.utils.signals import deep_ref
|
|
26
|
+
|
|
27
|
+
super().__init__(value)
|
|
28
|
+
self._ref = deep_ref(value)
|
|
29
|
+
|
|
30
|
+
def copy(self) -> List:
|
|
31
|
+
return self._ref.value.copy()
|
|
32
|
+
|
|
33
|
+
def append(self, object: _T, /) -> None:
|
|
34
|
+
self._ref.value.append(object)
|
|
35
|
+
|
|
36
|
+
def extend(self, iterable: Iterable[_T], /) -> None:
|
|
37
|
+
self._ref.value.extend(iterable)
|
|
38
|
+
|
|
39
|
+
def pop(self, index: SupportsIndex = -1, /) -> _T:
|
|
40
|
+
return self._ref.value.pop(index)
|
|
41
|
+
|
|
42
|
+
# Signature of `list.index` should be kept in line with `collections.UserList.index()`
|
|
43
|
+
# and multiprocessing.managers.ListProxy.index()
|
|
44
|
+
def index(
|
|
45
|
+
self, value: _T, start: SupportsIndex = 0, stop: SupportsIndex = sys.maxsize, /
|
|
46
|
+
) -> int:
|
|
47
|
+
return self._ref.value.index(value, start, stop)
|
|
48
|
+
|
|
49
|
+
def count(self, value: _T, /) -> int:
|
|
50
|
+
return self._ref.value.count(value)
|
|
51
|
+
|
|
52
|
+
def insert(self, index: SupportsIndex, object: _T, /) -> None:
|
|
53
|
+
self._ref.value.insert(index, object)
|
|
54
|
+
|
|
55
|
+
def remove(self, value: _T, /) -> None:
|
|
56
|
+
self._ref.value.remove(value)
|
|
57
|
+
|
|
58
|
+
def reverse(self) -> None:
|
|
59
|
+
return self._ref.value.reverse()
|
|
60
|
+
|
|
61
|
+
# Signature of `list.sort` should be kept inline with `collections.UserList.sort()`
|
|
62
|
+
# and multiprocessing.managers.ListProxy.sort()
|
|
63
|
+
#
|
|
64
|
+
# Use List[SupportsRichComparisonT] for the first overload rather than [SupportsRichComparison]
|
|
65
|
+
# to work around invariance
|
|
66
|
+
@overload
|
|
67
|
+
def sort(self: list, *, key: None = None, reverse: bool = False) -> None: ...
|
|
68
|
+
@overload
|
|
69
|
+
def sort(self, *, key: Callable[[_T], Any], reverse: bool = False) -> None: ...
|
|
70
|
+
|
|
71
|
+
def sort(
|
|
72
|
+
self, *, key: Union[Callable[[_T], Any], None] = None, reverse: bool = False
|
|
73
|
+
) -> None:
|
|
74
|
+
self._ref.value.sort(key=key, reverse=reverse) # type: ignore
|
|
75
|
+
|
|
76
|
+
def __len__(self) -> int:
|
|
77
|
+
return len(self._ref.value)
|
|
78
|
+
|
|
79
|
+
def __iter__(self) -> Iterator[_T]:
|
|
80
|
+
return iter(self._ref.value)
|
|
81
|
+
|
|
82
|
+
@overload
|
|
83
|
+
def __getitem__(self, i: SupportsIndex, /) -> _T: ...
|
|
84
|
+
@overload
|
|
85
|
+
def __getitem__(self, s: slice, /) -> List[_T]: ...
|
|
86
|
+
|
|
87
|
+
def __getitem__(self, i: Union[SupportsIndex, slice], /) -> Union[_T, List[_T]]:
|
|
88
|
+
return self._ref.value.__getitem__(i)
|
|
89
|
+
|
|
90
|
+
@overload
|
|
91
|
+
def __setitem__(self, key: SupportsIndex, value: _T, /) -> None: ...
|
|
92
|
+
@overload
|
|
93
|
+
def __setitem__(self, key: slice, value: Iterable[_T], /) -> None: ...
|
|
94
|
+
|
|
95
|
+
def __setitem__(
|
|
96
|
+
self, key: Union[SupportsIndex, slice], value: Union[_T, Iterable[_T]], /
|
|
97
|
+
) -> None:
|
|
98
|
+
self._ref.value.__setitem__(key, value)
|
|
99
|
+
|
|
100
|
+
def __delitem__(self, key: Union[SupportsIndex, slice], /) -> None:
|
|
101
|
+
self._ref.value.__delitem__(key)
|
|
102
|
+
|
|
103
|
+
# Overloading looks unnecessary, but is needed to work around complex mypy problems
|
|
104
|
+
@overload
|
|
105
|
+
def __add__(self, value: List[_T], /) -> List[_T]: ...
|
|
106
|
+
@overload
|
|
107
|
+
def __add__(self, value: List[_S], /) -> List[Union[_S, _T]]: ...
|
|
108
|
+
|
|
109
|
+
def __add__(
|
|
110
|
+
self, value: Union[List[_T], List[_S]], /
|
|
111
|
+
) -> Union[List[_T], List[Union[_S, _T]]]:
|
|
112
|
+
return self._ref.value.__add__(utils.to_value(value))
|
|
113
|
+
|
|
114
|
+
def __iadd__(self, value: Iterable[_T], /) -> Self: # type: ignore[misc]
|
|
115
|
+
self._ref.value.__iadd__(utils.to_value(value))
|
|
116
|
+
return self
|
|
117
|
+
|
|
118
|
+
def __mul__(self, value: SupportsIndex, /) -> List[_T]:
|
|
119
|
+
return self._ref.value.__mul__(utils.to_value(value))
|
|
120
|
+
|
|
121
|
+
def __rmul__(self, value: SupportsIndex, /) -> List[_T]:
|
|
122
|
+
return self._ref.value.__rmul__(utils.to_value(value))
|
|
123
|
+
|
|
124
|
+
def __imul__(self, value: SupportsIndex, /) -> Self:
|
|
125
|
+
self._ref.value.__imul__(utils.to_value(value))
|
|
126
|
+
return self
|
|
127
|
+
|
|
128
|
+
def __contains__(self, key: object, /) -> bool:
|
|
129
|
+
return self._ref.value.__contains__(key)
|
|
130
|
+
|
|
131
|
+
def __reversed__(self) -> Iterator[_T]:
|
|
132
|
+
return self._ref.value.__reversed__()
|
|
133
|
+
|
|
134
|
+
def __gt__(self, value: List[_T], /) -> bool:
|
|
135
|
+
return self._ref.value.__gt__(utils.to_value(value))
|
|
136
|
+
|
|
137
|
+
def __ge__(self, value: List[_T], /) -> bool:
|
|
138
|
+
return self._ref.value.__ge__(utils.to_value(value))
|
|
139
|
+
|
|
140
|
+
def __lt__(self, value: List[_T], /) -> bool:
|
|
141
|
+
return self._ref.value.__lt__(utils.to_value(value))
|
|
142
|
+
|
|
143
|
+
def __le__(self, value: List[_T], /) -> bool:
|
|
144
|
+
return self._ref.value.__le__(utils.to_value(value))
|
|
145
|
+
|
|
146
|
+
def __eq__(self, value: object, /) -> bool:
|
|
147
|
+
return self._ref.value.__eq__(utils.to_value(value))
|