@alloy-js/python 0.5.0-dev.0 → 0.5.0-dev.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. package/dist/dev/src/builtins/python.js +46 -0
  2. package/dist/dev/src/builtins/python.js.map +1 -1
  3. package/dist/dev/src/components/ClassDeclaration.js +19 -10
  4. package/dist/dev/src/components/ClassDeclaration.js.map +1 -1
  5. package/dist/dev/src/components/ClassMethodDeclaration.js +20 -5
  6. package/dist/dev/src/components/ClassMethodDeclaration.js.map +1 -1
  7. package/dist/dev/src/components/DataclassDeclaration.js +14 -12
  8. package/dist/dev/src/components/DataclassDeclaration.js.map +1 -1
  9. package/dist/dev/src/components/DecoratorList.js +55 -0
  10. package/dist/dev/src/components/DecoratorList.js.map +1 -0
  11. package/dist/dev/src/components/EnumDeclaration.js +21 -12
  12. package/dist/dev/src/components/EnumDeclaration.js.map +1 -1
  13. package/dist/dev/src/components/FunctionBase.js +21 -10
  14. package/dist/dev/src/components/FunctionBase.js.map +1 -1
  15. package/dist/dev/src/components/FutureStatement.js +1 -1
  16. package/dist/dev/src/components/MethodBase.js +16 -4
  17. package/dist/dev/src/components/MethodBase.js.map +1 -1
  18. package/dist/dev/src/components/PropertyDeclaration.js +68 -17
  19. package/dist/dev/src/components/PropertyDeclaration.js.map +1 -1
  20. package/dist/dev/src/components/PydanticClassDeclaration.js +136 -0
  21. package/dist/dev/src/components/PydanticClassDeclaration.js.map +1 -0
  22. package/dist/dev/src/components/SourceFile.js +44 -32
  23. package/dist/dev/src/components/SourceFile.js.map +1 -1
  24. package/dist/dev/src/components/StaticMethodDeclaration.js +19 -5
  25. package/dist/dev/src/components/StaticMethodDeclaration.js.map +1 -1
  26. package/dist/dev/src/components/index.js +1 -0
  27. package/dist/dev/src/components/index.js.map +1 -1
  28. package/dist/dev/test/callsignatures.test.js +471 -297
  29. package/dist/dev/test/callsignatures.test.js.map +1 -1
  30. package/dist/dev/test/class-method-declaration.test.js +21 -10
  31. package/dist/dev/test/class-method-declaration.test.js.map +1 -1
  32. package/dist/dev/test/classdeclarations.test.js +480 -381
  33. package/dist/dev/test/classdeclarations.test.js.map +1 -1
  34. package/dist/dev/test/classinstantiations.test.js +201 -168
  35. package/dist/dev/test/classinstantiations.test.js.map +1 -1
  36. package/dist/dev/test/constructordeclaration.test.js +22 -11
  37. package/dist/dev/test/constructordeclaration.test.js.map +1 -1
  38. package/dist/dev/test/dataclassdeclarations.test.js +345 -358
  39. package/dist/dev/test/dataclassdeclarations.test.js.map +1 -1
  40. package/dist/dev/test/decoratorlist.test.js +131 -0
  41. package/dist/dev/test/decoratorlist.test.js.map +1 -0
  42. package/dist/dev/test/dundermethoddeclaration.test.js +22 -11
  43. package/dist/dev/test/dundermethoddeclaration.test.js.map +1 -1
  44. package/dist/dev/test/enums.test.js +231 -166
  45. package/dist/dev/test/enums.test.js.map +1 -1
  46. package/dist/dev/test/externals.test.js +57 -45
  47. package/dist/dev/test/externals.test.js.map +1 -1
  48. package/dist/dev/test/factories.test.js +124 -50
  49. package/dist/dev/test/factories.test.js.map +1 -1
  50. package/dist/dev/test/functioncallexpressions.test.js +199 -164
  51. package/dist/dev/test/functioncallexpressions.test.js.map +1 -1
  52. package/dist/dev/test/functiondeclaration.test.js +452 -265
  53. package/dist/dev/test/functiondeclaration.test.js.map +1 -1
  54. package/dist/dev/test/imports.test.js +273 -221
  55. package/dist/dev/test/imports.test.js.map +1 -1
  56. package/dist/dev/test/memberexpressions.test.js +1237 -972
  57. package/dist/dev/test/memberexpressions.test.js.map +1 -1
  58. package/dist/dev/test/methoddeclaration.test.js +200 -45
  59. package/dist/dev/test/methoddeclaration.test.js.map +1 -1
  60. package/dist/dev/test/namepolicies.test.js +130 -94
  61. package/dist/dev/test/namepolicies.test.js.map +1 -1
  62. package/dist/dev/test/propertydeclaration.test.js +177 -46
  63. package/dist/dev/test/propertydeclaration.test.js.map +1 -1
  64. package/dist/dev/test/pydanticclassdeclarations.test.js +1089 -0
  65. package/dist/dev/test/pydanticclassdeclarations.test.js.map +1 -0
  66. package/dist/dev/test/pydocs.test.js +888 -715
  67. package/dist/dev/test/pydocs.test.js.map +1 -1
  68. package/dist/dev/test/references.test.js +42 -35
  69. package/dist/dev/test/references.test.js.map +1 -1
  70. package/dist/dev/test/sourcefiles.test.js +1109 -841
  71. package/dist/dev/test/sourcefiles.test.js.map +1 -1
  72. package/dist/dev/test/staticmethoddeclaration.test.js +21 -10
  73. package/dist/dev/test/staticmethoddeclaration.test.js.map +1 -1
  74. package/dist/dev/test/type-checking-imports.test.js +408 -359
  75. package/dist/dev/test/type-checking-imports.test.js.map +1 -1
  76. package/dist/dev/test/typereference.test.js +55 -40
  77. package/dist/dev/test/typereference.test.js.map +1 -1
  78. package/dist/dev/test/uniontypeexpression.test.js +222 -146
  79. package/dist/dev/test/uniontypeexpression.test.js.map +1 -1
  80. package/dist/dev/test/utils.js +39 -77
  81. package/dist/dev/test/utils.js.map +1 -1
  82. package/dist/dev/test/values.test.js +237 -101
  83. package/dist/dev/test/values.test.js.map +1 -1
  84. package/dist/dev/test/variables.test.js +321 -203
  85. package/dist/dev/test/variables.test.js.map +1 -1
  86. package/dist/dev/test/vitest.setup.js +2 -0
  87. package/dist/dev/test/vitest.setup.js.map +1 -0
  88. package/dist/src/builtins/python.d.ts +30 -0
  89. package/dist/src/builtins/python.d.ts.map +1 -1
  90. package/dist/src/builtins/python.js +46 -0
  91. package/dist/src/builtins/python.js.map +1 -1
  92. package/dist/src/components/ClassDeclaration.d.ts +21 -0
  93. package/dist/src/components/ClassDeclaration.d.ts.map +1 -1
  94. package/dist/src/components/ClassDeclaration.js +6 -1
  95. package/dist/src/components/ClassDeclaration.js.map +1 -1
  96. package/dist/src/components/ClassMethodDeclaration.d.ts +5 -1
  97. package/dist/src/components/ClassMethodDeclaration.d.ts.map +1 -1
  98. package/dist/src/components/ClassMethodDeclaration.js +14 -3
  99. package/dist/src/components/ClassMethodDeclaration.js.map +1 -1
  100. package/dist/src/components/DataclassDeclaration.d.ts.map +1 -1
  101. package/dist/src/components/DataclassDeclaration.js +10 -4
  102. package/dist/src/components/DataclassDeclaration.js.map +1 -1
  103. package/dist/src/components/DecoratorList.d.ts +43 -0
  104. package/dist/src/components/DecoratorList.d.ts.map +1 -0
  105. package/dist/src/components/DecoratorList.js +47 -0
  106. package/dist/src/components/DecoratorList.js.map +1 -0
  107. package/dist/src/components/EnumDeclaration.d.ts +9 -0
  108. package/dist/src/components/EnumDeclaration.d.ts.map +1 -1
  109. package/dist/src/components/EnumDeclaration.js +6 -1
  110. package/dist/src/components/EnumDeclaration.js.map +1 -1
  111. package/dist/src/components/FunctionBase.d.ts +31 -1
  112. package/dist/src/components/FunctionBase.d.ts.map +1 -1
  113. package/dist/src/components/FunctionBase.js +9 -2
  114. package/dist/src/components/FunctionBase.js.map +1 -1
  115. package/dist/src/components/FutureStatement.d.ts +1 -1
  116. package/dist/src/components/FutureStatement.js +1 -1
  117. package/dist/src/components/MethodBase.d.ts.map +1 -1
  118. package/dist/src/components/MethodBase.js +10 -2
  119. package/dist/src/components/MethodBase.js.map +1 -1
  120. package/dist/src/components/PropertyDeclaration.d.ts +29 -0
  121. package/dist/src/components/PropertyDeclaration.d.ts.map +1 -1
  122. package/dist/src/components/PropertyDeclaration.js +48 -1
  123. package/dist/src/components/PropertyDeclaration.js.map +1 -1
  124. package/dist/src/components/PydanticClassDeclaration.d.ts +120 -0
  125. package/dist/src/components/PydanticClassDeclaration.d.ts.map +1 -0
  126. package/dist/src/components/PydanticClassDeclaration.js +116 -0
  127. package/dist/src/components/PydanticClassDeclaration.js.map +1 -0
  128. package/dist/src/components/SourceFile.d.ts +2 -2
  129. package/dist/src/components/SourceFile.d.ts.map +1 -1
  130. package/dist/src/components/SourceFile.js +12 -0
  131. package/dist/src/components/SourceFile.js.map +1 -1
  132. package/dist/src/components/StaticMethodDeclaration.d.ts +3 -0
  133. package/dist/src/components/StaticMethodDeclaration.d.ts.map +1 -1
  134. package/dist/src/components/StaticMethodDeclaration.js +13 -3
  135. package/dist/src/components/StaticMethodDeclaration.js.map +1 -1
  136. package/dist/src/components/index.d.ts +1 -0
  137. package/dist/src/components/index.d.ts.map +1 -1
  138. package/dist/src/components/index.js +1 -0
  139. package/dist/src/components/index.js.map +1 -1
  140. package/dist/test/callsignatures.test.js +346 -272
  141. package/dist/test/callsignatures.test.js.map +1 -1
  142. package/dist/test/class-method-declaration.test.js +7 -4
  143. package/dist/test/class-method-declaration.test.js.map +1 -1
  144. package/dist/test/classdeclarations.test.js +316 -277
  145. package/dist/test/classdeclarations.test.js.map +1 -1
  146. package/dist/test/classinstantiations.test.js +112 -103
  147. package/dist/test/classinstantiations.test.js.map +1 -1
  148. package/dist/test/constructordeclaration.test.js +7 -4
  149. package/dist/test/constructordeclaration.test.js.map +1 -1
  150. package/dist/test/dataclassdeclarations.test.js +153 -178
  151. package/dist/test/dataclassdeclarations.test.js.map +1 -1
  152. package/dist/test/decoratorlist.test.d.ts +2 -0
  153. package/dist/test/decoratorlist.test.d.ts.map +1 -0
  154. package/dist/test/decoratorlist.test.js +83 -0
  155. package/dist/test/decoratorlist.test.js.map +1 -0
  156. package/dist/test/dundermethoddeclaration.test.js +7 -4
  157. package/dist/test/dundermethoddeclaration.test.js.map +1 -1
  158. package/dist/test/enums.test.js +172 -143
  159. package/dist/test/enums.test.js.map +1 -1
  160. package/dist/test/externals.test.js +24 -24
  161. package/dist/test/externals.test.js.map +1 -1
  162. package/dist/test/factories.test.js +75 -33
  163. package/dist/test/factories.test.js.map +1 -1
  164. package/dist/test/functioncallexpressions.test.js +117 -106
  165. package/dist/test/functioncallexpressions.test.js.map +1 -1
  166. package/dist/test/functiondeclaration.test.js +256 -173
  167. package/dist/test/functiondeclaration.test.js.map +1 -1
  168. package/dist/test/imports.test.js +171 -143
  169. package/dist/test/imports.test.js.map +1 -1
  170. package/dist/test/memberexpressions.test.js +582 -453
  171. package/dist/test/memberexpressions.test.js.map +1 -1
  172. package/dist/test/methoddeclaration.test.js +106 -19
  173. package/dist/test/methoddeclaration.test.js.map +1 -1
  174. package/dist/test/namepolicies.test.js +90 -78
  175. package/dist/test/namepolicies.test.js.map +1 -1
  176. package/dist/test/propertydeclaration.test.js +90 -15
  177. package/dist/test/propertydeclaration.test.js.map +1 -1
  178. package/dist/test/pydanticclassdeclarations.test.d.ts +2 -0
  179. package/dist/test/pydanticclassdeclarations.test.d.ts.map +1 -0
  180. package/dist/test/pydanticclassdeclarations.test.js +773 -0
  181. package/dist/test/pydanticclassdeclarations.test.js.map +1 -0
  182. package/dist/test/pydocs.test.js +573 -532
  183. package/dist/test/pydocs.test.js.map +1 -1
  184. package/dist/test/references.test.js +31 -28
  185. package/dist/test/references.test.js.map +1 -1
  186. package/dist/test/sourcefiles.test.js +700 -580
  187. package/dist/test/sourcefiles.test.js.map +1 -1
  188. package/dist/test/staticmethoddeclaration.test.js +7 -4
  189. package/dist/test/staticmethoddeclaration.test.js.map +1 -1
  190. package/dist/test/type-checking-imports.test.js +297 -284
  191. package/dist/test/type-checking-imports.test.js.map +1 -1
  192. package/dist/test/typereference.test.js +29 -22
  193. package/dist/test/typereference.test.js.map +1 -1
  194. package/dist/test/uniontypeexpression.test.js +124 -88
  195. package/dist/test/uniontypeexpression.test.js.map +1 -1
  196. package/dist/test/utils.d.ts +10 -17
  197. package/dist/test/utils.d.ts.map +1 -1
  198. package/dist/test/utils.js +32 -74
  199. package/dist/test/utils.js.map +1 -1
  200. package/dist/test/values.test.js +135 -67
  201. package/dist/test/values.test.js.map +1 -1
  202. package/dist/test/variables.test.js +201 -151
  203. package/dist/test/variables.test.js.map +1 -1
  204. package/dist/test/vitest.setup.d.ts +2 -0
  205. package/dist/test/vitest.setup.d.ts.map +1 -0
  206. package/dist/test/vitest.setup.js +2 -0
  207. package/dist/test/vitest.setup.js.map +1 -0
  208. package/dist/tsconfig.tsbuildinfo +1 -1
  209. package/docs/api/components/ClassDeclaration.md +10 -7
  210. package/docs/api/components/ClassEnumDeclaration.md +9 -6
  211. package/docs/api/components/ClassMethodDeclaration.md +7 -5
  212. package/docs/api/components/DataclassDeclaration.md +9 -5
  213. package/docs/api/components/DunderMethodDeclaration.md +7 -5
  214. package/docs/api/components/FunctionDeclaration.md +9 -5
  215. package/docs/api/components/FutureStatement.md +1 -1
  216. package/docs/api/components/MethodDeclaration.md +11 -6
  217. package/docs/api/components/PropertyDeclaration.md +11 -8
  218. package/docs/api/components/PydanticClassDeclaration.md +146 -0
  219. package/docs/api/components/SourceFile.md +20 -8
  220. package/docs/api/components/StaticMethodDeclaration.md +7 -5
  221. package/docs/api/components/index.md +1 -0
  222. package/docs/api/index.md +3 -3
  223. package/docs/api/types/CommonFunctionProps.md +4 -3
  224. package/docs/api/types/PydanticModelConfigDictProps.md +32 -0
  225. package/docs/api/types/index.md +1 -0
  226. package/docs/api/variables/index.md +3 -0
  227. package/docs/api/variables/pydanticModule.md +27 -0
  228. package/docs/api/variables/pydanticSettingsModule.md +7 -0
  229. package/docs/api/variables/typingModule.md +9 -0
  230. package/package.json +4 -4
  231. package/src/builtins/python.ts +539 -1
  232. package/src/components/ClassDeclaration.tsx +23 -0
  233. package/src/components/ClassMethodDeclaration.tsx +9 -1
  234. package/src/components/DataclassDeclaration.tsx +18 -11
  235. package/src/components/DecoratorList.tsx +50 -0
  236. package/src/components/EnumDeclaration.tsx +11 -0
  237. package/src/components/FunctionBase.tsx +34 -3
  238. package/src/components/FutureStatement.tsx +1 -1
  239. package/src/components/MethodBase.tsx +6 -2
  240. package/src/components/PropertyDeclaration.tsx +48 -1
  241. package/src/components/PydanticClassDeclaration.tsx +222 -0
  242. package/src/components/SourceFile.tsx +6 -1
  243. package/src/components/StaticMethodDeclaration.tsx +7 -1
  244. package/src/components/index.ts +1 -0
  245. package/temp/api.json +1158 -86
  246. package/test/callsignatures.test.tsx +309 -283
  247. package/test/class-method-declaration.test.tsx +3 -4
  248. package/test/classdeclarations.test.tsx +277 -235
  249. package/test/classinstantiations.test.tsx +115 -109
  250. package/test/constructordeclaration.test.tsx +9 -6
  251. package/test/dataclassdeclarations.test.tsx +256 -349
  252. package/test/decoratorlist.test.tsx +114 -0
  253. package/test/dundermethoddeclaration.test.tsx +3 -4
  254. package/test/enums.test.tsx +84 -71
  255. package/test/externals.test.tsx +25 -25
  256. package/test/factories.test.tsx +64 -22
  257. package/test/functioncallexpressions.test.tsx +123 -109
  258. package/test/functiondeclaration.test.tsx +218 -140
  259. package/test/imports.test.tsx +119 -91
  260. package/test/memberexpressions.test.tsx +265 -207
  261. package/test/methoddeclaration.test.tsx +115 -24
  262. package/test/namepolicies.test.tsx +69 -69
  263. package/test/propertydeclaration.test.tsx +71 -7
  264. package/test/pydanticclassdeclarations.test.tsx +704 -0
  265. package/test/pydocs.test.tsx +531 -579
  266. package/test/references.test.tsx +24 -23
  267. package/test/sourcefiles.test.tsx +527 -492
  268. package/test/staticmethoddeclaration.test.tsx +3 -4
  269. package/test/type-checking-imports.test.tsx +206 -218
  270. package/test/typereference.test.tsx +15 -12
  271. package/test/uniontypeexpression.test.tsx +74 -61
  272. package/test/utils.tsx +26 -110
  273. package/test/values.test.tsx +82 -32
  274. package/test/variables.test.tsx +162 -142
  275. package/test/vitest.setup.ts +1 -0
  276. package/vitest.config.ts +3 -0
