def set_attributes(self): """ Examples: >>> from mkapi.core.base import Base >>> s = Signature(Base) >>> s.parameters['name'].to_tuple() ('name', 'str, optional', 'Name of self.') >>> s.attributes['html'].to_tuple() ('html', 'str', 'HTML output after conversion.') """ items = [] for name, (type, description) in get_attributes(self.obj).items(): if isinstance(type, str) and type: type = resolve_forward_ref(self.obj, type) else: type = to_string(type, obj=self.obj) if type else "" if not type: type, description = preprocess.split_type(description) item = Item(name, Type(type), Inline(description)) if is_dataclass(self.obj): if name in self.parameters: self.parameters[name].set_description(item.description) if self.obj.__dataclass_fields__[name].type != InitVar: items.append(item) else: items.append(item) self.attributes = Section("Attributes", items=items)
def parse_parameter(lines: List[str], style: str) -> Item: """Returns a Item instance that represents a parameter. Args: lines: Splitted parameter docstring lines. style: Docstring style. `google` or `numpy`. """ if style == "google": name, _, line = lines[0].partition(":") name = name.strip() parsed = [line.strip()] pattern = r"(.*?)\s*?\((.*?)\)" else: name = lines[0].strip() parsed = [] pattern = r"([^ ]*?)\s*:\s*(.*)" if len(lines) > 1: indent = get_indent(lines[1]) for line in lines[1:]: parsed.append(line[indent:]) m = re.match(pattern, name) if m: name, type = m.group(1), m.group(2) else: type = "" return Item(name, Type(type), Inline("\n".join(parsed)))
def inherit_parameters(node: Node): """Attributes section inherits items' markdown from Parameters section. Args: node: Node instance. Note: This function does not create any items. Call [inherit_signature]()() first. Examples: >>> from mkapi.core.object import get_object >>> base = Node(get_object('mkapi.core.base.Base')) >>> node = Node(get_object('mkapi.core.base.Type')) >>> [item.name for item in base.docstring['Parameters'].items] ['name', 'markdown'] >>> inherit_signature(base) >>> section = base.docstring['Attributes'] >>> [item.name for item in section.items] ['name', 'markdown', 'html'] >>> section['name'].desc.html '' >>> inherit_parameters(base) >>> section['name'].desc.markdown != '' True """ param_section = node.docstring["Parameters"] attr_section = node.docstring["Attributes"] if param_section is None or attr_section is None: return for item in attr_section.items: if not item.desc.markdown and item.name in param_section: desc = param_section[item.name].desc # type:ignore item.desc = Inline(desc.name)
def transform_members(node: Node, mode: str, filters: Optional[List[str]] = None): def is_member(kind): if mode in ["method", "function"]: return mode in kind or kind == "generator" else: return mode in kind and "method" not in kind members = [ member for member in node.members if is_member(member.object.kind) ] if not members: return name = mode[0].upper() + mode[1:] + ("es" if mode == "class" else "s") section = Section(name) for member in members: object = member.object kind = object.kind type = get_type(member) if member.docstring and "" in member.docstring: description = member.docstring[""].markdown if "\n\n" in description: description = description.split("\n\n")[0] else: description = "" item = Item(object.name, type, Inline(description), kind) item.markdown, url = "", "" if filters and ("link" in filters or "all" in filters): url = "#" + object.id elif filters and "apilink" in filters: url = "../" + node.object.id + "#" + object.id signature: Dict[str, Any] = {} if object.kind not in ["class", "dataclass"]: args = [item.name for item in object.signature.parameters.items] signature["arguments"] = args else: signature["arguments"] = None item.html = renderer.render_object_member(object.name, url, signature) if filters and "sourcelink" in filters: source_link_from_section_item(item, object) section.items.append(item) node.docstring.set_section(section)
def transform_property(node: Node, filters: List[str] = None): section = None members = [] for member in node.members: object = member.object if "property" in object.kind: if section is None: section = node.docstring["Attributes"] name = object.name kind = object.kind type = object.type description = member.docstring.sections[0].markdown item = Item(name, type, Inline(description), kind=kind) if filters and "sourcelink" in filters: source_link_from_section_item(item, object) section.items.append(item) else: members.append(member) node.members = members