rapydscript-ns 0.8.4 → 0.9.0
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.
- package/.agignore +1 -1
- package/.github/workflows/ci.yml +38 -38
- package/=template.pyj +5 -5
- package/CHANGELOG.md +18 -0
- package/HACKING.md +103 -103
- package/LICENSE +24 -24
- package/README.md +715 -169
- package/TODO.md +9 -2
- package/add-toc-to-readme +2 -2
- package/bin/export +75 -75
- package/bin/rapydscript +70 -70
- package/bin/web-repl-export +102 -102
- package/build +2 -2
- package/language-service/index.js +36 -27
- package/package.json +1 -1
- package/publish.py +37 -37
- package/release/baselib-plain-pretty.js +2358 -168
- package/release/baselib-plain-ugly.js +73 -3
- package/release/compiler.js +6282 -3092
- package/release/signatures.json +31 -30
- package/session.vim +4 -4
- package/setup.cfg +2 -2
- package/src/ast.pyj +1 -0
- package/src/baselib-builtins.pyj +340 -2
- package/src/baselib-bytes.pyj +664 -0
- package/src/baselib-errors.pyj +1 -1
- package/src/baselib-internal.pyj +267 -60
- package/src/baselib-itertools.pyj +110 -97
- package/src/baselib-str.pyj +22 -4
- package/src/compiler.pyj +36 -36
- package/src/errors.pyj +30 -30
- package/src/lib/abc.pyj +317 -0
- package/src/lib/aes.pyj +646 -646
- package/src/lib/copy.pyj +120 -120
- package/src/lib/dataclasses.pyj +532 -0
- package/src/lib/elementmaker.pyj +83 -83
- package/src/lib/encodings.pyj +126 -126
- package/src/lib/enum.pyj +125 -0
- package/src/lib/gettext.pyj +569 -569
- package/src/lib/itertools.pyj +580 -580
- package/src/lib/math.pyj +193 -193
- package/src/lib/operator.pyj +11 -11
- package/src/lib/pythonize.pyj +20 -20
- package/src/lib/random.pyj +118 -118
- package/src/lib/re.pyj +504 -470
- package/src/lib/react.pyj +74 -74
- package/src/lib/traceback.pyj +63 -63
- package/src/lib/typing.pyj +577 -0
- package/src/lib/uuid.pyj +77 -77
- package/src/monaco-language-service/builtins.js +14 -4
- package/src/monaco-language-service/diagnostics.js +19 -20
- package/src/monaco-language-service/dts.js +550 -550
- package/src/output/classes.pyj +62 -26
- package/src/output/comments.pyj +45 -45
- package/src/output/exceptions.pyj +201 -201
- package/src/output/functions.pyj +78 -5
- package/src/output/jsx.pyj +164 -164
- package/src/output/loops.pyj +5 -2
- package/src/output/operators.pyj +100 -34
- package/src/output/treeshake.pyj +182 -182
- package/src/output/utils.pyj +72 -72
- package/src/parse.pyj +80 -16
- package/src/string_interpolation.pyj +72 -72
- package/src/tokenizer.pyj +9 -4
- package/src/unicode_aliases.pyj +576 -576
- package/src/utils.pyj +192 -192
- package/test/_import_one.pyj +37 -37
- package/test/_import_two/__init__.pyj +11 -11
- package/test/_import_two/level2/deep.pyj +4 -4
- package/test/_import_two/other.pyj +6 -6
- package/test/_import_two/sub.pyj +13 -13
- package/test/abc.pyj +291 -0
- package/test/aes_vectors.pyj +421 -421
- package/test/annotations.pyj +80 -80
- package/test/arithmetic_nostrict.pyj +88 -0
- package/test/arithmetic_types.pyj +169 -0
- package/test/baselib.pyj +91 -0
- package/test/bytes.pyj +467 -0
- package/test/classes.pyj +1 -0
- package/test/comparison_ops.pyj +173 -0
- package/test/dataclasses.pyj +253 -0
- package/test/decorators.pyj +77 -77
- package/test/docstrings.pyj +39 -39
- package/test/elementmaker_test.pyj +45 -45
- package/test/enum.pyj +134 -0
- package/test/eval_exec.pyj +56 -0
- package/test/format.pyj +148 -0
- package/test/functions.pyj +151 -151
- package/test/generators.pyj +41 -41
- package/test/generic.pyj +370 -370
- package/test/imports.pyj +72 -72
- package/test/internationalization.pyj +73 -73
- package/test/lint.pyj +164 -164
- package/test/loops.pyj +85 -85
- package/test/numpy.pyj +734 -734
- package/test/object.pyj +64 -0
- package/test/omit_function_metadata.pyj +20 -20
- package/test/python_compat.pyj +17 -15
- package/test/python_features.pyj +70 -15
- package/test/regexp.pyj +83 -55
- package/test/repl.pyj +121 -121
- package/test/scoped_flags.pyj +76 -76
- package/test/tuples.pyj +96 -0
- package/test/typing.pyj +469 -0
- package/test/unit/index.js +116 -7
- package/test/unit/language-service-dts.js +543 -543
- package/test/unit/language-service-hover.js +455 -455
- package/test/unit/language-service.js +84 -0
- package/test/unit/web-repl.js +804 -1
- package/test/vars_locals_globals.pyj +94 -0
- package/tools/cli.js +558 -547
- package/tools/compile.js +224 -219
- package/tools/completer.js +131 -131
- package/tools/embedded_compiler.js +262 -251
- package/tools/gettext.js +185 -185
- package/tools/ini.js +65 -65
- package/tools/lint.js +16 -19
- package/tools/msgfmt.js +187 -187
- package/tools/repl.js +223 -223
- package/tools/test.js +118 -118
- package/tools/utils.js +128 -128
- package/tools/web_repl.js +95 -95
- package/try +41 -41
- package/web-repl/env.js +196 -196
- package/web-repl/index.html +163 -163
- package/web-repl/main.js +252 -252
- package/web-repl/prism.css +139 -139
- package/web-repl/prism.js +113 -113
- package/web-repl/rapydscript.js +224 -224
- package/web-repl/sha1.js +25 -25
- package/PYTHON_DIFFERENCES_REPORT.md +0 -291
- package/PYTHON_FEATURE_COVERAGE.md +0 -200
package/test/abc.pyj
ADDED
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
# globals: assrt
|
|
2
|
+
# vim:fileencoding=utf-8
|
|
3
|
+
#
|
|
4
|
+
# abc.pyj — tests for the abc standard library module.
|
|
5
|
+
|
|
6
|
+
ae = assrt.equal
|
|
7
|
+
ade = assrt.deepEqual
|
|
8
|
+
ok = assrt.ok
|
|
9
|
+
|
|
10
|
+
from abc import ABC, ABCMeta, abstractmethod, Protocol, runtime_checkable, get_cache_token
|
|
11
|
+
|
|
12
|
+
# ── 1. @abstractmethod marks the function ─────────────────────────────────────
|
|
13
|
+
|
|
14
|
+
def _tagged(): pass
|
|
15
|
+
abstractmethod(_tagged)
|
|
16
|
+
ok(_tagged.__isabstractmethod__)
|
|
17
|
+
|
|
18
|
+
# ── 2. Abstract class cannot be instantiated ──────────────────────────────────
|
|
19
|
+
|
|
20
|
+
class _Shape(ABC):
|
|
21
|
+
@abstractmethod
|
|
22
|
+
def area(self): pass
|
|
23
|
+
|
|
24
|
+
_raised = False
|
|
25
|
+
try:
|
|
26
|
+
_Shape()
|
|
27
|
+
except TypeError:
|
|
28
|
+
_raised = True
|
|
29
|
+
ok(_raised)
|
|
30
|
+
|
|
31
|
+
# The error message contains the abstract method name
|
|
32
|
+
_msg = ''
|
|
33
|
+
try:
|
|
34
|
+
_Shape()
|
|
35
|
+
except TypeError as e:
|
|
36
|
+
_msg = str(e)
|
|
37
|
+
ok('_Shape' in _msg)
|
|
38
|
+
ok('area' in _msg)
|
|
39
|
+
|
|
40
|
+
# ── 3. Concrete subclass CAN be instantiated ──────────────────────────────────
|
|
41
|
+
|
|
42
|
+
class _Circle(_Shape):
|
|
43
|
+
def __init__(self, r):
|
|
44
|
+
self.r = r
|
|
45
|
+
def area(self):
|
|
46
|
+
return 3.14159 * self.r * self.r
|
|
47
|
+
|
|
48
|
+
_c = _Circle(5)
|
|
49
|
+
ok(_c is not None)
|
|
50
|
+
ae(_c.r, 5)
|
|
51
|
+
ok(abs(_c.area() - 78.53975) < 0.001)
|
|
52
|
+
|
|
53
|
+
# ── 4. isinstance checks work for concrete subclasses ─────────────────────────
|
|
54
|
+
|
|
55
|
+
ok(isinstance(_c, _Circle))
|
|
56
|
+
ok(isinstance(_c, _Shape))
|
|
57
|
+
ok(isinstance(_c, ABC))
|
|
58
|
+
|
|
59
|
+
# ── 5. Multiple abstract methods listed in TypeError (alphabetical order) ──────
|
|
60
|
+
|
|
61
|
+
class _Multi(ABC):
|
|
62
|
+
@abstractmethod
|
|
63
|
+
def bar(self): pass
|
|
64
|
+
@abstractmethod
|
|
65
|
+
def foo(self): pass
|
|
66
|
+
|
|
67
|
+
_m_raised = False
|
|
68
|
+
_m_msg = ''
|
|
69
|
+
try:
|
|
70
|
+
_Multi()
|
|
71
|
+
except TypeError as e:
|
|
72
|
+
_m_raised = True
|
|
73
|
+
_m_msg = str(e)
|
|
74
|
+
ok(_m_raised)
|
|
75
|
+
ok('bar' in _m_msg)
|
|
76
|
+
ok('foo' in _m_msg)
|
|
77
|
+
ok('methods' in _m_msg) # plural
|
|
78
|
+
|
|
79
|
+
# ── 6. Partial implementation still raises TypeError ──────────────────────────
|
|
80
|
+
|
|
81
|
+
class _PartialMulti(_Multi):
|
|
82
|
+
def foo(self):
|
|
83
|
+
return 1
|
|
84
|
+
|
|
85
|
+
_partial_raised = False
|
|
86
|
+
try:
|
|
87
|
+
_PartialMulti()
|
|
88
|
+
except TypeError:
|
|
89
|
+
_partial_raised = True
|
|
90
|
+
ok(_partial_raised)
|
|
91
|
+
|
|
92
|
+
# Full implementation works
|
|
93
|
+
class _FullMulti(_Multi):
|
|
94
|
+
def foo(self): return 1
|
|
95
|
+
def bar(self): return 2
|
|
96
|
+
|
|
97
|
+
_fm = _FullMulti()
|
|
98
|
+
ae(_fm.foo(), 1)
|
|
99
|
+
ae(_fm.bar(), 2)
|
|
100
|
+
|
|
101
|
+
# ── 7. __abstractmethods__ set on the class ───────────────────────────────────
|
|
102
|
+
|
|
103
|
+
ok('area' in _Shape.__abstractmethods__)
|
|
104
|
+
ae(len(_Shape.__abstractmethods__), 1)
|
|
105
|
+
ae(len(_Circle.__abstractmethods__), 0)
|
|
106
|
+
|
|
107
|
+
# ── 8. Abstract class with own __init__ ───────────────────────────────────────
|
|
108
|
+
|
|
109
|
+
class _Vehicle(ABC):
|
|
110
|
+
def __init__(self, name):
|
|
111
|
+
self.name = name
|
|
112
|
+
|
|
113
|
+
@abstractmethod
|
|
114
|
+
def drive(self): pass
|
|
115
|
+
|
|
116
|
+
class _Car(_Vehicle):
|
|
117
|
+
def drive(self):
|
|
118
|
+
return 'driving ' + self.name
|
|
119
|
+
|
|
120
|
+
_car = _Car('Tesla')
|
|
121
|
+
ae(_car.name, 'Tesla')
|
|
122
|
+
ae(_car.drive(), 'driving Tesla')
|
|
123
|
+
|
|
124
|
+
_veh_raised = False
|
|
125
|
+
try:
|
|
126
|
+
_Vehicle('Bus')
|
|
127
|
+
except TypeError:
|
|
128
|
+
_veh_raised = True
|
|
129
|
+
ok(_veh_raised)
|
|
130
|
+
|
|
131
|
+
# ── 9. Multi-level abstract inheritance ───────────────────────────────────────
|
|
132
|
+
|
|
133
|
+
class _A(ABC):
|
|
134
|
+
@abstractmethod
|
|
135
|
+
def m1(self): pass
|
|
136
|
+
|
|
137
|
+
class _B(_A):
|
|
138
|
+
@abstractmethod
|
|
139
|
+
def m2(self): pass
|
|
140
|
+
|
|
141
|
+
_b_raised = False
|
|
142
|
+
try:
|
|
143
|
+
_B()
|
|
144
|
+
except TypeError:
|
|
145
|
+
_b_raised = True
|
|
146
|
+
ok(_b_raised)
|
|
147
|
+
|
|
148
|
+
class _C(_B):
|
|
149
|
+
def m1(self): return 'one'
|
|
150
|
+
def m2(self): return 'two'
|
|
151
|
+
|
|
152
|
+
_cobj = _C()
|
|
153
|
+
ae(_cobj.m1(), 'one')
|
|
154
|
+
ae(_cobj.m2(), 'two')
|
|
155
|
+
|
|
156
|
+
# ── 10. ABC.register() — virtual subclass isinstance ─────────────────────────
|
|
157
|
+
|
|
158
|
+
class _MyABC(ABC):
|
|
159
|
+
@abstractmethod
|
|
160
|
+
def do_it(self): pass
|
|
161
|
+
|
|
162
|
+
class _External:
|
|
163
|
+
def do_it(self):
|
|
164
|
+
return 42
|
|
165
|
+
|
|
166
|
+
_MyABC.register(_External)
|
|
167
|
+
ok(isinstance(_External(), _MyABC))
|
|
168
|
+
|
|
169
|
+
# Non-registered class without inheritance is NOT an instance
|
|
170
|
+
class _Unrelated:
|
|
171
|
+
def do_it(self): return 99
|
|
172
|
+
|
|
173
|
+
ok(not isinstance(_Unrelated(), _MyABC))
|
|
174
|
+
|
|
175
|
+
# ── 11. ABC.register() used as a class decorator ──────────────────────────────
|
|
176
|
+
|
|
177
|
+
class _Base(ABC):
|
|
178
|
+
@abstractmethod
|
|
179
|
+
def compute(self): pass
|
|
180
|
+
|
|
181
|
+
@_Base.register
|
|
182
|
+
class _Virtual:
|
|
183
|
+
def compute(self): return 7
|
|
184
|
+
|
|
185
|
+
ok(isinstance(_Virtual(), _Base))
|
|
186
|
+
|
|
187
|
+
# ── 12. get_cache_token() returns 0 ──────────────────────────────────────────
|
|
188
|
+
|
|
189
|
+
ae(get_cache_token(), 0)
|
|
190
|
+
|
|
191
|
+
# ── 13. Protocol + @runtime_checkable — structural isinstance ──────────────────
|
|
192
|
+
|
|
193
|
+
@runtime_checkable
|
|
194
|
+
class _Drawable(Protocol):
|
|
195
|
+
def draw(self): pass
|
|
196
|
+
|
|
197
|
+
class _Canvas:
|
|
198
|
+
def draw(self):
|
|
199
|
+
return 'painting'
|
|
200
|
+
|
|
201
|
+
class _NotDrawable:
|
|
202
|
+
def paint(self): pass
|
|
203
|
+
|
|
204
|
+
ok(isinstance(_Canvas(), _Drawable))
|
|
205
|
+
ok(not isinstance(_NotDrawable(), _Drawable))
|
|
206
|
+
ok(not isinstance(42, _Drawable))
|
|
207
|
+
ok(not isinstance(None, _Drawable))
|
|
208
|
+
|
|
209
|
+
# ── 14. Protocol without @runtime_checkable — normal inheritance check ─────────
|
|
210
|
+
|
|
211
|
+
class _Closeable(Protocol):
|
|
212
|
+
def close(self): pass
|
|
213
|
+
|
|
214
|
+
class _ManagedFile(_Closeable):
|
|
215
|
+
def close(self):
|
|
216
|
+
return 'closed'
|
|
217
|
+
|
|
218
|
+
ok(isinstance(_ManagedFile(), _ManagedFile))
|
|
219
|
+
ok(isinstance(_ManagedFile(), _Closeable)) # direct subclass => True
|
|
220
|
+
|
|
221
|
+
class _OtherFile:
|
|
222
|
+
def close(self): return 'also closed'
|
|
223
|
+
|
|
224
|
+
# Without runtime_checkable, structural check does NOT happen
|
|
225
|
+
ok(not isinstance(_OtherFile(), _Closeable))
|
|
226
|
+
|
|
227
|
+
# ── 15. Protocol with @abstractmethod enforces instantiation guard ─────────────
|
|
228
|
+
|
|
229
|
+
class _AbstractProto(Protocol):
|
|
230
|
+
@abstractmethod
|
|
231
|
+
def required(self): pass
|
|
232
|
+
|
|
233
|
+
_ap_raised = False
|
|
234
|
+
try:
|
|
235
|
+
_AbstractProto()
|
|
236
|
+
except TypeError:
|
|
237
|
+
_ap_raised = True
|
|
238
|
+
ok(_ap_raised)
|
|
239
|
+
|
|
240
|
+
# Concrete implementation is instantiable
|
|
241
|
+
class _ConcreteProto(_AbstractProto):
|
|
242
|
+
def required(self): return 'done'
|
|
243
|
+
|
|
244
|
+
ok(_ConcreteProto() is not None)
|
|
245
|
+
|
|
246
|
+
# ── 16. Protocol __protocol_attrs__ contains non-dunder method names ───────────
|
|
247
|
+
|
|
248
|
+
@runtime_checkable
|
|
249
|
+
class _Sizeable(Protocol):
|
|
250
|
+
def size(self): pass
|
|
251
|
+
def count(self): pass
|
|
252
|
+
|
|
253
|
+
ok('size' in _Sizeable.__protocol_attrs__)
|
|
254
|
+
ok('count' in _Sizeable.__protocol_attrs__)
|
|
255
|
+
|
|
256
|
+
class _Box:
|
|
257
|
+
def size(self): return 10
|
|
258
|
+
def count(self): return 5
|
|
259
|
+
|
|
260
|
+
class _Half:
|
|
261
|
+
def size(self): return 3
|
|
262
|
+
|
|
263
|
+
ok(isinstance(_Box(), _Sizeable))
|
|
264
|
+
ok(not isinstance(_Half(), _Sizeable))
|
|
265
|
+
|
|
266
|
+
# ── 17. Protocol protocol_attrs inheritance (sub-protocols) ───────────────────
|
|
267
|
+
|
|
268
|
+
@runtime_checkable
|
|
269
|
+
class _Reader(Protocol):
|
|
270
|
+
def read(self): pass
|
|
271
|
+
|
|
272
|
+
@runtime_checkable
|
|
273
|
+
class _Writer(Protocol):
|
|
274
|
+
def write(self, data): pass
|
|
275
|
+
|
|
276
|
+
@runtime_checkable
|
|
277
|
+
class _ReadWriter(_Reader, _Writer, Protocol):
|
|
278
|
+
pass
|
|
279
|
+
|
|
280
|
+
ok('read' in _ReadWriter.__protocol_attrs__)
|
|
281
|
+
ok('write' in _ReadWriter.__protocol_attrs__)
|
|
282
|
+
|
|
283
|
+
class _FullRW:
|
|
284
|
+
def read(self): return 'data'
|
|
285
|
+
def write(self, data): pass
|
|
286
|
+
|
|
287
|
+
class _ReadOnly:
|
|
288
|
+
def read(self): return 'data'
|
|
289
|
+
|
|
290
|
+
ok(isinstance(_FullRW(), _ReadWriter))
|
|
291
|
+
ok(not isinstance(_ReadOnly(), _ReadWriter))
|