@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,165 +1,201 @@
1
- import { code, namekey, refkey } from "@alloy-js/core";
2
- import { d } from "@alloy-js/core/testing";
1
+ import { code, namekey, refkey, render } from "@alloy-js/core";
3
2
  import { describe, expect, it } from "vitest";
4
3
  import * as py from "../src/index.js";
5
4
  import { abcModule } from "../src/index.js";
6
- import {
7
- assertFileContents,
8
- toSourceText,
9
- toSourceTextMultiple,
10
- } from "./utils.js";
5
+ import { TestOutput, TestOutputDirectory } from "./utils.js";
11
6
 
12
7
  describe("Function Declaration", () => {
8
+ it("renders multiple decorators above def without blank lines", () => {
9
+ expect(
10
+ <TestOutput>
11
+ <py.FunctionDeclaration name="f" decorators={["@a", "@b", "@c"]}>
12
+ pass
13
+ </py.FunctionDeclaration>
14
+ </TestOutput>,
15
+ ).toRenderTo(
16
+ `
17
+ @a
18
+ @b
19
+ @c
20
+ def f():
21
+ pass
22
+
23
+ `,
24
+ );
25
+ });
26
+
13
27
  it("renders a function with no body as 'pass'", () => {
14
- const result = toSourceText([<py.FunctionDeclaration name="foo" />]);
15
- expect(result).toRenderTo(d`
28
+ expect(
29
+ <TestOutput>
30
+ <py.FunctionDeclaration name="foo" />
31
+ </TestOutput>,
32
+ ).toRenderTo(
33
+ `
16
34
  def foo():
17
35
  pass
18
36
 
19
-
20
- `);
37
+ `,
38
+ );
21
39
  });
22
40
 
23
41
  it("takes a namekey", () => {
24
- const result = toSourceText([
25
- <py.FunctionDeclaration name={namekey("foo-bar")} />,
26
- ]);
27
- expect(result).toRenderTo(d`
42
+ expect(
43
+ <TestOutput>
44
+ <py.FunctionDeclaration name={namekey("foo-bar")} />
45
+ </TestOutput>,
46
+ ).toRenderTo(
47
+ `
28
48
  def foo_bar():
29
49
  pass
30
50
 
31
-
32
- `);
51
+ `,
52
+ );
33
53
  });
34
54
 
35
55
  it("renders a function with no body as 'pass' with return type", () => {
36
- const result = toSourceText([
37
- <py.FunctionDeclaration name="foo" returnType="int" />,
38
- ]);
39
- expect(result).toRenderTo(d`
56
+ expect(
57
+ <TestOutput>
58
+ <py.FunctionDeclaration name="foo" returnType="int" />
59
+ </TestOutput>,
60
+ ).toRenderTo(
61
+ `
40
62
  def foo() -> int:
41
63
  pass
42
64
 
43
-
44
- `);
65
+ `,
66
+ );
45
67
  });
46
68
 
47
69
  it("renders a function that calls another function", () => {
48
70
  const refkeyFoo = refkey();
49
- const result = toSourceText([
50
- <py.StatementList>
51
- <py.FunctionDeclaration
52
- name="foo"
53
- returnType="int"
54
- refkey={refkeyFoo}
55
- />
56
- <py.FunctionDeclaration name="bar" returnType="int">
57
- <py.VariableDeclaration
58
- name="result"
59
- type="int"
60
- initializer={
61
- <py.FunctionCallExpression target={refkeyFoo} args={[]} />
62
- }
71
+ expect(
72
+ <TestOutput>
73
+ <py.StatementList>
74
+ <py.FunctionDeclaration
75
+ name="foo"
76
+ returnType="int"
77
+ refkey={refkeyFoo}
63
78
  />
64
- </py.FunctionDeclaration>
65
- </py.StatementList>,
66
- ]);
67
- expect(result).toRenderTo(d`
79
+ <py.FunctionDeclaration name="bar" returnType="int">
80
+ <py.VariableDeclaration
81
+ name="result"
82
+ type="int"
83
+ initializer={
84
+ <py.FunctionCallExpression target={refkeyFoo} args={[]} />
85
+ }
86
+ />
87
+ </py.FunctionDeclaration>
88
+ </py.StatementList>
89
+ </TestOutput>,
90
+ ).toRenderTo(
91
+ `
68
92
  def foo() -> int:
69
93
  pass
70
94
 
71
95
  def bar() -> int:
72
96
  result: int = foo()
73
97
 
74
-
75
- `);
98
+ `,
99
+ );
76
100
  });
77
101
 
78
102
  it("renders a function with parameters", () => {
79
- const result = toSourceText([
80
- <py.FunctionDeclaration
81
- name="baz"
82
- parameters={[
83
- { name: "x", type: "int" },
84
- { name: "y", default: 0 },
85
- { name: "z", type: "int", default: 42 },
86
- ]}
87
- args={true}
88
- kwargs={true}
89
- >
90
- print(x, y)
91
- </py.FunctionDeclaration>,
92
- ]);
93
- expect(result).toRenderTo(
94
- d`
103
+ expect(
104
+ <TestOutput>
105
+ <py.FunctionDeclaration
106
+ name="baz"
107
+ parameters={[
108
+ { name: "x", type: "int" },
109
+ { name: "y", default: 0 },
110
+ { name: "z", type: "int", default: 42 },
111
+ ]}
112
+ args={true}
113
+ kwargs={true}
114
+ >
115
+ print(x, y)
116
+ </py.FunctionDeclaration>
117
+ </TestOutput>,
118
+ ).toRenderTo(
119
+ `
95
120
  def baz(x: int, y=0, z: int = 42, *args, **kwargs):
96
121
  print(x, y)
97
122
 
98
-
99
123
  `,
100
124
  );
101
125
  });
102
126
 
103
127
  it("renders an __init__ function with no body as 'pass'", () => {
104
- const result = toSourceText([
105
- <py.ClassDeclaration name="MyClass">
106
- <py.DunderMethodDeclaration
107
- name="__init__"
108
- parameters={[{ name: "x" }]}
109
- />
110
- </py.ClassDeclaration>,
111
- ]);
112
- expect(result).toRenderTo(d`
128
+ expect(
129
+ <TestOutput>
130
+ <py.ClassDeclaration name="MyClass">
131
+ <py.DunderMethodDeclaration
132
+ name="__init__"
133
+ parameters={[{ name: "x" }]}
134
+ />
135
+ </py.ClassDeclaration>
136
+ </TestOutput>,
137
+ ).toRenderTo(
138
+ `
113
139
  class MyClass:
114
140
  def __init__(self, x):
115
141
  pass
116
142
 
117
-
118
-
119
- `);
143
+
144
+ `,
145
+ );
120
146
  });
121
147
 
122
148
  it("can be an async function", () => {
123
- expect(toSourceText([<py.FunctionDeclaration async name="foo" />])).toBe(d`
149
+ expect(
150
+ <TestOutput>
151
+ <py.FunctionDeclaration async name="foo" />
152
+ </TestOutput>,
153
+ ).toRenderTo(
154
+ `
124
155
  async def foo():
125
156
  pass
126
157
 
127
- `);
158
+ `,
159
+ );
128
160
  });
129
161
 
130
162
  it("can be an async function with returnType", () => {
131
163
  expect(
132
- toSourceText([
133
- <py.FunctionDeclaration async name="foo" returnType={"Foo"} />,
134
- ]),
135
- ).toBe(d`
164
+ <TestOutput>
165
+ <py.FunctionDeclaration async name="foo" returnType={"Foo"} />
166
+ </TestOutput>,
167
+ ).toRenderTo(
168
+ `
136
169
  async def foo() -> Foo:
137
170
  pass
138
171
 
139
- `);
172
+ `,
173
+ );
140
174
  });
141
175
 
142
176
  it("can be an async function with returnType element with Reference", () => {
143
177
  expect(
144
- toSourceText([
178
+ <TestOutput>
145
179
  <py.StatementList>
146
180
  <py.ClassDeclaration name="Foo" refkey={refkey("Foo")} />
147
181
  <py.FunctionDeclaration async name="foo" returnType={refkey("Foo")} />
148
- </py.StatementList>,
149
- ]),
150
- ).toBe(d`
182
+ </py.StatementList>
183
+ </TestOutput>,
184
+ ).toRenderTo(
185
+ `
151
186
  class Foo:
152
187
  pass
153
188
 
154
189
  async def foo() -> Foo:
155
190
  pass
156
191
 
157
- `);
192
+ `,
193
+ );
158
194
  });
159
195
 
160
196
  it("can be an async function with returnType element with list of References", () => {
161
197
  expect(
162
- toSourceText([
198
+ <TestOutput>
163
199
  <py.StatementList>
164
200
  <py.ClassDeclaration name="Foo" refkey={refkey("Foo")} />
165
201
  <py.FunctionDeclaration
@@ -167,16 +203,18 @@ describe("Function Declaration", () => {
167
203
  name="foo"
168
204
  returnType={code`list[${refkey("Foo")}]`}
169
205
  />
170
- </py.StatementList>,
171
- ]),
172
- ).toBe(d`
206
+ </py.StatementList>
207
+ </TestOutput>,
208
+ ).toRenderTo(
209
+ `
173
210
  class Foo:
174
211
  pass
175
212
 
176
213
  async def foo() -> list[Foo]:
177
214
  pass
178
215
 
179
- `);
216
+ `,
217
+ );
180
218
  });
181
219
 
182
220
  it("can be an async dunder method", () => {
@@ -196,13 +234,15 @@ describe("Function Declaration", () => {
196
234
  </py.StatementList>
197
235
  );
198
236
 
199
- expect(toSourceText([decl])).toBe(d`
237
+ expect(<TestOutput>{decl}</TestOutput>).toRenderTo(
238
+ `
200
239
  class MyClass:
201
240
  async def __aenter__(self) -> MyClass:
202
241
  return self
203
242
 
204
243
 
205
- `);
244
+ `,
245
+ );
206
246
  });
207
247
 
208
248
  it("can be an async constructor", () => {
@@ -218,13 +258,15 @@ describe("Function Declaration", () => {
218
258
  </py.StatementList>
219
259
  );
220
260
 
221
- expect(toSourceText([decl])).toBe(d`
261
+ expect(<TestOutput>{decl}</TestOutput>).toRenderTo(
262
+ `
222
263
  class MyClass:
223
264
  async def __new__(cls) -> MyClass:
224
265
  return super().__new__(cls)
225
266
 
226
267
 
227
- `);
268
+ `,
269
+ );
228
270
  });
229
271
 
230
272
  it("supports parameters", () => {
@@ -237,12 +279,15 @@ describe("Function Declaration", () => {
237
279
  </py.FunctionDeclaration>
238
280
  );
239
281
 
240
- expect(toSourceText([decl])).toBe(d`
282
+ expect(<TestOutput>{decl}</TestOutput>).toRenderTo(
283
+ `
241
284
  def foo(a, b):
242
285
  return a + b
243
286
 
244
- `);
287
+ `,
288
+ );
245
289
  });
290
+
246
291
  it("supports type parameters", () => {
247
292
  const decl = (
248
293
  <py.FunctionDeclaration
@@ -254,12 +299,15 @@ describe("Function Declaration", () => {
254
299
  </py.FunctionDeclaration>
255
300
  );
256
301
 
257
- expect(toSourceText([decl])).toBe(d`
302
+ expect(<TestOutput>{decl}</TestOutput>).toRenderTo(
303
+ `
258
304
  def foo[T, U](a, b):
259
305
  return a + b
260
306
 
261
- `);
307
+ `,
308
+ );
262
309
  });
310
+
263
311
  it("renders abstract methods", () => {
264
312
  const parameters = [{ name: "x", type: "int" }];
265
313
  const decl = (
@@ -286,7 +334,8 @@ describe("Function Declaration", () => {
286
334
  </py.StatementList>
287
335
  );
288
336
 
289
- expect(toSourceText([decl], { externals: [abcModule] })).toBe(d`
337
+ expect(<TestOutput externals={[abcModule]}>{decl}</TestOutput>).toRenderTo(
338
+ `
290
339
  from abc import abstractmethod
291
340
 
292
341
 
@@ -306,8 +355,10 @@ describe("Function Declaration", () => {
306
355
  pass
307
356
 
308
357
 
309
- `);
358
+ `,
359
+ );
310
360
  });
361
+
311
362
  it("renders dunder methods with parameters", () => {
312
363
  const parameters = [{ name: "x", type: "int" }];
313
364
  const decl = (
@@ -323,7 +374,8 @@ describe("Function Declaration", () => {
323
374
  </py.ClassDeclaration>
324
375
  );
325
376
 
326
- expect(toSourceText([decl])).toBe(d`
377
+ expect(<TestOutput>{decl}</TestOutput>).toRenderTo(
378
+ `
327
379
  class MyClass:
328
380
  def __init__(self, x: int):
329
381
  self.attribute = "value"
@@ -332,7 +384,8 @@ describe("Function Declaration", () => {
332
384
  return "MyClass"
333
385
 
334
386
 
335
- `);
387
+ `,
388
+ );
336
389
  });
337
390
 
338
391
  it("renders dunder methods __new__", () => {
@@ -346,13 +399,15 @@ describe("Function Declaration", () => {
346
399
  </py.ClassDeclaration>
347
400
  );
348
401
 
349
- expect(toSourceText([decl])).toBe(d`
402
+ expect(<TestOutput>{decl}</TestOutput>).toRenderTo(
403
+ `
350
404
  class MyClass:
351
405
  def __new__(cls, *args, **kwargs):
352
406
  pass
353
407
 
354
408
 
355
- `);
409
+ `,
410
+ );
356
411
  });
357
412
 
358
413
  it("renders nested functions", () => {
@@ -394,7 +449,8 @@ describe("Function Declaration", () => {
394
449
  </py.FunctionDeclaration>
395
450
  );
396
451
 
397
- expect(toSourceText([decl])).toBe(d`
452
+ expect(<TestOutput>{decl}</TestOutput>).toRenderTo(
453
+ `
398
454
  def foo(x: int):
399
455
  def bar(y: int):
400
456
  def foobar(z: int):
@@ -402,39 +458,41 @@ describe("Function Declaration", () => {
402
458
  return foobar(2)
403
459
  return bar(3)
404
460
 
405
- `);
461
+ `,
462
+ );
406
463
  });
407
- it("renders complex typing structure", () => {
408
- const res = toSourceTextMultiple([
409
- <py.SourceFile path="mod1.py">
410
- <py.ClassDeclaration name="Foo" refkey={refkey("Foo")} />
411
- </py.SourceFile>,
412
- <py.SourceFile path="mod2.py">
413
- <py.ClassDeclaration name="A" refkey={refkey("A")} />
414
- <py.ClassDeclaration name="B" refkey={refkey("B")} />
415
- </py.SourceFile>,
416
- <py.SourceFile path="usage.py">
417
- <py.FunctionDeclaration
418
- async
419
- name="foo"
420
- parameters={[
421
- {
422
- name: "x",
423
- type: refkey("A"),
424
- },
425
- {
426
- name: "y",
427
- type: refkey("B"),
428
- },
429
- ]}
430
- args={true}
431
- kwargs={true}
432
- returnType={refkey("Foo")}
433
- />
434
- </py.SourceFile>,
435
- ]);
436
464
 
437
- assertFileContents(res, {
465
+ it("renders complex typing structure", () => {
466
+ expect(
467
+ <TestOutputDirectory>
468
+ <py.SourceFile path="mod1.py">
469
+ <py.ClassDeclaration name="Foo" refkey={refkey("Foo")} />
470
+ </py.SourceFile>
471
+ <py.SourceFile path="mod2.py">
472
+ <py.ClassDeclaration name="A" refkey={refkey("A")} />
473
+ <py.ClassDeclaration name="B" refkey={refkey("B")} />
474
+ </py.SourceFile>
475
+ <py.SourceFile path="usage.py">
476
+ <py.FunctionDeclaration
477
+ async
478
+ name="foo"
479
+ parameters={[
480
+ {
481
+ name: "x",
482
+ type: refkey("A"),
483
+ },
484
+ {
485
+ name: "y",
486
+ type: refkey("B"),
487
+ },
488
+ ]}
489
+ args={true}
490
+ kwargs={true}
491
+ returnType={refkey("Foo")}
492
+ />
493
+ </py.SourceFile>
494
+ </TestOutputDirectory>,
495
+ ).toRenderTo({
438
496
  "mod1.py": `
439
497
  class Foo:
440
498
  pass
@@ -467,13 +525,21 @@ describe("Function Declaration", () => {
467
525
 
468
526
  it("throws error when PropertyDeclaration is used outside of a class", () => {
469
527
  expect(() => {
470
- toSourceText([<py.PropertyDeclaration name="x" />]);
528
+ render(
529
+ <TestOutput>
530
+ <py.PropertyDeclaration name="x" />
531
+ </TestOutput>,
532
+ );
471
533
  }).toThrow('Method "x" must be declared inside a class (member scope)');
472
534
  });
473
535
 
474
536
  it("throws error when MethodDeclaration is used outside of a class", () => {
475
537
  expect(() => {
476
- toSourceText([<py.MethodDeclaration name="my_method" />]);
538
+ render(
539
+ <TestOutput>
540
+ <py.MethodDeclaration name="my_method" />
541
+ </TestOutput>,
542
+ );
477
543
  }).toThrow(
478
544
  'Method "my_method" must be declared inside a class (member scope)',
479
545
  );
@@ -481,7 +547,11 @@ describe("Function Declaration", () => {
481
547
 
482
548
  it("throws error when ClassMethodDeclaration is used outside of a class", () => {
483
549
  expect(() => {
484
- toSourceText([<py.ClassMethodDeclaration name="my_class_method" />]);
550
+ render(
551
+ <TestOutput>
552
+ <py.ClassMethodDeclaration name="my_class_method" />
553
+ </TestOutput>,
554
+ );
485
555
  }).toThrow(
486
556
  'Method "my_class_method" must be declared inside a class (member scope)',
487
557
  );
@@ -489,7 +559,11 @@ describe("Function Declaration", () => {
489
559
 
490
560
  it("throws error when StaticMethodDeclaration is used outside of a class", () => {
491
561
  expect(() => {
492
- toSourceText([<py.StaticMethodDeclaration name="my_static_method" />]);
562
+ render(
563
+ <TestOutput>
564
+ <py.StaticMethodDeclaration name="my_static_method" />
565
+ </TestOutput>,
566
+ );
493
567
  }).toThrow(
494
568
  'Method "my_static_method" must be declared inside a class (member scope)',
495
569
  );
@@ -497,7 +571,11 @@ describe("Function Declaration", () => {
497
571
 
498
572
  it("throws error when DunderMethodDeclaration is used outside of a class", () => {
499
573
  expect(() => {
500
- toSourceText([<py.DunderMethodDeclaration name="__init__" />]);
574
+ render(
575
+ <TestOutput>
576
+ <py.DunderMethodDeclaration name="__init__" />
577
+ </TestOutput>,
578
+ );
501
579
  }).toThrow(
502
580
  'Method "__init__" must be declared inside a class (member scope)',
503
581
  );