%system_python python2
%python_for_executables python3

##### common functionality #####

%_python_sysconfig_path() %(%1 -c "import sysconfig as s; print(s.get_paths().get('%2'))")
%_python_sysconfig_var()  %(%1 -c "import sysconfig as s; print(s.get_config_var('%2'))")

%_rec_macro_helper %{lua:
    rpm.define("_rec_macro_helper %{nil}")
    function expand_macro(name, args)
        local interp = rpm.expand("%python_flavor")
        local args   = args and rpm.expand(args) or ""
        print(rpm.expand("%{" .. interp .. "_" .. name .. " " .. args .."}"))
    end
    function call_sysconfig(which, interp)
        local arg = rpm.expand("%1")
        print(rpm.expand("%{_python_sysconfig_" .. which .. " " .. interp .. " " .. arg .. "}"))
    end
}

##### fedora compatibility #####

%py_setup setup.py
%py_shbang_opts -s

##### binary suffixes for flavors #####

%python2_bin_suffix %python2_version
%python3_bin_suffix %python3_version
%pypy3_bin_suffix   pp%{pypy3_version}

##### preferred configuration #####

%python_sitelib          %{_python_sysconfig_path %python_flavor purelib}
%python_sitearch         %{_python_sysconfig_path %python_flavor platlib}
%python_version          %{_python_sysconfig_var  %python_flavor py_version_short}
%python_version_nodots   %{_python_sysconfig_var  %python_flavor py_version_nodot}

%python_prefix                  %{_rec_macro_helper}%{lua:expand_macro("prefix")}
%python_bin_suffix              %{_rec_macro_helper}%{lua:expand_macro("bin_suffix")}

%python_sysconfig_path()        %{_rec_macro_helper}%{lua:call_sysconfig("path", "%python_flavor")}
%python_sysconfig_var()         %{_rec_macro_helper}%{lua:call_sysconfig("var", "%python_flavor")}

%python_alternative()           %{_rec_macro_helper}%{lua:expand_macro("alternative", "%**")}
%python_install_alternative()   %{_rec_macro_helper}%{lua:expand_macro("install_alternative", "%**")}
%python_uninstall_alternative() %{_rec_macro_helper}%{lua:expand_macro("uninstall_alternative", "%**")}

%py_ver  %python_version

##### Python dependency generator macros #####

# === Macros for Build/Requires tags using Python dist tags ===
# - https://fedoraproject.org/wiki/Changes/Automatic_Provides_for_Python_RPM_Packages

# Converts Python dist name to a canonical format
%python_dist_name() %{lua:\
        name = rpm.expand("%{?1:%{1}}");\
        canonical = string.gsub(string.lower(name), "[^%w%.]+", "-");\
        print(canonical);\
}

# Creates Python 2 dist tag(s) after converting names to canonical format
#   Needs to first put all arguments into a list, because invoking a different
#   macro (%python_dist_name) overwrites them
%python2_dist() %{lua:\
        args = {}\
        arg = 1\
        while (true) do\
                name = rpm.expand("%{?" .. arg .. ":%{" .. arg .. "}}");\
                if (name == nil or name == '') then\
                        break\
                end\
                args[arg] = name\
                arg = arg + 1\
        end\
        for arg, name in ipairs(args) do\
                canonical = rpm.expand("%python_dist_name " .. name);\
                print("python" .. rpm.expand("%python2_version") .. "dist(" .. canonical .. ") ");\
        end\
}

# Creates Python 3 dist tag(s) after converting names to canonical format
#   Needs to first put all arguments into a list, because invoking a different
#   macro (%python_dist_name) overwrites them
%python3_dist() %{lua:\
        args = {}\
        arg = 1\
        while (true) do\
                name = rpm.expand("%{?" .. arg .. ":%{" .. arg .. "}}");\
                if (name == nil or name == '') then\
                        break\
                end\
                args[arg] = name\
                arg = arg + 1\
        end\
        for arg, name in ipairs(args) do\
                canonical = rpm.expand("%python_dist_name " .. name);\
                print("python" .. rpm.expand("%python3_version") .. "dist(" .. canonical .. ") ");\
        end\
}

# === Macros to control dependency generator ===
# - https://fedoraproject.org/wiki/Changes/EnablingPythonGenerators
%python_enable_dependency_generator() \
%global __pythondist_requires %{_rpmconfigdir}/pythondistdeps.py --requires \
%{nil}

##### Pytest macros #####

%pytest_arch(+abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-=) %{lua: local args = rpm.expand("%**") print(rpm.expand("%{python_expand PYTHONPATH=$PYTHONPATH:%{buildroot}%{$python_sitearch} PYTHONDONTWRITEBYTECODE=1 py.test-%{$python_bin_suffix} --ignore=_build.python2 --ignore=_build.python3 --ignore=_build.pypy3 -v " .. args .. "}")) }
%pytest(+abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-=) %{lua: local args = rpm.expand("%**") print(rpm.expand("%{python_expand PYTHONPATH=$PYTHONPATH:%{buildroot}%{$python_sitelib} PYTHONDONTWRITEBYTECODE=1 py.test-%{$python_bin_suffix} --ignore=_build.python2 --ignore=_build.python3 --ignore=_build.pypy3 -v " .. args .. "}")) }

##### PEP-518 macros #####
%pyproject_wheel(+abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-=) %{lua: local args = rpm.expand("%**") print(rpm.expand("%{python_expand $python -mpip wheel --no-deps %{?py_setup_args:--build-option %{py_setup_args}} --use-pep517 --no-build-isolation --progress-bar off --verbose . " .. args .. "}")) }

# No such option: --strip-file-prefix %%{buildroot} 
%pyproject_install(+abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-=) %{lua: local args = rpm.expand("%**") print(rpm.expand("%{python_expand $python -mpip install --root %{buildroot} --no-compile --no-deps  --progress-bar off *.whl " .. args .. "}")) }

#vi:tw=0
