@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,14 +1,14 @@
1
1
  import { createComponent as _$createComponent } from "@alloy-js/core/jsx-runtime";
2
2
  import { Prose, code, refkey } from "@alloy-js/core";
3
- import { d } from "@alloy-js/core/testing";
4
3
  import { describe, expect, it } from "vitest";
5
4
  import { pydanticModule, pydanticSettingsModule, typingModule } from "../src/builtins/python.js";
6
5
  import * as py from "../src/index.js";
7
- import { assertFileContents, toSourceText, toSourceTextMultiple } from "./utils.js";
6
+ import { TestOutput, TestOutputDirectory } from "./utils.js";
8
7
  describe("PydanticClassDeclaration", () => {
9
8
  it("forwards class-level decorators above `class`", () => {
10
- const res = toSourceText([_$createComponent(py.SourceFile, {
9
+ expect(_$createComponent(TestOutput, {
11
10
  path: "models.py",
11
+ externals: [pydanticModule, typingModule],
12
12
  get children() {
13
13
  return _$createComponent(py.PydanticClassDeclaration, {
14
14
  name: "User",
@@ -23,24 +23,21 @@ describe("PydanticClassDeclaration", () => {
23
23
  type: "int"
24
24
  }, {
25
25
  fileName: import.meta.url,
26
- lineNumber: 25,
27
- columnNumber: 13
26
+ lineNumber: 19,
27
+ columnNumber: 11
28
28
  });
29
29
  }
30
30
  }, {
31
31
  fileName: import.meta.url,
32
- lineNumber: 21,
33
- columnNumber: 11
32
+ lineNumber: 15,
33
+ columnNumber: 9
34
34
  });
35
35
  }
36
36
  }, {
37
37
  fileName: import.meta.url,
38
- lineNumber: 20,
39
- columnNumber: 9
40
- })], {
41
- externals: [pydanticModule, typingModule]
42
- });
43
- expect(res).toRenderTo(d`
38
+ lineNumber: 14,
39
+ columnNumber: 7
40
+ })).toRenderTo(`
44
41
  from pydantic import BaseModel
45
42
  from typing import final
46
43
 
@@ -49,12 +46,12 @@ describe("PydanticClassDeclaration", () => {
49
46
  class User(BaseModel):
50
47
  id: int
51
48
 
52
-
53
49
  `);
54
50
  });
55
51
  it("emits a pydantic model with BaseModel, fields, and Field import", () => {
56
- const res = toSourceText([_$createComponent(py.SourceFile, {
52
+ expect(_$createComponent(TestOutput, {
57
53
  path: "models.py",
54
+ externals: [pydanticModule],
58
55
  get children() {
59
56
  return _$createComponent(py.PydanticClassDeclaration, {
60
57
  name: "User",
@@ -66,8 +63,8 @@ describe("PydanticClassDeclaration", () => {
66
63
  type: "int"
67
64
  }, {
68
65
  fileName: import.meta.url,
69
- lineNumber: 57,
70
- columnNumber: 13
66
+ lineNumber: 45,
67
+ columnNumber: 11
71
68
  }), _$createComponent(py.VariableDeclaration, {
72
69
  instanceVariable: true,
73
70
  name: "name",
@@ -77,24 +74,21 @@ describe("PydanticClassDeclaration", () => {
77
74
  }
78
75
  }, {
79
76
  fileName: import.meta.url,
80
- lineNumber: 63,
81
- columnNumber: 13
77
+ lineNumber: 51,
78
+ columnNumber: 11
82
79
  })];
83
80
  }
84
81
  }, {
85
82
  fileName: import.meta.url,
86
- lineNumber: 56,
87
- columnNumber: 11
83
+ lineNumber: 44,
84
+ columnNumber: 9
88
85
  });
89
86
  }
90
87
  }, {
91
88
  fileName: import.meta.url,
92
- lineNumber: 55,
93
- columnNumber: 9
94
- })], {
95
- externals: [pydanticModule]
96
- });
97
- expect(res).toRenderTo(d`
89
+ lineNumber: 43,
90
+ columnNumber: 7
91
+ })).toRenderTo(`
98
92
  from pydantic import BaseModel
99
93
  from pydantic import Field
100
94
 
@@ -103,13 +97,13 @@ describe("PydanticClassDeclaration", () => {
103
97
  id: int
104
98
  name: str = Field(default="anon")
105
99
 
106
-
107
100
  `);
108
101
  });
109
102
  it("inherits from another pydantic model via bases", () => {
110
103
  const baseRef = refkey();
111
- const res = toSourceText([_$createComponent(py.SourceFile, {
104
+ expect(_$createComponent(TestOutput, {
112
105
  path: "models.py",
106
+ externals: [pydanticModule],
113
107
  get children() {
114
108
  return _$createComponent(py.StatementList, {
115
109
  get children() {
@@ -124,14 +118,14 @@ describe("PydanticClassDeclaration", () => {
124
118
  type: "int"
125
119
  }, {
126
120
  fileName: import.meta.url,
127
- lineNumber: 97,
128
- columnNumber: 15
121
+ lineNumber: 79,
122
+ columnNumber: 13
129
123
  });
130
124
  }
131
125
  }, {
132
126
  fileName: import.meta.url,
133
- lineNumber: 96,
134
- columnNumber: 13
127
+ lineNumber: 78,
128
+ columnNumber: 11
135
129
  }), _$createComponent(py.PydanticClassDeclaration, {
136
130
  name: "Admin",
137
131
  bases: [baseRef],
@@ -143,30 +137,27 @@ describe("PydanticClassDeclaration", () => {
143
137
  type: "str"
144
138
  }, {
145
139
  fileName: import.meta.url,
146
- lineNumber: 105,
147
- columnNumber: 15
140
+ lineNumber: 87,
141
+ columnNumber: 13
148
142
  });
149
143
  }
150
144
  }, {
151
145
  fileName: import.meta.url,
152
- lineNumber: 104,
153
- columnNumber: 13
146
+ lineNumber: 86,
147
+ columnNumber: 11
154
148
  })];
155
149
  }
156
150
  }, {
157
151
  fileName: import.meta.url,
158
- lineNumber: 95,
159
- columnNumber: 11
152
+ lineNumber: 77,
153
+ columnNumber: 9
160
154
  });
161
155
  }
162
156
  }, {
163
157
  fileName: import.meta.url,
164
- lineNumber: 94,
165
- columnNumber: 9
166
- })], {
167
- externals: [pydanticModule]
168
- });
169
- expect(res).toRenderTo(d`
158
+ lineNumber: 76,
159
+ columnNumber: 7
160
+ })).toRenderTo(`
170
161
  from pydantic import BaseModel
171
162
 
172
163
 
@@ -176,12 +167,12 @@ describe("PydanticClassDeclaration", () => {
176
167
  class Admin(User):
177
168
  role: str
178
169
 
179
-
180
170
  `);
181
171
  });
182
172
  it("supports required, optional, Field default, and plain default", () => {
183
- const res = toSourceText([_$createComponent(py.SourceFile, {
173
+ expect(_$createComponent(TestOutput, {
184
174
  path: "models.py",
175
+ externals: [pydanticModule],
185
176
  get children() {
186
177
  return _$createComponent(py.PydanticClassDeclaration, {
187
178
  name: "Item",
@@ -193,8 +184,8 @@ describe("PydanticClassDeclaration", () => {
193
184
  type: "str"
194
185
  }, {
195
186
  fileName: import.meta.url,
196
- lineNumber: 139,
197
- columnNumber: 13
187
+ lineNumber: 115,
188
+ columnNumber: 11
198
189
  }), _$createComponent(py.VariableDeclaration, {
199
190
  instanceVariable: true,
200
191
  name: "notes",
@@ -203,14 +194,14 @@ describe("PydanticClassDeclaration", () => {
203
194
  children: ["str", "None"]
204
195
  }, {
205
196
  fileName: import.meta.url,
206
- lineNumber: 148,
207
- columnNumber: 21
197
+ lineNumber: 124,
198
+ columnNumber: 19
208
199
  });
209
200
  }
210
201
  }, {
211
202
  fileName: import.meta.url,
212
- lineNumber: 145,
213
- columnNumber: 13
203
+ lineNumber: 121,
204
+ columnNumber: 11
214
205
  }), _$createComponent(py.VariableDeclaration, {
215
206
  instanceVariable: true,
216
207
  name: "label",
@@ -220,8 +211,8 @@ describe("PydanticClassDeclaration", () => {
220
211
  }
221
212
  }, {
222
213
  fileName: import.meta.url,
223
- lineNumber: 150,
224
- columnNumber: 13
214
+ lineNumber: 126,
215
+ columnNumber: 11
225
216
  }), _$createComponent(py.VariableDeclaration, {
226
217
  instanceVariable: true,
227
218
  name: "qty",
@@ -229,24 +220,21 @@ describe("PydanticClassDeclaration", () => {
229
220
  initializer: 1
230
221
  }, {
231
222
  fileName: import.meta.url,
232
- lineNumber: 156,
233
- columnNumber: 13
223
+ lineNumber: 132,
224
+ columnNumber: 11
234
225
  })];
235
226
  }
236
227
  }, {
237
228
  fileName: import.meta.url,
238
- lineNumber: 138,
239
- columnNumber: 11
229
+ lineNumber: 114,
230
+ columnNumber: 9
240
231
  });
241
232
  }
242
233
  }, {
243
234
  fileName: import.meta.url,
244
- lineNumber: 137,
245
- columnNumber: 9
246
- })], {
247
- externals: [pydanticModule]
248
- });
249
- expect(res).toRenderTo(d`
235
+ lineNumber: 113,
236
+ columnNumber: 7
237
+ })).toRenderTo(`
250
238
  from pydantic import BaseModel
251
239
  from pydantic import Field
252
240
 
@@ -257,7 +245,6 @@ describe("PydanticClassDeclaration", () => {
257
245
  label: str = Field(default="untitled")
258
246
  qty: int = 1
259
247
 
260
-
261
248
  `);
262
249
  });
263
250
  it("emits class docstring", () => {
@@ -267,17 +254,18 @@ describe("PydanticClassDeclaration", () => {
267
254
  children: "Payload for an API request."
268
255
  }, {
269
256
  fileName: import.meta.url,
270
- lineNumber: 187,
257
+ lineNumber: 158,
271
258
  columnNumber: 34
272
259
  })];
273
260
  }
274
261
  }, {
275
262
  fileName: import.meta.url,
276
- lineNumber: 187,
263
+ lineNumber: 158,
277
264
  columnNumber: 7
278
265
  });
