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/src/output/jsx.pyj
CHANGED
|
@@ -1,164 +1,164 @@
|
|
|
1
|
-
# vim:fileencoding=utf-8
|
|
2
|
-
# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>
|
|
3
|
-
from __python__ import hash_literals
|
|
4
|
-
|
|
5
|
-
from ast import AST_String, AST_JSXText, AST_JSXSpread, AST_JSXExprContainer, is_node_type
|
|
6
|
-
|
|
7
|
-
def _is_component_tag(tag):
|
|
8
|
-
# Components start with uppercase or use dot notation (e.g. Router.Route)
|
|
9
|
-
first = tag[0]
|
|
10
|
-
return (first >= 'A' and first <= 'Z') or '.' in tag
|
|
11
|
-
|
|
12
|
-
def _needs_quoting(name):
|
|
13
|
-
# Attribute names containing non-identifier chars (e.g. aria-label) need quoting
|
|
14
|
-
return not v'/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name)'
|
|
15
|
-
|
|
16
|
-
def _decode_html_entities(text):
|
|
17
|
-
# Decode HTML entities in a single pass to avoid double-decoding (e.g. &lt; -> <)
|
|
18
|
-
return text.replace(/&(?:#x([0-9a-fA-F]+)|#(\d+)|([a-zA-Z]+));/g, def(match, hex, dec, name):
|
|
19
|
-
if hex:
|
|
20
|
-
return String.fromCharCode(parseInt(hex, 16))
|
|
21
|
-
if dec:
|
|
22
|
-
return String.fromCharCode(parseInt(dec, 10))
|
|
23
|
-
if name is 'amp':
|
|
24
|
-
return '&'
|
|
25
|
-
if name is 'lt':
|
|
26
|
-
return '<'
|
|
27
|
-
if name is 'gt':
|
|
28
|
-
return '>'
|
|
29
|
-
if name is 'quot':
|
|
30
|
-
return '"'
|
|
31
|
-
if name is 'apos':
|
|
32
|
-
return "'"
|
|
33
|
-
if name is 'nbsp':
|
|
34
|
-
return '\u00a0'
|
|
35
|
-
return match
|
|
36
|
-
)
|
|
37
|
-
|
|
38
|
-
def _normalize_jsx_whitespace(text):
|
|
39
|
-
# Implements the Babel JSX whitespace algorithm:
|
|
40
|
-
# - Split by newlines; trim leading whitespace from all lines except the first,
|
|
41
|
-
# trailing whitespace from all lines except the last.
|
|
42
|
-
# - Lines that are empty after trimming are dropped.
|
|
43
|
-
# - Remaining non-empty lines are joined; each line except the last non-empty
|
|
44
|
-
# gets a trailing space to separate it from the next.
|
|
45
|
-
lines = text.split('\n')
|
|
46
|
-
last_non_empty = -1
|
|
47
|
-
for i in range(lines.length):
|
|
48
|
-
if /[^ \t]/.test(lines[i]):
|
|
49
|
-
last_non_empty = i
|
|
50
|
-
result = ''
|
|
51
|
-
for i in range(lines.length):
|
|
52
|
-
line = lines[i].replace(/\t/g, ' ')
|
|
53
|
-
is_first = (i is 0)
|
|
54
|
-
is_last = (i is lines.length - 1)
|
|
55
|
-
if not is_first:
|
|
56
|
-
line = line.replace(/^[ ]+/, '')
|
|
57
|
-
if not is_last:
|
|
58
|
-
line = line.replace(/[ ]+$/, '')
|
|
59
|
-
if line:
|
|
60
|
-
if i is not last_non_empty:
|
|
61
|
-
line += ' '
|
|
62
|
-
result += line
|
|
63
|
-
return result
|
|
64
|
-
|
|
65
|
-
def _process_jsx_text(text):
|
|
66
|
-
text = _normalize_jsx_whitespace(text)
|
|
67
|
-
if text:
|
|
68
|
-
text = _decode_html_entities(text)
|
|
69
|
-
return text
|
|
70
|
-
|
|
71
|
-
def _print_tag(tag, output):
|
|
72
|
-
if _is_component_tag(tag):
|
|
73
|
-
output.print(tag)
|
|
74
|
-
else:
|
|
75
|
-
output.print('"')
|
|
76
|
-
output.print(tag)
|
|
77
|
-
output.print('"')
|
|
78
|
-
|
|
79
|
-
def _print_props(props, output):
|
|
80
|
-
if not props or not props.length:
|
|
81
|
-
output.print('null')
|
|
82
|
-
return
|
|
83
|
-
output.print('{')
|
|
84
|
-
first = True
|
|
85
|
-
for prop in props:
|
|
86
|
-
if not first:
|
|
87
|
-
output.print(', ')
|
|
88
|
-
first = False
|
|
89
|
-
if is_node_type(prop, AST_JSXSpread):
|
|
90
|
-
output.print('...')
|
|
91
|
-
prop.expression.print(output)
|
|
92
|
-
else:
|
|
93
|
-
if _needs_quoting(prop.name):
|
|
94
|
-
output.print('"')
|
|
95
|
-
output.print(prop.name)
|
|
96
|
-
output.print('"')
|
|
97
|
-
else:
|
|
98
|
-
output.print(prop.name)
|
|
99
|
-
output.print(': ')
|
|
100
|
-
if prop.value is None:
|
|
101
|
-
output.print('true')
|
|
102
|
-
elif is_node_type(prop.value, AST_String):
|
|
103
|
-
output.print_string(prop.value.value)
|
|
104
|
-
else:
|
|
105
|
-
prop.value.print(output)
|
|
106
|
-
output.print('}')
|
|
107
|
-
|
|
108
|
-
def _print_children(children, output):
|
|
109
|
-
for child in children:
|
|
110
|
-
if is_node_type(child, AST_JSXText):
|
|
111
|
-
text = _process_jsx_text(child.value)
|
|
112
|
-
if text:
|
|
113
|
-
output.print(', ')
|
|
114
|
-
output.print_string(text)
|
|
115
|
-
elif is_node_type(child, AST_JSXExprContainer):
|
|
116
|
-
output.print(', ')
|
|
117
|
-
child.expression.print(output)
|
|
118
|
-
else:
|
|
119
|
-
output.print(', ')
|
|
120
|
-
child.print(output)
|
|
121
|
-
|
|
122
|
-
def print_jsx_element(self, output):
|
|
123
|
-
output.print('React.createElement(')
|
|
124
|
-
_print_tag(self.tag, output)
|
|
125
|
-
output.print(', ')
|
|
126
|
-
_print_props(self.props, output)
|
|
127
|
-
if not self.self_closing:
|
|
128
|
-
_print_children(self.children, output)
|
|
129
|
-
output.print(')')
|
|
130
|
-
|
|
131
|
-
def print_jsx_fragment(self, output):
|
|
132
|
-
output.print('React.createElement(React.Fragment, null')
|
|
133
|
-
_print_children(self.children, output)
|
|
134
|
-
output.print(')')
|
|
135
|
-
|
|
136
|
-
def print_jsx_attribute(self, output):
|
|
137
|
-
# Handled directly by _print_props; kept for completeness
|
|
138
|
-
if _needs_quoting(self.name):
|
|
139
|
-
output.print('"')
|
|
140
|
-
output.print(self.name)
|
|
141
|
-
output.print('"')
|
|
142
|
-
else:
|
|
143
|
-
output.print(self.name)
|
|
144
|
-
if self.value is not None:
|
|
145
|
-
output.print(': ')
|
|
146
|
-
if is_node_type(self.value, AST_String):
|
|
147
|
-
output.print_string(self.value.value)
|
|
148
|
-
else:
|
|
149
|
-
self.value.print(output)
|
|
150
|
-
|
|
151
|
-
def print_jsx_spread(self, output):
|
|
152
|
-
# Handled directly by _print_props; kept for completeness
|
|
153
|
-
output.print('...')
|
|
154
|
-
self.expression.print(output)
|
|
155
|
-
|
|
156
|
-
def print_jsx_text(self, output):
|
|
157
|
-
# Handled directly by _print_children; kept for completeness
|
|
158
|
-
text = _process_jsx_text(self.value)
|
|
159
|
-
if text:
|
|
160
|
-
output.print_string(text)
|
|
161
|
-
|
|
162
|
-
def print_jsx_expr_container(self, output):
|
|
163
|
-
# Handled directly by _print_children; kept for completeness
|
|
164
|
-
self.expression.print(output)
|
|
1
|
+
# vim:fileencoding=utf-8
|
|
2
|
+
# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>
|
|
3
|
+
from __python__ import hash_literals
|
|
4
|
+
|
|
5
|
+
from ast import AST_String, AST_JSXText, AST_JSXSpread, AST_JSXExprContainer, is_node_type
|
|
6
|
+
|
|
7
|
+
def _is_component_tag(tag):
|
|
8
|
+
# Components start with uppercase or use dot notation (e.g. Router.Route)
|
|
9
|
+
first = tag[0]
|
|
10
|
+
return (first >= 'A' and first <= 'Z') or '.' in tag
|
|
11
|
+
|
|
12
|
+
def _needs_quoting(name):
|
|
13
|
+
# Attribute names containing non-identifier chars (e.g. aria-label) need quoting
|
|
14
|
+
return not v'/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name)'
|
|
15
|
+
|
|
16
|
+
def _decode_html_entities(text):
|
|
17
|
+
# Decode HTML entities in a single pass to avoid double-decoding (e.g. &lt; -> <)
|
|
18
|
+
return text.replace(/&(?:#x([0-9a-fA-F]+)|#(\d+)|([a-zA-Z]+));/g, def(match, hex, dec, name):
|
|
19
|
+
if hex:
|
|
20
|
+
return String.fromCharCode(parseInt(hex, 16))
|
|
21
|
+
if dec:
|
|
22
|
+
return String.fromCharCode(parseInt(dec, 10))
|
|
23
|
+
if name is 'amp':
|
|
24
|
+
return '&'
|
|
25
|
+
if name is 'lt':
|
|
26
|
+
return '<'
|
|
27
|
+
if name is 'gt':
|
|
28
|
+
return '>'
|
|
29
|
+
if name is 'quot':
|
|
30
|
+
return '"'
|
|
31
|
+
if name is 'apos':
|
|
32
|
+
return "'"
|
|
33
|
+
if name is 'nbsp':
|
|
34
|
+
return '\u00a0'
|
|
35
|
+
return match
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
def _normalize_jsx_whitespace(text):
|
|
39
|
+
# Implements the Babel JSX whitespace algorithm:
|
|
40
|
+
# - Split by newlines; trim leading whitespace from all lines except the first,
|
|
41
|
+
# trailing whitespace from all lines except the last.
|
|
42
|
+
# - Lines that are empty after trimming are dropped.
|
|
43
|
+
# - Remaining non-empty lines are joined; each line except the last non-empty
|
|
44
|
+
# gets a trailing space to separate it from the next.
|
|
45
|
+
lines = text.split('\n')
|
|
46
|
+
last_non_empty = -1
|
|
47
|
+
for i in range(lines.length):
|
|
48
|
+
if /[^ \t]/.test(lines[i]):
|
|
49
|
+
last_non_empty = i
|
|
50
|
+
result = ''
|
|
51
|
+
for i in range(lines.length):
|
|
52
|
+
line = lines[i].replace(/\t/g, ' ')
|
|
53
|
+
is_first = (i is 0)
|
|
54
|
+
is_last = (i is lines.length - 1)
|
|
55
|
+
if not is_first:
|
|
56
|
+
line = line.replace(/^[ ]+/, '')
|
|
57
|
+
if not is_last:
|
|
58
|
+
line = line.replace(/[ ]+$/, '')
|
|
59
|
+
if line:
|
|
60
|
+
if i is not last_non_empty:
|
|
61
|
+
line += ' '
|
|
62
|
+
result += line
|
|
63
|
+
return result
|
|
64
|
+
|
|
65
|
+
def _process_jsx_text(text):
|
|
66
|
+
text = _normalize_jsx_whitespace(text)
|
|
67
|
+
if text:
|
|
68
|
+
text = _decode_html_entities(text)
|
|
69
|
+
return text
|
|
70
|
+
|
|
71
|
+
def _print_tag(tag, output):
|
|
72
|
+
if _is_component_tag(tag):
|
|
73
|
+
output.print(tag)
|
|
74
|
+
else:
|
|
75
|
+
output.print('"')
|
|
76
|
+
output.print(tag)
|
|
77
|
+
output.print('"')
|
|
78
|
+
|
|
79
|
+
def _print_props(props, output):
|
|
80
|
+
if not props or not props.length:
|
|
81
|
+
output.print('null')
|
|
82
|
+
return
|
|
83
|
+
output.print('{')
|
|
84
|
+
first = True
|
|
85
|
+
for prop in props:
|
|
86
|
+
if not first:
|
|
87
|
+
output.print(', ')
|
|
88
|
+
first = False
|
|
89
|
+
if is_node_type(prop, AST_JSXSpread):
|
|
90
|
+
output.print('...')
|
|
91
|
+
prop.expression.print(output)
|
|
92
|
+
else:
|
|
93
|
+
if _needs_quoting(prop.name):
|
|
94
|
+
output.print('"')
|
|
95
|
+
output.print(prop.name)
|
|
96
|
+
output.print('"')
|
|
97
|
+
else:
|
|
98
|
+
output.print(prop.name)
|
|
99
|
+
output.print(': ')
|
|
100
|
+
if prop.value is None:
|
|
101
|
+
output.print('true')
|
|
102
|
+
elif is_node_type(prop.value, AST_String):
|
|
103
|
+
output.print_string(prop.value.value)
|
|
104
|
+
else:
|
|
105
|
+
prop.value.print(output)
|
|
106
|
+
output.print('}')
|
|
107
|
+
|
|
108
|
+
def _print_children(children, output):
|
|
109
|
+
for child in children:
|
|
110
|
+
if is_node_type(child, AST_JSXText):
|
|
111
|
+
text = _process_jsx_text(child.value)
|
|
112
|
+
if text:
|
|
113
|
+
output.print(', ')
|
|
114
|
+
output.print_string(text)
|
|
115
|
+
elif is_node_type(child, AST_JSXExprContainer):
|
|
116
|
+
output.print(', ')
|
|
117
|
+
child.expression.print(output)
|
|
118
|
+
else:
|
|
119
|
+
output.print(', ')
|
|
120
|
+
child.print(output)
|
|
121
|
+
|
|
122
|
+
def print_jsx_element(self, output):
|
|
123
|
+
output.print('React.createElement(')
|
|
124
|
+
_print_tag(self.tag, output)
|
|
125
|
+
output.print(', ')
|
|
126
|
+
_print_props(self.props, output)
|
|
127
|
+
if not self.self_closing:
|
|
128
|
+
_print_children(self.children, output)
|
|
129
|
+
output.print(')')
|
|
130
|
+
|
|
131
|
+
def print_jsx_fragment(self, output):
|
|
132
|
+
output.print('React.createElement(React.Fragment, null')
|
|
133
|
+
_print_children(self.children, output)
|
|
134
|
+
output.print(')')
|
|
135
|
+
|
|
136
|
+
def print_jsx_attribute(self, output):
|
|
137
|
+
# Handled directly by _print_props; kept for completeness
|
|
138
|
+
if _needs_quoting(self.name):
|
|
139
|
+
output.print('"')
|
|
140
|
+
output.print(self.name)
|
|
141
|
+
output.print('"')
|
|
142
|
+
else:
|
|
143
|
+
output.print(self.name)
|
|
144
|
+
if self.value is not None:
|
|
145
|
+
output.print(': ')
|
|
146
|
+
if is_node_type(self.value, AST_String):
|
|
147
|
+
output.print_string(self.value.value)
|
|
148
|
+
else:
|
|
149
|
+
self.value.print(output)
|
|
150
|
+
|
|
151
|
+
def print_jsx_spread(self, output):
|
|
152
|
+
# Handled directly by _print_props; kept for completeness
|
|
153
|
+
output.print('...')
|
|
154
|
+
self.expression.print(output)
|
|
155
|
+
|
|
156
|
+
def print_jsx_text(self, output):
|
|
157
|
+
# Handled directly by _print_children; kept for completeness
|
|
158
|
+
text = _process_jsx_text(self.value)
|
|
159
|
+
if text:
|
|
160
|
+
output.print_string(text)
|
|
161
|
+
|
|
162
|
+
def print_jsx_expr_container(self, output):
|
|
163
|
+
# Handled directly by _print_children; kept for completeness
|
|
164
|
+
self.expression.print(output)
|
package/src/output/loops.pyj
CHANGED
|
@@ -455,6 +455,15 @@ def print_list_comprehension(self, output):
|
|
|
455
455
|
body_out.assign("ρσ_Result")
|
|
456
456
|
body_out.print(result_obj)
|
|
457
457
|
# Locally scope all loop variables (outer and inner clauses)
|
|
458
|
+
needs_unpack = is_node_type(self.init, AST_Array)
|
|
459
|
+
if not needs_unpack:
|
|
460
|
+
for clause in clauses:
|
|
461
|
+
if is_node_type(clause.init, AST_Array):
|
|
462
|
+
needs_unpack = True
|
|
463
|
+
break
|
|
464
|
+
if needs_unpack:
|
|
465
|
+
body_out.comma()
|
|
466
|
+
body_out.print("ρσ_unpack")
|
|
458
467
|
def decl_loop_vars(init_node):
|
|
459
468
|
# Recursively declare all leaf variable names from nested tuples/seqs
|
|
460
469
|
if is_node_type(init_node, AST_Array):
|