rapydscript-ns 0.9.0 → 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 +10 -0
- package/HACKING.md +103 -103
- package/LICENSE +24 -24
- package/README.md +7 -6
- package/TODO.md +116 -1
- 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 +9 -9
- package/language-service/language-service.d.ts +1 -1
- package/package.json +6 -2
- package/publish.py +37 -37
- package/release/compiler.js +246 -231
- package/release/signatures.json +23 -23
- 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/contextlib.pyj +379 -0
- package/src/lib/copy.pyj +120 -120
- package/src/lib/datetime.pyj +712 -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/io.pyj +500 -0
- package/src/lib/itertools.pyj +580 -580
- package/src/lib/json.pyj +227 -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/traceback.pyj +63 -63
- package/src/lib/uuid.pyj +77 -77
- package/src/monaco-language-service/diagnostics.js +4 -4
- 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/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/contextlib.pyj +362 -0
- package/test/datetime.pyj +500 -0
- package/test/debugger_stmt.pyj +41 -0
- 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/io.pyj +316 -0
- package/test/json.pyj +196 -0
- 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/test/unit/web-repl.js +533 -0
- 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,3 +1,13 @@
|
|
|
1
|
+
version 0.9.2
|
|
2
|
+
=======================
|
|
3
|
+
* Added the contextlib standard library
|
|
4
|
+
* Added the datetime standard library
|
|
5
|
+
* Added the io standard library
|
|
6
|
+
* Added the json standard library
|
|
7
|
+
* Added support for the `debugger` keyword
|
|
8
|
+
* Added TypeScript definitions for compiler.js
|
|
9
|
+
* Simplified ExtraBuiltins interface
|
|
10
|
+
|
|
1
11
|
version 0.9.0
|
|
2
12
|
=======================
|
|
3
13
|
* All optional Python compatibility features are now enabled by default. See Python Feature Coverage from the README
|
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
|
@@ -3348,6 +3348,7 @@ One of Python's main strengths is the number of libraries available to the devel
|
|
|
3348
3348
|
itertools # count, cycle, repeat, accumulate, chain, compress, dropwhile, filterfalse,
|
|
3349
3349
|
# groupby, islice, pairwise, starmap, takewhile, zip_longest,
|
|
3350
3350
|
# product, permutations, combinations, combinations_with_replacement
|
|
3351
|
+
io # StringIO (in-memory text stream), BytesIO (in-memory binary stream)
|
|
3351
3352
|
|
|
3352
3353
|
For the most part, the logic implemented in these libraries functions identically to the Python versions. I'd be happy to include more libraries, if other members of the community want them. However, unlike most other Python-to-JavaScript compilers, RapydScript doesn't need them to be complete since there are already tons of available JavaScript libraries that it can use natively.
|
|
3353
3354
|
|
|
@@ -3687,7 +3688,7 @@ when the editor is torn down.
|
|
|
3687
3688
|
| `stdlibFiles` | `{name: source}` | `{}` | Like `virtualFiles` but treated as stdlib — always available and never produce bad-import warnings. |
|
|
3688
3689
|
| `dtsFiles` | `[{name, content}]` | `[]` | TypeScript `.d.ts` files loaded at startup. |
|
|
3689
3690
|
| `loadDts` | `(name) => Promise<string>` | — | Async callback for lazy-loading `.d.ts` content on demand. |
|
|
3690
|
-
| `extraBuiltins` | `
|
|
3691
|
+
| `extraBuiltins` | `string[]` | `[]` | Extra global names that suppress undefined-symbol warnings. |
|
|
3691
3692
|
| `pythonFlags` | string | — | Comma-separated Python flags to enable globally (e.g. `"dict_literals,overload_getitem"`). See [Python Flags](#python-flags) above. |
|
|
3692
3693
|
|
|
3693
3694
|
### Runtime API
|
|
@@ -4016,7 +4017,7 @@ This restores the original RapydScript behavior: plain JS objects for `{}`, no o
|
|
|
4016
4017
|
|
|
4017
4018
|
---
|
|
4018
4019
|
|
|
4019
|
-
### Not Supported
|
|
4020
|
+
### Python Features That Are Not Supported
|
|
4020
4021
|
|
|
4021
4022
|
| Feature | Notes |
|
|
4022
4023
|
|---------------------------------------|-----------------------------------------------------------------------------------------|
|
|
@@ -4050,13 +4051,13 @@ Modules with a `src/lib/` implementation available are marked ✅. All others ar
|
|
|
4050
4051
|
| `dataclasses` | ✅ | `@dataclass`, `field()`, `asdict()`, `astuple()`, `replace()`, `fields()`, `is_dataclass()`, `MISSING` in `src/lib/dataclasses.pyj`; `frozen=True`, `order=True`, inheritance supported; note: `field()` first positional arg is the default value (JS reserved word `default` cannot be used as a kwarg) |
|
|
4051
4052
|
| `enum` | ✅ | `Enum` base class in `src/lib/enum.pyj`; `.name`, `.value`, iteration, `isinstance` checks; `IntEnum`/`Flag` not available |
|
|
4052
4053
|
| `abc` | ✅ | `ABC`, `@abstractmethod`, `Protocol`, `@runtime_checkable`, `ABCMeta` (informational), `get_cache_token()` in `src/lib/abc.pyj`; abstract method enforcement via `__init__` guard; `ABC.register()` for virtual subclasses with isinstance support; `Symbol.hasInstance` enables structural isinstance for `@runtime_checkable` protocols; `ABCMeta` metaclass not usable (no metaclass support), use `ABC` base class instead |
|
|
4053
|
-
| `contextlib` |
|
|
4054
|
+
| `contextlib` | ✅ | `AbstractContextManager`, `@contextmanager`, `closing`, `nullcontext`, `suppress`, `ExitStack` in `src/lib/contextlib.pyj`; generator-based context managers via `@contextmanager`; `asynccontextmanager` not available |
|
|
4055
|
+
| `datetime` | ✅ | `date`, `time`, `datetime`, `timedelta`, `MINYEAR`, `MAXYEAR` in `src/lib/datetime.pyj`; construction, `isoformat()`, `fromisoformat()`, `today()`/`now()`, `combine()`, arithmetic (via `__add__`/`__sub__`; operators need `overload_operators`), comparisons, `replace()`, `strftime()` (%Y %m %d %H %M %S %f %A %a %B %b %j %p %I %%); no tzinfo/timezone support |
|
|
4056
|
+
| `json` | ✅ | `dumps()`, `loads()`, `dump()`, `load()`, `JSONDecodeError` in `src/lib/json.pyj`; `indent`, `sort_keys`, `separators`, `dflt` (Python's `default`) callback, `object_hook`, `object_pairs_hook`, `parse_float`, `parse_int` supported; backed by the JS `JSON` global; note: `default` is a JS reserved word — use `dflt=` instead |
|
|
4057
|
+
| `io` | ✅ | `StringIO`, `BytesIO`, `UnsupportedOperation` in `src/lib/io.pyj`; `read([size])`, `readline([size])`, `readlines([hint])`, `write()`, `writelines()`, `seek(pos[, whence])`, `tell()`, `truncate([pos])`, `getvalue()`, `close()`, `closed`; context manager support; `readable()`, `writable()`, `seekable()` return True; `newline` parameter accepted for API compatibility |
|
|
4054
4058
|
| `string` | ❌ | Character constants, `Template`, `Formatter` not available |
|
|
4055
|
-
| `json` | ❌ | No Python wrapper; JS `JSON.parse` / `JSON.stringify` work directly via verbatim JS |
|
|
4056
|
-
| `datetime` | ❌ | `date`, `time`, `datetime`, `timedelta` not available |
|
|
4057
4059
|
| `inspect` | ❌ | `signature`, `getmembers`, `isfunction` etc. not available |
|
|
4058
4060
|
| `asyncio` | ❌ | Event loop, `gather`, `sleep`, `Queue`, `Task` wrappers not available; use `async`/`await` |
|
|
4059
|
-
| `io` | ❌ | `StringIO`, `BytesIO` not available |
|
|
4060
4061
|
| `struct` | ❌ | Binary packing/unpacking not available |
|
|
4061
4062
|
| `hashlib` | ❌ | MD5, SHA-256 etc. not available; use Web Crypto API via verbatim JS |
|
|
4062
4063
|
| `hmac` | ❌ | Keyed hashing not available |
|
package/TODO.md
CHANGED
|
@@ -15,7 +15,122 @@
|
|
|
15
15
|
- examples of using js libraries in rapydscript in readme?
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
I would like you to add support for [
|
|
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
20
|
|
|
21
|
+
```py
|
|
22
|
+
# Over-engineered RapydScript hacking script — Python features on parade
|
|
21
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
|