# deps management

## eval formatting
%pyproject_builddep_format 'BuildRequires: python3-module-$nname'

%pyproject_runtimedep_format 'Requires: python3-module-$nname'

## dependencies filters

### exclude filter used for check
%pyproject_deps_check_filter %{?pypi_name:'%{pep503_name %pypi_name}$'} 'flake8$' 'flake8-.*' '.*-flake8$' 'isort$' 'isort-.*' '.*-isort$' 'black$' 'black-.*' '.*-black$' 'coverage$' 'coverage-.*' '.*-coverage$' pytest-cov covdefaults 'mypy$' 'mypy-.*' '.*-mypy$' pytest-checkdocs 'pre-commit$' 'pre-commit-.*' '.*-pre-commit$' 'pylint$' 'pylint-.*' '.*-pylint$' 'nose$' 'codecov$' 'codecov-.*' '.*-codecov$' 'coveralls$' 'coveralls-.*' '.*-coveralls$' 'twine$' 'twine-.*' '.*-twine$' 'pytest-runner$' 'ruff$' 'ruff-.*' '.*-ruff$' 'types-.*'

%add_pyproject_deps_check_filter() %global pyproject_deps_check_filter %{?pyproject_deps_check_filter} %*
%set_pyproject_deps_check_filter() %global pyproject_deps_check_filter %*

### exclude filter used for build
%add_pyproject_deps_build_filter() %global pyproject_deps_build_filter %{?pyproject_deps_build_filter} %*
%set_pyproject_deps_build_filter() %global pyproject_deps_build_filter %*

### exclude filter used for runtime
%add_pyproject_deps_runtime_filter() %global pyproject_deps_runtime_filter %{?pyproject_deps_runtime_filter} %*
%set_pyproject_deps_runtime_filter() %global pyproject_deps_runtime_filter %*

## common deps actions
%pyproject_deps_config_name pyproject_deps.json

%pyproject_deps_config %_sourcedir/%pyproject_deps_config_name

%pyproject_deps %{pyproject:} deps --depsconfig %pyproject_deps_config

%pyproject_deps_eval %pyproject_deps eval

%pyproject_deps_show %pyproject_deps show

%pyproject_deps_sync %pyproject_deps sync

%pyproject_deps_add %pyproject_deps add

### verify source and resync if needed
%pyproject_deps_resync() \
%pyproject_deps_show %1 1>/dev/null 2>&1 || %pyproject_deps_add %* \
%pyproject_deps_sync --verify %1 \
%nil

### eval source in current Python environment and format as build requirement
%pyproject_builddeps() \
%(%pyproject_deps_eval --depformat=%pyproject_builddep_format %* 2>/dev/null ||:) \
%nil

### eval source in current Python environment and format as runtime requirement
%pyproject_runtimedeps() \
%(%pyproject_deps_eval --depformat=%pyproject_runtimedep_format %* 2>/dev/null ||:) \
%nil

## common types of deps

### PEP518
#### eval 'pep518' source and format as BuildRequires
%pyproject_builddeps_pep518() %{expand:%%pyproject_builddeps -- pep518 %*}

#### verify or sync 'pep518' source
%pyproject_deps_resync_pep518 %pyproject_deps_resync pep518 pep518

### PEP517
#### eval 'pep517' source and format as BuildRequires
%pyproject_builddeps_pep517() %{expand:%%pyproject_builddeps -- pep517 %*}

#### verify or sync 'pep517' source
%pyproject_deps_resync_pep517 %pyproject_deps_resync pep517 pep517

#### today's packaging standard requires PEP518 and PEP517 dependencies for build
%pyproject_builddeps_build() %{expand:%%pyproject_builddeps_pep518 -- %{?pyproject_deps_build_filter:--exclude %pyproject_deps_build_filter} %*}%{expand:%%pyproject_builddeps_pep517 -- %{?pyproject_deps_build_filter:--exclude %pyproject_deps_build_filter} %*}

%pyproject_deps_resync_build %pyproject_deps_resync_pep518 %pyproject_deps_resync_pep517

### core metadata
#### eval 'metadata' source and format as BuildRequires
%pyproject_builddeps_metadata() %{expand:%%pyproject_builddeps -- metadata %{?pyproject_deps_check_filter:--exclude %pyproject_deps_check_filter} %*}

#### eval 'metadata' source with given extra and format as BuildRequires
%pyproject_builddeps_metadata_extra() %{expand:%%pyproject_builddeps_metadata -- --extra %*}

#### eval 'metadata' source and format as Requires
%pyproject_runtimedeps_metadata() %{expand:%%pyproject_runtimedeps -- metadata %{?pyproject_deps_runtime_filter:--exclude %pyproject_deps_runtime_filter} %*}

#### verify or sync 'metadata' source
%pyproject_deps_resync_metadata %pyproject_deps_resync metadata metadata

## check

### eval 'check' source
%pyproject_builddeps_check() %{expand:%%pyproject_builddeps -- check %{?pyproject_deps_check_filter:--exclude %pyproject_deps_check_filter} %*}

### verify or sync 'check' source of 'pip_reqfile' type
%pyproject_deps_resync_check_pipreqfile() %{expand:%%pyproject_deps_resync check pip_reqfile %*}

### verify or sync 'check' source of 'poetry' type
%pyproject_deps_resync_check_poetry() %{expand:%%pyproject_deps_resync check poetry %*}
#
### verify or sync 'check' source of 'tox' type
%pyproject_deps_resync_check_tox() %{expand:%%pyproject_deps_resync check tox %*}

### verify or sync 'check' source of 'hatch' type
%pyproject_deps_resync_check_hatch() %{expand:%%pyproject_deps_resync check hatch %*}

### verify or sync 'check' source of 'pdm' type
%pyproject_deps_resync_check_pdm() %{expand:%%pyproject_deps_resync check pdm %*}

# misc

## init new git repo, commit everything and tag with given name or %%version
%pyproject_scm_init() \
%global _buildrequires_build %_buildrequires_build /usr/bin/git \
if [ ! -d .git ]; then \
    git init \
    git config user.email author@example.com \
    git config user.name author \
    git add . \
    git commit -m release \
    git tag %{?1}%{!?1:'%version'} \
fi \
%nil