@@ -1,11 +1,32 @@
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", () => {
8
+ it("stacks user decorators above @dataclass", () => {
9
+ expect(_$createComponent(TestOutput, {
10
+ path: "user.py",
11
+ externals: [dataclassesModule],
12
+ get children() {
13
+ return _$createComponent(py.DataclassDeclaration, {
14
+ name: "User",
15
+ frozen: true,
16
+ decorators: ["@final"]
17
+ });
18
+ }
19
+ })).toRenderTo(`
20
+ from dataclasses import dataclass
21
+
22
+
23
+ @final
24
+ @dataclass(frozen=True)
25
+ class User:
26
+ pass
27
+
28
+ `);
29
+ });
9
30
  it("Creates a dataclass with a class doc", () => {
10
31
  const doc = _$createComponent(py.ClassDoc, {
11
32
  get description() {
@@ -14,18 +35,16 @@ describe("DataclassDeclaration", () => {
14
35
  })];
15
36
  }
16
37
  });
17
- const res = toSourceText([_$createComponent(py.SourceFile, {
38
+ expect(_$createComponent(TestOutput, {
18
39
  path: "user.py",
40
+ externals: [dataclassesModule],
19
41
  get children() {
20
42
  return _$createComponent(py.DataclassDeclaration, {
21
43
  name: "User",
22
44
  doc: doc
23
45
  });
24
46
  }
25
- })], {
26
- externals: [dataclassesModule]
27
- });
28
- expect(res).toRenderTo(d`
47
+ })).toRenderTo(`
29
48
  from dataclasses import dataclass
30
49
 
31
50
 
@@ -37,12 +56,12 @@ describe("DataclassDeclaration", () => {
37
56
 
38
57
  pass
39
58
 
40
-
41
59
  `);
42
60
  });
43
61
  it("Creates a dataclass with fields and defaults", () => {
44
- const res = toSourceText([_$createComponent(py.SourceFile, {
62
+ expect(_$createComponent(TestOutput, {
45
63
  path: "user.py",
64
+ externals: [dataclassesModule],
46
65
  get children() {
47
66
  return _$createComponent(py.DataclassDeclaration, {
48
67
  name: "User",
@@ -72,10 +91,7 @@ describe("DataclassDeclaration", () => {
72
91
  }
73
92
  });
74
93
  }
75
- })], {
76
- externals: [dataclassesModule]
77
- });
78
- expect(res).toRenderTo(d`
94
+ })).toRenderTo(`
79
95
  from dataclasses import dataclass
80
96
  from typing import TYPE_CHECKING
81
97
 
@@ -89,12 +105,12 @@ describe("DataclassDeclaration", () => {
89
105
  _: KW_ONLY
90
106
  name: str = "Anonymous"
91
107
 
92
-
93
108
  `);
94
109
  });
95
110
  it("Creates a dataclass with keyword arguments", () => {
96
- const res = toSourceText([_$createComponent(py.SourceFile, {
111
+ expect(_$createComponent(TestOutput, {
97
112
  path: "user.py",
113
+ externals: [dataclassesModule],
98
114
  get children() {
99
115
  return _$createComponent(py.DataclassDeclaration, {
100
116
  name: "User",
@@ -111,10 +127,7 @@ describe("DataclassDeclaration", () => {
111
127
  }
112
128
  });
113
129
  }
114
- })], {
115
- externals: [dataclassesModule]
116
- });
117
- expect(res).toRenderTo(d`
130
+ })).toRenderTo(`
118
131
  from dataclasses import dataclass
119
132
 
120
133
 
@@ -122,12 +135,12 @@ describe("DataclassDeclaration", () => {
122
135
  class User:
123
136
  id: int
124
137
 
125
-
126
138
  `);
127
139
  });
128
140
  it("Creates a dataclass with all keyword arguments", () => {
129
- const res = toSourceText([_$createComponent(py.SourceFile, {
141
+ expect(_$createComponent(TestOutput, {
130
142
  path: "user.py",
143
+ externals: [dataclassesModule],
131
144
  get children() {
132
145
  return _$createComponent(py.DataclassDeclaration, {
133
146
  name: "User",
@@ -143,10 +156,7 @@ describe("DataclassDeclaration", () => {
143
156
  weakrefSlot: false
144
157
  });
145
158
  }
146
- })], {
147
- externals: [dataclassesModule]
148
- });
149
- expect(res).toRenderTo(d`
159
+ })).toRenderTo(`
150
160
  from dataclasses import dataclass
151
161
 
152
162
 
@@ -154,25 +164,24 @@ describe("DataclassDeclaration", () => {
154
164
  class User:
155
165
  pass
156
166
 
157
-
158
167
  `);
159
168
  });
160
169
  it("Throws error when weakref_slot=True without slots=True", () => {
161
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
170
+ expect(() => render(_$createComponent(TestOutput, {
162
171
  path: "user.py",
172
+ externals: [dataclassesModule],
163
173
  get children() {
164
174
  return _$createComponent(py.DataclassDeclaration, {
165
175
  name: "User",
166
176
  weakrefSlot: true
167
177
  });
168
178
  }
169
- })], {
170
- externals: [dataclassesModule]
171
- })).toThrowError(/weakref_slot=True requires slots=True in @dataclass decorator/);
179
+ }))).toThrowError(/weakref_slot=True requires slots=True in @dataclass decorator/);
172
180
  });
173
181
  it("Allows weakref_slot=True when slots=True", () => {
174
- const res = toSourceText([_$createComponent(py.SourceFile, {
182
+ expect(_$createComponent(TestOutput, {
175
183
  path: "user.py",
184
+ externals: [dataclassesModule],
176
185
  get children() {
177
186
  return _$createComponent(py.DataclassDeclaration, {
178
187
  name: "User",
@@ -180,10 +189,7 @@ describe("DataclassDeclaration", () => {
180
189
  weakrefSlot: true
181
190
  });
182
191
  }
183
- })], {
184
- externals: [dataclassesModule]
185
- });
186
- expect(res).toRenderTo(d`
192
+ })).toRenderTo(`
187
193
  from dataclasses import dataclass
188
194
 
189
195
 
@@ -191,12 +197,12 @@ describe("DataclassDeclaration", () => {
191
197
  class User:
192
198
  pass
193
199
 
194
-
195
200
  `);
196
201
  });
197
202
  it("Throws error when order=True and eq=False", () => {
198
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
203
+ expect(() => render(_$createComponent(TestOutput, {
199
204
  path: "user.py",
205
+ externals: [dataclassesModule],
200
206
  get children() {
201
207
  return _$createComponent(py.DataclassDeclaration, {
202
208
  name: "User",
@@ -204,23 +210,19 @@ describe("DataclassDeclaration", () => {
204
210
  eq: false
205
211
  });
206
212
  }
207
- })], {
208
- externals: [dataclassesModule]
209
- })).toThrowError(/order=True requires eq=True/);
213
+ }))).toThrowError(/order=True requires eq=True/);
210
214
  });
211
215
  it("Creates a dataclass with order=True and no conflicting methods", () => {
212
- const res = toSourceText([_$createComponent(py.SourceFile, {
216
+ expect(_$createComponent(TestOutput, {
213
217
  path: "user.py",
218
+ externals: [dataclassesModule],
214
219
  get children() {
215
220
  return _$createComponent(py.DataclassDeclaration, {
216
221
  name: "User",
217
222
  order: true
218
223
  });
219
224
  }
220
- })], {
221
- externals: [dataclassesModule]
222
- });
223
- expect(res).toRenderTo(d`
225
+ })).toRenderTo(`
224
226
  from dataclasses import dataclass
225
227
 
226
228
 
@@ -228,12 +230,12 @@ describe("DataclassDeclaration", () => {
228
230
  class User:
229
231
  pass
230
232
 
231
-
232
233
  `);
233
234
  });
234
235
  it("Throws error when order=True and class defines __lt__", () => {
235
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
236
+ expect(() => render(_$createComponent(TestOutput, {
236
237
  path: "user.py",
238
+ externals: [dataclassesModule],
237
239
  get children() {
238
240
  return _$createComponent(py.DataclassDeclaration, {
239
241
  name: "User",
@@ -245,13 +247,12 @@ describe("DataclassDeclaration", () => {
245
247
  }
246
248
  });
247
249
  }
248
- })], {
249
- externals: [dataclassesModule]
250
- })).toThrowError(/Cannot specify order=True when the class already defines __lt__\(\)/);
250
+ }))).toThrowError(/Cannot specify order=True when the class already defines __lt__\(\)/);
251
251
  });
252
252
  it("Throws error when order=True and class defines __le__", () => {
253
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
253
+ expect(() => render(_$createComponent(TestOutput, {
254
254
  path: "user.py",
255
+ externals: [dataclassesModule],
255
256
  get children() {
256
257
  return _$createComponent(py.DataclassDeclaration, {
257
258
  name: "User",
@@ -263,13 +264,12 @@ describe("DataclassDeclaration", () => {
263
264
  }
264
265
  });
265
266
  }
266
- })], {
267
- externals: [dataclassesModule]
268
- })).toThrowError(/Cannot specify order=True when the class already defines __le__\(\)/);
267
+ }))).toThrowError(/Cannot specify order=True when the class already defines __le__\(\)/);
269
268
  });
