@alloy-js/python 0.5.0-dev.1 → 0.5.0-dev.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 (166) hide show
  1. package/dist/dev/src/components/SourceFile.js +44 -32
  2. package/dist/dev/src/components/SourceFile.js.map +1 -1
  3. package/dist/dev/test/callsignatures.test.js +471 -297
  4. package/dist/dev/test/callsignatures.test.js.map +1 -1
  5. package/dist/dev/test/class-method-declaration.test.js +21 -10
  6. package/dist/dev/test/class-method-declaration.test.js.map +1 -1
  7. package/dist/dev/test/classdeclarations.test.js +459 -393
  8. package/dist/dev/test/classdeclarations.test.js.map +1 -1
  9. package/dist/dev/test/classinstantiations.test.js +201 -168
  10. package/dist/dev/test/classinstantiations.test.js.map +1 -1
  11. package/dist/dev/test/constructordeclaration.test.js +22 -11
  12. package/dist/dev/test/constructordeclaration.test.js.map +1 -1
  13. package/dist/dev/test/dataclassdeclarations.test.js +322 -368
  14. package/dist/dev/test/dataclassdeclarations.test.js.map +1 -1
  15. package/dist/dev/test/decoratorlist.test.js +96 -49
  16. package/dist/dev/test/decoratorlist.test.js.map +1 -1
  17. package/dist/dev/test/dundermethoddeclaration.test.js +22 -11
  18. package/dist/dev/test/dundermethoddeclaration.test.js.map +1 -1
  19. package/dist/dev/test/enums.test.js +218 -184
  20. package/dist/dev/test/enums.test.js.map +1 -1
  21. package/dist/dev/test/externals.test.js +57 -45
  22. package/dist/dev/test/externals.test.js.map +1 -1
  23. package/dist/dev/test/factories.test.js +124 -50
  24. package/dist/dev/test/factories.test.js.map +1 -1
  25. package/dist/dev/test/functioncallexpressions.test.js +199 -164
  26. package/dist/dev/test/functioncallexpressions.test.js.map +1 -1
  27. package/dist/dev/test/functiondeclaration.test.js +439 -272
  28. package/dist/dev/test/functiondeclaration.test.js.map +1 -1
  29. package/dist/dev/test/imports.test.js +273 -221
  30. package/dist/dev/test/imports.test.js.map +1 -1
  31. package/dist/dev/test/memberexpressions.test.js +1237 -972
  32. package/dist/dev/test/memberexpressions.test.js.map +1 -1
  33. package/dist/dev/test/methoddeclaration.test.js +142 -78
  34. package/dist/dev/test/methoddeclaration.test.js.map +1 -1
  35. package/dist/dev/test/namepolicies.test.js +130 -94
  36. package/dist/dev/test/namepolicies.test.js.map +1 -1
  37. package/dist/dev/test/propertydeclaration.test.js +88 -59
  38. package/dist/dev/test/propertydeclaration.test.js.map +1 -1
  39. package/dist/dev/test/pydanticclassdeclarations.test.js +299 -347
  40. package/dist/dev/test/pydanticclassdeclarations.test.js.map +1 -1
  41. package/dist/dev/test/pydocs.test.js +888 -715
  42. package/dist/dev/test/pydocs.test.js.map +1 -1
  43. package/dist/dev/test/references.test.js +42 -35
  44. package/dist/dev/test/references.test.js.map +1 -1
  45. package/dist/dev/test/sourcefiles.test.js +1109 -841
  46. package/dist/dev/test/sourcefiles.test.js.map +1 -1
  47. package/dist/dev/test/staticmethoddeclaration.test.js +21 -10
  48. package/dist/dev/test/staticmethoddeclaration.test.js.map +1 -1
  49. package/dist/dev/test/type-checking-imports.test.js +408 -359
  50. package/dist/dev/test/type-checking-imports.test.js.map +1 -1
  51. package/dist/dev/test/typereference.test.js +55 -40
  52. package/dist/dev/test/typereference.test.js.map +1 -1
  53. package/dist/dev/test/uniontypeexpression.test.js +222 -146
  54. package/dist/dev/test/uniontypeexpression.test.js.map +1 -1
  55. package/dist/dev/test/utils.js +39 -77
  56. package/dist/dev/test/utils.js.map +1 -1
  57. package/dist/dev/test/values.test.js +237 -101
  58. package/dist/dev/test/values.test.js.map +1 -1
  59. package/dist/dev/test/variables.test.js +321 -203
  60. package/dist/dev/test/variables.test.js.map +1 -1
  61. package/dist/dev/test/vitest.setup.js +2 -0
  62. package/dist/dev/test/vitest.setup.js.map +1 -0
  63. package/dist/src/components/SourceFile.d.ts +2 -2
  64. package/dist/src/components/SourceFile.d.ts.map +1 -1
  65. package/dist/src/components/SourceFile.js +12 -0
  66. package/dist/src/components/SourceFile.js.map +1 -1
  67. package/dist/test/callsignatures.test.js +346 -272
  68. package/dist/test/callsignatures.test.js.map +1 -1
  69. package/dist/test/class-method-declaration.test.js +7 -4
  70. package/dist/test/class-method-declaration.test.js.map +1 -1
  71. package/dist/test/classdeclarations.test.js +302 -288
  72. package/dist/test/classdeclarations.test.js.map +1 -1
  73. package/dist/test/classinstantiations.test.js +112 -103
  74. package/dist/test/classinstantiations.test.js.map +1 -1
  75. package/dist/test/constructordeclaration.test.js +7 -4
  76. package/dist/test/constructordeclaration.test.js.map +1 -1
  77. package/dist/test/dataclassdeclarations.test.js +134 -184
  78. package/dist/test/dataclassdeclarations.test.js.map +1 -1
  79. package/dist/test/decoratorlist.test.js +59 -36
  80. package/dist/test/decoratorlist.test.js.map +1 -1
  81. package/dist/test/dundermethoddeclaration.test.js +7 -4
  82. package/dist/test/dundermethoddeclaration.test.js.map +1 -1
  83. package/dist/test/enums.test.js +161 -159
  84. package/dist/test/enums.test.js.map +1 -1
  85. package/dist/test/externals.test.js +24 -24
  86. package/dist/test/externals.test.js.map +1 -1
  87. package/dist/test/factories.test.js +75 -33
  88. package/dist/test/factories.test.js.map +1 -1
  89. package/dist/test/functioncallexpressions.test.js +117 -106
  90. package/dist/test/functioncallexpressions.test.js.map +1 -1
  91. package/dist/test/functiondeclaration.test.js +247 -180
  92. package/dist/test/functiondeclaration.test.js.map +1 -1
  93. package/dist/test/imports.test.js +171 -143
  94. package/dist/test/imports.test.js.map +1 -1
  95. package/dist/test/memberexpressions.test.js +582 -453
  96. package/dist/test/memberexpressions.test.js.map +1 -1
  97. package/dist/test/methoddeclaration.test.js +66 -46
  98. package/dist/test/methoddeclaration.test.js.map +1 -1
  99. package/dist/test/namepolicies.test.js +90 -78
  100. package/dist/test/namepolicies.test.js.map +1 -1
  101. package/dist/test/propertydeclaration.test.js +25 -20
  102. package/dist/test/propertydeclaration.test.js.map +1 -1
  103. package/dist/test/pydanticclassdeclarations.test.js +134 -190
  104. package/dist/test/pydanticclassdeclarations.test.js.map +1 -1
  105. package/dist/test/pydocs.test.js +573 -532
  106. package/dist/test/pydocs.test.js.map +1 -1
  107. package/dist/test/references.test.js +31 -28
  108. package/dist/test/references.test.js.map +1 -1
  109. package/dist/test/sourcefiles.test.js +700 -580
  110. package/dist/test/sourcefiles.test.js.map +1 -1
  111. package/dist/test/staticmethoddeclaration.test.js +7 -4
  112. package/dist/test/staticmethoddeclaration.test.js.map +1 -1
  113. package/dist/test/type-checking-imports.test.js +297 -284
  114. package/dist/test/type-checking-imports.test.js.map +1 -1
  115. package/dist/test/typereference.test.js +29 -22
  116. package/dist/test/typereference.test.js.map +1 -1
  117. package/dist/test/uniontypeexpression.test.js +124 -88
  118. package/dist/test/uniontypeexpression.test.js.map +1 -1
  119. package/dist/test/utils.d.ts +10 -17
  120. package/dist/test/utils.d.ts.map +1 -1
  121. package/dist/test/utils.js +32 -74
  122. package/dist/test/utils.js.map +1 -1
  123. package/dist/test/values.test.js +135 -67
  124. package/dist/test/values.test.js.map +1 -1
  125. package/dist/test/variables.test.js +201 -151
  126. package/dist/test/variables.test.js.map +1 -1
  127. package/dist/test/vitest.setup.d.ts +2 -0
  128. package/dist/test/vitest.setup.d.ts.map +1 -0
  129. package/dist/test/vitest.setup.js +2 -0
  130. package/dist/test/vitest.setup.js.map +1 -0
  131. package/dist/tsconfig.tsbuildinfo +1 -1
  132. package/docs/api/components/SourceFile.md +20 -8
  133. package/package.json +2 -2
  134. package/src/components/SourceFile.tsx +6 -1
  135. package/temp/api.json +16 -2
  136. package/test/callsignatures.test.tsx +309 -283
  137. package/test/class-method-declaration.test.tsx +3 -4
  138. package/test/classdeclarations.test.tsx +263 -248
  139. package/test/classinstantiations.test.tsx +115 -109
  140. package/test/constructordeclaration.test.tsx +9 -6
  141. package/test/dataclassdeclarations.test.tsx +243 -361
  142. package/test/decoratorlist.test.tsx +78 -59
  143. package/test/dundermethoddeclaration.test.tsx +3 -4
  144. package/test/enums.test.tsx +65 -81
  145. package/test/externals.test.tsx +25 -25
  146. package/test/factories.test.tsx +64 -22
  147. package/test/functioncallexpressions.test.tsx +123 -109
  148. package/test/functiondeclaration.test.tsx +209 -148
  149. package/test/imports.test.tsx +119 -91
  150. package/test/memberexpressions.test.tsx +265 -207
  151. package/test/methoddeclaration.test.tsx +84 -63
  152. package/test/namepolicies.test.tsx +69 -69
  153. package/test/propertydeclaration.test.tsx +7 -8
  154. package/test/pydanticclassdeclarations.test.tsx +355 -487
  155. package/test/pydocs.test.tsx +531 -579
  156. package/test/references.test.tsx +24 -23
  157. package/test/sourcefiles.test.tsx +527 -492
  158. package/test/staticmethoddeclaration.test.tsx +3 -4
  159. package/test/type-checking-imports.test.tsx +206 -218
  160. package/test/typereference.test.tsx +15 -12
  161. package/test/uniontypeexpression.test.tsx +74 -61
  162. package/test/utils.tsx +26 -110
  163. package/test/values.test.tsx +82 -32
  164. package/test/variables.test.tsx +162 -142
  165. package/test/vitest.setup.ts +1 -0
  166. package/vitest.config.ts +3 -0
