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