270
269
  it("Throws error when order=True and class defines __gt__", () => {
271
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
270
+ expect(() => render(_$createComponent(TestOutput, {
272
271
  path: "user.py",
272
+ externals: [dataclassesModule],
273
273
  get children() {
274
274
  return _$createComponent(py.DataclassDeclaration, {
275
275
  name: "User",
@@ -281,13 +281,12 @@ describe("DataclassDeclaration", () => {
281
281
  }
282
282
  });
283
283
  }
284
- })], {
285
- externals: [dataclassesModule]
286
- })).toThrowError(/Cannot specify order=True when the class already defines __gt__\(\)/);
284
+ }))).toThrowError(/Cannot specify order=True when the class already defines __gt__\(\)/);
287
285
  });
288
286
  it("Throws error when order=True and class defines __ge__", () => {
289
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
287
+ expect(() => render(_$createComponent(TestOutput, {
290
288
  path: "user.py",
289
+ externals: [dataclassesModule],
291
290
  get children() {
292
291
  return _$createComponent(py.DataclassDeclaration, {
293
292
  name: "User",
@@ -299,9 +298,7 @@ describe("DataclassDeclaration", () => {
299
298
  }
300
299
  });
301
300
  }
302
- })], {
303
- externals: [dataclassesModule]
304
- })).toThrowError(/Cannot specify order=True when the class already defines __ge__\(\)/);
301
+ }))).toThrowError(/Cannot specify order=True when the class already defines __ge__\(\)/);
305
302
  });
