rapydscript-ns 0.9.2 → 0.9.3

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 (151) 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 +19 -0
  5. package/HACKING.md +103 -103
  6. package/LICENSE +24 -24
  7. package/PYTHON_GAPS.md +420 -0
  8. package/README.md +153 -29
  9. package/TODO.md +16 -118
  10. package/add-toc-to-readme +2 -2
  11. package/bin/export +75 -75
  12. package/bin/rapydscript +70 -70
  13. package/bin/web-repl-export +102 -102
  14. package/build +2 -2
  15. package/language-service/index.js +237 -8
  16. package/memory/project_string_impl.md +43 -0
  17. package/package.json +1 -1
  18. package/publish.py +37 -37
  19. package/release/baselib-plain-pretty.js +248 -38
  20. package/release/baselib-plain-ugly.js +8 -8
  21. package/release/compiler.js +778 -277
  22. package/release/signatures.json +30 -30
  23. package/session.vim +4 -4
  24. package/setup.cfg +2 -2
  25. package/src/ast.pyj +4 -1
  26. package/src/baselib-builtins.pyj +56 -2
  27. package/src/baselib-containers.pyj +2 -0
  28. package/src/baselib-errors.pyj +7 -3
  29. package/src/baselib-internal.pyj +51 -6
  30. package/src/baselib-str.pyj +5 -3
  31. package/src/compiler.pyj +36 -36
  32. package/src/errors.pyj +30 -30
  33. package/src/lib/aes.pyj +646 -646
  34. package/src/lib/asyncio.pyj +534 -0
  35. package/src/lib/base64.pyj +399 -0
  36. package/src/lib/bisect.pyj +73 -0
  37. package/src/lib/collections.pyj +1 -1
  38. package/src/lib/copy.pyj +120 -120
  39. package/src/lib/csv.pyj +494 -0
  40. package/src/lib/elementmaker.pyj +83 -83
  41. package/src/lib/encodings.pyj +126 -126
  42. package/src/lib/gettext.pyj +569 -569
  43. package/src/lib/heapq.pyj +98 -0
  44. package/src/lib/html.pyj +382 -0
  45. package/src/lib/http/__init__.pyj +98 -0
  46. package/src/lib/http/client.pyj +304 -0
  47. package/src/lib/http/cookies.pyj +236 -0
  48. package/src/lib/itertools.pyj +580 -580
  49. package/src/lib/logging.pyj +672 -0
  50. package/src/lib/math.pyj +193 -193
  51. package/src/lib/operator.pyj +11 -11
  52. package/src/lib/pythonize.pyj +20 -20
  53. package/src/lib/random.pyj +118 -118
  54. package/src/lib/react.pyj +74 -74
  55. package/src/lib/string.pyj +357 -0
  56. package/src/lib/textwrap.pyj +329 -0
  57. package/src/lib/traceback.pyj +63 -63
  58. package/src/lib/urllib/__init__.pyj +14 -0
  59. package/src/lib/urllib/error.pyj +66 -0
  60. package/src/lib/urllib/parse.pyj +475 -0
  61. package/src/lib/urllib/request.pyj +86 -0
  62. package/src/lib/uuid.pyj +77 -77
  63. package/src/monaco-language-service/analyzer.js +5 -2
  64. package/src/monaco-language-service/completions.js +26 -0
  65. package/src/monaco-language-service/diagnostics.js +202 -3
  66. package/src/monaco-language-service/dts.js +550 -550
  67. package/src/monaco-language-service/scope.js +1 -0
  68. package/src/output/comments.pyj +45 -45
  69. package/src/output/exceptions.pyj +201 -201
  70. package/src/output/functions.pyj +152 -6
  71. package/src/output/jsx.pyj +164 -164
  72. package/src/output/loops.pyj +17 -2
  73. package/src/output/modules.pyj +1 -1
  74. package/src/output/operators.pyj +15 -0
  75. package/src/output/stream.pyj +0 -1
  76. package/src/output/treeshake.pyj +182 -182
  77. package/src/output/utils.pyj +72 -72
  78. package/src/parse.pyj +80 -17
  79. package/src/string_interpolation.pyj +72 -72
  80. package/src/tokenizer.pyj +1 -1
  81. package/src/unicode_aliases.pyj +576 -576
  82. package/src/utils.pyj +192 -192
  83. package/test/_import_one.pyj +37 -37
  84. package/test/_import_two/__init__.pyj +11 -11
  85. package/test/_import_two/level2/deep.pyj +4 -4
  86. package/test/_import_two/other.pyj +6 -6
  87. package/test/_import_two/sub.pyj +13 -13
  88. package/test/aes_vectors.pyj +421 -421
  89. package/test/annotations.pyj +80 -80
  90. package/test/async_generators.pyj +144 -0
  91. package/test/asyncio.pyj +307 -0
  92. package/test/base64.pyj +202 -0
  93. package/test/bisect.pyj +178 -0
  94. package/test/csv.pyj +405 -0
  95. package/test/decorators.pyj +77 -77
  96. package/test/docstrings.pyj +39 -39
  97. package/test/elementmaker_test.pyj +45 -45
  98. package/test/float_special.pyj +64 -0
  99. package/test/functions.pyj +151 -151
  100. package/test/generators.pyj +41 -41
  101. package/test/generic.pyj +370 -370
  102. package/test/heapq.pyj +174 -0
  103. package/test/html.pyj +212 -0
  104. package/test/http.pyj +259 -0
  105. package/test/imports.pyj +79 -72
  106. package/test/internationalization.pyj +73 -73
  107. package/test/lint.pyj +164 -164
  108. package/test/logging.pyj +356 -0
  109. package/test/long.pyj +130 -0
  110. package/test/loops.pyj +85 -85
  111. package/test/numpy.pyj +734 -734
  112. package/test/parenthesized_with.pyj +141 -0
  113. package/test/python_compat.pyj +3 -5
  114. package/test/python_modulo.pyj +76 -0
  115. package/test/python_modulo_off.pyj +21 -0
  116. package/test/repl.pyj +121 -121
  117. package/test/scoped_flags.pyj +76 -76
  118. package/test/str.pyj +14 -0
  119. package/test/string.pyj +245 -0
  120. package/test/textwrap.pyj +172 -0
  121. package/test/type_display.pyj +48 -0
  122. package/test/type_enforcement.pyj +164 -0
  123. package/test/unit/index.js +14 -6
  124. package/test/unit/language-service-completions.js +119 -0
  125. package/test/unit/language-service-dts.js +543 -543
  126. package/test/unit/language-service-hover.js +455 -455
  127. package/test/unit/language-service-scope.js +32 -0
  128. package/test/unit/language-service.js +127 -3
  129. package/test/unit/run-language-service.js +17 -3
  130. package/test/unit/web-repl.js +2094 -29
  131. package/test/urllib.pyj +193 -0
  132. package/tools/compile.js +1 -1
  133. package/tools/compiler.d.ts +367 -367
  134. package/tools/completer.js +131 -131
  135. package/tools/embedded_compiler.js +7 -7
  136. package/tools/gettext.js +185 -185
  137. package/tools/ini.js +65 -65
  138. package/tools/msgfmt.js +187 -187
  139. package/tools/repl.js +223 -223
  140. package/tools/test.js +118 -118
  141. package/tools/utils.js +128 -128
  142. package/tools/web_repl.js +95 -95
  143. package/try +41 -41
  144. package/web-repl/env.js +196 -196
  145. package/web-repl/index.html +163 -163
  146. package/web-repl/main.js +1 -1
  147. package/web-repl/prism.css +139 -139
  148. package/web-repl/prism.js +113 -113
  149. package/web-repl/rapydscript.js +224 -224
  150. package/web-repl/sha1.js +25 -25
  151. package/test/omit_function_metadata.pyj +0 -20
