rapydscript-ns 0.9.1 → 0.9.2
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 +3 -1
- package/HACKING.md +103 -103
- package/LICENSE +24 -24
- package/README.md +1 -1
- package/TODO.md +117 -0
- 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 +7 -7
- package/language-service/language-service.d.ts +1 -1
- package/package.json +6 -2
- package/publish.py +37 -37
- package/release/compiler.js +245 -230
- package/release/signatures.json +22 -22
- package/session.vim +4 -4
- package/setup.cfg +2 -2
- package/src/compiler.pyj +36 -36
- package/src/errors.pyj +30 -30
- package/src/lib/aes.pyj +646 -646
- package/src/lib/copy.pyj +120 -120
- package/src/lib/elementmaker.pyj +83 -83
- package/src/lib/encodings.pyj +126 -126
- 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/react.pyj +74 -74
- package/src/lib/traceback.pyj +63 -63
- package/src/lib/uuid.pyj +77 -77
- package/src/monaco-language-service/diagnostics.js +2 -2
- package/src/monaco-language-service/dts.js +550 -550
- package/src/monaco-language-service/index.js +2 -2
- package/src/output/comments.pyj +45 -45
- package/src/output/exceptions.pyj +201 -201
- package/src/output/jsx.pyj +164 -164
- package/src/output/loops.pyj +9 -0
- package/src/output/treeshake.pyj +182 -182
- package/src/output/utils.pyj +72 -72
- package/src/string_interpolation.pyj +72 -72
- 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/decorators.pyj +77 -77
- package/test/docstrings.pyj +39 -39
- package/test/elementmaker_test.pyj +45 -45
- 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/omit_function_metadata.pyj +20 -20
- package/test/repl.pyj +121 -121
- package/test/scoped_flags.pyj +76 -76
- package/test/unit/index.js +66 -0
- package/test/unit/language-service-dts.js +543 -543
- package/test/unit/language-service-hover.js +455 -455
- package/test/unit/language-service.js +1 -1
- package/tools/compiler.d.ts +367 -0
- package/tools/completer.js +131 -131
- 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/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/.agignore
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
lib/*
|
|
1
|
+
lib/*
|
package/.github/workflows/ci.yml
CHANGED
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
name: CI
|
|
2
|
-
on: [push, pull_request]
|
|
3
|
-
env:
|
|
4
|
-
CI: 'true'
|
|
5
|
-
|
|
6
|
-
jobs:
|
|
7
|
-
test:
|
|
8
|
-
name: Test on ${{ matrix.os }} LANG ${{ matrix.lang }}
|
|
9
|
-
runs-on: ${{ matrix.os }}
|
|
10
|
-
env:
|
|
11
|
-
LANG: ${{ matrix.lang }}
|
|
12
|
-
LC_ALL: ${{ matrix.lang }}
|
|
13
|
-
strategy:
|
|
14
|
-
matrix:
|
|
15
|
-
include:
|
|
16
|
-
- { os: ubuntu-latest, lang: en_US.UTF-8 }
|
|
17
|
-
- { os: ubuntu-latest, lang: de_DE.UTF-8}
|
|
18
|
-
- { os: ubuntu-latest, lang: hi_IN.UTF-8 }
|
|
19
|
-
|
|
20
|
-
- { os: macos-latest, lang: en_US.UTF-8 }
|
|
21
|
-
- { os: windows-latest, lang: en_US.UTF-8 }
|
|
22
|
-
|
|
23
|
-
steps:
|
|
24
|
-
- name: Checkout source code
|
|
25
|
-
uses: actions/checkout@master
|
|
26
|
-
with:
|
|
27
|
-
fetch-depth: 10
|
|
28
|
-
|
|
29
|
-
- name: Set up Node ${{ matrix.node }}
|
|
30
|
-
uses: actions/setup-node@master
|
|
31
|
-
|
|
32
|
-
- name: Install deps
|
|
33
|
-
run:
|
|
34
|
-
npm install --no-optional
|
|
35
|
-
|
|
36
|
-
- name: Test
|
|
37
|
-
run:
|
|
38
|
-
npm test
|
|
1
|
+
name: CI
|
|
2
|
+
on: [push, pull_request]
|
|
3
|
+
env:
|
|
4
|
+
CI: 'true'
|
|
5
|
+
|
|
6
|
+
jobs:
|
|
7
|
+
test:
|
|
8
|
+
name: Test on ${{ matrix.os }} LANG ${{ matrix.lang }}
|
|
9
|
+
runs-on: ${{ matrix.os }}
|
|
10
|
+
env:
|
|
11
|
+
LANG: ${{ matrix.lang }}
|
|
12
|
+
LC_ALL: ${{ matrix.lang }}
|
|
13
|
+
strategy:
|
|
14
|
+
matrix:
|
|
15
|
+
include:
|
|
16
|
+
- { os: ubuntu-latest, lang: en_US.UTF-8 }
|
|
17
|
+
- { os: ubuntu-latest, lang: de_DE.UTF-8}
|
|
18
|
+
- { os: ubuntu-latest, lang: hi_IN.UTF-8 }
|
|
19
|
+
|
|
20
|
+
- { os: macos-latest, lang: en_US.UTF-8 }
|
|
21
|
+
- { os: windows-latest, lang: en_US.UTF-8 }
|
|
22
|
+
|
|
23
|
+
steps:
|
|
24
|
+
- name: Checkout source code
|
|
25
|
+
uses: actions/checkout@master
|
|
26
|
+
with:
|
|
27
|
+
fetch-depth: 10
|
|
28
|
+
|
|
29
|
+
- name: Set up Node ${{ matrix.node }}
|
|
30
|
+
uses: actions/setup-node@master
|
|
31
|
+
|
|
32
|
+
- name: Install deps
|
|
33
|
+
run:
|
|
34
|
+
npm install --no-optional
|
|
35
|
+
|
|
36
|
+
- name: Test
|
|
37
|
+
run:
|
|
38
|
+
npm test
|
package/=template.pyj
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
# vim:fileencoding=utf-8
|
|
2
|
-
# License: BSD Copyright: %YEAR%, %USER% <%MAIL%>
|
|
3
|
-
from __python__ import hash_literals
|
|
4
|
-
|
|
5
|
-
%HERE%
|
|
1
|
+
# vim:fileencoding=utf-8
|
|
2
|
+
# License: BSD Copyright: %YEAR%, %USER% <%MAIL%>
|
|
3
|
+
from __python__ import hash_literals
|
|
4
|
+
|
|
5
|
+
%HERE%
|
package/CHANGELOG.md
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
version 0.9.
|
|
1
|
+
version 0.9.2
|
|
2
2
|
=======================
|
|
3
3
|
* Added the contextlib standard library
|
|
4
4
|
* Added the datetime standard library
|
|
5
5
|
* Added the io standard library
|
|
6
6
|
* Added the json standard library
|
|
7
7
|
* Added support for the `debugger` keyword
|
|
8
|
+
* Added TypeScript definitions for compiler.js
|
|
9
|
+
* Simplified ExtraBuiltins interface
|
|
8
10
|
|
|
9
11
|
version 0.9.0
|
|
10
12
|
=======================
|
package/HACKING.md
CHANGED
|
@@ -1,103 +1,103 @@
|
|
|
1
|
-
Hacking the RapydScript compiler
|
|
2
|
-
=================================
|
|
3
|
-
|
|
4
|
-
The RapydScript compiler is written in RapydScript itself and uses the
|
|
5
|
-
RapydScript import system to modularize its code. The compiler source code is
|
|
6
|
-
in the `src` directory. The compiled compiler is by default in the `release`
|
|
7
|
-
directory.
|
|
8
|
-
|
|
9
|
-
In order to start hacking on the compiler, run the command
|
|
10
|
-
|
|
11
|
-
```
|
|
12
|
-
bin/rapydscript self --complete --test
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
This will generate a build of the compiler in the `dev` directory. Now, the
|
|
16
|
-
rapydscript command will automatically use this build, rather than the one in
|
|
17
|
-
release. If you want to go back to the release build, simply delete the `dev`
|
|
18
|
-
directory.
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
Code organization
|
|
22
|
-
-------------------
|
|
23
|
-
|
|
24
|
-
The way the compiler works, given some RapydScript source code:
|
|
25
|
-
|
|
26
|
-
* The source code is lexed into a stream of tokens (`src/tokenzier.pyj`)
|
|
27
|
-
|
|
28
|
-
* The tokens are parsed into a Abstract Syntax Tree (`src/parse.pyj and src/ast.pyj`)
|
|
29
|
-
|
|
30
|
-
* During parsing any import statement are resolved (this is different from
|
|
31
|
-
python, where imports happen at run-time, not compile time).
|
|
32
|
-
|
|
33
|
-
* The Abstract Syntax Tree is transformed into the output JavaScript (`src/output/*.pyj`)
|
|
34
|
-
|
|
35
|
-
* Various bits of functionality in RapydScript depend upon the *Base Library*
|
|
36
|
-
(`src/baselib*.pyj`). This includes things like the basic container types
|
|
37
|
-
(list/set/dict) string functions such as `str.format()`, etc. The baselib
|
|
38
|
-
is automatically inserted into the start of the output JavaScript.
|
|
39
|
-
|
|
40
|
-
The RapydScript standard library can be found in `src/lib`. The various tools,
|
|
41
|
-
such as the linter, gettext support, the REPL, etc. are in the `tools`
|
|
42
|
-
directory.
|
|
43
|
-
|
|
44
|
-
Tests
|
|
45
|
-
--------
|
|
46
|
-
|
|
47
|
-
The tests are in the test directory and can be run using the command:
|
|
48
|
-
```
|
|
49
|
-
rapydscript test
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
You can run individual test files by providing the name of the file, as
|
|
53
|
-
|
|
54
|
-
```
|
|
55
|
-
rapydscript test classes
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
Modifying the compiler
|
|
59
|
-
-------------------------
|
|
60
|
-
|
|
61
|
-
Edit the files in the `src` directory to make your changes, then use the
|
|
62
|
-
`./try` script to test them. This script will compile an updated version of
|
|
63
|
-
the compiler with your changes, if any, and use it to run the snippet of code
|
|
64
|
-
you pass to it.
|
|
65
|
-
|
|
66
|
-
For example:
|
|
67
|
-
|
|
68
|
-
```
|
|
69
|
-
./try 'print("Hello world")'
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
will compile `print ("Hello world")` and show you the output on stdout. You can
|
|
73
|
-
tell it to omit the baselib, so you can focus on the output, with the `-m`
|
|
74
|
-
switch, like this:
|
|
75
|
-
|
|
76
|
-
```
|
|
77
|
-
./try -m 'print("Hello world")'
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
You can also have it not print out the JavaScript, instead directly executing the output
|
|
81
|
-
JavaScript with the `-x` switch, like this
|
|
82
|
-
|
|
83
|
-
```
|
|
84
|
-
./try -x 'print("Hello world")'
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
If you want to test longer sections of code, you can use the `-f` switch to
|
|
88
|
-
pass in the path to a RapydScript file to compile, like this:
|
|
89
|
-
|
|
90
|
-
```
|
|
91
|
-
./try -f myfile.pyj
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
Once you are happy with your changes, you can build the compiler and run the
|
|
95
|
-
test suite, all with a single command:
|
|
96
|
-
|
|
97
|
-
```
|
|
98
|
-
./build
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
This will build the compiler with the updated version of itself and then run
|
|
102
|
-
the test suite. If all test pass you can commit your changes and send a pull
|
|
103
|
-
request :)
|
|
1
|
+
Hacking the RapydScript compiler
|
|
2
|
+
=================================
|
|
3
|
+
|
|
4
|
+
The RapydScript compiler is written in RapydScript itself and uses the
|
|
5
|
+
RapydScript import system to modularize its code. The compiler source code is
|
|
6
|
+
in the `src` directory. The compiled compiler is by default in the `release`
|
|
7
|
+
directory.
|
|
8
|
+
|
|
9
|
+
In order to start hacking on the compiler, run the command
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
bin/rapydscript self --complete --test
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
This will generate a build of the compiler in the `dev` directory. Now, the
|
|
16
|
+
rapydscript command will automatically use this build, rather than the one in
|
|
17
|
+
release. If you want to go back to the release build, simply delete the `dev`
|
|
18
|
+
directory.
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
Code organization
|
|
22
|
+
-------------------
|
|
23
|
+
|
|
24
|
+
The way the compiler works, given some RapydScript source code:
|
|
25
|
+
|
|
26
|
+
* The source code is lexed into a stream of tokens (`src/tokenzier.pyj`)
|
|
27
|
+
|
|
28
|
+
* The tokens are parsed into a Abstract Syntax Tree (`src/parse.pyj and src/ast.pyj`)
|
|
29
|
+
|
|
30
|
+
* During parsing any import statement are resolved (this is different from
|
|
31
|
+
python, where imports happen at run-time, not compile time).
|
|
32
|
+
|
|
33
|
+
* The Abstract Syntax Tree is transformed into the output JavaScript (`src/output/*.pyj`)
|
|
34
|
+
|
|
35
|
+
* Various bits of functionality in RapydScript depend upon the *Base Library*
|
|
36
|
+
(`src/baselib*.pyj`). This includes things like the basic container types
|
|
37
|
+
(list/set/dict) string functions such as `str.format()`, etc. The baselib
|
|
38
|
+
is automatically inserted into the start of the output JavaScript.
|
|
39
|
+
|
|
40
|
+
The RapydScript standard library can be found in `src/lib`. The various tools,
|
|
41
|
+
such as the linter, gettext support, the REPL, etc. are in the `tools`
|
|
42
|
+
directory.
|
|
43
|
+
|
|
44
|
+
Tests
|
|
45
|
+
--------
|
|
46
|
+
|
|
47
|
+
The tests are in the test directory and can be run using the command:
|
|
48
|
+
```
|
|
49
|
+
rapydscript test
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
You can run individual test files by providing the name of the file, as
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
rapydscript test classes
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Modifying the compiler
|
|
59
|
+
-------------------------
|
|
60
|
+
|
|
61
|
+
Edit the files in the `src` directory to make your changes, then use the
|
|
62
|
+
`./try` script to test them. This script will compile an updated version of
|
|
63
|
+
the compiler with your changes, if any, and use it to run the snippet of code
|
|
64
|
+
you pass to it.
|
|
65
|
+
|
|
66
|
+
For example:
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
./try 'print("Hello world")'
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
will compile `print ("Hello world")` and show you the output on stdout. You can
|
|
73
|
+
tell it to omit the baselib, so you can focus on the output, with the `-m`
|
|
74
|
+
switch, like this:
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
./try -m 'print("Hello world")'
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
You can also have it not print out the JavaScript, instead directly executing the output
|
|
81
|
+
JavaScript with the `-x` switch, like this
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
./try -x 'print("Hello world")'
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
If you want to test longer sections of code, you can use the `-f` switch to
|
|
88
|
+
pass in the path to a RapydScript file to compile, like this:
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
./try -f myfile.pyj
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Once you are happy with your changes, you can build the compiler and run the
|
|
95
|
+
test suite, all with a single command:
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
./build
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
This will build the compiler with the updated version of itself and then run
|
|
102
|
+
the test suite. If all test pass you can commit your changes and send a pull
|
|
103
|
+
request :)
|
package/LICENSE
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
Copyright (c) 2015-, Kovid Goyal <kovid@kovidgoyal.net>
|
|
2
|
-
Copyright (c) 2013-2014, Alexander Tsepkov <atsepkov@pyjeon.com>
|
|
3
|
-
All rights reserved.
|
|
4
|
-
|
|
5
|
-
Redistribution and use in source and binary forms, with or without
|
|
6
|
-
modification, are permitted provided that the following conditions are met:
|
|
7
|
-
|
|
8
|
-
* Redistributions of source code must retain the above copyright notice, this
|
|
9
|
-
list of conditions and the following disclaimer.
|
|
10
|
-
|
|
11
|
-
* Redistributions in binary form must reproduce the above copyright notice,
|
|
12
|
-
this list of conditions and the following disclaimer in the documentation
|
|
13
|
-
and/or other materials provided with the distribution.
|
|
14
|
-
|
|
15
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
16
|
-
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
17
|
-
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
18
|
-
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
19
|
-
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
20
|
-
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
21
|
-
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
22
|
-
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
23
|
-
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
24
|
-
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
1
|
+
Copyright (c) 2015-, Kovid Goyal <kovid@kovidgoyal.net>
|
|
2
|
+
Copyright (c) 2013-2014, Alexander Tsepkov <atsepkov@pyjeon.com>
|
|
3
|
+
All rights reserved.
|
|
4
|
+
|
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
|
6
|
+
modification, are permitted provided that the following conditions are met:
|
|
7
|
+
|
|
8
|
+
* Redistributions of source code must retain the above copyright notice, this
|
|
9
|
+
list of conditions and the following disclaimer.
|
|
10
|
+
|
|
11
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
|
12
|
+
this list of conditions and the following disclaimer in the documentation
|
|
13
|
+
and/or other materials provided with the distribution.
|
|
14
|
+
|
|
15
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
16
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
17
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
18
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
19
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
20
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
21
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
22
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
23
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
24
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
package/README.md
CHANGED
|
@@ -3688,7 +3688,7 @@ when the editor is torn down.
|
|
|
3688
3688
|
| `stdlibFiles` | `{name: source}` | `{}` | Like `virtualFiles` but treated as stdlib — always available and never produce bad-import warnings. |
|
|
3689
3689
|
| `dtsFiles` | `[{name, content}]` | `[]` | TypeScript `.d.ts` files loaded at startup. |
|
|
3690
3690
|
| `loadDts` | `(name) => Promise<string>` | — | Async callback for lazy-loading `.d.ts` content on demand. |
|
|
3691
|
-
| `extraBuiltins` | `
|
|
3691
|
+
| `extraBuiltins` | `string[]` | `[]` | Extra global names that suppress undefined-symbol warnings. |
|
|
3692
3692
|
| `pythonFlags` | string | — | Comma-separated Python flags to enable globally (e.g. `"dict_literals,overload_getitem"`). See [Python Flags](#python-flags) above. |
|
|
3693
3693
|
|
|
3694
3694
|
### Runtime API
|
package/TODO.md
CHANGED
|
@@ -17,3 +17,120 @@
|
|
|
17
17
|
|
|
18
18
|
I would like you to add support for [the python io.stringIO and io.bytesio library ] to rapydscript. It should have the same syntax as the Python implementation, and be transpiled into equivalent javascript. Please ensure with unit tests that it transpiles and the output JS runs correctly, and that the language service correctly handles it in parsed code. Please make sure it works in the web-repl too. Please also update the README if it has any outdated info about this, and the PYTHON_FEATURE_COVERAGE report. Please also add a simple example to the bottom of the TODO document using this feature (make no other changes to that file).
|
|
19
19
|
|
|
20
|
+
|
|
21
|
+
```py
|
|
22
|
+
# Over-engineered RapydScript hacking script — Python features on parade
|
|
23
|
+
|
|
24
|
+
class HackAction:
|
|
25
|
+
"""Enum-like action namespace."""
|
|
26
|
+
WEAKEN = 'weaken'
|
|
27
|
+
GROW = 'grow'
|
|
28
|
+
HACK = 'hack'
|
|
29
|
+
|
|
30
|
+
@staticmethod
|
|
31
|
+
def all():
|
|
32
|
+
return [HackAction.WEAKEN, HackAction.GROW, HackAction.HACK]
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class ServerConfig:
|
|
36
|
+
"""Data-class-style target config with property + fluent builder."""
|
|
37
|
+
|
|
38
|
+
def __init__(self, name, money_factor=1.0, sec_buffer=0.0):
|
|
39
|
+
self._name = name
|
|
40
|
+
self.money_factor = money_factor
|
|
41
|
+
self.sec_buffer = sec_buffer
|
|
42
|
+
self._tags = {'auto', 'hack'} # set literal
|
|
43
|
+
|
|
44
|
+
@property
|
|
45
|
+
def name(self):
|
|
46
|
+
return self._name
|
|
47
|
+
|
|
48
|
+
def __repr__(self):
|
|
49
|
+
return "ServerConfig(name={}, tags={})".format(
|
|
50
|
+
repr(self._name), sorted(list(self._tags))
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
def add_tags(self, *tags): # *args + fluent return
|
|
54
|
+
for t in tags:
|
|
55
|
+
self._tags.add(t)
|
|
56
|
+
return self
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def decide_action(ns, target, money_thresh, sec_thresh):
|
|
60
|
+
"""next() + generator expression to pick highest-priority action."""
|
|
61
|
+
checks = [
|
|
62
|
+
(ns.getServerSecurityLevel(target) > sec_thresh, HackAction.WEAKEN),
|
|
63
|
+
(ns.getServerMoneyAvailable(target) < money_thresh, HackAction.GROW),
|
|
64
|
+
]
|
|
65
|
+
return next((action for cond, action in checks if cond), HackAction.HACK)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
async def breach(ns, target, exploits):
|
|
69
|
+
"""Apply available exploits via (exe, fn) tuple list, nuke, return summary."""
|
|
70
|
+
# list of (exe filename, bound ns method) tuples
|
|
71
|
+
exe_methods = [
|
|
72
|
+
('BruteSSH.exe', ns.brutessh),
|
|
73
|
+
('FTPCrack.exe', ns.ftpcrack),
|
|
74
|
+
('relaySMTP.exe', ns.relaysmtp),
|
|
75
|
+
]
|
|
76
|
+
applied = [fn for exe, fn in exe_methods if ns.fileExists(exe, "home")]
|
|
77
|
+
missing = [exe for exe, fn in exe_methods if not ns.fileExists(exe, "home")]
|
|
78
|
+
|
|
79
|
+
if missing:
|
|
80
|
+
ns.tprint("Missing: {}".format(', '.join(missing)))
|
|
81
|
+
|
|
82
|
+
for fn in applied:
|
|
83
|
+
fn(target)
|
|
84
|
+
ns.nuke(target)
|
|
85
|
+
|
|
86
|
+
return {'applied': len(applied), 'total': len(exploits),
|
|
87
|
+
'rooted': ns.hasRootAccess(target)}
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
async def main(ns):
|
|
91
|
+
config = ServerConfig("n00dles").add_tags('target', 'beginner') # fluent
|
|
92
|
+
ns.tprint(repr(config)) # __repr__
|
|
93
|
+
|
|
94
|
+
target = config.name # @property
|
|
95
|
+
money_thresh = ns.getServerMaxMoney(target) * config.money_factor
|
|
96
|
+
sec_thresh = ns.getServerMinSecurityLevel(target) + config.sec_buffer
|
|
97
|
+
|
|
98
|
+
def by_name_len(p): # named key fn (required for
|
|
99
|
+
return len(p[0]) # anonymous fns in call args)
|
|
100
|
+
exploits = sorted([
|
|
101
|
+
('brutessh', 'BruteSSH.exe'),
|
|
102
|
+
('ftpcrack', 'FTPCrack.exe'),
|
|
103
|
+
('relaysmtp', 'relaySMTP.exe'),
|
|
104
|
+
], key=by_name_len)
|
|
105
|
+
|
|
106
|
+
result = await breach(ns, target, exploits)
|
|
107
|
+
ns.tprint("Breach: {applied}/{total} applied, rooted={rooted}".format(**result))
|
|
108
|
+
assert result['rooted'], "Root access denied on {}!".format(target)
|
|
109
|
+
|
|
110
|
+
dispatch = { # dict literal
|
|
111
|
+
'weaken': ns.weaken,
|
|
112
|
+
'grow': ns.grow,
|
|
113
|
+
'hack': ns.hack,
|
|
114
|
+
}
|
|
115
|
+
stats = {a: 0 for a in HackAction.all()} # dict comprehension
|
|
116
|
+
|
|
117
|
+
cycle = 0
|
|
118
|
+
while True:
|
|
119
|
+
cycle += 1
|
|
120
|
+
action = decide_action(ns, target, money_thresh, sec_thresh)
|
|
121
|
+
stats[action] += 1
|
|
122
|
+
|
|
123
|
+
if cycle % 10 is 0: # periodic summary
|
|
124
|
+
counts = [stats[a] for a in HackAction.all()]
|
|
125
|
+
summary = ', '.join(["{}: {}".format(a, v)
|
|
126
|
+
for a, v in zip(HackAction.all(), counts)])
|
|
127
|
+
ns.tprint("Cycle {} | {} any={} all={}".format(
|
|
128
|
+
cycle, summary,
|
|
129
|
+
any([v > 0 for v in counts]), # any()
|
|
130
|
+
all([v > 0 for v in counts]) # all()
|
|
131
|
+
))
|
|
132
|
+
|
|
133
|
+
await dispatch[action](target)
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
`ρσ_unpack is not defined`
|
package/add-toc-to-readme
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
#!/bin/sh
|
|
2
|
-
exec node_modules/doctoc/doctoc.js --title '**Contents**' README.md
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
exec node_modules/doctoc/doctoc.js --title '**Contents**' README.md
|
package/bin/export
CHANGED
|
@@ -1,75 +1,75 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// vim:ft=javascript:ts=4:et
|
|
3
|
-
|
|
4
|
-
"use strict";
|
|
5
|
-
|
|
6
|
-
var fs = require('fs');
|
|
7
|
-
var path = require('path');
|
|
8
|
-
var crypto = require('crypto');
|
|
9
|
-
|
|
10
|
-
var base = path.join(path.dirname(__dirname));
|
|
11
|
-
var meta = JSON.parse(fs.readFileSync(path.join(base, 'package.json'), {'encoding':'utf-8'}));
|
|
12
|
-
var compiler_dir = path.join(base, 'dev');
|
|
13
|
-
if (!path_exists(path.join(compiler_dir, 'compiler.js'))) compiler_dir = path.join(base, 'release');
|
|
14
|
-
|
|
15
|
-
var manifest = {}, total = 0;
|
|
16
|
-
['compiler.js', 'baselib-plain-pretty.js', 'baselib-plain-ugly.js'].forEach(function(x) {
|
|
17
|
-
manifest[x] = fs.readFileSync(path.join(compiler_dir, x), {'encoding':'utf-8'});
|
|
18
|
-
total += manifest[x].length;
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
['web_repl.js', 'repl.js', 'completer.js', 'utils.js', 'gettext.js', 'msgfmt.js'].forEach(function(x) {
|
|
22
|
-
x = 'tools/' + x;
|
|
23
|
-
manifest[x] = fs.readFileSync(path.join(base, x), {'encoding':'utf-8'});
|
|
24
|
-
total += manifest[x].length;
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
var dedup = {};
|
|
29
|
-
|
|
30
|
-
function path_exists(path) {
|
|
31
|
-
try {
|
|
32
|
-
fs.statSync(path);
|
|
33
|
-
return true;
|
|
34
|
-
} catch(e) {
|
|
35
|
-
if (e.code != 'ENOENT') throw e;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
function sha1sum(data) {
|
|
40
|
-
var h = crypto.createHash('sha1');
|
|
41
|
-
h.update(data);
|
|
42
|
-
return h.digest('hex');
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
function process_dir(name) {
|
|
46
|
-
var dpath = path.join(base, name);
|
|
47
|
-
var items = fs.readdirSync(dpath);
|
|
48
|
-
items.forEach(function (x) {
|
|
49
|
-
var iname = name + '/' + x;
|
|
50
|
-
var ipath = path.join(dpath, x);
|
|
51
|
-
var s = fs.statSync(ipath);
|
|
52
|
-
if (s.isDirectory()) return process_dir(iname);
|
|
53
|
-
var raw = fs.readFileSync(ipath, {'encoding':'utf-8'});
|
|
54
|
-
var sig = sha1sum(raw);
|
|
55
|
-
if (dedup.hasOwnProperty(sig)) {
|
|
56
|
-
manifest[iname] = [dedup[sig]];
|
|
57
|
-
} else {
|
|
58
|
-
manifest[iname] = raw;
|
|
59
|
-
dedup[sig] = iname;
|
|
60
|
-
total += s.size;
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
Object.keys(meta.dependencies).forEach(function (x) {
|
|
66
|
-
process_dir('node_modules/' + x);
|
|
67
|
-
});
|
|
68
|
-
console.log('// vim:fileencoding=utf-8');
|
|
69
|
-
console.log('(function() {');
|
|
70
|
-
console.log('var rs_version = ' + JSON.stringify(meta.version) + ';');
|
|
71
|
-
console.log('var data = ' + JSON.stringify(manifest) + ';');
|
|
72
|
-
console.log();
|
|
73
|
-
console.log(fs.readFileSync(path.join(base, 'tools', 'export.js'), {'encoding':'utf-8'}));
|
|
74
|
-
console.log('})()');
|
|
75
|
-
console.error('RapydScript compiler (uncompressed) size: ' + (total/(1024 * 1024)).toFixed(1) + ' MB');
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// vim:ft=javascript:ts=4:et
|
|
3
|
+
|
|
4
|
+
"use strict";
|
|
5
|
+
|
|
6
|
+
var fs = require('fs');
|
|
7
|
+
var path = require('path');
|
|
8
|
+
var crypto = require('crypto');
|
|
9
|
+
|
|
10
|
+
var base = path.join(path.dirname(__dirname));
|
|
11
|
+
var meta = JSON.parse(fs.readFileSync(path.join(base, 'package.json'), {'encoding':'utf-8'}));
|
|
12
|
+
var compiler_dir = path.join(base, 'dev');
|
|
13
|
+
if (!path_exists(path.join(compiler_dir, 'compiler.js'))) compiler_dir = path.join(base, 'release');
|
|
14
|
+
|
|
15
|
+
var manifest = {}, total = 0;
|
|
16
|
+
['compiler.js', 'baselib-plain-pretty.js', 'baselib-plain-ugly.js'].forEach(function(x) {
|
|
17
|
+
manifest[x] = fs.readFileSync(path.join(compiler_dir, x), {'encoding':'utf-8'});
|
|
18
|
+
total += manifest[x].length;
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
['web_repl.js', 'repl.js', 'completer.js', 'utils.js', 'gettext.js', 'msgfmt.js'].forEach(function(x) {
|
|
22
|
+
x = 'tools/' + x;
|
|
23
|
+
manifest[x] = fs.readFileSync(path.join(base, x), {'encoding':'utf-8'});
|
|
24
|
+
total += manifest[x].length;
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
var dedup = {};
|
|
29
|
+
|
|
30
|
+
function path_exists(path) {
|
|
31
|
+
try {
|
|
32
|
+
fs.statSync(path);
|
|
33
|
+
return true;
|
|
34
|
+
} catch(e) {
|
|
35
|
+
if (e.code != 'ENOENT') throw e;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function sha1sum(data) {
|
|
40
|
+
var h = crypto.createHash('sha1');
|
|
41
|
+
h.update(data);
|
|
42
|
+
return h.digest('hex');
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function process_dir(name) {
|
|
46
|
+
var dpath = path.join(base, name);
|
|
47
|
+
var items = fs.readdirSync(dpath);
|
|
48
|
+
items.forEach(function (x) {
|
|
49
|
+
var iname = name + '/' + x;
|
|
50
|
+
var ipath = path.join(dpath, x);
|
|
51
|
+
var s = fs.statSync(ipath);
|
|
52
|
+
if (s.isDirectory()) return process_dir(iname);
|
|
53
|
+
var raw = fs.readFileSync(ipath, {'encoding':'utf-8'});
|
|
54
|
+
var sig = sha1sum(raw);
|
|
55
|
+
if (dedup.hasOwnProperty(sig)) {
|
|
56
|
+
manifest[iname] = [dedup[sig]];
|
|
57
|
+
} else {
|
|
58
|
+
manifest[iname] = raw;
|
|
59
|
+
dedup[sig] = iname;
|
|
60
|
+
total += s.size;
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
Object.keys(meta.dependencies).forEach(function (x) {
|
|
66
|
+
process_dir('node_modules/' + x);
|
|
67
|
+
});
|
|
68
|
+
console.log('// vim:fileencoding=utf-8');
|
|
69
|
+
console.log('(function() {');
|
|
70
|
+
console.log('var rs_version = ' + JSON.stringify(meta.version) + ';');
|
|
71
|
+
console.log('var data = ' + JSON.stringify(manifest) + ';');
|
|
72
|
+
console.log();
|
|
73
|
+
console.log(fs.readFileSync(path.join(base, 'tools', 'export.js'), {'encoding':'utf-8'}));
|
|
74
|
+
console.log('})()');
|
|
75
|
+
console.error('RapydScript compiler (uncompressed) size: ' + (total/(1024 * 1024)).toFixed(1) + ' MB');
|