# deps management

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

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

## updated PEP518 specification removed 'wheel' from default build system deps
%_pyproject_deps_pep518_filter 'wheel$'

## setuptools 70.1.0 no longer depends on wheel
%_pyproject_deps_pep517_filter 'wheel$'

## 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-.*' 'pyright$' 'pyright-.*' '.*-pyright$' 'sphinx$' 'sphinx-.*' '.*-sphinx$'

%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 %1 %{!?pyproject_deps_verify_skip:--verify %{expand:%%{?_pyproject_deps_%{1}_filter:--verify-exclude %%_pyproject_deps_%{1}_filter}} || { rc="$?" ; if [ "$rc" -eq 4 ] ; then printf 'error: dependencies of source "%%s" changed since last check\\nconfiguration was synced and saved into "%%s"\\nplease update it, for example, this can be done with:\\nhsh-run -- cat "%pyproject_deps_config" > .gear/pyproject_deps.json\\n' "%1" "%pyproject_deps_config" ; fi ; exit "$rc" ; }} \
%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 %*}

#### sync, filter and verify 'pep517' source, pep517 is dynamic 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} %*}

#### eval 'metadata' source with given extra and format as Requires
%pyproject_runtimedeps_metadata_extra() %{expand:%%pyproject_runtimedeps_metadata -- --extra %*}

#### 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 %*}

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

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

# 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
