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=[])
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
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
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)