#30 scripts/pythondistdeps: Backport switch to importlib.metadata from upstream
Merged 3 years ago by churchyard. Opened 3 years ago by torsava.
rpms/ torsava/python-rpm-generators importlib  into  rawhide

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

  Name:           python-rpm-generators

  Summary:        Dependency generators for Python RPMs

  Version:        12

- Release:        1%{?dist}

+ Release:        2%{?dist}

  

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

  License:        GPLv2+
@@ -21,7 +21,7 @@ 

  

  %package -n python3-rpm-generators

  Summary:        %{summary}

- Requires:       python3-setuptools

+ Requires:       python3-packaging

  # We have parametric macro generators, we need RPM 4.16 (4.15.90+ is 4.16 alpha)

  Requires:       rpm > 4.15.90-0

  # This contains the Lua functions we use:
@@ -47,6 +47,11 @@ 

  %{_rpmconfigdir}/pythonbundles.py

  

  %changelog

+ * Wed Feb 17 2021 Tomas Orsava <torsava@redhat.com> - 12-2

+ - scripts/pythondistdeps: Switch from using pkg_resources to importlib.metadata

+   for reading the egg/dist-info metadata

+ - The script no longer requires setuptools but instead requires packaging

+ 

  * Wed Feb 03 2021 Miro Hrončok <mhroncok@redhat.com> - 12-1

  - Disable the dist generators for Python 2

  - https://fedoraproject.org/wiki/Changes/Disable_Python_2_Dist_RPM_Generators_and_Freeze_Python_2_Macros

file modified
+151 -116
@@ -11,21 +11,85 @@ 

  # RPM python dependency generator, using .egg-info/.egg-link/.dist-info data

  #

  

- # Please know:

- # - Notes from an attempted rewrite from pkg_resources to importlib.metadata in

- #   2020 can be found in the message of the commit that added this line.

- 

  from __future__ import print_function

  import argparse

- from os.path import basename, dirname, isdir, sep

- from sys import argv, stdin, stderr, version

  from distutils.sysconfig import get_python_lib

+ from os.path import dirname, sep

+ import re

+ from sys import argv, stdin, stderr

  from warnings import warn

  

+ from packaging.requirements import Requirement as Requirement_

+ from packaging.version import parse

+ 

+ try:

+     from importlib.metadata import PathDistribution

+ except ImportError:

+     from importlib_metadata import PathDistribution

+ 

+ try:

+     from pathlib import Path

+ except ImportError:

+     from pathlib2 import Path

+ 

+ 

+ def normalize_name(name):

+     """https://www.python.org/dev/peps/pep-0503/#normalized-names"""

+     return re.sub(r'[-_.]+', '-', name).lower()

+ 

+ 

+ def legacy_normalize_name(name):

+     """Like pkg_resources Distribution.key property"""

+     return re.sub(r'[-_]+', '-', name).lower()

+ 

+ 

+ class Requirement(Requirement_):

+     def __init__(self, requirement_string):

+         super(Requirement, self).__init__(requirement_string)

+         self.normalized_name = normalize_name(self.name)

+         self.legacy_normalized_name = legacy_normalize_name(self.name)

+ 

+ 

+ class Distribution(PathDistribution):

+     def __init__(self, path):

+         super(Distribution, self).__init__(Path(path))

+         self.name = self.metadata['Name']

+         self.normalized_name = normalize_name(self.name)

+         self.legacy_normalized_name = legacy_normalize_name(self.name)

+         self.requirements = [Requirement(r) for r in self.requires or []]

+         self.extras = [

+             v for k, v in self.metadata.items() if k == 'Provides-Extra']

+         self.py_version = self._parse_py_version(path)

+ 

+     def _parse_py_version(self, path):

+         # Try to parse the Python version from the path the metadata

+         # resides at (e.g. /usr/lib/pythonX.Y/site-packages/...)

+         res = re.search(r"/python(?P<pyver>\d+\.\d+)/", path)

+         if res:

+             return res.group('pyver')

+         # If that hasn't worked, attempt to parse it from the metadata

