#39 Fix python(abi) generator (the one written in Python)
Merged 3 years ago by churchyard. Opened 3 years ago by churchyard.
rpms/ churchyard/python-rpm-generators distutils_no_no  into  rawhide

file modified
+6 -1
@@ -1,7 +1,7 @@ 

  Name:           python-rpm-generators

  Summary:        Dependency generators for Python RPMs

  Version:        12

- Release:        5%{?dist}

+ Release:        6%{?dist}

  

  # Originally all those files were part of RPM, so license is kept here

  License:        GPLv2+
@@ -47,6 +47,11 @@ 

  %{_rpmconfigdir}/pythonbundles.py

  

  %changelog

+ * Mon Apr 19 2021 Miro Hrončok <mhroncok@redhat.com> - 12-6

+ - Get rid of distutils deprecation warning (by not using it)

+ - The distutils module is deprecated in Python 3.10+

+ - https://www.python.org/dev/peps/pep-0632/

+ 

  * Wed Mar 31 2021 Miro Hrončok <mhroncok@redhat.com> - 12-5

  - Do not generate setuptools requirement for console_scripts on Python 3.10+

  - See https://fedoraproject.org/wiki/Changes/Reduce_dependencies_on_python3-setuptools

file modified
+5 -4
@@ -13,10 +13,10 @@ 

  

  from __future__ import print_function

  import argparse

- from distutils.sysconfig import get_python_lib

  from os.path import dirname, sep

  import re

- from sys import argv, stdin, stderr

+ from sys import argv, stdin, stderr, version_info

+ from sysconfig import get_path

  from warnings import warn

  

  from packaging.requirements import Requirement as Requirement_
@@ -341,8 +341,9 @@ 

          if py_abi and (lower.endswith('.py') or lower.endswith('.pyc') or lower.endswith('.pyo')):

              if name not in py_deps:

                  py_deps[name] = []

-             purelib = get_python_lib(standard_lib=0, plat_specific=0).split(version[:3])[0]

-             platlib = get_python_lib(standard_lib=0, plat_specific=1).split(version[:3])[0]

+             running_python_version = '{}.{}'.format(*version_info[:2])

+             purelib = get_path('purelib').split(running_python_version)[0]

+             platlib = get_path('platlib').split(running_python_version)[0]

              for lib in (purelib, platlib):

                  if lib in f:

                      spec = ('==', f.split(lib)[1].split(sep)[0])

There were three problems:

  • sys.version was not imported
  • sys.version[:3] is not reliable on Python 3.10+
  • distutils is deprecated on Python 3.10+

We were not hit by the missing import in Fedora because we only run the script
on .dist-info/.egg-info/.egg and not on .py files, so this if-branch never runs.

But when the script was fed with a .py path, it errored:

Traceback (most recent call last):
  File "/usr/lib/rpm/pythondistdeps.py", line 344, in <module>
    purelib = get_python_lib(standard_lib=0, plat_specific=0).split(version[:3])[0]
NameError: name 'version' is not defined

The sys.version[:3] thing kinda works for Python 3.10+ because in this
particular case
splitting on '3.1' and taking the prefix yields the same
results as splitting on '3.10', but I consider that mere coincidence.

Finally, since the distutils import happened at module-level,
we got the Deprecation warning in all Fedora's Python packages:

/usr/lib/rpm/pythondistdeps.py:16: DeprecationWarning: The distutils package is deprecated and slated for removal in Python 3.12

Backported from https://github.com/rpm-software-management/python-rpm-packaging/commit/d12e039037

Build succeeded.

The SPEC changes are trivial and the backport is the same as upstream. So from that POV, ack from me.

Pull-Request has been merged by churchyard

3 years ago