def fake_bpy_type(class_value, class_name, descr_str, use_subclasses=True): filepath = os.path.join(BASEPATH, "bpy.types.%s.rst" % class_name) file = open(filepath, "w") fw = file.write write_title(fw, class_name, "=") fw(".. module:: bpy.types\n") fw("\n") if use_subclasses: subclass_ids = [ s.identifier for s in structs.values() if s.base is None if not rna_info.rna_id_ignore(s.identifier) ] if subclass_ids: fw("subclasses --- \n" + ", ".join( (":class:`%s`" % s) for s in sorted(subclass_ids)) + "\n\n") fw(".. class:: %s\n\n" % class_name) fw(" %s\n\n" % descr_str) fw(" .. note::\n\n") fw(" Note that bpy.types.%s is not actually available from within blender, it only exists for the purpose of documentation.\n\n" % class_name) descr_items = [ (key, descr) for key, descr in sorted(class_value.__dict__.items()) if not key.startswith("__") ] for key, descr in descr_items: if type( descr ) == MethodDescriptorType: # GetSetDescriptorType, GetSetDescriptorType's are not documented yet py_descr2sphinx(" ", fw, descr, "bpy.types", class_name, key) for key, descr in descr_items: if type(descr) == GetSetDescriptorType: py_descr2sphinx(" ", fw, descr, "bpy.types", class_name, key) file.close()
def fake_bpy_type(class_value, class_name, descr_str, use_subclasses=True): filepath = os.path.join(BASEPATH, "bpy.types.%s.rst" % class_name) file = open(filepath, "w", encoding="utf-8") fw = file.write write_title(fw, class_name, "=") fw(".. module:: bpy.types\n") fw("\n") if use_subclasses: subclass_ids = [ s.identifier for s in structs.values() if s.base is None if not rna_info.rna_id_ignore(s.identifier) ] if subclass_ids: fw("subclasses --- \n" + ", ".join((":class:`%s`" % s) for s in sorted(subclass_ids)) + "\n\n") fw(".. class:: %s\n\n" % class_name) fw(" %s\n\n" % descr_str) fw(" .. note::\n\n") fw( " Note that bpy.types.%s is not actually available from within blender, it only exists for the purpose of documentation.\n\n" % class_name ) descr_items = [ (key, descr) for key, descr in sorted(class_value.__dict__.items()) if not key.startswith("__") ] for key, descr in descr_items: if ( type(descr) == MethodDescriptorType ): # GetSetDescriptorType, GetSetDescriptorType's are not documented yet py_descr2sphinx(" ", fw, descr, "bpy.types", class_name, key) for key, descr in descr_items: if type(descr) == GetSetDescriptorType: py_descr2sphinx(" ", fw, descr, "bpy.types", class_name, key) file.close()
def write_struct(struct): #if not struct.identifier.startswith("Sc") and not struct.identifier.startswith("I"): # return #if not struct.identifier == "Object": # return filepath = os.path.join(BASEPATH, "bpy.types.%s.rst" % struct.identifier) file = open(filepath, "w") fw = file.write base_id = getattr(struct.base, "identifier", "") if _BPY_STRUCT_FAKE: if not base_id: base_id = _BPY_STRUCT_FAKE if base_id: title = "%s(%s)" % (struct.identifier, base_id) else: title = struct.identifier write_title(fw, title, "=") fw(".. module:: bpy.types\n\n") # docs first?, ok write_example_ref("", fw, "bpy.types.%s" % struct.identifier) base_ids = [base.identifier for base in struct.get_bases()] if _BPY_STRUCT_FAKE: base_ids.append(_BPY_STRUCT_FAKE) base_ids.reverse() if base_ids: if len(base_ids) > 1: fw("base classes --- ") else: fw("base class --- ") fw(", ".join((":class:`%s`" % base_id) for base_id in base_ids)) fw("\n\n") subclass_ids = [s.identifier for s in structs.values() if s.base is struct if not rna_info.rna_id_ignore(s.identifier)] if subclass_ids: fw("subclasses --- \n" + ", ".join((":class:`%s`" % s) for s in subclass_ids) + "\n\n") base_id = getattr(struct.base, "identifier", "") if _BPY_STRUCT_FAKE: if not base_id: base_id = _BPY_STRUCT_FAKE if base_id: fw(".. class:: %s(%s)\n\n" % (struct.identifier, base_id)) else: fw(".. class:: %s\n\n" % struct.identifier) fw(" %s\n\n" % struct.description) # properties sorted in alphabetical order sorted_struct_properties = struct.properties[:] sorted_struct_properties.sort(key=lambda prop: prop.identifier) for prop in sorted_struct_properties: type_descr = prop.get_type_description(class_fmt=":class:`%s`", collection_id=_BPY_PROP_COLLECTION_ID) # readonly properties use "data" directive, variables properties use "attribute" directive if 'readonly' in type_descr: fw(" .. data:: %s\n\n" % prop.identifier) else: fw(" .. attribute:: %s\n\n" % prop.identifier) if prop.description: fw(" %s\n\n" % prop.description) # special exception, cant use genric code here for enums if prop.type == "enum": enum_text = pyrna_enum2sphinx(prop) if enum_text: write_indented_lines(" ", fw, enum_text) fw("\n") del enum_text # end enum exception fw(" :type: %s\n\n" % type_descr) # python attributes py_properties = struct.get_py_properties() py_prop = None for identifier, py_prop in py_properties: pyprop2sphinx(" ", fw, identifier, py_prop) del py_properties, py_prop for func in struct.functions: args_str = ", ".join(prop.get_arg_default(force=False) for prop in func.args) fw(" .. %s:: %s(%s)\n\n" % ("classmethod" if func.is_classmethod else "method", func.identifier, args_str)) fw(" %s\n\n" % func.description) for prop in func.args: write_param(" ", fw, prop) if len(func.return_values) == 1: write_param(" ", fw, func.return_values[0], is_return=True) elif func.return_values: # multiple return values fw(" :return (%s):\n" % ", ".join(prop.identifier for prop in func.return_values)) for prop in func.return_values: # TODO, pyrna_enum2sphinx for multiple return values... actually dont think we even use this but still!!! type_descr = prop.get_type_description(as_ret=True, class_fmt=":class:`%s`", collection_id=_BPY_PROP_COLLECTION_ID) descr = prop.description if not descr: descr = prop.name fw(" `%s`, %s, %s\n\n" % (prop.identifier, descr, type_descr)) write_example_ref(" ", fw, "bpy.types." + struct.identifier + "." + func.identifier) fw("\n") # python methods py_funcs = struct.get_py_functions() py_func = None for identifier, py_func in py_funcs: pyfunc2sphinx(" ", fw, identifier, py_func, is_class=True) del py_funcs, py_func py_funcs = struct.get_py_c_functions() py_func = None for identifier, py_func in py_funcs: py_c_func2sphinx(" ", fw, "bpy.types", struct.identifier, identifier, py_func, is_class=True) lines = [] if struct.base or _BPY_STRUCT_FAKE: bases = list(reversed(struct.get_bases())) # props lines[:] = [] if _BPY_STRUCT_FAKE: descr_items = [(key, descr) for key, descr in sorted(bpy.types.Struct.__bases__[0].__dict__.items()) if not key.startswith("__")] if _BPY_STRUCT_FAKE: for key, descr in descr_items: if type(descr) == GetSetDescriptorType: lines.append(" * :class:`%s.%s`\n" % (_BPY_STRUCT_FAKE, key)) for base in bases: for prop in base.properties: lines.append(" * :class:`%s.%s`\n" % (base.identifier, prop.identifier)) for identifier, py_prop in base.get_py_properties(): lines.append(" * :class:`%s.%s`\n" % (base.identifier, identifier)) for identifier, py_prop in base.get_py_properties(): lines.append(" * :class:`%s.%s`\n" % (base.identifier, identifier)) if lines: fw(".. rubric:: Inherited Properties\n\n") fw(".. hlist::\n") fw(" :columns: 2\n\n") for line in lines: fw(line) fw("\n") # funcs lines[:] = [] if _BPY_STRUCT_FAKE: for key, descr in descr_items: if type(descr) == MethodDescriptorType: lines.append(" * :class:`%s.%s`\n" % (_BPY_STRUCT_FAKE, key)) for base in bases: for func in base.functions: lines.append(" * :class:`%s.%s`\n" % (base.identifier, func.identifier)) for identifier, py_func in base.get_py_functions(): lines.append(" * :class:`%s.%s`\n" % (base.identifier, identifier)) if lines: fw(".. rubric:: Inherited Functions\n\n") fw(".. hlist::\n") fw(" :columns: 2\n\n") for line in lines: fw(line) fw("\n") lines[:] = [] if struct.references: # use this otherwise it gets in the index for a normal heading. fw(".. rubric:: References\n\n") fw(".. hlist::\n") fw(" :columns: 2\n\n") for ref in struct.references: ref_split = ref.split(".") if len(ref_split) > 2: ref = ref_split[-2] + "." + ref_split[-1] fw(" * :class:`%s`\n" % ref) fw("\n") # docs last?, disable for now # write_example_ref("", fw, "bpy.types.%s" % struct.identifier) file.close()
def api_dump(args): import rna_info import inspect version, version_key = api_version() if version is None: raise(ValueError("API dumps can only be generated from within Blender.")) dump = {} dump_module = dump["bpy.types"] = {} struct = rna_info.BuildRNAInfo()[0] for struct_id, struct_info in sorted(struct.items()): struct_id_str = struct_info.identifier if rna_info.rna_id_ignore(struct_id_str): continue for base in struct_info.get_bases(): struct_id_str = base.identifier + "." + struct_id_str dump_class = dump_module[struct_id_str] = {} props = [(prop.identifier, prop) for prop in struct_info.properties] for prop_id, prop in sorted(props): # if prop.type == 'boolean': # continue prop_type = prop.type prop_length = prop.array_length prop_range = round(prop.min, 4), round(prop.max, 4) prop_default = prop.default if type(prop_default) is float: prop_default = round(prop_default, 4) if prop_range[0] == -1 and prop_range[1] == -1: prop_range = None dump_class[prop_id] = ( "prop_rna", # basic_type prop.name, # name prop_type, # type prop_range, # range prop_length, # length prop.default, # default prop.description, # descr Ellipsis, # f_args Ellipsis, # f_arg_types Ellipsis, # f_ret_types ) del props # python props, tricky since we don't know much about them. for prop_id, attr in struct_info.get_py_properties(): dump_class[prop_id] = ( "prop_py", # basic_type Ellipsis, # name Ellipsis, # type Ellipsis, # range Ellipsis, # length Ellipsis, # default attr.__doc__, # descr Ellipsis, # f_args Ellipsis, # f_arg_types Ellipsis, # f_ret_types ) # kludge func -> props funcs = [(func.identifier, func) for func in struct_info.functions] for func_id, func in funcs: func_ret_types = tuple([prop.type for prop in func.return_values]) func_args_ids = tuple([prop.identifier for prop in func.args]) func_args_type = tuple([prop.type for prop in func.args]) dump_class[func_id] = ( "func_rna", # basic_type Ellipsis, # name Ellipsis, # type Ellipsis, # range Ellipsis, # length Ellipsis, # default func.description, # descr func_args_ids, # f_args func_args_type, # f_arg_types func_ret_types, # f_ret_types ) del funcs # kludge func -> props funcs = struct_info.get_py_functions() for func_id, attr in funcs: # arg_str = inspect.formatargspec(*inspect.getargspec(py_func)) sig = inspect.signature(attr) func_args_ids = [k for k, v in sig.parameters.items()] dump_class[func_id] = ( "func_py", # basic_type Ellipsis, # name Ellipsis, # type Ellipsis, # range Ellipsis, # length Ellipsis, # default attr.__doc__, # descr func_args_ids, # f_args Ellipsis, # f_arg_types Ellipsis, # f_ret_types ) del funcs filepath_out = args.filepath_out with open(filepath_out, 'w', encoding='utf-8') as file_handle: json.dump((version, dump), file_handle, cls=JSONEncoderAPIDump) indexpath = args.indexpath rootpath = os.path.dirname(indexpath) if os.path.exists(indexpath): with open(indexpath, 'r', encoding='utf-8') as file_handle: index = json.load(file_handle) else: index = {} index[version_key] = os.path.relpath(filepath_out, rootpath) with open(indexpath, 'w', encoding='utf-8') as file_handle: json.dump(index, file_handle) print("API version %s dumped into %r, and index %r has been updated" % (version_key, filepath_out, indexpath))
def write_struct(struct): #if not struct.identifier.startswith("Sc") and not struct.identifier.startswith("I"): # return #if not struct.identifier == "Object": # return filepath = os.path.join(BASEPATH, "bpy.types.%s.rst" % struct.identifier) file = open(filepath, "w") fw = file.write base_id = getattr(struct.base, "identifier", "") if _BPY_STRUCT_FAKE: if not base_id: base_id = _BPY_STRUCT_FAKE if base_id: title = "%s(%s)" % (struct.identifier, base_id) else: title = struct.identifier write_title(fw, title, "=") fw(".. module:: bpy.types\n\n") # docs first?, ok write_example_ref("", fw, "bpy.types.%s" % struct.identifier) base_ids = [base.identifier for base in struct.get_bases()] if _BPY_STRUCT_FAKE: base_ids.append(_BPY_STRUCT_FAKE) base_ids.reverse() if base_ids: if len(base_ids) > 1: fw("base classes --- ") else: fw("base class --- ") fw(", ".join((":class:`%s`" % base_id) for base_id in base_ids)) fw("\n\n") subclass_ids = [ s.identifier for s in structs.values() if s.base is struct if not rna_info.rna_id_ignore(s.identifier) ] if subclass_ids: fw("subclasses --- \n" + ", ".join( (":class:`%s`" % s) for s in subclass_ids) + "\n\n") base_id = getattr(struct.base, "identifier", "") if _BPY_STRUCT_FAKE: if not base_id: base_id = _BPY_STRUCT_FAKE if base_id: fw(".. class:: %s(%s)\n\n" % (struct.identifier, base_id)) else: fw(".. class:: %s\n\n" % struct.identifier) fw(" %s\n\n" % struct.description) # properties sorted in alphabetical order sorted_struct_properties = struct.properties[:] sorted_struct_properties.sort(key=lambda prop: prop.identifier) for prop in sorted_struct_properties: type_descr = prop.get_type_description( class_fmt=":class:`%s`", collection_id=_BPY_PROP_COLLECTION_ID) # readonly properties use "data" directive, variables properties use "attribute" directive if 'readonly' in type_descr: fw(" .. data:: %s\n\n" % prop.identifier) else: fw(" .. attribute:: %s\n\n" % prop.identifier) if prop.description: fw(" %s\n\n" % prop.description) # special exception, cant use genric code here for enums if prop.type == "enum": enum_text = pyrna_enum2sphinx(prop) if enum_text: write_indented_lines(" ", fw, enum_text) fw("\n") del enum_text # end enum exception fw(" :type: %s\n\n" % type_descr) # python attributes py_properties = struct.get_py_properties() py_prop = None for identifier, py_prop in py_properties: pyprop2sphinx(" ", fw, identifier, py_prop) del py_properties, py_prop for func in struct.functions: args_str = ", ".join( prop.get_arg_default(force=False) for prop in func.args) fw(" .. %s:: %s(%s)\n\n" % ("classmethod" if func.is_classmethod else "method", func.identifier, args_str)) fw(" %s\n\n" % func.description) for prop in func.args: write_param(" ", fw, prop) if len(func.return_values) == 1: write_param(" ", fw, func.return_values[0], is_return=True) elif func.return_values: # multiple return values fw(" :return (%s):\n" % ", ".join(prop.identifier for prop in func.return_values)) for prop in func.return_values: # TODO, pyrna_enum2sphinx for multiple return values... actually dont think we even use this but still!!! type_descr = prop.get_type_description( as_ret=True, class_fmt=":class:`%s`", collection_id=_BPY_PROP_COLLECTION_ID) descr = prop.description if not descr: descr = prop.name fw(" `%s`, %s, %s\n\n" % (prop.identifier, descr, type_descr)) write_example_ref( " ", fw, "bpy.types." + struct.identifier + "." + func.identifier) fw("\n") # python methods py_funcs = struct.get_py_functions() py_func = None for identifier, py_func in py_funcs: pyfunc2sphinx(" ", fw, identifier, py_func, is_class=True) del py_funcs, py_func py_funcs = struct.get_py_c_functions() py_func = None for identifier, py_func in py_funcs: py_c_func2sphinx(" ", fw, "bpy.types", struct.identifier, identifier, py_func, is_class=True) lines = [] if struct.base or _BPY_STRUCT_FAKE: bases = list(reversed(struct.get_bases())) # props lines[:] = [] if _BPY_STRUCT_FAKE: descr_items = [(key, descr) for key, descr in sorted( bpy.types.Struct.__bases__[0].__dict__.items()) if not key.startswith("__")] if _BPY_STRUCT_FAKE: for key, descr in descr_items: if type(descr) == GetSetDescriptorType: lines.append(" * :class:`%s.%s`\n" % (_BPY_STRUCT_FAKE, key)) for base in bases: for prop in base.properties: lines.append(" * :class:`%s.%s`\n" % (base.identifier, prop.identifier)) for identifier, py_prop in base.get_py_properties(): lines.append(" * :class:`%s.%s`\n" % (base.identifier, identifier)) for identifier, py_prop in base.get_py_properties(): lines.append(" * :class:`%s.%s`\n" % (base.identifier, identifier)) if lines: fw(".. rubric:: Inherited Properties\n\n") fw(".. hlist::\n") fw(" :columns: 2\n\n") for line in lines: fw(line) fw("\n") # funcs lines[:] = [] if _BPY_STRUCT_FAKE: for key, descr in descr_items: if type(descr) == MethodDescriptorType: lines.append(" * :class:`%s.%s`\n" % (_BPY_STRUCT_FAKE, key)) for base in bases: for func in base.functions: lines.append(" * :class:`%s.%s`\n" % (base.identifier, func.identifier)) for identifier, py_func in base.get_py_functions(): lines.append(" * :class:`%s.%s`\n" % (base.identifier, identifier)) if lines: fw(".. rubric:: Inherited Functions\n\n") fw(".. hlist::\n") fw(" :columns: 2\n\n") for line in lines: fw(line) fw("\n") lines[:] = [] if struct.references: # use this otherwise it gets in the index for a normal heading. fw(".. rubric:: References\n\n") fw(".. hlist::\n") fw(" :columns: 2\n\n") for ref in struct.references: ref_split = ref.split(".") if len(ref_split) > 2: ref = ref_split[-2] + "." + ref_split[-1] fw(" * :class:`%s`\n" % ref) fw("\n") # docs last?, disable for now # write_example_ref("", fw, "bpy.types.%s" % struct.identifier) file.close()
def api_dump(): dump = {} dump_module = dump["bpy.types"] = {} import rna_info import inspect struct = rna_info.BuildRNAInfo()[0] for struct_id, struct_info in sorted(struct.items()): struct_id_str = struct_info.identifier if rna_info.rna_id_ignore(struct_id_str): continue for base in struct_info.get_bases(): struct_id_str = base.identifier + "." + struct_id_str dump_class = dump_module[struct_id_str] = {} props = [(prop.identifier, prop) for prop in struct_info.properties] for prop_id, prop in sorted(props): # if prop.type == 'boolean': # continue prop_type = prop.type prop_length = prop.array_length prop_range = round(prop.min, 4), round(prop.max, 4) prop_default = prop.default if type(prop_default) is float: prop_default = round(prop_default, 4) if prop_range[0] == -1 and prop_range[1] == -1: prop_range = None dump_class[prop_id] = ( "prop_rna", # basic_type prop.name, # name prop_type, # type prop_range, # range prop_length, # length prop.default, # default prop.description, # descr Ellipsis, # f_args Ellipsis, # f_arg_types Ellipsis, # f_ret_types ) del props # python props, tricky since we don't know much about them. for prop_id, attr in struct_info.get_py_properties(): dump_class[prop_id] = ( "prop_py", # basic_type Ellipsis, # name Ellipsis, # type Ellipsis, # range Ellipsis, # length Ellipsis, # default attr.__doc__, # descr Ellipsis, # f_args Ellipsis, # f_arg_types Ellipsis, # f_ret_types ) # kludge func -> props funcs = [(func.identifier, func) for func in struct_info.functions] for func_id, func in funcs: func_ret_types = tuple([prop.type for prop in func.return_values]) func_args_ids = tuple([prop.identifier for prop in func.args]) func_args_type = tuple([prop.type for prop in func.args]) dump_class[func_id] = ( "func_rna", # basic_type Ellipsis, # name Ellipsis, # type Ellipsis, # range Ellipsis, # length Ellipsis, # default func.description, # descr func_args_ids, # f_args func_args_type, # f_arg_types func_ret_types, # f_ret_types ) del funcs # kludge func -> props funcs = struct_info.get_py_functions() for func_id, attr in funcs: # arg_str = inspect.formatargspec(*inspect.getargspec(py_func)) sig = inspect.signature(attr) func_args_ids = [k for k, v in sig.parameters.items()] dump_class[func_id] = ( "func_py", # basic_type Ellipsis, # name Ellipsis, # type Ellipsis, # range Ellipsis, # length Ellipsis, # default attr.__doc__, # descr func_args_ids, # f_args Ellipsis, # f_arg_types Ellipsis, # f_ret_types ) del funcs import pprint filename = api_dunp_fname() filehandle = open(filename, 'w', encoding='utf-8') tot = filehandle.write(pprint.pformat(dump, width=1)) filehandle.close() print("%s, %d bytes written" % (filename, tot))
def api_dump(): dump = {} dump_module = dump["bpy.types"] = {} import rna_info import inspect struct = rna_info.BuildRNAInfo()[0] for struct_id, strict_info in sorted(struct.items()): struct_id_str = strict_info.identifier if rna_info.rna_id_ignore(struct_id_str): continue for base in strict_info.get_bases(): struct_id_str = base.identifier + "." + struct_id_str dump_class = dump_module[struct_id_str] = {} props = [(prop.identifier, prop) for prop in strict_info.properties] for prop_id, prop in sorted(props): # if prop.type == 'boolean': # continue prop_type = prop.type prop_length = prop.array_length prop_range = round(prop.min, 4), round(prop.max, 4) prop_default = prop.default if type(prop_default) is float: prop_default = round(prop_default, 4) if prop_range[0] == -1 and prop_range[1] == -1: prop_range = None dump_class[prop_id] = ( "prop_rna", # basic_type prop.name, # name prop_type, # type prop_range, # range prop_length, # length prop.default, # default prop.description, # descr Ellipsis, # f_args Ellipsis, # f_arg_types Ellipsis, # f_ret_types ) del props # python props, tricky since we dont know much about them. for prop_id, attr in strict_info.get_py_properties(): dump_class[prop_id] = ( "prop_py", # basic_type Ellipsis, # name Ellipsis, # type Ellipsis, # range Ellipsis, # length Ellipsis, # default attr.__doc__, # descr Ellipsis, # f_args Ellipsis, # f_arg_types Ellipsis, # f_ret_types ) # kludge func -> props funcs = [(func.identifier, func) for func in strict_info.functions] for func_id, func in funcs: func_ret_types = tuple([prop.type for prop in func.return_values]) func_args_ids = tuple([prop.identifier for prop in func.args]) func_args_type = tuple([prop.type for prop in func.args]) dump_class[func_id] = ( "func_rna", # basic_type Ellipsis, # name Ellipsis, # type Ellipsis, # range Ellipsis, # length Ellipsis, # default func.description, # descr func_args_ids, # f_args func_args_type, # f_arg_types func_ret_types, # f_ret_types ) del funcs # kludge func -> props funcs = strict_info.get_py_functions() for func_id, attr in funcs: # arg_str = inspect.formatargspec(*inspect.getargspec(py_func)) func_args_ids = tuple(inspect.getargspec(attr).args) dump_class[func_id] = ( "func_py", # basic_type Ellipsis, # name Ellipsis, # type Ellipsis, # range Ellipsis, # length Ellipsis, # default attr.__doc__, # descr func_args_ids, # f_args Ellipsis, # f_arg_types Ellipsis, # f_ret_types ) del funcs import pprint filename = api_dunp_fname() filehandle = open(filename, 'w') tot = filehandle.write(pprint.pformat(dump, width=1)) filehandle.close() print("%s, %d bytes written" % (filename, tot))
def pyrna2sphinx(BASEPATH): """ bpy.types and bpy.ops """ structs, funcs, ops, props = rna_info.BuildRNAInfo() if FILTER_BPY_TYPES is not None: structs = {k: v for k, v in structs.items() if k[1] in FILTER_BPY_TYPES} if FILTER_BPY_OPS is not None: ops = {k: v for k, v in ops.items() if v.module_name in FILTER_BPY_OPS} def write_param(ident, fw, prop, is_return=False): if is_return: id_name = "return" id_type = "rtype" kwargs = {"as_ret": True, "class_fmt": ":class:`%s`"} identifier = "" else: id_name = "arg" id_type = "type" kwargs = {"as_arg": True, "class_fmt": ":class:`%s`"} identifier = " %s" % prop.identifier type_descr = prop.get_type_description(**kwargs) if prop.name or prop.description: fw( ident + ":%s%s: %s\n" % (id_name, identifier, ", ".join(val for val in (prop.name, prop.description) if val)) ) fw(ident + ":%s%s: %s\n" % (id_type, identifier, type_descr)) def write_struct(struct): # if not struct.identifier.startswith("Sc") and not struct.identifier.startswith("I"): # return # if not struct.identifier == "Object": # return filepath = os.path.join(BASEPATH, "bpy.types.%s.rst" % struct.identifier) file = open(filepath, "w") fw = file.write base_id = getattr(struct.base, "identifier", "") if _BPY_STRUCT_FAKE: if not base_id: base_id = _BPY_STRUCT_FAKE if base_id: title = "%s(%s)" % (struct.identifier, base_id) else: title = struct.identifier fw("%s\n%s\n\n" % (title, "=" * len(title))) fw(".. module:: bpy.types\n\n") write_example_ref("", fw, "bpy.types.%s" % struct.identifier) base_ids = [base.identifier for base in struct.get_bases()] if _BPY_STRUCT_FAKE: base_ids.append(_BPY_STRUCT_FAKE) base_ids.reverse() if base_ids: if len(base_ids) > 1: fw("base classes --- ") else: fw("base class --- ") fw(", ".join((":class:`%s`" % base_id) for base_id in base_ids)) fw("\n\n") subclass_ids = [ s.identifier for s in structs.values() if s.base is struct if not rna_info.rna_id_ignore(s.identifier) ] if subclass_ids: fw("subclasses --- \n" + ", ".join((":class:`%s`" % s) for s in subclass_ids) + "\n\n") base_id = getattr(struct.base, "identifier", "") if _BPY_STRUCT_FAKE: if not base_id: base_id = _BPY_STRUCT_FAKE if base_id: fw(".. class:: %s(%s)\n\n" % (struct.identifier, base_id)) else: fw(".. class:: %s\n\n" % struct.identifier) fw(" %s\n\n" % struct.description) # properties sorted in alphabetical order sorted_struct_properties = struct.properties[:] sorted_struct_properties.sort(key=lambda prop: prop.identifier) for prop in sorted_struct_properties: type_descr = prop.get_type_description(class_fmt=":class:`%s`") # readonly properties use "data" directive, variables properties use "attribute" directive if "readonly" in type_descr: fw(" .. data:: %s\n\n" % prop.identifier) else: fw(" .. attribute:: %s\n\n" % prop.identifier) if prop.description: fw(" %s\n\n" % prop.description) fw(" :type: %s\n\n" % type_descr) # python attributes py_properties = struct.get_py_properties() py_prop = None for identifier, py_prop in py_properties: pyprop2sphinx(" ", fw, identifier, py_prop) del py_properties, py_prop for func in struct.functions: args_str = ", ".join(prop.get_arg_default(force=False) for prop in func.args) fw( " .. %s:: %s(%s)\n\n" % ("classmethod" if func.is_classmethod else "method", func.identifier, args_str) ) fw(" %s\n\n" % func.description) for prop in func.args: write_param(" ", fw, prop) if len(func.return_values) == 1: write_param(" ", fw, func.return_values[0], is_return=True) elif func.return_values: # multiple return values fw(" :return (%s):\n" % ", ".join(prop.identifier for prop in func.return_values)) for prop in func.return_values: type_descr = prop.get_type_description(as_ret=True, class_fmt=":class:`%s`") descr = prop.description if not descr: descr = prop.name fw(" `%s`, %s, %s\n\n" % (prop.identifier, descr, type_descr)) fw("\n") # python methods py_funcs = struct.get_py_functions() py_func = None for identifier, py_func in py_funcs: pyfunc2sphinx(" ", fw, identifier, py_func, is_class=True) del py_funcs, py_func lines = [] if struct.base or _BPY_STRUCT_FAKE: bases = list(reversed(struct.get_bases())) # props lines[:] = [] if _BPY_STRUCT_FAKE: descr_items = [ (key, descr) for key, descr in sorted(bpy.types.Struct.__bases__[0].__dict__.items()) if not key.startswith("__") ] if _BPY_STRUCT_FAKE: for key, descr in descr_items: if type(descr) == GetSetDescriptorType: lines.append(" * :class:`%s.%s`\n" % (_BPY_STRUCT_FAKE, key)) for base in bases: for prop in base.properties: lines.append(" * :class:`%s.%s`\n" % (base.identifier, prop.identifier)) for identifier, py_prop in base.get_py_properties(): lines.append(" * :class:`%s.%s`\n" % (base.identifier, identifier)) for identifier, py_prop in base.get_py_properties(): lines.append(" * :class:`%s.%s`\n" % (base.identifier, identifier)) if lines: fw(".. rubric:: Inherited Properties\n\n") fw(".. hlist::\n") fw(" :columns: 2\n\n") for line in lines: fw(line) fw("\n") # funcs lines[:] = [] if _BPY_STRUCT_FAKE: for key, descr in descr_items: if type(descr) == MethodDescriptorType: lines.append(" * :class:`%s.%s`\n" % (_BPY_STRUCT_FAKE, key)) for base in bases: for func in base.functions: lines.append(" * :class:`%s.%s`\n" % (base.identifier, func.identifier)) for identifier, py_func in base.get_py_functions(): lines.append(" * :class:`%s.%s`\n" % (base.identifier, identifier)) if lines: fw(".. rubric:: Inherited Functions\n\n") fw(".. hlist::\n") fw(" :columns: 2\n\n") for line in lines: fw(line) fw("\n") lines[:] = [] if struct.references: # use this otherwise it gets in the index for a normal heading. fw(".. rubric:: References\n\n") fw(".. hlist::\n") fw(" :columns: 2\n\n") for ref in struct.references: ref_split = ref.split(".") if len(ref_split) > 2: ref = ref_split[-2] + "." + ref_split[-1] fw(" * :class:`%s`\n" % ref) fw("\n") if "bpy.types" not in EXCLUDE_MODULES: for struct in structs.values(): # TODO, rna_info should filter these out! if "_OT_" in struct.identifier: continue write_struct(struct) # special case, bpy_struct if _BPY_STRUCT_FAKE: filepath = os.path.join(BASEPATH, "bpy.types.%s.rst" % _BPY_STRUCT_FAKE) file = open(filepath, "w") fw = file.write fw("%s\n" % _BPY_STRUCT_FAKE) fw("=" * len(_BPY_STRUCT_FAKE) + "\n") fw("\n") fw(".. module:: bpy.types\n") fw("\n") subclass_ids = [ s.identifier for s in structs.values() if s.base is None if not rna_info.rna_id_ignore(s.identifier) ] if subclass_ids: fw("subclasses --- \n" + ", ".join((":class:`%s`" % s) for s in sorted(subclass_ids)) + "\n\n") fw(".. class:: %s\n\n" % _BPY_STRUCT_FAKE) fw(" built-in base class for all classes in bpy.types.\n\n") fw(" .. note::\n\n") fw( " Note that bpy.types.%s is not actually available from within blender, it only exists for the purpose of documentation.\n\n" % _BPY_STRUCT_FAKE ) descr_items = [ (key, descr) for key, descr in sorted(bpy.types.Struct.__bases__[0].__dict__.items()) if not key.startswith("__") ] for key, descr in descr_items: if ( type(descr) == MethodDescriptorType ): # GetSetDescriptorType, GetSetDescriptorType's are not documented yet py_descr2sphinx(" ", fw, descr, "bpy.types", _BPY_STRUCT_FAKE, key) for key, descr in descr_items: if type(descr) == GetSetDescriptorType: py_descr2sphinx(" ", fw, descr, "bpy.types", _BPY_STRUCT_FAKE, key) # operators def write_ops(): API_BASEURL = "https://svn.blender.org/svnroot/bf-blender/trunk/blender/release/scripts" fw = None last_mod = "" for op_key in sorted(ops.keys()): op = ops[op_key] if last_mod != op.module_name: filepath = os.path.join(BASEPATH, "bpy.ops.%s.rst" % op.module_name) file = open(filepath, "w") fw = file.write title = "%s Operators" % (op.module_name[0].upper() + op.module_name[1:]) fw("%s\n%s\n\n" % (title, "=" * len(title))) fw(".. module:: bpy.ops.%s\n\n" % op.module_name) last_mod = op.module_name args_str = ", ".join(prop.get_arg_default(force=True) for prop in op.args) fw(".. function:: %s(%s)\n\n" % (op.func_name, args_str)) # if the description isn't valid, we output the standard warning # with a link to the wiki so that people can help if not op.description or op.description == "(undocumented operator)": operator_description = undocumented_message("bpy.ops", op.module_name, op.func_name) else: operator_description = op.description fw(" %s\n\n" % operator_description) for prop in op.args: write_param(" ", fw, prop) if op.args: fw("\n") location = op.get_location() if location != (None, None): fw(" :file: `%s <%s/%s>`_:%d\n\n" % (location[0], API_BASEURL, location[0], location[1])) if "bpy.ops" not in EXCLUDE_MODULES: write_ops()