@alloy-js/python 0.4.0-dev.3 → 0.4.0-dev.5

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 (253) hide show
  1. package/dist/dev/src/builtins/python.js +30 -0
  2. package/dist/dev/src/builtins/python.js.map +1 -0
  3. package/dist/dev/src/components/Atom.js +122 -0
  4. package/dist/dev/src/components/Atom.js.map +1 -0
  5. package/dist/dev/src/components/CallSignature.js +195 -0
  6. package/dist/dev/src/components/CallSignature.js.map +1 -0
  7. package/dist/dev/src/components/ClassDeclaration.js +112 -0
  8. package/dist/dev/src/components/ClassDeclaration.js.map +1 -0
  9. package/dist/dev/src/components/ClassInstantiation.js +40 -0
  10. package/dist/dev/src/components/ClassInstantiation.js.map +1 -0
  11. package/dist/dev/src/components/ClassMethodDeclaration.js +40 -0
  12. package/dist/dev/src/components/ClassMethodDeclaration.js.map +1 -0
  13. package/dist/dev/src/components/ConstructorDeclaration.js +39 -0
  14. package/dist/dev/src/components/ConstructorDeclaration.js.map +1 -0
  15. package/dist/dev/src/components/DataclassDeclaration.js +177 -0
  16. package/dist/dev/src/components/DataclassDeclaration.js.map +1 -0
  17. package/dist/dev/src/components/Declaration.js +31 -0
  18. package/dist/dev/src/components/Declaration.js.map +1 -0
  19. package/dist/dev/src/components/DunderMethodDeclaration.js +33 -0
  20. package/dist/dev/src/components/DunderMethodDeclaration.js.map +1 -0
  21. package/dist/dev/src/components/EnumDeclaration.js +259 -0
  22. package/dist/dev/src/components/EnumDeclaration.js.map +1 -0
  23. package/dist/dev/src/components/EnumMember.js +95 -0
  24. package/dist/dev/src/components/EnumMember.js.map +1 -0
  25. package/dist/dev/src/components/FunctionBase.js +130 -0
  26. package/dist/dev/src/components/FunctionBase.js.map +1 -0
  27. package/dist/dev/src/components/FunctionCallExpression.js +53 -0
  28. package/dist/dev/src/components/FunctionCallExpression.js.map +1 -0
  29. package/dist/dev/src/components/FunctionDeclaration.js +45 -0
  30. package/dist/dev/src/components/FunctionDeclaration.js.map +1 -0
  31. package/dist/dev/src/components/FutureStatement.js +31 -0
  32. package/dist/dev/src/components/FutureStatement.js.map +1 -0
  33. package/dist/dev/src/components/ImportStatement.js +167 -0
  34. package/dist/dev/src/components/ImportStatement.js.map +1 -0
  35. package/dist/dev/src/components/LexicalScope.js +26 -0
  36. package/dist/dev/src/components/LexicalScope.js.map +1 -0
  37. package/dist/dev/src/components/MemberExpression.js +290 -0
  38. package/dist/dev/src/components/MemberExpression.js.map +1 -0
  39. package/dist/dev/src/components/MemberScope.js +23 -0
  40. package/dist/dev/src/components/MemberScope.js.map +1 -0
  41. package/dist/dev/src/components/MethodBase.js +40 -0
  42. package/dist/dev/src/components/MethodBase.js.map +1 -0
  43. package/dist/dev/src/components/MethodDeclaration.js +38 -0
  44. package/dist/dev/src/components/MethodDeclaration.js.map +1 -0
  45. package/dist/dev/src/components/PropertyDeclaration.js +287 -0
  46. package/dist/dev/src/components/PropertyDeclaration.js.map +1 -0
  47. package/dist/dev/src/components/PyDoc.js +1478 -0
  48. package/dist/dev/src/components/PyDoc.js.map +1 -0
  49. package/dist/dev/src/components/PythonBlock.js +35 -0
  50. package/dist/dev/src/components/PythonBlock.js.map +1 -0
  51. package/dist/dev/src/components/Reference.js +23 -0
  52. package/dist/dev/src/components/Reference.js.map +1 -0
  53. package/dist/dev/src/components/SourceFile.js +385 -0
  54. package/dist/dev/src/components/SourceFile.js.map +1 -0
  55. package/dist/dev/src/components/StatementList.js +34 -0
  56. package/dist/dev/src/components/StatementList.js.map +1 -0
  57. package/dist/dev/src/components/StaticMethodDeclaration.js +40 -0
  58. package/dist/dev/src/components/StaticMethodDeclaration.js.map +1 -0
  59. package/dist/dev/src/components/TypeArguments.js +22 -0
  60. package/dist/dev/src/components/TypeArguments.js.map +1 -0
  61. package/dist/dev/src/components/TypeRefContext.js +33 -0
  62. package/dist/dev/src/components/TypeRefContext.js.map +1 -0
  63. package/dist/dev/src/components/TypeReference.js +67 -0
  64. package/dist/dev/src/components/TypeReference.js.map +1 -0
  65. package/dist/dev/src/components/UnionTypeExpression.js +57 -0
  66. package/dist/dev/src/components/UnionTypeExpression.js.map +1 -0
  67. package/dist/dev/src/components/VariableDeclaration.js +150 -0
  68. package/dist/dev/src/components/VariableDeclaration.js.map +1 -0
  69. package/dist/dev/src/components/index.js +32 -0
  70. package/dist/dev/src/components/index.js.map +1 -0
  71. package/dist/dev/src/context/index.js +2 -0
  72. package/dist/dev/src/context/index.js.map +1 -0
  73. package/dist/dev/src/context/type-ref-context.js +17 -0
  74. package/dist/dev/src/context/type-ref-context.js.map +1 -0
  75. package/dist/dev/src/create-module.js +64 -0
  76. package/dist/dev/src/create-module.js.map +1 -0
  77. package/dist/dev/src/index.js +8 -0
  78. package/dist/dev/src/index.js.map +1 -0
  79. package/dist/dev/src/name-conflict-resolver.js +8 -0
  80. package/dist/dev/src/name-conflict-resolver.js.map +1 -0
  81. package/dist/dev/src/name-policy.js +48 -0
  82. package/dist/dev/src/name-policy.js.map +1 -0
  83. package/dist/dev/src/parameter-descriptor.js +8 -0
  84. package/dist/dev/src/parameter-descriptor.js.map +1 -0
  85. package/dist/dev/src/symbol-creation.js +58 -0
  86. package/dist/dev/src/symbol-creation.js.map +1 -0
  87. package/dist/dev/src/symbols/factories.js +28 -0
  88. package/dist/dev/src/symbols/factories.js.map +1 -0
  89. package/dist/dev/src/symbols/index.js +8 -0
  90. package/dist/dev/src/symbols/index.js.map +1 -0
  91. package/dist/dev/src/symbols/python-lexical-scope.js +15 -0
  92. package/dist/dev/src/symbols/python-lexical-scope.js.map +1 -0
  93. package/dist/dev/src/symbols/python-member-scope.js +7 -0
  94. package/dist/dev/src/symbols/python-member-scope.js.map +1 -0
  95. package/dist/dev/src/symbols/python-module-scope.js +86 -0
  96. package/dist/dev/src/symbols/python-module-scope.js.map +1 -0
  97. package/dist/dev/src/symbols/python-output-symbol.js +73 -0
  98. package/dist/dev/src/symbols/python-output-symbol.js.map +1 -0
  99. package/dist/dev/src/symbols/reference.js +87 -0
  100. package/dist/dev/src/symbols/reference.js.map +1 -0
  101. package/dist/dev/src/symbols/scopes.js +13 -0
  102. package/dist/dev/src/symbols/scopes.js.map +1 -0
  103. package/dist/dev/src/utils.js +13 -0
  104. package/dist/dev/src/utils.js.map +1 -0
  105. package/dist/dev/test/callsignatures.test.js +482 -0
  106. package/dist/dev/test/callsignatures.test.js.map +1 -0
  107. package/dist/dev/test/class-method-declaration.test.js +85 -0
  108. package/dist/dev/test/class-method-declaration.test.js.map +1 -0
  109. package/dist/dev/test/classdeclarations.test.js +654 -0
  110. package/dist/dev/test/classdeclarations.test.js.map +1 -0
  111. package/dist/dev/test/classinstantiations.test.js +281 -0
  112. package/dist/dev/test/classinstantiations.test.js.map +1 -0
  113. package/dist/dev/test/constructordeclaration.test.js +86 -0
  114. package/dist/dev/test/constructordeclaration.test.js.map +1 -0
  115. package/dist/dev/test/dataclassdeclarations.test.js +1068 -0
  116. package/dist/dev/test/dataclassdeclarations.test.js.map +1 -0
  117. package/dist/dev/test/dundermethoddeclaration.test.js +93 -0
  118. package/dist/dev/test/dundermethoddeclaration.test.js.map +1 -0
  119. package/dist/dev/test/enums.test.js +263 -0
  120. package/dist/dev/test/enums.test.js.map +1 -0
  121. package/dist/dev/test/externals.test.js +307 -0
  122. package/dist/dev/test/externals.test.js.map +1 -0
  123. package/dist/dev/test/factories.test.js +122 -0
  124. package/dist/dev/test/factories.test.js.map +1 -0
  125. package/dist/dev/test/functioncallexpressions.test.js +257 -0
  126. package/dist/dev/test/functioncallexpressions.test.js.map +1 -0
  127. package/dist/dev/test/functiondeclaration.test.js +817 -0
  128. package/dist/dev/test/functiondeclaration.test.js.map +1 -0
  129. package/dist/dev/test/imports.test.js +372 -0
  130. package/dist/dev/test/imports.test.js.map +1 -0
  131. package/dist/dev/test/memberexpressions.test.js +1668 -0
  132. package/dist/dev/test/memberexpressions.test.js.map +1 -0
  133. package/dist/dev/test/methoddeclaration.test.js +344 -0
  134. package/dist/dev/test/methoddeclaration.test.js.map +1 -0
  135. package/dist/dev/test/namepolicies.test.js +154 -0
  136. package/dist/dev/test/namepolicies.test.js.map +1 -0
  137. package/dist/dev/test/propertydeclaration.test.js +354 -0
  138. package/dist/dev/test/propertydeclaration.test.js.map +1 -0
  139. package/dist/dev/test/pydocs.test.js +1675 -0
  140. package/dist/dev/test/pydocs.test.js.map +1 -0
  141. package/dist/dev/test/references.test.js +66 -0
  142. package/dist/dev/test/references.test.js.map +1 -0
  143. package/dist/dev/test/sourcefiles.test.js +1802 -0
  144. package/dist/dev/test/sourcefiles.test.js.map +1 -0
  145. package/dist/dev/test/staticmethoddeclaration.test.js +85 -0
  146. package/dist/dev/test/staticmethoddeclaration.test.js.map +1 -0
  147. package/dist/dev/test/type-checking-imports.test.js +617 -0
  148. package/dist/dev/test/type-checking-imports.test.js.map +1 -0
  149. package/dist/dev/test/typereference.test.js +79 -0
  150. package/dist/dev/test/typereference.test.js.map +1 -0
  151. package/dist/dev/test/uniontypeexpression.test.js +307 -0
  152. package/dist/dev/test/uniontypeexpression.test.js.map +1 -0
  153. package/dist/dev/test/utils.js +100 -0
  154. package/dist/dev/test/utils.js.map +1 -0
  155. package/dist/dev/test/values.test.js +182 -0
  156. package/dist/dev/test/values.test.js.map +1 -0
  157. package/dist/dev/test/variables.test.js +363 -0
  158. package/dist/dev/test/variables.test.js.map +1 -0
  159. package/dist/src/components/CallSignature.d.ts.map +1 -1
  160. package/dist/src/components/CallSignature.js +12 -3
  161. package/dist/src/components/CallSignature.js.map +1 -1
  162. package/dist/src/components/ImportStatement.d.ts +12 -0
  163. package/dist/src/components/ImportStatement.d.ts.map +1 -1
  164. package/dist/src/components/ImportStatement.js +45 -3
  165. package/dist/src/components/ImportStatement.js.map +1 -1
  166. package/dist/src/components/Reference.d.ts.map +1 -1
  167. package/dist/src/components/Reference.js +5 -1
  168. package/dist/src/components/Reference.js.map +1 -1
  169. package/dist/src/components/SourceFile.d.ts +1 -1
  170. package/dist/src/components/SourceFile.d.ts.map +1 -1
  171. package/dist/src/components/SourceFile.js +46 -7
  172. package/dist/src/components/SourceFile.js.map +1 -1
  173. package/dist/src/components/TypeRefContext.d.ts +26 -0
  174. package/dist/src/components/TypeRefContext.d.ts.map +1 -0
  175. package/dist/src/components/TypeRefContext.js +29 -0
  176. package/dist/src/components/TypeRefContext.js.map +1 -0
  177. package/dist/src/components/TypeReference.d.ts +5 -0
  178. package/dist/src/components/TypeReference.d.ts.map +1 -1
  179. package/dist/src/components/TypeReference.js +19 -9
  180. package/dist/src/components/TypeReference.js.map +1 -1
  181. package/dist/src/components/VariableDeclaration.d.ts.map +1 -1
  182. package/dist/src/components/VariableDeclaration.js +7 -2
  183. package/dist/src/components/VariableDeclaration.js.map +1 -1
  184. package/dist/src/components/index.d.ts +1 -1
  185. package/dist/src/components/index.d.ts.map +1 -1
  186. package/dist/src/components/index.js +1 -1
  187. package/dist/src/components/index.js.map +1 -1
  188. package/dist/src/context/index.d.ts +2 -0
  189. package/dist/src/context/index.d.ts.map +1 -0
  190. package/dist/src/context/index.js +2 -0
  191. package/dist/src/context/index.js.map +1 -0
  192. package/dist/src/context/type-ref-context.d.ts +13 -0
  193. package/dist/src/context/type-ref-context.d.ts.map +1 -0
  194. package/dist/src/context/type-ref-context.js +17 -0
  195. package/dist/src/context/type-ref-context.js.map +1 -0
  196. package/dist/src/symbols/python-module-scope.d.ts +13 -1
  197. package/dist/src/symbols/python-module-scope.d.ts.map +1 -1
  198. package/dist/src/symbols/python-module-scope.js +36 -2
  199. package/dist/src/symbols/python-module-scope.js.map +1 -1
  200. package/dist/src/symbols/python-output-symbol.d.ts +11 -0
  201. package/dist/src/symbols/python-output-symbol.d.ts.map +1 -1
  202. package/dist/src/symbols/python-output-symbol.js +26 -2
  203. package/dist/src/symbols/python-output-symbol.js.map +1 -1
  204. package/dist/src/symbols/reference.d.ts +8 -1
  205. package/dist/src/symbols/reference.d.ts.map +1 -1
  206. package/dist/src/symbols/reference.js +4 -2
  207. package/dist/src/symbols/reference.js.map +1 -1
  208. package/dist/test/dataclassdeclarations.test.js +5 -2
  209. package/dist/test/dataclassdeclarations.test.js.map +1 -1
  210. package/dist/test/externals.test.js +8 -2
  211. package/dist/test/externals.test.js.map +1 -1
  212. package/dist/test/functiondeclaration.test.js +6 -3
  213. package/dist/test/functiondeclaration.test.js.map +1 -1
  214. package/dist/test/imports.test.js +3 -3
  215. package/dist/test/imports.test.js.map +1 -1
  216. package/dist/test/references.test.js +1 -1
  217. package/dist/test/references.test.js.map +1 -1
  218. package/dist/test/sourcefiles.test.js +26 -26
  219. package/dist/test/sourcefiles.test.js.map +1 -1
  220. package/dist/test/type-checking-imports.test.d.ts +2 -0
  221. package/dist/test/type-checking-imports.test.d.ts.map +1 -0
  222. package/dist/test/type-checking-imports.test.js +437 -0
  223. package/dist/test/type-checking-imports.test.js.map +1 -0
  224. package/dist/test/uniontypeexpression.test.js +4 -1
  225. package/dist/test/uniontypeexpression.test.js.map +1 -1
  226. package/dist/test/variables.test.js +4 -1
  227. package/dist/test/variables.test.js.map +1 -1
  228. package/dist/tsconfig.tsbuildinfo +1 -1
  229. package/package.json +6 -4
  230. package/src/components/CallSignature.tsx +6 -2
  231. package/src/components/ImportStatement.tsx +51 -4
  232. package/src/components/Reference.tsx +3 -1
  233. package/src/components/SourceFile.tsx +44 -8
  234. package/src/components/TypeRefContext.tsx +36 -0
  235. package/src/components/TypeReference.tsx +15 -7
  236. package/src/components/VariableDeclaration.tsx +5 -1
  237. package/src/components/index.ts +1 -1
  238. package/src/context/index.ts +1 -0
  239. package/src/context/type-ref-context.tsx +16 -0
  240. package/src/symbols/python-module-scope.ts +55 -2
  241. package/src/symbols/python-output-symbol.ts +32 -1
  242. package/src/symbols/reference.tsx +10 -0
  243. package/temp/api.json +441 -336
  244. package/test/dataclassdeclarations.test.tsx +8 -2
  245. package/test/externals.test.tsx +8 -2
  246. package/test/functiondeclaration.test.tsx +6 -3
  247. package/test/imports.test.tsx +6 -6
  248. package/test/references.test.tsx +1 -1
  249. package/test/sourcefiles.test.tsx +13 -13
  250. package/test/type-checking-imports.test.tsx +363 -0
  251. package/test/uniontypeexpression.test.tsx +4 -1
  252. package/test/variables.test.tsx +4 -1
  253. package/vitest.config.ts +8 -0