306
303
  it("Throws error when order=True and a wrapper defines __lt__", () => {
307
304
  function Wrapper() {
@@ -309,8 +306,9 @@ describe("DataclassDeclaration", () => {
309
306
  name: "__lt__"
310
307
  });
311
308
  }
312
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
309
+ expect(() => render(_$createComponent(TestOutput, {
313
310
  path: "user.py",
311
+ externals: [dataclassesModule],
314
312
  get children() {
315
313
  return _$createComponent(py.DataclassDeclaration, {
316
314
  name: "User",
@@ -320,13 +318,12 @@ describe("DataclassDeclaration", () => {
320
318
  }
321
319
  });
322
320
  }
323
- })], {
324
- externals: [dataclassesModule]
325
- })).toThrowError(/Cannot specify order=True when the class already defines __lt__\(\)/);
321
+ }))).toThrowError(/Cannot specify order=True when the class already defines __lt__\(\)/);
326
322
  });
327
323
  it("Throws error when unsafe_hash=True and class defines __hash__", () => {
328
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
324
+ expect(() => render(_$createComponent(TestOutput, {
329
325
  path: "user.py",
326
+ externals: [dataclassesModule],
330
327
  get children() {
331
328
  return _$createComponent(py.DataclassDeclaration, {
332
329
  name: "User",
@@ -338,13 +335,12 @@ describe("DataclassDeclaration", () => {
338
335
  }
339
336
  });
340
337
  }
341
- })], {
342
- externals: [dataclassesModule]
343
- })).toThrowError(/Cannot specify unsafe_hash=True when the class already defines __hash__\(\)/);
338
+ }))).toThrowError(/Cannot specify unsafe_hash=True when the class already defines __hash__\(\)/);
344
339
  });
