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.
- package/.agignore +1 -1
- package/.github/workflows/ci.yml +38 -38
- package/=template.pyj +5 -5
- package/CHANGELOG.md +19 -0
- package/HACKING.md +103 -103
- package/LICENSE +24 -24
- package/PYTHON_GAPS.md +420 -0
- package/README.md +153 -29
- package/TODO.md +16 -118
- 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 +237 -8
- package/memory/project_string_impl.md +43 -0
- package/package.json +1 -1
- package/publish.py +37 -37
- package/release/baselib-plain-pretty.js +248 -38
- package/release/baselib-plain-ugly.js +8 -8
- package/release/compiler.js +778 -277
- package/release/signatures.json +30 -30
- package/session.vim +4 -4
- package/setup.cfg +2 -2
- package/src/ast.pyj +4 -1
- package/src/baselib-builtins.pyj +56 -2
- package/src/baselib-containers.pyj +2 -0
- package/src/baselib-errors.pyj +7 -3
- package/src/baselib-internal.pyj +51 -6
- package/src/baselib-str.pyj +5 -3
- package/src/compiler.pyj +36 -36
- package/src/errors.pyj +30 -30
- package/src/lib/aes.pyj +646 -646
- package/src/lib/asyncio.pyj +534 -0
- package/src/lib/base64.pyj +399 -0
- package/src/lib/bisect.pyj +73 -0
- package/src/lib/collections.pyj +1 -1
- package/src/lib/copy.pyj +120 -120
- package/src/lib/csv.pyj +494 -0
- package/src/lib/elementmaker.pyj +83 -83
- package/src/lib/encodings.pyj +126 -126
- package/src/lib/gettext.pyj +569 -569
- package/src/lib/heapq.pyj +98 -0
- package/src/lib/html.pyj +382 -0
- package/src/lib/http/__init__.pyj +98 -0
- package/src/lib/http/client.pyj +304 -0
- package/src/lib/http/cookies.pyj +236 -0
- package/src/lib/itertools.pyj +580 -580
- package/src/lib/logging.pyj +672 -0
- 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/react.pyj +74 -74
- package/src/lib/string.pyj +357 -0
- package/src/lib/textwrap.pyj +329 -0
- package/src/lib/traceback.pyj +63 -63
- package/src/lib/urllib/__init__.pyj +14 -0
- package/src/lib/urllib/error.pyj +66 -0
- package/src/lib/urllib/parse.pyj +475 -0
- package/src/lib/urllib/request.pyj +86 -0
- package/src/lib/uuid.pyj +77 -77
- package/src/monaco-language-service/analyzer.js +5 -2
- package/src/monaco-language-service/completions.js +26 -0
- package/src/monaco-language-service/diagnostics.js +202 -3
- package/src/monaco-language-service/dts.js +550 -550
- package/src/monaco-language-service/scope.js +1 -0
- package/src/output/comments.pyj +45 -45
- package/src/output/exceptions.pyj +201 -201
- package/src/output/functions.pyj +152 -6
- package/src/output/jsx.pyj +164 -164
- package/src/output/loops.pyj +17 -2
- package/src/output/modules.pyj +1 -1
- package/src/output/operators.pyj +15 -0
- package/src/output/stream.pyj +0 -1
- package/src/output/treeshake.pyj +182 -182
- package/src/output/utils.pyj +72 -72
- package/src/parse.pyj +80 -17
- package/src/string_interpolation.pyj +72 -72
- package/src/tokenizer.pyj +1 -1
- 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/aes_vectors.pyj +421 -421
- package/test/annotations.pyj +80 -80
- package/test/async_generators.pyj +144 -0
- package/test/asyncio.pyj +307 -0
- package/test/base64.pyj +202 -0
- package/test/bisect.pyj +178 -0
- package/test/csv.pyj +405 -0
- package/test/decorators.pyj +77 -77
- package/test/docstrings.pyj +39 -39
- package/test/elementmaker_test.pyj +45 -45
- package/test/float_special.pyj +64 -0
- package/test/functions.pyj +151 -151
- package/test/generators.pyj +41 -41
- package/test/generic.pyj +370 -370
- package/test/heapq.pyj +174 -0
- package/test/html.pyj +212 -0
- package/test/http.pyj +259 -0
- package/test/imports.pyj +79 -72
- package/test/internationalization.pyj +73 -73
- package/test/lint.pyj +164 -164
- package/test/logging.pyj +356 -0
- package/test/long.pyj +130 -0
- package/test/loops.pyj +85 -85
- package/test/numpy.pyj +734 -734
- package/test/parenthesized_with.pyj +141 -0
- package/test/python_compat.pyj +3 -5
- package/test/python_modulo.pyj +76 -0
- package/test/python_modulo_off.pyj +21 -0
- package/test/repl.pyj +121 -121
- package/test/scoped_flags.pyj +76 -76
- package/test/str.pyj +14 -0
- package/test/string.pyj +245 -0
- package/test/textwrap.pyj +172 -0
- package/test/type_display.pyj +48 -0
- package/test/type_enforcement.pyj +164 -0
- package/test/unit/index.js +14 -6
- package/test/unit/language-service-completions.js +119 -0
- package/test/unit/language-service-dts.js +543 -543
- package/test/unit/language-service-hover.js +455 -455
- package/test/unit/language-service-scope.js +32 -0
- package/test/unit/language-service.js +127 -3
- package/test/unit/run-language-service.js +17 -3
- package/test/unit/web-repl.js +2094 -29
- package/test/urllib.pyj +193 -0
- package/tools/compile.js +1 -1
- package/tools/compiler.d.ts +367 -367
- package/tools/completer.js +131 -131
- package/tools/embedded_compiler.js +7 -7
- package/tools/gettext.js +185 -185
- package/tools/ini.js +65 -65
- 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 +1 -1
- 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/test/omit_function_metadata.pyj +0 -20
|
@@ -613,6 +613,38 @@ function make_tests(SourceAnalyzer, RS) {
|
|
|
613
613
|
},
|
|
614
614
|
},
|
|
615
615
|
|
|
616
|
+
{
|
|
617
|
+
name: "async_generator_local_var_visible",
|
|
618
|
+
description: "Inside `async def` with `yield`, local vars are tracked in scope",
|
|
619
|
+
run: function () {
|
|
620
|
+
// Async generators (async def + yield) should not break scope analysis.
|
|
621
|
+
// Local assignments should be picked up the same as in regular functions.
|
|
622
|
+
var m = analyze([
|
|
623
|
+
"async def aiter():",
|
|
624
|
+
" counter = 0",
|
|
625
|
+
" yield counter",
|
|
626
|
+
" counter += 1",
|
|
627
|
+
" yield counter",
|
|
628
|
+
].join("\n"));
|
|
629
|
+
var sym = find(m.getAllSymbols(), "counter");
|
|
630
|
+
assert.ok(sym, "Expected 'counter' symbol in async-generator scope");
|
|
631
|
+
},
|
|
632
|
+
},
|
|
633
|
+
|
|
634
|
+
{
|
|
635
|
+
name: "async_for_loop_var_visible",
|
|
636
|
+
description: "`async for x in ...` loop variable is registered in scope",
|
|
637
|
+
run: function () {
|
|
638
|
+
var m = analyze([
|
|
639
|
+
"async def consume(it):",
|
|
640
|
+
" async for item in it:",
|
|
641
|
+
" print(item)",
|
|
642
|
+
].join("\n"));
|
|
643
|
+
var sym = find(m.getAllSymbols(), "item");
|
|
644
|
+
assert.ok(sym, "Expected 'item' loop variable in async-for scope");
|
|
645
|
+
},
|
|
646
|
+
},
|
|
647
|
+
|
|
616
648
|
{
|
|
617
649
|
name: "inferred_class_no_inference_for_variable_rhs",
|
|
618
650
|
description: "x = some_var does not set inferred_class (unknown rhs)",
|
|
@@ -61,12 +61,27 @@ var LIB_DIR = path.join(__dirname, "../../src/lib");
|
|
|
61
61
|
|
|
62
62
|
/**
|
|
63
63
|
* Return the module names of all .pyj files currently in src/lib/.
|
|
64
|
+
* Also includes sub-package directory names that contain an __init__.pyj.
|
|
64
65
|
* Excludes cache files (.pyj-cached) and any non-.pyj entries.
|
|
65
66
|
*/
|
|
66
67
|
function get_lib_module_names() {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
68
|
+
var names = [];
|
|
69
|
+
fs.readdirSync(LIB_DIR).forEach(function (f) {
|
|
70
|
+
if (f.endsWith(".pyj-cached")) return;
|
|
71
|
+
if (f.endsWith(".pyj")) {
|
|
72
|
+
names.push(f.replace(/\.pyj$/, ""));
|
|
73
|
+
} else {
|
|
74
|
+
// Directory with __init__.pyj counts as a package module.
|
|
75
|
+
var full = path.join(LIB_DIR, f);
|
|
76
|
+
try {
|
|
77
|
+
var stat = fs.statSync(full);
|
|
78
|
+
if (stat.isDirectory() && fs.existsSync(path.join(full, "__init__.pyj"))) {
|
|
79
|
+
names.push(f);
|
|
80
|
+
}
|
|
81
|
+
} catch (e) {}
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
return names;
|
|
70
85
|
}
|
|
71
86
|
|
|
72
87
|
function make_tests(Diagnostics, RS, STDLIB_MODULES) {
|
|
@@ -1467,6 +1482,115 @@ function make_tests(Diagnostics, RS, STDLIB_MODULES) {
|
|
|
1467
1482
|
},
|
|
1468
1483
|
},
|
|
1469
1484
|
|
|
1485
|
+
// ── Infinite-loop detection ───────────────────────────────────────
|
|
1486
|
+
|
|
1487
|
+
{
|
|
1488
|
+
name: "infinite_loop_while_true",
|
|
1489
|
+
description: "while True: with no await inside is flagged as a warning",
|
|
1490
|
+
run: function () {
|
|
1491
|
+
var markers = d().check([
|
|
1492
|
+
"while True:",
|
|
1493
|
+
" x = 1",
|
|
1494
|
+
].join("\n"));
|
|
1495
|
+
var warnings = markers.filter(function (m) {
|
|
1496
|
+
return m.severity === SEV_WARNING &&
|
|
1497
|
+
m.message.indexOf("while loop") !== -1;
|
|
1498
|
+
});
|
|
1499
|
+
assert.ok(warnings.length >= 1,
|
|
1500
|
+
"Expected an infinite-loop warning but got: " + JSON.stringify(markers));
|
|
1501
|
+
},
|
|
1502
|
+
},
|
|
1503
|
+
|
|
1504
|
+
{
|
|
1505
|
+
name: "infinite_loop_while_1",
|
|
1506
|
+
description: "while 1: with no await inside is flagged as a warning",
|
|
1507
|
+
run: function () {
|
|
1508
|
+
var markers = d().check([
|
|
1509
|
+
"while 1:",
|
|
1510
|
+
" pass",
|
|
1511
|
+
].join("\n"));
|
|
1512
|
+
var warnings = markers.filter(function (m) {
|
|
1513
|
+
return m.severity === SEV_WARNING &&
|
|
1514
|
+
m.message.indexOf("while loop") !== -1;
|
|
1515
|
+
});
|
|
1516
|
+
assert.ok(warnings.length >= 1,
|
|
1517
|
+
"Expected an infinite-loop warning for while 1: but got: " + JSON.stringify(markers));
|
|
1518
|
+
},
|
|
1519
|
+
},
|
|
1520
|
+
|
|
1521
|
+
{
|
|
1522
|
+
name: "infinite_loop_suppressed_by_await",
|
|
1523
|
+
description: "while True: containing an await does NOT produce a warning",
|
|
1524
|
+
run: function () {
|
|
1525
|
+
var markers = d().check([
|
|
1526
|
+
"async def run():",
|
|
1527
|
+
" while True:",
|
|
1528
|
+
" await some_task()",
|
|
1529
|
+
].join("\n"));
|
|
1530
|
+
var inf = markers.filter(function (m) {
|
|
1531
|
+
return m.message.indexOf("while loop") !== -1;
|
|
1532
|
+
});
|
|
1533
|
+
assert.deepStrictEqual(inf, [],
|
|
1534
|
+
"Expected no infinite-loop warning when await is present but got: " + JSON.stringify(inf));
|
|
1535
|
+
},
|
|
1536
|
+
},
|
|
1537
|
+
|
|
1538
|
+
{
|
|
1539
|
+
name: "async_generator_no_diagnostics",
|
|
1540
|
+
description: "async def with yield (async generator) parses cleanly with no syntax errors",
|
|
1541
|
+
run: function () {
|
|
1542
|
+
var markers = d().check([
|
|
1543
|
+
"async def aiter():",
|
|
1544
|
+
" yield 1",
|
|
1545
|
+
" yield 2",
|
|
1546
|
+
"",
|
|
1547
|
+
"async def consume():",
|
|
1548
|
+
" out = []",
|
|
1549
|
+
" async for x in aiter():",
|
|
1550
|
+
" out.append(x)",
|
|
1551
|
+
" return out",
|
|
1552
|
+
].join("\n"));
|
|
1553
|
+
var errs = markers.filter(function (m) { return m.severity === 1 || m.severity === 8; });
|
|
1554
|
+
assert.deepStrictEqual(errs, [],
|
|
1555
|
+
"Expected no syntax errors for async generator + async for, got: " + JSON.stringify(errs));
|
|
1556
|
+
},
|
|
1557
|
+
},
|
|
1558
|
+
|
|
1559
|
+
{
|
|
1560
|
+
name: "async_generator_local_no_undef",
|
|
1561
|
+
description: "Local vars inside an async generator (with `await` and `yield`) resolve correctly",
|
|
1562
|
+
run: function () {
|
|
1563
|
+
var markers = d().check([
|
|
1564
|
+
"async def stream():",
|
|
1565
|
+
" n = await Promise.resolve(3)",
|
|
1566
|
+
" i = 0",
|
|
1567
|
+
" while i < n:",
|
|
1568
|
+
" yield i",
|
|
1569
|
+
" i += 1",
|
|
1570
|
+
].join("\n"));
|
|
1571
|
+
var undef = markers.filter(function (m) { return m.message.indexOf("Undefined symbol") !== -1; });
|
|
1572
|
+
assert.deepStrictEqual(undef, [],
|
|
1573
|
+
"Expected no 'Undefined symbol' errors in async generator, got: " + JSON.stringify(undef));
|
|
1574
|
+
},
|
|
1575
|
+
},
|
|
1576
|
+
|
|
1577
|
+
{
|
|
1578
|
+
name: "infinite_loop_no_false_positive_for_condition",
|
|
1579
|
+
description: "while x > 0: (non-constant condition) does not produce a warning",
|
|
1580
|
+
run: function () {
|
|
1581
|
+
var markers = d().check([
|
|
1582
|
+
"x = 10",
|
|
1583
|
+
"while x > 0:",
|
|
1584
|
+
" x -= 1",
|
|
1585
|
+
].join("\n"));
|
|
1586
|
+
var inf = markers.filter(function (m) {
|
|
1587
|
+
return m.message.indexOf("while loop") !== -1;
|
|
1588
|
+
});
|
|
1589
|
+
assert.deepStrictEqual(inf, [],
|
|
1590
|
+
"Expected no infinite-loop warning for non-constant condition but got: " + JSON.stringify(inf));
|
|
1591
|
+
},
|
|
1592
|
+
},
|
|
1593
|
+
|
|
1470
1594
|
];
|
|
1471
1595
|
|
|
1472
1596
|
return TESTS;
|
|
@@ -29,7 +29,7 @@ var FILES = [
|
|
|
29
29
|
"web-repl.js",
|
|
30
30
|
];
|
|
31
31
|
|
|
32
|
-
var
|
|
32
|
+
var failed_files = [];
|
|
33
33
|
|
|
34
34
|
FILES.forEach(function (file) {
|
|
35
35
|
var result = spawn(
|
|
@@ -37,7 +37,21 @@ FILES.forEach(function (file) {
|
|
|
37
37
|
[path.join(__dirname, file)],
|
|
38
38
|
{ stdio: "inherit" }
|
|
39
39
|
);
|
|
40
|
-
if (result.status !== 0)
|
|
40
|
+
if (result.status !== 0) failed_files.push(file);
|
|
41
41
|
});
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
console.log("");
|
|
44
|
+
if (failed_files.length) {
|
|
45
|
+
console.log(colored("Failed test files:", "red"));
|
|
46
|
+
failed_files.forEach(function (file) {
|
|
47
|
+
console.log(colored(" ✗ " + file, "red"));
|
|
48
|
+
});
|
|
49
|
+
console.log("");
|
|
50
|
+
}
|
|
51
|
+
var passed_count = FILES.length - failed_files.length;
|
|
52
|
+
var summary = "test suites — " +
|
|
53
|
+
colored("passed: " + passed_count, "green") + " " +
|
|
54
|
+
(failed_files.length ? colored("failed: " + failed_files.length, "red") : colored("failed: 0", "green")) +
|
|
55
|
+
" total: " + FILES.length;
|
|
56
|
+
console.log(summary);
|
|
57
|
+
process.exit(failed_files.length ? 1 : 0);
|