+         # directory name

+         res = re.search(r"-py(?P<pyver>\d+.\d+)[.-]egg-info$", path)

+         if res:

+             return res.group('pyver')

+         return None

+ 

+     def requirements_for_extra(self, extra):

+         extra_deps = []

+         for req in self.requirements:

+             if not req.marker:

+                 continue

+             if req.marker.evaluate(get_marker_env(self, extra)):

+                 extra_deps.append(req)

+         return extra_deps

+ 

+     def __repr__(self):

+         return '{} from {}'.format(self.name, self._path)

+ 

  

  class RpmVersion():

      def __init__(self, version_id):

-         version = parse_version(version_id)

+         version = parse(version_id)

          if isinstance(version._version, str):

              self.version = version._version

          else:
@@ -144,10 +208,20 @@ 

                             format(version_id, name)) from exc

  

  

- def normalize_name(name):

-     """https://www.python.org/dev/peps/pep-0503/#normalized-names"""

-     import re

-     return re.sub(r'[-_.]+', '-', name).lower()

+ def get_marker_env(dist, extra):

+     # packaging uses a default environment using

+     # platform.python_version to evaluate if a dependency is relevant

+     # based on environment markers [1],

+     # e.g. requirement `argparse;python_version<"2.7"`

+     #

+     # Since we're running this script on one Python version while

+     # possibly evaluating packages for different versions, we

+     # set up an environment with the version we want to evaluate.

+     #

+     # [1] https://www.python.org/dev/peps/pep-0508/#environment-markers

+     return {"python_full_version": dist.py_version,

+             "python_version": dist.py_version,

+             "extra": extra}

  

  

  if __name__ == "__main__":
@@ -243,52 +317,21 @@ 

          if lower.endswith('.egg') or \

                  lower.endswith('.egg-info') or \

                  lower.endswith('.dist-info'):

-             # This import is very slow, so only do it if needed

-             # - Notes from an attempted rewrite from pkg_resources to

-             #   importlib.metadata in 2020 can be found in the message of

-             #   the commit that added this line.

-             from pkg_resources import Distribution, FileMetadata, PathMetadata, Requirement, parse_version

-             dist_name = basename(f)

-             if isdir(f):

-                 path_item = dirname(f)

-                 metadata = PathMetadata(path_item, f)

-             else:

-                 path_item = f

-                 metadata = FileMetadata(f)

-             dist = Distribution.from_location(path_item, dist_name, metadata)

-             # Check if py_version is defined in the metadata file/directory name

+             dist = Distribution(f)

              if not dist.py_version:

-                 # Try to parse the Python version from the path the metadata

-                 # resides at (e.g. /usr/lib/pythonX.Y/site-packages/...)

-                 import re

-                 res = re.search(r"/python(?P<pyver>\d+\.\d+)/", path_item)

-                 if res:

-                     dist.py_version = res.group('pyver')

-                 else:

-                     warn("Version for {!r} has not been found".format(dist), RuntimeWarning)

-                     continue

- 

-             # pkg_resources use platform.python_version to evaluate if a

-             # dependency is relevant based on environment markers [1],

-             # e.g. requirement `argparse;python_version<"2.7"`

-             #

-             # Since we're running this script on one Python version while

-             # possibly evaluating packages for different versions, we mock the

-             # platform.python_version function. Discussed upstream [2].

-             #

-             # [1] https://www.python.org/dev/peps/pep-0508/#environment-markers

-             # [2] https://github.com/pypa/setuptools/pull/1275

-             import platform

-             platform.python_version = lambda: dist.py_version

-             platform.python_version_tuple = lambda: tuple(dist.py_version.split('.'))

- 

-             # This is the PEP 503 normalized name.

-             # It does also convert dots to dashes, unlike dist.key.

-             # See https://bugzilla.redhat.com/show_bug.cgi?id=1791530

-             normalized_name = normalize_name(dist.project_name)

- 

-             # If we're processing an extras subpackage, check that the extras exists

-             if extras_subpackage and extras_subpackage not in dist.extras:

+                 warn("Version for {!r} has not been found".format(dist), RuntimeWarning)

+                 continue

+ 

+             # If processing an extras subpackage:

+             #   Check that the extras name is declared in the metadata, or

+             #   that there are some dependencies associated with the extras

+             #   name in the requires.txt (this is an outdated way to declare

+             #   extras packages).

+             # - If there is an extras package declared only in requires.txt

+             #   without any dependencies, this check will fail. In that case

+             #   make sure to use updated metadata and declare the extras

+             #   package there.

+             if extras_subpackage and extras_subpackage not in dist.extras and not dist.requirements_for_extra(extras_subpackage):

                  print("*** PYTHON_EXTRAS_NOT_FOUND_ERROR___SEE_STDERR ***")

                  print(f"\nError: The package name contains an extras name `{extras_subpackage}` that was not found in the metadata.\n"

                        "Check if the extras were removed from the project. If so, consider removing the subpackage and obsoleting it from another.\n", file=stderr)
@@ -301,32 +344,32 @@ 

              if args.provides:

                  extras_suffix = f"[{extras_subpackage}]" if extras_subpackage else ""

                  # If egg/dist metadata says package name is python, we provide python(abi)

-                 if dist.key == 'python':

+                 if dist.normalized_name == 'python':

                      name = 'python(abi)'

                      if name not in py_deps:

                          py_deps[name] = []

                      py_deps[name].append(('==', dist.py_version))

                  if not args.legacy or not args.majorver_only:

                      if normalized_names_provide_legacy:

-                         name = 'python{}dist({}{})'.format(dist.py_version, dist.key, extras_suffix)

+                         name = 'python{}dist({}{})'.format(dist.py_version, dist.legacy_normalized_name, extras_suffix)

                          if name not in py_deps:

                              py_deps[name] = []

                      if normalized_names_provide_pep503:

-                         name_ = 'python{}dist({}{})'.format(dist.py_version, normalized_name, extras_suffix)

+                         name_ = 'python{}dist({}{})'.format(dist.py_version, dist.normalized_name, extras_suffix)

                          if name_ not in py_deps:

                              py_deps[name_] = []

                  if args.majorver_provides or args.majorver_only or \

                          (args.majorver_provides_versions and dist.py_version in args.majorver_provides_versions):

                      if normalized_names_provide_legacy:

-                         pymajor_name = 'python{}dist({}{})'.format(pyver_major, dist.key, extras_suffix)

+                         pymajor_name = 'python{}dist({}{})'.format(pyver_major, dist.legacy_normalized_name, extras_suffix)

                          if pymajor_name not in py_deps:

                              py_deps[pymajor_name] = []

                      if normalized_names_provide_pep503:

-                         pymajor_name_ = 'python{}dist({}{})'.format(pyver_major, normalized_name, extras_suffix)

+                         pymajor_name_ = 'python{}dist({}{})'.format(pyver_major, dist.normalized_name, extras_suffix)

                          if pymajor_name_ not in py_deps:

                              py_deps[pymajor_name_] = []

                  if args.legacy or args.legacy_provides:

-                     legacy_name = 'pythonegg({})({})'.format(pyver_major, dist.key)

+                     legacy_name = 'pythonegg({})({})'.format(pyver_major, dist.legacy_normalized_name)

                      if legacy_name not in py_deps:

                          py_deps[legacy_name] = []

                  if dist.version:
@@ -351,7 +394,7 @@ 

              if args.requires or (args.recommends and dist.extras):

                  name = 'python(abi)'

                  # If egg/dist metadata says package name is python, we don't add dependency on python(abi)

-                 if dist.key == 'python':

+                 if dist.normalized_name == 'python':

                      py_abi = False

                      if name in py_deps:

                          py_deps.pop(name)
@@ -361,24 +404,21 @@ 

                      spec = ('==', dist.py_version)

                      if spec not in py_deps[name]:

                          py_deps[name].append(spec)

-                 deps = dist.requires()

-                 if args.recommends:

-                     depsextras = dist.requires(extras=dist.extras)