@@ -1,251 +1,316 @@
1
1
  import { createComponent as _$createComponent } from "@alloy-js/core/jsx-runtime";
2
- import { code, namekey, refkey } from "@alloy-js/core";
3
- import { d } from "@alloy-js/core/testing";
2
+ import { code, namekey, refkey, render } from "@alloy-js/core";
4
3
  import { describe, expect, it } from "vitest";
5
4
  import * as py from "../src/index.js";
6
5
  import { abcModule } from "../src/index.js";
7
- import { assertFileContents, toSourceText, toSourceTextMultiple } from "./utils.js";
6
+ import { TestOutput, TestOutputDirectory } from "./utils.js";
8
7
  describe("Function Declaration", () => {
9
8
  it("renders multiple decorators above def without blank lines", () => {
10
- const result = toSourceText([_$createComponent(py.FunctionDeclaration, {
11
- name: "f",
12
- decorators: ["@a", "@b", "@c"],
13
- children: "pass"
9
+ expect(_$createComponent(TestOutput, {
10
+ get children() {
11
+ return _$createComponent(py.FunctionDeclaration, {
12
+ name: "f",
13
+ decorators: ["@a", "@b", "@c"],
14
+ children: "pass"
15
+ }, {
16
+ fileName: import.meta.url,
17
+ lineNumber: 11,
18
+ columnNumber: 9
19
+ });
20
+ }
14
21
  }, {
15
22
  fileName: import.meta.url,
16
- lineNumber: 15,
23
+ lineNumber: 10,
17
24
  columnNumber: 7
18
- })]);
19
- expect(result).toRenderTo(d`
25
+ })).toRenderTo(`
20
26
  @a
21
27
  @b
22
28
  @c
23
29
  def f():
24
30
  pass
25
31
 
26
-
27
32
  `);
28
33
  });
29
34
  it("renders a function with no body as 'pass'", () => {
30
- const result = toSourceText([_$createComponent(py.FunctionDeclaration, {
31
- name: "foo"
35
+ expect(_$createComponent(TestOutput, {
36
+ get children() {
37
+ return _$createComponent(py.FunctionDeclaration, {
38
+ name: "foo"
39
+ }, {
40
+ fileName: import.meta.url,
41
+ lineNumber: 30,
42
+ columnNumber: 9
43
+ });
44
+ }
32
45
  }, {
33
46
  fileName: import.meta.url,
34
- lineNumber: 31,
35
- columnNumber: 34
36
- })]);
37
- expect(result).toRenderTo(d`
47
+ lineNumber: 29,
48
+ columnNumber: 7
49
+ })).toRenderTo(`
38
50
  def foo():
39
51
  pass
40
52
 
41
-
42
53
  `);
43
54
  });
44
55
  it("takes a namekey", () => {
45
- const result = toSourceText([_$createComponent(py.FunctionDeclaration, {
46
- get name() {
47
- return namekey("foo-bar");
56
+ expect(_$createComponent(TestOutput, {
57
+ get children() {
58
+ return _$createComponent(py.FunctionDeclaration, {
59
+ get name() {
60
+ return namekey("foo-bar");
61
+ }
62
+ }, {
63
+ fileName: import.meta.url,
64
+ lineNumber: 44,
65
+ columnNumber: 9
66
+ });
48
67
  }
49
68
  }, {
50
69
  fileName: import.meta.url,
51
- lineNumber: 42,
70
+ lineNumber: 43,
52
71
  columnNumber: 7
53
- })]);
54
- expect(result).toRenderTo(d`
72
+ })).toRenderTo(`
55
73
  def foo_bar():
56
74
  pass
57
75
 
58
-
59
76
  `);
60
77
  });
61
78
  it("renders a function with no body as 'pass' with return type", () => {
62
- const result = toSourceText([_$createComponent(py.FunctionDeclaration, {
63
- name: "foo",
64
- returnType: "int"
79
+ expect(_$createComponent(TestOutput, {
80
+ get children() {
81
+ return _$createComponent(py.FunctionDeclaration, {
82
+ name: "foo",
83
+ returnType: "int"
84
+ }, {
85
+ fileName: import.meta.url,
86
+ lineNumber: 58,
87
+ columnNumber: 9
88
+ });
89
+ }
65
90
  }, {
66
91
  fileName: import.meta.url,
67
- lineNumber: 54,
92
+ lineNumber: 57,
68
93
  columnNumber: 7
69
- })]);
70
- expect(result).toRenderTo(d`
94
+ })).toRenderTo(`
71
95
  def foo() -> int:
72
96
  pass
73
97
 
74
-
75
98
  `);
76
99
  });
77
100
  it("renders a function that calls another function", () => {
78
101
  const refkeyFoo = refkey();
79
- const result = toSourceText([_$createComponent(py.StatementList, {
102
+ expect(_$createComponent(TestOutput, {
80
103
  get children() {
81
- return [_$createComponent(py.FunctionDeclaration, {
82
- name: "foo",
83
- returnType: "int",
84
- refkey: refkeyFoo
85
- }, {
86
- fileName: import.meta.url,
87
- lineNumber: 68,
88
- columnNumber: 9
89
- }), _$createComponent(py.FunctionDeclaration, {
90
- name: "bar",
91
- returnType: "int",
104
+ return _$createComponent(py.StatementList, {
92
105
  get children() {
93
- return _$createComponent(py.VariableDeclaration, {
94
- name: "result",
95
- type: "int",
96
- get initializer() {
97
- return _$createComponent(py.FunctionCallExpression, {
98
- target: refkeyFoo,
99
- args: []
106
+ return [_$createComponent(py.FunctionDeclaration, {
107
+ name: "foo",
108
+ returnType: "int",
109
+ refkey: refkeyFoo
110
+ }, {
111
+ fileName: import.meta.url,
112
+ lineNumber: 74,
113
+ columnNumber: 11
114
+ }), _$createComponent(py.FunctionDeclaration, {
115
+ name: "bar",
116
+ returnType: "int",
117
+ get children() {
118
+ return _$createComponent(py.VariableDeclaration, {
119
+ name: "result",
120
+ type: "int",
121
+ get initializer() {
122
+ return _$createComponent(py.FunctionCallExpression, {
123
+ target: refkeyFoo,
124
+ args: []
125
+ }, {
126
+ fileName: import.meta.url,
127
+ lineNumber: 84,
128
+ columnNumber: 17
129
+ });
130
+ }
100
131
  }, {
101
132
  fileName: import.meta.url,
102
- lineNumber: 78,
103
- columnNumber: 15
133
+ lineNumber: 80,
134
+ columnNumber: 13
104
135
  });
105
136
  }
106
137
  }, {
107
138
  fileName: import.meta.url,
108
- lineNumber: 74,
139
+ lineNumber: 79,
109
140
  columnNumber: 11
110
- });
141
+ })];
111
142
  }
112
143
  }, {
113
144
  fileName: import.meta.url,
114
145
  lineNumber: 73,
115
146
  columnNumber: 9
116
- })];
147
+ });
117
148
  }
118
149
  }, {
119
150
  fileName: import.meta.url,
120
- lineNumber: 67,
151
+ lineNumber: 72,
121
152
  columnNumber: 7
122
- })]);
123
- expect(result).toRenderTo(d`
153
+ })).toRenderTo(`
124
154
  def foo() -> int:
125
155
  pass
126
156
 
127
157
  def bar() -> int:
128
158
  result: int = foo()
129
159
 
130
-
131
160
  `);
132
161
  });
133
162
  it("renders a function with parameters", () => {
134
- const result = toSourceText([_$createComponent(py.FunctionDeclaration, {
135
- name: "baz",
136
- parameters: [{
137
- name: "x",
138
- type: "int"
139
- }, {
140
- name: "y",
141
- default: 0
142
- }, {
143
- name: "z",
144
- type: "int",
145
- default: 42
146
- }],
147
- args: true,
148
- kwargs: true,
149
- children: "print(x, y)"
163
+ expect(_$createComponent(TestOutput, {
164
+ get children() {
165
+ return _$createComponent(py.FunctionDeclaration, {
166
+ name: "baz",
167
+ parameters: [{
168
+ name: "x",
169
+ type: "int"
170
+ }, {
171
+ name: "y",
172
+ default: 0
173
+ }, {
174
+ name: "z",
175
+ type: "int",
176
+ default: 42
177
+ }],
178
+ args: true,
179
+ kwargs: true,
180
+ children: "print(x, y)"
181
+ }, {
182
+ fileName: import.meta.url,
183
+ lineNumber: 105,
184
+ columnNumber: 9
185
+ });
186
+ }
150
187
  }, {
151
188
  fileName: import.meta.url,
152
- lineNumber: 97,
189
+ lineNumber: 104,
153
190
  columnNumber: 7
154
- })]);
155
- expect(result).toRenderTo(d`
191
+ })).toRenderTo(`
156
192
  def baz(x: int, y=0, z: int = 42, *args, **kwargs):
157
193
  print(x, y)
158
194
 
159
-
160
195
  `);
161
196
  });
162
197
  it("renders an __init__ function with no body as 'pass'", () => {
163
- const result = toSourceText([_$createComponent(py.ClassDeclaration, {
164
- name: "MyClass",
198
+ expect(_$createComponent(TestOutput, {
165
199
  get children() {
166
- return _$createComponent(py.DunderMethodDeclaration, {
167
- name: "__init__",
168
- parameters: [{
169
- name: "x"
170
- }]
200
+ return _$createComponent(py.ClassDeclaration, {
201
+ name: "MyClass",
202
+ get children() {
203
+ return _$createComponent(py.DunderMethodDeclaration, {
204
+ name: "__init__",
205
+ parameters: [{
206
+ name: "x"
207
+ }]
208
+ }, {
209
+ fileName: import.meta.url,
210
+ lineNumber: 131,
211
+ columnNumber: 11
212
+ });
213
+ }
171
214
  }, {
172
215
  fileName: import.meta.url,
173
- lineNumber: 123,
216
+ lineNumber: 130,
174
217
  columnNumber: 9
175
218
  });
176
219
  }
177
220
  }, {
178
221
  fileName: import.meta.url,
179
- lineNumber: 122,
222
+ lineNumber: 129,
180
223
  columnNumber: 7
181
- })]);
182
- expect(result).toRenderTo(d`
224
+ })).toRenderTo(`
183
225
  class MyClass:
184
226
  def __init__(self, x):
185
227
  pass
186
228
 
187
-
188
-
229
+
189
230
  `);
190
231
  });
191
232
  it("can be an async function", () => {
192
- expect(toSourceText([_$createComponent(py.FunctionDeclaration, {
193
- async: true,
194
- name: "foo"
233
+ expect(_$createComponent(TestOutput, {
234
+ get children() {
235
+ return _$createComponent(py.FunctionDeclaration, {
236
+ async: true,
237
+ name: "foo"
238
+ }, {
239
+ fileName: import.meta.url,
240
+ lineNumber: 151,
241
+ columnNumber: 9
242
+ });
243
+ }
195
244
  }, {
196
245
  fileName: import.meta.url,
197
- lineNumber: 140,
198
- columnNumber: 26
199
- })])).toBe(d`
246
+ lineNumber: 150,
247
+ columnNumber: 7
248
+ })).toRenderTo(`
200
249
  async def foo():
201
250
  pass
202
251
 
203
252
  `);
204
253
  });
205
254
  it("can be an async function with returnType", () => {
206
- expect(toSourceText([_$createComponent(py.FunctionDeclaration, {
207
- async: true,
208
- name: "foo",
209
- returnType: "Foo"
255
+ expect(_$createComponent(TestOutput, {
256
+ get children() {
257
+ return _$createComponent(py.FunctionDeclaration, {
258
+ async: true,
259
+ name: "foo",
260
+ returnType: "Foo"
261
+ }, {
262
+ fileName: import.meta.url,
263
+ lineNumber: 165,
264
+ columnNumber: 9
265
+ });
266
+ }
210
267
  }, {
211
268
  fileName: import.meta.url,
212
- lineNumber: 150,
213
- columnNumber: 9
214
- })])).toBe(d`
269
+ lineNumber: 164,
270
+ columnNumber: 7
271
+ })).toRenderTo(`
215
272
  async def foo() -> Foo:
216
273
  pass
217
274
 
218
275
  `);
219
276
  });
220
277
  it("can be an async function with returnType element with Reference", () => {
221
- expect(toSourceText([_$createComponent(py.StatementList, {
278
+ expect(_$createComponent(TestOutput, {
222
279
  get children() {
223
- return [_$createComponent(py.ClassDeclaration, {
224
- name: "Foo",
225
- get refkey() {
226
- return refkey("Foo");
227
- }
228
- }, {
229
- fileName: import.meta.url,
230
- lineNumber: 163,
231
- columnNumber: 11
232
- }), _$createComponent(py.FunctionDeclaration, {
233
- async: true,
234
- name: "foo",
235
- get returnType() {
236
- return refkey("Foo");
280
+ return _$createComponent(py.StatementList, {
281
+ get children() {
282
+ return [_$createComponent(py.ClassDeclaration, {
283
+ name: "Foo",
284
+ get refkey() {
285
+ return refkey("Foo");
286
+ }
287
+ }, {
288
+ fileName: import.meta.url,
289
+ lineNumber: 180,
290
+ columnNumber: 11
291
+ }), _$createComponent(py.FunctionDeclaration, {
292
+ async: true,
293
+ name: "foo",
294
+ get returnType() {
295
+ return refkey("Foo");
296
+ }
297
+ }, {
298
+ fileName: import.meta.url,
299
+ lineNumber: 181,
300
+ columnNumber: 11
301
+ })];
237
302
  }
238
303
  }, {
239
304
  fileName: import.meta.url,
240
- lineNumber: 164,
241
- columnNumber: 11
242
- })];
305
+ lineNumber: 179,
306
+ columnNumber: 9
307
+ });
243
308
  }
244
309
  }, {
245
310
  fileName: import.meta.url,
246
- lineNumber: 162,
247
- columnNumber: 9
248
- })])).toBe(d`
311
+ lineNumber: 178,
312
+ columnNumber: 7
313
+ })).toRenderTo(`
249
314
  class Foo:
250
315
  pass
251
316
 
@@ -255,34 +320,42 @@ describe("Function Declaration", () => {
255
320
  `);
256
321
  });
257
322
  it("can be an async function with returnType element with list of References", () => {
258
- expect(toSourceText([_$createComponent(py.StatementList, {
323
+ expect(_$createComponent(TestOutput, {
259
324
  get children() {
260
- return [_$createComponent(py.ClassDeclaration, {
261
- name: "Foo",
262
- get refkey() {
263
- return refkey("Foo");
264
- }
265
- }, {
266
- fileName: import.meta.url,
267
- lineNumber: 181,
268
- columnNumber: 11
269
- }), _$createComponent(py.FunctionDeclaration, {
270
- async: true,
271
- name: "foo",
272
- get returnType() {
273
- return code`list[${refkey("Foo")}]`;
325
+ return _$createComponent(py.StatementList, {
326
+ get children() {
327
+ return [_$createComponent(py.ClassDeclaration, {
328
+ name: "Foo",
329
+ get refkey() {
330
+ return refkey("Foo");
331
+ }
332
+ }, {
333
+ fileName: import.meta.url,
334
+ lineNumber: 200,
335
+ columnNumber: 11
336
+ }), _$createComponent(py.FunctionDeclaration, {
337
+ async: true,
338
+ name: "foo",
339
+ get returnType() {
340
+ return code`list[${refkey("Foo")}]`;
341
+ }
342
+ }, {
343
+ fileName: import.meta.url,
344
+ lineNumber: 201,
345
+ columnNumber: 11
346
+ })];
274
347
  }
275
348
  }, {
276
349
  fileName: import.meta.url,
277
- lineNumber: 182,
278
- columnNumber: 11
279
- })];
350
+ lineNumber: 199,
351
+ columnNumber: 9
352
+ });
280
353
  }
281
354
  }, {
282
355
  fileName: import.meta.url,
283
- lineNumber: 180,
284
- columnNumber: 9
285
- })])).toBe(d`
356
+ lineNumber: 198,
357
+ columnNumber: 7
358
+ })).toRenderTo(`
286
359
  class Foo:
287
360
  pass
288
361
 
@@ -306,28 +379,34 @@ describe("Function Declaration", () => {
306
379
  children: "return self"
307
380
  }, {
308
381
  fileName: import.meta.url,
309
- lineNumber: 204,
382
+ lineNumber: 225,
310
383
  columnNumber: 13
311
384
  });
312
385
  }
313
386
  }, {
314
387
  fileName: import.meta.url,
315
- lineNumber: 203,
388
+ lineNumber: 224,
316
389
  columnNumber: 11
317
390
  });
318
391
  }
319
392
  }, {
320
393
  fileName: import.meta.url,
321
- lineNumber: 202,
394
+ lineNumber: 223,
322
395
  columnNumber: 9
323
396
  });
324
397
  }
325
398
  }, {
326
399
  fileName: import.meta.url,
327
- lineNumber: 201,
400
+ lineNumber: 222,
328
401
  columnNumber: 7
329
402
  });
330
- expect(toSourceText([decl])).toBe(d`
403
+ expect(_$createComponent(TestOutput, {
404
+ children: decl
405
+ }, {
406
+ fileName: import.meta.url,
407
+ lineNumber: 237,
408
+ columnNumber: 12
409
+ })).toRenderTo(`
331
410
  class MyClass:
332
411
  async def __aenter__(self) -> MyClass:
333
412
  return self
@@ -349,28 +428,34 @@ describe("Function Declaration", () => {
349
428
  children: "return super().__new__(cls)"
350
429
  }, {
351
430
  fileName: import.meta.url,
352
- lineNumber: 230,
431
+ lineNumber: 253,
353
432
  columnNumber: 13
354
433
  });
355
434
  }
356
435
  }, {
357
436
  fileName: import.meta.url,
358
- lineNumber: 229,
437
+ lineNumber: 252,
359
438
  columnNumber: 11
360
439
  });
361
440
  }
362
441
  }, {
363
442
  fileName: import.meta.url,
364
- lineNumber: 228,
443
+ lineNumber: 251,
365
444
  columnNumber: 9
366
445
  });
367
446
  }
368
447
  }, {
369
448
  fileName: import.meta.url,
370
- lineNumber: 227,
449
+ lineNumber: 250,
371
450
  columnNumber: 7
372
451
  });
373
- expect(toSourceText([decl])).toBe(d`
452
+ expect(_$createComponent(TestOutput, {
453
+ children: decl
454
+ }, {
455
+ fileName: import.meta.url,
456
+ lineNumber: 261,
457
+ columnNumber: 12
458
+ })).toRenderTo(`
374
459
  class MyClass:
375
460
  async def __new__(cls) -> MyClass:
376
461
  return super().__new__(cls)
@@ -389,10 +474,16 @@ describe("Function Declaration", () => {
389
474
  children: "return a + b"
390
475
  }, {
391
476
  fileName: import.meta.url,
392
- lineNumber: 249,
477
+ lineNumber: 274,
393
478
  columnNumber: 7
394
479
  });
395
- expect(toSourceText([decl])).toBe(d`
480
+ expect(_$createComponent(TestOutput, {
481
+ children: decl
482
+ }, {
483
+ fileName: import.meta.url,
484
+ lineNumber: 282,
485
+ columnNumber: 12
486
+ })).toRenderTo(`
396
487
  def foo(a, b):
397
488
  return a + b
398
489
 
@@ -410,10 +501,16 @@ describe("Function Declaration", () => {
410
501
  children: "return a + b"
411
502
  }, {
412
503
  fileName: import.meta.url,
413
- lineNumber: 265,
504
+ lineNumber: 293,
414
505
  columnNumber: 7
415
506
  });
416
- expect(toSourceText([decl])).toBe(d`
507
+ expect(_$createComponent(TestOutput, {
508
+ children: decl
509
+ }, {
510
+ fileName: import.meta.url,
511
+ lineNumber: 302,
512
+ columnNumber: 12
513
+ })).toRenderTo(`
417
514
  def foo[T, U](a, b):
418
515
  return a + b
419
516
 
@@ -437,7 +534,7 @@ describe("Function Declaration", () => {
437
534
  abstract: true
438
535
  }, {
439
536
  fileName: import.meta.url,
440
- lineNumber: 286,
537
+ lineNumber: 317,
441
538
  columnNumber: 13
442
539
  }), _$createComponent(py.ClassMethodDeclaration, {
443
540
  name: "classdef",
@@ -445,7 +542,7 @@ describe("Function Declaration", () => {
445
542
  abstract: true
446
543
  }, {
447
544
  fileName: import.meta.url,
448
- lineNumber: 291,
545
+ lineNumber: 322,
449
546
  columnNumber: 13
450
547
  }), _$createComponent(py.StaticMethodDeclaration, {
451
548
  name: "staticdef",
@@ -453,30 +550,35 @@ describe("Function Declaration", () => {
453
550
  abstract: true
454
551
  }, {
455
552
  fileName: import.meta.url,
456
- lineNumber: 296,
553
+ lineNumber: 327,
457
554
  columnNumber: 13
458
555
  })];
459
556
  }
460
557
  }, {
461
558
  fileName: import.meta.url,
462
- lineNumber: 285,
559
+ lineNumber: 316,
463
560
  columnNumber: 11
464
561
  });
465
562
  }
466
563
  }, {
467
564
  fileName: import.meta.url,
468
- lineNumber: 284,
565
+ lineNumber: 315,
469
566
  columnNumber: 9
470
567
  });
471
568
  }
472
569
  }, {
473
570
  fileName: import.meta.url,
474
- lineNumber: 283,
571
+ lineNumber: 314,
475
572
  columnNumber: 7
476
573
  });