345
340
  it("Throws error when frozen=True and class defines __setattr__", () => {
346
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
341
+ expect(() => render(_$createComponent(TestOutput, {
347
342
  path: "user.py",
343
+ externals: [dataclassesModule],
348
344
  get children() {
349
345
  return _$createComponent(py.DataclassDeclaration, {
350
346
  name: "User",
@@ -356,13 +352,12 @@ describe("DataclassDeclaration", () => {
356
352
  }
357
353
  });
358
354
  }
359
- })], {
360
- externals: [dataclassesModule]
361
- })).toThrowError(/Cannot specify frozen=True when the class already defines __setattr__\(\)/);
355
+ }))).toThrowError(/Cannot specify frozen=True when the class already defines __setattr__\(\)/);
362
356
  });
363
357
  it("Throws errorwhen frozen=True and class defines __delattr__", () => {
364
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
358
+ expect(() => render(_$createComponent(TestOutput, {
365
359
  path: "user.py",
360
+ externals: [dataclassesModule],
366
361
  get children() {
367
362
  return _$createComponent(py.DataclassDeclaration, {
368
363
  name: "User",
@@ -374,13 +369,12 @@ describe("DataclassDeclaration", () => {
374
369
  }
375
370
  });
376
371
  }
377
- })], {
378
- externals: [dataclassesModule]
379
- })).toThrowError(/Cannot specify frozen=True when the class already defines __delattr__\(\)/);
372
+ }))).toThrowError(/Cannot specify frozen=True when the class already defines __delattr__\(\)/);
380
373
  });
