diff --git a/dev/playground.py b/dev/playground.py index 5dd873b35..0f44e6353 100644 --- a/dev/playground.py +++ b/dev/playground.py @@ -1,5 +1,10 @@ +# import httpx from gen.python import OpenCode +# def log_request(request): +# print(request.method, request.url, request.headers, request.content) + +# client = httpx.Client(event_hooks={"request": [log_request]}) def run(): client = OpenCode() diff --git a/packages/codegen-core/src/planner/planner.ts b/packages/codegen-core/src/planner/planner.ts index 183360abf..452ad9508 100644 --- a/packages/codegen-core/src/planner/planner.ts +++ b/packages/codegen-core/src/planner/planner.ts @@ -419,6 +419,7 @@ export class Planner { while (true) { const kinds = [...(localNames.get(finalName) ?? [])]; + // TODO: adjust canShareName for language const ok = kinds.every((kind) => canShareName(symbol.kind, kind)); if (ok) break; diff --git a/packages/openapi-python/src/createClient.ts b/packages/openapi-python/src/createClient.ts index d9ef621fe..0ac745a4f 100644 --- a/packages/openapi-python/src/createClient.ts +++ b/packages/openapi-python/src/createClient.ts @@ -121,7 +121,7 @@ export async function createClient({ }, nameConflictResolvers: config.output.nameConflictResolver ? { - typescript: config.output.nameConflictResolver, + python: config.output.nameConflictResolver, } : undefined, renderers: [ diff --git a/packages/openapi-python/src/plugins/@hey-api/sdk/shared/operation.ts b/packages/openapi-python/src/plugins/@hey-api/sdk/shared/operation.ts index 710b39bca..bd8c5f004 100644 --- a/packages/openapi-python/src/plugins/@hey-api/sdk/shared/operation.ts +++ b/packages/openapi-python/src/plugins/@hey-api/sdk/shared/operation.ts @@ -37,7 +37,9 @@ function schemaToPythonType( if (schema.type === 'array') { const itemsSchema = schema.items?.[0]; - const itemType = itemsSchema ? schemaToPythonType(itemsSchema, plugin) : 'Any'; + const itemType = itemsSchema + ? schemaToPythonType(itemsSchema, plugin) + : plugin.external('typing.Any'); return $('list').slice(itemType); } diff --git a/packages/openapi-python/src/plugins/@hey-api/sdk/v1/node.ts b/packages/openapi-python/src/plugins/@hey-api/sdk/v1/node.ts index 8205d5af8..4fea0385a 100644 --- a/packages/openapi-python/src/plugins/@hey-api/sdk/v1/node.ts +++ b/packages/openapi-python/src/plugins/@hey-api/sdk/v1/node.ts @@ -133,18 +133,16 @@ function implementFn>(args: { fieldsList.element(fieldDict); } - const kwargs: Array> = []; - for (const name of paramNames) { - kwargs.push($.kwarg(name, name)); - } - return ( node .params(...opParameters.parameters) // TODO: extract operation statements into a separate function .do( $.var('params').assign( - $(plugin.external('client.build_client_params')).call(fieldsList, ...kwargs), + $(plugin.external('client.build_client_params')).call( + fieldsList, + ...paramNames.map((name) => $.kwarg(name, name)), + ), ), ) .do( diff --git a/packages/openapi-python/src/py-dsl/decl/class.ts b/packages/openapi-python/src/py-dsl/decl/class.ts index 80c8b6f94..381840fc6 100644 --- a/packages/openapi-python/src/py-dsl/decl/class.ts +++ b/packages/openapi-python/src/py-dsl/decl/class.ts @@ -1,5 +1,5 @@ -import type { AnalysisContext, NodeName } from '@hey-api/codegen-core'; -import { isSymbol } from '@hey-api/codegen-core'; +import type { AnalysisContext, NodeName, Ref } from '@hey-api/codegen-core'; +import { isSymbol, ref } from '@hey-api/codegen-core'; import { py } from '../../ts-python'; import { type MaybePyDsl, PyDsl } from '../base'; @@ -18,7 +18,7 @@ export class ClassPyDsl extends Mixed { readonly '~dsl' = 'ClassPyDsl'; override readonly nameSanitizer = safeRuntimeName; - protected baseClasses: Array = []; + protected baseClasses: Array> = []; protected body: Body = []; constructor(name: NodeName) { @@ -63,7 +63,7 @@ export class ClassPyDsl extends Mixed { /** Records base classes to extend from. */ extends(...baseClass: ReadonlyArray): this { - this.baseClasses.push(...baseClass); + this.baseClasses.push(...baseClass.map((item) => ref(item))); return this; } diff --git a/packages/openapi-python/src/py-dsl/decl/param.ts b/packages/openapi-python/src/py-dsl/decl/param.ts index 6cd61f200..f91ce9f42 100644 --- a/packages/openapi-python/src/py-dsl/decl/param.ts +++ b/packages/openapi-python/src/py-dsl/decl/param.ts @@ -1,4 +1,5 @@ -import type { AnalysisContext, NodeName } from '@hey-api/codegen-core'; +import type { AnalysisContext, NodeName, Ref } from '@hey-api/codegen-core'; +import { ref } from '@hey-api/codegen-core'; import { py } from '../../ts-python'; import { PyDsl } from '../base'; @@ -13,8 +14,8 @@ export type ParamCtor = (name: ParamName, fn?: ParamFn) => ParamPyDsl; export class ParamPyDsl extends PyDsl { readonly '~dsl' = 'ParamPyDsl'; - protected _defaultValue?: ParamDefaultValue; - protected _type?: ParamType; + protected _defaultValue?: Ref; + protected _type?: Ref; constructor(name: ParamName, fn?: ParamFn) { super(); @@ -35,7 +36,7 @@ export class ParamPyDsl extends PyDsl { /** Sets the parameter default value. */ default(value: ParamDefaultValue): this { - this._defaultValue = value; + this._defaultValue = ref(value); return this; } @@ -45,7 +46,7 @@ export class ParamPyDsl extends PyDsl { /** Sets the parameter type. */ type(type: ParamType): this { - this._type = type; + this._type = ref(type); return this; } diff --git a/packages/openapi-python/src/py-dsl/expr/binary.ts b/packages/openapi-python/src/py-dsl/expr/binary.ts index 0f4be8fae..a4a6e5b6a 100644 --- a/packages/openapi-python/src/py-dsl/expr/binary.ts +++ b/packages/openapi-python/src/py-dsl/expr/binary.ts @@ -1,4 +1,5 @@ -import type { AnalysisContext } from '@hey-api/codegen-core'; +import type { AnalysisContext, Ref } from '@hey-api/codegen-core'; +import { ref } from '@hey-api/codegen-core'; import { py } from '../../ts-python'; import type { MaybePyDsl } from '../base'; @@ -30,9 +31,9 @@ const Mixed = PyDsl; export class BinaryPyDsl extends Mixed { readonly '~dsl' = 'BinaryPyDsl'; - protected _left?: MaybePyDsl; + protected _left?: Ref>; protected _op?: PyBinaryOperator; - protected _right?: MaybePyDsl; + protected _right?: Ref>; constructor( left: MaybePyDsl, @@ -40,9 +41,9 @@ export class BinaryPyDsl extends Mixed { right: MaybePyDsl, ) { super(); - this._left = left; + this._left = ref(left); this._op = op; - this._right = right; + this._right = ref(right); } override analyze(ctx: AnalysisContext): void { @@ -161,7 +162,7 @@ export class BinaryPyDsl extends Mixed { } private opAndExpr(op: PyBinaryOperator, right: MaybePyDsl): this { - this._right = right; + this._right = ref(right); this._op = op; return this; } diff --git a/packages/openapi-python/src/py-dsl/expr/subscript.ts b/packages/openapi-python/src/py-dsl/expr/subscript.ts index 0ae500e1f..4f2cc5234 100644 --- a/packages/openapi-python/src/py-dsl/expr/subscript.ts +++ b/packages/openapi-python/src/py-dsl/expr/subscript.ts @@ -1,4 +1,5 @@ -import type { AnalysisContext, NodeName } from '@hey-api/codegen-core'; +import type { AnalysisContext, NodeName, Ref } from '@hey-api/codegen-core'; +import { ref } from '@hey-api/codegen-core'; import { py } from '../../ts-python'; import { PyDsl } from '../base'; @@ -16,13 +17,13 @@ const Mixed = LayoutMixin(PyDsl); export class SubscriptPyDsl extends Mixed { readonly '~dsl' = 'SubscriptPyDsl'; - protected _slices: Array; - protected _value: SubscriptExpr; + protected _slices: Array>; + protected _value: Ref; constructor(value: SubscriptExpr, ...slices: Array) { super(); - this._slices = slices; - this._value = value; + this._slices = slices.map((slice) => ref(slice)); + this._value = ref(value); } override analyze(ctx: AnalysisContext): void { diff --git a/packages/openapi-python/src/py-dsl/expr/tuple.ts b/packages/openapi-python/src/py-dsl/expr/tuple.ts index e4ee062a3..2db15b145 100644 --- a/packages/openapi-python/src/py-dsl/expr/tuple.ts +++ b/packages/openapi-python/src/py-dsl/expr/tuple.ts @@ -1,4 +1,5 @@ -import type { AnalysisContext, NodeName } from '@hey-api/codegen-core'; +import type { AnalysisContext, NodeName, Ref } from '@hey-api/codegen-core'; +import { ref } from '@hey-api/codegen-core'; import { py } from '../../ts-python'; import type { MaybePyDsl } from '../base'; @@ -12,11 +13,11 @@ const Mixed = LayoutMixin(PyDsl); export class TuplePyDsl extends Mixed { readonly '~dsl' = 'TuplePyDsl'; - protected _elements: Array = []; + protected _elements: Array> = []; constructor(...elements: Array) { super(); - this._elements = elements; + this._elements = elements.map((element) => ref(element)); } override analyze(ctx: AnalysisContext): void { @@ -27,12 +28,12 @@ export class TuplePyDsl extends Mixed { } element(expr: TupleElement): this { - this._elements.push(expr); + this._elements.push(ref(expr)); return this; } elements(...exprs: ReadonlyArray): this { - this._elements.push(...exprs); + this._elements.push(...exprs.map((expr) => ref(expr))); return this; } diff --git a/packages/openapi-python/src/py-dsl/mixins/decorator.ts b/packages/openapi-python/src/py-dsl/mixins/decorator.ts index 7ae08b0f8..fd2b7a600 100644 --- a/packages/openapi-python/src/py-dsl/mixins/decorator.ts +++ b/packages/openapi-python/src/py-dsl/mixins/decorator.ts @@ -1,22 +1,24 @@ -import type { AnalysisContext, NodeName } from '@hey-api/codegen-core'; +import type { AnalysisContext, NodeName, Ref } from '@hey-api/codegen-core'; +import { ref } from '@hey-api/codegen-core'; import { py } from '../../ts-python'; import type { MaybePyDsl } from '../base'; import type { BaseCtor, MixinCtor } from './types'; -type DecoratorInput = { - args: ReadonlyArray>; - name: NodeName | MaybePyDsl; -}; +type DecoratorArg = MaybePyDsl; +type DecoratorName = NodeName | MaybePyDsl; export interface DecoratorMethods extends Node { $decorators(): ReadonlyArray; - decorator(name: DecoratorInput['name'], ...args: DecoratorInput['args']): this; + decorator(name: DecoratorName, ...args: ReadonlyArray): this; } export function DecoratorMixin>(Base: TBase) { abstract class Decorator extends Base { - protected _decorators: Array = []; + protected _decorators: Array<{ + args: ReadonlyArray>; + name: Ref; + }> = []; override analyze(ctx: AnalysisContext): void { super.analyze(ctx); @@ -28,15 +30,21 @@ export function DecoratorMixin>(Bas } } - protected decorator(name: DecoratorInput['name'], ...args: DecoratorInput['args']): this { - this._decorators.push({ args, name }); + protected decorator(name: DecoratorName, ...args: ReadonlyArray): this { + this._decorators.push({ + args: args.map((arg) => ref(arg)), + name: ref(name), + }); return this; } protected $decorators(): ReadonlyArray { return this._decorators.map((decorator) => decorator.args.length > 0 - ? py.factory.createCallExpression(this.$node(decorator.name), this.$node(decorator.args)) + ? py.factory.createCallExpression( + this.$node(decorator.name), + decorator.args.map((arg) => this.$node(arg)), + ) : this.$node(decorator.name), ); } diff --git a/packages/openapi-python/src/py-dsl/mixins/returns.ts b/packages/openapi-python/src/py-dsl/mixins/returns.ts index 896e16ae8..419e88f3a 100644 --- a/packages/openapi-python/src/py-dsl/mixins/returns.ts +++ b/packages/openapi-python/src/py-dsl/mixins/returns.ts @@ -1,4 +1,5 @@ -import type { AnalysisContext, Node, NodeName } from '@hey-api/codegen-core'; +import type { AnalysisContext, Node, NodeName, Ref } from '@hey-api/codegen-core'; +import { ref } from '@hey-api/codegen-core'; import type { py } from '../../ts-python'; import type { BaseCtor, MixinCtor } from './types'; @@ -10,7 +11,7 @@ export interface ReturnsMethods extends Node { export function ReturnsMixin>(Base: TBase) { abstract class Returns extends Base { - protected _returns?: NodeName | py.Expression; + protected _returns?: Ref; override analyze(ctx: AnalysisContext): void { super.analyze(ctx); @@ -18,7 +19,7 @@ export function ReturnsMixin>(Base: } returns(type: NodeName | py.Expression): this { - this._returns = type; + this._returns = ref(type); return this; } diff --git a/packages/openapi-python/src/py-dsl/mixins/value.ts b/packages/openapi-python/src/py-dsl/mixins/value.ts index e7fcf5e36..605471482 100644 --- a/packages/openapi-python/src/py-dsl/mixins/value.ts +++ b/packages/openapi-python/src/py-dsl/mixins/value.ts @@ -1,4 +1,5 @@ -import type { AnalysisContext, Node, NodeName } from '@hey-api/codegen-core'; +import type { AnalysisContext, Node, NodeName, Ref } from '@hey-api/codegen-core'; +import { ref } from '@hey-api/codegen-core'; import type { py } from '../../ts-python'; import type { PyDsl } from '../base'; @@ -14,7 +15,7 @@ export interface ValueMethods extends Node { export function ValueMixin>(Base: TBase) { abstract class Value extends Base { - protected value?: ValueExpr; + protected value?: Ref; override analyze(ctx: AnalysisContext): void { super.analyze(ctx); @@ -22,7 +23,7 @@ export function ValueMixin>(Base: T } protected assign(expr: ValueExpr): this { - this.value = expr; + this.value = ref(expr); return this; } diff --git a/packages/openapi-python/src/py-dsl/stmt/try.ts b/packages/openapi-python/src/py-dsl/stmt/try.ts index 27482964a..1f9b771ee 100644 --- a/packages/openapi-python/src/py-dsl/stmt/try.ts +++ b/packages/openapi-python/src/py-dsl/stmt/try.ts @@ -1,4 +1,5 @@ -import type { AnalysisContext, NodeName } from '@hey-api/codegen-core'; +import type { AnalysisContext, NodeName, Ref } from '@hey-api/codegen-core'; +import { ref } from '@hey-api/codegen-core'; import type { MaybeArray } from '@hey-api/types'; import { py } from '../../ts-python'; @@ -13,7 +14,7 @@ type ExceptType = string | MaybePyDsl; interface ExceptEntry { body: Array; - name?: NodeName; + name?: Ref; types: Array; } @@ -107,14 +108,14 @@ export class TryPyDsl extends Mixed { const typeArr = Array.isArray(types) ? types : [types]; const key = exceptKey(typeArr); - let name: NodeName | undefined; + let name: Ref | undefined; let bodyItems: Array; // Disambiguate: if the second arg is a plain string that looks like // an identifier (no dots, no spaces, not a DSL node) treat it as // the `as` name. Otherwise it's the first body expression. if (nameOrBody !== undefined && this._isNodeName(nameOrBody)) { - name = nameOrBody as NodeName; + name = ref(nameOrBody as NodeName); bodyItems = body; } else if (nameOrBody !== undefined) { bodyItems = [nameOrBody as DoExpr, ...body]; @@ -176,9 +177,7 @@ export class TryPyDsl extends Mixed { } const exceptionName = entry.name - ? py.factory.createIdentifier( - this.$name({ current: entry.name } as any) || String(entry.name), - ) + ? py.factory.createIdentifier(this.$name(entry.name) || String(entry.name['~ref'])) : undefined; return py.factory.createExceptClause([...bodyStatements], exceptionType, exceptionName); diff --git a/packages/openapi-python/src/py-dsl/stmt/var.ts b/packages/openapi-python/src/py-dsl/stmt/var.ts index cde6c06e4..49cd7ca07 100644 --- a/packages/openapi-python/src/py-dsl/stmt/var.ts +++ b/packages/openapi-python/src/py-dsl/stmt/var.ts @@ -1,5 +1,5 @@ -import type { AnalysisContext, NodeName } from '@hey-api/codegen-core'; -import { isSymbol } from '@hey-api/codegen-core'; +import type { AnalysisContext, NodeName, Ref } from '@hey-api/codegen-core'; +import { isSymbol, ref } from '@hey-api/codegen-core'; import { py } from '../../ts-python'; import { PyDsl } from '../base'; @@ -14,7 +14,7 @@ export class VarPyDsl extends Mixed { readonly '~dsl' = 'VarPyDsl'; override readonly nameSanitizer = safeRuntimeName; - protected _type?: VarType; + protected _type?: Ref; constructor(name?: NodeName) { super(); @@ -37,7 +37,7 @@ export class VarPyDsl extends Mixed { /** Sets the type annotation for the variable. */ type(type: VarType): this { - this._type = type; + this._type = ref(type); return this; }