279
- const res = toSourceText([_$createComponent(py.SourceFile, {
266
+ expect(_$createComponent(TestOutput, {
280
267
  path: "models.py",
268
+ externals: [pydanticModule],
281
269
  get children() {
282
270
  return _$createComponent(py.PydanticClassDeclaration, {
283
271
  name: "RequestBody",
@@ -290,24 +278,21 @@ describe("PydanticClassDeclaration", () => {
290
278
  type: "str"
291
279
  }, {
292
280
  fileName: import.meta.url,
293
- lineNumber: 193,
294
- columnNumber: 13
281
+ lineNumber: 163,
282
+ columnNumber: 11
295
283
  });
296
284
  }
297
285
  }, {
298
286
  fileName: import.meta.url,
299
- lineNumber: 192,
300
- columnNumber: 11
287
+ lineNumber: 162,
288
+ columnNumber: 9
301
289
  });
302
290
  }
303
291
  }, {
304
292
  fileName: import.meta.url,
305
- lineNumber: 191,
306
- columnNumber: 9
307
- })], {
308
- externals: [pydanticModule]
309
- });
310
- expect(res).toRenderTo(d`
293
+ lineNumber: 161,
294
+ columnNumber: 7
295
+ })).toRenderTo(`
311
296
  from pydantic import BaseModel
312
297
 
313
298
 
@@ -318,88 +303,94 @@ describe("PydanticClassDeclaration", () => {
318
303
 
319
304
  value: str
320
305
 
321
-
322
306
  `);
323
307
  });
324
308
  it("resolves refkey across files with pydantic imports", () => {
325
309
  const modelRef = refkey();
326
- const res = toSourceTextMultiple([_$createComponent(py.SourceFile, {
327
- path: "models.py",
310
+ expect(_$createComponent(TestOutputDirectory, {
311
+ externals: [pydanticModule],
328
312
  get children() {
329
- return _$createComponent(py.PydanticClassDeclaration, {
330
- name: "User",
331
- refkey: modelRef,
313
+ return [_$createComponent(py.SourceFile, {
314
+ path: "models.py",
332
315
  get children() {
333
- return _$createComponent(py.VariableDeclaration, {
334
- instanceVariable: true,
335
- omitNone: true,
336
- name: "id",
337
- type: "int"
316
+ return _$createComponent(py.PydanticClassDeclaration, {
317
+ name: "User",
318
+ refkey: modelRef,
319
+ get children() {
320
+ return _$createComponent(py.VariableDeclaration, {
321
+ instanceVariable: true,
322
+ omitNone: true,
323
+ name: "id",
324
+ type: "int"
325
+ }, {
326
+ fileName: import.meta.url,
327
+ lineNumber: 193,
328
+ columnNumber: 13
329
+ });
330
+ }
338
331
  }, {
339
332
  fileName: import.meta.url,
340
- lineNumber: 228,
341
- columnNumber: 13
333
+ lineNumber: 192,
334
+ columnNumber: 11
342
335
  });
343
336
  }
344
337
  }, {
345
338
  fileName: import.meta.url,
346
- lineNumber: 227,
347
- columnNumber: 11
348
- });
349
- }
350
- }, {
351
- fileName: import.meta.url,
352
- lineNumber: 226,
353
- columnNumber: 9
354
- }), _$createComponent(py.SourceFile, {
355
- path: "service.py",
356
- get children() {
357
- return _$createComponent(py.FunctionDeclaration, {
358
- name: "load_user",
359
- returnType: modelRef,
360
- parameters: [{
361
- name: "user_id",
362
- type: "int"
363
- }],
364
- children: "return User(id=user_id)"
339
+ lineNumber: 191,
340
+ columnNumber: 9
341
+ }), _$createComponent(py.SourceFile, {
342
+ path: "service.py",
343
+ get children() {
344
+ return _$createComponent(py.FunctionDeclaration, {
345
+ name: "load_user",
346
+ returnType: modelRef,
347
+ parameters: [{
348
+ name: "user_id",
349
+ type: "int"
350
+ }],
351
+ children: "return User(id=user_id)"
352
+ }, {
353
+ fileName: import.meta.url,
354
+ lineNumber: 202,
355
+ columnNumber: 11
356
+ });
357
+ }
365
358
  }, {
366
359
  fileName: import.meta.url,
367
- lineNumber: 237,
368
- columnNumber: 11
369
- });
360
+ lineNumber: 201,
361
+ columnNumber: 9
362
+ })];
370
363
  }
371
364
  }, {
372
365
  fileName: import.meta.url,
373
- lineNumber: 236,
374
- columnNumber: 9
375
- })], {
376
- externals: [pydanticModule]
377
- });
378
- assertFileContents(res, {
366
+ lineNumber: 190,
367
+ columnNumber: 7
368
+ })).toRenderTo({
379
369
  "models.py": `
380
- from pydantic import BaseModel
370
+ from pydantic import BaseModel
381
371
 
382
372
 
383
- class User(BaseModel):
384
- id: int
373
+ class User(BaseModel):
374
+ id: int
385
375
 
386
- `,
376
+ `,
387
377
  "service.py": `
388
- from typing import TYPE_CHECKING
378
+ from typing import TYPE_CHECKING
389
379
 
390
- if TYPE_CHECKING:
391
- from models import User
380
+ if TYPE_CHECKING:
381
+ from models import User
392
382
 
393
383
 
394
- def load_user(user_id: int) -> User:
395
- return User(id=user_id)
384
+ def load_user(user_id: int) -> User:
385
+ return User(id=user_id)
396
386
 
397
- `
387
+ `
398
388
  });
399
389
  });
400
390
  it("emits model_config = ConfigDict(...) from top-level config props", () => {
401
- const res = toSourceText([_$createComponent(py.SourceFile, {
391
+ expect(_$createComponent(TestOutput, {
402
392
  path: "models.py",
393
+ externals: [pydanticModule],
403
394
  get children() {
404
395
  return _$createComponent(py.PydanticClassDeclaration, {
405
396
  name: "User",
@@ -414,24 +405,21 @@ describe("PydanticClassDeclaration", () => {
414
405
  type: "int"
415
406
  }, {
416
407
  fileName: import.meta.url,
417
- lineNumber: 282,
418
- columnNumber: 13
408
+ lineNumber: 243,
409
+ columnNumber: 11
419
410
  });
420
411
  }
421
412
  }, {
422
413
  fileName: import.meta.url,
423
- lineNumber: 276,
424
- columnNumber: 11
414
+ lineNumber: 237,
415
+ columnNumber: 9
425
416
  });
426
417
  }
427
418
  }, {
428
419
  fileName: import.meta.url,
429
- lineNumber: 275,
430
- columnNumber: 9
431
- })], {
432
- externals: [pydanticModule]
433
- });
434
- expect(res).toRenderTo(d`
420
+ lineNumber: 236,
421
+ columnNumber: 7
422
+ })).toRenderTo(`
435
423
  from pydantic import BaseModel
436
424
  from pydantic import ConfigDict
437
425
 
@@ -440,12 +428,12 @@ describe("PydanticClassDeclaration", () => {
440
428
  model_config = ConfigDict(frozen=True, extra="forbid", validate_assignment=True)
441
429
  id: int
442
430
 
443
-
444
431
  `);
445
432
  });
