edgedb-python icon indicating copy to clipboard operation
edgedb-python copied to clipboard

Codegen with the describe() API

Open fantix opened this issue 3 years ago • 0 comments

Please review individual commits.

  • [x] The array, set, namedtuple and tuple should support __deepcopy__() so that dataclass.asdict() could properly handle the object with such fields.
  • [ ] Add tests

edgedb/edgedb#4325 is preferred to generate more friendly code.

Generated sample:

from __future__ import annotations
import dataclasses
import edgedb
import enum
import typing
import uuid


MyString = str


class NoPydanticValidation:
    @classmethod
    def __get_validators__(cls):
        from pydantic import dataclasses as dc
        dc.dataclass(cls)
        cls.__pydantic_model__.__get_validators__ = lambda: []
        return []


class Color(enum.Enum):
    RED = "Red"
    GREEN = "Green"
    BLUE = "Blue"


@dataclasses.dataclass
class Role(NoPydanticValidation):
    id: uuid.UUID
    name: str


@dataclasses.dataclass
class Test1Result(NoPydanticValidation):
    id: uuid.UUID
    mystr: MyString
    literal: int
    enumval: Color
    userstr: str
    user: typing.Sequence[User]
    num: Test1ResultNum
    named: Test1ResultNamed
    arr: typing.Sequence[int]
    tup: typing.Tuple[int, int, int]


class Test1ResultNamed(typing.NamedTuple):
    a: int
    b: float


@dataclasses.dataclass
class Test1ResultNum(NoPydanticValidation):
    id: uuid.UUID
    n: int


@dataclasses.dataclass
class User(NoPydanticValidation):
    id: uuid.UUID
    mobile: str
    role: Role


async def test1(
    client: edgedb.AsyncIOClient,
    arg0: str,
) -> Test1Result:
    return await client.query_single(
        """\
        select {
            mystr := <MyString>'abc',
            literal := 42,
            enumval := <Color>'Red',
            userstr := <str>$0,
            user := (select User { mobile, role: { name } }),
            num := (select {{n := 1},{},{}} limit 2),
            named := (a := 1, b := 2.2),
            arr := [1,2,3],
            tup := (1,2,3),
        }\
        """,
        arg0,
    )

fantix avatar Sep 05 '22 18:09 fantix