@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,5 +1,4 @@
1
- import { code, memberRefkey, refkey } from "@alloy-js/core";
2
- import { d } from "@alloy-js/core/testing";
1
+ import { code, memberRefkey, refkey, render } from "@alloy-js/core";
3
2
  import { describe, expect, it } from "vitest";
4
3
  import * as py from "../src/index.js";
5
4
  import {
@@ -9,43 +8,43 @@ import {
9
8
  SourceFile,
10
9
  VariableDeclaration,
11
10
  } from "../src/index.js";
12
- import {
13
- assertFileContents,
14
- toSourceText,
15
- toSourceTextMultiple,
16
- } from "./utils.js";
11
+ import { TestOutput, TestOutputDirectory } from "./utils.js";
17
12
 
18
13
  it("renders basic member expression with dot notation", () => {
19
14
  expect(
20
- toSourceText([
15
+ <TestOutput>
21
16
  <py.MemberExpression>
22
17
  <py.MemberExpression.Part id="obj" />
23
18
  <py.MemberExpression.Part id="property" />
24
- </py.MemberExpression>,
25
- ]),
26
- ).toBe(d`
19
+ </py.MemberExpression>
20
+ </TestOutput>,
21
+ ).toRenderTo(
22
+ `
27
23
  obj.property
28
- `);
24
+ `,
25
+ );
29
26
  });
30
27
 
31
28
  it("renders basic member expression with key", () => {
32
29
  expect(
33
- toSourceText([
30
+ <TestOutput>
34
31
  <py.MemberExpression>
35
32
  <py.MemberExpression.Part id="arr" />
36
33
  <py.MemberExpression.Part key={12345} />
37
34
  <py.MemberExpression.Part id="foo-bar" />
38
- </py.MemberExpression>,
39
- ]),
40
- ).toBe(d`
35
+ </py.MemberExpression>
36
+ </TestOutput>,
37
+ ).toRenderTo(
38
+ `
41
39
  arr[12345].foo-bar
42
- `);
40
+ `,
41
+ );
43
42
  });
44
43
 
45
44
  it("renders basic member expression with key with reference", () => {
46
45
  const rk1 = refkey();
47
46
  expect(
48
- toSourceText([
47
+ <TestOutput>
49
48
  <py.StatementList>
50
49
  <py.VariableDeclaration name="test1" refkey={rk1} initializer={1} />
51
50
  <py.MemberExpression>
@@ -53,33 +52,37 @@ it("renders basic member expression with key with reference", () => {
53
52
  <py.MemberExpression.Part key={rk1} />
54
53
  <py.MemberExpression.Part id="foo-bar" />
55
54
  </py.MemberExpression>
56
- </py.StatementList>,
57
- ]),
58
- ).toBe(d`
55
+ </py.StatementList>
56
+ </TestOutput>,
57
+ ).toRenderTo(
58
+ `
59
59
  test1 = 1
60
60
  arr[test1].foo-bar
61
- `);
61
+ `,
62
+ );
62
63
  });
63
64
 
64
65
  it("renders basic member expression with keys", () => {
65
66
  expect(
66
- toSourceText([
67
+ <TestOutput>
67
68
  <py.MemberExpression>
68
69
  <py.MemberExpression.Part id="arr" />
69
70
  <py.MemberExpression.Part keys={[1, 2]} />
70
71
  <py.MemberExpression.Part id="foo-bar" />
71
- </py.MemberExpression>,
72
- ]),
73
- ).toBe(d`
72
+ </py.MemberExpression>
73
+ </TestOutput>,
74
+ ).toRenderTo(
75
+ `
74
76
  arr[1, 2].foo-bar
75
- `);
77
+ `,
78
+ );
76
79
  });
77
80
 
78
81
  it("renders basic member expression with keys with references", () => {
79
82
  const rk1 = refkey();
80
83
  const rk2 = refkey();
81
84
  expect(
82
- toSourceText([
85
+ <TestOutput>
83
86
  <py.StatementList>
84
87
  <py.VariableDeclaration name="test1" refkey={rk1} initializer={1} />
85
88
  <py.VariableDeclaration name="test2" refkey={rk2} initializer={2} />
@@ -88,27 +91,31 @@ it("renders basic member expression with keys with references", () => {
88
91
  <py.MemberExpression.Part keys={[rk1, rk2]} />
89
92
  <py.MemberExpression.Part id="foo-bar" />
90
93
  </py.MemberExpression>
91
- </py.StatementList>,
92
- ]),
93
- ).toBe(d`
94
+ </py.StatementList>
95
+ </TestOutput>,
96
+ ).toRenderTo(
97
+ `
94
98
  test1 = 1
95
99
  test2 = 2
96
100
  arr[test1, test2].foo-bar
97
- `);
101
+ `,
102
+ );
98
103
  });
99
104
 
100
105
  it("renders basic member expression with slice - 1", () => {
101
106
  expect(
102
- toSourceText([
107
+ <TestOutput>
103
108
  <py.MemberExpression>
104
109
  <py.MemberExpression.Part id="arr" />
105
110
  <py.MemberExpression.Part slice={{ start: 1, stop: 3, step: 2 }} />
106
111
  <py.MemberExpression.Part id="foo-bar" />
107
- </py.MemberExpression>,
108
- ]),
109
- ).toBe(d`
112
+ </py.MemberExpression>
113
+ </TestOutput>,
114
+ ).toRenderTo(
115
+ `
110
116
  arr[1:3:2].foo-bar
111
- `);
117
+ `,
118
+ );
112
119
  });
113
120
 
114
121
  it("renders basic member expression with slice - 1 with references", () => {
@@ -116,7 +123,7 @@ it("renders basic member expression with slice - 1 with references", () => {
116
123
  const rk2 = refkey();
117
124
  const rk3 = refkey();
118
125
  expect(
119
- toSourceText([
126
+ <TestOutput>
120
127
  <py.StatementList>
121
128
  <py.VariableDeclaration name="test1" refkey={rk1} initializer={1} />
122
129
  <py.VariableDeclaration name="test2" refkey={rk2} initializer={3} />
@@ -128,76 +135,86 @@ it("renders basic member expression with slice - 1 with references", () => {
128
135
  />
129
136
  <py.MemberExpression.Part id="foo-bar" />
130
137
  </py.MemberExpression>
131
- </py.StatementList>,
132
- ]),
133
- ).toBe(d`
138
+ </py.StatementList>
139
+ </TestOutput>,
140
+ ).toRenderTo(
141
+ `
134
142
  test1 = 1
135
143
  test2 = 3
136
144
  test3 = 2
137
145
  arr[test1:test2:test3].foo-bar
138
- `);
146
+ `,
147
+ );
139
148
  });
140
149
 
141
150
  it("renders basic member expression with slice - 2", () => {
142
151
  expect(
143
- toSourceText([
152
+ <TestOutput>
144
153
  <py.MemberExpression>
145
154
  <py.MemberExpression.Part id="arr" />
146
155
  <py.MemberExpression.Part slice={{ stop: 3 }} />
147
156
  <py.MemberExpression.Part id="foo-bar" />
148
- </py.MemberExpression>,
149
- ]),
150
- ).toBe(d`
157
+ </py.MemberExpression>
158
+ </TestOutput>,
159
+ ).toRenderTo(
160
+ `
151
161
  arr[:3].foo-bar
152
- `);
162
+ `,
163
+ );
153
164
  });
154
165
 
155
166
  it("renders basic member expression with slice - 3", () => {
156
167
  expect(
157
- toSourceText([
168
+ <TestOutput>
158
169
  <py.MemberExpression>
159
170
  <py.MemberExpression.Part id="arr" />
160
171
  <py.MemberExpression.Part slice={{ step: 2 }} />
161
172
  <py.MemberExpression.Part id="foo-bar" />
162
- </py.MemberExpression>,
163
- ]),
164
- ).toBe(d`
173
+ </py.MemberExpression>
174
+ </TestOutput>,
175
+ ).toRenderTo(
176
+ `
165
177
  arr[::2].foo-bar
166
- `);
178
+ `,
179
+ );
167
180
  });
168
181
 
169
182
  it("renders basic member expression with slice - 4", () => {
170
183
  expect(
171
- toSourceText([
184
+ <TestOutput>
172
185
  <py.MemberExpression>
173
186
  <py.MemberExpression.Part id="arr" />
174
187
  <py.MemberExpression.Part slice={{ start: 1 }} />
175
188
  <py.MemberExpression.Part id="foo-bar" />
176
- </py.MemberExpression>,
177
- ]),
178
- ).toBe(d`
189
+ </py.MemberExpression>
190
+ </TestOutput>,
191
+ ).toRenderTo(
192
+ `
179
193
  arr[1:].foo-bar
180
- `);
194
+ `,
195
+ );
181
196
  });
182
197
 
183
198
  it("renders basic member expression with slice - 5", () => {
184
199
  expect(
185
- toSourceText([
200
+ <TestOutput>
186
201
  <py.MemberExpression>
187
202
  <py.MemberExpression.Part id="arr" />
188
203
  <py.MemberExpression.Part slice={{ start: 1, step: 2 }} />
189
204
  <py.MemberExpression.Part id="foo-bar" />
190
- </py.MemberExpression>,
191
- ]),
192
- ).toBe(d`
205
+ </py.MemberExpression>
206
+ </TestOutput>,
207
+ ).toRenderTo(
208
+ `
193
209
  arr[1::2].foo-bar
194
- `);
210
+ `,
211
+ );
195
212
  });
196
213
 
197
214
  it("renders basic member expression with an expression index - 1", () => {
198
215
  const xRefkey = refkey();
199
216
  expect(
200
- toSourceText([
217
+ <TestOutput>
201
218
  <py.StatementList>
202
219
  <py.VariableDeclaration name="x" initializer={1} refkey={xRefkey} />
203
220
  <py.MemberExpression>
@@ -205,79 +222,91 @@ it("renders basic member expression with an expression index - 1", () => {
205
222
  <py.MemberExpression.Part key={code`${xRefkey} + 1`} />
206
223
  <py.MemberExpression.Part id="foo-bar" />
207
224
  </py.MemberExpression>
208
- </py.StatementList>,
209
- ]),
210
- ).toBe(d`
225
+ </py.StatementList>
226
+ </TestOutput>,
227
+ ).toRenderTo(
228
+ `
211
229
  x = 1
212
230
  arr[x + 1].foo-bar
213
- `);
231
+ `,
232
+ );
214
233
  });
215
234
 
216
235
  it("renders basic member expression with an expression index - 2", () => {
217
236
  expect(
218
- toSourceText([
237
+ <TestOutput>
219
238
  <py.StatementList>
220
239
  <py.MemberExpression>
221
240
  <py.MemberExpression.Part id="arr" />
222
241
  <py.MemberExpression.Part key={code`"foo" + 1`} />
223
242
  <py.MemberExpression.Part id="foo-bar" />
224
243
  </py.MemberExpression>
225
- </py.StatementList>,
226
- ]),
227
- ).toBe(d`
244
+ </py.StatementList>
245
+ </TestOutput>,
246
+ ).toRenderTo(
247
+ `
228
248
  arr["foo" + 1].foo-bar
229
- `);
249
+ `,
250
+ );
230
251
  });
231
252
 
232
253
  it("throws an error for invalid identifiers with quotes", () => {
233
254
  expect(() =>
234
- toSourceText([
235
- <py.MemberExpression>
236
- <py.MemberExpression.Part id="obj" />
237
- <py.MemberExpression.Part id={`property-"name"`} />
238
- </py.MemberExpression>,
239
- ]),
255
+ render(
256
+ <TestOutput>
257
+ <py.MemberExpression>
258
+ <py.MemberExpression.Part id="obj" />
259
+ <py.MemberExpression.Part id={`property-"name"`} />
260
+ </py.MemberExpression>
261
+ </TestOutput>,
262
+ ),
240
263
  ).toThrowError(/Invalid identifier: property-"name"/);
241
264
  });
242
265
 
243
266
  it("supports multiple levels of nesting", () => {
244
267
  expect(
245
- toSourceText([
268
+ <TestOutput>
246
269
  <py.MemberExpression>
247
270
  <py.MemberExpression.Part id="a" />
248
271
  <py.MemberExpression.Part id="b" />
249
272
  <py.MemberExpression.Part id="c" />
250
273
  <py.MemberExpression.Part id="d" />
251
- </py.MemberExpression>,
252
- ]),
253
- ).toBe(d`
274
+ </py.MemberExpression>
275
+ </TestOutput>,
276
+ ).toRenderTo(
277
+ `
254
278
  a.b.c.d
255
- `);
279
+ `,
280
+ );
256
281
  });
257
282
 
258
283
  it("handles a mix of dot and bracket notation", () => {
259
284
  expect(
260
- toSourceText([
285
+ <TestOutput>
261
286
  <py.MemberExpression>
262
287
  <py.MemberExpression.Part id="obj" />
263
288
  <py.MemberExpression.Part id="normalProp" />
264
289
  <py.MemberExpression.Part key={"special-prop"} />
265
290
  <py.MemberExpression.Part key={"123"} />
266
- </py.MemberExpression>,
267
- ]),
268
- ).toBe(d`
291
+ </py.MemberExpression>
292
+ </TestOutput>,
293
+ ).toRenderTo(
294
+ `
269
295
  obj.normalProp["special-prop"]["123"]
270
- `);
296
+ `,
297
+ );
271
298
  });
272
299
 
273
300
  it("throws an error when providing conflicting part props", () => {
274
301
  expect(() =>
275
- toSourceText([
276
- <py.MemberExpression>
277
- <py.MemberExpression.Part id="obj" />
278
- <py.MemberExpression.Part id="property" args={[1, 2]} />
279
- </py.MemberExpression>,
280
- ]),
302
+ render(
303
+ <TestOutput>
304
+ <py.MemberExpression>
305
+ <py.MemberExpression.Part id="obj" />
306
+ <py.MemberExpression.Part id="property" args={[1, 2]} />
307
+ </py.MemberExpression>
308
+ </TestOutput>,
309
+ ),
281
310
  ).toThrowError(
282
311
  `Only one of args, id can be used for a MemberExpression part at a time`,
283
312
  );
@@ -285,29 +314,33 @@ it("throws an error when providing conflicting part props", () => {
285
314
 
286
315
  it("throws an error when providing an empty slice", () => {
287
316
  expect(() =>
288
- toSourceText([
289
- <py.MemberExpression>
290
- <py.MemberExpression.Part id="obj" />
291
- <py.MemberExpression.Part slice={{}} />
292
- </py.MemberExpression>,
293
- ]),
317
+ render(
318
+ <TestOutput>
319
+ <py.MemberExpression>
320
+ <py.MemberExpression.Part id="obj" />
321
+ <py.MemberExpression.Part slice={{}} />
322
+ </py.MemberExpression>
323
+ </TestOutput>,
324
+ ),
294
325
  ).toThrowError(`MemberExpression.Part: slice object cannot be empty`);
295
326
  });
296
327
 
297
328
  it("throws an error when providing an empty array", () => {
298
329
  expect(() =>
299
- toSourceText([
300
- <py.MemberExpression>
301
- <py.MemberExpression.Part id="obj" />
302
- <py.MemberExpression.Part keys={[]} />
303
- </py.MemberExpression>,
304
- ]),
330
+ render(
331
+ <TestOutput>
332
+ <py.MemberExpression>
333
+ <py.MemberExpression.Part id="obj" />
334
+ <py.MemberExpression.Part keys={[]} />
335
+ </py.MemberExpression>
336
+ </TestOutput>,
337
+ ),
305
338
  ).toThrowError(`MemberExpression.Part: keys array cannot be empty`);
306
339
  });
307
340
 
308
341
  it("takes children for the id part", () => {
309
342
  expect(
310
- toSourceText([
343
+ <TestOutput>
311
344
  <py.StatementList>
312
345
  <py.MemberExpression>
313
346
  <py.MemberExpression.Part id="child1" />
@@ -322,12 +355,14 @@ it("takes children for the id part", () => {
322
355
  <py.MemberExpression.Part key={code`"foo" + 1`} />
323
356
  <py.MemberExpression.Part args />
324
357
  </py.MemberExpression>
325
- </py.StatementList>,
326
- ]),
327
- ).toBe(d`
358
+ </py.StatementList>
359
+ </TestOutput>,
360
+ ).toRenderTo(
361
+ `
328
362
  child1["child1"]
329
363
  child1["child2"]()["child3"]()["foo" + 1]()
330
- `);
364
+ `,
365
+ );
331
366
  });
332
367
 
333
368
  describe("with refkeys", () => {
@@ -335,7 +370,7 @@ describe("with refkeys", () => {
335
370
  const rk1 = refkey();
336
371
  const rk2 = refkey();
337
372
  expect(
338
- toSourceText([
373
+ <TestOutput>
339
374
  <py.StatementList>
340
375
  <py.VariableDeclaration name="test1" refkey={rk1} initializer={1} />
341
376
  <py.VariableDeclaration name="test1" refkey={rk2} initializer={2} />
@@ -343,13 +378,15 @@ describe("with refkeys", () => {
343
378
  <py.MemberExpression.Part refkey={rk1} />
344
379
  <py.MemberExpression.Part refkey={rk2} />
345
380
  </py.MemberExpression>
346
- </py.StatementList>,
347
- ]),
348
- ).toBe(d`
381
+ </py.StatementList>
382
+ </TestOutput>,
383
+ ).toRenderTo(
384
+ `
349
385
  test1 = 1
350
386
  test1_2_test = 2
351
387
  test1.test1_2_test
352
- `);
388
+ `,
389
+ );
353
390
  });
354
391
 
355
392
  it("Correctly resolves member expressions from 2 different classes", () => {
@@ -406,7 +443,8 @@ describe("with refkeys", () => {
406
443
  </py.StatementList>
407
444
  );
408
445
 
409
- expect(toSourceText([template])).toBe(d`
446
+ expect(<TestOutput>{template}</TestOutput>).toRenderTo(
447
+ `
410
448
  class Model1:
411
449
  foo: str
412
450
 
@@ -417,7 +455,8 @@ describe("with refkeys", () => {
417
455
  model2_instance: Model2 = Model2()
418
456
  model1_instance.foo
419
457
  model2_instance.bar
420
- `);
458
+ `,
459
+ );
421
460
  });
422
461
 
423
462
  it("handles optional parameters correctly", () => {
@@ -460,7 +499,8 @@ describe("with refkeys", () => {
460
499
  </py.StatementList>
461
500
  );
462
501
 
463
- expect(toSourceText([template])).toBe(d`
502
+ expect(<TestOutput>{template}</TestOutput>).toRenderTo(
503
+ `
464
504
  class Model:
465
505
  bar: str
466
506
 
@@ -468,7 +508,8 @@ describe("with refkeys", () => {
468
508
  message = foo.bar
469
509
  print(message)
470
510
 
471
- `);
511
+ `,
512
+ );
472
513
  });
473
514
 
474
515
  it("handles class member correctly", () => {
@@ -479,7 +520,7 @@ describe("with refkeys", () => {
479
520
  const classMemberRefkey = refkey();
480
521
  const instanceRefkey = refkey();
481
522
  expect(
482
- toSourceText([
523
+ <TestOutput>
483
524
  <py.StatementList>
484
525
  <ClassDeclaration name="Bar" refkey={interfaceRefkey}>
485
526
  <VariableDeclaration
@@ -518,9 +559,10 @@ describe("with refkeys", () => {
518
559
  <py.MemberExpression.Part refkey={classMethodRefkey} />
519
560
  <py.MemberExpression.Part args={[]} />
520
561
  </py.MemberExpression>
521
- </py.StatementList>,
522
- ]),
523
- ).toBe(d`
562
+ </py.StatementList>
563
+ </TestOutput>,
564
+ ).toRenderTo(
565
+ `
524
566
  class Bar:
525
567
  prop1: str
526
568
 
@@ -533,14 +575,15 @@ describe("with refkeys", () => {
533
575
  inst = Foo()
534
576
  inst.test1.prop1
535
577
  inst.test_method()
536
- `);
578
+ `,
579
+ );
537
580
  });
538
581
 
539
582
  it("handles late resolved refkeys correctly", () => {
540
583
  const rk1 = refkey();
541
584
  const rk2 = refkey();
542
585
  expect(
543
- toSourceText([
586
+ <TestOutput>
544
587
  <py.StatementList>
545
588
  <py.MemberExpression>
546
589
  <py.MemberExpression.Part refkey={rk1} />
@@ -548,37 +591,40 @@ describe("with refkeys", () => {
548
591
  </py.MemberExpression>
549
592
  <py.VariableDeclaration name="test1" refkey={rk1} initializer={1} />
550
593
  <py.VariableDeclaration name="test1" refkey={rk2} initializer={2} />
551
- </py.StatementList>,
552
- ]),
553
- ).toBe(d`
594
+ </py.StatementList>
595
+ </TestOutput>,
596
+ ).toRenderTo(
597
+ `
554
598
  test1.test1_2_test
555
599
  test1 = 1
556
600
  test1_2_test = 2
557
- `);
601
+ `,
602
+ );
558
603
  });
559
604
 
560
605
  it("creates a full reference to the first refkey", () => {
561
606
  const rk1 = refkey();
562
- const res = toSourceTextMultiple([
563
- <SourceFile path="source.py">
564
- <py.VariableDeclaration name="importMe" refkey={rk1} />
565
- </SourceFile>,
566
- <SourceFile path="index.py">
567
- <py.StatementList>
568
- <py.MemberExpression>
569
- <py.MemberExpression.Part refkey={rk1} />
570
- <py.MemberExpression.Part id="foo" />
571
- </py.MemberExpression>
572
- </py.StatementList>
573
- </SourceFile>,
574
- ]);
575
-
576
- assertFileContents(res, {
577
- "index.py": d`
578
- from source import import_me
579
-
580
- import_me.foo
581
- `,
607
+ expect(
608
+ <TestOutputDirectory>
609
+ <SourceFile path="source.py">
610
+ <py.VariableDeclaration name="importMe" refkey={rk1} />
611
+ </SourceFile>
612
+ <SourceFile path="index.py">
613
+ <py.StatementList>
614
+ <py.MemberExpression>
615
+ <py.MemberExpression.Part refkey={rk1} />
616
+ <py.MemberExpression.Part id="foo" />
617
+ </py.MemberExpression>
618
+ </py.StatementList>
619
+ </SourceFile>
620
+ </TestOutputDirectory>,
621
+ ).toRenderTo({
622
+ "index.py": `
623
+ from source import import_me
624
+
625
+ import_me.foo
626
+ `,
627
+ "source.py": "import_me = None",
582
628
  });
583
629
  });
584
630
  });
@@ -586,22 +632,24 @@ describe("with refkeys", () => {
586
632
  describe("with function calls", () => {
587
633
  it("handles simple function calls correctly", () => {
588
634
  expect(
589
- toSourceText([
635
+ <TestOutput>
590
636
  <py.MemberExpression>
591
637
  <py.MemberExpression.Part id="myFunction" />
592
638
  <py.MemberExpression.Part args={[1, 2]} />
593
- </py.MemberExpression>,
594
- ]),
595
- ).toBe(d`
639
+ </py.MemberExpression>
640
+ </TestOutput>,
641
+ ).toRenderTo(
642
+ `
596
643
  myFunction(1, 2)
597
- `);
644
+ `,
645
+ );
598
646
  });
599
647
 
600
648
  it("handles function calls with references correctly", () => {
601
649
  const xRefkey = refkey();
602
650
  const yRefkey = refkey();
603
651
  expect(
604
- toSourceText([
652
+ <TestOutput>
605
653
  <py.StatementList>
606
654
  <py.VariableDeclaration name="x" initializer={1} refkey={xRefkey} />
607
655
  <py.VariableDeclaration name="y" initializer={2} refkey={yRefkey} />
@@ -609,18 +657,20 @@ describe("with function calls", () => {
609
657
  <py.MemberExpression.Part id="myFunction" />
610
658
  <py.MemberExpression.Part args={[xRefkey, yRefkey]} />
611
659
  </py.MemberExpression>
612
- </py.StatementList>,
613
- ]),
614
- ).toBe(d`
660
+ </py.StatementList>
661
+ </TestOutput>,
662
+ ).toRenderTo(
663
+ `
615
664
  x = 1
616
665
  y = 2
617
666
  myFunction(x, y)
618
- `);
667
+ `,
668
+ );
619
669
  });
620
670
 
621
671
  it("handles method calls correctly", () => {
622
672
  expect(
623
- toSourceText([
673
+ <TestOutput>
624
674
  <py.MemberExpression>
625
675
  <py.MemberExpression.Part id="method1" />
626
676
  <py.MemberExpression.Part args={[1, 2]} />
@@ -628,39 +678,45 @@ describe("with function calls", () => {
628
678
  <py.MemberExpression.Part id="method2" />
629
679
  <py.MemberExpression.Part args={[]} />
630
680
  <py.MemberExpression.Part id="prop" />
631
- </py.MemberExpression>,
632
- ]),
633
- ).toBe(d`
681
+ </py.MemberExpression>
682
+ </TestOutput>,
683
+ ).toRenderTo(
684
+ `
634
685
  method1(1, 2)().method2().prop
635
- `);
686
+ `,
687
+ );
636
688
  });
637
689
 
638
690
  it("handles function calls correctly", () => {
639
691
  expect(
640
- toSourceText([
692
+ <TestOutput>
641
693
  <py.MemberExpression>
642
694
  <py.MemberExpression.Part id="myFunction" />
643
695
  <py.MemberExpression.Part args={[1, 2]} />
644
696
  <py.MemberExpression.Part id="prop" />
645
- </py.MemberExpression>,
646
- ]),
647
- ).toBe(d`
697
+ </py.MemberExpression>
698
+ </TestOutput>,
699
+ ).toRenderTo(
700
+ `
648
701
  myFunction(1, 2).prop
649
- `);
702
+ `,
703
+ );
650
704
  });
651
705
 
652
706
  it("handles function calls correctly", () => {
653
707
  expect(
654
- toSourceText([
708
+ <TestOutput>
655
709
  <py.MemberExpression>
656
710
  <py.MemberExpression.Part id="myFunction" />
657
711
  <py.MemberExpression.Part args={[1, 2]} />
658
712
  <py.MemberExpression.Part id="prop" />
659
- </py.MemberExpression>,
660
- ]),
661
- ).toBe(d`
713
+ </py.MemberExpression>
714
+ </TestOutput>,
715
+ ).toRenderTo(
716
+ `
662
717
  myFunction(1, 2).prop
663
- `);
718
+ `,
719
+ );
664
720
  });
665
721
  });
666
722
 
@@ -668,50 +724,50 @@ describe("formatting", () => {
668
724
  describe("simple chains", () => {
669
725
  it("just dots", () => {
670
726
  expect(
671
- toSourceText(
672
- [
673
- <py.MemberExpression>
674
- <py.MemberExpression.Part id="four" />
675
- <py.MemberExpression.Part id="four" />
676
- <py.MemberExpression.Part id="two" />
677
- <py.MemberExpression.Part id="two" />
678
- <py.MemberExpression.Part id="two" />
679
- <py.MemberExpression.Part id="two" />
680
- </py.MemberExpression>,
681
- ],
682
- { printOptions: { printWidth: 14 } },
683
- ),
684
- ).toBe(d`
727
+ <TestOutput>
728
+ <py.MemberExpression>
729
+ <py.MemberExpression.Part id="four" />
730
+ <py.MemberExpression.Part id="four" />
731
+ <py.MemberExpression.Part id="two" />
732
+ <py.MemberExpression.Part id="two" />
733
+ <py.MemberExpression.Part id="two" />
734
+ <py.MemberExpression.Part id="two" />
735
+ </py.MemberExpression>
736
+ </TestOutput>,
737
+ ).toRenderTo(
738
+ `
685
739
  four.four \\
686
740
  .two.two \\
687
741
  .two.two
688
- `);
742
+ `,
743
+ { tabWidth: 4, printWidth: 14 },
744
+ );
689
745
  });
690
746
 
691
747
  it("bracket breaks", () => {
692
748
  expect(
693
- toSourceText(
694
- [
695
- <py.MemberExpression>
696
- <py.MemberExpression.Part id="obj" />
697
- <py.MemberExpression.Part key={"property-name"} />
698
- <py.MemberExpression.Part id="prop" />
699
- </py.MemberExpression>,
700
- ],
701
- { printOptions: { printWidth: 12 } },
702
- ),
703
- ).toBe(d`
749
+ <TestOutput>
750
+ <py.MemberExpression>
751
+ <py.MemberExpression.Part id="obj" />
752
+ <py.MemberExpression.Part key={"property-name"} />
753
+ <py.MemberExpression.Part id="prop" />
754
+ </py.MemberExpression>
755
+ </TestOutput>,
756
+ ).toRenderTo(
757
+ `
704
758
  obj[
705
759
  "property-name"
706
760
  ].prop
707
- `);
761
+ `,
762
+ { tabWidth: 4, printWidth: 12 },
763
+ );
708
764
  });
709
765
  });
710
766
 
711
767
  describe("call chains", () => {
712
768
  it("renders multiple calls on the same line when there are no breaks and they fit", () => {
713
769
  expect(
714
- toSourceText([
770
+ <TestOutput>
715
771
  <py.MemberExpression>
716
772
  <py.MemberExpression.Part id="z" />
717
773
  <py.MemberExpression.Part id="object" />
@@ -720,11 +776,13 @@ describe("formatting", () => {
720
776
  <py.MemberExpression.Part args />
721
777
  <py.MemberExpression.Part id="optional" />
722
778
  <py.MemberExpression.Part args />
723
- </py.MemberExpression>,
724
- ]),
725
- ).toBe(d`
779
+ </py.MemberExpression>
780
+ </TestOutput>,
781
+ ).toRenderTo(
782
+ `
726
783
  z.object().partial().optional()
727
- `);
784
+ `,
785
+ );
728
786
  });
729
787
  });
730
788
  });