477
- expect(toSourceText([decl], {
478
- externals: [abcModule]
479
- })).toBe(d`
574
+ expect(_$createComponent(TestOutput, {
575
+ externals: [abcModule],
576
+ children: decl
577
+ }, {
578
+ fileName: import.meta.url,
579
+ lineNumber: 337,
580
+ columnNumber: 12
581
+ })).toRenderTo(`
480
582
  from abc import abstractmethod
481
583
 
482
584
 
@@ -514,7 +616,7 @@ describe("Function Declaration", () => {
514
616
  children: "self.attribute = \"value\""
515
617
  }, {
516
618
  fileName: import.meta.url,
517
- lineNumber: 333,
619
+ lineNumber: 367,
518
620
  columnNumber: 11
519
621
  }), _$createComponent(py.DunderMethodDeclaration, {
520
622
  name: "__repr__",
@@ -522,22 +624,28 @@ describe("Function Declaration", () => {
522
624
  children: "return \"MyClass\""
523
625
  }, {
524
626
  fileName: import.meta.url,
525
- lineNumber: 336,
627
+ lineNumber: 370,
526
628
  columnNumber: 11
527
629
  })];
528
630
  }
529
631
  }, {
530
632
  fileName: import.meta.url,
531
- lineNumber: 332,
633
+ lineNumber: 366,
532
634
  columnNumber: 9
533
635
  });
