@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
@@ -0,0 +1,114 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { DecoratorList } from "../src/components/DecoratorList.jsx";
3
+ import { TestOutput } from "./utils.js";
4
+
5
+ /**
6
+ * Direct contract tests for `DecoratorList`. The component is exercised
7
+ * transitively by every method/property test, but pinning the three core
8
+ * behaviors here makes regressions caught at the helper's own boundary —
9
+ * not after they propagate through every consumer.
10
+ */
11
+ describe("DecoratorList", () => {
12
+ it("renders nothing when decorators is undefined", () => {
13
+ expect(
14
+ <TestOutput>
15
+ {[
16
+ <>
17
+ <DecoratorList />
18
+ pass
19
+ </>,
20
+ ]}
21
+ </TestOutput>,
22
+ ).toRenderTo("pass");
23
+ });
24
+
25
+ it("renders nothing when decorators is an empty array", () => {
26
+ expect(
27
+ <TestOutput>
28
+ {[
29
+ <>
30
+ <DecoratorList decorators={[]} />
31
+ pass
32
+ </>,
33
+ ]}
34
+ </TestOutput>,
35
+ ).toRenderTo("pass");
36
+ });
37
+
38
+ it("renders a single decorator followed by exactly one hardline", () => {
39
+ expect(
40
+ <TestOutput>
41
+ {[
42
+ <>
43
+ <DecoratorList decorators={["@one"]} />
44
+ pass
45
+ </>,
46
+ ]}
47
+ </TestOutput>,
48
+ ).toRenderTo(
49
+ `
50
+ @one
51
+ pass
52
+ `,
53
+ );
54
+ });
55
+
56
+ it("renders multiple decorators with no blank lines between adjacent entries", () => {
57
+ expect(
58
+ <TestOutput>
59
+ {[
60
+ <>
61
+ <DecoratorList decorators={["@one", "@two", "@three"]} />
62
+ pass
63
+ </>,
64
+ ]}
65
+ </TestOutput>,
66
+ ).toRenderTo(
67
+ `
68
+ @one
69
+ @two
70
+ @three
71
+ pass
72
+ `,
73
+ );
74
+ });
75
+
76
+ it("preserves source order: first entry is topmost (= applied last)", () => {
77
+ expect(
78
+ <TestOutput>
79
+ {[
80
+ <>
81
+ <DecoratorList decorators={["@outer", "@middle", "@inner"]} />
82
+ pass
83
+ </>,
84
+ ]}
85
+ </TestOutput>,
86
+ ).toRenderTo(
87
+ `
88
+ @outer
89
+ @middle
90
+ @inner
91
+ pass
92
+ `,
93
+ );
94
+ });
95
+
96
+ it("skips falsy entries without emitting blank lines", () => {
97
+ expect(
98
+ <TestOutput>
99
+ {[
100
+ <>
101
+ <DecoratorList decorators={["@one", false, undefined, "@two"]} />
102
+ pass
103
+ </>,
104
+ ]}
105
+ </TestOutput>,
106
+ ).toRenderTo(
107
+ `
108
+ @one
109
+ @two
110
+ pass
111
+ `,
112
+ );
113
+ });
114
+ });
@@ -1,7 +1,6 @@
1
- import { d } from "@alloy-js/core/testing";
2
1
  import { describe, expect, it } from "vitest";
3
2
  import * as py from "../src/index.js";
4
- import { toSourceText } from "./utils.js";
3
+ import { TestOutput } from "./utils.js";
5
4
 
