diff --git a/generators/pythonv2/codegen/.depcheckrc.json b/generators/pythonv2/codegen/.depcheckrc.json new file mode 100644 index 00000000000..f76bb9d7995 --- /dev/null +++ b/generators/pythonv2/codegen/.depcheckrc.json @@ -0,0 +1,11 @@ +{ + "ignores": [ + "@types/jest", + "globals", + "@types/node", + "@fern-fern/ir-sdk" + ], + "ignore-patterns": [ + "lib" + ] +} \ No newline at end of file diff --git a/generators/pythonv2/codegen/.prettierrc.cjs b/generators/pythonv2/codegen/.prettierrc.cjs new file mode 100644 index 00000000000..39cf0d0b8c9 --- /dev/null +++ b/generators/pythonv2/codegen/.prettierrc.cjs @@ -0,0 +1 @@ +module.exports = require("../../../.prettierrc.json"); diff --git a/generators/pythonv2/codegen/package.json b/generators/pythonv2/codegen/package.json new file mode 100644 index 00000000000..48c99df98fe --- /dev/null +++ b/generators/pythonv2/codegen/package.json @@ -0,0 +1,43 @@ +{ + "name": "@fern-api/pythonv2-codegen", + "version": "0.0.0", + "repository": { + "type": "git", + "url": "https://github.com/fern-api/fern.git", + "directory": "generators/pythonv2/codegen" + }, + "files": [ + "lib" + ], + "type": "module", + "source": "src/index.ts", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "sideEffects": false, + "scripts": { + "clean": "rm -rf ./lib && tsc --build --clean", + "compile": "tsc --build", + "test": "vitest --run", + "test:update": "vitest --run -u", + "lint:eslint": "eslint --max-warnings 0 . --ignore-path=../../../.eslintignore", + "lint:eslint:fix": "yarn lint:eslint --fix", + "format": "prettier --write --ignore-unknown --ignore-path ../../../shared/.prettierignore \"**\"", + "format:check": "prettier --check --ignore-unknown --ignore-path ../../../shared/.prettierignore \"**\"", + "organize-imports": "organize-imports-cli tsconfig.json", + "depcheck": "depcheck" + }, + "dependencies": { + "@fern-api/generator-commons": "workspace:*", + "@fern-fern/ir-sdk": "^53.7.0" + }, + "devDependencies": { + "@types/jest": "^29.5.12", + "@types/node": "^18.7.18", + "depcheck": "^1.4.6", + "eslint": "^8.56.0", + "organize-imports-cli": "^0.10.0", + "prettier": "^2.7.1", + "typescript": "4.6.4", + "vitest": "^2.0.5" + } +} \ No newline at end of file diff --git a/generators/pythonv2/codegen/src/ast/Class.ts b/generators/pythonv2/codegen/src/ast/Class.ts new file mode 100644 index 00000000000..d6b631949ab --- /dev/null +++ b/generators/pythonv2/codegen/src/ast/Class.ts @@ -0,0 +1,22 @@ +import { AstNode } from "./core/AstNode"; +import { Writer } from "./core/Writer"; + +export declare namespace Class { + interface Args { + /* The name of the Python class */ + name: string; + } +} + +export class Class extends AstNode { + public readonly name: string; + + constructor({ name }: Class.Args) { + super(); + this.name = name; + } + + public write(writer: Writer): void { + writer.write(`class ${this.name}:`); + } +} diff --git a/generators/pythonv2/codegen/src/ast/__test__/Class.test.ts b/generators/pythonv2/codegen/src/ast/__test__/Class.test.ts new file mode 100644 index 00000000000..0799e929f00 --- /dev/null +++ b/generators/pythonv2/codegen/src/ast/__test__/Class.test.ts @@ -0,0 +1,10 @@ +import { python } from "../.."; + +describe("class", () => { + it("basic", async () => { + const clazz = python.class_({ + name: "Car" + }); + expect(clazz.toString()).toMatchSnapshot(); + }); +}); diff --git a/generators/pythonv2/codegen/src/ast/__test__/__snapshots__/Class.test.ts.snap b/generators/pythonv2/codegen/src/ast/__test__/__snapshots__/Class.test.ts.snap new file mode 100644 index 00000000000..cc97bcf9fd9 --- /dev/null +++ b/generators/pythonv2/codegen/src/ast/__test__/__snapshots__/Class.test.ts.snap @@ -0,0 +1,3 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`class > basic 1`] = `"class Car:"`; diff --git a/generators/pythonv2/codegen/src/ast/core/AstNode.ts b/generators/pythonv2/codegen/src/ast/core/AstNode.ts new file mode 100644 index 00000000000..a52d667b510 --- /dev/null +++ b/generators/pythonv2/codegen/src/ast/core/AstNode.ts @@ -0,0 +1,13 @@ +import { AbstractAstNode } from "@fern-api/generator-commons"; +import { Writer } from "./Writer"; + +export abstract class AstNode extends AbstractAstNode { + /** + * Writes the node to a string. + */ + public toString(): string { + const writer = new Writer(); + this.write(writer); + return writer.toString(); + } +} diff --git a/generators/pythonv2/codegen/src/ast/core/Writer.ts b/generators/pythonv2/codegen/src/ast/core/Writer.ts new file mode 100644 index 00000000000..75288711f27 --- /dev/null +++ b/generators/pythonv2/codegen/src/ast/core/Writer.ts @@ -0,0 +1,9 @@ +import { AbstractWriter } from "@fern-api/generator-commons"; + +export declare namespace Writer {} + +export class Writer extends AbstractWriter { + public toString(): string { + return this.buffer; + } +} diff --git a/generators/pythonv2/codegen/src/ast/index.ts b/generators/pythonv2/codegen/src/ast/index.ts new file mode 100644 index 00000000000..34832c715b1 --- /dev/null +++ b/generators/pythonv2/codegen/src/ast/index.ts @@ -0,0 +1 @@ +export { Class } from "./Class"; diff --git a/generators/pythonv2/codegen/src/index.ts b/generators/pythonv2/codegen/src/index.ts new file mode 100644 index 00000000000..ac082a49b68 --- /dev/null +++ b/generators/pythonv2/codegen/src/index.ts @@ -0,0 +1 @@ +export * as python from "./python"; diff --git a/generators/pythonv2/codegen/src/python.ts b/generators/pythonv2/codegen/src/python.ts new file mode 100644 index 00000000000..07fd9459a79 --- /dev/null +++ b/generators/pythonv2/codegen/src/python.ts @@ -0,0 +1,8 @@ +import { Class } from "./ast"; + +export function class_(args: Class.Args): Class { + return new Class(args); +} + +export { Class } from "./ast"; +export { AstNode } from "./ast/core/AstNode"; diff --git a/generators/pythonv2/codegen/tsconfig.json b/generators/pythonv2/codegen/tsconfig.json new file mode 100644 index 00000000000..816c55164d8 --- /dev/null +++ b/generators/pythonv2/codegen/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../../shared/tsconfig.shared.json", + "compilerOptions": { "composite": true, "outDir": "lib", "rootDir": "src" }, + "include": ["./src/**/*"], + "references": [ + { "path": "../../../packages/commons/core-utils" }, + { "path": "../../../packages/commons/fs-utils" }, + { "path": "../../../packages/commons/logging-execa" }, + { "path": "../../commons" } + ] +} diff --git a/generators/pythonv2/codegen/vitest.config.ts b/generators/pythonv2/codegen/vitest.config.ts new file mode 100644 index 00000000000..fecc099c58a --- /dev/null +++ b/generators/pythonv2/codegen/vitest.config.ts @@ -0,0 +1 @@ +export { default } from "../../../shared/vitest.config"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cb001623634..0992aa266ee 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -681,6 +681,40 @@ importers: specifier: ^3.22.3 version: 3.22.4 + generators/pythonv2/codegen: + dependencies: + '@fern-api/generator-commons': + specifier: workspace:* + version: link:../../commons + '@fern-fern/ir-sdk': + specifier: ^53.7.0 + version: 53.9.0 + devDependencies: + '@types/jest': + specifier: ^29.5.12 + version: 29.5.12 + '@types/node': + specifier: ^18.7.18 + version: 18.7.18 + depcheck: + specifier: ^1.4.6 + version: 1.4.6 + eslint: + specifier: ^8.56.0 + version: 8.56.0 + organize-imports-cli: + specifier: ^0.10.0 + version: 0.10.0 + prettier: + specifier: ^2.7.1 + version: 2.7.1 + typescript: + specifier: 4.6.4 + version: 4.6.4 + vitest: + specifier: ^2.0.5 + version: 2.0.5(@types/node@18.7.18)(jsdom@20.0.3)(sass@1.72.0)(terser@5.31.5) + generators/ruby/cli: dependencies: '@fern-api/fs-utils':