@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.
- package/dist/dev/src/components/SourceFile.js +44 -32
- package/dist/dev/src/components/SourceFile.js.map +1 -1
- package/dist/dev/test/callsignatures.test.js +471 -297
- package/dist/dev/test/callsignatures.test.js.map +1 -1
- package/dist/dev/test/class-method-declaration.test.js +21 -10
- package/dist/dev/test/class-method-declaration.test.js.map +1 -1
- package/dist/dev/test/classdeclarations.test.js +459 -393
- package/dist/dev/test/classdeclarations.test.js.map +1 -1
- package/dist/dev/test/classinstantiations.test.js +201 -168
- package/dist/dev/test/classinstantiations.test.js.map +1 -1
- package/dist/dev/test/constructordeclaration.test.js +22 -11
- package/dist/dev/test/constructordeclaration.test.js.map +1 -1
- package/dist/dev/test/dataclassdeclarations.test.js +322 -368
- package/dist/dev/test/dataclassdeclarations.test.js.map +1 -1
- package/dist/dev/test/decoratorlist.test.js +96 -49
- package/dist/dev/test/decoratorlist.test.js.map +1 -1
- package/dist/dev/test/dundermethoddeclaration.test.js +22 -11
- package/dist/dev/test/dundermethoddeclaration.test.js.map +1 -1
- package/dist/dev/test/enums.test.js +218 -184
- package/dist/dev/test/enums.test.js.map +1 -1
- package/dist/dev/test/externals.test.js +57 -45
- package/dist/dev/test/externals.test.js.map +1 -1
- package/dist/dev/test/factories.test.js +124 -50
- package/dist/dev/test/factories.test.js.map +1 -1
- package/dist/dev/test/functioncallexpressions.test.js +199 -164
- package/dist/dev/test/functioncallexpressions.test.js.map +1 -1
- package/dist/dev/test/functiondeclaration.test.js +439 -272
- package/dist/dev/test/functiondeclaration.test.js.map +1 -1
- package/dist/dev/test/imports.test.js +273 -221
- package/dist/dev/test/imports.test.js.map +1 -1
- package/dist/dev/test/memberexpressions.test.js +1237 -972
- package/dist/dev/test/memberexpressions.test.js.map +1 -1
- package/dist/dev/test/methoddeclaration.test.js +142 -78
- package/dist/dev/test/methoddeclaration.test.js.map +1 -1
- package/dist/dev/test/namepolicies.test.js +130 -94
- package/dist/dev/test/namepolicies.test.js.map +1 -1
- package/dist/dev/test/propertydeclaration.test.js +88 -59
- package/dist/dev/test/propertydeclaration.test.js.map +1 -1
- package/dist/dev/test/pydanticclassdeclarations.test.js +299 -347
- package/dist/dev/test/pydanticclassdeclarations.test.js.map +1 -1
- package/dist/dev/test/pydocs.test.js +888 -715
- package/dist/dev/test/pydocs.test.js.map +1 -1
- package/dist/dev/test/references.test.js +42 -35
- package/dist/dev/test/references.test.js.map +1 -1
- package/dist/dev/test/sourcefiles.test.js +1109 -841
- package/dist/dev/test/sourcefiles.test.js.map +1 -1
- package/dist/dev/test/staticmethoddeclaration.test.js +21 -10
- package/dist/dev/test/staticmethoddeclaration.test.js.map +1 -1
- package/dist/dev/test/type-checking-imports.test.js +408 -359
- package/dist/dev/test/type-checking-imports.test.js.map +1 -1
- package/dist/dev/test/typereference.test.js +55 -40
- package/dist/dev/test/typereference.test.js.map +1 -1
- package/dist/dev/test/uniontypeexpression.test.js +222 -146
- package/dist/dev/test/uniontypeexpression.test.js.map +1 -1
- package/dist/dev/test/utils.js +39 -77
- package/dist/dev/test/utils.js.map +1 -1
- package/dist/dev/test/values.test.js +237 -101
- package/dist/dev/test/values.test.js.map +1 -1
- package/dist/dev/test/variables.test.js +321 -203
- package/dist/dev/test/variables.test.js.map +1 -1
- package/dist/dev/test/vitest.setup.js +2 -0
- package/dist/dev/test/vitest.setup.js.map +1 -0
- package/dist/src/components/SourceFile.d.ts +2 -2
- package/dist/src/components/SourceFile.d.ts.map +1 -1
- package/dist/src/components/SourceFile.js +12 -0
- package/dist/src/components/SourceFile.js.map +1 -1
- package/dist/test/callsignatures.test.js +346 -272
- package/dist/test/callsignatures.test.js.map +1 -1
- package/dist/test/class-method-declaration.test.js +7 -4
- package/dist/test/class-method-declaration.test.js.map +1 -1
- package/dist/test/classdeclarations.test.js +302 -288
- package/dist/test/classdeclarations.test.js.map +1 -1
- package/dist/test/classinstantiations.test.js +112 -103
- package/dist/test/classinstantiations.test.js.map +1 -1
- package/dist/test/constructordeclaration.test.js +7 -4
- package/dist/test/constructordeclaration.test.js.map +1 -1
- package/dist/test/dataclassdeclarations.test.js +134 -184
- package/dist/test/dataclassdeclarations.test.js.map +1 -1
- package/dist/test/decoratorlist.test.js +59 -36
- package/dist/test/decoratorlist.test.js.map +1 -1
- package/dist/test/dundermethoddeclaration.test.js +7 -4
- package/dist/test/dundermethoddeclaration.test.js.map +1 -1
- package/dist/test/enums.test.js +161 -159
- package/dist/test/enums.test.js.map +1 -1
- package/dist/test/externals.test.js +24 -24
- package/dist/test/externals.test.js.map +1 -1
- package/dist/test/factories.test.js +75 -33
- package/dist/test/factories.test.js.map +1 -1
- package/dist/test/functioncallexpressions.test.js +117 -106
- package/dist/test/functioncallexpressions.test.js.map +1 -1
- package/dist/test/functiondeclaration.test.js +247 -180
- package/dist/test/functiondeclaration.test.js.map +1 -1
- package/dist/test/imports.test.js +171 -143
- package/dist/test/imports.test.js.map +1 -1
- package/dist/test/memberexpressions.test.js +582 -453
- package/dist/test/memberexpressions.test.js.map +1 -1
- package/dist/test/methoddeclaration.test.js +66 -46
- package/dist/test/methoddeclaration.test.js.map +1 -1
- package/dist/test/namepolicies.test.js +90 -78
- package/dist/test/namepolicies.test.js.map +1 -1
- package/dist/test/propertydeclaration.test.js +25 -20
- package/dist/test/propertydeclaration.test.js.map +1 -1
- package/dist/test/pydanticclassdeclarations.test.js +134 -190
- package/dist/test/pydanticclassdeclarations.test.js.map +1 -1
- package/dist/test/pydocs.test.js +573 -532
- package/dist/test/pydocs.test.js.map +1 -1
- package/dist/test/references.test.js +31 -28
- package/dist/test/references.test.js.map +1 -1
- package/dist/test/sourcefiles.test.js +700 -580
- package/dist/test/sourcefiles.test.js.map +1 -1
- package/dist/test/staticmethoddeclaration.test.js +7 -4
- package/dist/test/staticmethoddeclaration.test.js.map +1 -1
- package/dist/test/type-checking-imports.test.js +297 -284
- package/dist/test/type-checking-imports.test.js.map +1 -1
- package/dist/test/typereference.test.js +29 -22
- package/dist/test/typereference.test.js.map +1 -1
- package/dist/test/uniontypeexpression.test.js +124 -88
- package/dist/test/uniontypeexpression.test.js.map +1 -1
- package/dist/test/utils.d.ts +10 -17
- package/dist/test/utils.d.ts.map +1 -1
- package/dist/test/utils.js +32 -74
- package/dist/test/utils.js.map +1 -1
- package/dist/test/values.test.js +135 -67
- package/dist/test/values.test.js.map +1 -1
- package/dist/test/variables.test.js +201 -151
- package/dist/test/variables.test.js.map +1 -1
- package/dist/test/vitest.setup.d.ts +2 -0
- package/dist/test/vitest.setup.d.ts.map +1 -0
- package/dist/test/vitest.setup.js +2 -0
- package/dist/test/vitest.setup.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/docs/api/components/SourceFile.md +20 -8
- package/package.json +2 -2
- package/src/components/SourceFile.tsx +6 -1
- package/temp/api.json +16 -2
- package/test/callsignatures.test.tsx +309 -283
- package/test/class-method-declaration.test.tsx +3 -4
- package/test/classdeclarations.test.tsx +263 -248
- package/test/classinstantiations.test.tsx +115 -109
- package/test/constructordeclaration.test.tsx +9 -6
- package/test/dataclassdeclarations.test.tsx +243 -361
- package/test/decoratorlist.test.tsx +78 -59
- package/test/dundermethoddeclaration.test.tsx +3 -4
- package/test/enums.test.tsx +65 -81
- package/test/externals.test.tsx +25 -25
- package/test/factories.test.tsx +64 -22
- package/test/functioncallexpressions.test.tsx +123 -109
- package/test/functiondeclaration.test.tsx +209 -148
- package/test/imports.test.tsx +119 -91
- package/test/memberexpressions.test.tsx +265 -207
- package/test/methoddeclaration.test.tsx +84 -63
- package/test/namepolicies.test.tsx +69 -69
- package/test/propertydeclaration.test.tsx +7 -8
- package/test/pydanticclassdeclarations.test.tsx +355 -487
- package/test/pydocs.test.tsx +531 -579
- package/test/references.test.tsx +24 -23
- package/test/sourcefiles.test.tsx +527 -492
- package/test/staticmethoddeclaration.test.tsx +3 -4
- package/test/type-checking-imports.test.tsx +206 -218
- package/test/typereference.test.tsx +15 -12
- package/test/uniontypeexpression.test.tsx +74 -61
- package/test/utils.tsx +26 -110
- package/test/values.test.tsx +82 -32
- package/test/variables.test.tsx +162 -142
- package/test/vitest.setup.ts +1 -0
- 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 {
|
|
6
|
+
import { TestOutput, TestOutputDirectory } from "./utils.js";
|
|
8
7
|
describe("PydanticClassDeclaration", () => {
|
|
9
8
|
it("forwards class-level decorators above `class`", () => {
|
|
10
|
-
|
|
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:
|
|
27
|
-
columnNumber:
|
|
26
|
+
lineNumber: 19,
|
|
27
|
+
columnNumber: 11
|
|
28
28
|
});
|
|
29
29
|
}
|
|
30
30
|
}, {
|
|
31
31
|
fileName: import.meta.url,
|
|
32
|
-
lineNumber:
|
|
33
|
-
columnNumber:
|
|
32
|
+
lineNumber: 15,
|
|
33
|
+
columnNumber: 9
|
|
34
34
|
});
|
|
35
35
|
}
|
|
36
36
|
}, {
|
|
37
37
|
fileName: import.meta.url,
|
|
38
|
-
lineNumber:
|
|
39
|
-
columnNumber:
|
|
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
|
-
|
|
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:
|
|
70
|
-
columnNumber:
|
|
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:
|
|
81
|
-
columnNumber:
|
|
77
|
+
lineNumber: 51,
|
|
78
|
+
columnNumber: 11
|
|
82
79
|
})];
|
|
83
80
|
}
|
|
84
81
|
}, {
|
|
85
82
|
fileName: import.meta.url,
|
|
86
|
-
lineNumber:
|
|
87
|
-
columnNumber:
|
|
83
|
+
lineNumber: 44,
|
|
84
|
+
columnNumber: 9
|
|
88
85
|
});
|
|
89
86
|
}
|
|
90
87
|
}, {
|
|
91
88
|
fileName: import.meta.url,
|
|
92
|
-
lineNumber:
|
|
93
|
-
columnNumber:
|
|
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
|
-
|
|
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:
|
|
128
|
-
columnNumber:
|
|
121
|
+
lineNumber: 79,
|
|
122
|
+
columnNumber: 13
|
|
129
123
|
});
|
|
130
124
|
}
|
|
131
125
|
}, {
|
|
132
126
|
fileName: import.meta.url,
|
|
133
|
-
lineNumber:
|
|
134
|
-
columnNumber:
|
|
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:
|
|
147
|
-
columnNumber:
|
|
140
|
+
lineNumber: 87,
|
|
141
|
+
columnNumber: 13
|
|
148
142
|
});
|
|
149
143
|
}
|
|
150
144
|
}, {
|
|
151
145
|
fileName: import.meta.url,
|
|
152
|
-
lineNumber:
|
|
153
|
-
columnNumber:
|
|
146
|
+
lineNumber: 86,
|
|
147
|
+
columnNumber: 11
|
|
154
148
|
})];
|
|
155
149
|
}
|
|
156
150
|
}, {
|
|
157
151
|
fileName: import.meta.url,
|
|
158
|
-
lineNumber:
|
|
159
|
-
columnNumber:
|
|
152
|
+
lineNumber: 77,
|
|
153
|
+
columnNumber: 9
|
|
160
154
|
});
|
|
161
155
|
}
|
|
162
156
|
}, {
|
|
163
157
|
fileName: import.meta.url,
|
|
164
|
-
lineNumber:
|
|
165
|
-
columnNumber:
|
|
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
|
-
|
|
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:
|
|
197
|
-
columnNumber:
|
|
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:
|
|
207
|
-
columnNumber:
|
|
197
|
+
lineNumber: 124,
|
|
198
|
+
columnNumber: 19
|
|
208
199
|
});
|
|
209
200
|
}
|
|
210
201
|
}, {
|
|
211
202
|
fileName: import.meta.url,
|
|
212
|
-
lineNumber:
|
|
213
|
-
columnNumber:
|
|
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:
|
|
224
|
-
columnNumber:
|
|
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:
|
|
233
|
-
columnNumber:
|
|
223
|
+
lineNumber: 132,
|
|
224
|
+
columnNumber: 11
|
|
234
225
|
})];
|
|
235
226
|
}
|
|
236
227
|
}, {
|
|
237
228
|
fileName: import.meta.url,
|
|
238
|
-
lineNumber:
|
|
239
|
-
columnNumber:
|
|
229
|
+
lineNumber: 114,
|
|
230
|
+
columnNumber: 9
|
|
240
231
|
});
|
|
241
232
|
}
|
|
242
233
|
}, {
|
|
243
234
|
fileName: import.meta.url,
|
|
244
|
-
lineNumber:
|
|
245
|
-
columnNumber:
|
|
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:
|
|
257
|
+
lineNumber: 158,
|
|
271
258
|
columnNumber: 34
|
|
272
259
|
})];
|
|
273
260
|
}
|
|
274
261
|
}, {
|
|
275
262
|
fileName: import.meta.url,
|
|
276
|
-
lineNumber:
|
|
263
|
+
lineNumber: 158,
|
|
277
264
|
columnNumber: 7
|
|
278
265
|
});
|
|
279
|
-
|
|
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:
|
|
294
|
-
columnNumber:
|
|
281
|
+
lineNumber: 163,
|
|
282
|
+
columnNumber: 11
|
|
295
283
|
});
|
|
296
284
|
}
|
|
297
285
|
}, {
|
|
298
286
|
fileName: import.meta.url,
|
|
299
|
-
lineNumber:
|
|
300
|
-
columnNumber:
|
|
287
|
+
lineNumber: 162,
|
|
288
|
+
columnNumber: 9
|
|
301
289
|
});
|
|
302
290
|
}
|
|
303
291
|
}, {
|
|
304
292
|
fileName: import.meta.url,
|
|
305
|
-
lineNumber:
|
|
306
|
-
columnNumber:
|
|
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
|
-
|
|
327
|
-
|
|
310
|
+
expect(_$createComponent(TestOutputDirectory, {
|
|
311
|
+
externals: [pydanticModule],
|
|
328
312
|
get children() {
|
|
329
|
-
return _$createComponent(py.
|
|
330
|
-
|
|
331
|
-
refkey: modelRef,
|
|
313
|
+
return [_$createComponent(py.SourceFile, {
|
|
314
|
+
path: "models.py",
|
|
332
315
|
get children() {
|
|
333
|
-
return _$createComponent(py.
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
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:
|
|
341
|
-
columnNumber:
|
|
333
|
+
lineNumber: 192,
|
|
334
|
+
columnNumber: 11
|
|
342
335
|
});
|
|
343
336
|
}
|
|
344
337
|
}, {
|
|
345
338
|
fileName: import.meta.url,
|
|
346
|
-
lineNumber:
|
|
347
|
-
columnNumber:
|
|
348
|
-
})
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
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:
|
|
368
|
-
columnNumber:
|
|
369
|
-
});
|
|
360
|
+
lineNumber: 201,
|
|
361
|
+
columnNumber: 9
|
|
362
|
+
})];
|
|
370
363
|
}
|
|
371
364
|
}, {
|
|
372
365
|
fileName: import.meta.url,
|
|
373
|
-
lineNumber:
|
|
374
|
-
columnNumber:
|
|
375
|
-
})
|
|
376
|
-
externals: [pydanticModule]
|
|
377
|
-
});
|
|
378
|
-
assertFileContents(res, {
|
|
366
|
+
lineNumber: 190,
|
|
367
|
+
columnNumber: 7
|
|
368
|
+
})).toRenderTo({
|
|
379
369
|
"models.py": `
|
|
380
|
-
|
|
370
|
+
from pydantic import BaseModel
|
|
381
371
|
|
|
382
372
|
|
|
383
|
-
|
|
384
|
-
|
|
373
|
+
class User(BaseModel):
|
|
374
|
+
id: int
|
|
385
375
|
|
|
386
|
-
|
|
376
|
+
`,
|
|
387
377
|
"service.py": `
|
|
388
|
-
|
|
378
|
+
from typing import TYPE_CHECKING
|
|
389
379
|
|
|
390
|
-
|
|
391
|
-
|
|
380
|
+
if TYPE_CHECKING:
|
|
381
|
+
from models import User
|
|
392
382
|
|
|
393
383
|
|
|
394
|
-
|
|
395
|
-
|
|
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
|
-
|
|
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:
|
|
418
|
-
columnNumber:
|
|
408
|
+
lineNumber: 243,
|
|
409
|
+
columnNumber: 11
|
|
419
410
|
});
|
|
420
411
|
}
|
|
421
412
|
}, {
|
|
422
413
|
fileName: import.meta.url,
|
|
423
|
-
lineNumber:
|
|
424
|
-
columnNumber:
|
|
414
|
+
lineNumber: 237,
|
|
415
|
+
columnNumber: 9
|
|
425
416
|
});
|
|
426
417
|
}
|
|
427
418
|
}, {
|
|
428
419
|
fileName: import.meta.url,
|
|
429
|
-
lineNumber:
|
|
430
|
-
columnNumber:
|
|
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
|
-
|
|
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:
|
|
466
|
-
columnNumber:
|
|
453
|
+
lineNumber: 276,
|
|
454
|
+
columnNumber: 11
|
|
467
455
|
});
|
|
468
456
|
}
|
|
469
457
|
}, {
|
|
470
458
|
fileName: import.meta.url,
|
|
471
|
-
lineNumber:
|
|
472
|
-
columnNumber:
|
|
459
|
+
lineNumber: 268,
|
|
460
|
+
columnNumber: 9
|
|
473
461
|
});
|
|
474
462
|
}
|
|
475
463
|
}, {
|
|
476
464
|
fileName: import.meta.url,
|
|
477
|
-
lineNumber:
|
|
478
|
-
columnNumber:
|
|
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
|
-
|
|
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:
|
|
509
|
-
columnNumber:
|
|
493
|
+
lineNumber: 301,
|
|
494
|
+
columnNumber: 9
|
|
510
495
|
});
|
|
511
496
|
}
|
|
512
497
|
}, {
|
|
513
498
|
fileName: import.meta.url,
|
|
514
|
-
lineNumber:
|
|
515
|
-
columnNumber:
|
|
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
|
-
|
|
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:
|
|
546
|
-
columnNumber:
|
|
527
|
+
lineNumber: 324,
|
|
528
|
+
columnNumber: 9
|
|
547
529
|
});
|
|
548
530
|
}
|
|
549
531
|
}, {
|
|
550
532
|
fileName: import.meta.url,
|
|
551
|
-
lineNumber:
|
|
552
|
-
columnNumber:
|
|
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
|
-
|
|
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:
|
|
584
|
-
columnNumber:
|
|
562
|
+
lineNumber: 352,
|
|
563
|
+
columnNumber: 11
|
|
585
564
|
});
|
|
586
565
|
}
|
|
587
566
|
}, {
|
|
588
567
|
fileName: import.meta.url,
|
|
589
|
-
lineNumber:
|
|
590
|
-
columnNumber:
|
|
568
|
+
lineNumber: 351,
|
|
569
|
+
columnNumber: 9
|
|
591
570
|
});
|
|
592
571
|
}
|
|
593
572
|
}, {
|
|
594
573
|
fileName: import.meta.url,
|
|
595
|
-
lineNumber:
|
|
596
|
-
columnNumber:
|
|
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
|
-
|
|
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:
|
|
626
|
-
columnNumber:
|
|
601
|
+
lineNumber: 379,
|
|
602
|
+
columnNumber: 9
|
|
627
603
|
});
|
|
628
604
|
}
|
|
629
605
|
}, {
|
|
630
606
|
fileName: import.meta.url,
|
|
631
|
-
lineNumber:
|
|
632
|
-
columnNumber:
|
|
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
|
-
|
|
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:
|
|
659
|
-
columnNumber:
|
|
631
|
+
lineNumber: 400,
|
|
632
|
+
columnNumber: 9
|
|
660
633
|
});
|
|
661
634
|
}
|
|
662
635
|
}, {
|
|
663
636
|
fileName: import.meta.url,
|
|
664
|
-
lineNumber:
|
|
665
|
-
columnNumber:
|
|
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
|
-
|
|
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:
|
|
694
|
-
columnNumber:
|
|
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:
|
|
709
|
-
columnNumber:
|
|
678
|
+
lineNumber: 427,
|
|
679
|
+
columnNumber: 11
|
|
710
680
|
})];
|
|
711
681
|
}
|
|
712
682
|
}, {
|
|
713
683
|
fileName: import.meta.url,
|
|
714
|
-
lineNumber:
|
|
715
|
-
columnNumber:
|
|
684
|
+
lineNumber: 420,
|
|
685
|
+
columnNumber: 9
|
|
716
686
|
});
|
|
717
687
|
}
|
|
718
688
|
}, {
|
|
719
689
|
fileName: import.meta.url,
|
|
720
|
-
lineNumber:
|
|
721
|
-
columnNumber:
|
|
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
|
-
|
|
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:
|
|
762
|
-
columnNumber:
|
|
728
|
+
lineNumber: 462,
|
|
729
|
+
columnNumber: 9
|
|
763
730
|
});
|
|
764
731
|
}
|
|
765
732
|
}, {
|
|
766
733
|
fileName: import.meta.url,
|
|
767
|
-
lineNumber:
|
|
768
|
-
columnNumber:
|
|
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
|
-
|
|
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:
|
|
802
|
-
columnNumber:
|
|
765
|
+
lineNumber: 489,
|
|
766
|
+
columnNumber: 11
|
|
803
767
|
});
|
|
804
768
|
}
|
|
805
769
|
}, {
|
|
806
770
|
fileName: import.meta.url,
|
|
807
|
-
lineNumber:
|
|
808
|
-
columnNumber:
|
|
771
|
+
lineNumber: 488,
|
|
772
|
+
columnNumber: 9
|
|
809
773
|
});
|
|
810
774
|
}
|
|
811
775
|
}, {
|
|
812
776
|
fileName: import.meta.url,
|
|
813
|
-
lineNumber:
|
|
814
|
-
columnNumber:
|
|
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
|
-
|
|
834
|
-
|
|
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.
|
|
846
|
-
|
|
847
|
-
get
|
|
848
|
-
return [_$createComponent(py.
|
|
849
|
-
|
|
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:
|
|
856
|
-
columnNumber:
|
|
857
|
-
})
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
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:
|
|
864
|
-
columnNumber:
|
|
865
|
-
})
|
|
832
|
+
lineNumber: 520,
|
|
833
|
+
columnNumber: 11
|
|
834
|
+
});
|
|
866
835
|
}
|
|
867
836
|
}, {
|
|
868
837
|
fileName: import.meta.url,
|
|
869
|
-
lineNumber:
|
|
870
|
-
columnNumber:
|
|
838
|
+
lineNumber: 516,
|
|
839
|
+
columnNumber: 9
|
|
871
840
|
});
|
|
872
841
|
}
|
|
873
842
|
}, {
|
|
874
843
|
fileName: import.meta.url,
|
|
875
|
-
lineNumber:
|
|
876
|
-
columnNumber:
|
|
877
|
-
})
|
|
878
|
-
|
|
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
|
-
|
|
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:
|
|
905
|
-
columnNumber:
|
|
872
|
+
lineNumber: 553,
|
|
873
|
+
columnNumber: 9
|
|
906
874
|
});
|
|
907
875
|
}
|
|
908
876
|
}, {
|
|
909
877
|
fileName: import.meta.url,
|
|
910
|
-
lineNumber:
|
|
911
|
-
columnNumber:
|
|
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
|
-
|
|
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:
|
|
939
|
-
columnNumber:
|
|
903
|
+
lineNumber: 575,
|
|
904
|
+
columnNumber: 9
|
|
940
905
|
});
|
|
941
906
|
}
|
|
942
907
|
}, {
|
|
943
908
|
fileName: import.meta.url,
|
|
944
|
-
lineNumber:
|
|
945
|
-
columnNumber:
|
|
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
|
-
|
|
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:
|
|
974
|
-
columnNumber:
|
|
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:
|
|
985
|
-
columnNumber:
|
|
946
|
+
lineNumber: 602,
|
|
947
|
+
columnNumber: 11
|
|
986
948
|
})];
|
|
987
949
|
}
|
|
988
950
|
}, {
|
|
989
951
|
fileName: import.meta.url,
|
|
990
|
-
lineNumber:
|
|
991
|
-
columnNumber:
|
|
952
|
+
lineNumber: 595,
|
|
953
|
+
columnNumber: 9
|
|
992
954
|
});
|
|
993
955
|
}
|
|
994
956
|
}, {
|
|
995
957
|
fileName: import.meta.url,
|
|
996
|
-
lineNumber:
|
|
997
|
-
columnNumber:
|
|
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
|
-
|
|
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:
|
|
1032
|
-
columnNumber:
|
|
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:
|
|
1043
|
-
columnNumber:
|
|
1001
|
+
lineNumber: 639,
|
|
1002
|
+
columnNumber: 11
|
|
1044
1003
|
})];
|
|
1045
1004
|
}
|
|
1046
1005
|
}, {
|
|
1047
1006
|
fileName: import.meta.url,
|
|
1048
|
-
lineNumber:
|
|
1049
|
-
columnNumber:
|
|
1007
|
+
lineNumber: 632,
|
|
1008
|
+
columnNumber: 9
|
|
1050
1009
|
});
|
|
1051
1010
|
}
|
|
1052
1011
|
}, {
|
|
1053
1012
|
fileName: import.meta.url,
|
|
1054
|
-
lineNumber:
|
|
1055
|
-
columnNumber:
|
|
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
|
-
|
|
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:
|
|
1089
|
-
columnNumber:
|
|
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:
|
|
1104
|
-
columnNumber:
|
|
1059
|
+
lineNumber: 675,
|
|
1060
|
+
columnNumber: 11
|
|
1105
1061
|
})];
|
|
1106
1062
|
}
|
|
1107
1063
|
}, {
|
|
1108
1064
|
fileName: import.meta.url,
|
|
1109
|
-
lineNumber:
|
|
1110
|
-
columnNumber:
|
|
1065
|
+
lineNumber: 668,
|
|
1066
|
+
columnNumber: 9
|
|
1111
1067
|
});
|
|
1112
1068
|
}
|
|
1113
1069
|
}, {
|
|
1114
1070
|
fileName: import.meta.url,
|
|
1115
|
-
lineNumber:
|
|
1116
|
-
columnNumber:
|
|
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
|
});
|