[docs]defis_ignored(mod_or_pkg,ignored_package):""" Test, if this :class:`docfly.pkg.picage.Module` or :class:`docfly.pkg.picage.Package` should be included to generate API reference document. :param mod_or_pkg: module or package :type mod_or_pkg: typing.Union[Module, Package] :param ignored_package: ignored package **中文文档** 根据全名判断一个包或者模块是否要被包含到自动生成的API文档中。 """ignored_pattern=list()forpkg_fullnameinignored_package:ifpkg_fullname.endswith(".py"):pkg_fullname=pkg_fullname[:-3]ignored_pattern.append(pkg_fullname)else:ignored_pattern.append(pkg_fullname)forpatterninignored_pattern:ifmod_or_pkg.fullname.startswith(pattern):returnTruereturnFalse
[docs]classApiReferenceDoc(object):""" A class to generate sphinx-doc api reference part. Example:: package |--- subpackage1 |--- __init__.rst |--- module.rst |--- subpackage2 |--- __init__.rst |--- module.rst |--- __init__.rst |--- module1.rst |--- module2.rst :param conf_file: the conf.py file for sphinx doc. it helps to locate the api reference doc destination directory :type conf_file: string :param package_name: the importable package name :type package_name: string :param ignore: default empty list, package, module relative prefix you want to ignored :type ignored_package: list of string **中文文档** 如果你需要忽略一个包: 请使用 ``docfly.packages`` 如果你需要忽略一个模块: 请使用 ``docfly.zzz_manual_install`` 或 ``docfly.zzz_manual_install.py`` """def__init__(self,conf_file,package_name,ignored_package=None,):self.conf_file=conf_fileself.package=Package(package_name)ifignored_packageisNone:ignored_package=list()self.ignored_package=list()forpkg_fullnameinignored_package:ifpkg_fullname.endswith(".py"):self.ignored_package.append(pkg_fullname[:-3])else:self.ignored_package.append(pkg_fullname)
[docs]deffly(self):""" Generate doc tree. """dst_dir=Path(self.conf_file).parent.abspathpackage_dir=Path(dst_dir,self.package.shortname)# delete existing api documenttry:ifpackage_dir.exists():shutil.rmtree(package_dir.abspath)exceptExceptionase:print("'%s' can't be removed! Error: %s"%(package_dir,e))# create .rst filesforpkg,parent,sub_packages,sub_modulesinself.package.walk():ifnotis_ignored(pkg,self.ignored_package):dir_path=Path(*([dst_dir,]+pkg.fullname.split(".")))init_path=Path(dir_path,"__init__.rst")make_dir(dir_path.abspath)make_file(init_path.abspath,self.generate_package_content(pkg),)formodinsub_modules:ifnotis_ignored(mod,self.ignored_package):module_path=Path(dir_path,mod.shortname+".rst")make_file(module_path.abspath,self.generate_module_content(mod),)
[docs]defgenerate_package_content(self,package):"""Generate package.rst text content. :: {{ package_name }} ================== .. automodule:: {{ package_name }} :members: sub packages and modules ------------------------ .. toctree:: :maxdepth: 1 {{ sub_package_name1 }} <{{ sub_package_name1 }}/__init__> {{ sub_package_name2 }} <{{ sub_package_name2 }}/__init__> {{ sub_module_name1}} <{{ sub_module_name1}}> {{ sub_module_name2}} <{{ sub_module_name2}}> :type package: Package """ifisinstance(package,Package):returnrender_package(package=package,ignored_package=self.ignored_package)else:# pragma: no coverraiseException("%r is not a Package object"%package)
[docs]defgenerate_module_content(self,module):"""Generate module.rst text content. :: {{ module_name }} ================= .. automodule:: {{ module_fullname }} :members: """ifisinstance(module,Module):returnrender_module(module)else:# pragma: no coverraiseException("%r is not a Module object"%module)