381
374
  it("Throws error when slots=True and class defines __slots__", () => {
382
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
375
+ expect(() => render(_$createComponent(TestOutput, {
383
376
  path: "user.py",
377
+ externals: [dataclassesModule],
384
378
  get children() {
385
379
  return _$createComponent(py.DataclassDeclaration, {
386
380
  name: "User",
@@ -392,13 +386,12 @@ describe("DataclassDeclaration", () => {
392
386
  }
393
387
  });
394
388
  }
395
- })], {
396
- externals: [dataclassesModule]
397
- })).toThrowError(/Cannot specify slots=True when the class already defines __slots__\(\)/);
389
+ }))).toThrowError(/Cannot specify slots=True when the class already defines __slots__\(\)/);
398
390
  });
399
391
  it("Creates a dataclass with kw_only=True on decorator (sentinel not used)", () => {
400
- const res = toSourceText([_$createComponent(py.SourceFile, {
392
+ expect(_$createComponent(TestOutput, {
401
393
  path: "user.py",
394
+ externals: [dataclassesModule],
402
395
  get children() {
403
396
  return _$createComponent(py.DataclassDeclaration, {
404
397
  name: "User",
@@ -413,10 +406,7 @@ describe("DataclassDeclaration", () => {
413
406
  }
414
407
  });
415
408
  }
416
- })], {
417
- externals: [dataclassesModule]
418
- });
419
- expect(res).toRenderTo(d`
409
+ })).toRenderTo(`
420
410
  from dataclasses import dataclass
421
411
 
422
412
 
@@ -424,22 +414,19 @@ describe("DataclassDeclaration", () => {
424
414
  class User:
425
415
  id: int
426
416
 
427
-
428
417
  `);
429
418
  });
430
419
  it("Creates a dataclass with base classes", () => {
431
- const res = toSourceText([_$createComponent(py.SourceFile, {
420
+ expect(_$createComponent(TestOutput, {
432
421
  path: "user.py",
422
+ externals: [dataclassesModule],
433
423
  get children() {
434
424
  return _$createComponent(py.DataclassDeclaration, {
435
425
  name: "User",
436
426
  bases: ["Base"]
437
427
  });
438
428
  }
439
- })], {
440
- externals: [dataclassesModule]
441
- });
442
- expect(res).toRenderTo(d`
429
+ })).toRenderTo(`
443
430
  from dataclasses import dataclass
444
431
 
445
432
 
@@ -447,12 +434,12 @@ describe("DataclassDeclaration", () => {
447
434
  class User(Base):
448
435
  pass
449
436
 
450
-
451
437
  `);
452
438
  });
453
439
  it("Throws error when more than one KW_ONLY sentinel is present", () => {
454
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
440
+ expect(() => render(_$createComponent(TestOutput, {
455
441
  path: "user.py",
442
+ externals: [dataclassesModule],
456
443
  get children() {
457
444
  return _$createComponent(py.DataclassDeclaration, {
458
445
  name: "User",
@@ -483,13 +470,12 @@ describe("DataclassDeclaration", () => {
483
470
  }
484
471
  });
485
472
  }
486
- })], {
487
- externals: [dataclassesModule]
488
- })).toThrowError(/Only one KW_ONLY sentinel is allowed per dataclass body/);
473
+ }))).toThrowError(/Only one KW_ONLY sentinel is allowed per dataclass body/);
489
474
  });
