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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/dev/src/components/CallSignature.js +2 -2
  3. package/dist/dev/src/components/CallSignature.js.map +1 -1
  4. package/dist/dev/src/components/ConstructorDeclaration.js +1 -1
  5. package/dist/dev/src/components/ConstructorDeclaration.js.map +1 -1
  6. package/dist/dev/src/components/DataclassDeclaration.js +5 -5
  7. package/dist/dev/src/components/DataclassDeclaration.js.map +1 -1
  8. package/dist/dev/src/components/FunctionBase.js +9 -9
  9. package/dist/dev/src/components/FunctionBase.js.map +1 -1
  10. package/dist/dev/src/components/PropertyDeclaration.js +8 -8
  11. package/dist/dev/src/components/PropertyDeclaration.js.map +1 -1
  12. package/dist/dev/src/components/PyDoc.js +64 -64
  13. package/dist/dev/src/components/PyDoc.js.map +1 -1
  14. package/dist/dev/src/components/PydanticClassDeclaration.js +5 -5
  15. package/dist/dev/src/components/PydanticClassDeclaration.js.map +1 -1
  16. package/dist/dev/src/components/SourceFile.js +44 -32
  17. package/dist/dev/src/components/SourceFile.js.map +1 -1
  18. package/dist/dev/src/symbols/python-output-symbol.js.map +1 -1
  19. package/dist/dev/test/callsignatures.test.js +471 -297
  20. package/dist/dev/test/callsignatures.test.js.map +1 -1
  21. package/dist/dev/test/class-method-declaration.test.js +21 -10
  22. package/dist/dev/test/class-method-declaration.test.js.map +1 -1
  23. package/dist/dev/test/classdeclarations.test.js +459 -393
  24. package/dist/dev/test/classdeclarations.test.js.map +1 -1
  25. package/dist/dev/test/classinstantiations.test.js +201 -168
  26. package/dist/dev/test/classinstantiations.test.js.map +1 -1
  27. package/dist/dev/test/constructordeclaration.test.js +22 -11
  28. package/dist/dev/test/constructordeclaration.test.js.map +1 -1
  29. package/dist/dev/test/dataclassdeclarations.test.js +322 -368
  30. package/dist/dev/test/dataclassdeclarations.test.js.map +1 -1
  31. package/dist/dev/test/decoratorlist.test.js +96 -49
  32. package/dist/dev/test/decoratorlist.test.js.map +1 -1
  33. package/dist/dev/test/dundermethoddeclaration.test.js +22 -11
  34. package/dist/dev/test/dundermethoddeclaration.test.js.map +1 -1
  35. package/dist/dev/test/enums.test.js +218 -184
  36. package/dist/dev/test/enums.test.js.map +1 -1
  37. package/dist/dev/test/externals.test.js +57 -45
  38. package/dist/dev/test/externals.test.js.map +1 -1
  39. package/dist/dev/test/factories.test.js +124 -50
  40. package/dist/dev/test/factories.test.js.map +1 -1
  41. package/dist/dev/test/functioncallexpressions.test.js +199 -164
  42. package/dist/dev/test/functioncallexpressions.test.js.map +1 -1
  43. package/dist/dev/test/functiondeclaration.test.js +439 -272
  44. package/dist/dev/test/functiondeclaration.test.js.map +1 -1
  45. package/dist/dev/test/imports.test.js +273 -221
  46. package/dist/dev/test/imports.test.js.map +1 -1
  47. package/dist/dev/test/memberexpressions.test.js +1237 -972
  48. package/dist/dev/test/memberexpressions.test.js.map +1 -1
  49. package/dist/dev/test/methoddeclaration.test.js +142 -78
  50. package/dist/dev/test/methoddeclaration.test.js.map +1 -1
  51. package/dist/dev/test/namepolicies.test.js +130 -94
  52. package/dist/dev/test/namepolicies.test.js.map +1 -1
  53. package/dist/dev/test/propertydeclaration.test.js +88 -59
  54. package/dist/dev/test/propertydeclaration.test.js.map +1 -1
  55. package/dist/dev/test/pydanticclassdeclarations.test.js +299 -347
  56. package/dist/dev/test/pydanticclassdeclarations.test.js.map +1 -1
  57. package/dist/dev/test/pydocs.test.js +888 -715
  58. package/dist/dev/test/pydocs.test.js.map +1 -1
  59. package/dist/dev/test/references.test.js +42 -35
  60. package/dist/dev/test/references.test.js.map +1 -1
  61. package/dist/dev/test/sourcefiles.test.js +1109 -841
  62. package/dist/dev/test/sourcefiles.test.js.map +1 -1
  63. package/dist/dev/test/staticmethoddeclaration.test.js +21 -10
  64. package/dist/dev/test/staticmethoddeclaration.test.js.map +1 -1
  65. package/dist/dev/test/type-checking-imports.test.js +408 -359
  66. package/dist/dev/test/type-checking-imports.test.js.map +1 -1
  67. package/dist/dev/test/typereference.test.js +55 -40
  68. package/dist/dev/test/typereference.test.js.map +1 -1
  69. package/dist/dev/test/uniontypeexpression.test.js +222 -146
  70. package/dist/dev/test/uniontypeexpression.test.js.map +1 -1
  71. package/dist/dev/test/utils.js +39 -77
  72. package/dist/dev/test/utils.js.map +1 -1
  73. package/dist/dev/test/values.test.js +237 -101
  74. package/dist/dev/test/values.test.js.map +1 -1
  75. package/dist/dev/test/variables.test.js +321 -203
  76. package/dist/dev/test/variables.test.js.map +1 -1
  77. package/dist/dev/test/vitest.setup.js +2 -0
  78. package/dist/dev/test/vitest.setup.js.map +1 -0
  79. package/dist/src/components/CallSignature.d.ts.map +1 -1
  80. package/dist/src/components/CallSignature.js.map +1 -1
  81. package/dist/src/components/ConstructorDeclaration.d.ts.map +1 -1
  82. package/dist/src/components/ConstructorDeclaration.js.map +1 -1
  83. package/dist/src/components/DataclassDeclaration.d.ts.map +1 -1
  84. package/dist/src/components/DataclassDeclaration.js.map +1 -1
  85. package/dist/src/components/FunctionBase.d.ts.map +1 -1
  86. package/dist/src/components/FunctionBase.js.map +1 -1
  87. package/dist/src/components/PropertyDeclaration.d.ts.map +1 -1
  88. package/dist/src/components/PropertyDeclaration.js.map +1 -1
  89. package/dist/src/components/PyDoc.d.ts.map +1 -1
  90. package/dist/src/components/PyDoc.js.map +1 -1
  91. package/dist/src/components/PydanticClassDeclaration.d.ts.map +1 -1
  92. package/dist/src/components/PydanticClassDeclaration.js.map +1 -1
  93. package/dist/src/components/SourceFile.d.ts +2 -2
  94. package/dist/src/components/SourceFile.d.ts.map +1 -1
  95. package/dist/src/components/SourceFile.js +12 -0
  96. package/dist/src/components/SourceFile.js.map +1 -1
  97. package/dist/src/symbols/python-output-symbol.d.ts.map +1 -1
  98. package/dist/src/symbols/python-output-symbol.js.map +1 -1
  99. package/dist/test/callsignatures.test.js +346 -272
  100. package/dist/test/callsignatures.test.js.map +1 -1
  101. package/dist/test/class-method-declaration.test.js +7 -4
  102. package/dist/test/class-method-declaration.test.js.map +1 -1
  103. package/dist/test/classdeclarations.test.js +302 -288
  104. package/dist/test/classdeclarations.test.js.map +1 -1
  105. package/dist/test/classinstantiations.test.js +112 -103
  106. package/dist/test/classinstantiations.test.js.map +1 -1
  107. package/dist/test/constructordeclaration.test.js +7 -4
  108. package/dist/test/constructordeclaration.test.js.map +1 -1
  109. package/dist/test/dataclassdeclarations.test.js +134 -184
  110. package/dist/test/dataclassdeclarations.test.js.map +1 -1
  111. package/dist/test/decoratorlist.test.js +59 -36
  112. package/dist/test/decoratorlist.test.js.map +1 -1
  113. package/dist/test/dundermethoddeclaration.test.js +7 -4
  114. package/dist/test/dundermethoddeclaration.test.js.map +1 -1
  115. package/dist/test/enums.test.js +161 -159
  116. package/dist/test/enums.test.js.map +1 -1
  117. package/dist/test/externals.test.js +24 -24
  118. package/dist/test/externals.test.js.map +1 -1
  119. package/dist/test/factories.test.js +75 -33
  120. package/dist/test/factories.test.js.map +1 -1
  121. package/dist/test/functioncallexpressions.test.js +117 -106
  122. package/dist/test/functioncallexpressions.test.js.map +1 -1
  123. package/dist/test/functiondeclaration.test.js +247 -180
  124. package/dist/test/functiondeclaration.test.js.map +1 -1
  125. package/dist/test/imports.test.js +171 -143
  126. package/dist/test/imports.test.js.map +1 -1
  127. package/dist/test/memberexpressions.test.js +582 -453
  128. package/dist/test/memberexpressions.test.js.map +1 -1
  129. package/dist/test/methoddeclaration.test.js +66 -46
  130. package/dist/test/methoddeclaration.test.js.map +1 -1
  131. package/dist/test/namepolicies.test.js +90 -78
  132. package/dist/test/namepolicies.test.js.map +1 -1
  133. package/dist/test/propertydeclaration.test.js +25 -20
  134. package/dist/test/propertydeclaration.test.js.map +1 -1
  135. package/dist/test/pydanticclassdeclarations.test.js +134 -190
  136. package/dist/test/pydanticclassdeclarations.test.js.map +1 -1
  137. package/dist/test/pydocs.test.js +573 -532
  138. package/dist/test/pydocs.test.js.map +1 -1
  139. package/dist/test/references.test.js +31 -28
  140. package/dist/test/references.test.js.map +1 -1
  141. package/dist/test/sourcefiles.test.js +700 -580
  142. package/dist/test/sourcefiles.test.js.map +1 -1
  143. package/dist/test/staticmethoddeclaration.test.js +7 -4
  144. package/dist/test/staticmethoddeclaration.test.js.map +1 -1
  145. package/dist/test/type-checking-imports.test.js +297 -284
  146. package/dist/test/type-checking-imports.test.js.map +1 -1
  147. package/dist/test/typereference.test.js +29 -22
  148. package/dist/test/typereference.test.js.map +1 -1
  149. package/dist/test/uniontypeexpression.test.js +124 -88
  150. package/dist/test/uniontypeexpression.test.js.map +1 -1
  151. package/dist/test/utils.d.ts +10 -17
  152. package/dist/test/utils.d.ts.map +1 -1
  153. package/dist/test/utils.js +32 -74
  154. package/dist/test/utils.js.map +1 -1
  155. package/dist/test/values.test.js +135 -67
  156. package/dist/test/values.test.js.map +1 -1
  157. package/dist/test/variables.test.js +201 -151
  158. package/dist/test/variables.test.js.map +1 -1
  159. package/dist/test/vitest.setup.d.ts +2 -0
  160. package/dist/test/vitest.setup.d.ts.map +1 -0
  161. package/dist/test/vitest.setup.js +2 -0
  162. package/dist/test/vitest.setup.js.map +1 -0
  163. package/dist/tsconfig.tsbuildinfo +1 -1
  164. package/docs/api/components/FunctionalEnumDeclaration.md +3 -6
  165. package/docs/api/components/MemberExpression.md +1 -5
  166. package/docs/api/components/SourceFile.md +20 -8
  167. package/docs/api/components/index.md +0 -2
  168. package/docs/api/functions/isTypeRefContext.md +1 -1
  169. package/docs/api/index.md +2 -2
  170. package/docs/api/types/ReferenceProps.md +7 -0
  171. package/docs/api/types/TypeRefContextProps.md +7 -0
  172. package/docs/api/types/index.md +2 -0
  173. package/package.json +11 -10
  174. package/src/components/CallSignature.tsx +4 -2
  175. package/src/components/ConstructorDeclaration.tsx +4 -2
  176. package/src/components/DataclassDeclaration.tsx +1 -2
  177. package/src/components/FunctionBase.tsx +1 -2
  178. package/src/components/PropertyDeclaration.tsx +8 -4
  179. package/src/components/PyDoc.tsx +12 -6
  180. package/src/components/PydanticClassDeclaration.tsx +1 -2
  181. package/src/components/SourceFile.tsx +6 -1
  182. package/src/symbols/python-output-symbol.ts +1 -2
  183. package/temp/api.json +107 -61
  184. package/test/callsignatures.test.tsx +309 -283
  185. package/test/class-method-declaration.test.tsx +3 -4
  186. package/test/classdeclarations.test.tsx +263 -248
  187. package/test/classinstantiations.test.tsx +115 -109
  188. package/test/constructordeclaration.test.tsx +9 -6
  189. package/test/dataclassdeclarations.test.tsx +243 -361
  190. package/test/decoratorlist.test.tsx +78 -59
  191. package/test/dundermethoddeclaration.test.tsx +3 -4
  192. package/test/enums.test.tsx +65 -81
  193. package/test/externals.test.tsx +25 -25
  194. package/test/factories.test.tsx +64 -22
  195. package/test/functioncallexpressions.test.tsx +123 -109
  196. package/test/functiondeclaration.test.tsx +209 -148
  197. package/test/imports.test.tsx +119 -91
  198. package/test/memberexpressions.test.tsx +265 -207
  199. package/test/methoddeclaration.test.tsx +84 -63
  200. package/test/namepolicies.test.tsx +69 -69
  201. package/test/propertydeclaration.test.tsx +7 -8
  202. package/test/pydanticclassdeclarations.test.tsx +355 -487
  203. package/test/pydocs.test.tsx +531 -579
  204. package/test/references.test.tsx +24 -23
  205. package/test/sourcefiles.test.tsx +527 -492
  206. package/test/staticmethoddeclaration.test.tsx +3 -4
  207. package/test/type-checking-imports.test.tsx +206 -218
  208. package/test/typereference.test.tsx +15 -12
  209. package/test/uniontypeexpression.test.tsx +74 -61
  210. package/test/utils.tsx +26 -110
  211. package/test/values.test.tsx +82 -32
  212. package/test/variables.test.tsx +162 -142
  213. package/test/vitest.setup.ts +1 -0
  214. package/tsdoc-metadata.json +1 -1
  215. package/vitest.config.ts +4 -0
  216. package/docs/api/components/Reference.md +0 -31
  217. package/docs/api/components/TypeRefContext.md +0 -41
