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
@@ -87,6 +87,10 @@ function make_tests(CompletionEngine, detect_context, SourceAnalyzer, DtsRegistr
87
87
  require('path').join(__dirname, '../../src/lib/collections.pyj'), 'utf-8'
88
88
  );
89
89
 
90
+ var RE_SRC = require('fs').readFileSync(
91
+ require('path').join(__dirname, '../../src/lib/re.pyj'), 'utf-8'
92
+ );
93
+
90
94
  var TESTS = [
91
95
 
92
96
  // ── detect_context ────────────────────────────────────────────────
@@ -1254,6 +1258,121 @@ function make_tests(CompletionEngine, detect_context, SourceAnalyzer, DtsRegistr
1254
1258
  },
1255
1259
  },
1256
1260
 
1261
+ // ── Bare import dot completions (import X; X.attr) ──────────────
1262
+
1263
+ {
1264
+ name: "bare_import_virtual_dot_completions",
1265
+ description: "import mymod; mymod. shows module-level symbols from virtual file",
1266
+ run: function () {
1267
+ var vf = {
1268
+ mymod: [
1269
+ "def foo():",
1270
+ " return 1",
1271
+ "def bar():",
1272
+ " return 2",
1273
+ "BAZ = 42",
1274
+ ].join("\n"),
1275
+ };
1276
+ var engine = make_engine(vf);
1277
+ var analyzer = new SourceAnalyzer(RS);
1278
+ var scopeMap = analyzer.analyze("import mymod\npass", { virtualFiles: vf });
1279
+ var list = engine.getCompletions(scopeMap, pos(2, 7), "mymod.", MockKind);
1280
+ assert_has(list, 'foo', 'foo from virtual module');
1281
+ assert_has(list, 'bar', 'bar from virtual module');
1282
+ assert_has(list, 'BAZ', 'BAZ from virtual module');
1283
+ },
1284
+ },
1285
+
1286
+ {
1287
+ name: "bare_import_virtual_dot_prefix",
1288
+ description: "import mymod; mymod.f filters completions by prefix",
1289
+ run: function () {
1290
+ var vf = {
1291
+ mymod: "def foo():\n return 1\ndef bar():\n return 2",
1292
+ };
1293
+ var engine = make_engine(vf);
1294
+ var analyzer = new SourceAnalyzer(RS);
1295
+ var scopeMap = analyzer.analyze("import mymod\npass", { virtualFiles: vf });
1296
+ var list = engine.getCompletions(scopeMap, pos(2, 8), "mymod.f", MockKind);
1297
+ assert_has(list, 'foo', 'foo matches prefix f');
1298
+ assert_missing(list,'bar', 'bar does not match prefix f');
1299
+ },
1300
+ },
1301
+
1302
+ {
1303
+ name: "bare_import_re_dot_completions",
1304
+ description: "import re; re. shows re module exports via stdlibFiles",
1305
+ run: function () {
1306
+ var engine = make_engine({}, ['print', 'len', 'range'], null, null, { re: RE_SRC });
1307
+ var analyzer = new SourceAnalyzer(RS);
1308
+ var scopeMap = analyzer.analyze("import re\npass", { virtualFiles: { re: RE_SRC } });
1309
+ var list = engine.getCompletions(scopeMap, pos(2, 4), "re.", MockKind);
1310
+ assert_has(list, 'match', 'match from re module');
1311
+ assert_has(list, 'search', 'search from re module');
1312
+ assert_has(list, 'compile', 'compile from re module');
1313
+ assert_has(list, 'sub', 'sub from re module');
1314
+ assert_has(list, 'findall', 'findall from re module');
1315
+ assert_has(list, 'split', 'split from re module');
1316
+ },
1317
+ },
1318
+
1319
+ {
1320
+ name: "bare_import_re_dot_prefix",
1321
+ description: "import re; re.ma filters to matching names like match",
1322
+ run: function () {
1323
+ var engine = make_engine({}, ['print', 'len', 'range'], null, null, { re: RE_SRC });
1324
+ var analyzer = new SourceAnalyzer(RS);
1325
+ var scopeMap = analyzer.analyze("import re\npass", { virtualFiles: { re: RE_SRC } });
1326
+ var list = engine.getCompletions(scopeMap, pos(2, 6), "re.ma", MockKind);
1327
+ assert_has(list, 'match', 'match matches prefix ma');
1328
+ assert_missing(list,'compile', 'compile does not match prefix ma');
1329
+ },
1330
+ },
1331
+
1332
+ {
1333
+ name: "bare_import_alias_dot_completions",
1334
+ description: "import mymod as mm; mm. shows module-level symbols",
1335
+ run: function () {
1336
+ var vf = {
1337
+ mymod: "def foo():\n return 1\nVAL = 10",
1338
+ };
1339
+ var engine = make_engine(vf);
1340
+ var analyzer = new SourceAnalyzer(RS);
1341
+ var scopeMap = analyzer.analyze("import mymod as mm\npass", { virtualFiles: vf });
1342
+ var list = engine.getCompletions(scopeMap, pos(2, 4), "mm.", MockKind);
1343
+ assert_has(list, 'foo', 'foo from aliased module');
1344
+ assert_has(list, 'VAL', 'VAL from aliased module');
1345
+ },
1346
+ },
1347
+
1348
+ {
1349
+ name: "bare_import_unknown_module_empty",
1350
+ description: "import unknown; unknown. returns empty when module source unavailable",
1351
+ run: function () {
1352
+ var engine = make_engine({});
1353
+ var analyzer = new SourceAnalyzer(RS);
1354
+ var scopeMap = analyzer.analyze("import unknown\npass", {});
1355
+ var list = engine.getCompletions(scopeMap, pos(2, 9), "unknown.", MockKind);
1356
+ assert.strictEqual(list.suggestions.length, 0, 'unknown module → no dot suggestions');
1357
+ },
1358
+ },
1359
+
1360
+ {
1361
+ name: "bare_import_collections_dot_completions",
1362
+ description: "import collections; collections. shows namedtuple, deque, Counter, etc.",
1363
+ run: function () {
1364
+ var engine = make_engine({}, ['print', 'len', 'range'], null, null, { collections: COLLECTIONS_SRC });
1365
+ var analyzer = new SourceAnalyzer(RS);
1366
+ var scopeMap = analyzer.analyze("import collections\npass", { virtualFiles: { collections: COLLECTIONS_SRC } });
1367
+ var list = engine.getCompletions(scopeMap, pos(2, 13), "collections.", MockKind);
1368
+ assert_has(list, 'namedtuple', 'namedtuple from collections');
1369
+ assert_has(list, 'deque', 'deque from collections');
1370
+ assert_has(list, 'Counter', 'Counter from collections');
1371
+ assert_has(list, 'OrderedDict', 'OrderedDict from collections');
1372
+ assert_has(list, 'defaultdict', 'defaultdict from collections');
1373
+ },
1374
+ },
1375
+
1257
1376
  {
1258
1377
  name: "return_type_imported_fn_inferred_consistent_branches",
1259
1378
  description: "imported fn with multiple return [] branches — type still inferred as list",