@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.
- package/dist/dev/src/builtins/python.js +46 -0
- package/dist/dev/src/builtins/python.js.map +1 -1
- package/dist/dev/src/components/ClassDeclaration.js +19 -10
- package/dist/dev/src/components/ClassDeclaration.js.map +1 -1
- package/dist/dev/src/components/ClassMethodDeclaration.js +20 -5
- package/dist/dev/src/components/ClassMethodDeclaration.js.map +1 -1
- package/dist/dev/src/components/DataclassDeclaration.js +14 -12
- package/dist/dev/src/components/DataclassDeclaration.js.map +1 -1
- package/dist/dev/src/components/DecoratorList.js +55 -0
- package/dist/dev/src/components/DecoratorList.js.map +1 -0
- package/dist/dev/src/components/EnumDeclaration.js +21 -12
- package/dist/dev/src/components/EnumDeclaration.js.map +1 -1
- package/dist/dev/src/components/FunctionBase.js +21 -10
- package/dist/dev/src/components/FunctionBase.js.map +1 -1
- package/dist/dev/src/components/FutureStatement.js +1 -1
- package/dist/dev/src/components/MethodBase.js +16 -4
- package/dist/dev/src/components/MethodBase.js.map +1 -1
- package/dist/dev/src/components/PropertyDeclaration.js +68 -17
- package/dist/dev/src/components/PropertyDeclaration.js.map +1 -1
- package/dist/dev/src/components/PydanticClassDeclaration.js +136 -0
- package/dist/dev/src/components/PydanticClassDeclaration.js.map +1 -0
- package/dist/dev/src/components/SourceFile.js +44 -32
- package/dist/dev/src/components/SourceFile.js.map +1 -1
- package/dist/dev/src/components/StaticMethodDeclaration.js +19 -5
- package/dist/dev/src/components/StaticMethodDeclaration.js.map +1 -1
- package/dist/dev/src/components/index.js +1 -0
- package/dist/dev/src/components/index.js.map +1 -1
- package/dist/dev/test/callsignatures.test.js +471 -297
- package/dist/dev/test/callsignatures.test.js.map +1 -1
- package/dist/dev/test/class-method-declaration.test.js +21 -10
- package/dist/dev/test/class-method-declaration.test.js.map +1 -1
- package/dist/dev/test/classdeclarations.test.js +480 -381
- package/dist/dev/test/classdeclarations.test.js.map +1 -1
- package/dist/dev/test/classinstantiations.test.js +201 -168
- package/dist/dev/test/classinstantiations.test.js.map +1 -1
- package/dist/dev/test/constructordeclaration.test.js +22 -11
- package/dist/dev/test/constructordeclaration.test.js.map +1 -1
- package/dist/dev/test/dataclassdeclarations.test.js +345 -358
- package/dist/dev/test/dataclassdeclarations.test.js.map +1 -1
- package/dist/dev/test/decoratorlist.test.js +131 -0
- package/dist/dev/test/decoratorlist.test.js.map +1 -0
- package/dist/dev/test/dundermethoddeclaration.test.js +22 -11
- package/dist/dev/test/dundermethoddeclaration.test.js.map +1 -1
- package/dist/dev/test/enums.test.js +231 -166
- package/dist/dev/test/enums.test.js.map +1 -1
- package/dist/dev/test/externals.test.js +57 -45
- package/dist/dev/test/externals.test.js.map +1 -1
- package/dist/dev/test/factories.test.js +124 -50
- package/dist/dev/test/factories.test.js.map +1 -1
- package/dist/dev/test/functioncallexpressions.test.js +199 -164
- package/dist/dev/test/functioncallexpressions.test.js.map +1 -1
- package/dist/dev/test/functiondeclaration.test.js +452 -265
- package/dist/dev/test/functiondeclaration.test.js.map +1 -1
- package/dist/dev/test/imports.test.js +273 -221
- package/dist/dev/test/imports.test.js.map +1 -1
- package/dist/dev/test/memberexpressions.test.js +1237 -972
- package/dist/dev/test/memberexpressions.test.js.map +1 -1
- package/dist/dev/test/methoddeclaration.test.js +200 -45
- package/dist/dev/test/methoddeclaration.test.js.map +1 -1
- package/dist/dev/test/namepolicies.test.js +130 -94
- package/dist/dev/test/namepolicies.test.js.map +1 -1
- package/dist/dev/test/propertydeclaration.test.js +177 -46
- package/dist/dev/test/propertydeclaration.test.js.map +1 -1
- package/dist/dev/test/pydanticclassdeclarations.test.js +1089 -0
- package/dist/dev/test/pydanticclassdeclarations.test.js.map +1 -0
- package/dist/dev/test/pydocs.test.js +888 -715
- package/dist/dev/test/pydocs.test.js.map +1 -1
- package/dist/dev/test/references.test.js +42 -35
- package/dist/dev/test/references.test.js.map +1 -1
- package/dist/dev/test/sourcefiles.test.js +1109 -841
- package/dist/dev/test/sourcefiles.test.js.map +1 -1
- package/dist/dev/test/staticmethoddeclaration.test.js +21 -10
- package/dist/dev/test/staticmethoddeclaration.test.js.map +1 -1
- package/dist/dev/test/type-checking-imports.test.js +408 -359
- package/dist/dev/test/type-checking-imports.test.js.map +1 -1
- package/dist/dev/test/typereference.test.js +55 -40
- package/dist/dev/test/typereference.test.js.map +1 -1
- package/dist/dev/test/uniontypeexpression.test.js +222 -146
- package/dist/dev/test/uniontypeexpression.test.js.map +1 -1
- package/dist/dev/test/utils.js +39 -77
- package/dist/dev/test/utils.js.map +1 -1
- package/dist/dev/test/values.test.js +237 -101
- package/dist/dev/test/values.test.js.map +1 -1
- package/dist/dev/test/variables.test.js +321 -203
- package/dist/dev/test/variables.test.js.map +1 -1
- package/dist/dev/test/vitest.setup.js +2 -0
- package/dist/dev/test/vitest.setup.js.map +1 -0
- package/dist/src/builtins/python.d.ts +30 -0
- package/dist/src/builtins/python.d.ts.map +1 -1
- package/dist/src/builtins/python.js +46 -0
- package/dist/src/builtins/python.js.map +1 -1
- package/dist/src/components/ClassDeclaration.d.ts +21 -0
- package/dist/src/components/ClassDeclaration.d.ts.map +1 -1
- package/dist/src/components/ClassDeclaration.js +6 -1
- package/dist/src/components/ClassDeclaration.js.map +1 -1
- package/dist/src/components/ClassMethodDeclaration.d.ts +5 -1
- package/dist/src/components/ClassMethodDeclaration.d.ts.map +1 -1
- package/dist/src/components/ClassMethodDeclaration.js +14 -3
- package/dist/src/components/ClassMethodDeclaration.js.map +1 -1
- package/dist/src/components/DataclassDeclaration.d.ts.map +1 -1
- package/dist/src/components/DataclassDeclaration.js +10 -4
- package/dist/src/components/DataclassDeclaration.js.map +1 -1
- package/dist/src/components/DecoratorList.d.ts +43 -0
- package/dist/src/components/DecoratorList.d.ts.map +1 -0
- package/dist/src/components/DecoratorList.js +47 -0
- package/dist/src/components/DecoratorList.js.map +1 -0
- package/dist/src/components/EnumDeclaration.d.ts +9 -0
- package/dist/src/components/EnumDeclaration.d.ts.map +1 -1
- package/dist/src/components/EnumDeclaration.js +6 -1
- package/dist/src/components/EnumDeclaration.js.map +1 -1
- package/dist/src/components/FunctionBase.d.ts +31 -1
- package/dist/src/components/FunctionBase.d.ts.map +1 -1
- package/dist/src/components/FunctionBase.js +9 -2
- package/dist/src/components/FunctionBase.js.map +1 -1
- package/dist/src/components/FutureStatement.d.ts +1 -1
- package/dist/src/components/FutureStatement.js +1 -1
- package/dist/src/components/MethodBase.d.ts.map +1 -1
- package/dist/src/components/MethodBase.js +10 -2
- package/dist/src/components/MethodBase.js.map +1 -1
- package/dist/src/components/PropertyDeclaration.d.ts +29 -0
- package/dist/src/components/PropertyDeclaration.d.ts.map +1 -1
- package/dist/src/components/PropertyDeclaration.js +48 -1
- package/dist/src/components/PropertyDeclaration.js.map +1 -1
- package/dist/src/components/PydanticClassDeclaration.d.ts +120 -0
- package/dist/src/components/PydanticClassDeclaration.d.ts.map +1 -0
- package/dist/src/components/PydanticClassDeclaration.js +116 -0
- package/dist/src/components/PydanticClassDeclaration.js.map +1 -0
- package/dist/src/components/SourceFile.d.ts +2 -2
- package/dist/src/components/SourceFile.d.ts.map +1 -1
- package/dist/src/components/SourceFile.js +12 -0
- package/dist/src/components/SourceFile.js.map +1 -1
- package/dist/src/components/StaticMethodDeclaration.d.ts +3 -0
- package/dist/src/components/StaticMethodDeclaration.d.ts.map +1 -1
- package/dist/src/components/StaticMethodDeclaration.js +13 -3
- package/dist/src/components/StaticMethodDeclaration.js.map +1 -1
- package/dist/src/components/index.d.ts +1 -0
- package/dist/src/components/index.d.ts.map +1 -1
- package/dist/src/components/index.js +1 -0
- package/dist/src/components/index.js.map +1 -1
- package/dist/test/callsignatures.test.js +346 -272
- package/dist/test/callsignatures.test.js.map +1 -1
- package/dist/test/class-method-declaration.test.js +7 -4
- package/dist/test/class-method-declaration.test.js.map +1 -1
- package/dist/test/classdeclarations.test.js +316 -277
- package/dist/test/classdeclarations.test.js.map +1 -1
- package/dist/test/classinstantiations.test.js +112 -103
- package/dist/test/classinstantiations.test.js.map +1 -1
- package/dist/test/constructordeclaration.test.js +7 -4
- package/dist/test/constructordeclaration.test.js.map +1 -1
- package/dist/test/dataclassdeclarations.test.js +153 -178
- package/dist/test/dataclassdeclarations.test.js.map +1 -1
- package/dist/test/decoratorlist.test.d.ts +2 -0
- package/dist/test/decoratorlist.test.d.ts.map +1 -0
- package/dist/test/decoratorlist.test.js +83 -0
- package/dist/test/decoratorlist.test.js.map +1 -0
- package/dist/test/dundermethoddeclaration.test.js +7 -4
- package/dist/test/dundermethoddeclaration.test.js.map +1 -1
- package/dist/test/enums.test.js +172 -143
- package/dist/test/enums.test.js.map +1 -1
- package/dist/test/externals.test.js +24 -24
- package/dist/test/externals.test.js.map +1 -1
- package/dist/test/factories.test.js +75 -33
- package/dist/test/factories.test.js.map +1 -1
- package/dist/test/functioncallexpressions.test.js +117 -106
- package/dist/test/functioncallexpressions.test.js.map +1 -1
- package/dist/test/functiondeclaration.test.js +256 -173
- package/dist/test/functiondeclaration.test.js.map +1 -1
- package/dist/test/imports.test.js +171 -143
- package/dist/test/imports.test.js.map +1 -1
- package/dist/test/memberexpressions.test.js +582 -453
- package/dist/test/memberexpressions.test.js.map +1 -1
- package/dist/test/methoddeclaration.test.js +106 -19
- package/dist/test/methoddeclaration.test.js.map +1 -1
- package/dist/test/namepolicies.test.js +90 -78
- package/dist/test/namepolicies.test.js.map +1 -1
- package/dist/test/propertydeclaration.test.js +90 -15
- package/dist/test/propertydeclaration.test.js.map +1 -1
- package/dist/test/pydanticclassdeclarations.test.d.ts +2 -0
- package/dist/test/pydanticclassdeclarations.test.d.ts.map +1 -0
- package/dist/test/pydanticclassdeclarations.test.js +773 -0
- package/dist/test/pydanticclassdeclarations.test.js.map +1 -0
- package/dist/test/pydocs.test.js +573 -532
- package/dist/test/pydocs.test.js.map +1 -1
- package/dist/test/references.test.js +31 -28
- package/dist/test/references.test.js.map +1 -1
- package/dist/test/sourcefiles.test.js +700 -580
- package/dist/test/sourcefiles.test.js.map +1 -1
- package/dist/test/staticmethoddeclaration.test.js +7 -4
- package/dist/test/staticmethoddeclaration.test.js.map +1 -1
- package/dist/test/type-checking-imports.test.js +297 -284
- package/dist/test/type-checking-imports.test.js.map +1 -1
- package/dist/test/typereference.test.js +29 -22
- package/dist/test/typereference.test.js.map +1 -1
- package/dist/test/uniontypeexpression.test.js +124 -88
- package/dist/test/uniontypeexpression.test.js.map +1 -1
- package/dist/test/utils.d.ts +10 -17
- package/dist/test/utils.d.ts.map +1 -1
- package/dist/test/utils.js +32 -74
- package/dist/test/utils.js.map +1 -1
- package/dist/test/values.test.js +135 -67
- package/dist/test/values.test.js.map +1 -1
- package/dist/test/variables.test.js +201 -151
- package/dist/test/variables.test.js.map +1 -1
- package/dist/test/vitest.setup.d.ts +2 -0
- package/dist/test/vitest.setup.d.ts.map +1 -0
- package/dist/test/vitest.setup.js +2 -0
- package/dist/test/vitest.setup.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/docs/api/components/ClassDeclaration.md +10 -7
- package/docs/api/components/ClassEnumDeclaration.md +9 -6
- package/docs/api/components/ClassMethodDeclaration.md +7 -5
- package/docs/api/components/DataclassDeclaration.md +9 -5
- package/docs/api/components/DunderMethodDeclaration.md +7 -5
- package/docs/api/components/FunctionDeclaration.md +9 -5
- package/docs/api/components/FutureStatement.md +1 -1
- package/docs/api/components/MethodDeclaration.md +11 -6
- package/docs/api/components/PropertyDeclaration.md +11 -8
- package/docs/api/components/PydanticClassDeclaration.md +146 -0
- package/docs/api/components/SourceFile.md +20 -8
- package/docs/api/components/StaticMethodDeclaration.md +7 -5
- package/docs/api/components/index.md +1 -0
- package/docs/api/index.md +3 -3
- package/docs/api/types/CommonFunctionProps.md +4 -3
- package/docs/api/types/PydanticModelConfigDictProps.md +32 -0
- package/docs/api/types/index.md +1 -0
- package/docs/api/variables/index.md +3 -0
- package/docs/api/variables/pydanticModule.md +27 -0
- package/docs/api/variables/pydanticSettingsModule.md +7 -0
- package/docs/api/variables/typingModule.md +9 -0
- package/package.json +4 -4
- package/src/builtins/python.ts +539 -1
- package/src/components/ClassDeclaration.tsx +23 -0
- package/src/components/ClassMethodDeclaration.tsx +9 -1
- package/src/components/DataclassDeclaration.tsx +18 -11
- package/src/components/DecoratorList.tsx +50 -0
- package/src/components/EnumDeclaration.tsx +11 -0
- package/src/components/FunctionBase.tsx +34 -3
- package/src/components/FutureStatement.tsx +1 -1
- package/src/components/MethodBase.tsx +6 -2
- package/src/components/PropertyDeclaration.tsx +48 -1
- package/src/components/PydanticClassDeclaration.tsx +222 -0
- package/src/components/SourceFile.tsx +6 -1
- package/src/components/StaticMethodDeclaration.tsx +7 -1
- package/src/components/index.ts +1 -0
- package/temp/api.json +1158 -86
- package/test/callsignatures.test.tsx +309 -283
- package/test/class-method-declaration.test.tsx +3 -4
- package/test/classdeclarations.test.tsx +277 -235
- package/test/classinstantiations.test.tsx +115 -109
- package/test/constructordeclaration.test.tsx +9 -6
- package/test/dataclassdeclarations.test.tsx +256 -349
- package/test/decoratorlist.test.tsx +114 -0
- package/test/dundermethoddeclaration.test.tsx +3 -4
- package/test/enums.test.tsx +84 -71
- package/test/externals.test.tsx +25 -25
- package/test/factories.test.tsx +64 -22
- package/test/functioncallexpressions.test.tsx +123 -109
- package/test/functiondeclaration.test.tsx +218 -140
- package/test/imports.test.tsx +119 -91
- package/test/memberexpressions.test.tsx +265 -207
- package/test/methoddeclaration.test.tsx +115 -24
- package/test/namepolicies.test.tsx +69 -69
- package/test/propertydeclaration.test.tsx +71 -7
- package/test/pydanticclassdeclarations.test.tsx +704 -0
- package/test/pydocs.test.tsx +531 -579
- package/test/references.test.tsx +24 -23
- package/test/sourcefiles.test.tsx +527 -492
- package/test/staticmethoddeclaration.test.tsx +3 -4
- package/test/type-checking-imports.test.tsx +206 -218
- package/test/typereference.test.tsx +15 -12
- package/test/uniontypeexpression.test.tsx +74 -61
- package/test/utils.tsx +26 -110
- package/test/values.test.tsx +82 -32
- package/test/variables.test.tsx +162 -142
- package/test/vitest.setup.ts +1 -0
- package/vitest.config.ts +3 -0
|
@@ -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 {
|
|
3
|
+
import { TestOutput } from "./utils.js";
|
|
5
4
|
|
|
6
5
|
describe("StaticMethodDeclaration", () => {
|
|
7
6
|
it("renders async static method", () => {
|
|
@@ -17,7 +16,7 @@ describe("StaticMethodDeclaration", () => {
|
|
|
17
16
|
</py.StatementList>
|
|
18
17
|
);
|
|
19
18
|
|
|
20
|
-
expect(
|
|
19
|
+
expect(<TestOutput>{decl}</TestOutput>).toRenderTo(`
|
|
21
20
|
class MyClass:
|
|
22
21
|
@staticmethod
|
|
23
22
|
async def util() -> str:
|
|
@@ -37,7 +36,7 @@ describe("StaticMethodDeclaration", () => {
|
|
|
37
36
|
</py.ClassDeclaration>
|
|
38
37
|
);
|
|
39
38
|
|
|
40
|
-
expect(
|
|
39
|
+
expect(<TestOutput>{decl}</TestOutput>).toRenderTo(`
|
|
41
40
|
class MyClass:
|
|
42
41
|
@staticmethod
|
|
43
42
|
def foo(x: int):
|
|
@@ -1,123 +1,121 @@
|
|
|
1
1
|
import { refkey } from "@alloy-js/core";
|
|
2
|
-
import { describe, it } from "vitest";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
3
|
import { createModule } from "../src/create-module.js";
|
|
4
4
|
import * as py from "../src/index.js";
|
|
5
|
-
import {
|
|
5
|
+
import { TestOutputDirectory } from "./utils.js";
|
|
6
6
|
|
|
7
7
|
describe("TYPE_CHECKING imports", () => {
|
|
8
8
|
it("imports type-only references inside TYPE_CHECKING block", () => {
|
|
9
9
|
const userClassRef = refkey();
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
<
|
|
13
|
-
<py.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
<py.
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
</py.FunctionDeclaration>
|
|
23
|
-
</py.SourceFile>,
|
|
24
|
-
]);
|
|
25
|
-
|
|
26
|
-
assertFileContents(result, {
|
|
27
|
-
"models.py": `
|
|
28
|
-
class User:
|
|
11
|
+
expect(
|
|
12
|
+
<TestOutputDirectory>
|
|
13
|
+
<py.SourceFile path="models.py">
|
|
14
|
+
<py.ClassDeclaration name="User" refkey={userClassRef} />
|
|
15
|
+
</py.SourceFile>
|
|
16
|
+
<py.SourceFile path="service.py">
|
|
17
|
+
<py.FunctionDeclaration
|
|
18
|
+
name="process_user"
|
|
19
|
+
parameters={[{ name: "user", type: userClassRef }]}
|
|
20
|
+
returnType="None"
|
|
21
|
+
>
|
|
29
22
|
pass
|
|
23
|
+
</py.FunctionDeclaration>
|
|
24
|
+
</py.SourceFile>
|
|
25
|
+
</TestOutputDirectory>,
|
|
26
|
+
).toRenderTo({
|
|
27
|
+
"models.py": `
|
|
28
|
+
class User:
|
|
29
|
+
pass
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
`,
|
|
32
32
|
"service.py": `
|
|
33
|
-
|
|
33
|
+
from typing import TYPE_CHECKING
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
if TYPE_CHECKING:
|
|
36
|
+
from models import User
|
|
37
37
|
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
def process_user(user: User) -> None:
|
|
40
|
+
pass
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
`,
|
|
43
43
|
});
|
|
44
44
|
});
|
|
45
45
|
|
|
46
46
|
it("imports value references outside TYPE_CHECKING block", () => {
|
|
47
47
|
const userClassRef = refkey();
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
<
|
|
51
|
-
<py.
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
<py.
|
|
55
|
-
<py.
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
49
|
+
expect(
|
|
50
|
+
<TestOutputDirectory>
|
|
51
|
+
<py.SourceFile path="models.py">
|
|
52
|
+
<py.ClassDeclaration name="User" refkey={userClassRef} />
|
|
53
|
+
</py.SourceFile>
|
|
54
|
+
<py.SourceFile path="service.py">
|
|
55
|
+
<py.FunctionDeclaration name="create_user" returnType="None">
|
|
56
|
+
<py.VariableDeclaration
|
|
57
|
+
name="user"
|
|
58
|
+
initializer={<py.ClassInstantiation target={userClassRef} />}
|
|
59
|
+
/>
|
|
60
|
+
</py.FunctionDeclaration>
|
|
61
|
+
</py.SourceFile>
|
|
62
|
+
</TestOutputDirectory>,
|
|
63
|
+
).toRenderTo({
|
|
64
64
|
"models.py": `
|
|
65
|
-
|
|
66
|
-
|
|
65
|
+
class User:
|
|
66
|
+
pass
|
|
67
67
|
|
|
68
|
-
|
|
68
|
+
`,
|
|
69
69
|
"service.py": `
|
|
70
|
-
|
|
70
|
+
from models import User
|
|
71
71
|
|
|
72
72
|
|
|
73
|
-
|
|
74
|
-
|
|
73
|
+
def create_user() -> None:
|
|
74
|
+
user = User()
|
|
75
75
|
|
|
76
|
-
|
|
76
|
+
`,
|
|
77
77
|
});
|
|
78
78
|
});
|
|
79
79
|
|
|
80
80
|
it("upgrades type-only import to regular import when also used as value", () => {
|
|
81
81
|
const userClassRef = refkey();
|
|
82
82
|
|
|
83
|
-
|
|
84
|
-
<
|
|
85
|
-
<py.
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
<py.
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
<py.
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
// as a value (ClassInstantiation), it should be a regular import
|
|
106
|
-
assertFileContents(result, {
|
|
83
|
+
expect(
|
|
84
|
+
<TestOutputDirectory>
|
|
85
|
+
<py.SourceFile path="models.py">
|
|
86
|
+
<py.ClassDeclaration name="User" refkey={userClassRef} />
|
|
87
|
+
</py.SourceFile>
|
|
88
|
+
<py.SourceFile path="service.py">
|
|
89
|
+
<py.FunctionDeclaration
|
|
90
|
+
name="create_user"
|
|
91
|
+
parameters={[{ name: "existing", type: userClassRef }]}
|
|
92
|
+
returnType={userClassRef}
|
|
93
|
+
>
|
|
94
|
+
<py.StatementList>
|
|
95
|
+
<py.VariableDeclaration
|
|
96
|
+
name="user"
|
|
97
|
+
initializer={<py.ClassInstantiation target={userClassRef} />}
|
|
98
|
+
/>
|
|
99
|
+
<>return user</>
|
|
100
|
+
</py.StatementList>
|
|
101
|
+
</py.FunctionDeclaration>
|
|
102
|
+
</py.SourceFile>
|
|
103
|
+
</TestOutputDirectory>,
|
|
104
|
+
).toRenderTo({
|
|
107
105
|
"models.py": `
|
|
108
|
-
|
|
109
|
-
|
|
106
|
+
class User:
|
|
107
|
+
pass
|
|
110
108
|
|
|
111
|
-
|
|
109
|
+
`,
|
|
112
110
|
"service.py": `
|
|
113
|
-
|
|
111
|
+
from models import User
|
|
114
112
|
|
|
115
113
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
114
|
+
def create_user(existing: User) -> User:
|
|
115
|
+
user = User()
|
|
116
|
+
return user
|
|
119
117
|
|
|
120
|
-
|
|
118
|
+
`,
|
|
121
119
|
});
|
|
122
120
|
});
|
|
123
121
|
|
|
@@ -125,179 +123,175 @@ describe("TYPE_CHECKING imports", () => {
|
|
|
125
123
|
const userClassRef = refkey();
|
|
126
124
|
const helperFuncRef = refkey();
|
|
127
125
|
|
|
128
|
-
|
|
129
|
-
<
|
|
130
|
-
<py.
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
</py.FunctionDeclaration>
|
|
134
|
-
</py.SourceFile>,
|
|
135
|
-
<py.SourceFile path="service.py">
|
|
136
|
-
<py.FunctionDeclaration
|
|
137
|
-
name="process"
|
|
138
|
-
parameters={[{ name: "user", type: userClassRef }]}
|
|
139
|
-
returnType="None"
|
|
140
|
-
>
|
|
141
|
-
<py.FunctionCallExpression target={helperFuncRef} />
|
|
142
|
-
</py.FunctionDeclaration>
|
|
143
|
-
</py.SourceFile>,
|
|
144
|
-
]);
|
|
145
|
-
|
|
146
|
-
// helper is used as a value (function call), User is only used as type
|
|
147
|
-
assertFileContents(result, {
|
|
148
|
-
"models.py": `
|
|
149
|
-
class User:
|
|
126
|
+
expect(
|
|
127
|
+
<TestOutputDirectory>
|
|
128
|
+
<py.SourceFile path="models.py">
|
|
129
|
+
<py.ClassDeclaration name="User" refkey={userClassRef} />
|
|
130
|
+
<py.FunctionDeclaration name="helper" refkey={helperFuncRef}>
|
|
150
131
|
pass
|
|
132
|
+
</py.FunctionDeclaration>
|
|
133
|
+
</py.SourceFile>
|
|
134
|
+
<py.SourceFile path="service.py">
|
|
135
|
+
<py.FunctionDeclaration
|
|
136
|
+
name="process"
|
|
137
|
+
parameters={[{ name: "user", type: userClassRef }]}
|
|
138
|
+
returnType="None"
|
|
139
|
+
>
|
|
140
|
+
<py.FunctionCallExpression target={helperFuncRef} />
|
|
141
|
+
</py.FunctionDeclaration>
|
|
142
|
+
</py.SourceFile>
|
|
143
|
+
</TestOutputDirectory>,
|
|
144
|
+
).toRenderTo({
|
|
145
|
+
"models.py": `
|
|
146
|
+
class User:
|
|
147
|
+
pass
|
|
151
148
|
|
|
152
149
|
|
|
153
|
-
|
|
154
|
-
|
|
150
|
+
def helper():
|
|
151
|
+
pass
|
|
155
152
|
|
|
156
|
-
|
|
153
|
+
`,
|
|
157
154
|
"service.py": `
|
|
158
|
-
|
|
159
|
-
|
|
155
|
+
from models import helper
|
|
156
|
+
from typing import TYPE_CHECKING
|
|
160
157
|
|
|
161
|
-
|
|
162
|
-
|
|
158
|
+
if TYPE_CHECKING:
|
|
159
|
+
from models import User
|
|
163
160
|
|
|
164
161
|
|
|
165
|
-
|
|
166
|
-
|
|
162
|
+
def process(user: User) -> None:
|
|
163
|
+
helper()
|
|
167
164
|
|
|
168
|
-
|
|
165
|
+
`,
|
|
169
166
|
});
|
|
170
167
|
});
|
|
171
168
|
|
|
172
169
|
it("handles return type as type-only import", () => {
|
|
173
170
|
const resultTypeRef = refkey();
|
|
174
171
|
|
|
175
|
-
|
|
176
|
-
<
|
|
177
|
-
<py.
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
<py.
|
|
181
|
-
|
|
182
|
-
</py.FunctionDeclaration>
|
|
183
|
-
</py.SourceFile>,
|
|
184
|
-
]);
|
|
185
|
-
|
|
186
|
-
assertFileContents(result, {
|
|
187
|
-
"types.py": `
|
|
188
|
-
class Result:
|
|
172
|
+
expect(
|
|
173
|
+
<TestOutputDirectory>
|
|
174
|
+
<py.SourceFile path="types.py">
|
|
175
|
+
<py.ClassDeclaration name="Result" refkey={resultTypeRef} />
|
|
176
|
+
</py.SourceFile>
|
|
177
|
+
<py.SourceFile path="main.py">
|
|
178
|
+
<py.FunctionDeclaration name="get_result" returnType={resultTypeRef}>
|
|
189
179
|
pass
|
|
180
|
+
</py.FunctionDeclaration>
|
|
181
|
+
</py.SourceFile>
|
|
182
|
+
</TestOutputDirectory>,
|
|
183
|
+
).toRenderTo({
|
|
184
|
+
"types.py": `
|
|
185
|
+
class Result:
|
|
186
|
+
pass
|
|
190
187
|
|
|
191
|
-
|
|
188
|
+
`,
|
|
192
189
|
"main.py": `
|
|
193
|
-
|
|
190
|
+
from typing import TYPE_CHECKING
|
|
194
191
|
|
|
195
|
-
|
|
196
|
-
|
|
192
|
+
if TYPE_CHECKING:
|
|
193
|
+
from types import Result
|
|
197
194
|
|
|
198
195
|
|
|
199
|
-
|
|
200
|
-
|
|
196
|
+
def get_result() -> Result:
|
|
197
|
+
pass
|
|
201
198
|
|
|
202
|
-
|
|
199
|
+
`,
|
|
203
200
|
});
|
|
204
201
|
});
|
|
205
202
|
|
|
206
203
|
it("handles variable type annotation as type-only import", () => {
|
|
207
204
|
const configTypeRef = refkey();
|
|
208
205
|
|
|
209
|
-
|
|
210
|
-
<
|
|
211
|
-
<py.
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
<py.
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
206
|
+
expect(
|
|
207
|
+
<TestOutputDirectory>
|
|
208
|
+
<py.SourceFile path="types.py">
|
|
209
|
+
<py.ClassDeclaration name="Config" refkey={configTypeRef} />
|
|
210
|
+
</py.SourceFile>
|
|
211
|
+
<py.SourceFile path="main.py">
|
|
212
|
+
<py.VariableDeclaration name="config" type={configTypeRef} omitNone />
|
|
213
|
+
</py.SourceFile>
|
|
214
|
+
</TestOutputDirectory>,
|
|
215
|
+
).toRenderTo({
|
|
219
216
|
"types.py": `
|
|
220
|
-
|
|
221
|
-
|
|
217
|
+
class Config:
|
|
218
|
+
pass
|
|
222
219
|
|
|
223
|
-
|
|
220
|
+
`,
|
|
224
221
|
"main.py": `
|
|
225
|
-
|
|
222
|
+
from typing import TYPE_CHECKING
|
|
226
223
|
|
|
227
|
-
|
|
228
|
-
|
|
224
|
+
if TYPE_CHECKING:
|
|
225
|
+
from types import Config
|
|
229
226
|
|
|
230
|
-
|
|
231
|
-
|
|
227
|
+
config: Config
|
|
228
|
+
`,
|
|
232
229
|
});
|
|
233
230
|
});
|
|
234
231
|
|
|
235
232
|
it("handles TypeReference component as type-only import", () => {
|
|
236
233
|
const myTypeRef = refkey();
|
|
237
234
|
|
|
238
|
-
|
|
239
|
-
<
|
|
240
|
-
<py.
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
<py.
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
235
|
+
expect(
|
|
236
|
+
<TestOutputDirectory>
|
|
237
|
+
<py.SourceFile path="types.py">
|
|
238
|
+
<py.ClassDeclaration name="MyType" refkey={myTypeRef} />
|
|
239
|
+
</py.SourceFile>
|
|
240
|
+
<py.SourceFile path="main.py">
|
|
241
|
+
<py.VariableDeclaration
|
|
242
|
+
name="value"
|
|
243
|
+
type={<py.TypeReference refkey={myTypeRef} />}
|
|
244
|
+
omitNone
|
|
245
|
+
/>
|
|
246
|
+
</py.SourceFile>
|
|
247
|
+
</TestOutputDirectory>,
|
|
248
|
+
).toRenderTo({
|
|
252
249
|
"types.py": `
|
|
253
|
-
|
|
254
|
-
|
|
250
|
+
class MyType:
|
|
251
|
+
pass
|
|
255
252
|
|
|
256
|
-
|
|
253
|
+
`,
|
|
257
254
|
"main.py": `
|
|
258
|
-
|
|
255
|
+
from typing import TYPE_CHECKING
|
|
259
256
|
|
|
260
|
-
|
|
261
|
-
|
|
257
|
+
if TYPE_CHECKING:
|
|
258
|
+
from types import MyType
|
|
262
259
|
|
|
263
|
-
|
|
264
|
-
|
|
260
|
+
value: MyType
|
|
261
|
+
`,
|
|
265
262
|
});
|
|
266
263
|
});
|
|
267
264
|
|
|
268
265
|
it("handles class bases as regular import (runtime requirement)", () => {
|
|
269
266
|
const baseClassRef = refkey();
|
|
270
267
|
|
|
271
|
-
|
|
272
|
-
<
|
|
273
|
-
<py.
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
<py.
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
// inside a TYPE_CHECKING block
|
|
282
|
-
assertFileContents(result, {
|
|
268
|
+
expect(
|
|
269
|
+
<TestOutputDirectory>
|
|
270
|
+
<py.SourceFile path="base.py">
|
|
271
|
+
<py.ClassDeclaration name="BaseClass" refkey={baseClassRef} />
|
|
272
|
+
</py.SourceFile>
|
|
273
|
+
<py.SourceFile path="derived.py">
|
|
274
|
+
<py.ClassDeclaration name="DerivedClass" bases={[baseClassRef]} />
|
|
275
|
+
</py.SourceFile>
|
|
276
|
+
</TestOutputDirectory>,
|
|
277
|
+
).toRenderTo({
|
|
283
278
|
"base.py": `
|
|
284
|
-
|
|
285
|
-
|
|
279
|
+
class BaseClass:
|
|
280
|
+
pass
|
|
286
281
|
|
|
287
|
-
|
|
282
|
+
`,
|
|
288
283
|
"derived.py": `
|
|
289
|
-
|
|
284
|
+
from base import BaseClass
|
|
290
285
|
|
|
291
286
|
|
|
292
|
-
|
|
293
|
-
|
|
287
|
+
class DerivedClass(BaseClass):
|
|
288
|
+
pass
|
|
294
289
|
|
|
295
|
-
|
|
290
|
+
`,
|
|
296
291
|
});
|
|
297
292
|
});
|
|
298
293
|
|
|
299
294
|
it("renders regular imports before TYPE_CHECKING block", () => {
|
|
300
|
-
// Create a typing module with multiple exports
|
|
301
295
|
const typingModule = createModule({
|
|
302
296
|
name: "typing",
|
|
303
297
|
descriptor: {
|
|
@@ -305,7 +299,6 @@ describe("TYPE_CHECKING imports", () => {
|
|
|
305
299
|
},
|
|
306
300
|
});
|
|
307
301
|
|
|
308
|
-
// Create a third-party module
|
|
309
302
|
const requestsModule = createModule({
|
|
310
303
|
name: "requests",
|
|
311
304
|
descriptor: {
|
|
@@ -315,11 +308,11 @@ describe("TYPE_CHECKING imports", () => {
|
|
|
315
308
|
|
|
316
309
|
const userClassRef = refkey();
|
|
317
310
|
|
|
318
|
-
|
|
319
|
-
[
|
|
311
|
+
expect(
|
|
312
|
+
<TestOutputDirectory externals={[typingModule, requestsModule]}>
|
|
320
313
|
<py.SourceFile path="models.py">
|
|
321
314
|
<py.ClassDeclaration name="User" refkey={userClassRef} />
|
|
322
|
-
</py.SourceFile
|
|
315
|
+
</py.SourceFile>
|
|
323
316
|
<py.SourceFile path="service.py">
|
|
324
317
|
<py.FunctionDeclaration
|
|
325
318
|
name="get_users"
|
|
@@ -327,37 +320,32 @@ describe("TYPE_CHECKING imports", () => {
|
|
|
327
320
|
returnType="str"
|
|
328
321
|
>
|
|
329
322
|
<py.StatementList>
|
|
330
|
-
{/* Use cast as a value (function call) to make it a regular import */}
|
|
331
323
|
<>response = {requestsModule["."].get}("https://example.com")</>
|
|
332
324
|
<>return {typingModule["."].cast}(str, user)</>
|
|
333
325
|
</py.StatementList>
|
|
334
326
|
</py.FunctionDeclaration>
|
|
335
|
-
</py.SourceFile
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
);
|
|
339
|
-
|
|
340
|
-
// Regular imports first (sorted alphabetically), then TYPE_CHECKING block
|
|
341
|
-
assertFileContents(result, {
|
|
327
|
+
</py.SourceFile>
|
|
328
|
+
</TestOutputDirectory>,
|
|
329
|
+
).toRenderTo({
|
|
342
330
|
"models.py": `
|
|
343
|
-
|
|
344
|
-
|
|
331
|
+
class User:
|
|
332
|
+
pass
|
|
345
333
|
|
|
346
|
-
|
|
334
|
+
`,
|
|
347
335
|
"service.py": `
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
336
|
+
from requests import get
|
|
337
|
+
from typing import cast
|
|
338
|
+
from typing import TYPE_CHECKING
|
|
351
339
|
|
|
352
|
-
|
|
353
|
-
|
|
340
|
+
if TYPE_CHECKING:
|
|
341
|
+
from models import User
|
|
354
342
|
|
|
355
343
|
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
344
|
+
def get_users(user: User) -> str:
|
|
345
|
+
response = get("https://example.com")
|
|
346
|
+
return cast(str, user)
|
|
359
347
|
|
|
360
|
-
|
|
348
|
+
`,
|
|
361
349
|
});
|
|
362
350
|
});
|
|
363
351
|
});
|
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import { code, 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 {
|
|
4
|
+
import { TestOutput } from "./utils.js";
|
|
6
5
|
|
|
7
6
|
describe("TypeReference", () => {
|
|
8
7
|
it("renders a Python TypeReference with a refkey and type arguments", () => {
|
|
9
8
|
const classRefkey = refkey();
|
|
10
9
|
|
|
11
10
|
expect(
|
|
12
|
-
|
|
11
|
+
<TestOutput>
|
|
13
12
|
<py.StatementList>
|
|
14
13
|
<py.ClassDeclaration
|
|
15
14
|
name="Bar"
|
|
@@ -17,15 +16,17 @@ describe("TypeReference", () => {
|
|
|
17
16
|
></py.ClassDeclaration>
|
|
18
17
|
<py.TypeReference refkey={classRefkey} typeArgs={["T", "P"]} />
|
|
19
18
|
<py.TypeReference name="dict" typeArgs={["str", "int"]} />
|
|
20
|
-
</py.StatementList
|
|
21
|
-
|
|
22
|
-
).toRenderTo(
|
|
19
|
+
</py.StatementList>
|
|
20
|
+
</TestOutput>,
|
|
21
|
+
).toRenderTo(
|
|
22
|
+
`
|
|
23
23
|
class Bar:
|
|
24
24
|
pass
|
|
25
25
|
|
|
26
26
|
Bar[T, P]
|
|
27
27
|
dict[str, int]
|
|
28
|
-
|
|
28
|
+
`,
|
|
29
|
+
);
|
|
29
30
|
});
|
|
30
31
|
|
|
31
32
|
it("renders a Python list expression with a reference", () => {
|
|
@@ -33,20 +34,22 @@ describe("TypeReference", () => {
|
|
|
33
34
|
const type = code`list[${classRefkey}]`;
|
|
34
35
|
|
|
35
36
|
expect(
|
|
36
|
-
|
|
37
|
+
<TestOutput>
|
|
37
38
|
<py.StatementList>
|
|
38
39
|
<py.ClassDeclaration
|
|
39
40
|
name="Foo"
|
|
40
41
|
refkey={classRefkey}
|
|
41
42
|
></py.ClassDeclaration>
|
|
42
43
|
<py.TypeReference name={type} />
|
|
43
|
-
</py.StatementList
|
|
44
|
-
|
|
45
|
-
).toRenderTo(
|
|
44
|
+
</py.StatementList>
|
|
45
|
+
</TestOutput>,
|
|
46
|
+
).toRenderTo(
|
|
47
|
+
`
|
|
46
48
|
class Foo:
|
|
47
49
|
pass
|
|
48
50
|
|
|
49
51
|
list[Foo]
|
|
50
|
-
|
|
52
|
+
`,
|
|
53
|
+
);
|
|
51
54
|
});
|
|
52
55
|
});
|