@alloy-js/python 0.5.0-dev.1 → 0.5.0

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 (217) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/dev/src/components/CallSignature.js +2 -2
  3. package/dist/dev/src/components/CallSignature.js.map +1 -1
  4. package/dist/dev/src/components/ConstructorDeclaration.js +1 -1
  5. package/dist/dev/src/components/ConstructorDeclaration.js.map +1 -1
  6. package/dist/dev/src/components/DataclassDeclaration.js +5 -5
  7. package/dist/dev/src/components/DataclassDeclaration.js.map +1 -1
  8. package/dist/dev/src/components/FunctionBase.js +9 -9
  9. package/dist/dev/src/components/FunctionBase.js.map +1 -1
  10. package/dist/dev/src/components/PropertyDeclaration.js +8 -8
  11. package/dist/dev/src/components/PropertyDeclaration.js.map +1 -1
  12. package/dist/dev/src/components/PyDoc.js +64 -64
  13. package/dist/dev/src/components/PyDoc.js.map +1 -1
  14. package/dist/dev/src/components/PydanticClassDeclaration.js +5 -5
  15. package/dist/dev/src/components/PydanticClassDeclaration.js.map +1 -1
  16. package/dist/dev/src/components/SourceFile.js +44 -32
  17. package/dist/dev/src/components/SourceFile.js.map +1 -1
  18. package/dist/dev/src/symbols/python-output-symbol.js.map +1 -1
  19. package/dist/dev/test/callsignatures.test.js +471 -297
  20. package/dist/dev/test/callsignatures.test.js.map +1 -1
  21. package/dist/dev/test/class-method-declaration.test.js +21 -10
  22. package/dist/dev/test/class-method-declaration.test.js.map +1 -1
  23. package/dist/dev/test/classdeclarations.test.js +459 -393
  24. package/dist/dev/test/classdeclarations.test.js.map +1 -1
  25. package/dist/dev/test/classinstantiations.test.js +201 -168
  26. package/dist/dev/test/classinstantiations.test.js.map +1 -1
  27. package/dist/dev/test/constructordeclaration.test.js +22 -11
  28. package/dist/dev/test/constructordeclaration.test.js.map +1 -1
  29. package/dist/dev/test/dataclassdeclarations.test.js +322 -368
  30. package/dist/dev/test/dataclassdeclarations.test.js.map +1 -1
  31. package/dist/dev/test/decoratorlist.test.js +96 -49
  32. package/dist/dev/test/decoratorlist.test.js.map +1 -1
  33. package/dist/dev/test/dundermethoddeclaration.test.js +22 -11
  34. package/dist/dev/test/dundermethoddeclaration.test.js.map +1 -1
  35. package/dist/dev/test/enums.test.js +218 -184
  36. package/dist/dev/test/enums.test.js.map +1 -1
  37. package/dist/dev/test/externals.test.js +57 -45
  38. package/dist/dev/test/externals.test.js.map +1 -1
  39. package/dist/dev/test/factories.test.js +124 -50
  40. package/dist/dev/test/factories.test.js.map +1 -1
  41. package/dist/dev/test/functioncallexpressions.test.js +199 -164
  42. package/dist/dev/test/functioncallexpressions.test.js.map +1 -1
  43. package/dist/dev/test/functiondeclaration.test.js +439 -272
  44. package/dist/dev/test/functiondeclaration.test.js.map +1 -1
  45. package/dist/dev/test/imports.test.js +273 -221
  46. package/dist/dev/test/imports.test.js.map +1 -1
  47. package/dist/dev/test/memberexpressions.test.js +1237 -972
  48. package/dist/dev/test/memberexpressions.test.js.map +1 -1
  49. package/dist/dev/test/methoddeclaration.test.js +142 -78
  50. package/dist/dev/test/methoddeclaration.test.js.map +1 -1
  51. package/dist/dev/test/namepolicies.test.js +130 -94
  52. package/dist/dev/test/namepolicies.test.js.map +1 -1
  53. package/dist/dev/test/propertydeclaration.test.js +88 -59
  54. package/dist/dev/test/propertydeclaration.test.js.map +1 -1
  55. package/dist/dev/test/pydanticclassdeclarations.test.js +299 -347
  56. package/dist/dev/test/pydanticclassdeclarations.test.js.map +1 -1
  57. package/dist/dev/test/pydocs.test.js +888 -715
  58. package/dist/dev/test/pydocs.test.js.map +1 -1
  59. package/dist/dev/test/references.test.js +42 -35
  60. package/dist/dev/test/references.test.js.map +1 -1
  61. package/dist/dev/test/sourcefiles.test.js +1109 -841
  62. package/dist/dev/test/sourcefiles.test.js.map +1 -1
  63. package/dist/dev/test/staticmethoddeclaration.test.js +21 -10
  64. package/dist/dev/test/staticmethoddeclaration.test.js.map +1 -1
  65. package/dist/dev/test/type-checking-imports.test.js +408 -359
  66. package/dist/dev/test/type-checking-imports.test.js.map +1 -1
  67. package/dist/dev/test/typereference.test.js +55 -40
  68. package/dist/dev/test/typereference.test.js.map +1 -1
  69. package/dist/dev/test/uniontypeexpression.test.js +222 -146
  70. package/dist/dev/test/uniontypeexpression.test.js.map +1 -1
  71. package/dist/dev/test/utils.js +39 -77
  72. package/dist/dev/test/utils.js.map +1 -1
  73. package/dist/dev/test/values.test.js +237 -101
  74. package/dist/dev/test/values.test.js.map +1 -1
  75. package/dist/dev/test/variables.test.js +321 -203
  76. package/dist/dev/test/variables.test.js.map +1 -1
  77. package/dist/dev/test/vitest.setup.js +2 -0
  78. package/dist/dev/test/vitest.setup.js.map +1 -0
  79. package/dist/src/components/CallSignature.d.ts.map +1 -1
  80. package/dist/src/components/CallSignature.js.map +1 -1
  81. package/dist/src/components/ConstructorDeclaration.d.ts.map +1 -1
  82. package/dist/src/components/ConstructorDeclaration.js.map +1 -1
  83. package/dist/src/components/DataclassDeclaration.d.ts.map +1 -1
  84. package/dist/src/components/DataclassDeclaration.js.map +1 -1
  85. package/dist/src/components/FunctionBase.d.ts.map +1 -1
  86. package/dist/src/components/FunctionBase.js.map +1 -1
  87. package/dist/src/components/PropertyDeclaration.d.ts.map +1 -1
  88. package/dist/src/components/PropertyDeclaration.js.map +1 -1
  89. package/dist/src/components/PyDoc.d.ts.map +1 -1
  90. package/dist/src/components/PyDoc.js.map +1 -1
  91. package/dist/src/components/PydanticClassDeclaration.d.ts.map +1 -1
  92. package/dist/src/components/PydanticClassDeclaration.js.map +1 -1
  93. package/dist/src/components/SourceFile.d.ts +2 -2
  94. package/dist/src/components/SourceFile.d.ts.map +1 -1
  95. package/dist/src/components/SourceFile.js +12 -0
  96. package/dist/src/components/SourceFile.js.map +1 -1
  97. package/dist/src/symbols/python-output-symbol.d.ts.map +1 -1
  98. package/dist/src/symbols/python-output-symbol.js.map +1 -1
  99. package/dist/test/callsignatures.test.js +346 -272
  100. package/dist/test/callsignatures.test.js.map +1 -1
  101. package/dist/test/class-method-declaration.test.js +7 -4
  102. package/dist/test/class-method-declaration.test.js.map +1 -1
  103. package/dist/test/classdeclarations.test.js +302 -288
  104. package/dist/test/classdeclarations.test.js.map +1 -1
  105. package/dist/test/classinstantiations.test.js +112 -103
  106. package/dist/test/classinstantiations.test.js.map +1 -1
  107. package/dist/test/constructordeclaration.test.js +7 -4
  108. package/dist/test/constructordeclaration.test.js.map +1 -1
  109. package/dist/test/dataclassdeclarations.test.js +134 -184
  110. package/dist/test/dataclassdeclarations.test.js.map +1 -1
  111. package/dist/test/decoratorlist.test.js +59 -36
  112. package/dist/test/decoratorlist.test.js.map +1 -1
  113. package/dist/test/dundermethoddeclaration.test.js +7 -4
  114. package/dist/test/dundermethoddeclaration.test.js.map +1 -1
  115. package/dist/test/enums.test.js +161 -159
  116. package/dist/test/enums.test.js.map +1 -1
  117. package/dist/test/externals.test.js +24 -24
  118. package/dist/test/externals.test.js.map +1 -1
  119. package/dist/test/factories.test.js +75 -33
  120. package/dist/test/factories.test.js.map +1 -1
  121. package/dist/test/functioncallexpressions.test.js +117 -106
  122. package/dist/test/functioncallexpressions.test.js.map +1 -1
  123. package/dist/test/functiondeclaration.test.js +247 -180
  124. package/dist/test/functiondeclaration.test.js.map +1 -1
  125. package/dist/test/imports.test.js +171 -143
  126. package/dist/test/imports.test.js.map +1 -1
  127. package/dist/test/memberexpressions.test.js +582 -453
  128. package/dist/test/memberexpressions.test.js.map +1 -1
  129. package/dist/test/methoddeclaration.test.js +66 -46
  130. package/dist/test/methoddeclaration.test.js.map +1 -1
  131. package/dist/test/namepolicies.test.js +90 -78
  132. package/dist/test/namepolicies.test.js.map +1 -1
  133. package/dist/test/propertydeclaration.test.js +25 -20
  134. package/dist/test/propertydeclaration.test.js.map +1 -1
  135. package/dist/test/pydanticclassdeclarations.test.js +134 -190
  136. package/dist/test/pydanticclassdeclarations.test.js.map +1 -1
  137. package/dist/test/pydocs.test.js +573 -532
  138. package/dist/test/pydocs.test.js.map +1 -1
  139. package/dist/test/references.test.js +31 -28
  140. package/dist/test/references.test.js.map +1 -1
  141. package/dist/test/sourcefiles.test.js +700 -580
  142. package/dist/test/sourcefiles.test.js.map +1 -1
  143. package/dist/test/staticmethoddeclaration.test.js +7 -4
  144. package/dist/test/staticmethoddeclaration.test.js.map +1 -1
  145. package/dist/test/type-checking-imports.test.js +297 -284
  146. package/dist/test/type-checking-imports.test.js.map +1 -1
  147. package/dist/test/typereference.test.js +29 -22
  148. package/dist/test/typereference.test.js.map +1 -1
  149. package/dist/test/uniontypeexpression.test.js +124 -88
  150. package/dist/test/uniontypeexpression.test.js.map +1 -1
  151. package/dist/test/utils.d.ts +10 -17
  152. package/dist/test/utils.d.ts.map +1 -1
  153. package/dist/test/utils.js +32 -74
  154. package/dist/test/utils.js.map +1 -1
  155. package/dist/test/values.test.js +135 -67
  156. package/dist/test/values.test.js.map +1 -1
  157. package/dist/test/variables.test.js +201 -151
  158. package/dist/test/variables.test.js.map +1 -1
  159. package/dist/test/vitest.setup.d.ts +2 -0
  160. package/dist/test/vitest.setup.d.ts.map +1 -0
  161. package/dist/test/vitest.setup.js +2 -0
  162. package/dist/test/vitest.setup.js.map +1 -0
  163. package/dist/tsconfig.tsbuildinfo +1 -1
  164. package/docs/api/components/FunctionalEnumDeclaration.md +3 -6
  165. package/docs/api/components/MemberExpression.md +1 -5
  166. package/docs/api/components/SourceFile.md +20 -8
  167. package/docs/api/components/index.md +0 -2
  168. package/docs/api/functions/isTypeRefContext.md +1 -1
  169. package/docs/api/index.md +2 -2
  170. package/docs/api/types/ReferenceProps.md +7 -0
  171. package/docs/api/types/TypeRefContextProps.md +7 -0
  172. package/docs/api/types/index.md +2 -0
  173. package/package.json +11 -10
  174. package/src/components/CallSignature.tsx +4 -2
  175. package/src/components/ConstructorDeclaration.tsx +4 -2
  176. package/src/components/DataclassDeclaration.tsx +1 -2
  177. package/src/components/FunctionBase.tsx +1 -2
  178. package/src/components/PropertyDeclaration.tsx +8 -4
  179. package/src/components/PyDoc.tsx +12 -6
  180. package/src/components/PydanticClassDeclaration.tsx +1 -2
  181. package/src/components/SourceFile.tsx +6 -1
  182. package/src/symbols/python-output-symbol.ts +1 -2
  183. package/temp/api.json +107 -61
  184. package/test/callsignatures.test.tsx +309 -283
  185. package/test/class-method-declaration.test.tsx +3 -4
  186. package/test/classdeclarations.test.tsx +263 -248
  187. package/test/classinstantiations.test.tsx +115 -109
  188. package/test/constructordeclaration.test.tsx +9 -6
  189. package/test/dataclassdeclarations.test.tsx +243 -361
  190. package/test/decoratorlist.test.tsx +78 -59
  191. package/test/dundermethoddeclaration.test.tsx +3 -4
  192. package/test/enums.test.tsx +65 -81
  193. package/test/externals.test.tsx +25 -25
  194. package/test/factories.test.tsx +64 -22
  195. package/test/functioncallexpressions.test.tsx +123 -109
  196. package/test/functiondeclaration.test.tsx +209 -148
  197. package/test/imports.test.tsx +119 -91
  198. package/test/memberexpressions.test.tsx +265 -207
  199. package/test/methoddeclaration.test.tsx +84 -63
  200. package/test/namepolicies.test.tsx +69 -69
  201. package/test/propertydeclaration.test.tsx +7 -8
  202. package/test/pydanticclassdeclarations.test.tsx +355 -487
  203. package/test/pydocs.test.tsx +531 -579
  204. package/test/references.test.tsx +24 -23
  205. package/test/sourcefiles.test.tsx +527 -492
  206. package/test/staticmethoddeclaration.test.tsx +3 -4
  207. package/test/type-checking-imports.test.tsx +206 -218
  208. package/test/typereference.test.tsx +15 -12
  209. package/test/uniontypeexpression.test.tsx +74 -61
  210. package/test/utils.tsx +26 -110
  211. package/test/values.test.tsx +82 -32
  212. package/test/variables.test.tsx +162 -142
  213. package/test/vitest.setup.ts +1 -0
  214. package/tsdoc-metadata.json +1 -1
  215. package/vitest.config.ts +4 -0
  216. package/docs/api/components/Reference.md +0 -31
  217. package/docs/api/components/TypeRefContext.md +0 -41