@@ -1,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("ClassMethodDeclaration", () => {
7
6
  it("renders async class method", () => {
@@ -21,7 +20,7 @@ describe("ClassMethodDeclaration", () => {
21
20
  </py.StatementList>
22
21
  );
23
22
 
24
- expect(toSourceText([decl])).toBe(d`
23
+ expect(<TestOutput>{decl}</TestOutput>).toRenderTo(`
25
24
  class MyClass:
26
25
  @classmethod
27
26
  async def create(cls) -> MyClass:
@@ -41,7 +40,7 @@ describe("ClassMethodDeclaration", () => {
41
40
  </py.ClassDeclaration>
42
41
  );
43
42
 
44
- expect(toSourceText([decl])).toBe(d`
43
+ expect(<TestOutput>{decl}</TestOutput>).toRenderTo(`
45
44
  class MyClass:
46
45
  @classmethod
47
46
  def foo(cls, x: int):
@@ -1,87 +1,98 @@
1
1
  import { memberRefkey, namekey, refkey } from "@alloy-js/core";
2
- import { d } from "@alloy-js/core/testing";
3
2
  import { describe, expect, it } from "vitest";
4
3
  import * as py from "../src/index.js";
5
- import {
6
- assertFileContents,
7
- toSourceText,
8
- toSourceTextMultiple,
9
- } from "./utils.jsx";
4
+ import { TestOutput, TestOutputDirectory } from "./utils.js";
10
5
 
11
6
  describe("Python Class", () => {
12
7
  it("renders class-level decorators above `class`", () => {
13
- const result = toSourceText([
14
- <py.ClassDeclaration
15
- name="Foo"
16
- decorators={["@final", "@deprecated('use Bar')"]}
17
- />,
18
- ]);
19
- expect(result).toRenderTo(d`
8
+ expect(
9
+ <TestOutput>
10
+ <py.ClassDeclaration
11
+ name="Foo"
12
+ decorators={["@final", "@deprecated('use Bar')"]}
13
+ />
14
+ </TestOutput>,
15
+ ).toRenderTo(
16
+ `
20
17
  @final
21
18
  @deprecated('use Bar')
22
19
  class Foo:
23
20
  pass
24
21
 
25
-
26
- `);
22
+ `,
23
+ );
27
24
  });
28
25
 
29
26
  it("renders nothing extra when decorators is undefined", () => {
30
- const result = toSourceText([<py.ClassDeclaration name="Foo" />]);
31
- expect(result).toRenderTo(d`
27
+ expect(
28
+ <TestOutput>
29
+ <py.ClassDeclaration name="Foo" />
30
+ </TestOutput>,
31
+ ).toRenderTo(
32
+ `
32
33
  class Foo:
33
34
  pass
34
35
 
35
-
36
- `);
36
+ `,
37
+ );
37
38
  });
38
39
 
39
40
  it("renders a class with no body as 'pass'", () => {
40
- const result = toSourceText([<py.ClassDeclaration name="Foo" />]);
41
- expect(result).toRenderTo(d`
41
+ expect(
42
+ <TestOutput>
43
+ <py.ClassDeclaration name="Foo" />
44
+ </TestOutput>,
45
+ ).toRenderTo(
46
+ `
42
47
  class Foo:
43
48
  pass
44
49
 
45
-
46
- `);
50
+ `,
51
+ );
47
52
  });
48
53
 
49
54
  it("takes a namekey", () => {
50
- const result = toSourceText([
51
- <py.ClassDeclaration name={namekey("Foo")} />,
52
- ]);
53
- expect(result).toRenderTo(d`
55
+ expect(
56
+ <TestOutput>
57
+ <py.ClassDeclaration name={namekey("Foo")} />
58
+ </TestOutput>,
59
+ ).toRenderTo(
60
+ `
54
61
  class Foo:
55
62
  pass
56
63
 
57
-
58
- `);
64
+ `,
65
+ );
59
66
  });
60
67
 
61
68
  it("renders a class with a body", () => {
62
- const result = toSourceText([
63
- <py.ClassDeclaration name="Bar">print('hi')</py.ClassDeclaration>,
64
- ]);
65
- expect(result).toRenderTo(d`
69
+ expect(
70
+ <TestOutput>
71
+ <py.ClassDeclaration name="Bar">print('hi')</py.ClassDeclaration>
72
+ </TestOutput>,
73
+ ).toRenderTo(
74
+ `
66
75
  class Bar:
67
76
  print('hi')
68
77
 
69
-
70
- `);
78
+ `,
79
+ );
71
80
  });
72
81
 
73
82
  it("renders a class with base classes", () => {
74
- const result = toSourceText([
75
- <py.StatementList>
76
- <py.ClassDeclaration name="Base1" refkey={refkey("Base1")} />
77
- <py.ClassDeclaration name="Base2" refkey={refkey("Base2")} />
78
- <py.ClassDeclaration
79
- name="Baz"
80
- bases={[refkey("Base1"), refkey("Base2")]}
81
- />
82
- </py.StatementList>,
83
- ]);
84
- const expected = d`
83
+ expect(
84
+ <TestOutput>
85
+ <py.StatementList>
86
+ <py.ClassDeclaration name="Base1" refkey={refkey("Base1")} />
87
+ <py.ClassDeclaration name="Base2" refkey={refkey("Base2")} />
88
+ <py.ClassDeclaration
89
+ name="Baz"
90
+ bases={[refkey("Base1"), refkey("Base2")]}
91
+ />
92
+ </py.StatementList>
93
+ </TestOutput>,
94
+ ).toRenderTo(
95
+ `
85
96
  class Base1:
86
97
  pass
87
98
 
@@ -91,83 +102,83 @@ describe("Python Class", () => {
91
102
  class Baz(Base1, Base2):
92
103
  pass
93
104
 
94
-
95
- `;
96
- expect(result).toRenderTo(expected);
105
+ `,
106
+ );
97
107
  });
98
108
 
99
109
  it("renders a class with base classes and body", () => {
100
- const result = toSourceText([
101
- <py.ClassDeclaration name="Qux" bases={["Base"]}>
102
- print('hello')
103
- </py.ClassDeclaration>,
104
- ]);
105
- expect(result).toRenderTo(d`
110
+ expect(
111
+ <TestOutput>
112
+ <py.ClassDeclaration name="Qux" bases={["Base"]}>
113
+ print('hello')
114
+ </py.ClassDeclaration>
115
+ </TestOutput>,
116
+ ).toRenderTo(
117
+ `
106
118
  class Qux(Base):
107
119
  print('hello')
108
120
 
109
-
110
- `);
121
+ `,
122
+ );
111
123
  });
112
124
 
113
125
  it("renders classes across modules with inheritance", () => {
114
- const result = toSourceTextMultiple([
115
- <py.SourceFile path="mod1.py">
116
- <py.ClassDeclaration name="A" refkey={refkey("A")} />
117
- </py.SourceFile>,
118
- <py.SourceFile path="folder/mod2.py">
119
- <py.ClassDeclaration
120
- name="B"
121
- refkey={refkey("B")}
122
- bases={[refkey("A")]}
123
- />
124
- </py.SourceFile>,
125
- <py.SourceFile path="mod3.py">
126
- <py.ClassDeclaration name="C" bases={[refkey("B")]} />
127
- </py.SourceFile>,
128
- ]);
129
- const mod1Expected = d`
130
- class A:
131
- pass
132
-
133
-
134
- `;
135
- const mod2Expected = d`
136
- from mod1 import A
137
-
126
+ expect(
127
+ <TestOutputDirectory>
128
+ <py.SourceFile path="mod1.py">
129
+ <py.ClassDeclaration name="A" refkey={refkey("A")} />
130
+ </py.SourceFile>
131
+ <py.SourceFile path="folder/mod2.py">
132
+ <py.ClassDeclaration
133
+ name="B"
134
+ refkey={refkey("B")}
135
+ bases={[refkey("A")]}
136
+ />
137
+ </py.SourceFile>
138
+ <py.SourceFile path="mod3.py">
139
+ <py.ClassDeclaration name="C" bases={[refkey("B")]} />
140
+ </py.SourceFile>
141
+ </TestOutputDirectory>,
142
+ ).toRenderTo({
143
+ "mod1.py": `
144
+ class A:
145
+ pass
138
146
 
139
- class B(A):
140
- pass
147
+ `,
148
+ "folder/mod2.py": `
149
+ from mod1 import A
141
150
 
142
151
 
143
- `;
144
- const mod3Expected = d`
145
- from folder.mod2 import B
152
+ class B(A):
153
+ pass
146
154
 
155
+ `,
156
+ "mod3.py": `
157
+ from folder.mod2 import B
147
158
 
148
- class C(B):
149
- pass
150
159
 
160
+ class C(B):
161
+ pass
151
162
 
152
- `;
153
- assertFileContents(result, { "mod1.py": mod1Expected });
154
- assertFileContents(result, { "folder/mod2.py": mod2Expected });
155
- assertFileContents(result, { "mod3.py": mod3Expected });
163
+ `,
164
+ });
156
165
  });
157
166
 
158
167
  it("renders a class with class variables like foo: str, and also bar: A where A is another class", () => {
159
- const result = toSourceText([
160
- <py.StatementList>
161
- <py.ClassDeclaration name="A" refkey={refkey("A")} />
162
- <py.ClassDeclaration name="B">
163
- <py.StatementList>
164
- <py.VariableDeclaration name="bar" type={refkey("A")} omitNone />
165
- <py.VariableDeclaration name="foo" type="str" omitNone />
166
- </py.StatementList>
167
- </py.ClassDeclaration>
168
- </py.StatementList>,
169
- ]);
170
- const expected = d`
168
+ expect(
169
+ <TestOutput>
170
+ <py.StatementList>
171
+ <py.ClassDeclaration name="A" refkey={refkey("A")} />
172
+ <py.ClassDeclaration name="B">
173
+ <py.StatementList>
174
+ <py.VariableDeclaration name="bar" type={refkey("A")} omitNone />
175
+ <py.VariableDeclaration name="foo" type="str" omitNone />
176
+ </py.StatementList>
177
+ </py.ClassDeclaration>
178
+ </py.StatementList>
179
+ </TestOutput>,
180
+ ).toRenderTo(
181
+ `
171
182
  class A:
172
183
  pass
173
184
 
@@ -175,42 +186,43 @@ describe("Python Class", () => {
175
186
  bar: A
176
187
  foo: str
177
188
 
178
-
179
- `;
180
- expect(result).toRenderTo(expected);
189
+ `,
190
+ );
181
191
  });
182
192
 
183
193
  it("renders a class with class variables like foo: str, and another identical class", () => {
184
194
  const fooKey = refkey();
185
195
  const barKey = refkey();
186
196
 
187
- const result = toSourceText([
188
- <py.StatementList>
189
- <py.ClassDeclaration name="A">
190
- <py.StatementList>
191
- <py.VariableDeclaration
192
- name="foo"
193
- type="str"
194
- refkey={fooKey}
195
- omitNone
196
- />
197
- </py.StatementList>
198
- </py.ClassDeclaration>
199
- <py.ClassDeclaration name="B">
200
- <py.StatementList>
201
- <py.VariableDeclaration
202
- name="foo"
203
- type="str"
204
- refkey={barKey}
205
- omitNone
206
- />
207
- </py.StatementList>
208
- </py.ClassDeclaration>
209
- {fooKey}
210
- {barKey}
211
- </py.StatementList>,
212
- ]);
213
- const expected = d`
197
+ expect(
198
+ <TestOutput>
199
+ <py.StatementList>
200
+ <py.ClassDeclaration name="A">
201
+ <py.StatementList>
202
+ <py.VariableDeclaration
203
+ name="foo"
204
+ type="str"
205
+ refkey={fooKey}
206
+ omitNone
207
+ />
208
+ </py.StatementList>
209
+ </py.ClassDeclaration>
210
+ <py.ClassDeclaration name="B">
211
+ <py.StatementList>
212
+ <py.VariableDeclaration
213
+ name="foo"
214
+ type="str"
215
+ refkey={barKey}
216
+ omitNone
217
+ />
218
+ </py.StatementList>
219
+ </py.ClassDeclaration>
220
+ {fooKey}
221
+ {barKey}
222
+ </py.StatementList>
223
+ </TestOutput>,
224
+ ).toRenderTo(
225
+ `
214
226
  class A:
215
227
  foo: str
216
228
 
@@ -219,43 +231,45 @@ describe("Python Class", () => {
219
231
 
220
232
  A.foo
221
233
  B.foo
222
- `;
223
- expect(result).toRenderTo(expected);
234
+ `,
235
+ );
224
236
  });
225
237
  });
226
238
 
227
239
  describe("Python Class - VariableDeclaration", () => {
228
240
  it("renders a class with class fields", () => {
229
- const result = toSourceText([
230
- <py.StatementList>
231
- <py.ClassDeclaration
232
- refkey={refkey("Base")}
233
- name="Base"
234
- ></py.ClassDeclaration>
235
- <py.ClassDeclaration refkey={refkey("A")} name="A">
236
- <py.StatementList>
237
- <py.VariableDeclaration instanceVariable name="just_name" />
238
- <py.VariableDeclaration
239
- name="name_and_type"
240
- type="number"
241
- instanceVariable
242
- />
243
- <py.VariableDeclaration
244
- instanceVariable
245
- name="name_type_and_value"
246
- type="number"
247
- initializer={12}
248
- />
249
- <py.VariableDeclaration
250
- instanceVariable
251
- name="class_based"
252
- type={refkey("Base")}
253
- />
254
- </py.StatementList>
255
- </py.ClassDeclaration>
256
- </py.StatementList>,
257
- ]);
258
- const expected = d`
241
+ expect(
242
+ <TestOutput>
243
+ <py.StatementList>
244
+ <py.ClassDeclaration
245
+ refkey={refkey("Base")}
246
+ name="Base"
247
+ ></py.ClassDeclaration>
248
+ <py.ClassDeclaration refkey={refkey("A")} name="A">
249
+ <py.StatementList>
250
+ <py.VariableDeclaration instanceVariable name="just_name" />
251
+ <py.VariableDeclaration
252
+ name="name_and_type"
253
+ type="number"
254
+ instanceVariable
255
+ />
256
+ <py.VariableDeclaration
257
+ instanceVariable
258
+ name="name_type_and_value"
259
+ type="number"
260
+ initializer={12}
261
+ />
262
+ <py.VariableDeclaration
263
+ instanceVariable
264
+ name="class_based"
265
+ type={refkey("Base")}
266
+ />
267
+ </py.StatementList>
268
+ </py.ClassDeclaration>
269
+ </py.StatementList>
270
+ </TestOutput>,
271
+ ).toRenderTo(
272
+ `
259
273
  class Base:
260
274
  pass
261
275
 
@@ -265,9 +279,8 @@ describe("Python Class - VariableDeclaration", () => {
265
279
  name_type_and_value: number = 12
266
280
  class_based: Base = None
267
281
 
268
-
269
- `;
270
- expect(result).toRenderTo(expected);
282
+ `,
283
+ );
271
284
  });
272
285
 
273
286
  it("correctly access members of its type", () => {
@@ -276,54 +289,54 @@ describe("Python Class - VariableDeclaration", () => {
276
289
  const classMethodRk = refkey();
277
290
  const v1Rk = refkey();
278
291
 
279
- const res = toSourceTextMultiple([
280
- <py.SourceFile path="inst.py">
281
- <py.StatementList>
282
- <py.VariableDeclaration
283
- name="one"
284
- refkey={v1Rk}
285
- type={classRk}
286
- initializer={<py.ClassInstantiation target={classRk} />}
287
- />
288
- <>{memberRefkey(v1Rk, classMemberRk)}</>
289
- <>{memberRefkey(v1Rk, classMethodRk)}()</>
290
- </py.StatementList>
291
- </py.SourceFile>,
292
- <py.SourceFile path="decl.py">
293
- <py.ClassDeclaration name="Bar" refkey={classRk}>
292
+ expect(
293
+ <TestOutputDirectory>
294
+ <py.SourceFile path="inst.py">
294
295
  <py.StatementList>
295
296
  <py.VariableDeclaration
296
- name="instanceProp"
297
- refkey={classMemberRk}
298
- initializer={42}
299
- instanceVariable
300
- />
301
- <py.MethodDeclaration
302
- name="instanceMethod"
303
- refkey={classMethodRk}
304
- returnType="int"
297
+ name="one"
298
+ refkey={v1Rk}
299
+ type={classRk}
300
+ initializer={<py.ClassInstantiation target={classRk} />}
305
301
  />
302
+ <>{memberRefkey(v1Rk, classMemberRk)}</>
303
+ <>{memberRefkey(v1Rk, classMethodRk)}()</>
306
304
  </py.StatementList>
307
- </py.ClassDeclaration>
308
- </py.SourceFile>,
309
- ]);
310
-
311
- assertFileContents(res, {
305
+ </py.SourceFile>
306
+ <py.SourceFile path="decl.py">
307
+ <py.ClassDeclaration name="Bar" refkey={classRk}>
308
+ <py.StatementList>
309
+ <py.VariableDeclaration
310
+ name="instanceProp"
311
+ refkey={classMemberRk}
312
+ initializer={42}
313
+ instanceVariable
314
+ />
315
+ <py.MethodDeclaration
316
+ name="instanceMethod"
317
+ refkey={classMethodRk}
318
+ returnType="int"
319
+ />
320
+ </py.StatementList>
321
+ </py.ClassDeclaration>
322
+ </py.SourceFile>
323
+ </TestOutputDirectory>,
324
+ ).toRenderTo({
312
325
  "inst.py": `
313
- from decl import Bar
326
+ from decl import Bar
314
327
 
315
- one: Bar = Bar()
316
- one.instance_prop
317
- one.instance_method()
318
- `,
328
+ one: Bar = Bar()
329
+ one.instance_prop
330
+ one.instance_method()
331
+ `,
319
332
  "decl.py": `
320
- class Bar:
321
- instance_prop = 42
322
- def instance_method(self) -> int:
323
- pass
333
+ class Bar:
334
+ instance_prop = 42
335
+ def instance_method(self) -> int:
336
+ pass
324
337
 
325
338
 
326
- `,
339
+ `,
327
340
  });
328
341
  });
329
342
  });
@@ -334,44 +347,46 @@ describe("Python Class - FunctionDeclaration", () => {
334
347
  const classMethodRefkey = refkey();
335
348
  const staticMethodRefkey = refkey();
336
349
 
337
- const result = toSourceText([
338
- <py.StatementList>
339
- <py.ClassDeclaration name="MyClass" bases={["BaseClass"]}>
340
- <py.StatementList>
341
- <py.VariableDeclaration name="a" type="int" instanceVariable />
342
- <py.VariableDeclaration name="b" type="int" instanceVariable />
343
- <py.MethodDeclaration
344
- name="my_method"
345
- parameters={[
346
- { name: "a", type: "int" },
347
- { name: "b", type: "int" },
348
- ]}
349
- returnType="int"
350
- refkey={methodRefkey}
351
- >
352
- return a + b
353
- </py.MethodDeclaration>
354
- <py.ClassMethodDeclaration
355
- name="my_class_method"
356
- returnType="int"
357
- refkey={classMethodRefkey}
358
- >
359
- pass
360
- </py.ClassMethodDeclaration>
361
- <py.FunctionDeclaration
362
- name="my_standalone_function"
363
- returnType="int"
364
- refkey={staticMethodRefkey}
365
- >
366
- pass
367
- </py.FunctionDeclaration>
368
- </py.StatementList>
369
- </py.ClassDeclaration>
370
- {classMethodRefkey}
371
- {staticMethodRefkey}
372
- </py.StatementList>,
373
- ]);
374
- const expected = d`
350
+ expect(
351
+ <TestOutput>
352
+ <py.StatementList>
353
+ <py.ClassDeclaration name="MyClass" bases={["BaseClass"]}>
354
+ <py.StatementList>
355
+ <py.VariableDeclaration name="a" type="int" instanceVariable />
356
+ <py.VariableDeclaration name="b" type="int" instanceVariable />
357
+ <py.MethodDeclaration
358
+ name="my_method"
359
+ parameters={[
360
+ { name: "a", type: "int" },
361
+ { name: "b", type: "int" },
362
+ ]}
363
+ returnType="int"
364
+ refkey={methodRefkey}
365
+ >
366
+ return a + b
367
+ </py.MethodDeclaration>
368
+ <py.ClassMethodDeclaration
369
+ name="my_class_method"
370
+ returnType="int"
371
+ refkey={classMethodRefkey}
372
+ >
373
+ pass
374
+ </py.ClassMethodDeclaration>
375
+ <py.FunctionDeclaration
376
+ name="my_standalone_function"
377
+ returnType="int"
378
+ refkey={staticMethodRefkey}
379
+ >
380
+ pass
381
+ </py.FunctionDeclaration>
382
+ </py.StatementList>
383
+ </py.ClassDeclaration>
384
+ {classMethodRefkey}
385
+ {staticMethodRefkey}
386
+ </py.StatementList>
387
+ </TestOutput>,
388
+ ).toRenderTo(
389
+ `
375
390
  class MyClass(BaseClass):
376
391
  a: int = None
377
392
  b: int = None
@@ -388,7 +403,7 @@ describe("Python Class - FunctionDeclaration", () => {
388
403
 
389
404
  MyClass.my_class_method
390
405
  MyClass.my_standalone_function
391
- `;
392
- expect(result).toRenderTo(expected);
406
+ `,
407
+ );
393
408
  });
394
409
  });