示例#1
0
def walk(
    w: MetashapeWalker,
    *,
    metadata_handler: metadata_.MetadataHandlerFunction,
    _nonetype: t.Type[t.Any] = type(None),
    kinds: t.Optional[t.List[t.Optional[NodeKind]]] = None,
) -> t.Iterator[Item]:
    kinds = kinds or ["object", None, "enum"]
    for cls in w.walk(kinds=kinds):
        origin = getattr(cls, "__origin__", None)
        if origin is not None:
            args = list(typing_get_args(cls))
            if origin == t.Union and _nonetype not in args:  # union
                yield Item(name=guess_name(cls),
                           type_=cls,
                           fields=[],
                           args=args,
                           origin=origin)  # fixme
                for subtype in _get_flatten_args(cls):
                    w.append(subtype)
                continue
            elif origin == tx.Literal:  # literal
                yield Item(
                    name=resolve_name(cls),
                    type_=cls,
                    fields=[],
                    args=args,
                    origin=origin,
                )  # fixme name
                continue
            else:
                raise RuntimeError("unexpected type {cls!r}")

        fields: t.List[Row] = []
        for name, info, _metadata in w.for_type(cls).walk(
                ignore_private=False):
            if name.startswith("_") and name.endswith("_"):
                continue

            filled_metadata: metadata_.Metadata = metadata_.metadata()
            filled_metadata.update(_metadata)  # type:ignore

            if filled_metadata.get("default") == MISSING:
                filled_metadata.pop("default")
            if info.is_optional:
                filled_metadata["required"] = False

            # handling tags
            metadata_handler(cls,
                             name=name,
                             info=info,
                             metadata=filled_metadata)
            fields.append((name, info, filled_metadata))

            # append to walker, if needed
            for subtype in _get_flatten_args(info.type_):
                w.append(subtype)

        yield Item(name=resolve_name(cls), type_=cls, fields=fields, args=[])
示例#2
0
def scan(walker: Walker, ) -> Context:
    ctx = Context(walker)
    builder = Builder(ctx, walker=walker)

    try:
        for cls in walker.walk():
            schema = builder.build_schema_data(cls)
            ctx.register_schema(cls, schema)
    finally:
        ctx.config.callbacks.teardown()  # xxx:
    return ctx
示例#3
0
def scan(walker: Walker, *, definitions: t.Optional[str] = None) -> Context:
    ctx = Context(walker)
    scanner = Scanner(ctx)

    try:
        for i, cls in enumerate(walker.walk()):
            scanner.scan(cls)
            if i == 0 and definitions is None:
                scanner.ctx.result.result[
                    "$ref"
                ] = f"#/definitions/{walker.resolver.resolve_typename(cls)}"

    finally:
        ctx.config.callbacks.teardown()  # xxx:
    return ctx
示例#4
0
def emit(walker: Walker, *, output: t.Optional[t.IO[str]] = None) -> None:
    output = output or walker.config.option.output
    for m in walker.walk(ignore_private=walker.config.option.ignore_private):
        print(guess_mark(m), m, file=output)