-                     if not args.requires:

-                         for dep in reversed(depsextras):

-                             if dep in deps:

-                                 depsextras.remove(dep)

-                     deps = depsextras

-                 elif extras_subpackage:

-                     # Extras requires also contain the base requires included

-                     deps = [d for d in dist.requires(extras=[extras_subpackage]) if d not in dist.requires()]

+ 

+                 if extras_subpackage:

+                     deps = [d for d in dist.requirements_for_extra(extras_subpackage)]

+                 else:

+                     deps = dist.requirements

+ 

                  # console_scripts/gui_scripts entry points need pkg_resources from setuptools

-                 if ((dist.get_entry_map('console_scripts') or

-                     dist.get_entry_map('gui_scripts')) and

+                 if (dist.entry_points and

                      (lower.endswith('.egg') or

                       lower.endswith('.egg-info'))):

-                     # stick them first so any more specific requirement overrides it

-                     deps.insert(0, Requirement.parse('setuptools'))

+                     groups = {ep.group for ep in dist.entry_points}

+                     if {"console_scripts", "gui_scripts"} & groups:

+                         # stick them first so any more specific requirement

+                         # overrides it

+                         deps.insert(0, Requirement('setuptools'))

                  # add requires/recommends based on egg/dist metadata

                  for dep in deps:

                      # Even if we're requiring `foo[bar]`, also require `foo`
@@ -389,67 +429,62 @@ 

                          # A dependency can have more than one extras,

                          # i.e. foo[bar,baz], so let's go through all of them

                          extras_suffixes += [f"[{e}]" for e in dep.extras]

+ 

                      for extras_suffix in extras_suffixes:

                          if normalized_names_require_pep503:

-                             dep_normalized_name = normalize_name(dep.project_name)

+                             dep_normalized_name = dep.normalized_name

                          else:

-                             dep_normalized_name = dep.key

+                             dep_normalized_name = dep.legacy_normalized_name

  

                          if args.legacy:

-                             name = 'pythonegg({})({})'.format(pyver_major, dep.key)

+                             name = 'pythonegg({})({})'.format(pyver_major, dep.legacy_normalized_name)

                          else:

                              if args.majorver_only:

                                  name = 'python{}dist({}{})'.format(pyver_major, dep_normalized_name, extras_suffix)

                              else:

                                  name = 'python{}dist({}{})'.format(dist.py_version, dep_normalized_name, extras_suffix)

-                         for spec in dep.specs:

-                             if name not in py_deps:

-                                 py_deps[name] = []

-                             if spec not in py_deps[name]:

-                                 py_deps[name].append(spec)

-                         if not dep.specs:

+ 

+                         if dep.marker and not args.recommends and not extras_subpackage:

+                             if not dep.marker.evaluate(get_marker_env(dist, '')):

+                                 continue

+ 

+                         if name not in py_deps:

                              py_deps[name] = []

+                         for spec in dep.specifier:

+                             if (spec.operator, spec.version) not in py_deps[name]:

+                                 py_deps[name].append((spec.operator, spec.version))

+ 

              # Unused, for automatic sub-package generation based on 'extras' from egg/dist metadata

              # TODO: implement in rpm later, or...?

              if args.extras:

-                 deps = dist.requires()

-                 extras = dist.extras

-                 print(extras)

-                 for extra in extras:

+                 print(dist.extras)

+                 for extra in dist.extras:

                      print('%%package\textras-{}'.format(extra))

-                     print('Summary:\t{} extra for {} python package'.format(extra, dist.key))

+                     print('Summary:\t{} extra for {} python package'.format(extra, dist.legacy_normalized_name))

                      print('Group:\t\tDevelopment/Python')

-                     depsextras = dist.requires(extras=[extra])

-                     for dep in reversed(depsextras):

-                         if dep in deps:

-                             depsextras.remove(dep)

-                     deps = depsextras

-                     for dep in deps:

-                         for spec in dep.specs:

-                             if spec[0] == '!=':

-                                 print('Conflicts:\t{} {} {}'.format(dep.key, '==', spec[1]))

+                     for dep in dist.requirements_for_extra(extra):

+                         for spec in dep.specifier:

+                             if spec.operator == '!=':

+                                 print('Conflicts:\t{} {} {}'.format(dep.legacy_normalized_name, '==', spec.version))

                              else:

-                                 print('Requires:\t{} {} {}'.format(dep.key, spec[0], spec[1]))

+                                 print('Requires:\t{} {} {}'.format(dep.legacy_normalized_name, spec.operator, spec.version))

                      print('%%description\t{}'.format(extra))

-                     print('{} extra for {} python package'.format(extra, dist.key))

+                     print('{} extra for {} python package'.format(extra, dist.legacy_normalized_name))

                      print('%%files\t\textras-{}\n'.format(extra))

              if args.conflicts:

                  # Should we really add conflicts for extras?

                  # Creating a meta package per extra with recommends on, which has

                  # the requires/conflicts in stead might be a better solution...

-                 for dep in dist.requires(extras=dist.extras):

-                     name = dep.key

-                     for spec in dep.specs:

-                         if spec[0] == '!=':

-                             if name not in py_deps:

-                                 py_deps[name] = []

-                             spec = ('==', spec[1])

-                             if spec not in py_deps[name]:

-                                 py_deps[name].append(spec)

- 

-     names = list(py_deps.keys())

-     names.sort()

-     for name in names:

+                 for dep in dist.requirements:

+                     for spec in dep.specifier:

+                         if spec.operator == '!=':

+                             if dep.legacy_normalized_name not in py_deps:

+                                 py_deps[dep.legacy_normalized_name] = []

+                             spec = ('==', spec.version)

+                             if spec not in py_deps[dep.legacy_normalized_name]:

+                                 py_deps[dep.legacy_normalized_name].append(spec)

+ 

+     for name in sorted(py_deps):

          if py_deps[name]:

              # Print out versioned provides, requires, recommends, conflicts

              spec_list = []

@@ -1,4 +1,3 @@ 

- # Taken from pyreq2rpm, removed tests that are expected to fail

  foobar0~=2.4.8

  foobar1~=2.4.8.0

  foobar2~=2.4.8.1
@@ -91,10 +90,8 @@ 

  pyparsing1>=2.0.1,!=2.0.4,!=2.1.2,!=2.1.6

  babel>=1.3,!=2.0

  

- # Tests for breakages in Fedora

  fedora-python-nb2plots==0+unknown

  

- # Other tests

  hugo1==1.0.0.dev7

  hugo2<=8a4

  hugo3!=11.1.1b14

@@ -1216,6 +1216,15 @@ 

                  python3dist(backports-range) = 3.7.2

                  python3dist(backports.range) = 3.7.2

              requires: python(abi) = 3.7

+ --requires --normalized-names-format pep503 --package-name python3-setuptools+certs:

+     --provides --majorver-provides --normalized-names-format pep503 --package-name python3-setuptools+certs:

+         usr/lib/python3.9/site-packages/setuptools-41.6.0.dist-info:

+             provides: |-

+                 python3.9dist(setuptools[certs]) = 41.6

+                 python3dist(setuptools[certs]) = 41.6

+             requires: |-

+                 python(abi) = 3.9

+                 python3.9dist(certifi) = 2016.9.26

  --requires --normalized-names-format pep503 --package-name python3-zope-component+testing:

      --provides --majorver-provides --normalized-names-format pep503 --package-name python3-zope-component+testing:

          usr/lib/python3.9/site-packages/zope.component-4.3.0-py3.9.egg-info:

Our relevant Fedora commits were reimplemented:
- scripts/pythondistdeps: Rework error messages
- scripts/pythondistdeps: Add parameter --package-name
- scripts/pythondistdeps: Implement provides/requires for extras packages
- pythondistdeps.py: When parsing extras name, take the rightmost +

Due to extras packages being hadled slightly differently by importlib, one test case for this was added.

rebased onto 003efa85b5ac85a51b135a8b4732f410a3196ee3

3 years ago

rebased onto 00892b442c9c2f0c8fd4daff63127f9f071cc41f

3 years ago

Commit message rewritten.

Build succeeded.

@torsava, I need you to bump the release before I run the builds.

$ (repoquery --repo=koji --whatrequires 'python3dist(*)' --whatrequires 'python3.9dist(*)' --source && repoquery --repo=koji --whatprovides 'python3dist(*)' --whatprovides 'python3.9dist(*)' --source) | pkgname | sort | uniq > dist.pkgs
$ parallel copr add-package-distgit @python/python-distgen-importlib --webhook-rebuild on --commit rawhide --name -- $(cat dist.pkgs)
...runs now...

rebased onto 5bf14024e16f46762dc6c434f45d74890569510d

3 years ago

rebased onto 8254db799490701bdbcb84c7cb5f5920c7121b37

3 years ago

Build succeeded.

Report by https://github.com/hroncok/compare_deps/blob/main/compare_deps.py

Comments inlined.

OK python3-cheroot has different requires in copr:
    python3.9dist(jaraco-functools)
    python3.9dist(more-itertools) >= 2.6
    python3.9dist(setuptools)
    python3.9dist(six) >= 1.11
    python3dist(jaraco.functools)
    python3dist(more-itertools) >= 2.6
    python3dist(six) >= 1.11
  - python3dist(trustme)    # https://src.fedoraproject.org/rpms/python-cheroot/c/7c3a5b93d02da56edfaefc6d43300923a9ce35eb?branch=rawhide

OK WARNING: pcp-pmda-sockets not found in rawhide

FIX python3-ipython+notebook has different requires in copr:
    python3.9dist(ipywidgets)
    python3.9dist(notebook)
  + python3.9dist(pexpect) > 4.3      # setup.py:  ':sys_platform != "win32"': ["pexpect>4.3"], FIX
    python3.9dist(setuptools)
WARNING: python3-ipython+notebook-7.20.0-1.fc34.noarch != python3-ipython+notebook-7.20.0-2.fc35.noarch

OK WARNING: pcp-pmda-hacluster not found in rawhide

OK python3-packit has different provides in copr:   # update
  - python3.9dist(packitos) = 0.24
  + python3.9dist(packitos) = 0.25
  - python3dist(packitos) = 0.24
  + python3dist(packitos) = 0.25
WARNING: python3-packit-0.24.0-2.fc34.noarch != python3-packit-0.25.0-1.fc35.noarch

OK flatbuffers-python3 has different provides in copr:
  - python3.9dist(flatbuffers) = 20210126061148  # autogenerated version based on build date, meh
  + python3.9dist(flatbuffers) = 20210218020909  # setup.py: # Default version is an ISO8601 compiliant datetime
  - python3dist(flatbuffers) = 20210126061148
  + python3dist(flatbuffers) = 20210218020909

OK python3-joblib has different provides in copr:  # update
  - python3.9dist(joblib) = 1
  + python3.9dist(joblib) = 1.0.1
  - python3dist(joblib) = 1
  + python3dist(joblib) = 1.0.1
WARNING: python3-joblib-1.0.0-2.fc34.noarch != python3-joblib-1.0.1-2.fc35.noarch

OK python3-mapclassify has different provides in copr:  # update
  - python3.9dist(mapclassify) = 2.3
  + python3.9dist(mapclassify) = 2.4.2
  - python3dist(mapclassify) = 2.3
  + python3dist(mapclassify) = 2.4.2
WARNING: python3-mapclassify-2.3.0-2.fc33.noarch != python3-mapclassify-2.4.2-1.fc35.noarch

OK ocrmypdf has different provides in copr:  # update
  - python3.9dist(ocrmypdf) = 11.6
  + python3.9dist(ocrmypdf) = 11.6.2
  - python3dist(ocrmypdf) = 11.6
  + python3dist(ocrmypdf) = 11.6.2
WARNING: ocrmypdf-11.6.0-1.fc34.noarch != ocrmypdf-11.6.2-1.fc35.noarch

OK python3-lit has different provides in copr:  # update
  - python3.9dist(lit) = 0.11.1~rc2
  + python3.9dist(lit) = 12~rc1
  - python3dist(lit) = 0.11.1~rc2
  + python3dist(lit) = 12~rc1
WARNING: python3-lit-0.11.1-3.rc2.fc34.noarch != python3-lit-12.0.0-0.1.rc1.fc35.noarch

OK python3-PyQt4 has different provides in copr:
  - python3.9dist(pyqt4) = 4.12.3-15.fc34
  + python3.9dist(pyqt4) = 4.12.3-15.fc35

OK python3-astroid has different provides in copr:  # update
  - python3.9dist(astroid) = 2.4.2
  + python3.9dist(astroid) = 2.5
  - python3dist(astroid) = 2.4.2
  + python3dist(astroid) = 2.5
WARNING: python3-astroid-2.4.2-3.git2d25e84.fc34.noarch != python3-astroid-2.5-1.git0f97f79.fc35.noarch

OK python3-fiona has different requires in copr:
    python3.9dist(attrs) >= 17
  + python3.9dist(certifi)  # https://github.com/Toblerity/Fiona/commit/5743a9600e80ab033ecb9b9275c0c3f954349e21
    python3.9dist(click-plugins) >= 1
    python3.9dist(cligj) >= 0.5
    python3.9dist(munch)
    python3.9dist(setuptools)
    python3.9dist(six) >= 1.7
OK python3-fiona has different provides in copr:  # update
  - python3.9dist(fiona) = 1.8.13
  + python3.9dist(fiona) = 1.8.18
  - python3dist(fiona) = 1.8.13
  + python3dist(fiona) = 1.8.18
WARNING: python3-fiona-1.8.13-5.fc33.x86_64 != python3-fiona-1.8.18-2.fc35.x86_64

OK python3-libNeuroML has different provides in copr: #update
  - python3.9dist(libneuroml) = 0.2.52
  + python3.9dist(libneuroml) = 0.2.54
  - python3dist(libneuroml) = 0.2.52
  + python3dist(libneuroml) = 0.2.54
WARNING: python3-libNeuroML-0.2.52-2.fc34.noarch != python3-libNeuroML-0.2.54-1.fc35.noarch

FIX ntpsec has different provides in copr:
  - python3.9dist(ntp) = 1.2
  + python3.9dist(ntpsec) = 1.2
  - python3dist(ntp) = 1.2
  + python3dist(ntpsec) = 1.2
  # The name of the package according to the metadata is "ntpsec", so this is a fix. Old script read the name from the egginfo filename instead of the metadata.

OK python3-pyshtools has different requires in copr:
    python3.9dist(astropy)
    python3.9dist(matplotlib)
  + python3.9dist(numpy) >= 1.20.1
  - python3.9dist(numpy) >= 1.20~rc2  #  'numpy>=' + str(numpy.__version__),
    python3.9dist(requests)
    python3.9dist(scipy) >= 0.14
    python3.9dist(xarray)



Checked 3474 packages

Not that the packages in copr were built from rawhide branch and might have different sources tan Fedora. We need to inspect the commits and if conditionals. When in doubt, we should rebuild the packages in a control copr.

I've just built the new 0.2.54 version of python-libNeuroML, so that's probably what's causing that one.

@mlichvar ntpsec has differ provides, but we believe they are more correct. previously they were based on filename of egg-info, now they are based on actual name in the metadata. let us now if you disagree.

Checked 4306 packages

I think we are good!

rebased onto 9f395a7cd9ba8e090a0eb6aba1abb59c22a73dfa

3 years ago

Build succeeded.

rebased onto e60ef67eadf0af024dc88eb82b471e976b9b1f54

3 years ago

rebased onto a965a92303841aed48f2eba0033c07e43f6f6815

3 years ago

rebased onto 747b93b01ddf734f2656897e7205b8bc4b40cc20

3 years ago

rebased onto 438d8d3

3 years ago

Build succeeded.

Pull-Request has been merged by churchyard

3 years ago