6
5
  describe("Dunder/Constructor Declarations", () => {
7
6
  it("renders dunder methods with parameters", () => {
@@ -19,7 +18,7 @@ describe("Dunder/Constructor Declarations", () => {
19
18
  </py.ClassDeclaration>
20
19
  );
21
20
 
22
- expect(toSourceText([decl])).toBe(d`
21
+ expect(<TestOutput>{decl}</TestOutput>).toRenderTo(`
23
22
  class MyClass:
24
23
  def __init__(self, x: int):
25
24
  self.attribute = "value"
@@ -42,7 +41,7 @@ describe("Dunder/Constructor Declarations", () => {
42
41
  </py.ClassDeclaration>
43
42
  );
44
43
 
45
- expect(toSourceText([decl])).toBe(d`
44
+ expect(<TestOutput>{decl}</TestOutput>).toRenderTo(`
46
45
  class MyClass:
47
46
  def __new__(cls, *args, **kwargs):
48
47
  pass
@@ -1,14 +1,40 @@
1
1
  import { refkey } from "@alloy-js/core";
2
- import { d } from "@alloy-js/core/testing";
3
2
  import { describe, expect, it } from "vitest";
4
3
  import { enumModule } from "../src/builtins/python.js";
5
4
  import * as py from "../src/index.js";
6
- import { toSourceText } from "./utils.jsx";
5
+ import { TestOutput } from "./utils.js";
7
6
 
8
7
  describe("Python Enum", () => {
8
+ it("renders class-level decorators above ClassEnumDeclaration", () => {
9
+ expect(
10
+ <TestOutput externals={[enumModule]}>
11
+ <py.ClassEnumDeclaration
12
+ name="Color"
13
+ baseType="IntEnum"
14
+ decorators={["@final"]}
15
+ members={[
16
+ { name: "RED", value: 1 },
17
+ { name: "GREEN", value: 2 },
18
+ ]}
19
+ />
20
+ </TestOutput>,
21
+ ).toRenderTo(
22
+ `
23
+ from enum import IntEnum
24
+
25
+
26
+ @final
27
+ class Color(IntEnum):
28
+ RED = 1
29
+ GREEN = 2
30
+
31
+ `,
32
+ );
33
+ });
34
+
9
35
  it("class enum with explicit values", () => {
10
- const result = toSourceText(
11
- [
36
+ expect(
37
+ <TestOutput externals={[enumModule]}>
12
38
  <py.ClassEnumDeclaration
13
39
  name="Color"
14
40
  baseType="IntEnum"
@@ -17,11 +43,10 @@ describe("Python Enum", () => {
17
43
  { name: "GREEN", value: "2" },
18
44
  { name: "BLUE", value: "3" },
19
45
  ]}
20
- />,
21
- ],
22
- { externals: [enumModule] },
23
- );
24
- const expected = d`
46
+ />
47
+ </TestOutput>,
48
+ ).toRenderTo(
49
+ `
25
50
  from enum import IntEnum
26
51
 
27
52
 
@@ -30,14 +55,13 @@ describe("Python Enum", () => {
30
55
  GREEN = 2
31
56
  BLUE = 3
32
57
 
33
-
34
- `;
35
- expect(result).toRenderTo(expected);
58
+ `,
59
+ );
36
60
  });
37
61
 
38
62
  it("class enum with jsValues", () => {
39
- const result = toSourceText(
40
- [
63
+ expect(
64
+ <TestOutput externals={[enumModule]}>
41
65
  <py.ClassEnumDeclaration
42
66
  name="Color"
43
67
  baseType="IntEnum"
@@ -46,11 +70,10 @@ describe("Python Enum", () => {
46
70
  { name: "GREEN", jsValue: 2 },
47
71
  { name: "BLUE", jsValue: "3" },
48
72
  ]}
49
- />,
50
- ],
51
- { externals: [enumModule] },
52
- );
53
- const expected = d`
73
+ />
74
+ </TestOutput>,
75
+ ).toRenderTo(
76
+ `
54
77
  from enum import IntEnum
55
78
 
56
79
 
@@ -59,14 +82,13 @@ describe("Python Enum", () => {
59
82
  GREEN = 2
60
83
  BLUE = "3"
61
84
 
62
-
63
- `;
64
- expect(result).toRenderTo(expected);
85
+ `,
86
+ );
65
87
  });
66
88
 
67
89
  it("class enum with a refkey as jsValue", () => {
68
- const result = toSourceText(
69
- [
90
+ expect(
91
+ <TestOutput externals={[enumModule]}>
70
92
  <py.StatementList>
71
93
  <py.ClassDeclaration name="Dog" refkey={refkey("Dog")} />
72
94
  <py.ClassDeclaration name="Cat" refkey={refkey("Cat")} />
@@ -78,11 +100,10 @@ describe("Python Enum", () => {
78
100
  { name: "CAT", value: refkey("Cat") },
79
101
  ]}
80
102
  />
81
- </py.StatementList>,
82
- ],
83
- { externals: [enumModule] },
84
- );
85
- const expected = d`
103
+ </py.StatementList>
104
+ </TestOutput>,
105
+ ).toRenderTo(
106
+ `
86
107
  from enum import Enum
87
108
 
88
109
 
@@ -96,23 +117,21 @@ describe("Python Enum", () => {
96
117
  DOG = Dog
97
118
  CAT = Cat
98
119
 
99
-
100
- `;
101
- expect(result).toRenderTo(expected);
120
+ `,
121
+ );
102
122
  });
103
123
 
104
124
  it("class enum with auto() values", () => {
105
- const result = toSourceText(
106
- [
125
+ expect(
126
+ <TestOutput externals={[enumModule]}>
107
127
  <py.ClassEnumDeclaration
108
128
  name="Animal"
109
129
  auto
110
130
  members={[{ name: "DOG" }, { name: "CAT" }, { name: "RABBIT" }]}
111
- />,
112
- ],
113
- { externals: [enumModule] },
114
- );
115
- const expected = d`
131
+ />
132
+ </TestOutput>,
133
+ ).toRenderTo(
134
+ `
116
135
  from enum import auto
117
136
  from enum import Enum
118
137
 
@@ -122,14 +141,13 @@ describe("Python Enum", () => {
122
141
  CAT = auto()
123
142
  RABBIT = auto()
124
143
 
125
-
126
- `;
127
- expect(result).toRenderTo(expected);
144
+ `,
145
+ );
128
146
  });
129
147
 
130
148
  it("class enum with mixed manual and auto() values", () => {
131
- const result = toSourceText(
132
- [
149
+ expect(
150
+ <TestOutput externals={[enumModule]}>
133
151
  <py.ClassEnumDeclaration
134
152
  name="Permission"
135
153
  baseType="Flag"
@@ -139,12 +157,10 @@ describe("Python Enum", () => {
139
157
  { name: "WRITE" },
140
158
  { name: "EXECUTE" },
141
159
  ]}
142
- />,
143
- ],
144
- { externals: [enumModule] },
145
- );
146
-
147
- const expected = d`
160
+ />
161
+ </TestOutput>,
162
+ ).toRenderTo(
163
+ `
148
164
  from enum import auto
149
165
  from enum import Flag
150
166
 
@@ -154,14 +170,13 @@ describe("Python Enum", () => {
154
170
  WRITE = auto()
155
171
  EXECUTE = auto()
156
172
 
157
-
158
- `;
159
- expect(result).toRenderTo(expected);
173
+ `,
174
+ );
160
175
  });
161
176
 
162
177
  it("functional enum with list", () => {
163
- const result = toSourceText(
164
- [
178
+ expect(
179
+ <TestOutput externals={[enumModule]}>
165
180
  <py.FunctionalEnumDeclaration
166
181
  name="Direction"
167
182
  members={[
@@ -170,22 +185,21 @@ describe("Python Enum", () => {
170
185
  { name: "EAST" },
171
186
  { name: "WEST" },
172
187
  ]}
173
- />,
174
- ],
175
- { externals: [enumModule] },
176
- );
177
- const expected = d`
188
+ />
189
+ </TestOutput>,
190
+ ).toRenderTo(
191
+ `
178
192
  from enum import Enum
179
193
 
180
194
 
181
195
  Direction = Enum('Direction', ['NORTH', 'SOUTH', 'EAST', 'WEST'])
182
- `;
183
- expect(result).toRenderTo(expected);
196
+ `,
197
+ );
184
198
  });
185
199
 
186
200
  it("functional enum with mapping", () => {
187
- const result = toSourceText(
188
- [
201
+ expect(
202
+ <TestOutput externals={[enumModule]}>
189
203
  <py.FunctionalEnumDeclaration
190
204
  name="Priority"
191
205
  members={[
@@ -193,16 +207,15 @@ describe("Python Enum", () => {
193
207
  { name: "MEDIUM", value: 2 },
194
208
  { name: "LOW", value: 3 },
195
209
  ]}
196
- />,
197
- ],
198
- { externals: [enumModule] },
199
- );
200
- const expected = d`
210
+ />
211
+ </TestOutput>,
212
+ ).toRenderTo(
213
+ `
201
214
  from enum import Enum
202
215
 
203
216
 
204
217
  Priority = Enum('Priority', {'HIGH' : 1, 'MEDIUM' : 2, 'LOW' : 3})
205
- `;
206
- expect(result).toRenderTo(expected);
218
+ `,
219
+ );
207
220
  });
208
221
  });
@@ -1,9 +1,8 @@
1
1
  import { code, refkey } from "@alloy-js/core";
2
- import { d } from "@alloy-js/core/testing";
3
2
  import { expect, it } from "vitest";
4
3
  import * as py from "../src/index.js";
5
4
  import { createModule } from "../src/index.js";
6
- import { toSourceText } from "./utils.js";
5
+ import { TestOutput } from "./utils.js";
7
6
 
8
7
  it("uses import from external library", () => {
9
8
  const requestsLib = createModule({
@@ -14,19 +13,18 @@ it("uses import from external library", () => {
14
13
  "models.anothermodule": ["something"],
15
14
  },
16
15
  });
17
- const result = toSourceText(
18
- [
16
+ expect(
17
+ <TestOutput externals={[requestsLib]}>
19
18
  <py.StatementList>
20
19
  {requestsLib["."].get}
21
20
  {requestsLib["."].post}
22
21
  {requestsLib["models"].Request}
23
22
  {requestsLib["models"].Response}
24
23
  {requestsLib["models.anothermodule"].something}
25
- </py.StatementList>,
26
- ],
27
- { externals: [requestsLib] },
28
- );
29
- const expected = d`
24
+ </py.StatementList>
25
+ </TestOutput>,
26
+ ).toRenderTo(
27
+ `
30
28
  from requests import get
31
29
  from requests import post
32
30
  from requests.models import Request
@@ -38,8 +36,8 @@ it("uses import from external library", () => {
38
36
  Request
39
37
  Response
40
38
  something
41
- `;
42
- expect(result).toRenderTo(expected);
39
+ `,
40
+ );
43
41
  });
44
42
 
45
43
  it("uses import from external library in multiple functions", () => {
@@ -86,10 +84,12 @@ it("uses import from external library in multiple functions", () => {
86
84
  </py.FunctionDeclaration>,
87
85
  ];
88
86
 
89
- const result = toSourceText(functionDeclarations, {
90
- externals: [py.requestsModule],
91
- });
92
- const expected = d`
87
+ expect(
88
+ <TestOutput externals={[py.requestsModule]}>
89
+ {functionDeclarations}
90
+ </TestOutput>,
91
+ ).toRenderTo(
92
+ `
93
93
  from requests import get
94
94
  from requests import post
95
95
  from typing import TYPE_CHECKING
@@ -107,9 +107,8 @@ it("uses import from external library in multiple functions", () => {
107
107
  response = post(1)
108
108
  return response.json()
109
109
 
110
-
111
- `;
112
- expect(result).toRenderTo(expected);
110
+ `,
111
+ );
113
112
  });
114
113
 
115
114
  it("uses import from external library in multiple class methods", () => {
@@ -166,10 +165,12 @@ it("uses import from external library in multiple class methods", () => {
166
165
  </py.ClassDeclaration>,
167
166
  ];
168
167
 
169
- const result = toSourceText(functionDeclarations, {
170
- externals: [py.requestsModule],
171
- });
172
- const expected = d`
168
+ expect(
169
+ <TestOutput externals={[py.requestsModule]}>
170
+ {functionDeclarations}
171
+ </TestOutput>,
172
+ ).toRenderTo(
173
+ `
173
174
  from requests import get
174
175
  from requests import post
175
176
  from typing import TYPE_CHECKING
@@ -189,7 +190,6 @@ it("uses import from external library in multiple class methods", () => {
189
190
  return response.json()
190
191
 
191
192
 
192
-
193
- `;
194
- expect(result).toRenderTo(expected);
193
+ `,
194
+ );
195
195
  });
@@ -1,46 +1,76 @@
1
+ import { render } from "@alloy-js/core";
1
2
  import { describe, expect, it } from "vitest";
2
3
  import * as py from "../src/index.js";
3
- import { toSourceText } from "./utils.js";
4
+ import { TestOutput } from "./utils.js";
4
5
 
5
6
  describe("Symbol factories", () => {
6
7
  it("createMethodSymbol throws outside class", () => {
7
8
  expect(() => {
8
- toSourceText([<py.MethodDeclaration name="m" />]);
9
+ render(
10
+ <TestOutput>
11
+ <py.MethodDeclaration name="m" />
12
+ </TestOutput>,
13
+ );
9
14
  }).toThrow('Method "m" must be declared inside a class (member scope)');
10
15
  });
11
16
 
12
17
  it("createMethodSymbol succeeds inside class", () => {
13
- const result = toSourceText([
14
- <py.ClassDeclaration name="C">
15
- <py.MethodDeclaration name="m" />
16
- </py.ClassDeclaration>,
17
- ]);
18
- expect(result).toContain("def m(self):");
18
+ expect(
19
+ <TestOutput>
20
+ <py.ClassDeclaration name="C">
21
+ <py.MethodDeclaration name="m" />
22
+ </py.ClassDeclaration>
23
+ </TestOutput>,
24
+ ).toRenderTo(
25
+ `
26
+ class C:
27
+ def m(self):
28
+ pass
29
+
30
+
31
+ `,
32
+ );
19
33
  });
20
34
 
21
35
  it("createFunctionSymbol usable in member scope (top-level function component still works nested)", () => {
22
- const result = toSourceText([
23
- <py.ClassDeclaration name="C">
24
- <py.StatementList>
25
- <py.FunctionDeclaration name="f" />
26
- </py.StatementList>
27
- </py.ClassDeclaration>,
28
- ]);
29
- // Nested free functions render without self/cls
30
- expect(result).toContain("def f():");
36
+ expect(
37
+ <TestOutput>
38
+ <py.ClassDeclaration name="C">
39
+ <py.StatementList>
40
+ <py.FunctionDeclaration name="f" />
41
+ </py.StatementList>
42
+ </py.ClassDeclaration>
43
+ </TestOutput>,
44
+ ).toRenderTo(
45
+ `
46
+ class C:
47
+ def f():
48
+ pass
49
+
50
+
51
+ `,
52
+ );
31
53
  });
32
54
  });
33
55
 
34
56
  describe("Validation Errors", () => {
35
57
  it("throws error when PropertyDeclaration is used outside of a class", () => {
36
58
  expect(() => {
37
- toSourceText([<py.PropertyDeclaration name="x" />]);
59
+ render(
60
+ <TestOutput>
61
+ <py.PropertyDeclaration name="x" />
62
+ </TestOutput>,
63
+ );
38
64
  }).toThrow('Method "x" must be declared inside a class (member scope)');
39
65
  });
40
66
 
41
67
  it("throws error when MethodDeclaration is used outside of a class", () => {
42
68
  expect(() => {
43
- toSourceText([<py.MethodDeclaration name="my_method" />]);
69
+ render(
70
+ <TestOutput>
71
+ <py.MethodDeclaration name="my_method" />
72
+ </TestOutput>,
73
+ );
44
74
  }).toThrow(
45
75
  'Method "my_method" must be declared inside a class (member scope)',
46
76
  );
@@ -48,7 +78,11 @@ describe("Validation Errors", () => {
48
78
 
49
79
  it("throws error when ClassMethodDeclaration is used outside of a class", () => {
50
80
  expect(() => {
51
- toSourceText([<py.ClassMethodDeclaration name="my_class_method" />]);
81
+ render(
82
+ <TestOutput>
83
+ <py.ClassMethodDeclaration name="my_class_method" />
84
+ </TestOutput>,
85
+ );
52
86
  }).toThrow(
53
87
  'Method "my_class_method" must be declared inside a class (member scope)',
54
88
  );
@@ -56,7 +90,11 @@ describe("Validation Errors", () => {
56
90
 
57
91
  it("throws error when StaticMethodDeclaration is used outside of a class", () => {
58
92
  expect(() => {
59
- toSourceText([<py.StaticMethodDeclaration name="my_static_method" />]);
93
+ render(
94
+ <TestOutput>
95
+ <py.StaticMethodDeclaration name="my_static_method" />
96
+ </TestOutput>,
97
+ );
60
98
  }).toThrow(
61
99
  'Method "my_static_method" must be declared inside a class (member scope)',
62
100
  );
@@ -64,7 +102,11 @@ describe("Validation Errors", () => {
64
102
 
65
103
  it("throws error when DunderMethodDeclaration is used outside of a class", () => {
66
104
  expect(() => {
67
- toSourceText([<py.DunderMethodDeclaration name="__init__" />]);
105
+ render(
106
+ <TestOutput>
107
+ <py.DunderMethodDeclaration name="__init__" />
108
+ </TestOutput>,
109
+ );
68
110
  }).toThrow(
69
111
  'Method "__init__" must be declared inside a class (member scope)',
70
112
  );