534
636
  }
535
637
  }, {
536
638
  fileName: import.meta.url,
537
- lineNumber: 331,
639
+ lineNumber: 365,
538
640
  columnNumber: 7
539
641
  });
540
- expect(toSourceText([decl])).toBe(d`
642
+ expect(_$createComponent(TestOutput, {
643
+ children: decl
644
+ }, {
645
+ fileName: import.meta.url,
646
+ lineNumber: 377,
647
+ columnNumber: 12
648
+ })).toRenderTo(`
541
649
  class MyClass:
542
650
  def __init__(self, x: int):
543
651
  self.attribute = "value"
@@ -560,22 +668,28 @@ describe("Function Declaration", () => {
560
668
  children: "pass"
561
669
  }, {
562
670
  fileName: import.meta.url,
563
- lineNumber: 359,
671
+ lineNumber: 395,
564
672
  columnNumber: 11
565
673
  });
566
674
  }
567
675
  }, {
568
676
  fileName: import.meta.url,
569
- lineNumber: 358,
677
+ lineNumber: 394,
570
678
  columnNumber: 9
571
679
  });
572
680
  }
573
681
  }, {
574
682
  fileName: import.meta.url,
575
- lineNumber: 357,
683
+ lineNumber: 393,
576
684
  columnNumber: 7
577
685
  });
