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.
Files changed (132) hide show
  1. package/.agignore +1 -1
  2. package/.github/workflows/ci.yml +38 -38
  3. package/=template.pyj +5 -5
  4. package/CHANGELOG.md +18 -0
  5. package/HACKING.md +103 -103
  6. package/LICENSE +24 -24
  7. package/README.md +715 -169
  8. package/TODO.md +9 -2
  9. package/add-toc-to-readme +2 -2
  10. package/bin/export +75 -75
  11. package/bin/rapydscript +70 -70
  12. package/bin/web-repl-export +102 -102
  13. package/build +2 -2
  14. package/language-service/index.js +36 -27
  15. package/package.json +1 -1
  16. package/publish.py +37 -37
  17. package/release/baselib-plain-pretty.js +2358 -168
  18. package/release/baselib-plain-ugly.js +73 -3
  19. package/release/compiler.js +6282 -3092
  20. package/release/signatures.json +31 -30
  21. package/session.vim +4 -4
  22. package/setup.cfg +2 -2
  23. package/src/ast.pyj +1 -0
  24. package/src/baselib-builtins.pyj +340 -2
  25. package/src/baselib-bytes.pyj +664 -0
  26. package/src/baselib-errors.pyj +1 -1
  27. package/src/baselib-internal.pyj +267 -60
  28. package/src/baselib-itertools.pyj +110 -97
  29. package/src/baselib-str.pyj +22 -4
  30. package/src/compiler.pyj +36 -36
  31. package/src/errors.pyj +30 -30
  32. package/src/lib/abc.pyj +317 -0
  33. package/src/lib/aes.pyj +646 -646
  34. package/src/lib/copy.pyj +120 -120
  35. package/src/lib/dataclasses.pyj +532 -0
  36. package/src/lib/elementmaker.pyj +83 -83
  37. package/src/lib/encodings.pyj +126 -126
  38. package/src/lib/enum.pyj +125 -0
  39. package/src/lib/gettext.pyj +569 -569
  40. package/src/lib/itertools.pyj +580 -580
  41. package/src/lib/math.pyj +193 -193
  42. package/src/lib/operator.pyj +11 -11
  43. package/src/lib/pythonize.pyj +20 -20
  44. package/src/lib/random.pyj +118 -118
  45. package/src/lib/re.pyj +504 -470
  46. package/src/lib/react.pyj +74 -74
  47. package/src/lib/traceback.pyj +63 -63
  48. package/src/lib/typing.pyj +577 -0
  49. package/src/lib/uuid.pyj +77 -77
  50. package/src/monaco-language-service/builtins.js +14 -4
  51. package/src/monaco-language-service/diagnostics.js +19 -20
  52. package/src/monaco-language-service/dts.js +550 -550
  53. package/src/output/classes.pyj +62 -26
  54. package/src/output/comments.pyj +45 -45
  55. package/src/output/exceptions.pyj +201 -201
  56. package/src/output/functions.pyj +78 -5
  57. package/src/output/jsx.pyj +164 -164
  58. package/src/output/loops.pyj +5 -2
  59. package/src/output/operators.pyj +100 -34
  60. package/src/output/treeshake.pyj +182 -182
  61. package/src/output/utils.pyj +72 -72
  62. package/src/parse.pyj +80 -16
  63. package/src/string_interpolation.pyj +72 -72
  64. package/src/tokenizer.pyj +9 -4
  65. package/src/unicode_aliases.pyj +576 -576
  66. package/src/utils.pyj +192 -192
  67. package/test/_import_one.pyj +37 -37
  68. package/test/_import_two/__init__.pyj +11 -11
  69. package/test/_import_two/level2/deep.pyj +4 -4
  70. package/test/_import_two/other.pyj +6 -6
  71. package/test/_import_two/sub.pyj +13 -13
  72. package/test/abc.pyj +291 -0
  73. package/test/aes_vectors.pyj +421 -421
  74. package/test/annotations.pyj +80 -80
  75. package/test/arithmetic_nostrict.pyj +88 -0
  76. package/test/arithmetic_types.pyj +169 -0
  77. package/test/baselib.pyj +91 -0
  78. package/test/bytes.pyj +467 -0
  79. package/test/classes.pyj +1 -0
  80. package/test/comparison_ops.pyj +173 -0
  81. package/test/dataclasses.pyj +253 -0
  82. package/test/decorators.pyj +77 -77
  83. package/test/docstrings.pyj +39 -39
  84. package/test/elementmaker_test.pyj +45 -45
  85. package/test/enum.pyj +134 -0
  86. package/test/eval_exec.pyj +56 -0
  87. package/test/format.pyj +148 -0
  88. package/test/functions.pyj +151 -151
  89. package/test/generators.pyj +41 -41
  90. package/test/generic.pyj +370 -370
  91. package/test/imports.pyj +72 -72
  92. package/test/internationalization.pyj +73 -73
  93. package/test/lint.pyj +164 -164
  94. package/test/loops.pyj +85 -85
  95. package/test/numpy.pyj +734 -734
  96. package/test/object.pyj +64 -0
  97. package/test/omit_function_metadata.pyj +20 -20
  98. package/test/python_compat.pyj +17 -15
  99. package/test/python_features.pyj +70 -15
  100. package/test/regexp.pyj +83 -55
  101. package/test/repl.pyj +121 -121
  102. package/test/scoped_flags.pyj +76 -76
  103. package/test/tuples.pyj +96 -0
  104. package/test/typing.pyj +469 -0
  105. package/test/unit/index.js +116 -7
  106. package/test/unit/language-service-dts.js +543 -543
  107. package/test/unit/language-service-hover.js +455 -455
  108. package/test/unit/language-service.js +84 -0
  109. package/test/unit/web-repl.js +804 -1
  110. package/test/vars_locals_globals.pyj +94 -0
  111. package/tools/cli.js +558 -547
  112. package/tools/compile.js +224 -219
  113. package/tools/completer.js +131 -131
  114. package/tools/embedded_compiler.js +262 -251
  115. package/tools/gettext.js +185 -185
  116. package/tools/ini.js +65 -65
  117. package/tools/lint.js +16 -19
  118. package/tools/msgfmt.js +187 -187
  119. package/tools/repl.js +223 -223
  120. package/tools/test.js +118 -118
  121. package/tools/utils.js +128 -128
  122. package/tools/web_repl.js +95 -95
  123. package/try +41 -41
  124. package/web-repl/env.js +196 -196
  125. package/web-repl/index.html +163 -163
  126. package/web-repl/main.js +252 -252
  127. package/web-repl/prism.css +139 -139
  128. package/web-repl/prism.js +113 -113
  129. package/web-repl/rapydscript.js +224 -224
  130. package/web-repl/sha1.js +25 -25
  131. package/PYTHON_DIFFERENCES_REPORT.md +0 -291
  132. 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))