@@ -0,0 +1,193 @@
1
+ # globals: assrt
2
+ # vim:fileencoding=utf-8
3
+ #
4
+ # urllib.pyj
5
+ # Tests for the urllib standard library module.
6
+ #
7
+ # Covers urllib.parse (pure-JS, no network) and urllib.error exception classes.
8
+ # urllib.request requires a live network (Fetch API) so it is exercised only
9
+ # in the web-repl bundle tests via a mocked Promise chain.
10
+
11
+ from urllib.parse import (
12
+ quote, unquote, quote_plus, unquote_plus,
13
+ urlencode, urlsplit, urlunsplit, urlparse, urlunparse,
14
+ urljoin, parse_qs, parse_qsl,
15
+ SplitResult, ParseResult
16
+ )
17
+ from urllib.error import URLError, HTTPError
18
+
19
+ ae = assrt.equal
20
+ ade = assrt.deepEqual
21
+ ok = assrt.ok
22
+
23
+ # ── 1. quote — basic percent-encoding ────────────────────────────────────────
24
+
25
+ ae(quote('hello world'), 'hello%20world')
26
+ ae(quote('a/b/c'), 'a/b/c') # '/' is safe by default
27
+ ae(quote('a/b/c', safe=''), 'a%2Fb%2Fc')
28
+ ae(quote('abc123-_.~'), 'abc123-_.~') # unreserved chars pass through
29
+ ae(quote('a+b'), 'a%2Bb')
30
+ ae(quote('a=1&b=2', safe=''), 'a%3D1%26b%3D2')
31
+ ae(quote('!*\'()'), '%21%2A%27%28%29') # sub-delimiters encoded
32
+
33
+ # ── 2. unquote ────────────────────────────────────────────────────────────────
34
+
35
+ ae(unquote('hello%20world'), 'hello world')
36
+ ae(unquote('a%2Fb'), 'a/b')
37
+ ae(unquote('abc'), 'abc')
38
+ ae(unquote('a%2Bb'), 'a+b') # '+' is not decoded by unquote
39
+
40
+ # ── 3. quote_plus / unquote_plus ─────────────────────────────────────────────
41
+
42
+ ae(quote_plus('hello world'), 'hello+world')
43
+ ae(quote_plus('a+b'), 'a%2Bb')
44
+ ae(quote_plus('a/b', safe=''), 'a%2Fb')
45
+ ae(unquote_plus('hello+world'), 'hello world')
46
+ ae(unquote_plus('a%2Bb'), 'a+b')
47
+ ae(unquote_plus('hello%20world'), 'hello world')
48
+
49
+ # ── 4. urlencode — list of pairs ─────────────────────────────────────────────
50
+
51
+ ae(urlencode([['a', '1'], ['b', '2']]), 'a=1&b=2')
52
+ ae(urlencode([['q', 'hello world']]), 'q=hello%20world')
53
+ ae(urlencode([['k', 'a+b']]), 'k=a%2Bb')
54
+ ae(urlencode([]), '')
55
+
56
+ # ── 5. urlencode — doseq ─────────────────────────────────────────────────────
57
+
58
+ ae(urlencode([['a', ['x', 'y']]], doseq=True), 'a=x&a=y')
59
+ ae(urlencode([['a', ['x', 'y']], ['b', '1']], doseq=True), 'a=x&a=y&b=1')
60
+
61
+ # ── 6. urlsplit — absolute URL ────────────────────────────────────────────────
62
+
63
+ r = urlsplit('http://example.com/path?q=1#frag')
64
+ ae(r.scheme, 'http')
65
+ ae(r.netloc, 'example.com')
66
+ ae(r.path, '/path')
67
+ ae(r.query, 'q=1')
68
+ ae(r.fragment, 'frag')
69
+ ae(r.hostname, 'example.com')
70
+ ae(r.port, None)
71
+ ae(r.username, None)
72
+ ae(r.password, None)
73
+
74
+ # ── 7. urlsplit — authority with user:pass@host:port ─────────────────────────
75
+
76
+ r2 = urlsplit('https://user:pw@host:8080/p?x=1')
77
+ ae(r2.scheme, 'https')
78
+ ae(r2.netloc, 'user:pw@host:8080')
79
+ ae(r2.path, '/p')
80
+ ae(r2.query, 'x=1')
81
+ ae(r2.hostname, 'host')
82
+ ae(r2.port, 8080)
83
+ ae(r2.username, 'user')
84
+ ae(r2.password, 'pw')
85
+
86
+ # ── 8. urlsplit — no fragment ─────────────────────────────────────────────────
87
+
88
+ r3 = urlsplit('http://example.com/path?q=1', allow_fragments=False)
89
+ ae(r3.fragment, '')
90
+ ae(r3.query, 'q=1')
91
+
92
+ # ── 9. urlsplit — relative URL ────────────────────────────────────────────────
93
+
94
+ r4 = urlsplit('/path?q=1#frag')
95
+ ae(r4.scheme, '')
96
+ ae(r4.netloc, '')
97
+ ae(r4.path, '/path')
98
+ ae(r4.query, 'q=1')
99
+ ae(r4.fragment, 'frag')
100
+
101
+ # ── 10. urlparse — params split from path ─────────────────────────────────────
102
+
103
+ r5 = urlparse('http://example.com/path;params?q=1#frag')
104
+ ae(r5.scheme, 'http')
105
+ ae(r5.path, '/path')
106
+ ae(r5.params, 'params')
107
+ ae(r5.query, 'q=1')
108
+ ae(r5.fragment, 'frag')
109
+
110
+ r6 = urlparse('http://example.com/path?q=1')
111
+ ae(r6.params, '')
112
+
113
+ # ── 11. urlunsplit / urlunparse ───────────────────────────────────────────────
114
+
115
+ ae(urlunsplit(('http', 'example.com', '/path', 'q=1', 'frag')),
116
+ 'http://example.com/path?q=1#frag')
117
+ ae(urlunsplit(('http', 'example.com', '/path', '', '')),
118
+ 'http://example.com/path')
119
+ ae(urlunsplit(('', '', '/path', 'q=1', '')),
120
+ '/path?q=1')
121
+ ae(urlunparse(('http', 'example.com', '/path', 'par', 'q=1', 'frag')),
122
+ 'http://example.com/path;par?q=1#frag')
123
+ ae(urlunparse(('http', 'example.com', '/path', '', 'q=1', '')),
124
+ 'http://example.com/path?q=1')
125
+
126
+ # ── 12. geturl round-trip ─────────────────────────────────────────────────────
127
+
128
+ r7 = urlsplit('http://example.com/path?q=1#frag')
129
+ ae(r7.geturl(), 'http://example.com/path?q=1#frag')
130
+
131
+ r8 = urlparse('http://example.com/path?q=1#frag')
132
+ ae(r8.geturl(), 'http://example.com/path?q=1#frag')
133
+
134
+ # ── 13. urljoin ───────────────────────────────────────────────────────────────
135
+
136
+ ae(urljoin('http://example.com/foo', 'bar'), 'http://example.com/bar')
137
+ ae(urljoin('http://example.com/foo/', 'bar'), 'http://example.com/foo/bar')
138
+ ae(urljoin('http://example.com/', '/other'), 'http://example.com/other')
139
+ ae(urljoin('http://example.com/foo', 'http://other.com/'), 'http://other.com/')
140
+ ae(urljoin('http://example.com/foo', '?q=1'), 'http://example.com/foo?q=1')
141
+
142
+ # ── 14. parse_qsl ─────────────────────────────────────────────────────────────
143
+
144
+ pairs = parse_qsl('a=1&b=2&a=3')
145
+ ade(pairs[0], ['a', '1'])
146
+ ade(pairs[1], ['b', '2'])
147
+ ade(pairs[2], ['a', '3'])
148
+ ae(len(pairs), 3)
149
+
150
+ pairs2 = parse_qsl('a=hello+world')
151
+ ae(len(pairs2), 1)
152
+ ae(pairs2[0][1], 'hello world')
153
+
154
+ pairs3 = parse_qsl('q=a%20b')
155
+ ae(pairs3[0][1], 'a b')
156
+
157
+ ae(len(parse_qsl('')), 0)
158
+
159
+ # ── 15. parse_qs ─────────────────────────────────────────────────────────────
160
+
161
+ d = parse_qs('a=1&b=2&a=3')
162
+ ade(d['a'], ['1', '3'])
163
+ ade(d['b'], ['2'])
164
+
165
+ d2 = parse_qs('q=hello+world')
166
+ ae(d2['q'][0], 'hello world')
167
+
168
+ ae(len(parse_qs('')), 0)
169
+
170
+ # ── 16. URLError / HTTPError ──────────────────────────────────────────────────
171
+
172
+ try:
173
+ raise URLError('network error')
174
+ ok(False)
175
+ except URLError as e:
176
+ ok('network error' in str(e.reason))
177
+
178
+ try:
179
+ raise HTTPError('http://example.com', 404, 'Not Found', {}, None)
180
+ ok(False)
181
+ except HTTPError as e:
182
+ ae(e.code, 404)
183
+ ae(e.msg, 'Not Found')
184
+ ae(e.getcode(), 404)
185
+ ae(e.geturl(), 'http://example.com')
186
+ ok(isinstance(e, URLError))
187
+
188
+ try:
189
+ raise HTTPError('http://example.com', 500, 'Internal Server Error', {}, None)
190
+ ok(False)
191
+ except URLError as e:
192
+ # HTTPError is caught by URLError handler (inheritance)
193
+ ae(e.code, 500)
package/tools/compile.js CHANGED
@@ -76,7 +76,7 @@ module.exports = function(start_time, argv, base_path, src_path, lib_path) {
76
76
 
77
77
  var global_scoped_flags = build_scoped_flags(argv.python_flags);
78
78
  if (!argv.legacy_rapydscript) {
79
- var python_mode_flags = ['dict_literals', 'overload_getitem', 'bound_methods', 'hash_literals', 'overload_operators', 'truthiness', 'jsx'];
79
+ var python_mode_flags = ['dict_literals', 'overload_getitem', 'bound_methods', 'hash_literals', 'overload_operators', 'truthiness', 'jsx', 'type_enforcement'];
80
80
  python_mode_flags.forEach(function(f) { if (!(f in global_scoped_flags)) global_scoped_flags[f] = true; });
81
81
  if (!argv.pythonize_strings) OUTPUT_OPTIONS.pythonize_strings = true;
82
82
  }