490
475
  it("Will raise arg validation errors first over member conflicts", () => {
491
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
476
+ expect(() => render(_$createComponent(TestOutput, {
492
477
  path: "user.py",
478
+ externals: [dataclassesModule],
493
479
  get children() {
494
480
  return _$createComponent(py.DataclassDeclaration, {
495
481
  name: "User",
@@ -502,13 +488,12 @@ describe("DataclassDeclaration", () => {
502
488
  }
503
489
  });
504
490
  }
505
- })], {
506
- externals: [dataclassesModule]
507
- })).toThrowError(/order=True requires eq=True/);
491
+ }))).toThrowError(/order=True requires eq=True/);
508
492
  });
509
493
  it("Does not raise errors for member conflict checks without the equivalent kwargs", () => {
510
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
494
+ expect(() => render(_$createComponent(TestOutput, {
511
495
  path: "user.py",
496
+ externals: [dataclassesModule],
512
497
  get children() {
513
498
  return _$createComponent(py.DataclassDeclaration, {
514
499
  name: "User",
@@ -527,23 +512,19 @@ describe("DataclassDeclaration", () => {
527
512
  }
528
513
  });
529
514
  }
530
- })], {
531
- externals: [dataclassesModule]
532
- })).not.toThrow();
515
+ }))).not.toThrow();
533
516
  });