578
- expect(toSourceText([decl])).toBe(d`
686
+ expect(_$createComponent(TestOutput, {
687
+ children: decl
688
+ }, {
689
+ fileName: import.meta.url,
690
+ lineNumber: 402,
691
+ columnNumber: 12
692
+ })).toRenderTo(`
579
693
  class MyClass:
580
694
  def __new__(cls, *args, **kwargs):
581
695
  pass
@@ -616,7 +730,7 @@ describe("Function Declaration", () => {
616
730
  children: "return z * 2"
617
731
  }, {
618
732
  fileName: import.meta.url,
619
- lineNumber: 393,
733
+ lineNumber: 431,
620
734
  columnNumber: 11
621
735
  }), "return", " ", _$createComponent(py.FunctionCallExpression, {
622
736
  target: foobarRef,
@@ -625,19 +739,19 @@ describe("Function Declaration", () => {
625
739
  jsValue: 2
626
740
  }, {
627
741
  fileName: import.meta.url,
628
- lineNumber: 403,
742
+ lineNumber: 441,
629
743
  columnNumber: 20
630
744
  })];
631
745
  }
632
746
  }, {
633
747
  fileName: import.meta.url,
634
- lineNumber: 401,
748
+ lineNumber: 439,
635
749
  columnNumber: 11
636
750
  })];
