rapydscript-ns 0.9.3 → 0.9.4

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 (98) 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 +9 -0
  5. package/HACKING.md +103 -103
  6. package/LICENSE +24 -24
  7. package/PYTHON_GAPS.md +48 -116
  8. package/README.md +35 -15
  9. package/TODO.md +1 -26
  10. package/add-toc-to-readme +2 -2
  11. package/bin/export +75 -75
  12. package/bin/rapydscript +0 -0
  13. package/bin/web-repl-export +102 -102
  14. package/build +2 -2
  15. package/language-service/index.js +9 -7
  16. package/package.json +1 -1
  17. package/publish.py +37 -37
  18. package/session.vim +4 -4
  19. package/setup.cfg +2 -2
  20. package/src/ast.pyj +6 -0
  21. package/src/baselib-containers.pyj +23 -1
  22. package/src/baselib-str.pyj +13 -2
  23. package/src/compiler.pyj +36 -36
  24. package/src/errors.pyj +30 -30
  25. package/src/lib/aes.pyj +646 -646
  26. package/src/lib/collections.pyj +227 -3
  27. package/src/lib/copy.pyj +120 -120
  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/itertools.pyj +580 -580
  32. package/src/lib/math.pyj +193 -193
  33. package/src/lib/operator.pyj +11 -11
  34. package/src/lib/pprint.pyj +455 -0
  35. package/src/lib/random.pyj +118 -118
  36. package/src/lib/react.pyj +74 -74
  37. package/src/lib/statistics.pyj +0 -0
  38. package/src/lib/traceback.pyj +63 -63
  39. package/src/lib/uuid.pyj +77 -77
  40. package/src/monaco-language-service/diagnostics.js +2 -2
  41. package/src/monaco-language-service/dts.js +550 -550
  42. package/src/output/codegen.pyj +4 -1
  43. package/src/output/comments.pyj +45 -45
  44. package/src/output/exceptions.pyj +201 -201
  45. package/src/output/jsx.pyj +164 -164
  46. package/src/output/treeshake.pyj +182 -182
  47. package/src/output/utils.pyj +72 -72
  48. package/src/parse.pyj +28 -7
  49. package/src/string_interpolation.pyj +72 -72
  50. package/src/tokenizer.pyj +18 -2
  51. package/src/unicode_aliases.pyj +576 -576
  52. package/src/utils.pyj +192 -192
  53. package/test/_import_one.pyj +37 -37
  54. package/test/_import_two/__init__.pyj +11 -11
  55. package/test/_import_two/level2/deep.pyj +4 -4
  56. package/test/_import_two/other.pyj +6 -6
  57. package/test/_import_two/sub.pyj +13 -13
  58. package/test/aes_vectors.pyj +421 -421
  59. package/test/annotations.pyj +80 -80
  60. package/test/baselib.pyj +23 -0
  61. package/test/chainmap.pyj +185 -0
  62. package/test/decorators.pyj +77 -77
  63. package/test/docstrings.pyj +39 -39
  64. package/test/elementmaker_test.pyj +45 -45
  65. package/test/functions.pyj +151 -151
  66. package/test/generators.pyj +41 -41
  67. package/test/generic.pyj +370 -370
  68. package/test/internationalization.pyj +73 -73
  69. package/test/lint.pyj +164 -164
  70. package/test/loops.pyj +85 -85
  71. package/test/numpy.pyj +734 -734
  72. package/test/pprint.pyj +232 -0
  73. package/test/repl.pyj +121 -121
  74. package/test/scoped_flags.pyj +76 -76
  75. package/test/statistics.pyj +224 -0
  76. package/test/unit/index.js +80 -0
  77. package/test/unit/language-service-completions.js +2 -0
  78. package/test/unit/language-service-dts.js +543 -543
  79. package/test/unit/language-service-hover.js +455 -455
  80. package/test/unit/language-service.js +63 -2
  81. package/test/unit/web-repl.js +323 -0
  82. package/tools/compiler.d.ts +367 -367
  83. package/tools/completer.js +131 -131
  84. package/tools/export.js +4 -2
  85. package/tools/gettext.js +185 -185
  86. package/tools/ini.js +65 -65
  87. package/tools/msgfmt.js +187 -187
  88. package/tools/repl.js +223 -223
  89. package/tools/test.js +118 -118
  90. package/tools/utils.js +128 -128
  91. package/tools/web_repl.js +95 -95
  92. package/try +41 -41
  93. package/web-repl/env.js +196 -196
  94. package/web-repl/index.html +163 -163
  95. package/web-repl/prism.css +139 -139
  96. package/web-repl/prism.js +113 -113
  97. package/web-repl/rapydscript.js +228 -226
  98. 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)