534
517
  it("Allows unsafe_hash=True when no __hash__ is defined", () => {
535
- const res = toSourceText([_$createComponent(py.SourceFile, {
518
+ expect(_$createComponent(TestOutput, {
536
519
  path: "user.py",
520
+ externals: [dataclassesModule],
537
521
  get children() {
538
522
  return _$createComponent(py.DataclassDeclaration, {
539
523
  name: "User",
540
524
  unsafeHash: true
541
525
  });
542
526
  }
543
- })], {
544
- externals: [dataclassesModule]
545
- });
546
- expect(res).toRenderTo(d`
527
+ })).toRenderTo(`
547
528
  from dataclasses import dataclass
548
529
 
549
530
 
@@ -551,7 +532,6 @@ describe("DataclassDeclaration", () => {
551
532
  class User:
552
533
  pass
553
534
 
554
-
555
535
  `);
556
536
  });
557
537
  it("Counts KW_ONLY sentinels through wrappers (symbol-level)", () => {
@@ -569,8 +549,9 @@ describe("DataclassDeclaration", () => {
569
549
  omitNone: true
570
550
  });
571
551
  }
572
- expect(() => toSourceText([_$createComponent(py.SourceFile, {
552
+ expect(() => render(_$createComponent(TestOutput, {
573
553
  path: "user.py",
554
+ externals: [dataclassesModule],
574
555
  get children() {
575
556
  return _$createComponent(py.DataclassDeclaration, {
576
557
  name: "User",
@@ -590,23 +571,19 @@ describe("DataclassDeclaration", () => {
590
571
  }
591
572
  });
592
573
  }
593
- })], {
594
- externals: [dataclassesModule]
595
- })).toThrowError(/Only one KW_ONLY sentinel is allowed per dataclass body/);
574
+ }))).toThrowError(/Only one KW_ONLY sentinel is allowed per dataclass body/);
596
575
  });
597
576
  it("Allows frozen=True when no conflicting dunders exist", () => {
598
- const res = toSourceText([_$createComponent(py.SourceFile, {
577
+ expect(_$createComponent(TestOutput, {
599
578
  path: "user.py",
579
+ externals: [dataclassesModule],
600
580
  get children() {
601
581
  return _$createComponent(py.DataclassDeclaration, {
602
582
  name: "User",
603
583
  frozen: true
604
584
  });
605
585
  }
606
- })], {
607
- externals: [dataclassesModule]
608
- });
609
- expect(res).toRenderTo(d`
586
+ })).toRenderTo(`
610
587
  from dataclasses import dataclass
611
588
 
612
589
 
@@ -614,22 +591,19 @@ describe("DataclassDeclaration", () => {
614
591
  class User:
615
592
  pass
616
593
 
617
-
618
594
  `);
619
595
  });
620
596
  it("Allows slots=True when no __slots__ is defined", () => {
621
- const res = toSourceText([_$createComponent(py.SourceFile, {
597
+ expect(_$createComponent(TestOutput, {
622
598
  path: "user.py",
599
+ externals: [dataclassesModule],
623
600
  get children() {
624
601
  return _$createComponent(py.DataclassDeclaration, {
625
602
  name: "User",
626
603
  slots: true
627
604
  });
628
605
  }
629
- })], {
630
- externals: [dataclassesModule]
631
- });
632
- expect(res).toRenderTo(d`
606
+ })).toRenderTo(`
633
607
  from dataclasses import dataclass
634
608
 
635
609
 
@@ -637,75 +611,76 @@ describe("DataclassDeclaration", () => {
637
611
  class User:
638
612
  pass
639
613
 
640
-
641
614
  `);
642
615
  });
643
616
  it("Forwards refkey prop for symbol resolution in type references", () => {
644
617
  const userRefkey = refkey();
645
- const res = toSourceTextMultiple([_$createComponent(py.SourceFile, {
646
- path: "models.py",
618
+ expect(_$createComponent(TestOutputDirectory, {
619
+ externals: [dataclassesModule],
647
620
  get children() {
648
- return _$createComponent(py.DataclassDeclaration, {
649
- name: "User",
650
- refkey: userRefkey,
621
+ return [_$createComponent(py.SourceFile, {
622
+ path: "models.py",
651
623
  get children() {
652
- return [_$createComponent(py.VariableDeclaration, {
653
- instanceVariable: true,
654
- omitNone: true,
655
- name: "id",
656
- type: "int"
657
- }), _$createComponent(py.VariableDeclaration, {
658
- instanceVariable: true,
659
- omitNone: true,
660
- name: "name",
661
- type: "str"
662
- })];
624
+ return _$createComponent(py.DataclassDeclaration, {
625
+ name: "User",
626
+ refkey: userRefkey,
627
+ get children() {
628
+ return [_$createComponent(py.VariableDeclaration, {
629
+ instanceVariable: true,
630
+ omitNone: true,
631
+ name: "id",
632
+ type: "int"
633
+ }), _$createComponent(py.VariableDeclaration, {
634
+ instanceVariable: true,
635
+ omitNone: true,
636
+ name: "name",
637
+ type: "str"
638
+ })];
639
+ }
640
+ });
663
641
  }
664
- });
665
- }
666
- }), _$createComponent(py.SourceFile, {
667
- path: "services.py",
668
- get children() {
669
- return _$createComponent(py.FunctionDeclaration, {
670
- name: "get_user",
671
- returnType: userRefkey,
642
+ }), _$createComponent(py.SourceFile, {
643
+ path: "services.py",
672
644
  get children() {
673
- return [_$createComponent(py.VariableDeclaration, {
674
- name: "user",
675
- type: userRefkey,
676
- get initializer() {
677
- return _$createComponent(py.ClassInstantiation, {
678
- target: userRefkey,
679
- args: ["1", '"Alice"']
680
- });
645
+ return _$createComponent(py.FunctionDeclaration, {
646
+ name: "get_user",
647
+ returnType: userRefkey,
648
+ get children() {
649
+ return [_$createComponent(py.VariableDeclaration, {
650
+ name: "user",
651
+ type: userRefkey,
652
+ get initializer() {
653
+ return _$createComponent(py.ClassInstantiation, {
654
+ target: userRefkey,
655
+ args: ["1", '"Alice"']
656
+ });
657
+ }
658
+ }), _$createIntrinsic("hbr", {}), "return user"];
681
659
  }
682
- }), _$createIntrinsic("hbr", {}), "return user"];
660
+ });
683
661
  }
684
- });
662
+ })];
685
663
  }
686
- })], {
687
- externals: [dataclassesModule]
688
- });
689
- assertFileContents(res, {
664
+ })).toRenderTo({
690
665
  "models.py": `
691
- from dataclasses import dataclass
666
+ from dataclasses import dataclass
692
667
 
693
668
 
694
- @dataclass
695
- class User:
696
- id: int
697
- name: str
669
+ @dataclass
670
+ class User:
671
+ id: int
672
+ name: str
698
673
 
699
- `,
674
+ `,
700
675
  "services.py": `
701
- from models import User
676
+ from models import User
702
677
 
703
678
 
704
- def get_user() -> User:
705
- user: User = User(1, "Alice")
706
- return user
679
+ def get_user() -> User:
680
+ user: User = User(1, "Alice")
681
+ return user
707
682
 
708
- `
683
+ `
709
684
  });
710
685
  });
711
686
  });