Source code for setuptools_generate

"""Provide ``__version__`` for
`importlib.metadata.version() <https://docs.python.org/3/library/importlib.metadata.html#distribution-versions>`_.
"""
import logging
import os
import sys
from importlib import import_module
from typing import Callable

from click import BaseCommand
from setuptools import Distribution

from ._help2man import generate_man

try:
    from ._version import __version__, __version_tuple__  # type: ignore
except ImportError:
    __version__ = "rolling"
    __version_tuple__ = (0, 0, 0, __version__, "")

try:
    import tomllib  # type: ignore
except ImportError:
    import tomli as tomllib

logger = logging.getLogger(__name__)


[docs]def generate(distribution: Distribution | None = None) -> None: """Generate. :param distribution: :type distribution: Distribution | None :rtype: None """ if not os.path.isfile("pyproject.toml"): logger.error("No pyproject.toml is found!") return with open("pyproject.toml", "rb") as f: data = tomllib.load(f) try: write_to: str = data["tool"]["setuptools-generate"]["write-to"] from .metainfo import generate_metainfo # isort: skip generate_metainfo(write_to, data) except KeyError: logger.warning( "no [tool.setuptools-generate.write-to] in pyproject.toml, " "skip writing metainfo!" ) cwd = os.getcwd() build = os.path.join(cwd, "build") sdist = os.path.join(cwd, "sdist") os.makedirs(build, exist_ok=True) os.makedirs(sdist, exist_ok=True) fname = "CHANGELOG.md" if os.path.exists(fname): from ._markdown_it import generate_changelog generate_changelog(build, fname) try: completions: dict[str, str] = data["project"]["scripts"] except KeyError: logger.warning("No [project.scripts] in your pyproject.toml!") return sys.path.insert(0, cwd) sys.path.insert(0, os.path.join(cwd, "src")) for prog, path in completions.items(): module_path, _, function_name = path.rpartition(":") module = import_module(module_path) function = vars(module).get(function_name) if isinstance(function, BaseCommand): from ._click import generate_complete elif isinstance(function, Callable): from ._shtab import generate_complete else: logger.error(path + " cannot be called!") return generate_complete(function, prog, sdist) # type: ignore generate_man(function, prog, sdist, build) sys.path.pop(0) sys.path.pop(0)