637
751
  }
638
752
  }, {
639
753
  fileName: import.meta.url,
640
- lineNumber: 388,
754
+ lineNumber: 426,
641
755
  columnNumber: 9
642
756
  }), "return", " ", _$createComponent(py.FunctionCallExpression, {
643
757
  target: barRef,
@@ -646,22 +760,28 @@ describe("Function Declaration", () => {
646
760
  jsValue: 3
647
761
  }, {
648
762
  fileName: import.meta.url,
649
- lineNumber: 409,
763
+ lineNumber: 447,
650
764
  columnNumber: 18
651
765
  })];
652
766
  }
653
767
  }, {
654
768
  fileName: import.meta.url,
655
- lineNumber: 407,
769
+ lineNumber: 445,
656
770
  columnNumber: 9
657
771
  })];
658
772
  }
659
773
  }, {
660
774
  fileName: import.meta.url,
661
- lineNumber: 383,
775
+ lineNumber: 421,
662
776
  columnNumber: 7
663
777
  });
664
- expect(toSourceText([decl])).toBe(d`
778
+ expect(_$createComponent(TestOutput, {
779
+ children: decl
780
+ }, {
781
+ fileName: import.meta.url,
782
+ lineNumber: 452,
783
+ columnNumber: 12
784
+ })).toRenderTo(`
665
785
  def foo(x: int):
666
786
  def bar(y: int):
667
787
  def foobar(z: int):
@@ -672,83 +792,90 @@ describe("Function Declaration", () => {
672
792
  `);
673
793
  });
674
794
  it("renders complex typing structure", () => {
675
- const res = toSourceTextMultiple([_$createComponent(py.SourceFile, {
676
- path: "mod1.py",
677
- get children() {
678
- return _$createComponent(py.ClassDeclaration, {
679
- name: "Foo",
680
- get refkey() {
681
- return refkey("Foo");
682
- }
683
- }, {
684
- fileName: import.meta.url,
685
- lineNumber: 427,
686
- columnNumber: 9
687
- });
688
- }
689
- }, {
690
- fileName: import.meta.url,
691
- lineNumber: 426,
692
- columnNumber: 7
693
- }), _$createComponent(py.SourceFile, {
694
- path: "mod2.py",
795
+ expect(_$createComponent(TestOutputDirectory, {
695
796
  get children() {
696
- return [_$createComponent(py.ClassDeclaration, {
697
- name: "A",
698
- get refkey() {
699
- return refkey("A");
797
+ return [_$createComponent(py.SourceFile, {
798
+ path: "mod1.py",
799
+ get children() {
800
+ return _$createComponent(py.ClassDeclaration, {
801
+ name: "Foo",
802
+ get refkey() {
803
+ return refkey("Foo");
804
+ }
805
+ }, {
806
+ fileName: import.meta.url,
807
+ lineNumber: 469,
808
+ columnNumber: 11
809
+ });
700
810
  }
701
811
  }, {
702
812
  fileName: import.meta.url,
703
- lineNumber: 430,
813
+ lineNumber: 468,
704
814
  columnNumber: 9
705
- }), _$createComponent(py.ClassDeclaration, {
706
- name: "B",
707
- get refkey() {
708
- return refkey("B");
815
+ }), _$createComponent(py.SourceFile, {
816
+ path: "mod2.py",
817
+ get children() {
818
+ return [_$createComponent(py.ClassDeclaration, {
819
+ name: "A",
820
+ get refkey() {
821
+ return refkey("A");
822
+ }
823
+ }, {
824
+ fileName: import.meta.url,
825
+ lineNumber: 472,
826
+ columnNumber: 11
827
+ }), _$createComponent(py.ClassDeclaration, {
828
+ name: "B",
829
+ get refkey() {
830
+ return refkey("B");
831
+ }
832
+ }, {
833
+ fileName: import.meta.url,
834
+ lineNumber: 473,
835
+ columnNumber: 11
836
+ })];
709
837
  }
710
838
  }, {
711
839
  fileName: import.meta.url,
712
- lineNumber: 431,
840
+ lineNumber: 471,
713
841
  columnNumber: 9
714
- })];
715
- }
716
- }, {
717
- fileName: import.meta.url,
718
- lineNumber: 429,
719
- columnNumber: 7
720
- }), _$createComponent(py.SourceFile, {
721
- path: "usage.py",
722
- get children() {
723
- return _$createComponent(py.FunctionDeclaration, {
724
- async: true,
725
- name: "foo",
726
- get parameters() {
727
- return [{
728
- name: "x",
729
- type: refkey("A")
842
+ }), _$createComponent(py.SourceFile, {
843
+ path: "usage.py",
844
+ get children() {
845
+ return _$createComponent(py.FunctionDeclaration, {
846
+ async: true,
847
+ name: "foo",
848
+ get parameters() {
849
+ return [{
850
+ name: "x",
851
+ type: refkey("A")
852
+ }, {
853
+ name: "y",
854
+ type: refkey("B")
855
+ }];
856
+ },
857
+ args: true,
858
+ kwargs: true,
859
+ get returnType() {
860
+ return refkey("Foo");
861
+ }
730
862
  }, {
731
- name: "y",
732
- type: refkey("B")
733
- }];
734
- },
735
- args: true,
736
- kwargs: true,
737
- get returnType() {
738
- return refkey("Foo");
863
+ fileName: import.meta.url,
864
+ lineNumber: 476,
865
+ columnNumber: 11
866
+ });
739
867
  }
740
868
  }, {
741
869
  fileName: import.meta.url,
742
- lineNumber: 434,
870
+ lineNumber: 475,
743
871
  columnNumber: 9
744
- });
872
+ })];
745
873
  }
746
874
  }, {
747
875
  fileName: import.meta.url,
748
- lineNumber: 433,
876
+ lineNumber: 467,
749
877
  columnNumber: 7
750
- })]);
751
- assertFileContents(res, {
878
+ })).toRenderTo({
752
879
  "mod1.py": `
753
880
  class Foo:
754
881
  pass
@@ -780,57 +907,97 @@ describe("Function Declaration", () => {
780
907
  });
781
908
  it("throws error when PropertyDeclaration is used outside of a class", () => {
782
909
  expect(() => {
783
- toSourceText([_$createComponent(py.PropertyDeclaration, {
784
- name: "x"
910
+ render(_$createComponent(TestOutput, {
911
+ get children() {
912
+ return _$createComponent(py.PropertyDeclaration, {
913
+ name: "x"
914
+ }, {
915
+ fileName: import.meta.url,
916
+ lineNumber: 530,
917
+ columnNumber: 11
918
+ });
919
+ }
785
920
  }, {
786
921
  fileName: import.meta.url,
787
- lineNumber: 487,
788
- columnNumber: 21
789
- })]);
922
+ lineNumber: 529,
923
+ columnNumber: 9
924
+ }));
790
925
  }).toThrow('Method "x" must be declared inside a class (member scope)');
791
926
  });
792
927
  it("throws error when MethodDeclaration is used outside of a class", () => {
793
928
  expect(() => {
794
- toSourceText([_$createComponent(py.MethodDeclaration, {
795
- name: "my_method"
929
+ render(_$createComponent(TestOutput, {
930
+ get children() {
931
+ return _$createComponent(py.MethodDeclaration, {
932
+ name: "my_method"
933
+ }, {
934
+ fileName: import.meta.url,
935
+ lineNumber: 540,
936
+ columnNumber: 11
937
+ });
938
+ }
796
939
  }, {
797
940
  fileName: import.meta.url,
798
- lineNumber: 493,
799
- columnNumber: 21
800
- })]);
941
+ lineNumber: 539,
942
+ columnNumber: 9
943
+ }));
801
944
  }).toThrow('Method "my_method" must be declared inside a class (member scope)');
802
945
  });
803
946
  it("throws error when ClassMethodDeclaration is used outside of a class", () => {
804
947
  expect(() => {
805
- toSourceText([_$createComponent(py.ClassMethodDeclaration, {
806
- name: "my_class_method"
948
+ render(_$createComponent(TestOutput, {
949
+ get children() {
950
+ return _$createComponent(py.ClassMethodDeclaration, {
951
+ name: "my_class_method"
952
+ }, {
953
+ fileName: import.meta.url,
954
+ lineNumber: 552,
955
+ columnNumber: 11
956
+ });
957
+ }
807
958
  }, {
808
959
  fileName: import.meta.url,
809
- lineNumber: 501,
810
- columnNumber: 21
811
- })]);
960
+ lineNumber: 551,
961
+ columnNumber: 9
962
+ }));
812
963
  }).toThrow('Method "my_class_method" must be declared inside a class (member scope)');
813
964
  });
814
965
  it("throws error when StaticMethodDeclaration is used outside of a class", () => {
815
966
  expect(() => {
816
- toSourceText([_$createComponent(py.StaticMethodDeclaration, {
817
- name: "my_static_method"
967
+ render(_$createComponent(TestOutput, {
968
+ get children() {
969
+ return _$createComponent(py.StaticMethodDeclaration, {
970
+ name: "my_static_method"
971
+ }, {
972
+ fileName: import.meta.url,
973
+ lineNumber: 564,
974
+ columnNumber: 11
975
+ });
976
+ }
818
977
  }, {
819
978
  fileName: import.meta.url,
820
- lineNumber: 509,
821
- columnNumber: 21
822
- })]);
979
+ lineNumber: 563,
980
+ columnNumber: 9
981
+ }));
823
982
  }).toThrow('Method "my_static_method" must be declared inside a class (member scope)');
824
983
  });
825
984
  it("throws error when DunderMethodDeclaration is used outside of a class", () => {
826
985
  expect(() => {
827
- toSourceText([_$createComponent(py.DunderMethodDeclaration, {
828
- name: "__init__"
986
+ render(_$createComponent(TestOutput, {
987
+ get children() {
988
+ return _$createComponent(py.DunderMethodDeclaration, {
989
+ name: "__init__"
990
+ }, {
991
+ fileName: import.meta.url,
992
+ lineNumber: 576,
993
+ columnNumber: 11
994
+ });
995
+ }
829
996
  }, {
830
997
  fileName: import.meta.url,
831
- lineNumber: 517,
832
- columnNumber: 21
833
- })]);
998
+ lineNumber: 575,
999
+ columnNumber: 9
1000
+ }));
834
1001
  }).toThrow('Method "__init__" must be declared inside a class (member scope)');
835
1002
  });
836
1003
  });