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.
Files changed (100) hide show
  1. package/.agignore +1 -1
  2. package/.github/workflows/ci.yml +38 -38
  3. package/=template.pyj +5 -5
  4. package/CHANGELOG.md +10 -0
  5. package/HACKING.md +103 -103
  6. package/LICENSE +24 -24
  7. package/README.md +7 -6
  8. package/TODO.md +116 -1
  9. package/add-toc-to-readme +2 -2
  10. package/bin/export +75 -75
  11. package/bin/rapydscript +70 -70
  12. package/bin/web-repl-export +102 -102
  13. package/build +2 -2
  14. package/language-service/index.js +9 -9
  15. package/language-service/language-service.d.ts +1 -1
  16. package/package.json +6 -2
  17. package/publish.py +37 -37
  18. package/release/compiler.js +246 -231
  19. package/release/signatures.json +23 -23
  20. package/session.vim +4 -4
  21. package/setup.cfg +2 -2
  22. package/src/compiler.pyj +36 -36
  23. package/src/errors.pyj +30 -30
  24. package/src/lib/aes.pyj +646 -646
  25. package/src/lib/contextlib.pyj +379 -0
  26. package/src/lib/copy.pyj +120 -120
  27. package/src/lib/datetime.pyj +712 -0
  28. package/src/lib/elementmaker.pyj +83 -83
  29. package/src/lib/encodings.pyj +126 -126
  30. package/src/lib/gettext.pyj +569 -569
  31. package/src/lib/io.pyj +500 -0
  32. package/src/lib/itertools.pyj +580 -580
  33. package/src/lib/json.pyj +227 -0
  34. package/src/lib/math.pyj +193 -193
  35. package/src/lib/operator.pyj +11 -11
  36. package/src/lib/pythonize.pyj +20 -20
  37. package/src/lib/random.pyj +118 -118
  38. package/src/lib/react.pyj +74 -74
  39. package/src/lib/traceback.pyj +63 -63
  40. package/src/lib/uuid.pyj +77 -77
  41. package/src/monaco-language-service/diagnostics.js +4 -4
  42. package/src/monaco-language-service/dts.js +550 -550
  43. package/src/monaco-language-service/index.js +2 -2
  44. package/src/output/comments.pyj +45 -45
  45. package/src/output/exceptions.pyj +201 -201
  46. package/src/output/jsx.pyj +164 -164
  47. package/src/output/loops.pyj +9 -0
  48. package/src/output/treeshake.pyj +182 -182
  49. package/src/output/utils.pyj +72 -72
  50. package/src/string_interpolation.pyj +72 -72
  51. package/src/tokenizer.pyj +1 -1
  52. package/src/unicode_aliases.pyj +576 -576
  53. package/src/utils.pyj +192 -192
  54. package/test/_import_one.pyj +37 -37
  55. package/test/_import_two/__init__.pyj +11 -11
  56. package/test/_import_two/level2/deep.pyj +4 -4
  57. package/test/_import_two/other.pyj +6 -6
  58. package/test/_import_two/sub.pyj +13 -13
  59. package/test/aes_vectors.pyj +421 -421
  60. package/test/annotations.pyj +80 -80
  61. package/test/contextlib.pyj +362 -0
  62. package/test/datetime.pyj +500 -0
  63. package/test/debugger_stmt.pyj +41 -0
  64. package/test/decorators.pyj +77 -77
  65. package/test/docstrings.pyj +39 -39
  66. package/test/elementmaker_test.pyj +45 -45
  67. package/test/functions.pyj +151 -151
  68. package/test/generators.pyj +41 -41
  69. package/test/generic.pyj +370 -370
  70. package/test/imports.pyj +72 -72
  71. package/test/internationalization.pyj +73 -73
  72. package/test/io.pyj +316 -0
  73. package/test/json.pyj +196 -0
  74. package/test/lint.pyj +164 -164
  75. package/test/loops.pyj +85 -85
  76. package/test/numpy.pyj +734 -734
  77. package/test/omit_function_metadata.pyj +20 -20
  78. package/test/repl.pyj +121 -121
  79. package/test/scoped_flags.pyj +76 -76
  80. package/test/unit/index.js +66 -0
  81. package/test/unit/language-service-dts.js +543 -543
  82. package/test/unit/language-service-hover.js +455 -455
  83. package/test/unit/language-service.js +1 -1
  84. package/test/unit/web-repl.js +533 -0
  85. package/tools/compiler.d.ts +367 -0
  86. package/tools/completer.js +131 -131
  87. package/tools/gettext.js +185 -185
  88. package/tools/ini.js +65 -65
  89. package/tools/msgfmt.js +187 -187
  90. package/tools/repl.js +223 -223
  91. package/tools/test.js +118 -118
  92. package/tools/utils.js +128 -128
  93. package/tools/web_repl.js +95 -95
  94. package/try +41 -41
  95. package/web-repl/env.js +196 -196
  96. package/web-repl/index.html +163 -163
  97. package/web-repl/prism.css +139 -139
  98. package/web-repl/prism.js +113 -113
  99. package/web-repl/rapydscript.js +224 -224
  100. package/web-repl/sha1.js +25 -25
@@ -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. &amp;lt; -> &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. &amp;lt; -> &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)
@@ -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):