@@ -0,0 +1,1802 @@
1
+ import { createComponent as _$createComponent } from "@alloy-js/core/jsx-runtime";
2
+ import { Prose } from "@alloy-js/core";
3
+ import { d } from "@alloy-js/core/testing";
4
+ import { expect, it } from "vitest";
5
+ import * as py from "../src/index.js";
6
+ import { dataclassesModule } from "../src/index.js";
7
+ import { toSourceText } from "./utils.js";
8
+
9
+ /**
10
+ * toSourceText wraps the children in a SourceFile component
11
+ * and renders it to a string.
12
+ */
13
+ it("renders an empty source file", () => {
14
+ const result = toSourceText([]);
15
+ expect(result).toRenderTo(d`
16
+
17
+
18
+ `);
19
+ });
20
+ it("correct formatting of source file", () => {
21
+ const result = toSourceText([_$createComponent(py.ClassDeclaration, {
22
+ name: "someClass",
23
+ get children() {
24
+ return _$createComponent(py.StatementList, {
25
+ get children() {
26
+ return [_$createComponent(py.FunctionDeclaration, {
27
+ name: "someMethod",
28
+ returnType: "str",
29
+ get children() {
30
+ return _$createComponent(py.StatementList, {
31
+ get children() {
32
+ return [_$createComponent(py.VariableDeclaration, {
33
+ name: "x",
34
+ type: "int",
35
+ get initializer() {
36
+ return _$createComponent(py.Atom, {
37
+ jsValue: 42
38
+ }, {
39
+ fileName: import.meta.url,
40
+ lineNumber: 29,
41
+ columnNumber: 28
42
+ });
43
+ }
44
+ }, {
45
+ fileName: import.meta.url,
46
+ lineNumber: 26,
47
+ columnNumber: 13
48
+ }), _$createComponent(py.VariableDeclaration, {
49
+ name: "y",
50
+ type: "int",
51
+ get initializer() {
52
+ return _$createComponent(py.Atom, {
53
+ jsValue: 42
54
+ }, {
55
+ fileName: import.meta.url,
56
+ lineNumber: 34,
57
+ columnNumber: 28
58
+ });
59
+ }
60
+ }, {
61
+ fileName: import.meta.url,
62
+ lineNumber: 31,
63
+ columnNumber: 13
64
+ }), _$createComponent(py.FunctionCallExpression, {
65
+ target: "foo",
66
+ args: ["a", "b"]
67
+ }, {
68
+ fileName: import.meta.url,
69
+ lineNumber: 36,
70
+ columnNumber: 13
71
+ }), _$createComponent(py.MemberExpression, {
72
+ get children() {
73
+ return [_$createComponent(py.MemberExpression.Part, {
74
+ id: "a"
75
+ }, {
76
+ fileName: import.meta.url,
77
+ lineNumber: 38,
78
+ columnNumber: 15
79
+ }), _$createComponent(py.MemberExpression.Part, {
80
+ id: "b"
81
+ }, {
82
+ fileName: import.meta.url,
83
+ lineNumber: 39,
84
+ columnNumber: 15
85
+ }), _$createComponent(py.MemberExpression.Part, {
86
+ key: "special-prop"
87
+ }, {
88
+ fileName: import.meta.url,
89
+ lineNumber: 40,
90
+ columnNumber: 15
91
+ })];
92
+ }
93
+ }, {
94
+ fileName: import.meta.url,
95
+ lineNumber: 37,
96
+ columnNumber: 13
97
+ }), _$createComponent(py.VariableDeclaration, {
98
+ name: "z",
99
+ type: "int",
100
+ get initializer() {
101
+ return _$createComponent(py.Atom, {
102
+ jsValue: 42
103
+ }, {
104
+ fileName: import.meta.url,
105
+ lineNumber: 45,
106
+ columnNumber: 28
107
+ });
108
+ }
109
+ }, {
110
+ fileName: import.meta.url,
111
+ lineNumber: 42,
112
+ columnNumber: 13
113
+ })];
114
+ }
115
+ }, {
116
+ fileName: import.meta.url,
117
+ lineNumber: 25,
118
+ columnNumber: 11
119
+ });
120
+ }
121
+ }, {
122
+ fileName: import.meta.url,
123
+ lineNumber: 24,
124
+ columnNumber: 9
125
+ }), _$createComponent(py.VariableDeclaration, {
126
+ name: "someVar",
127
+ type: "int",
128
+ get initializer() {
129
+ return _$createComponent(py.Atom, {
130
+ jsValue: 42
131
+ }, {
132
+ fileName: import.meta.url,
133
+ lineNumber: 52,
134
+ columnNumber: 24
135
+ });
136
+ }
137
+ }, {
138
+ fileName: import.meta.url,
139
+ lineNumber: 49,
140
+ columnNumber: 9
141
+ }), _$createComponent(py.FunctionDeclaration, {
142
+ name: "someOtherMethod",
143
+ returnType: "str"
144
+ }, {
145
+ fileName: import.meta.url,
146
+ lineNumber: 54,
147
+ columnNumber: 9
148
+ }), _$createComponent(py.VariableDeclaration, {
149
+ name: "someOtherVar",
150
+ type: "int",
151
+ get initializer() {
152
+ return _$createComponent(py.Atom, {
153
+ jsValue: 42
154
+ }, {
155
+ fileName: import.meta.url,
156
+ lineNumber: 58,
157
+ columnNumber: 24
158
+ });
159
+ }
160
+ }, {
161
+ fileName: import.meta.url,
162
+ lineNumber: 55,
163
+ columnNumber: 9
164
+ })];
165
+ }
166
+ }, {
167
+ fileName: import.meta.url,
168
+ lineNumber: 23,
169
+ columnNumber: 7
170
+ });
171
+ }
172
+ }, {
173
+ fileName: import.meta.url,
174
+ lineNumber: 22,
175
+ columnNumber: 5
176
+ }), _$createComponent(py.FunctionDeclaration, {
177
+ name: "someFunction",
178
+ get children() {
179
+ return _$createComponent(py.StatementList, {
180
+ get children() {
181
+ return [_$createComponent(py.VariableDeclaration, {
182
+ name: "x",
183
+ type: "int",
184
+ get initializer() {
185
+ return _$createComponent(py.Atom, {
186
+ jsValue: 42
187
+ }, {
188
+ fileName: import.meta.url,
189
+ lineNumber: 67,
190
+ columnNumber: 24
191
+ });
192
+ }
193
+ }, {
194
+ fileName: import.meta.url,
195
+ lineNumber: 64,
196
+ columnNumber: 9
197
+ }), _$createComponent(py.VariableDeclaration, {
198
+ name: "y",
199
+ type: "int",
200
+ get initializer() {
201
+ return _$createComponent(py.Atom, {
202
+ jsValue: 42
203
+ }, {
204
+ fileName: import.meta.url,
205
+ lineNumber: 72,
206
+ columnNumber: 24
207
+ });
208
+ }
209
+ }, {
210
+ fileName: import.meta.url,
211
+ lineNumber: 69,
212
+ columnNumber: 9
213
+ }), _$createComponent(py.FunctionCallExpression, {
214
+ target: "foo",
215
+ args: ["a", "b"]
216
+ }, {
217
+ fileName: import.meta.url,
218
+ lineNumber: 74,
219
+ columnNumber: 9
220
+ }), _$createComponent(py.MemberExpression, {
221
+ get children() {
222
+ return [_$createComponent(py.MemberExpression.Part, {
223
+ id: "a"
224
+ }, {
225
+ fileName: import.meta.url,
226
+ lineNumber: 76,
227
+ columnNumber: 11
228
+ }), _$createComponent(py.MemberExpression.Part, {
229
+ id: "b"
230
+ }, {
231
+ fileName: import.meta.url,
232
+ lineNumber: 77,
233
+ columnNumber: 11
234
+ }), _$createComponent(py.MemberExpression.Part, {
235
+ key: "special-prop"
236
+ }, {
237
+ fileName: import.meta.url,
238
+ lineNumber: 78,
239
+ columnNumber: 11
240
+ })];
241
+ }
242
+ }, {
243
+ fileName: import.meta.url,
244
+ lineNumber: 75,
245
+ columnNumber: 9
246
+ }), _$createComponent(py.VariableDeclaration, {
247
+ name: "z",
248
+ type: "int",
249
+ get initializer() {
250
+ return _$createComponent(py.Atom, {
251
+ jsValue: 42
252
+ }, {
253
+ fileName: import.meta.url,
254
+ lineNumber: 83,
255
+ columnNumber: 24
256
+ });
257
+ }
258
+ }, {
259
+ fileName: import.meta.url,
260
+ lineNumber: 80,
261
+ columnNumber: 9
262
+ })];
263
+ }
264
+ }, {
265
+ fileName: import.meta.url,
266
+ lineNumber: 63,
267
+ columnNumber: 7
268
+ });
269
+ }
270
+ }, {
271
+ fileName: import.meta.url,
272
+ lineNumber: 62,
273
+ columnNumber: 5
274
+ }), _$createComponent(py.ClassDeclaration, {
275
+ name: "someOtherClass",
276
+ get children() {
277
+ return _$createComponent(py.StatementList, {
278
+ get children() {
279
+ return _$createComponent(py.FunctionDeclaration, {
280
+ name: "someMethod",
281
+ returnType: "str"
282
+ }, {
283
+ fileName: import.meta.url,
284
+ lineNumber: 89,
285
+ columnNumber: 9
286
+ });
287
+ }
288
+ }, {
289
+ fileName: import.meta.url,
290
+ lineNumber: 88,
291
+ columnNumber: 7
292
+ });
293
+ }
294
+ }, {
295
+ fileName: import.meta.url,
296
+ lineNumber: 87,
297
+ columnNumber: 5
298
+ }), _$createComponent(py.MemberExpression, {
299
+ get children() {
300
+ return [_$createComponent(py.MemberExpression.Part, {
301
+ id: "a"
302
+ }, {
303
+ fileName: import.meta.url,
304
+ lineNumber: 93,
305
+ columnNumber: 7
306
+ }), _$createComponent(py.MemberExpression.Part, {
307
+ id: "b"
308
+ }, {
309
+ fileName: import.meta.url,
310
+ lineNumber: 94,
311
+ columnNumber: 7
312
+ }), _$createComponent(py.MemberExpression.Part, {
313
+ key: "special-prop"
314
+ }, {
315
+ fileName: import.meta.url,
316
+ lineNumber: 95,
317
+ columnNumber: 7
318
+ })];
319
+ }
320
+ }, {
321
+ fileName: import.meta.url,
322
+ lineNumber: 92,
323
+ columnNumber: 5
324
+ })]);
325
+ expect(result).toRenderTo(d`
326
+ class SomeClass:
327
+ def some_method() -> str:
328
+ x: int = 42
329
+ y: int = 42
330
+ foo(a, b)
331
+ a.b["special-prop"]
332
+ z: int = 42
333
+
334
+ some_var: int = 42
335
+ def some_other_method() -> str:
336
+ pass
337
+
338
+ some_other_var: int = 42
339
+
340
+
341
+ def some_function():
342
+ x: int = 42
343
+ y: int = 42
344
+ foo(a, b)
345
+ a.b["special-prop"]
346
+ z: int = 42
347
+
348
+
349
+ class SomeOtherClass:
350
+ def some_method() -> str:
351
+ pass
352
+
353
+
354
+
355
+ a.b["special-prop"]
356
+
357
+ `);
358
+ });
359
+ it("renders module documentation correctly", () => {
360
+ const moduleDoc = _$createComponent(py.ModuleDoc, {
361
+ get description() {
362
+ return [_$createComponent(Prose, {
363
+ children: "This module provides utility functions for data processing. It includes functions for validation, transformation, and analysis."
364
+ }, {
365
+ fileName: import.meta.url,
366
+ lineNumber: 137,
367
+ columnNumber: 9
368
+ })];
369
+ },
370
+ attributes: [{
371
+ name: "DEFAULT_TIMEOUT",
372
+ type: "int",
373
+ children: "Default timeout value in seconds."
374
+ }, {
375
+ name: "MAX_RETRIES",
376
+ type: "int",
377
+ children: "Maximum number of retry attempts."
378
+ }],
379
+ todo: ["Add caching functionality", "Improve error messages"],
380
+ style: "google"
381
+ }, {
382
+ fileName: import.meta.url,
383
+ lineNumber: 135,
384
+ columnNumber: 5
385
+ });
386
+ const content = _$createComponent(py.SourceFile, {
387
+ path: "test.py",
388
+ doc: moduleDoc,
389
+ get children() {
390
+ return [_$createComponent(py.VariableDeclaration, {
391
+ name: "DEFAULT_TIMEOUT",
392
+ initializer: 30
393
+ }, {
394
+ fileName: import.meta.url,
395
+ lineNumber: 161,
396
+ columnNumber: 7
397
+ }), _$createComponent(py.VariableDeclaration, {
398
+ name: "MAX_RETRIES",
399
+ initializer: 3
400
+ }, {
401
+ fileName: import.meta.url,
402
+ lineNumber: 162,
403
+ columnNumber: 7
404
+ }), _$createComponent(py.FunctionDeclaration, {
405
+ name: "process_data",
406
+ children: "pass"
407
+ }, {
408
+ fileName: import.meta.url,
409
+ lineNumber: 163,
410
+ columnNumber: 7
411
+ })];
412
+ }
413
+ }, {
414
+ fileName: import.meta.url,
415
+ lineNumber: 160,
416
+ columnNumber: 5
417
+ });
418
+ expect(toSourceText(content)).toRenderTo(d`
419
+ """
420
+ This module provides utility functions for data processing. It includes
421
+ functions for validation, transformation, and analysis.
422
+
423
+ Attributes:
424
+ DEFAULT_TIMEOUT (int): Default timeout value in seconds.
425
+
426
+ MAX_RETRIES (int): Maximum number of retry attempts.
427
+
428
+ Todo:
429
+ * Add caching functionality
430
+ * Improve error messages
431
+ """
432
+
433
+ default_timeout = 30
434
+
435
+ max_retries = 3
436
+
437
+ def process_data():
438
+ pass
439
+
440
+
441
+ `);
442
+ });
443
+ it("renders source file without documentation correctly", () => {
444
+ const content = _$createComponent(py.SourceFile, {
445
+ path: "test.py",
446
+ get children() {
447
+ return _$createComponent(py.FunctionDeclaration, {
448
+ name: "hello_world",
449
+ children: "print(\"Hello, World!\")"
450
+ }, {
451
+ fileName: import.meta.url,
452
+ lineNumber: 196,
453
+ columnNumber: 7
454
+ });
455
+ }
456
+ }, {
457
+ fileName: import.meta.url,
458
+ lineNumber: 195,
459
+ columnNumber: 5
460
+ });
461
+ expect(toSourceText(content)).toRenderTo(d`
462
+ def hello_world():
463
+ print("Hello, World!")
464
+
465
+
466
+ `);
467
+ });
468
+ it("nothing before top-level definition", () => {
469
+ const content = _$createComponent(py.SourceFile, {
470
+ path: "test.py",
471
+ get children() {
472
+ return _$createComponent(py.FunctionDeclaration, {
473
+ name: "hello",
474
+ children: "pass"
475
+ }, {
476
+ fileName: import.meta.url,
477
+ lineNumber: 213,
478
+ columnNumber: 7
479
+ });
480
+ }
481
+ }, {
482
+ fileName: import.meta.url,
483
+ lineNumber: 212,
484
+ columnNumber: 5
485
+ });
486
+ expect(toSourceText(content)).toRenderTo(d`
487
+ def hello():
488
+ pass
489
+
490
+
491
+ `);
492
+ });
493
+ it("nothing before non-definition", () => {
494
+ const content = _$createComponent(py.SourceFile, {
495
+ path: "test.py",
496
+ get children() {
497
+ return _$createComponent(py.VariableDeclaration, {
498
+ name: "x",
499
+ initializer: 42
500
+ }, {
501
+ fileName: import.meta.url,
502
+ lineNumber: 228,
503
+ columnNumber: 7
504
+ });
505
+ }
506
+ }, {
507
+ fileName: import.meta.url,
508
+ lineNumber: 227,
509
+ columnNumber: 5
510
+ });
511
+ expect(toSourceText(content)).toRenderTo("x = 42");
512
+ });
513
+ it("only doc before definition", () => {
514
+ const moduleDoc = _$createComponent(py.ModuleDoc, {
515
+ get description() {
516
+ return [_$createComponent(Prose, {
517
+ children: "Module description."
518
+ }, {
519
+ fileName: import.meta.url,
520
+ lineNumber: 237,
521
+ columnNumber: 33
522
+ })];
523
+ }
524
+ }, {
525
+ fileName: import.meta.url,
526
+ lineNumber: 237,
527
+ columnNumber: 5
528
+ });
529
+ const content = _$createComponent(py.SourceFile, {
530
+ path: "test.py",
531
+ doc: moduleDoc,
532
+ get children() {
533
+ return _$createComponent(py.FunctionDeclaration, {
534
+ name: "hello",
535
+ children: "pass"
536
+ }, {
537
+ fileName: import.meta.url,
538
+ lineNumber: 242,
539
+ columnNumber: 7
540
+ });
541
+ }
542
+ }, {
543
+ fileName: import.meta.url,
544
+ lineNumber: 241,
545
+ columnNumber: 5
546
+ });
547
+ expect(toSourceText(content)).toRenderTo(d`
548
+ """
549
+ Module description.
550
+ """
551
+
552
+
553
+ def hello():
554
+ pass
555
+
556
+
557
+ `);
558
+ });
559
+ it("only doc before non-definition", () => {
560
+ const moduleDoc = _$createComponent(py.ModuleDoc, {
561
+ get description() {
562
+ return [_$createComponent(Prose, {
563
+ children: "Module description."
564
+ }, {
565
+ fileName: import.meta.url,
566
+ lineNumber: 261,
567
+ columnNumber: 33
568
+ })];
569
+ }
570
+ }, {
571
+ fileName: import.meta.url,
572
+ lineNumber: 261,
573
+ columnNumber: 5
574
+ });
575
+ const content = _$createComponent(py.SourceFile, {
576
+ path: "test.py",
577
+ doc: moduleDoc,
578
+ get children() {
579
+ return _$createComponent(py.VariableDeclaration, {
580
+ name: "x",
581
+ initializer: 42
582
+ }, {
583
+ fileName: import.meta.url,
584
+ lineNumber: 266,
585
+ columnNumber: 7
586
+ });
587
+ }
588
+ }, {
589
+ fileName: import.meta.url,
590
+ lineNumber: 265,
591
+ columnNumber: 5
592
+ });
593
+ expect(toSourceText(content)).toRenderTo(d`
594
+ """
595
+ Module description.
596
+ """
597
+
598
+ x = 42`);
599
+ });
600
+ it("only header before definition", () => {
601
+ const content = _$createComponent(py.SourceFile, {
602
+ path: "test.py",
603
+ header: "#!/usr/bin/env python3",
604
+ get children() {
605
+ return _$createComponent(py.FunctionDeclaration, {
606
+ name: "hello",
607
+ children: "pass"
608
+ }, {
609
+ fileName: import.meta.url,
610
+ lineNumber: 281,
611
+ columnNumber: 7
612
+ });
613
+ }
614
+ }, {
615
+ fileName: import.meta.url,
616
+ lineNumber: 280,
617
+ columnNumber: 5
618
+ });
619
+
620
+ // 2 blank lines before definition (PEP 8)
621
+ expect(toSourceText(content)).toRenderTo(d`
622
+ #!/usr/bin/env python3
623
+
624
+
625
+ def hello():
626
+ pass
627
+
628
+
629
+ `);
630
+ });
631
+ it("only header before non-definition", () => {
632
+ const content = _$createComponent(py.SourceFile, {
633
+ path: "test.py",
634
+ header: "#!/usr/bin/env python3",
635
+ get children() {
636
+ return _$createComponent(py.VariableDeclaration, {
637
+ name: "x",
638
+ initializer: 42
639
+ }, {
640
+ fileName: import.meta.url,
641
+ lineNumber: 300,
642
+ columnNumber: 7
643
+ });
644
+ }
645
+ }, {
646
+ fileName: import.meta.url,
647
+ lineNumber: 299,
648
+ columnNumber: 5
649
+ });
650
+
651
+ // 1 blank line for non-definition
652
+ expect(toSourceText(content)).toRenderTo(d`
653
+ #!/usr/bin/env python3
654
+
655
+ x = 42`);
656
+ });
657
+ it("only futureImports before definition", () => {
658
+ const content = _$createComponent(py.SourceFile, {
659
+ path: "test.py",
660
+ get futureImports() {
661
+ return [_$createComponent(py.FutureStatement, {
662
+ feature: "annotations"
663
+ }, {
664
+ fileName: import.meta.url,
665
+ lineNumber: 315,
666
+ columnNumber: 23
667
+ })];
668
+ },
669
+ get children() {
670
+ return _$createComponent(py.FunctionDeclaration, {
671
+ name: "hello",
672
+ children: "pass"
673
+ }, {
674
+ fileName: import.meta.url,
675
+ lineNumber: 317,
676
+ columnNumber: 7
677
+ });
678
+ }
679
+ }, {
680
+ fileName: import.meta.url,
681
+ lineNumber: 313,
682
+ columnNumber: 5
683
+ });
684
+ expect(toSourceText(content)).toRenderTo(d`
685
+ from __future__ import annotations
686
+
687
+
688
+ def hello():
689
+ pass
690
+
691
+
692
+ `);
693
+ });
694
+ it("only futureImports before non-definition", () => {
695
+ const content = _$createComponent(py.SourceFile, {
696
+ path: "test.py",
697
+ get futureImports() {
698
+ return [_$createComponent(py.FutureStatement, {
699
+ feature: "annotations"
700
+ }, {
701
+ fileName: import.meta.url,
702
+ lineNumber: 336,
703
+ columnNumber: 23
704
+ })];
705
+ },
706
+ get children() {
707
+ return _$createComponent(py.VariableDeclaration, {
708
+ name: "x",
709
+ initializer: 42
710
+ }, {
711
+ fileName: import.meta.url,
712
+ lineNumber: 338,
713
+ columnNumber: 7
714
+ });
715
+ }
716
+ }, {
717
+ fileName: import.meta.url,
718
+ lineNumber: 334,
719
+ columnNumber: 5
720
+ });
721
+ expect(toSourceText(content)).toRenderTo(d`
722
+ from __future__ import annotations
723
+
724
+ x = 42`);
725
+ });
726
+ it("only imports before definition", () => {
727
+ const content = _$createComponent(py.SourceFile, {
728
+ path: "test.py",
729
+ get children() {
730
+ return _$createComponent(py.DataclassDeclaration, {
731
+ name: "User",
732
+ get children() {
733
+ return _$createComponent(py.VariableDeclaration, {
734
+ name: "name",
735
+ type: "str"
736
+ }, {
737
+ fileName: import.meta.url,
738
+ lineNumber: 352,
739
+ columnNumber: 9
740
+ });
741
+ }
742
+ }, {
743
+ fileName: import.meta.url,
744
+ lineNumber: 351,
745
+ columnNumber: 7
746
+ });
747
+ }
748
+ }, {
749
+ fileName: import.meta.url,
750
+ lineNumber: 350,
751
+ columnNumber: 5
752
+ });
753
+ expect(toSourceText(content, {
754
+ externals: [dataclassesModule]
755
+ })).toRenderTo(d`
756
+ from dataclasses import dataclass
757
+
758
+
759
+ @dataclass
760
+ class User:
761
+ name: str = None
762
+
763
+
764
+ `);
765
+ });
766
+ it("only imports before non-definition", () => {
767
+ const content = _$createComponent(py.SourceFile, {
768
+ path: "test.py",
769
+ get children() {
770
+ return _$createComponent(py.VariableDeclaration, {
771
+ name: "x",
772
+ get initializer() {
773
+ return _$createComponent(py.Reference, {
774
+ get refkey() {
775
+ return dataclassesModule["."].dataclass;
776
+ }
777
+ }, {
778
+ fileName: import.meta.url,
779
+ lineNumber: 375,
780
+ columnNumber: 22
781
+ });
782
+ }
783
+ }, {
784
+ fileName: import.meta.url,
785
+ lineNumber: 373,
786
+ columnNumber: 7
787
+ });
788
+ }
789
+ }, {
790
+ fileName: import.meta.url,
791
+ lineNumber: 372,
792
+ columnNumber: 5
793
+ });
794
+ expect(toSourceText(content, {
795
+ externals: [dataclassesModule]
796
+ })).toRenderTo(d`
797
+ from dataclasses import dataclass
798
+
799
+ x = dataclass`);
800
+ });
801
+ it("doc + futureImports before definition", () => {
802
+ const moduleDoc = _$createComponent(py.ModuleDoc, {
803
+ get description() {
804
+ return [_$createComponent(Prose, {
805
+ children: "Module description."
806
+ }, {
807
+ fileName: import.meta.url,
808
+ lineNumber: 389,
809
+ columnNumber: 33
810
+ })];
811
+ }
812
+ }, {
813
+ fileName: import.meta.url,
814
+ lineNumber: 389,
815
+ columnNumber: 5
816
+ });
817
+ const content = _$createComponent(py.SourceFile, {
818
+ path: "test.py",
819
+ doc: moduleDoc,
820
+ get futureImports() {
821
+ return [_$createComponent(py.FutureStatement, {
822
+ feature: "annotations"
823
+ }, {
824
+ fileName: import.meta.url,
825
+ lineNumber: 396,
826
+ columnNumber: 23
827
+ })];
828
+ },
829
+ get children() {
830
+ return _$createComponent(py.FunctionDeclaration, {
831
+ name: "hello",
832
+ children: "pass"
833
+ }, {
834
+ fileName: import.meta.url,
835
+ lineNumber: 398,
836
+ columnNumber: 7
837
+ });
838
+ }
839
+ }, {
840
+ fileName: import.meta.url,
841
+ lineNumber: 393,
842
+ columnNumber: 5
843
+ });
844
+ expect(toSourceText(content)).toRenderTo(d`
845
+ """
846
+ Module description.
847
+ """
848
+
849
+ from __future__ import annotations
850
+
851
+
852
+ def hello():
853
+ pass
854
+
855
+
856
+ `);
857
+ });
858
+ it("doc + futureImports before non-definition", () => {
859
+ const moduleDoc = _$createComponent(py.ModuleDoc, {
860
+ get description() {
861
+ return [_$createComponent(Prose, {
862
+ children: "Module description."
863
+ }, {
864
+ fileName: import.meta.url,
865
+ lineNumber: 419,
866
+ columnNumber: 33
867
+ })];
868
+ }
869
+ }, {
870
+ fileName: import.meta.url,
871
+ lineNumber: 419,
872
+ columnNumber: 5
873
+ });
874
+ const content = _$createComponent(py.SourceFile, {
875
+ path: "test.py",
876
+ doc: moduleDoc,
877
+ get futureImports() {
878
+ return [_$createComponent(py.FutureStatement, {
879
+ feature: "annotations"
880
+ }, {
881
+ fileName: import.meta.url,
882
+ lineNumber: 426,
883
+ columnNumber: 23
884
+ })];
885
+ },
886
+ get children() {
887
+ return _$createComponent(py.VariableDeclaration, {
888
+ name: "x",
889
+ initializer: 42
890
+ }, {
891
+ fileName: import.meta.url,
892
+ lineNumber: 428,
893
+ columnNumber: 7
894
+ });
895
+ }
896
+ }, {
897
+ fileName: import.meta.url,
898
+ lineNumber: 423,
899
+ columnNumber: 5
900
+ });
901
+ expect(toSourceText(content)).toRenderTo(d`
902
+ """
903
+ Module description.
904
+ """
905
+
906
+ from __future__ import annotations
907
+
908
+ x = 42`);
909
+ });
910
+ it("doc + imports before definition", () => {
911
+ const moduleDoc = _$createComponent(py.ModuleDoc, {
912
+ get description() {
913
+ return [_$createComponent(Prose, {
914
+ children: "Module description."
915
+ }, {
916
+ fileName: import.meta.url,
917
+ lineNumber: 444,
918
+ columnNumber: 33
919
+ })];
920
+ }
921
+ }, {
922
+ fileName: import.meta.url,
923
+ lineNumber: 444,
924
+ columnNumber: 5
925
+ });
926
+ const content = _$createComponent(py.SourceFile, {
927
+ path: "test.py",
928
+ doc: moduleDoc,
929
+ get children() {
930
+ return _$createComponent(py.DataclassDeclaration, {
931
+ name: "User",
932
+ get children() {
933
+ return _$createComponent(py.VariableDeclaration, {
934
+ name: "name",
935
+ type: "str"
936
+ }, {
937
+ fileName: import.meta.url,
938
+ lineNumber: 450,
939
+ columnNumber: 9
940
+ });
941
+ }
942
+ }, {
943
+ fileName: import.meta.url,
944
+ lineNumber: 449,
945
+ columnNumber: 7
946
+ });
947
+ }
948
+ }, {
949
+ fileName: import.meta.url,
950
+ lineNumber: 448,
951
+ columnNumber: 5
952
+ });
953
+ expect(toSourceText(content, {
954
+ externals: [dataclassesModule]
955
+ })).toRenderTo(d`
956
+ """
957
+ Module description.
958
+ """
959
+
960
+ from dataclasses import dataclass
961
+
962
+
963
+ @dataclass
964
+ class User:
965
+ name: str = None
966
+
967
+
968
+ `);
969
+ });
970
+ it("doc + imports before non-definition", () => {
971
+ const moduleDoc = _$createComponent(py.ModuleDoc, {
972
+ get description() {
973
+ return [_$createComponent(Prose, {
974
+ children: "Module description."
975
+ }, {
976
+ fileName: import.meta.url,
977
+ lineNumber: 474,
978
+ columnNumber: 33
979
+ })];
980
+ }
981
+ }, {
982
+ fileName: import.meta.url,
983
+ lineNumber: 474,
984
+ columnNumber: 5
985
+ });
986
+ const content = _$createComponent(py.SourceFile, {
987
+ path: "test.py",
988
+ doc: moduleDoc,
989
+ get children() {
990
+ return _$createComponent(py.VariableDeclaration, {
991
+ name: "x",
992
+ get initializer() {
993
+ return _$createComponent(py.Reference, {
994
+ get refkey() {
995
+ return dataclassesModule["."].dataclass;
996
+ }
997
+ }, {
998
+ fileName: import.meta.url,
999
+ lineNumber: 481,
1000
+ columnNumber: 22
1001
+ });
1002
+ }
1003
+ }, {
1004
+ fileName: import.meta.url,
1005
+ lineNumber: 479,
1006
+ columnNumber: 7
1007
+ });
1008
+ }
1009
+ }, {
1010
+ fileName: import.meta.url,
1011
+ lineNumber: 478,
1012
+ columnNumber: 5
1013
+ });
1014
+ expect(toSourceText(content, {
1015
+ externals: [dataclassesModule]
1016
+ })).toRenderTo(d`
1017
+ """
1018
+ Module description.
1019
+ """
1020
+
1021
+ from dataclasses import dataclass
1022
+
1023
+ x = dataclass`);
1024
+ });
1025
+ it("futureImports + imports before definition", () => {
1026
+ const content = _$createComponent(py.SourceFile, {
1027
+ path: "test.py",
1028
+ get futureImports() {
1029
+ return [_$createComponent(py.FutureStatement, {
1030
+ feature: "annotations"
1031
+ }, {
1032
+ fileName: import.meta.url,
1033
+ lineNumber: 501,
1034
+ columnNumber: 23
1035
+ })];
1036
+ },
1037
+ get children() {
1038
+ return _$createComponent(py.DataclassDeclaration, {
1039
+ name: "User",
1040
+ get children() {
1041
+ return _$createComponent(py.VariableDeclaration, {
1042
+ name: "name",
1043
+ type: "str"
1044
+ }, {
1045
+ fileName: import.meta.url,
1046
+ lineNumber: 504,
1047
+ columnNumber: 9
1048
+ });
1049
+ }
1050
+ }, {
1051
+ fileName: import.meta.url,
1052
+ lineNumber: 503,
1053
+ columnNumber: 7
1054
+ });
1055
+ }
1056
+ }, {
1057
+ fileName: import.meta.url,
1058
+ lineNumber: 499,
1059
+ columnNumber: 5
1060
+ });
1061
+ expect(toSourceText(content, {
1062
+ externals: [dataclassesModule]
1063
+ })).toRenderTo(d`
1064
+ from __future__ import annotations
1065
+
1066
+ from dataclasses import dataclass
1067
+
1068
+
1069
+ @dataclass
1070
+ class User:
1071
+ name: str = None
1072
+
1073
+
1074
+ `);
1075
+ });
1076
+ it("futureImports + imports before non-definition", () => {
1077
+ const content = _$createComponent(py.SourceFile, {
1078
+ path: "test.py",
1079
+ get futureImports() {
1080
+ return [_$createComponent(py.FutureStatement, {
1081
+ feature: "annotations"
1082
+ }, {
1083
+ fileName: import.meta.url,
1084
+ lineNumber: 528,
1085
+ columnNumber: 23
1086
+ })];
1087
+ },
1088
+ get children() {
1089
+ return _$createComponent(py.VariableDeclaration, {
1090
+ name: "x",
1091
+ get initializer() {
1092
+ return _$createComponent(py.Reference, {
1093
+ get refkey() {
1094
+ return dataclassesModule["."].dataclass;
1095
+ }
1096
+ }, {
1097
+ fileName: import.meta.url,
1098
+ lineNumber: 532,
1099
+ columnNumber: 22
1100
+ });
1101
+ }
1102
+ }, {
1103
+ fileName: import.meta.url,
1104
+ lineNumber: 530,
1105
+ columnNumber: 7
1106
+ });
1107
+ }
1108
+ }, {
1109
+ fileName: import.meta.url,
1110
+ lineNumber: 526,
1111
+ columnNumber: 5
1112
+ });
1113
+ expect(toSourceText(content, {
1114
+ externals: [dataclassesModule]
1115
+ })).toRenderTo(d`
1116
+ from __future__ import annotations
1117
+
1118
+ from dataclasses import dataclass
1119
+
1120
+ x = dataclass`);
1121
+ });
1122
+ it("doc + futureImports + imports before definition", () => {
1123
+ const moduleDoc = _$createComponent(py.ModuleDoc, {
1124
+ get description() {
1125
+ return [_$createComponent(Prose, {
1126
+ children: "Module description."
1127
+ }, {
1128
+ fileName: import.meta.url,
1129
+ lineNumber: 548,
1130
+ columnNumber: 33
1131
+ })];
1132
+ }
1133
+ }, {
1134
+ fileName: import.meta.url,
1135
+ lineNumber: 548,
1136
+ columnNumber: 5
1137
+ });
1138
+ const content = _$createComponent(py.SourceFile, {
1139
+ path: "test.py",
1140
+ doc: moduleDoc,
1141
+ get futureImports() {
1142
+ return [_$createComponent(py.FutureStatement, {
1143
+ feature: "annotations"
1144
+ }, {
1145
+ fileName: import.meta.url,
1146
+ lineNumber: 555,
1147
+ columnNumber: 23
1148
+ })];
1149
+ },
1150
+ get children() {
1151
+ return _$createComponent(py.DataclassDeclaration, {
1152
+ name: "User",
1153
+ get children() {
1154
+ return _$createComponent(py.VariableDeclaration, {
1155
+ name: "name",
1156
+ type: "str"
1157
+ }, {
1158
+ fileName: import.meta.url,
1159
+ lineNumber: 558,
1160
+ columnNumber: 9
1161
+ });
1162
+ }
1163
+ }, {
1164
+ fileName: import.meta.url,
1165
+ lineNumber: 557,
1166
+ columnNumber: 7
1167
+ });
1168
+ }
1169
+ }, {
1170
+ fileName: import.meta.url,
1171
+ lineNumber: 552,
1172
+ columnNumber: 5
1173
+ });
1174
+ expect(toSourceText(content, {
1175
+ externals: [dataclassesModule]
1176
+ })).toRenderTo(d`
1177
+ """
1178
+ Module description.
1179
+ """
1180
+
1181
+ from __future__ import annotations
1182
+
1183
+ from dataclasses import dataclass
1184
+
1185
+
1186
+ @dataclass
1187
+ class User:
1188
+ name: str = None
1189
+
1190
+
1191
+ `);
1192
+ });
1193
+ it("doc + futureImports + imports before non-definition", () => {
1194
+ const moduleDoc = _$createComponent(py.ModuleDoc, {
1195
+ get description() {
1196
+ return [_$createComponent(Prose, {
1197
+ children: "Module description."
1198
+ }, {
1199
+ fileName: import.meta.url,
1200
+ lineNumber: 584,
1201
+ columnNumber: 33
1202
+ })];
1203
+ }
1204
+ }, {
1205
+ fileName: import.meta.url,
1206
+ lineNumber: 584,
1207
+ columnNumber: 5
1208
+ });
1209
+ const content = _$createComponent(py.SourceFile, {
1210
+ path: "test.py",
1211
+ doc: moduleDoc,
1212
+ get futureImports() {
1213
+ return [_$createComponent(py.FutureStatement, {
1214
+ feature: "annotations"
1215
+ }, {
1216
+ fileName: import.meta.url,
1217
+ lineNumber: 591,
1218
+ columnNumber: 23
1219
+ })];
1220
+ },
1221
+ get children() {
1222
+ return _$createComponent(py.VariableDeclaration, {
1223
+ name: "x",
1224
+ get initializer() {
1225
+ return _$createComponent(py.Reference, {
1226
+ get refkey() {
1227
+ return dataclassesModule["."].dataclass;
1228
+ }
1229
+ }, {
1230
+ fileName: import.meta.url,
1231
+ lineNumber: 595,
1232
+ columnNumber: 22
1233
+ });
1234
+ }
1235
+ }, {
1236
+ fileName: import.meta.url,
1237
+ lineNumber: 593,
1238
+ columnNumber: 7
1239
+ });
1240
+ }
1241
+ }, {
1242
+ fileName: import.meta.url,
1243
+ lineNumber: 588,
1244
+ columnNumber: 5
1245
+ });
1246
+ expect(toSourceText(content, {
1247
+ externals: [dataclassesModule]
1248
+ })).toRenderTo(d`
1249
+ """
1250
+ Module description.
1251
+ """
1252
+
1253
+ from __future__ import annotations
1254
+
1255
+ from dataclasses import dataclass
1256
+
1257
+ x = dataclass`);
1258
+ });
1259
+ it("only doc in file (no children)", () => {
1260
+ const moduleDoc = _$createComponent(py.ModuleDoc, {
1261
+ get description() {
1262
+ return [_$createComponent(Prose, {
1263
+ children: "Module description."
1264
+ }, {
1265
+ fileName: import.meta.url,
1266
+ lineNumber: 615,
1267
+ columnNumber: 33
1268
+ })];
1269
+ }
1270
+ }, {
1271
+ fileName: import.meta.url,
1272
+ lineNumber: 615,
1273
+ columnNumber: 5
1274
+ });
1275
+ const content = _$createComponent(py.SourceFile, {
1276
+ path: "test.py",
1277
+ doc: moduleDoc
1278
+ }, {
1279
+ fileName: import.meta.url,
1280
+ lineNumber: 618,
1281
+ columnNumber: 19
1282
+ });
1283
+ expect(toSourceText(content)).toRenderTo(d`
1284
+ """
1285
+ Module description.
1286
+ """
1287
+
1288
+
1289
+ `);
1290
+ });
1291
+ it("only header in file (no children)", () => {
1292
+ const content = _$createComponent(py.SourceFile, {
1293
+ path: "test.py",
1294
+ header: "#!/usr/bin/env python3"
1295
+ }, {
1296
+ fileName: import.meta.url,
1297
+ lineNumber: 631,
1298
+ columnNumber: 5
1299
+ });
1300
+ expect(toSourceText(content)).toRenderTo(d`
1301
+ #!/usr/bin/env python3
1302
+
1303
+
1304
+ `);
1305
+ });
1306
+ it("only futureImports in file (no children)", () => {
1307
+ const content = _$createComponent(py.SourceFile, {
1308
+ path: "test.py",
1309
+ get futureImports() {
1310
+ return [_$createComponent(py.FutureStatement, {
1311
+ feature: "annotations"
1312
+ }, {
1313
+ fileName: import.meta.url,
1314
+ lineNumber: 645,
1315
+ columnNumber: 23
1316
+ })];
1317
+ }
1318
+ }, {
1319
+ fileName: import.meta.url,
1320
+ lineNumber: 643,
1321
+ columnNumber: 5
1322
+ });
1323
+ expect(toSourceText(content)).toRenderTo(d`
1324
+ from __future__ import annotations
1325
+
1326
+ `);
1327
+ });
1328
+ it("doc + futureImports in file (no children)", () => {
1329
+ const moduleDoc = _$createComponent(py.ModuleDoc, {
1330
+ get description() {
1331
+ return [_$createComponent(Prose, {
1332
+ children: "Module description."
1333
+ }, {
1334
+ fileName: import.meta.url,
1335
+ lineNumber: 657,
1336
+ columnNumber: 33
1337
+ })];
1338
+ }
1339
+ }, {
1340
+ fileName: import.meta.url,
1341
+ lineNumber: 657,
1342
+ columnNumber: 5
1343
+ });
1344
+ const content = _$createComponent(py.SourceFile, {
1345
+ path: "test.py",
1346
+ doc: moduleDoc,
1347
+ get futureImports() {
1348
+ return [_$createComponent(py.FutureStatement, {
1349
+ feature: "annotations"
1350
+ }, {
1351
+ fileName: import.meta.url,
1352
+ lineNumber: 664,
1353
+ columnNumber: 23
1354
+ })];
1355
+ }
1356
+ }, {
1357
+ fileName: import.meta.url,
1358
+ lineNumber: 661,
1359
+ columnNumber: 5
1360
+ });
1361
+ expect(toSourceText(content)).toRenderTo(d`
1362
+ """
1363
+ Module description.
1364
+ """
1365
+
1366
+ from __future__ import annotations
1367
+
1368
+ `);
1369
+ });
1370
+
1371
+ // headerComment tests
1372
+ it("only headerComment before definition", () => {
1373
+ const content = _$createComponent(py.SourceFile, {
1374
+ path: "test.py",
1375
+ headerComment: "Copyright 2024 My Company",
1376
+ get children() {
1377
+ return _$createComponent(py.FunctionDeclaration, {
1378
+ name: "hello",
1379
+ children: "pass"
1380
+ }, {
1381
+ fileName: import.meta.url,
1382
+ lineNumber: 682,
1383
+ columnNumber: 7
1384
+ });
1385
+ }
1386
+ }, {
1387
+ fileName: import.meta.url,
1388
+ lineNumber: 681,
1389
+ columnNumber: 5
1390
+ });
1391
+
1392
+ // 2 blank lines before definition (PEP 8)
1393
+ expect(toSourceText(content)).toRenderTo(d`
1394
+ # Copyright 2024 My Company
1395
+
1396
+
1397
+ def hello():
1398
+ pass
1399
+
1400
+
1401
+ `);
1402
+ });
1403
+ it("only headerComment before non-definition", () => {
1404
+ const content = _$createComponent(py.SourceFile, {
1405
+ path: "test.py",
1406
+ headerComment: "Copyright 2024 My Company",
1407
+ get children() {
1408
+ return _$createComponent(py.VariableDeclaration, {
1409
+ name: "x",
1410
+ initializer: 42
1411
+ }, {
1412
+ fileName: import.meta.url,
1413
+ lineNumber: 701,
1414
+ columnNumber: 7
1415
+ });
1416
+ }
1417
+ }, {
1418
+ fileName: import.meta.url,
1419
+ lineNumber: 700,
1420
+ columnNumber: 5
1421
+ });
1422
+ expect(toSourceText(content)).toRenderTo(d`
1423
+ # Copyright 2024 My Company
1424
+
1425
+ x = 42`);
1426
+ });
1427
+ it("headerComment + doc before definition", () => {
1428
+ const moduleDoc = _$createComponent(py.ModuleDoc, {
1429
+ get description() {
1430
+ return [_$createComponent(Prose, {
1431
+ children: "Module description."
1432
+ }, {
1433
+ fileName: import.meta.url,
1434
+ lineNumber: 713,
1435
+ columnNumber: 33
1436
+ })];
1437
+ }
1438
+ }, {
1439
+ fileName: import.meta.url,
1440
+ lineNumber: 713,
1441
+ columnNumber: 5
1442
+ });
1443
+ const content = _$createComponent(py.SourceFile, {
1444
+ path: "test.py",
1445
+ headerComment: "Copyright 2024 My Company",
1446
+ doc: moduleDoc,
1447
+ get children() {
1448
+ return _$createComponent(py.FunctionDeclaration, {
1449
+ name: "hello",
1450
+ children: "pass"
1451
+ }, {
1452
+ fileName: import.meta.url,
1453
+ lineNumber: 722,
1454
+ columnNumber: 7
1455
+ });
1456
+ }
1457
+ }, {
1458
+ fileName: import.meta.url,
1459
+ lineNumber: 717,
1460
+ columnNumber: 5
1461
+ });
1462
+
1463
+ // headerComment and doc adjacent, then PEP 8 spacing before definition
1464
+ expect(toSourceText(content)).toRenderTo(d`
1465
+ # Copyright 2024 My Company
1466
+ """
1467
+ Module description.
1468
+ """
1469
+
1470
+
1471
+ def hello():
1472
+ pass
1473
+
1474
+
1475
+ `);
1476
+ });
1477
+ it("headerComment + futureImports before definition", () => {
1478
+ const content = _$createComponent(py.SourceFile, {
1479
+ path: "test.py",
1480
+ headerComment: "Copyright 2024 My Company",
1481
+ get futureImports() {
1482
+ return [_$createComponent(py.FutureStatement, {
1483
+ feature: "annotations"
1484
+ }, {
1485
+ fileName: import.meta.url,
1486
+ lineNumber: 746,
1487
+ columnNumber: 23
1488
+ })];
1489
+ },
1490
+ get children() {
1491
+ return _$createComponent(py.FunctionDeclaration, {
1492
+ name: "hello",
1493
+ children: "pass"
1494
+ }, {
1495
+ fileName: import.meta.url,
1496
+ lineNumber: 748,
1497
+ columnNumber: 7
1498
+ });
1499
+ }
1500
+ }, {
1501
+ fileName: import.meta.url,
1502
+ lineNumber: 743,
1503
+ columnNumber: 5
1504
+ });
1505
+
1506
+ // headerComment and futureImports adjacent, then PEP 8 spacing
1507
+ expect(toSourceText(content)).toRenderTo(d`
1508
+ # Copyright 2024 My Company
1509
+
1510
+ from __future__ import annotations
1511
+
1512
+
1513
+ def hello():
1514
+ pass
1515
+
1516
+
1517
+ `);
1518
+ });
1519
+ it("headerComment + imports before definition", () => {
1520
+ const content = _$createComponent(py.SourceFile, {
1521
+ path: "test.py",
1522
+ headerComment: "Copyright 2024 My Company",
1523
+ get children() {
1524
+ return _$createComponent(py.DataclassDeclaration, {
1525
+ name: "User",
1526
+ get children() {
1527
+ return _$createComponent(py.VariableDeclaration, {
1528
+ name: "name",
1529
+ type: "str"
1530
+ }, {
1531
+ fileName: import.meta.url,
1532
+ lineNumber: 770,
1533
+ columnNumber: 9
1534
+ });
1535
+ }
1536
+ }, {
1537
+ fileName: import.meta.url,
1538
+ lineNumber: 769,
1539
+ columnNumber: 7
1540
+ });
1541
+ }
1542
+ }, {
1543
+ fileName: import.meta.url,
1544
+ lineNumber: 768,
1545
+ columnNumber: 5
1546
+ });
1547
+ expect(toSourceText(content, {
1548
+ externals: [dataclassesModule]
1549
+ })).toRenderTo(d`
1550
+ # Copyright 2024 My Company
1551
+
1552
+ from dataclasses import dataclass
1553
+
1554
+
1555
+ @dataclass
1556
+ class User:
1557
+ name: str = None
1558
+
1559
+
1560
+ `);
1561
+ });
1562
+ it("headerComment + doc + futureImports before definition", () => {
1563
+ const moduleDoc = _$createComponent(py.ModuleDoc, {
1564
+ get description() {
1565
+ return [_$createComponent(Prose, {
1566
+ children: "Module description."
1567
+ }, {
1568
+ fileName: import.meta.url,
1569
+ lineNumber: 792,
1570
+ columnNumber: 33
1571
+ })];
1572
+ }
1573
+ }, {
1574
+ fileName: import.meta.url,
1575
+ lineNumber: 792,
1576
+ columnNumber: 5
1577
+ });
1578
+ const content = _$createComponent(py.SourceFile, {
1579
+ path: "test.py",
1580
+ headerComment: "Copyright 2024 My Company",
1581
+ doc: moduleDoc,
1582
+ get futureImports() {
1583
+ return [_$createComponent(py.FutureStatement, {
1584
+ feature: "annotations"
1585
+ }, {
1586
+ fileName: import.meta.url,
1587
+ lineNumber: 800,
1588
+ columnNumber: 23
1589
+ })];
1590
+ },
1591
+ get children() {
1592
+ return _$createComponent(py.FunctionDeclaration, {
1593
+ name: "hello",
1594
+ children: "pass"
1595
+ }, {
1596
+ fileName: import.meta.url,
1597
+ lineNumber: 802,
1598
+ columnNumber: 7
1599
+ });
1600
+ }
1601
+ }, {
1602
+ fileName: import.meta.url,
1603
+ lineNumber: 796,
1604
+ columnNumber: 5
1605
+ });
1606
+ expect(toSourceText(content)).toRenderTo(d`
1607
+ # Copyright 2024 My Company
1608
+ """
1609
+ Module description.
1610
+ """
1611
+
1612
+ from __future__ import annotations
1613
+
1614
+
1615
+ def hello():
1616
+ pass
1617
+
1618
+
1619
+ `);
1620
+ });
1621
+ it("headerComment + doc + futureImports + imports before definition", () => {
1622
+ const moduleDoc = _$createComponent(py.ModuleDoc, {
1623
+ get description() {
1624
+ return [_$createComponent(Prose, {
1625
+ children: "Module description."
1626
+ }, {
1627
+ fileName: import.meta.url,
1628
+ lineNumber: 824,
1629
+ columnNumber: 33
1630
+ })];
1631
+ }
1632
+ }, {
1633
+ fileName: import.meta.url,
1634
+ lineNumber: 824,
1635
+ columnNumber: 5
1636
+ });
1637
+ const content = _$createComponent(py.SourceFile, {
1638
+ path: "test.py",
1639
+ headerComment: "Copyright 2024 My Company",
1640
+ doc: moduleDoc,
1641
+ get futureImports() {
1642
+ return [_$createComponent(py.FutureStatement, {
1643
+ feature: "annotations"
1644
+ }, {
1645
+ fileName: import.meta.url,
1646
+ lineNumber: 832,
1647
+ columnNumber: 23
1648
+ })];
1649
+ },
1650
+ get children() {
1651
+ return _$createComponent(py.DataclassDeclaration, {
1652
+ name: "User",
1653
+ get children() {
1654
+ return _$createComponent(py.VariableDeclaration, {
1655
+ name: "name",
1656
+ type: "str"
1657
+ }, {
1658
+ fileName: import.meta.url,
1659
+ lineNumber: 835,
1660
+ columnNumber: 9
1661
+ });
1662
+ }
1663
+ }, {
1664
+ fileName: import.meta.url,
1665
+ lineNumber: 834,
1666
+ columnNumber: 7
1667
+ });
1668
+ }
1669
+ }, {
1670
+ fileName: import.meta.url,
1671
+ lineNumber: 828,
1672
+ columnNumber: 5
1673
+ });
1674
+ expect(toSourceText(content, {
1675
+ externals: [dataclassesModule]
1676
+ })).toRenderTo(d`
1677
+ # Copyright 2024 My Company
1678
+ """
1679
+ Module description.
1680
+ """
1681
+
1682
+ from __future__ import annotations
1683
+
1684
+ from dataclasses import dataclass
1685
+
1686
+
1687
+ @dataclass
1688
+ class User:
1689
+ name: str = None
1690
+
1691
+
1692
+ `);
1693
+ });
1694
+ it("only headerComment in file (no children)", () => {
1695
+ const content = _$createComponent(py.SourceFile, {
1696
+ path: "test.py",
1697
+ headerComment: "Copyright 2024 My Company"
1698
+ }, {
1699
+ fileName: import.meta.url,
1700
+ lineNumber: 862,
1701
+ columnNumber: 5
1702
+ });
1703
+ expect(toSourceText(content)).toRenderTo(d`
1704
+ # Copyright 2024 My Company
1705
+
1706
+ `);
1707
+ });
1708
+ it("header + headerComment before definition", () => {
1709
+ const content = _$createComponent(py.SourceFile, {
1710
+ path: "test.py",
1711
+ header: "#!/usr/bin/env python3",
1712
+ headerComment: "Copyright 2024 My Company",
1713
+ get children() {
1714
+ return _$createComponent(py.FunctionDeclaration, {
1715
+ name: "hello",
1716
+ children: "pass"
1717
+ }, {
1718
+ fileName: import.meta.url,
1719
+ lineNumber: 878,
1720
+ columnNumber: 7
1721
+ });
1722
+ }
1723
+ }, {
1724
+ fileName: import.meta.url,
1725
+ lineNumber: 873,
1726
+ columnNumber: 5
1727
+ });
1728
+
1729
+ // 2 blank lines before definition (PEP 8)
1730
+ expect(toSourceText(content)).toRenderTo(d`
1731
+ #!/usr/bin/env python3
1732
+ # Copyright 2024 My Company
1733
+
1734
+
1735
+ def hello():
1736
+ pass
1737
+
1738
+
1739
+ `);
1740
+ });
1741
+ it("header + headerComment before class definition", () => {
1742
+ const content = _$createComponent(py.SourceFile, {
1743
+ path: "test.py",
1744
+ header: "#!/usr/bin/env python3",
1745
+ headerComment: "Copyright 2024 My Company",
1746
+ get children() {
1747
+ return _$createComponent(py.ClassDeclaration, {
1748
+ name: "MyClass",
1749
+ children: "pass"
1750
+ }, {
1751
+ fileName: import.meta.url,
1752
+ lineNumber: 902,
1753
+ columnNumber: 7
1754
+ });
1755
+ }
1756
+ }, {
1757
+ fileName: import.meta.url,
1758
+ lineNumber: 897,
1759
+ columnNumber: 5
1760
+ });
1761
+
1762
+ // 2 blank lines before definition (PEP 8)
1763
+ expect(toSourceText(content)).toRenderTo(d`
1764
+ #!/usr/bin/env python3
1765
+ # Copyright 2024 My Company
1766
+
1767
+
1768
+ class MyClass:
1769
+ pass
1770
+
1771
+
1772
+ `);
1773
+ });
1774
+ it("header + headerComment before non-definition", () => {
1775
+ const content = _$createComponent(py.SourceFile, {
1776
+ path: "test.py",
1777
+ header: "#!/usr/bin/env python3",
1778
+ headerComment: "Copyright 2024 My Company",
1779
+ get children() {
1780
+ return _$createComponent(py.VariableDeclaration, {
1781
+ name: "x",
1782
+ initializer: 42
1783
+ }, {
1784
+ fileName: import.meta.url,
1785
+ lineNumber: 926,
1786
+ columnNumber: 7
1787
+ });
1788
+ }
1789
+ }, {
1790
+ fileName: import.meta.url,
1791
+ lineNumber: 921,
1792
+ columnNumber: 5
1793
+ });
1794
+
1795
+ // 1 blank line for non-definition
1796
+ expect(toSourceText(content)).toRenderTo(d`
1797
+ #!/usr/bin/env python3
1798
+ # Copyright 2024 My Company
1799
+
1800
+ x = 42`);
1801
+ });
1802
+ //# sourceMappingURL=sourcefiles.test.js.map