446
433
  it("emits model_config = ConfigDict(...) from modelConfig", () => {
447
- const res = toSourceText([_$createComponent(py.SourceFile, {
434
+ expect(_$createComponent(TestOutput, {
448
435
  path: "models.py",
436
+ externals: [pydanticModule],
449
437
  get children() {
450
438
  return _$createComponent(py.PydanticClassDeclaration, {
451
439
  name: "User",
@@ -462,24 +450,21 @@ describe("PydanticClassDeclaration", () => {
462
450
  type: "int"
463
451
  }, {
464
452
  fileName: import.meta.url,
465
- lineNumber: 321,
466
- columnNumber: 13
453
+ lineNumber: 276,
454
+ columnNumber: 11
467
455
  });
468
456
  }
469
457
  }, {
470
458
  fileName: import.meta.url,
471
- lineNumber: 313,
472
- columnNumber: 11
459
+ lineNumber: 268,
460
+ columnNumber: 9
473
461
  });
474
462
  }
475
463
  }, {
476
464
  fileName: import.meta.url,
477
- lineNumber: 312,
478
- columnNumber: 9
479
- })], {
480
- externals: [pydanticModule]
481
- });
482
- expect(res).toRenderTo(d`
465
+ lineNumber: 267,
466
+ columnNumber: 7
467
+ })).toRenderTo(`
483
468
  from pydantic import BaseModel
484
469
  from pydantic import ConfigDict
485
470
 
@@ -488,12 +473,12 @@ describe("PydanticClassDeclaration", () => {
488
473
  model_config = ConfigDict(frozen=True, extra="forbid", validate_assignment=True)
489
474
  id: int
490
475
 
491
-
492
476
  `);
493
477
  });
494
478
  it("gives precedence to top-level config props over modelConfig", () => {
495
- const res = toSourceText([_$createComponent(py.SourceFile, {
479
+ expect(_$createComponent(TestOutput, {
496
480
  path: "models.py",
481
+ externals: [pydanticModule],
497
482
  get children() {
498
483
  return _$createComponent(py.PydanticClassDeclaration, {
499
484
  name: "User",
@@ -505,18 +490,15 @@ describe("PydanticClassDeclaration", () => {
505
490
  extra: "forbid"
506
491
  }, {
507
492
  fileName: import.meta.url,
508
- lineNumber: 352,
509
- columnNumber: 11
493
+ lineNumber: 301,
494
+ columnNumber: 9
510
495
  });
511
496
  }
512
497
  }, {
513
498
  fileName: import.meta.url,
514
- lineNumber: 351,
515
- columnNumber: 9
516
- })], {
517
- externals: [pydanticModule]
518
- });
519
- expect(res).toRenderTo(d`
499
+ lineNumber: 300,
500
+ columnNumber: 7
501
+ })).toRenderTo(`
520
502
  from pydantic import BaseModel
521
503
  from pydantic import ConfigDict
522
504
 
@@ -524,12 +506,12 @@ describe("PydanticClassDeclaration", () => {
524
506
  class User(BaseModel):
525
507
  model_config = ConfigDict(frozen=True, extra="forbid")
526
508
 
527
-
528
509
  `);
529
510
  });
530
511
  it("supports additional typed ConfigDict props", () => {
531
- const res = toSourceText([_$createComponent(py.SourceFile, {
512
+ expect(_$createComponent(TestOutput, {
532
513
  path: "models.py",
514
+ externals: [pydanticModule],
533
515
  get children() {
534
516
  return _$createComponent(py.PydanticClassDeclaration, {
535
517
  name: "User",
@@ -542,18 +524,15 @@ describe("PydanticClassDeclaration", () => {
542
524
  valJsonBytes: "hex"
543
525
  }, {
544
526
  fileName: import.meta.url,
545
- lineNumber: 381,
546
- columnNumber: 11
527
+ lineNumber: 324,
528
+ columnNumber: 9
547
529
  });
548
530
  }
549
531
  }, {
550
532
  fileName: import.meta.url,
551
- lineNumber: 380,
552
- columnNumber: 9
553
- })], {
554
- externals: [pydanticModule]
555
- });
556
- expect(res).toRenderTo(d`
533
+ lineNumber: 323,
534
+ columnNumber: 7
535
+ })).toRenderTo(`
557
536
  from pydantic import BaseModel
558
537
  from pydantic import ConfigDict
559
538
 
@@ -561,12 +540,12 @@ describe("PydanticClassDeclaration", () => {
561
540
  class User(BaseModel):
562
541
  model_config = ConfigDict(coerce_numbers_to_str=True, ser_json_bytes="base64", str_min_length=1, str_max_length=128, use_enum_values=True, val_json_bytes="hex", validate_return=True)
563
542
 
564
-
565
543
  `);
566
544
  });
567
545
  it("imports SecretStr when used as a field type", () => {
568
- const res = toSourceText([_$createComponent(py.SourceFile, {
546
+ expect(_$createComponent(TestOutput, {
569
547
  path: "models.py",
548
+ externals: [pydanticModule],
570
549
  get children() {
571
550
  return _$createComponent(py.PydanticClassDeclaration, {
572
551
  name: "Credentials",
@@ -580,24 +559,21 @@ describe("PydanticClassDeclaration", () => {
580
559
  }
581
560
  }, {
582
561
  fileName: import.meta.url,
583
- lineNumber: 415,
584
- columnNumber: 13
562
+ lineNumber: 352,
563
+ columnNumber: 11
585
564
  });
586
565
  }
587
566
  }, {
588
567
  fileName: import.meta.url,
589
- lineNumber: 414,
590
- columnNumber: 11
568
+ lineNumber: 351,
569
+ columnNumber: 9
591
570
  });
592
571
  }
593
572
  }, {
594
573
  fileName: import.meta.url,
595
- lineNumber: 413,
596
- columnNumber: 9
597
- })], {
598
- externals: [pydanticModule]
599
- });
600
- expect(res).toRenderTo(d`
574
+ lineNumber: 350,
575
+ columnNumber: 7
576
+ })).toRenderTo(`
601
577
  from pydantic import BaseModel
602
578
  from typing import TYPE_CHECKING
603
579
 
@@ -608,12 +584,12 @@ describe("PydanticClassDeclaration", () => {
608
584
  class Credentials(BaseModel):
609
585
  token: SecretStr
610
586
 
611
-
612
587
  `);
613
588
  });
614
589
  it("emits arbitrary model_config via modelConfigExpression", () => {
615
- const res = toSourceText([_$createComponent(py.SourceFile, {
590
+ expect(_$createComponent(TestOutput, {
616
591
  path: "models.py",
592
+ externals: [pydanticModule],
617
593
  get children() {
618
594
  return _$createComponent(py.PydanticClassDeclaration, {
619
595
  name: "M",
@@ -622,18 +598,15 @@ describe("PydanticClassDeclaration", () => {
622
598
  }
623
599
  }, {
624
600
  fileName: import.meta.url,
625
- lineNumber: 448,
626
- columnNumber: 11
601
+ lineNumber: 379,
602
+ columnNumber: 9
627
603
  });
628
604
  }
629
605
  }, {
630
606
  fileName: import.meta.url,
631
- lineNumber: 447,
632
- columnNumber: 9
633
- })], {
634
- externals: [pydanticModule]
635
- });
636
- expect(res).toRenderTo(d`
607
+ lineNumber: 378,
608
+ columnNumber: 7
609
+ })).toRenderTo(`
637
610
  from pydantic import BaseModel
638
611
  from pydantic import ConfigDict
639
612
 
@@ -641,12 +614,12 @@ describe("PydanticClassDeclaration", () => {
641
614
  class M(BaseModel):
642
615
  model_config = ConfigDict(frozen=True, extra="allow")
643
616
 
644
-
645
617
  `);
646
618
  });
647
619
  it("supports RootModel as explicit bases entry", () => {
648
- const res = toSourceText([_$createComponent(py.SourceFile, {
620
+ expect(_$createComponent(TestOutput, {
649
621
  path: "models.py",
622
+ externals: [pydanticModule],
650
623
  get children() {
651
624
  return _$createComponent(py.PydanticClassDeclaration, {
652
625
  name: "Tags",
@@ -655,30 +628,27 @@ describe("PydanticClassDeclaration", () => {
655
628
  }
656
629
  }, {
657
630
  fileName: import.meta.url,
658
- lineNumber: 475,
659
- columnNumber: 11
631
+ lineNumber: 400,
632
+ columnNumber: 9
660
633
  });
661
634
  }
662
635
  }, {
663
636
  fileName: import.meta.url,
664
- lineNumber: 474,
665
- columnNumber: 9
666
- })], {
667
- externals: [pydanticModule]
668
- });
669
- expect(res).toRenderTo(d`
637
+ lineNumber: 399,
638
+ columnNumber: 7
639
+ })).toRenderTo(`
670
640
  from pydantic import RootModel
671
641
 
672
642
 
673
643
  class Tags(RootModel[list[str]]):
674
644
  pass
675
645
 
676
-
677
646
  `);
678
647
  });
679
648
  it("places Pydantic validators above classmethod", () => {
680
- const res = toSourceText([_$createComponent(py.SourceFile, {
649
+ expect(_$createComponent(TestOutput, {
681
650
  path: "models.py",
651
+ externals: [pydanticModule],
682
652
  get children() {
683
653
  return _$createComponent(py.PydanticClassDeclaration, {
684
654
  name: "User",
@@ -690,8 +660,8 @@ describe("PydanticClassDeclaration", () => {
690
660
  type: "str"
691
661
  }, {
692
662
  fileName: import.meta.url,
693
- lineNumber: 502,
694
- columnNumber: 13
663
+ lineNumber: 421,
664
+ columnNumber: 11
695
665
  }), _$createComponent(py.ClassMethodDeclaration, {
696
666
  name: "strip_name",
697
667
  get decorators() {
@@ -705,24 +675,21 @@ describe("PydanticClassDeclaration", () => {
705
675
  children: "return value.strip()"
706
676
  }, {
707
677
  fileName: import.meta.url,
708
- lineNumber: 508,
709
- columnNumber: 13
678
+ lineNumber: 427,
679
+ columnNumber: 11
710
680
  })];
711
681
  }
712
682
  }, {
713
683
  fileName: import.meta.url,
714
- lineNumber: 501,
715
- columnNumber: 11
684
+ lineNumber: 420,
685
+ columnNumber: 9
716
686
  });
717
687
  }
718
688
  }, {
719
689
  fileName: import.meta.url,
720
- lineNumber: 500,
721
- columnNumber: 9
722
- })], {
723
- externals: [pydanticModule]
724
- });
725
- expect(res).toRenderTo(d`
690
+ lineNumber: 419,
691
+ columnNumber: 7
692
+ })).toRenderTo(`
726
693
  from pydantic import BaseModel
727
694
  from pydantic import field_validator
728
695
 
@@ -735,14 +702,14 @@ describe("PydanticClassDeclaration", () => {
735
702
  return value.strip()
736
703
 
737
704
 
738
-
739
705
  `);
740
706
  });
741
707
  });
742
708
  describe("Pydantic ecosystem emitters", () => {
743
709
  it("typing module resolves Any and similar annotations", () => {
744
- const res = toSourceText([_$createComponent(py.SourceFile, {
710
+ expect(_$createComponent(TestOutput, {
745
711
  path: "models.py",
712
+ externals: [typingModule],
746
713
  get children() {
747
714
  return _$createComponent(py.FunctionDeclaration, {
748
715
  name: "identity",
@@ -758,18 +725,15 @@ describe("Pydantic ecosystem emitters", () => {
758
725
  children: "return x"
759
726
  }, {
760
727
  fileName: import.meta.url,
761
- lineNumber: 549,
762
- columnNumber: 11
728
+ lineNumber: 462,
729
+ columnNumber: 9
763
730
  });
764
731
  }
765
732
  }, {
766
733
  fileName: import.meta.url,
767
- lineNumber: 548,
768
- columnNumber: 9
769
- })], {
770
- externals: [typingModule]
771
- });
772
- expect(res).toRenderTo(d`
734
+ lineNumber: 461,
735
+ columnNumber: 7
736
+ })).toRenderTo(`
773
737
  from typing import TYPE_CHECKING
774
738
 
775
739
  if TYPE_CHECKING:
@@ -779,12 +743,12 @@ describe("Pydantic ecosystem emitters", () => {
779
743
  def identity(x: Any) -> Any:
780
744
  return x
781
745
 
782
-
783
746
  `);
784
747
  });
785
748
  it("pydantic.types constrains field annotations", () => {
786
- const res = toSourceText([_$createComponent(py.SourceFile, {
749
+ expect(_$createComponent(TestOutput, {
787
750
  path: "models.py",
751
+ externals: [pydanticModule],
788
752
  get children() {
789
753
  return _$createComponent(py.PydanticClassDeclaration, {
790
754
  name: "Score",
@@ -798,24 +762,21 @@ describe("Pydantic ecosystem emitters", () => {
798
762
  }
799
763
  }, {
800
764
  fileName: import.meta.url,
801
- lineNumber: 582,
802
- columnNumber: 13
765
+ lineNumber: 489,
766
+ columnNumber: 11
803
767
  });
804
768
  }
805
769
  }, {
806
770
  fileName: import.meta.url,
807
- lineNumber: 581,
808
- columnNumber: 11
771
+ lineNumber: 488,
772
+ columnNumber: 9
809
773
  });
810
774
  }
811
775
  }, {
812
776
  fileName: import.meta.url,
813
- lineNumber: 580,
814
- columnNumber: 9
815
- })], {
816
- externals: [pydanticModule]
817
- });
818
- expect(res).toRenderTo(d`
777
+ lineNumber: 487,
778
+ columnNumber: 7
779
+ })).toRenderTo(`
819
780
  from pydantic import BaseModel
820
781
  from typing import TYPE_CHECKING
821
782
 
@@ -826,73 +787,80 @@ describe("Pydantic ecosystem emitters", () => {
826
787
  class Score(BaseModel):
827
788
  points: PositiveInt
828
789
 
829
-
830
790
  `);
831
791
  });
832
792
  it("postponed annotations support forward references in fields", () => {
833
- const res = toSourceText([_$createComponent(py.SourceFile, {
834
- path: "models.py",
835
- get futureImports() {
836
- return [_$createComponent(py.FutureStatement, {
837
- feature: "annotations"
838
- }, {
839
- fileName: import.meta.url,
840
- lineNumber: 616,
841
- columnNumber: 27
842
- })];
843
- },
793
+ expect(_$createComponent(TestOutputDirectory, {
794
+ externals: [pydanticModule],
844
795
  get children() {
845
- return _$createComponent(py.PydanticClassDeclaration, {
846
- name: "Node",
847
- get children() {
848
- return [_$createComponent(py.VariableDeclaration, {
849
- instanceVariable: true,
850
- omitNone: true,
851
- name: "label",
852
- type: "str"
796
+ return _$createComponent(py.SourceFile, {
797
+ path: "models.py",
798
+ get futureImports() {
799
+ return [_$createComponent(py.FutureStatement, {
800
+ feature: "annotations"
853
801
  }, {
854
802
  fileName: import.meta.url,
855
- lineNumber: 619,
856
- columnNumber: 13
857
- }), _$createComponent(py.VariableDeclaration, {
858
- instanceVariable: true,
859
- name: "child",
860
- type: code`"Node" | None`
803
+ lineNumber: 518,
804
+ columnNumber: 27
805
+ })];
806
+ },
807
+ get children() {
808
+ return _$createComponent(py.PydanticClassDeclaration, {
809
+ name: "Node",
810
+ get children() {
811
+ return [_$createComponent(py.VariableDeclaration, {
812
+ instanceVariable: true,
813
+ omitNone: true,
814
+ name: "label",
815
+ type: "str"
816
+ }, {
817
+ fileName: import.meta.url,
818
+ lineNumber: 521,
819
+ columnNumber: 13
820
+ }), _$createComponent(py.VariableDeclaration, {
821
+ instanceVariable: true,
822
+ name: "child",
823
+ type: code`"Node" | None`
824
+ }, {
825
+ fileName: import.meta.url,
826
+ lineNumber: 527,
827
+ columnNumber: 13
828
+ })];
829
+ }
861
830
  }, {
862
831
  fileName: import.meta.url,
863
- lineNumber: 625,
864
- columnNumber: 13
865
- })];
832
+ lineNumber: 520,
833
+ columnNumber: 11
834
+ });
866
835
  }
867
836
  }, {
868
837
  fileName: import.meta.url,
869
- lineNumber: 618,
870
- columnNumber: 11
838
+ lineNumber: 516,
839
+ columnNumber: 9
871
840
  });
872
841
  }
873
842
  }, {
874
843
  fileName: import.meta.url,
875
- lineNumber: 614,
876
- columnNumber: 9
877
- })], {
878
- externals: [pydanticModule]
879
- });
880
- expect(res).toRenderTo(d`
881
- from __future__ import annotations
882
-
883
- from pydantic import BaseModel
844
+ lineNumber: 515,
845
+ columnNumber: 7
846
+ })).toRenderTo({
847
+ "models.py": `
848
+ from __future__ import annotations
884
849
 
850
+ from pydantic import BaseModel
885
851
 
886
- class Node(BaseModel):
887
- label: str
888
- child: "Node" | None = None
889
852
 
853
+ class Node(BaseModel):
854
+ label: str
855
+ child: "Node" | None = None
890
856
 
891
- `);
857
+ `
858
+ });
892
859
  });
893
860
  it("model_config can use pydantic.alias_generators", () => {
894
- const res = toSourceText([_$createComponent(py.SourceFile, {
861
+ expect(_$createComponent(TestOutput, {
895
862
  path: "models.py",
863
+ externals: [pydanticModule],
896
864
  get children() {
897
865
  return _$createComponent(py.PydanticClassDeclaration, {
898
866
  name: "M",
@@ -901,18 +869,15 @@ describe("Pydantic ecosystem emitters", () => {
901
869
  }
902
870
  }, {
903
871
  fileName: import.meta.url,
904
- lineNumber: 656,
905
- columnNumber: 11
872
+ lineNumber: 553,
873
+ columnNumber: 9
906
874
  });
907
875
  }
908
876
  }, {
909
877
  fileName: import.meta.url,
910
- lineNumber: 655,
911
- columnNumber: 9
912
- })], {
913
- externals: [pydanticModule]
914
- });
915
- expect(res).toRenderTo(d`
878
+ lineNumber: 552,
879
+ columnNumber: 7
880
+ })).toRenderTo(`
916
881
  from pydantic import BaseModel
917
882
  from pydantic import ConfigDict
918
883
  from pydantic.alias_generators import to_camel
@@ -921,12 +886,12 @@ describe("Pydantic ecosystem emitters", () => {
921
886
  class M(BaseModel):
922
887
  model_config = ConfigDict(alias_generator=to_camel)
923
888
 
924
-
925
889
  `);
926
890
  });
927
891
  it("pydantic_settings exposes BaseSettings", () => {
928
- const res = toSourceText([_$createComponent(py.SourceFile, {
892
+ expect(_$createComponent(TestOutput, {
929
893
  path: "config.py",
894
+ externals: [pydanticSettingsModule],
930
895
  get children() {
931
896
  return _$createComponent(py.ClassDeclaration, {
932
897
  name: "AppSettings",
@@ -935,30 +900,27 @@ describe("Pydantic ecosystem emitters", () => {
935
900
  }
936
901
  }, {
937
902
  fileName: import.meta.url,
938
- lineNumber: 684,
939
- columnNumber: 11
903
+ lineNumber: 575,
904
+ columnNumber: 9
940
905
  });
941
906
  }
942
907
  }, {
943
908
  fileName: import.meta.url,
944
- lineNumber: 683,
945
- columnNumber: 9
946
- })], {
947
- externals: [pydanticSettingsModule]
948
- });
949
- expect(res).toRenderTo(d`
909
+ lineNumber: 574,
910
+ columnNumber: 7
911
+ })).toRenderTo(`
950
912
  from pydantic_settings import BaseSettings
951
913
 
952
914
 
953
915
  class AppSettings(BaseSettings):
954
916
  pass
955
917
 
956
-
957
918
  `);
958
919
  });
959
920
  it("emits @computed_field above @property via PropertyDeclaration", () => {
960
- const res = toSourceText([_$createComponent(py.SourceFile, {
921
+ expect(_$createComponent(TestOutput, {
961
922
  path: "models.py",
923
+ externals: [pydanticModule],
962
924
  get children() {
963
925
  return _$createComponent(py.PydanticClassDeclaration, {
964
926
  name: "Square",
@@ -970,8 +932,8 @@ describe("Pydantic ecosystem emitters", () => {
970
932
  type: "float"
971
933
  }, {
972
934
  fileName: import.meta.url,
973
- lineNumber: 711,
974
- columnNumber: 13
935
+ lineNumber: 596,
936
+ columnNumber: 11
975
937
  }), _$createComponent(py.PropertyDeclaration, {
976
938
  name: "area",
977
939
  type: "float",
@@ -981,24 +943,21 @@ describe("Pydantic ecosystem emitters", () => {
981
943
  children: "return self.width ** 2"
982
944
  }, {
983
945
  fileName: import.meta.url,
984
- lineNumber: 717,
985
- columnNumber: 13
946
+ lineNumber: 602,
947
+ columnNumber: 11
986
948
  })];
987
949
  }
988
950
  }, {
989
951
  fileName: import.meta.url,
990
- lineNumber: 710,
991
- columnNumber: 11
952
+ lineNumber: 595,
953
+ columnNumber: 9
992
954
  });
993
955
  }
994
956
  }, {
995
957
  fileName: import.meta.url,
996
- lineNumber: 709,
997
- columnNumber: 9
998
- })], {
999
- externals: [pydanticModule]
1000
- });
1001
- expect(res).toRenderTo(d`
958
+ lineNumber: 594,
959
+ columnNumber: 7
960
+ })).toRenderTo(`
1002
961
  from pydantic import BaseModel
1003
962
  from pydantic import computed_field
1004
963
 
@@ -1011,12 +970,12 @@ describe("Pydantic ecosystem emitters", () => {
1011
970
  return self.width ** 2
1012
971
 
1013
972
 
1014
-
1015
973
  `);
1016
974
  });
1017
975
  it("emits computed_field on an instance method", () => {
1018
- const res = toSourceText([_$createComponent(py.SourceFile, {
976
+ expect(_$createComponent(TestOutput, {
1019
977
  path: "models.py",
978
+ externals: [pydanticModule],
1020
979
  get children() {
1021
980
  return _$createComponent(py.PydanticClassDeclaration, {
1022
981
  name: "Square",
@@ -1028,8 +987,8 @@ describe("Pydantic ecosystem emitters", () => {
1028
987
  type: "float"
1029
988
  }, {
1030
989
  fileName: import.meta.url,
1031
- lineNumber: 754,
1032
- columnNumber: 13
990
+ lineNumber: 633,
991
+ columnNumber: 11
1033
992
  }), _$createComponent(py.MethodDeclaration, {
1034
993
  name: "area",
1035
994
  get decorators() {
@@ -1039,24 +998,21 @@ describe("Pydantic ecosystem emitters", () => {
1039
998
  children: "return self.width ** 2"
1040
999
  }, {
1041
1000
  fileName: import.meta.url,
1042
- lineNumber: 760,
1043
- columnNumber: 13
1001
+ lineNumber: 639,
1002
+ columnNumber: 11
1044
1003
  })];
1045
1004
  }
1046
1005
  }, {
1047
1006
  fileName: import.meta.url,
1048
- lineNumber: 753,
1049
- columnNumber: 11
1007
+ lineNumber: 632,
1008
+ columnNumber: 9
1050
1009
  });
1051
1010
  }
1052
1011
  }, {
1053
1012
  fileName: import.meta.url,
1054
- lineNumber: 752,
1055
- columnNumber: 9
1056
- })], {
1057
- externals: [pydanticModule]
1058
- });
1059
- expect(res).toRenderTo(d`
1013
+ lineNumber: 631,
1014
+ columnNumber: 7
1015
+ })).toRenderTo(`
1060
1016
  from pydantic import BaseModel
1061
1017
  from pydantic import computed_field
1062
1018
 
@@ -1068,12 +1024,12 @@ describe("Pydantic ecosystem emitters", () => {
1068
1024
  return self.width ** 2
1069
1025
 
1070
1026
 
1071
-
1072
1027
  `);
1073
1028
  });
1074
1029
  it("emits model_validator above classmethod", () => {
1075
- const res = toSourceText([_$createComponent(py.SourceFile, {
1030
+ expect(_$createComponent(TestOutput, {
1076
1031
  path: "models.py",
1032
+ externals: [pydanticModule],
1077
1033
  get children() {
1078
1034
  return _$createComponent(py.PydanticClassDeclaration, {
1079
1035
  name: "Bag",
@@ -1085,8 +1041,8 @@ describe("Pydantic ecosystem emitters", () => {
1085
1041
  type: "list"
1086
1042
  }, {
1087
1043
  fileName: import.meta.url,
1088
- lineNumber: 796,
1089
- columnNumber: 13
1044
+ lineNumber: 669,
1045
+ columnNumber: 11
1090
1046
  }), _$createComponent(py.ClassMethodDeclaration, {
1091
1047
  name: "ensure_items",
1092
1048
  get decorators() {
@@ -1100,24 +1056,21 @@ describe("Pydantic ecosystem emitters", () => {
1100
1056
  children: "return data"
1101
1057
  }, {
1102
1058
  fileName: import.meta.url,
1103
- lineNumber: 802,
1104
- columnNumber: 13
1059
+ lineNumber: 675,
1060
+ columnNumber: 11
1105
1061
  })];
1106
1062
  }
1107
1063
  }, {
1108
1064
  fileName: import.meta.url,
1109
- lineNumber: 795,
1110
- columnNumber: 11
1065
+ lineNumber: 668,
1066
+ columnNumber: 9
1111
1067
  });
1112
1068
  }
1113
1069
  }, {
1114
1070
  fileName: import.meta.url,
1115
- lineNumber: 794,
1116
- columnNumber: 9
1117
- })], {
1118
- externals: [pydanticModule]
1119
- });
1120
- expect(res).toRenderTo(d`
1071
+ lineNumber: 667,
1072
+ columnNumber: 7
1073
+ })).toRenderTo(`
1121
1074
  from pydantic import BaseModel
1122
1075
  from pydantic import model_validator
1123
1076
 
@@ -1130,7 +1083,6 @@ describe("Pydantic ecosystem emitters", () => {
1130
1083
  return data
1131
1084
 
1132
1085
 
1133
-
1134
1086
  `);
1135
1087
  });
1136
1088
  });