@@ -1,14 +1,14 @@
1
1
  import { createComponent as _$createComponent, createIntrinsic as _$createIntrinsic } from "@alloy-js/core/jsx-runtime";
2
- import { Prose, namekey, refkey } from "@alloy-js/core";
3
- import { d } from "@alloy-js/core/testing";
2
+ import { Prose, namekey, refkey, render } from "@alloy-js/core";
4
3
  import { describe, expect, it } from "vitest";
5
4
  import { dataclassesModule } 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("DataclassDeclaration", () => {
9
8
  it("stacks user decorators above @dataclass", () => {
10
- const res = toSourceText([_$createComponent(py.SourceFile, {
9
+ expect(_$createComponent(TestOutput, {
11
10
  path: "user.py",
11
+ externals: [dataclassesModule],
12
12
  get children() {
13
13
  return _$createComponent(py.DataclassDeclaration, {
14
14
  name: "User",
@@ -16,18 +16,15 @@ describe("DataclassDeclaration", () => {
16
16
  decorators: ["@final"]
17
17
  }, {
18
18
  fileName: import.meta.url,
19
- lineNumber: 17,
20
- columnNumber: 11
19
+ lineNumber: 11,
20
+ columnNumber: 9
21
21
  });
22
22
  }
23
23
  }, {
24
24
  fileName: import.meta.url,
25
- lineNumber: 16,
26
- columnNumber: 9
27
- })], {
28
- externals: [dataclassesModule]
29
- });
30
- expect(res).toRenderTo(d`
25
+ lineNumber: 10,
26
+ columnNumber: 7
27
+ })).toRenderTo(`
31
28
  from dataclasses import dataclass
32
29
 
33
30
 
@@ -36,7 +33,6 @@ describe("DataclassDeclaration", () => {
36
33
  class User:
37
34
  pass
38
35
 
39
-
40
36
  `);
41
37
  });
42
38
  it("Creates a dataclass with a class doc", () => {
@@ -46,35 +42,33 @@ describe("DataclassDeclaration", () => {
46
42
  children: "Represents a user."
47
43
  }, {
48
44
  fileName: import.meta.url,
49
- lineNumber: 40,
45
+ lineNumber: 29,
50
46
  columnNumber: 34
51
47
  })];
52
48
  }
53
49
  }, {
54
50
  fileName: import.meta.url,
55
- lineNumber: 40,
51
+ lineNumber: 29,
56
52
  columnNumber: 7
57
53
  });
58
- const res = toSourceText([_$createComponent(py.SourceFile, {
54
+ expect(_$createComponent(TestOutput, {
59
55
  path: "user.py",
56
+ externals: [dataclassesModule],
60
57
  get children() {
61
58
  return _$createComponent(py.DataclassDeclaration, {
62
59
  name: "User",
63
60
  doc: doc
64
61
  }, {
65
62
  fileName: import.meta.url,
66
- lineNumber: 45,
67
- columnNumber: 11
63
+ lineNumber: 33,
64
+ columnNumber: 9
68
65
  });
69
66
  }
70
67
  }, {
71
68
  fileName: import.meta.url,
72
- lineNumber: 44,
73
- columnNumber: 9
74
- })], {
75
- externals: [dataclassesModule]
76
- });
77
- expect(res).toRenderTo(d`
69
+ lineNumber: 32,
70
+ columnNumber: 7
71
+ })).toRenderTo(`
78
72
  from dataclasses import dataclass
79
73
 
80
74
 
@@ -86,12 +80,12 @@ describe("DataclassDeclaration", () => {
86
80
 
87
81
  pass
88
82
 
89
-
90
83
  `);
91
84
  });
92
85
  it("Creates a dataclass with fields and defaults", () => {
93
- const res = toSourceText([_$createComponent(py.SourceFile, {
86
+ expect(_$createComponent(TestOutput, {
94
87
  path: "user.py",
88
+ externals: [dataclassesModule],
95
89
  get children() {
96
90
  return _$createComponent(py.DataclassDeclaration, {
97
91
  name: "User",
@@ -103,8 +97,8 @@ describe("DataclassDeclaration", () => {
103
97
  type: "int"
104
98
  }, {
105
99
  fileName: import.meta.url,
106
- lineNumber: 74,
107
- columnNumber: 13
100
+ lineNumber: 56,
101
+ columnNumber: 11
108
102
  }), _$createComponent(py.VariableDeclaration, {
109
103
  instanceVariable: true,
110
104
  get name() {
@@ -118,8 +112,8 @@ describe("DataclassDeclaration", () => {
118
112
  omitNone: true
119
113
  }, {
120
114
  fileName: import.meta.url,
121
- lineNumber: 80,
122
- columnNumber: 13
115
+ lineNumber: 62,
116
+ columnNumber: 11
123
117
  }), _$createComponent(py.VariableDeclaration, {
124
118
  instanceVariable: true,
125
119
  name: "name",
@@ -127,24 +121,21 @@ describe("DataclassDeclaration", () => {
127
121
  initializer: "Anonymous"
128
122
  }, {
129
123
  fileName: import.meta.url,
130
- lineNumber: 86,
131
- columnNumber: 13
124
+ lineNumber: 68,
125
+ columnNumber: 11
132
126
  })];
133
127
  }
134
128
  }, {
135
129
  fileName: import.meta.url,
136
- lineNumber: 73,
137
- columnNumber: 11
130
+ lineNumber: 55,
131
+ columnNumber: 9
138
132
  });
139
133
  }
140
134
  }, {
141
135
  fileName: import.meta.url,
142
- lineNumber: 72,
143
- columnNumber: 9
144
- })], {
145
- externals: [dataclassesModule]
146
- });
147
- expect(res).toRenderTo(d`
136
+ lineNumber: 54,
137
+ columnNumber: 7
138
+ })).toRenderTo(`
148
139
  from dataclasses import dataclass
149
140
  from typing import TYPE_CHECKING
150
141
 
@@ -158,12 +149,12 @@ describe("DataclassDeclaration", () => {
158
149
  _: KW_ONLY
159
150
  name: str = "Anonymous"
160
151
 
161
-
162
152
  `);
163
153
  });
164
154
  it("Creates a dataclass with keyword arguments", () => {
165
- const res = toSourceText([_$createComponent(py.SourceFile, {
155
+ expect(_$createComponent(TestOutput, {
166
156
  path: "user.py",
157
+ externals: [dataclassesModule],
167
158
  get children() {
168
159
  return _$createComponent(py.DataclassDeclaration, {
169
160
  name: "User",
@@ -178,24 +169,21 @@ describe("DataclassDeclaration", () => {
178
169
  type: "int"
179
170
  }, {
180
171
  fileName: import.meta.url,
181
- lineNumber: 123,
182
- columnNumber: 13
172
+ lineNumber: 99,
173
+ columnNumber: 11
183
174
  });
184
175
  }
185
176
  }, {
186
177
  fileName: import.meta.url,
187
- lineNumber: 122,
188
- columnNumber: 11
178
+ lineNumber: 98,
179
+ columnNumber: 9
189
180
  });
190
181
  }
191
182
  }, {
192
183
  fileName: import.meta.url,
193
- lineNumber: 121,
194
- columnNumber: 9
195
- })], {
196
- externals: [dataclassesModule]
197
- });
198
- expect(res).toRenderTo(d`
184
+ lineNumber: 97,
185
+ columnNumber: 7
186
+ })).toRenderTo(`
199
187
  from dataclasses import dataclass
200
188
 
201
189
 
@@ -203,12 +191,12 @@ describe("DataclassDeclaration", () => {
203
191
  class User:
204
192
  id: int
205
193
 
206
-
207
194
  `);
208
195
  });
209
196
  it("Creates a dataclass with all keyword arguments", () => {
210
- const res = toSourceText([_$createComponent(py.SourceFile, {
197
+ expect(_$createComponent(TestOutput, {
211
198
  path: "user.py",
199
+ externals: [dataclassesModule],
212
200
  get children() {
213
201
  return _$createComponent(py.DataclassDeclaration, {
214
202
  name: "User",
@@ -224,18 +212,15 @@ describe("DataclassDeclaration", () => {
224
212
  weakrefSlot: false
225
213
  }, {
226
214
  fileName: import.meta.url,
227
- lineNumber: 153,
228
- columnNumber: 11
215
+ lineNumber: 123,
216
+ columnNumber: 9
229
217
  });
230
218
  }
231
219
  }, {
232
220
  fileName: import.meta.url,
233
- lineNumber: 152,
234
- columnNumber: 9
235
- })], {
236
- externals: [dataclassesModule]
237
- });
238
- expect(res).toRenderTo(d`
221
+ lineNumber: 122,
222
+ columnNumber: 7
223
+ })).toRenderTo(`
239
224
  from dataclasses import dataclass
240
225
 
241
226
 
@@ -243,33 +228,32 @@ describe("DataclassDeclaration", () => {
243
228
  class User:
244
229
  pass
245
230
 
246
-
247
231
  `);
248
232
  });
249
233
  it("Throws error when weakref_slot=True without slots=True", () => {
250
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
234
+ expect(() => render(_$createComponent(TestOutput, {
251
235
  path: "user.py",
236
+ externals: [dataclassesModule],
252
237
  get children() {
253
238
  return _$createComponent(py.DataclassDeclaration, {
254
239
  name: "User",
255
240
  weakrefSlot: true
256
241
  }, {
257
242
  fileName: import.meta.url,
258
- lineNumber: 190,
259
- columnNumber: 13
243
+ lineNumber: 154,
244
+ columnNumber: 11
260
245
  });
261
246
  }
262
247
  }, {
263
248
  fileName: import.meta.url,
264
- lineNumber: 189,
265
- columnNumber: 11
266
- })], {
267
- externals: [dataclassesModule]
268
- })).toThrowError(/weakref_slot=True requires slots=True in @dataclass decorator/);
249
+ lineNumber: 153,
250
+ columnNumber: 9
251
+ }))).toThrowError(/weakref_slot=True requires slots=True in @dataclass decorator/);
269
252
  });
270
253
  it("Allows weakref_slot=True when slots=True", () => {
271
- const res = toSourceText([_$createComponent(py.SourceFile, {
254
+ expect(_$createComponent(TestOutput, {
272
255
  path: "user.py",
256
+ externals: [dataclassesModule],
273
257
  get children() {
274
258
  return _$createComponent(py.DataclassDeclaration, {
275
259
  name: "User",
@@ -277,18 +261,15 @@ describe("DataclassDeclaration", () => {
277
261
  weakrefSlot: true
278
262
  }, {
279
263
  fileName: import.meta.url,
280
- lineNumber: 204,
281
- columnNumber: 11
264
+ lineNumber: 165,
265
+ columnNumber: 9
282
266
  });
283
267
  }
284
268
  }, {
285
269
  fileName: import.meta.url,
286
- lineNumber: 203,
287
- columnNumber: 9
288
- })], {
289
- externals: [dataclassesModule]
290
- });
291
- expect(res).toRenderTo(d`
270
+ lineNumber: 164,
271
+ columnNumber: 7
272
+ })).toRenderTo(`
292
273
  from dataclasses import dataclass
293
274
 
294
275
 
@@ -296,12 +277,12 @@ describe("DataclassDeclaration", () => {
296
277
  class User:
297
278
  pass
298
279
 
299
-
300
280
  `);
301
281
  });
302
282
  it("Throws error when order=True and eq=False", () => {
303
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
283
+ expect(() => render(_$createComponent(TestOutput, {
304
284
  path: "user.py",
285
+ externals: [dataclassesModule],
305
286
  get children() {
306
287
  return _$createComponent(py.DataclassDeclaration, {
307
288
  name: "User",
@@ -309,39 +290,35 @@ describe("DataclassDeclaration", () => {
309
290
  eq: false
310
291
  }, {
311
292
  fileName: import.meta.url,
312
- lineNumber: 228,
313
- columnNumber: 13
293
+ lineNumber: 184,
294
+ columnNumber: 11
314
295
  });
315
296
  }
316
297
  }, {
317
298
  fileName: import.meta.url,
318
- lineNumber: 227,
319
- columnNumber: 11
320
- })], {
321
- externals: [dataclassesModule]
322
- })).toThrowError(/order=True requires eq=True/);
299
+ lineNumber: 183,
300
+ columnNumber: 9
301
+ }))).toThrowError(/order=True requires eq=True/);
323
302
  });
324
303
  it("Creates a dataclass with order=True and no conflicting methods", () => {
325
- const res = toSourceText([_$createComponent(py.SourceFile, {
304
+ expect(_$createComponent(TestOutput, {
326
305
  path: "user.py",
306
+ externals: [dataclassesModule],
327
307
  get children() {
328
308
  return _$createComponent(py.DataclassDeclaration, {
329
309
  name: "User",
330
310
  order: true
331
311
  }, {
332
312
  fileName: import.meta.url,
333
- lineNumber: 240,
334
- columnNumber: 11
313
+ lineNumber: 193,
314
+ columnNumber: 9
335
315
  });
336
316
  }
337
317
  }, {
338
318
  fileName: import.meta.url,
339
- lineNumber: 239,
340
- columnNumber: 9
341
- })], {
342
- externals: [dataclassesModule]
343
- });
344
- expect(res).toRenderTo(d`
319
+ lineNumber: 192,
320
+ columnNumber: 7
321
+ })).toRenderTo(`
345
322
  from dataclasses import dataclass
346
323
 
347
324
 
@@ -349,12 +326,12 @@ describe("DataclassDeclaration", () => {
349
326
  class User:
350
327
  pass
351
328
 
352
-
353
329
  `);
354
330
  });
355
331
  it("Throws error when order=True and class defines __lt__", () => {
356
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
332
+ expect(() => render(_$createComponent(TestOutput, {
357
333
  path: "user.py",
334
+ externals: [dataclassesModule],
358
335
  get children() {
359
336
  return _$createComponent(py.DataclassDeclaration, {
360
337
  name: "User",
@@ -364,27 +341,26 @@ describe("DataclassDeclaration", () => {
364
341
  name: "__lt__"
365
342
  }, {
366
343
  fileName: import.meta.url,
367
- lineNumber: 265,
368
- columnNumber: 15
344
+ lineNumber: 213,
345
+ columnNumber: 13
369
346
  });
370
347
  }
371
348
  }, {
372
349
  fileName: import.meta.url,
373
- lineNumber: 264,
374
- columnNumber: 13
350
+ lineNumber: 212,
351
+ columnNumber: 11
375
352
  });
376
353
  }
377
354
  }, {
378
355
  fileName: import.meta.url,
379
- lineNumber: 263,
380
- columnNumber: 11
381
- })], {
382
- externals: [dataclassesModule]
383
- })).toThrowError(/Cannot specify order=True when the class already defines __lt__\(\)/);
356
+ lineNumber: 211,
357
+ columnNumber: 9
358
+ }))).toThrowError(/Cannot specify order=True when the class already defines __lt__\(\)/);
384
359
  });
385
360
  it("Throws error when order=True and class defines __le__", () => {
386
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
361
+ expect(() => render(_$createComponent(TestOutput, {
387
362
  path: "user.py",
363
+ externals: [dataclassesModule],
388
364
  get children() {
389
365
  return _$createComponent(py.DataclassDeclaration, {
390
366
  name: "User",
@@ -394,27 +370,26 @@ describe("DataclassDeclaration", () => {
394
370
  name: "__le__"
395
371
  }, {
396
372
  fileName: import.meta.url,
397
- lineNumber: 282,
398
- columnNumber: 15
373
+ lineNumber: 227,
374
+ columnNumber: 13
399
375
  });
400
376
  }
401
377
  }, {
402
378
  fileName: import.meta.url,
403
- lineNumber: 281,
404
- columnNumber: 13
379
+ lineNumber: 226,
380
+ columnNumber: 11
405
381
  });
406
382
  }
407
383
  }, {
408
384
  fileName: import.meta.url,
409
- lineNumber: 280,
410
- columnNumber: 11
411
- })], {
412
- externals: [dataclassesModule]
413
- })).toThrowError(/Cannot specify order=True when the class already defines __le__\(\)/);
385
+ lineNumber: 225,
386
+ columnNumber: 9
387
+ }))).toThrowError(/Cannot specify order=True when the class already defines __le__\(\)/);
414
388
  });
415
389
  it("Throws error when order=True and class defines __gt__", () => {
416
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
390
+ expect(() => render(_$createComponent(TestOutput, {
417
391
  path: "user.py",
392
+ externals: [dataclassesModule],
418
393
  get children() {
419
394
  return _$createComponent(py.DataclassDeclaration, {
420
395
  name: "User",
@@ -424,27 +399,26 @@ describe("DataclassDeclaration", () => {
424
399
  name: "__gt__"
425
400
  }, {
426
401
  fileName: import.meta.url,
427
- lineNumber: 299,
428
- columnNumber: 15
402
+ lineNumber: 241,
403
+ columnNumber: 13
429
404
  });
430
405
  }
431
406
  }, {
432
407
  fileName: import.meta.url,
433
- lineNumber: 298,
434
- columnNumber: 13
408
+ lineNumber: 240,
409
+ columnNumber: 11
435
410
  });
436
411
  }
437
412
  }, {
438
413
  fileName: import.meta.url,
439
- lineNumber: 297,
440
- columnNumber: 11
441
- })], {
442
- externals: [dataclassesModule]
443
- })).toThrowError(/Cannot specify order=True when the class already defines __gt__\(\)/);
414
+ lineNumber: 239,
415
+ columnNumber: 9
416
+ }))).toThrowError(/Cannot specify order=True when the class already defines __gt__\(\)/);
444
417
  });
445
418
  it("Throws error when order=True and class defines __ge__", () => {
446
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
419
+ expect(() => render(_$createComponent(TestOutput, {
447
420
  path: "user.py",
421
+ externals: [dataclassesModule],
448
422
  get children() {
449
423
  return _$createComponent(py.DataclassDeclaration, {
450
424
  name: "User",
@@ -454,23 +428,21 @@ describe("DataclassDeclaration", () => {
454
428
  name: "__ge__"
455
429
  }, {
456
430
  fileName: import.meta.url,
457
- lineNumber: 316,
458
- columnNumber: 15
431
+ lineNumber: 255,
432
+ columnNumber: 13
459
433
  });
460
434
  }
461
435
  }, {
462
436
  fileName: import.meta.url,
463
- lineNumber: 315,
464
- columnNumber: 13
437
+ lineNumber: 254,
438
+ columnNumber: 11
465
439
  });
466
440
  }
467
441
  }, {
468
442
  fileName: import.meta.url,
469
- lineNumber: 314,
470
- columnNumber: 11
471
- })], {
472
- externals: [dataclassesModule]
473
- })).toThrowError(/Cannot specify order=True when the class already defines __ge__\(\)/);
443
+ lineNumber: 253,
444
+ columnNumber: 9
445
+ }))).toThrowError(/Cannot specify order=True when the class already defines __ge__\(\)/);
474
446
  });
475
447
  it("Throws error when order=True and a wrapper defines __lt__", () => {
476
448
  function Wrapper() {
@@ -478,12 +450,13 @@ describe("DataclassDeclaration", () => {
478
450
  name: "__lt__"
479
451
  }, {
480
452
  fileName: import.meta.url,
481
- lineNumber: 329,
453
+ lineNumber: 266,
482
454
  columnNumber: 14
483
455
  });
484
456
  }
485
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
457
+ expect(() => render(_$createComponent(TestOutput, {
486
458
  path: "user.py",
459
+ externals: [dataclassesModule],
487
460
  get children() {
488
461
  return _$createComponent(py.DataclassDeclaration, {
489
462
  name: "User",
@@ -491,27 +464,26 @@ describe("DataclassDeclaration", () => {
491
464
  get children() {
492
465
  return _$createComponent(Wrapper, {}, {
493
466
  fileName: import.meta.url,
494
- lineNumber: 336,
495
- columnNumber: 15
467
+ lineNumber: 272,
468
+ columnNumber: 13
496
469
  });
497
470
  }
498
471
  }, {
499
472
  fileName: import.meta.url,
500
- lineNumber: 335,
501
- columnNumber: 13
473
+ lineNumber: 271,
474
+ columnNumber: 11
502
475
  });
503
476
  }
504
477
  }, {
505
478
  fileName: import.meta.url,
506
- lineNumber: 334,
507
- columnNumber: 11
508
- })], {
509
- externals: [dataclassesModule]
510
- })).toThrowError(/Cannot specify order=True when the class already defines __lt__\(\)/);
479
+ lineNumber: 270,
480
+ columnNumber: 9
481
+ }))).toThrowError(/Cannot specify order=True when the class already defines __lt__\(\)/);
511
482
  });
512
483
  it("Throws error when unsafe_hash=True and class defines __hash__", () => {
513
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
484
+ expect(() => render(_$createComponent(TestOutput, {
514
485
  path: "user.py",
486
+ externals: [dataclassesModule],
515
487
  get children() {
516
488
  return _$createComponent(py.DataclassDeclaration, {
517
489
  name: "User",
@@ -521,27 +493,26 @@ describe("DataclassDeclaration", () => {
521
493
  name: "__hash__"
522
494
  }, {
523
495
  fileName: import.meta.url,
524
- lineNumber: 353,
525
- columnNumber: 15
496
+ lineNumber: 286,
497
+ columnNumber: 13
526
498
  });
527
499
  }
528
500
  }, {
529
501
  fileName: import.meta.url,
530
- lineNumber: 352,
531
- columnNumber: 13
502
+ lineNumber: 285,
503
+ columnNumber: 11
532
504
  });
533
505
  }
534
506
  }, {
535
507
  fileName: import.meta.url,
536
- lineNumber: 351,
537
- columnNumber: 11
538
- })], {
539
- externals: [dataclassesModule]
540
- })).toThrowError(/Cannot specify unsafe_hash=True when the class already defines __hash__\(\)/);
508
+ lineNumber: 284,
509
+ columnNumber: 9
510
+ }))).toThrowError(/Cannot specify unsafe_hash=True when the class already defines __hash__\(\)/);
541
511
  });
542
512
  it("Throws error when frozen=True and class defines __setattr__", () => {
543
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
513
+ expect(() => render(_$createComponent(TestOutput, {
544
514
  path: "user.py",
515
+ externals: [dataclassesModule],
545
516
  get children() {
546
517
  return _$createComponent(py.DataclassDeclaration, {
547
518
  name: "User",
@@ -551,27 +522,26 @@ describe("DataclassDeclaration", () => {
551
522
  name: "__setattr__"
552
523
  }, {
553
524
  fileName: import.meta.url,
554
- lineNumber: 370,
555
- columnNumber: 15
525
+ lineNumber: 300,
526
+ columnNumber: 13
556
527
  });
557
528
  }
558
529
  }, {
559
530
  fileName: import.meta.url,
560
- lineNumber: 369,
561
- columnNumber: 13
531
+ lineNumber: 299,
532
+ columnNumber: 11
562
533
  });
563
534
  }
564
535
  }, {
565
536
  fileName: import.meta.url,
566
- lineNumber: 368,
567
- columnNumber: 11
568
- })], {
569
- externals: [dataclassesModule]
570
- })).toThrowError(/Cannot specify frozen=True when the class already defines __setattr__\(\)/);
537
+ lineNumber: 298,
538
+ columnNumber: 9
539
+ }))).toThrowError(/Cannot specify frozen=True when the class already defines __setattr__\(\)/);
571
540
  });
572
541
  it("Throws errorwhen frozen=True and class defines __delattr__", () => {
573
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
542
+ expect(() => render(_$createComponent(TestOutput, {
574
543
  path: "user.py",
544
+ externals: [dataclassesModule],
575
545
  get children() {
576
546
  return _$createComponent(py.DataclassDeclaration, {
577
547
  name: "User",
@@ -581,27 +551,26 @@ describe("DataclassDeclaration", () => {
581
551
  name: "__delattr__"
582
552
  }, {
583
553
  fileName: import.meta.url,
584
- lineNumber: 387,
585
- columnNumber: 15
554
+ lineNumber: 314,
555
+ columnNumber: 13
586
556
  });
587
557
  }
588
558
  }, {
589
559
  fileName: import.meta.url,
590
- lineNumber: 386,
591
- columnNumber: 13
560
+ lineNumber: 313,
561
+ columnNumber: 11
592
562
  });
593
563
  }
594
564
  }, {
595
565
  fileName: import.meta.url,
596
- lineNumber: 385,
597
- columnNumber: 11
598
- })], {
599
- externals: [dataclassesModule]
600
- })).toThrowError(/Cannot specify frozen=True when the class already defines __delattr__\(\)/);
566
+ lineNumber: 312,
567
+ columnNumber: 9
568
+ }))).toThrowError(/Cannot specify frozen=True when the class already defines __delattr__\(\)/);
601
569
  });
602
570
  it("Throws error when slots=True and class defines __slots__", () => {
603
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
571
+ expect(() => render(_$createComponent(TestOutput, {
604
572
  path: "user.py",
573
+ externals: [dataclassesModule],
605
574
  get children() {
606
575
  return _$createComponent(py.DataclassDeclaration, {
607
576
  name: "User",
@@ -611,27 +580,26 @@ describe("DataclassDeclaration", () => {
611
580
  name: "__slots__"
612
581
  }, {
613
582
  fileName: import.meta.url,
614
- lineNumber: 404,
615
- columnNumber: 15
583
+ lineNumber: 328,
584
+ columnNumber: 13
616
585
  });
617
586
  }
618
587
  }, {
619
588
  fileName: import.meta.url,
620
- lineNumber: 403,
621
- columnNumber: 13
589
+ lineNumber: 327,
590
+ columnNumber: 11
622
591
  });
623
592
  }
624
593
  }, {
625
594
  fileName: import.meta.url,
626
- lineNumber: 402,
627
- columnNumber: 11
628
- })], {
629
- externals: [dataclassesModule]
630
- })).toThrowError(/Cannot specify slots=True when the class already defines __slots__\(\)/);
595
+ lineNumber: 326,
596
+ columnNumber: 9
597
+ }))).toThrowError(/Cannot specify slots=True when the class already defines __slots__\(\)/);
631
598
  });
632
599
  it("Creates a dataclass with kw_only=True on decorator (sentinel not used)", () => {
633
- const res = toSourceText([_$createComponent(py.SourceFile, {
600
+ expect(_$createComponent(TestOutput, {
634
601
  path: "user.py",
602
+ externals: [dataclassesModule],
635
603
  get children() {
636
604
  return _$createComponent(py.DataclassDeclaration, {
637
605
  name: "User",
@@ -644,24 +612,21 @@ describe("DataclassDeclaration", () => {
644
612
  type: "int"
645
613
  }, {
646
614
  fileName: import.meta.url,
647
- lineNumber: 420,
648
- columnNumber: 13
615
+ lineNumber: 341,
616
+ columnNumber: 11
649
617
  });
650
618
  }
651
619
  }, {
652
620
  fileName: import.meta.url,
653
- lineNumber: 419,
654
- columnNumber: 11
621
+ lineNumber: 340,
622
+ columnNumber: 9
655
623
  });
656
624
  }
657
625
  }, {
658
626
  fileName: import.meta.url,
659
- lineNumber: 418,
660
- columnNumber: 9
661
- })], {
662
- externals: [dataclassesModule]
663
- });
664
- expect(res).toRenderTo(d`
627
+ lineNumber: 339,
628
+ columnNumber: 7
629
+ })).toRenderTo(`
665
630
  from dataclasses import dataclass
666
631
 
667
632
 
@@ -669,30 +634,27 @@ describe("DataclassDeclaration", () => {
669
634
  class User:
670
635
  id: int
671
636
 
672
-
673
637
  `);
674
638
  });
675
639
  it("Creates a dataclass with base classes", () => {
676
- const res = toSourceText([_$createComponent(py.SourceFile, {
640
+ expect(_$createComponent(TestOutput, {
677
641
  path: "user.py",
642
+ externals: [dataclassesModule],
678
643
  get children() {
679
644
  return _$createComponent(py.DataclassDeclaration, {
680
645
  name: "User",
681
646
  bases: ["Base"]
682
647
  }, {
683
648
  fileName: import.meta.url,
684
- lineNumber: 449,
685
- columnNumber: 11
649
+ lineNumber: 365,
650
+ columnNumber: 9
686
651
  });
687
652
  }
688
653
  }, {
689
654
  fileName: import.meta.url,
690
- lineNumber: 448,
691
- columnNumber: 9
692
- })], {
693
- externals: [dataclassesModule]
694
- });
695
- expect(res).toRenderTo(d`
655
+ lineNumber: 364,
656
+ columnNumber: 7
657
+ })).toRenderTo(`
696
658
  from dataclasses import dataclass
697
659
 
698
660
 
@@ -700,12 +662,12 @@ describe("DataclassDeclaration", () => {
700
662
  class User(Base):
701
663
  pass
702
664
 
703
-
704
665
  `);
705
666
  });
706
667
  it("Throws error when more than one KW_ONLY sentinel is present", () => {
707
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
668
+ expect(() => render(_$createComponent(TestOutput, {
708
669
  path: "user.py",
670
+ externals: [dataclassesModule],
709
671
  get children() {
710
672
  return _$createComponent(py.DataclassDeclaration, {
711
673
  name: "User",
@@ -723,8 +685,8 @@ describe("DataclassDeclaration", () => {
723
685
  omitNone: true
724
686
  }, {
725
687
  fileName: import.meta.url,
726
- lineNumber: 475,
727
- columnNumber: 15
688
+ lineNumber: 385,
689
+ columnNumber: 13
728
690
  }), _$createComponent(py.VariableDeclaration, {
729
691
  instanceVariable: true,
730
692
  get name() {
@@ -738,27 +700,26 @@ describe("DataclassDeclaration", () => {
738
700
  omitNone: true
739
701
  }, {
740
702
  fileName: import.meta.url,
741
- lineNumber: 481,
742
- columnNumber: 15
703
+ lineNumber: 391,
704
+ columnNumber: 13
743
705
  })];
744
706
  }
745
707
  }, {
746
708
  fileName: import.meta.url,
747
- lineNumber: 474,
748
- columnNumber: 13
709
+ lineNumber: 384,
710
+ columnNumber: 11
749
711
  });
750
712
  }
751
713
  }, {
752
714
  fileName: import.meta.url,
753
- lineNumber: 473,
754
- columnNumber: 11
755
- })], {
756
- externals: [dataclassesModule]
757
- })).toThrowError(/Only one KW_ONLY sentinel is allowed per dataclass body/);
715
+ lineNumber: 383,
716
+ columnNumber: 9
717
+ }))).toThrowError(/Only one KW_ONLY sentinel is allowed per dataclass body/);
758
718
  });
759
719
  it("Will raise arg validation errors first over member conflicts", () => {
760
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
720
+ expect(() => render(_$createComponent(TestOutput, {
761
721
  path: "user.py",
722
+ externals: [dataclassesModule],
762
723
  get children() {
763
724
  return _$createComponent(py.DataclassDeclaration, {
764
725
  name: "User",
@@ -769,27 +730,26 @@ describe("DataclassDeclaration", () => {
769
730
  name: "__lt__"
770
731
  }, {
771
732
  fileName: import.meta.url,
772
- lineNumber: 501,
773
- columnNumber: 15
733
+ lineNumber: 408,
734
+ columnNumber: 13
774
735
  });
775
736
  }
776
737
  }, {
777
738
  fileName: import.meta.url,
778
- lineNumber: 500,
779
- columnNumber: 13
739
+ lineNumber: 407,
740
+ columnNumber: 11
780
741
  });
781
742
  }
782
743
  }, {
783
744
  fileName: import.meta.url,
784
- lineNumber: 499,
785
- columnNumber: 11
786
- })], {
787
- externals: [dataclassesModule]
788
- })).toThrowError(/order=True requires eq=True/);
745
+ lineNumber: 406,
746
+ columnNumber: 9
747
+ }))).toThrowError(/order=True requires eq=True/);
789
748
  });
790
749
  it("Does not raise errors for member conflict checks without the equivalent kwargs", () => {
791
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
750
+ expect(() => render(_$createComponent(TestOutput, {
792
751
  path: "user.py",
752
+ externals: [dataclassesModule],
793
753
  get children() {
794
754
  return _$createComponent(py.DataclassDeclaration, {
795
755
  name: "User",
@@ -798,69 +758,65 @@ describe("DataclassDeclaration", () => {
798
758
  name: "__lt__"
799
759
  }, {
800
760
  fileName: import.meta.url,
801
- lineNumber: 516,
802
- columnNumber: 15
761
+ lineNumber: 420,
762
+ columnNumber: 13
803
763
  }), _$createComponent(py.DunderMethodDeclaration, {
804
764
  name: "__slots__"
805
765
  }, {
806
766
  fileName: import.meta.url,
807
- lineNumber: 517,
808
- columnNumber: 15
767
+ lineNumber: 421,
768
+ columnNumber: 13
809
769
  }), _$createComponent(py.DunderMethodDeclaration, {
810
770
  name: "__hash__"
811
771
  }, {
812
772
  fileName: import.meta.url,
813
- lineNumber: 518,
814
- columnNumber: 15
773
+ lineNumber: 422,
774
+ columnNumber: 13
815
775
  }), _$createComponent(py.DunderMethodDeclaration, {
816
776
  name: "__setattr__"
817
777
  }, {
818
778
  fileName: import.meta.url,
819
- lineNumber: 519,
820
- columnNumber: 15
779
+ lineNumber: 423,
780
+ columnNumber: 13
821
781
  }), _$createComponent(py.DunderMethodDeclaration, {
822
782
  name: "__delattr__"
823
783
  }, {
824
784
  fileName: import.meta.url,
825
- lineNumber: 520,
826
- columnNumber: 15
785
+ lineNumber: 424,
786
+ columnNumber: 13
827
787
  })];
828
788
  }
829
789
  }, {
830
790
  fileName: import.meta.url,
831
- lineNumber: 515,
832
- columnNumber: 13
791
+ lineNumber: 419,
792
+ columnNumber: 11
833
793
  });
834
794
  }
835
795
  }, {
836
796
  fileName: import.meta.url,
837
- lineNumber: 514,
838
- columnNumber: 11
839
- })], {
840
- externals: [dataclassesModule]
841
- })).not.toThrow();
797
+ lineNumber: 418,
798
+ columnNumber: 9
799
+ }))).not.toThrow();
842
800
  });
843
801
  it("Allows unsafe_hash=True when no __hash__ is defined", () => {
844
- const res = toSourceText([_$createComponent(py.SourceFile, {
802
+ expect(_$createComponent(TestOutput, {
845
803
  path: "user.py",
804
+ externals: [dataclassesModule],
846
805
  get children() {
847
806
  return _$createComponent(py.DataclassDeclaration, {
848
807
  name: "User",
849
808
  unsafeHash: true
850
809
  }, {
851
810
  fileName: import.meta.url,
852
- lineNumber: 533,
853
- columnNumber: 11
811
+ lineNumber: 434,
812
+ columnNumber: 9
854
813
  });
855
814
  }
856
815
  }, {
857
816
  fileName: import.meta.url,
858
- lineNumber: 532,
859
- columnNumber: 9
860
- })], {
861
- externals: [dataclassesModule]
862
- });
863
- expect(res).toRenderTo(d`
817
+ lineNumber: 433,
818
+ columnNumber: 7
819
+ })).toRenderTo(`
864
820
  from dataclasses import dataclass
865
821
 
866
822
 
@@ -868,7 +824,6 @@ describe("DataclassDeclaration", () => {
868
824
  class User:
869
825
  pass
870
826
 
871
-
872
827
  `);
873
828
  });
874
829
  it("Counts KW_ONLY sentinels through wrappers (symbol-level)", () => {
@@ -886,12 +841,13 @@ describe("DataclassDeclaration", () => {
886
841
  omitNone: true
887
842
  }, {
888
843
  fileName: import.meta.url,
889
- lineNumber: 555,
844
+ lineNumber: 452,
890
845
  columnNumber: 9
891
846
  });
892
847
  }
893
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
848
+ expect(() => render(_$createComponent(TestOutput, {
894
849
  path: "user.py",
850
+ externals: [dataclassesModule],
895
851
  get children() {
896
852
  return _$createComponent(py.DataclassDeclaration, {
897
853
  name: "User",
@@ -909,49 +865,45 @@ describe("DataclassDeclaration", () => {
909
865
  omitNone: true
910
866
  }, {
911
867
  fileName: import.meta.url,
912
- lineNumber: 568,
913
- columnNumber: 15
868
+ lineNumber: 464,
869
+ columnNumber: 13
914
870
  }), _$createComponent(Wrapper, {}, {
915
871
  fileName: import.meta.url,
916
- lineNumber: 574,
917
- columnNumber: 15
872
+ lineNumber: 470,
873
+ columnNumber: 13
918
874
  })];
919
875
  }
920
876
  }, {
921
877
  fileName: import.meta.url,
922
- lineNumber: 567,
923
- columnNumber: 13
878
+ lineNumber: 463,
879
+ columnNumber: 11
924
880
  });
925
881
  }
926
882
  }, {
927
883
  fileName: import.meta.url,
928
- lineNumber: 566,
929
- columnNumber: 11
930
- })], {
931
- externals: [dataclassesModule]
932
- })).toThrowError(/Only one KW_ONLY sentinel is allowed per dataclass body/);
884
+ lineNumber: 462,
885
+ columnNumber: 9
886
+ }))).toThrowError(/Only one KW_ONLY sentinel is allowed per dataclass body/);
933
887
  });
934
888
  it("Allows frozen=True when no conflicting dunders exist", () => {
935
- const res = toSourceText([_$createComponent(py.SourceFile, {
889
+ expect(_$createComponent(TestOutput, {
936
890
  path: "user.py",
891
+ externals: [dataclassesModule],
937
892
  get children() {
938
893
  return _$createComponent(py.DataclassDeclaration, {
939
894
  name: "User",
940
895
  frozen: true
941
896
  }, {
942
897
  fileName: import.meta.url,
943
- lineNumber: 587,
944
- columnNumber: 11
898
+ lineNumber: 480,
899
+ columnNumber: 9
945
900
  });
946
901
  }
947
902
  }, {
948
903
  fileName: import.meta.url,
949
- lineNumber: 586,
950
- columnNumber: 9
951
- })], {
952
- externals: [dataclassesModule]
953
- });
954
- expect(res).toRenderTo(d`
904
+ lineNumber: 479,
905
+ columnNumber: 7
906
+ })).toRenderTo(`
955
907
  from dataclasses import dataclass
956
908
 
957
909
 
@@ -959,30 +911,27 @@ describe("DataclassDeclaration", () => {
959
911
  class User:
960
912
  pass
961
913
 
962
-
963
914
  `);
964
915
  });
965
916
  it("Allows slots=True when no __slots__ is defined", () => {
966
- const res = toSourceText([_$createComponent(py.SourceFile, {
917
+ expect(_$createComponent(TestOutput, {
967
918
  path: "user.py",
919
+ externals: [dataclassesModule],
968
920
  get children() {
969
921
  return _$createComponent(py.DataclassDeclaration, {
970
922
  name: "User",
971
923
  slots: true
972
924
  }, {
973
925
  fileName: import.meta.url,
974
- lineNumber: 610,
975
- columnNumber: 11
926
+ lineNumber: 498,
927
+ columnNumber: 9
976
928
  });
977
929
  }
978
930
  }, {
979
931
  fileName: import.meta.url,
980
- lineNumber: 609,
981
- columnNumber: 9
982
- })], {
983
- externals: [dataclassesModule]
984
- });
985
- expect(res).toRenderTo(d`
932
+ lineNumber: 497,
933
+ columnNumber: 7
934
+ })).toRenderTo(`
986
935
  from dataclasses import dataclass
987
936
 
988
937
 
@@ -990,111 +939,116 @@ describe("DataclassDeclaration", () => {
990
939
  class User:
991
940
  pass
992
941
 
993
-
994
942
  `);
995
943
  });
996
944
  it("Forwards refkey prop for symbol resolution in type references", () => {
997
945
  const userRefkey = refkey();
998
- const res = toSourceTextMultiple([_$createComponent(py.SourceFile, {
999
- path: "models.py",
946
+ expect(_$createComponent(TestOutputDirectory, {
947
+ externals: [dataclassesModule],
1000
948
  get children() {
1001
- return _$createComponent(py.DataclassDeclaration, {
1002
- name: "User",
1003
- refkey: userRefkey,
949
+ return [_$createComponent(py.SourceFile, {
950
+ path: "models.py",
1004
951
  get children() {
1005
- return [_$createComponent(py.VariableDeclaration, {
1006
- instanceVariable: true,
1007
- omitNone: true,
1008
- name: "id",
1009
- type: "int"
1010
- }, {
1011
- fileName: import.meta.url,
1012
- lineNumber: 635,
1013
- columnNumber: 13
1014
- }), _$createComponent(py.VariableDeclaration, {
1015
- instanceVariable: true,
1016
- omitNone: true,
1017
- name: "name",
1018
- type: "str"
952
+ return _$createComponent(py.DataclassDeclaration, {
953
+ name: "User",
954
+ refkey: userRefkey,
955
+ get children() {
956
+ return [_$createComponent(py.VariableDeclaration, {
957
+ instanceVariable: true,
958
+ omitNone: true,
959
+ name: "id",
960
+ type: "int"
961
+ }, {
962
+ fileName: import.meta.url,
963
+ lineNumber: 519,
964
+ columnNumber: 13
965
+ }), _$createComponent(py.VariableDeclaration, {
966
+ instanceVariable: true,
967
+ omitNone: true,
968
+ name: "name",
969
+ type: "str"
970
+ }, {
971
+ fileName: import.meta.url,
972
+ lineNumber: 525,
973
+ columnNumber: 13
974
+ })];
975
+ }
1019
976
  }, {
1020
977
  fileName: import.meta.url,
1021
- lineNumber: 641,
1022
- columnNumber: 13
1023
- })];
978
+ lineNumber: 518,
979
+ columnNumber: 11
980
+ });
1024
981
  }
1025
982
  }, {
1026
983
  fileName: import.meta.url,
1027
- lineNumber: 634,
1028
- columnNumber: 11
1029
- });
1030
- }
1031
- }, {
1032
- fileName: import.meta.url,
1033
- lineNumber: 633,
1034
- columnNumber: 9
1035
- }), _$createComponent(py.SourceFile, {
1036
- path: "services.py",
1037
- get children() {
1038
- return _$createComponent(py.FunctionDeclaration, {
1039
- name: "get_user",
1040
- returnType: userRefkey,
984
+ lineNumber: 517,
985
+ columnNumber: 9
986
+ }), _$createComponent(py.SourceFile, {
987
+ path: "services.py",
1041
988
  get children() {
1042
- return [_$createComponent(py.VariableDeclaration, {
1043
- name: "user",
1044
- type: userRefkey,
1045
- get initializer() {
1046
- return _$createComponent(py.ClassInstantiation, {
1047
- target: userRefkey,
1048
- args: ["1", '"Alice"']
989
+ return _$createComponent(py.FunctionDeclaration, {
990
+ name: "get_user",
991
+ returnType: userRefkey,
992
+ get children() {
993
+ return [_$createComponent(py.VariableDeclaration, {
994
+ name: "user",
995
+ type: userRefkey,
996
+ get initializer() {
997
+ return _$createComponent(py.ClassInstantiation, {
998
+ target: userRefkey,
999
+ args: ["1", '"Alice"']
1000
+ }, {
1001
+ fileName: import.meta.url,
1002
+ lineNumber: 539,
1003
+ columnNumber: 17
1004
+ });
1005
+ }
1049
1006
  }, {
1050
1007
  fileName: import.meta.url,
1051
- lineNumber: 655,
1052
- columnNumber: 17
1053
- });
1008
+ lineNumber: 535,
1009
+ columnNumber: 13
1010
+ }), _$createIntrinsic("hbr", {}, {
1011
+ fileName: import.meta.url,
1012
+ lineNumber: 545,
1013
+ columnNumber: 13
1014
+ }), "return user"];
1054
1015
  }
1055
1016
  }, {
1056
1017
  fileName: import.meta.url,
1057
- lineNumber: 651,
1058
- columnNumber: 13
1059
- }), _$createIntrinsic("hbr", {}, {
1060
- fileName: import.meta.url,
1061
- lineNumber: 661,
1062
- columnNumber: 13
1063
- }), "return user"];
1018
+ lineNumber: 534,
1019
+ columnNumber: 11
1020
+ });
1064
1021
  }
1065
1022
  }, {
1066
1023
  fileName: import.meta.url,
1067
- lineNumber: 650,
1068
- columnNumber: 11
1069
- });
1024
+ lineNumber: 533,
1025
+ columnNumber: 9
1026
+ })];
1070
1027
  }
1071
1028
  }, {
1072
1029
  fileName: import.meta.url,
1073
- lineNumber: 649,
1074
- columnNumber: 9
1075
- })], {
1076
- externals: [dataclassesModule]
1077
- });
1078
- assertFileContents(res, {
1030
+ lineNumber: 516,
1031
+ columnNumber: 7
1032
+ })).toRenderTo({
1079
1033
  "models.py": `
1080
- from dataclasses import dataclass
1034
+ from dataclasses import dataclass
1081
1035
 
1082
1036
 
1083
- @dataclass
1084
- class User:
1085
- id: int
1086
- name: str
1037
+ @dataclass
1038
+ class User:
1039
+ id: int
1040
+ name: str
1087
1041
 
1088
- `,
1042
+ `,
1089
1043
  "services.py": `
1090
- from models import User
1044
+ from models import User
1091
1045
 
1092
1046
 
1093
- def get_user() -> User:
1094
- user: User = User(1, "Alice")
1095
- return user
1047
+ def get_user() -> User:
1048
+ user: User = User(1, "Alice")
1049
+ return user
1096
1050
 
1097
- `
1051
+ `
1098
1052
  });
1099
1053
  });
1100
1054
  });