#334 [Alternative implementation] Filter discovered modules to match the given %pyproject_save_files globs
Closed 2 years ago by churchyard. Opened 2 years ago by ksurma.
rpms/ ksurma/pyproject-rpm-macros alternative  into  rawhide

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

  When `%pyproject_save_files` is invoked,

  it creates a list of all valid and public (i.e. not starting with `_`)

  importable module names found in the package.

+ Each module name matches at least one of the globs provided as an argument to `%pyproject_save_files`.

  This list is then usable by `%pyproject_check_import` which performs an import check for each listed module.

  When a module fails to import, the build fails.

  

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

  #   Increment Y and reset Z when new macros or features are added

  #   Increment Z when this is a bugfix or a cosmetic change

  # Dropping support for EOL Fedoras is *not* considered a breaking change

- Version:        1.3.4

+ Version:        1.4.0

  Release:        1%{?dist}

  

  # Macro files
@@ -127,6 +127,11 @@ 

  %license LICENSE

  

  %changelog

+ * Fri Sep 23 2022 Karolina Surma <ksurma@redhat.com> - 1.4.0-1

+ - %%pyproject_save_files: save to %%_pyproject_modules only the module names

+   matching any of the given globs

+ - Fixes: rhbz#2127958

+ 

  * Tue Aug 30 2022 Otto Liljalaakso <otto.liljalaakso@iki.fi> - 1.3.4-1

  - Fix typo in internal function name

  

file modified
+21 -13
@@ -441,10 +441,14 @@ 

      return path

  

  

- def generate_file_list(paths_dict, module_globs, include_others=False):

+ def generate_file_and_module_list(paths_dict, module_globs, include_others=False):

      """

-     This function takes the classified paths_dict and turns it into lines

-     for the %files section. Returns list with text lines, no Path objects.

+     This function takes the classified paths_dict and:

+     - turns file data into lines for the %files section

+     - filters the qualified module names which match the module_globs

+ 

+     Returns tuple with a list of text lines, no Path objects; and a list of

+     importable module names.

  

      Only includes files from modules that match module_globs, metadata and

      optionaly all other files.
@@ -453,6 +457,7 @@ 

      Multiple globs matching identical module(s) are OK.

      """

      files = set()

+     filtered_module_names = set()

  

      if include_others:

          files.update(f"{escape_rpm_path(p)}" for p in paths_dict["other"]["files"])
@@ -467,6 +472,7 @@ 

          files.update(f"%{macro} {escape_rpm_path(p)}" for p in paths_dict["metadata"][f"{macro}s"])

  

      modules = paths_dict["modules"]

+     module_names = paths_dict["module_names"]

      done_modules = set()

      done_globs = set()

  
@@ -484,6 +490,12 @@ 

                          files.update(f"{escape_rpm_path(p)}" for p in module["files"])

                      done_modules.add(name)

                  done_globs.add(glob)

+         # Filter out the qualified module names that match given globs

+         for name in module_names:

+             # Match the top-level part of the module name, eg. 'foo.bar.baz' -> 'foo'

+             top_level_name = name.split(".")[0]

+             if fnmatch.fnmatchcase(top_level_name, glob):

+                 filtered_module_names.add(name)

  

      # Users using '*' don't care about the files in the package, so it's ok

      # not to fail the build when no modules are detected
@@ -496,7 +508,7 @@ 

          missed_text = ", ".join(sorted(missed))

          raise ValueError(f"Globs did not match any module: {missed_text}")

  

-     return sorted(files)

+     return sorted(files), sorted(filtered_module_names)

  

  

  def parse_varargs(varargs):
@@ -627,7 +639,7 @@ 

      parsed_records = load_parsed_record(pyproject_record)

  

      final_file_list = []

-     all_module_names = set()

+     final_module_list = []

  

      for record_path, files in parsed_records.items():

          metadata = dist_metadata(buildroot, record_path)
@@ -635,15 +647,11 @@ 

              record_path, files, metadata, sitedirs, python_version, prefix

          )

  

-         final_file_list.extend(

-             generate_file_list(paths_dict, globs, include_auto)

-         )

-         all_module_names.update(paths_dict["module_names"])

- 

-     # Sort values, so they are always checked in the same order

-     all_module_names = sorted(all_module_names)

+         files, modules = generate_file_and_module_list(paths_dict, globs, include_auto)

+         final_file_list.extend(files)

+         final_module_list.extend(modules)

  

-     return final_file_list, all_module_names

+     return final_file_list, final_module_list

  

  

  def main(cli_args):

@@ -18,6 +18,8 @@ 

          type: extension

      other:

        files: []

+     module_names:

+       - kerberos

    mistune:

      metadata:

        dirs:
@@ -43,6 +45,8 @@ 

          type: extension

      other:

        files: []

+     module_names:

+       - mistune

    requests:

      metadata:

        dirs:
@@ -100,6 +104,23 @@ 

          type: package

      other:

        files: []

+     module_names:

+       - requests

+       - requests.adapters

+       - requests.api

+       - requests.auth

+       - requests.certs

+       - requests.compat

+       - requests.cookies

+       - requests.exceptions

+       - requests.help

+       - requests.hooks

+       - requests.models

+       - requests.packages

+       - requests.sessions

+       - requests.status_codes

+       - requests.structures

+       - requests.utils

    tensorflow:

      metadata:

        dirs:
@@ -194,6 +215,20 @@ 

        - /usr/bin/tflite_convert

        - /usr/bin/toco

        - /usr/bin/toco_from_protos

+     module_names:

+       - tensorflow

+       - tensorflow_core

+       - tensorflow_core.lite

+       - tensorflow_core.lite.experimental

+       - tensorflow_core.python

+       - tensorflow_core.python.autograph

+       - tensorflow_core.python.autograph.converters

+       - tensorflow_core.python.autograph.converters.arg_defaults

+       - tensorflow_core.tools

+       - tensorflow_core.tools.common

+       - tensorflow_core.tools.docs

+       - tensorflow_core.tools.pip_package

+       - tensorflow_core.tools.pip_package.setup

    tldr:

      metadata:

        dirs:
@@ -218,6 +253,8 @@ 

        - /usr/bin/tldr

        - /usr/bin/tldr.py

        - /usr/share/man/man1/tldr*

+     module_names:

+       - tldr

    ipykernel:

      metadata:

        dirs:
@@ -378,6 +415,63 @@ 

        - /usr/share/jupyter/kernels/python3/logo-32x32.png

        - /usr/share/jupyter/kernels/python3/kernel.json

        - /usr/man/man5/ipykernel.5*

+     module_names:

+       - ipykernel

+       - ipykernel.codeutil

+       - ipykernel.comm

+       - ipykernel.comm.comm

+       - ipykernel.comm.manager

+       - ipykernel.connect

+       - ipykernel.datapub

+       - ipykernel.displayhook

+       - ipykernel.embed

+       - ipykernel.eventloops

+       - ipykernel.gui

+       - ipykernel.gui.gtk3embed

+       - ipykernel.gui.gtkembed

+       - ipykernel.heartbeat

+       - ipykernel.inprocess

+       - ipykernel.inprocess.blocking

+       - ipykernel.inprocess.channels

+       - ipykernel.inprocess.client

+       - ipykernel.inprocess.constants

+       - ipykernel.inprocess.ipkernel

+       - ipykernel.inprocess.manager

+       - ipykernel.inprocess.socket

+       - ipykernel.inprocess.tests

+       - ipykernel.inprocess.tests.test_kernel

+       - ipykernel.inprocess.tests.test_kernelmanager

+       - ipykernel.iostream

+       - ipykernel.ipkernel

+       - ipykernel.jsonutil

+       - ipykernel.kernelapp

+       - ipykernel.kernelbase

+       - ipykernel.kernelspec

+       - ipykernel.log

+       - ipykernel.parentpoller

+       - ipykernel.pickleutil

+       - ipykernel.pylab

+       - ipykernel.pylab.backend_inline

+       - ipykernel.pylab.config

+       - ipykernel.serialize

+       - ipykernel.tests

+       - ipykernel.tests.test_async

+       - ipykernel.tests.test_connect

+       - ipykernel.tests.test_embed_kernel

+       - ipykernel.tests.test_eventloop

+       - ipykernel.tests.test_heartbeat

+       - ipykernel.tests.test_io

+       - ipykernel.tests.test_jsonutil

+       - ipykernel.tests.test_kernel

+       - ipykernel.tests.test_kernelspec

+       - ipykernel.tests.test_message_spec

+       - ipykernel.tests.test_pickleutil

+       - ipykernel.tests.test_serialize

+       - ipykernel.tests.test_start_kernel

+       - ipykernel.tests.test_zmq_shell

+       - ipykernel.tests.utils

+       - ipykernel.trio_runner

+       - ipykernel.zmqshell

    zope:

      metadata:

        dirs:
@@ -409,6 +503,11 @@ 

      other:

        files:

        - /usr/lib/python3.7/site-packages/zope.event-4.4-py3.7-nspkg.pth

+     module_names:

+       - zope

+       - zope.event

+       - zope.event.classhandler

+       - zope.event.tests

    comic2pdf:

      metadata:

        dirs:
@@ -425,6 +524,7 @@ 

      other:

        files:

        - /usr/bin/comic2pdf.py

+     module_names: []

    django:

      metadata:

        dirs:
@@ -7194,6 +7294,822 @@ 

        files:

        - /usr/bin/django-admin

        - /usr/bin/django-admin.py

+     module_names:

+     - django

+     - django.apps

+     - django.apps.config

+     - django.apps.registry

+     - django.conf

+     - django.conf.global_settings

+     - django.conf.locale

+     - django.conf.locale.ar

+     - django.conf.locale.ar.formats

+     - django.conf.locale.az

+     - django.conf.locale.az.formats

+     - django.conf.locale.bg

+     - django.conf.locale.bg.formats

+     - django.conf.locale.bn

+     - django.conf.locale.bn.formats

+     - django.conf.locale.bs

+     - django.conf.locale.bs.formats

+     - django.conf.locale.ca

+     - django.conf.locale.ca.formats

+     - django.conf.locale.cs

+     - django.conf.locale.cs.formats

+     - django.conf.locale.cy

+     - django.conf.locale.cy.formats

+     - django.conf.locale.da

+     - django.conf.locale.da.formats

+     - django.conf.locale.de

+     - django.conf.locale.de.formats

+     - django.conf.locale.de_CH

+     - django.conf.locale.de_CH.formats

+     - django.conf.locale.el

+     - django.conf.locale.el.formats

+     - django.conf.locale.en

+     - django.conf.locale.en.formats

+     - django.conf.locale.en_AU

+     - django.conf.locale.en_AU.formats

+     - django.conf.locale.en_GB

+     - django.conf.locale.en_GB.formats

+     - django.conf.locale.eo

+     - django.conf.locale.eo.formats

+     - django.conf.locale.es

+     - django.conf.locale.es.formats

+     - django.conf.locale.es_AR

+     - django.conf.locale.es_AR.formats

+     - django.conf.locale.es_CO

+     - django.conf.locale.es_CO.formats

+     - django.conf.locale.es_MX

+     - django.conf.locale.es_MX.formats

+     - django.conf.locale.es_NI

+     - django.conf.locale.es_NI.formats

+     - django.conf.locale.es_PR

+     - django.conf.locale.es_PR.formats

+     - django.conf.locale.et

+     - django.conf.locale.et.formats

+     - django.conf.locale.eu

+     - django.conf.locale.eu.formats

+     - django.conf.locale.fa

+     - django.conf.locale.fa.formats

+     - django.conf.locale.fi

+     - django.conf.locale.fi.formats

+     - django.conf.locale.fr

+     - django.conf.locale.fr.formats

+     - django.conf.locale.fy

+     - django.conf.locale.fy.formats

+     - django.conf.locale.ga

+     - django.conf.locale.ga.formats

+     - django.conf.locale.gd

+     - django.conf.locale.gd.formats

+     - django.conf.locale.gl

+     - django.conf.locale.gl.formats

+     - django.conf.locale.he

+     - django.conf.locale.he.formats

+     - django.conf.locale.hi

+     - django.conf.locale.hi.formats

+     - django.conf.locale.hr

+     - django.conf.locale.hr.formats

+     - django.conf.locale.hu

+     - django.conf.locale.hu.formats

+     - django.conf.locale.id

+     - django.conf.locale.id.formats

+     - django.conf.locale.it

+     - django.conf.locale.it.formats

+     - django.conf.locale.ja

+     - django.conf.locale.ja.formats

+     - django.conf.locale.ka

+     - django.conf.locale.ka.formats

+     - django.conf.locale.km

+     - django.conf.locale.km.formats

+     - django.conf.locale.kn

+     - django.conf.locale.kn.formats

+     - django.conf.locale.ko

+     - django.conf.locale.ko.formats

+     - django.conf.locale.lt

+     - django.conf.locale.lt.formats

+     - django.conf.locale.lv

+     - django.conf.locale.lv.formats

+     - django.conf.locale.mk

+     - django.conf.locale.mk.formats

+     - django.conf.locale.ml

+     - django.conf.locale.ml.formats

+     - django.conf.locale.mn

+     - django.conf.locale.mn.formats

+     - django.conf.locale.nb

+     - django.conf.locale.nb.formats

+     - django.conf.locale.nl

+     - django.conf.locale.nl.formats

+     - django.conf.locale.nn

+     - django.conf.locale.nn.formats

+     - django.conf.locale.pl

+     - django.conf.locale.pl.formats

+     - django.conf.locale.pt

+     - django.conf.locale.pt.formats

+     - django.conf.locale.pt_BR

+     - django.conf.locale.pt_BR.formats

+     - django.conf.locale.ro

+     - django.conf.locale.ro.formats

+     - django.conf.locale.ru

+     - django.conf.locale.ru.formats

+     - django.conf.locale.sk

+     - django.conf.locale.sk.formats

+     - django.conf.locale.sl

+     - django.conf.locale.sl.formats

+     - django.conf.locale.sq

+     - django.conf.locale.sq.formats

+     - django.conf.locale.sr

+     - django.conf.locale.sr.formats

+     - django.conf.locale.sr_Latn

+     - django.conf.locale.sr_Latn.formats

+     - django.conf.locale.sv

+     - django.conf.locale.sv.formats

+     - django.conf.locale.ta

+     - django.conf.locale.ta.formats

+     - django.conf.locale.te

+     - django.conf.locale.te.formats

+     - django.conf.locale.th

+     - django.conf.locale.th.formats

+     - django.conf.locale.tr

+     - django.conf.locale.tr.formats

+     - django.conf.locale.uk

+     - django.conf.locale.uk.formats

+     - django.conf.locale.uz

+     - django.conf.locale.uz.formats

+     - django.conf.locale.vi

+     - django.conf.locale.vi.formats

+     - django.conf.locale.zh_Hans

+     - django.conf.locale.zh_Hans.formats

+     - django.conf.locale.zh_Hant

+     - django.conf.locale.zh_Hant.formats

+     - django.conf.urls

+     - django.conf.urls.i18n

+     - django.conf.urls.static

+     - django.contrib

+     - django.contrib.admin

+     - django.contrib.admin.actions

+     - django.contrib.admin.apps

+     - django.contrib.admin.checks

+     - django.contrib.admin.decorators

+     - django.contrib.admin.exceptions

+     - django.contrib.admin.filters

+     - django.contrib.admin.forms

+     - django.contrib.admin.helpers

+     - django.contrib.admin.migrations

+     - django.contrib.admin.models

+     - django.contrib.admin.options

+     - django.contrib.admin.sites

+     - django.contrib.admin.templatetags

+     - django.contrib.admin.templatetags.admin_list

+     - django.contrib.admin.templatetags.admin_modify

+     - django.contrib.admin.templatetags.admin_urls

+     - django.contrib.admin.templatetags.base

+     - django.contrib.admin.templatetags.log

+     - django.contrib.admin.tests

+     - django.contrib.admin.utils

+     - django.contrib.admin.views

+     - django.contrib.admin.views.autocomplete

+     - django.contrib.admin.views.decorators

+     - django.contrib.admin.views.main

+     - django.contrib.admin.widgets

+     - django.contrib.admindocs

+     - django.contrib.admindocs.apps

+     - django.contrib.admindocs.middleware

+     - django.contrib.admindocs.urls

+     - django.contrib.admindocs.utils

+     - django.contrib.admindocs.views

+     - django.contrib.auth

+     - django.contrib.auth.admin

+     - django.contrib.auth.apps

+     - django.contrib.auth.backends

+     - django.contrib.auth.base_user

+     - django.contrib.auth.checks

+     - django.contrib.auth.context_processors

+     - django.contrib.auth.decorators

+     - django.contrib.auth.forms

+     - django.contrib.auth.handlers

+     - django.contrib.auth.handlers.modwsgi

+     - django.contrib.auth.hashers

+     - django.contrib.auth.management

+     - django.contrib.auth.management.commands

+     - django.contrib.auth.management.commands.changepassword

+     - django.contrib.auth.management.commands.createsuperuser

+     - django.contrib.auth.middleware

+     - django.contrib.auth.migrations

+     - django.contrib.auth.mixins

+     - django.contrib.auth.models

+     - django.contrib.auth.password_validation

+     - django.contrib.auth.signals

+     - django.contrib.auth.tokens

+     - django.contrib.auth.urls

+     - django.contrib.auth.validators

+     - django.contrib.auth.views

+     - django.contrib.contenttypes

+     - django.contrib.contenttypes.admin

+     - django.contrib.contenttypes.apps

+     - django.contrib.contenttypes.checks

+     - django.contrib.contenttypes.fields

+     - django.contrib.contenttypes.forms

+     - django.contrib.contenttypes.management

+     - django.contrib.contenttypes.management.commands

+     - django.contrib.contenttypes.management.commands.remove_stale_contenttypes

+     - django.contrib.contenttypes.migrations

+     - django.contrib.contenttypes.models

+     - django.contrib.contenttypes.views

+     - django.contrib.flatpages

+     - django.contrib.flatpages.admin

+     - django.contrib.flatpages.apps

+     - django.contrib.flatpages.forms

+     - django.contrib.flatpages.middleware

+     - django.contrib.flatpages.migrations

+     - django.contrib.flatpages.models

+     - django.contrib.flatpages.sitemaps

+     - django.contrib.flatpages.templatetags

+     - django.contrib.flatpages.templatetags.flatpages

+     - django.contrib.flatpages.urls

+     - django.contrib.flatpages.views

+     - django.contrib.gis

+     - django.contrib.gis.admin

+     - django.contrib.gis.admin.options

+     - django.contrib.gis.admin.widgets

+     - django.contrib.gis.apps

+     - django.contrib.gis.db

+     - django.contrib.gis.db.backends

+     - django.contrib.gis.db.backends.base

+     - django.contrib.gis.db.backends.base.adapter

+     - django.contrib.gis.db.backends.base.features

+     - django.contrib.gis.db.backends.base.models

+     - django.contrib.gis.db.backends.base.operations

+     - django.contrib.gis.db.backends.mysql

+     - django.contrib.gis.db.backends.mysql.base

+     - django.contrib.gis.db.backends.mysql.features

+     - django.contrib.gis.db.backends.mysql.introspection

+     - django.contrib.gis.db.backends.mysql.operations

+     - django.contrib.gis.db.backends.mysql.schema

+     - django.contrib.gis.db.backends.oracle

+     - django.contrib.gis.db.backends.oracle.adapter

+     - django.contrib.gis.db.backends.oracle.base

+     - django.contrib.gis.db.backends.oracle.features

+     - django.contrib.gis.db.backends.oracle.introspection

+     - django.contrib.gis.db.backends.oracle.models

+     - django.contrib.gis.db.backends.oracle.operations

+     - django.contrib.gis.db.backends.oracle.schema

+     - django.contrib.gis.db.backends.postgis

+     - django.contrib.gis.db.backends.postgis.adapter

+     - django.contrib.gis.db.backends.postgis.base

+     - django.contrib.gis.db.backends.postgis.const

+     - django.contrib.gis.db.backends.postgis.features

+     - django.contrib.gis.db.backends.postgis.introspection

+     - django.contrib.gis.db.backends.postgis.models

+     - django.contrib.gis.db.backends.postgis.operations

+     - django.contrib.gis.db.backends.postgis.pgraster

+     - django.contrib.gis.db.backends.postgis.schema

+     - django.contrib.gis.db.backends.spatialite

+     - django.contrib.gis.db.backends.spatialite.adapter

+     - django.contrib.gis.db.backends.spatialite.base

+     - django.contrib.gis.db.backends.spatialite.client

+     - django.contrib.gis.db.backends.spatialite.features

+     - django.contrib.gis.db.backends.spatialite.introspection

+     - django.contrib.gis.db.backends.spatialite.models

+     - django.contrib.gis.db.backends.spatialite.operations

+     - django.contrib.gis.db.backends.spatialite.schema

+     - django.contrib.gis.db.backends.utils

+     - django.contrib.gis.db.models

+     - django.contrib.gis.db.models.aggregates

+     - django.contrib.gis.db.models.fields

+     - django.contrib.gis.db.models.functions

+     - django.contrib.gis.db.models.lookups

+     - django.contrib.gis.db.models.proxy

+     - django.contrib.gis.db.models.sql

+     - django.contrib.gis.db.models.sql.conversion

+     - django.contrib.gis.feeds

+     - django.contrib.gis.forms

+     - django.contrib.gis.forms.fields

+     - django.contrib.gis.forms.widgets

+     - django.contrib.gis.gdal

+     - django.contrib.gis.gdal.base

+     - django.contrib.gis.gdal.datasource

+     - django.contrib.gis.gdal.driver

+     - django.contrib.gis.gdal.envelope

+     - django.contrib.gis.gdal.error

+     - django.contrib.gis.gdal.feature

+     - django.contrib.gis.gdal.field

+     - django.contrib.gis.gdal.geometries

+     - django.contrib.gis.gdal.geomtype

+     - django.contrib.gis.gdal.layer

+     - django.contrib.gis.gdal.libgdal

+     - django.contrib.gis.gdal.prototypes

+     - django.contrib.gis.gdal.prototypes.ds

+     - django.contrib.gis.gdal.prototypes.errcheck

+     - django.contrib.gis.gdal.prototypes.generation

+     - django.contrib.gis.gdal.prototypes.geom

+     - django.contrib.gis.gdal.prototypes.raster

+     - django.contrib.gis.gdal.prototypes.srs

+     - django.contrib.gis.gdal.raster

+     - django.contrib.gis.gdal.raster.band

+     - django.contrib.gis.gdal.raster.base

+     - django.contrib.gis.gdal.raster.const

+     - django.contrib.gis.gdal.raster.source

+     - django.contrib.gis.gdal.srs

+     - django.contrib.gis.geoip2

+     - django.contrib.gis.geoip2.base

+     - django.contrib.gis.geoip2.resources

+     - django.contrib.gis.geometry

+     - django.contrib.gis.geos

+     - django.contrib.gis.geos.base

+     - django.contrib.gis.geos.collections

+     - django.contrib.gis.geos.coordseq

+     - django.contrib.gis.geos.error

+     - django.contrib.gis.geos.factory

+     - django.contrib.gis.geos.geometry

+     - django.contrib.gis.geos.io

+     - django.contrib.gis.geos.libgeos

+     - django.contrib.gis.geos.linestring

+     - django.contrib.gis.geos.mutable_list

+     - django.contrib.gis.geos.point

+     - django.contrib.gis.geos.polygon

+     - django.contrib.gis.geos.prepared

+     - django.contrib.gis.geos.prototypes

+     - django.contrib.gis.geos.prototypes.coordseq

+     - django.contrib.gis.geos.prototypes.errcheck

+     - django.contrib.gis.geos.prototypes.geom

+     - django.contrib.gis.geos.prototypes.io

+     - django.contrib.gis.geos.prototypes.misc

+     - django.contrib.gis.geos.prototypes.predicates

+     - django.contrib.gis.geos.prototypes.prepared

+     - django.contrib.gis.geos.prototypes.threadsafe

+     - django.contrib.gis.geos.prototypes.topology

+     - django.contrib.gis.management

+     - django.contrib.gis.management.commands

+     - django.contrib.gis.management.commands.inspectdb

+     - django.contrib.gis.management.commands.ogrinspect

+     - django.contrib.gis.measure

+     - django.contrib.gis.ptr

+     - django.contrib.gis.serializers

+     - django.contrib.gis.serializers.geojson

+     - django.contrib.gis.shortcuts

+     - django.contrib.gis.sitemaps

+     - django.contrib.gis.sitemaps.kml

+     - django.contrib.gis.sitemaps.views

+     - django.contrib.gis.utils

+     - django.contrib.gis.utils.layermapping

+     - django.contrib.gis.utils.ogrinfo

+     - django.contrib.gis.utils.ogrinspect

+     - django.contrib.gis.utils.srs

+     - django.contrib.gis.views

+     - django.contrib.humanize

+     - django.contrib.humanize.apps

+     - django.contrib.humanize.templatetags

+     - django.contrib.humanize.templatetags.humanize

+     - django.contrib.messages

+     - django.contrib.messages.api

+     - django.contrib.messages.apps

+     - django.contrib.messages.constants

+     - django.contrib.messages.context_processors

+     - django.contrib.messages.middleware

+     - django.contrib.messages.storage

+     - django.contrib.messages.storage.base

+     - django.contrib.messages.storage.cookie

+     - django.contrib.messages.storage.fallback

+     - django.contrib.messages.storage.session

+     - django.contrib.messages.utils

+     - django.contrib.messages.views

+     - django.contrib.postgres

+     - django.contrib.postgres.aggregates

+     - django.contrib.postgres.aggregates.general

+     - django.contrib.postgres.aggregates.mixins

+     - django.contrib.postgres.aggregates.statistics

+     - django.contrib.postgres.apps

+     - django.contrib.postgres.constraints

+     - django.contrib.postgres.fields

+     - django.contrib.postgres.fields.array

+     - django.contrib.postgres.fields.citext

+     - django.contrib.postgres.fields.hstore

+     - django.contrib.postgres.fields.jsonb

+     - django.contrib.postgres.fields.mixins

+     - django.contrib.postgres.fields.ranges

+     - django.contrib.postgres.fields.utils

+     - django.contrib.postgres.forms

+     - django.contrib.postgres.forms.array

+     - django.contrib.postgres.forms.hstore

+     - django.contrib.postgres.forms.jsonb

+     - django.contrib.postgres.forms.ranges

+     - django.contrib.postgres.functions

+     - django.contrib.postgres.indexes

+     - django.contrib.postgres.lookups

+     - django.contrib.postgres.operations

+     - django.contrib.postgres.search

+     - django.contrib.postgres.serializers

+     - django.contrib.postgres.signals

+     - django.contrib.postgres.utils

+     - django.contrib.postgres.validators

+     - django.contrib.redirects

+     - django.contrib.redirects.admin

+     - django.contrib.redirects.apps

+     - django.contrib.redirects.middleware

+     - django.contrib.redirects.migrations

+     - django.contrib.redirects.models

+     - django.contrib.sessions

+     - django.contrib.sessions.apps

+     - django.contrib.sessions.backends

+     - django.contrib.sessions.backends.base

+     - django.contrib.sessions.backends.cache

+     - django.contrib.sessions.backends.cached_db

+     - django.contrib.sessions.backends.db

+     - django.contrib.sessions.backends.file

+     - django.contrib.sessions.backends.signed_cookies

+     - django.contrib.sessions.base_session

+     - django.contrib.sessions.exceptions

+     - django.contrib.sessions.management

+     - django.contrib.sessions.management.commands

+     - django.contrib.sessions.management.commands.clearsessions

+     - django.contrib.sessions.middleware

+     - django.contrib.sessions.migrations

+     - django.contrib.sessions.models

+     - django.contrib.sessions.serializers

+     - django.contrib.sitemaps

+     - django.contrib.sitemaps.apps

+     - django.contrib.sitemaps.management

+     - django.contrib.sitemaps.management.commands

+     - django.contrib.sitemaps.management.commands.ping_google

+     - django.contrib.sitemaps.views

+     - django.contrib.sites

+     - django.contrib.sites.admin

+     - django.contrib.sites.apps

+     - django.contrib.sites.management

+     - django.contrib.sites.managers

+     - django.contrib.sites.middleware

+     - django.contrib.sites.migrations

+     - django.contrib.sites.models

+     - django.contrib.sites.requests

+     - django.contrib.sites.shortcuts

+     - django.contrib.staticfiles

+     - django.contrib.staticfiles.apps

+     - django.contrib.staticfiles.checks

+     - django.contrib.staticfiles.finders

+     - django.contrib.staticfiles.handlers

+     - django.contrib.staticfiles.management

+     - django.contrib.staticfiles.management.commands

+     - django.contrib.staticfiles.management.commands.collectstatic

+     - django.contrib.staticfiles.management.commands.findstatic

+     - django.contrib.staticfiles.management.commands.runserver

+     - django.contrib.staticfiles.storage

+     - django.contrib.staticfiles.testing

+     - django.contrib.staticfiles.urls

+     - django.contrib.staticfiles.utils

+     - django.contrib.staticfiles.views

+     - django.contrib.syndication

+     - django.contrib.syndication.apps

+     - django.contrib.syndication.views

+     - django.core

+     - django.core.asgi

+     - django.core.cache

+     - django.core.cache.backends

+     - django.core.cache.backends.base

+     - django.core.cache.backends.db

+     - django.core.cache.backends.dummy

+     - django.core.cache.backends.filebased

+     - django.core.cache.backends.locmem

+     - django.core.cache.backends.memcached

+     - django.core.cache.utils

+     - django.core.checks

+     - django.core.checks.caches

+     - django.core.checks.compatibility

+     - django.core.checks.database

+     - django.core.checks.messages

+     - django.core.checks.model_checks

+     - django.core.checks.registry

+     - django.core.checks.security

+     - django.core.checks.security.base

+     - django.core.checks.security.csrf

+     - django.core.checks.security.sessions

+     - django.core.checks.templates

+     - django.core.checks.translation

+     - django.core.checks.urls

+     - django.core.exceptions

+     - django.core.files

+     - django.core.files.base

+     - django.core.files.images

+     - django.core.files.locks

+     - django.core.files.move

+     - django.core.files.storage

+     - django.core.files.temp

+     - django.core.files.uploadedfile

+     - django.core.files.uploadhandler

+     - django.core.files.utils

+     - django.core.handlers

+     - django.core.handlers.asgi

+     - django.core.handlers.base

+     - django.core.handlers.exception

+     - django.core.handlers.wsgi

+     - django.core.mail

+     - django.core.mail.backends

+     - django.core.mail.backends.base

+     - django.core.mail.backends.console

+     - django.core.mail.backends.dummy

+     - django.core.mail.backends.filebased

+     - django.core.mail.backends.locmem

+     - django.core.mail.backends.smtp

+     - django.core.mail.message

+     - django.core.mail.utils

+     - django.core.management

+     - django.core.management.base

+     - django.core.management.color

+     - django.core.management.commands

+     - django.core.management.commands.check

+     - django.core.management.commands.compilemessages

+     - django.core.management.commands.createcachetable

+     - django.core.management.commands.dbshell

+     - django.core.management.commands.diffsettings

+     - django.core.management.commands.dumpdata

+     - django.core.management.commands.flush

+     - django.core.management.commands.inspectdb

+     - django.core.management.commands.loaddata

+     - django.core.management.commands.makemessages

+     - django.core.management.commands.makemigrations

+     - django.core.management.commands.migrate

+     - django.core.management.commands.runserver

+     - django.core.management.commands.sendtestemail

+     - django.core.management.commands.shell

+     - django.core.management.commands.showmigrations

+     - django.core.management.commands.sqlflush

+     - django.core.management.commands.sqlmigrate

+     - django.core.management.commands.sqlsequencereset

+     - django.core.management.commands.squashmigrations

+     - django.core.management.commands.startapp

+     - django.core.management.commands.startproject

+     - django.core.management.commands.test

+     - django.core.management.commands.testserver

+     - django.core.management.sql

+     - django.core.management.templates

+     - django.core.management.utils

+     - django.core.paginator

+     - django.core.serializers

+     - django.core.serializers.base

+     - django.core.serializers.json

+     - django.core.serializers.python

+     - django.core.serializers.pyyaml

+     - django.core.serializers.xml_serializer

+     - django.core.servers

+     - django.core.servers.basehttp

+     - django.core.signals

+     - django.core.signing

+     - django.core.validators

+     - django.core.wsgi

+     - django.db

+     - django.db.backends

+     - django.db.backends.base

+     - django.db.backends.base.base

+     - django.db.backends.base.client

+     - django.db.backends.base.creation

+     - django.db.backends.base.features

+     - django.db.backends.base.introspection

+     - django.db.backends.base.operations

+     - django.db.backends.base.schema

+     - django.db.backends.base.validation

+     - django.db.backends.ddl_references

+     - django.db.backends.dummy

+     - django.db.backends.dummy.base

+     - django.db.backends.dummy.features

+     - django.db.backends.mysql

+     - django.db.backends.mysql.base

+     - django.db.backends.mysql.client

+     - django.db.backends.mysql.compiler

+     - django.db.backends.mysql.creation

+     - django.db.backends.mysql.features

+     - django.db.backends.mysql.introspection

+     - django.db.backends.mysql.operations

+     - django.db.backends.mysql.schema

+     - django.db.backends.mysql.validation

+     - django.db.backends.oracle

+     - django.db.backends.oracle.base

+     - django.db.backends.oracle.client

+     - django.db.backends.oracle.creation

+     - django.db.backends.oracle.features

+     - django.db.backends.oracle.functions

+     - django.db.backends.oracle.introspection

+     - django.db.backends.oracle.operations

+     - django.db.backends.oracle.schema

+     - django.db.backends.oracle.utils

+     - django.db.backends.oracle.validation

+     - django.db.backends.postgresql

+     - django.db.backends.postgresql.base

+     - django.db.backends.postgresql.client

+     - django.db.backends.postgresql.creation

+     - django.db.backends.postgresql.features

+     - django.db.backends.postgresql.introspection

+     - django.db.backends.postgresql.operations

+     - django.db.backends.postgresql.schema

+     - django.db.backends.postgresql.utils

+     - django.db.backends.signals

+     - django.db.backends.sqlite3

+     - django.db.backends.sqlite3.base

+     - django.db.backends.sqlite3.client

+     - django.db.backends.sqlite3.creation

+     - django.db.backends.sqlite3.features

+     - django.db.backends.sqlite3.introspection

+     - django.db.backends.sqlite3.operations

+     - django.db.backends.sqlite3.schema

+     - django.db.backends.utils

+     - django.db.migrations

+     - django.db.migrations.autodetector

+     - django.db.migrations.exceptions

+     - django.db.migrations.executor

+     - django.db.migrations.graph

+     - django.db.migrations.loader

+     - django.db.migrations.migration

+     - django.db.migrations.operations

+     - django.db.migrations.operations.base

+     - django.db.migrations.operations.fields

+     - django.db.migrations.operations.models

+     - django.db.migrations.operations.special

+     - django.db.migrations.operations.utils

+     - django.db.migrations.optimizer

+     - django.db.migrations.questioner

+     - django.db.migrations.recorder

+     - django.db.migrations.serializer

+     - django.db.migrations.state

+     - django.db.migrations.utils

+     - django.db.migrations.writer

+     - django.db.models

+     - django.db.models.aggregates

+     - django.db.models.base

+     - django.db.models.constants

+     - django.db.models.constraints

+     - django.db.models.deletion

+     - django.db.models.enums

+     - django.db.models.expressions

+     - django.db.models.fields

+     - django.db.models.fields.files

+     - django.db.models.fields.mixins

+     - django.db.models.fields.proxy

+     - django.db.models.fields.related

+     - django.db.models.fields.related_descriptors

+     - django.db.models.fields.related_lookups

+     - django.db.models.fields.reverse_related

+     - django.db.models.functions

+     - django.db.models.functions.comparison

+     - django.db.models.functions.datetime

+     - django.db.models.functions.math

+     - django.db.models.functions.mixins

+     - django.db.models.functions.text

+     - django.db.models.functions.window

+     - django.db.models.indexes

+     - django.db.models.lookups

+     - django.db.models.manager

+     - django.db.models.options

+     - django.db.models.query

+     - django.db.models.query_utils

+     - django.db.models.signals

+     - django.db.models.sql

+     - django.db.models.sql.compiler

+     - django.db.models.sql.constants

+     - django.db.models.sql.datastructures

+     - django.db.models.sql.query

+     - django.db.models.sql.subqueries

+     - django.db.models.sql.where

+     - django.db.models.utils

+     - django.db.transaction

+     - django.db.utils

+     - django.dispatch

+     - django.dispatch.dispatcher

+     - django.forms

+     - django.forms.boundfield

+     - django.forms.fields

+     - django.forms.forms

+     - django.forms.formsets

+     - django.forms.models

+     - django.forms.renderers

+     - django.forms.utils

+     - django.forms.widgets

+     - django.http

+     - django.http.cookie

+     - django.http.multipartparser

+     - django.http.request

+     - django.http.response

+     - django.middleware

+     - django.middleware.cache

+     - django.middleware.clickjacking

+     - django.middleware.common

+     - django.middleware.csrf

+     - django.middleware.gzip

+     - django.middleware.http

+     - django.middleware.locale

+     - django.middleware.security

+     - django.shortcuts

+     - django.template

+     - django.template.backends

+     - django.template.backends.base

+     - django.template.backends.django

+     - django.template.backends.dummy

+     - django.template.backends.jinja2

+     - django.template.backends.utils

+     - django.template.base

+     - django.template.context

+     - django.template.context_processors

+     - django.template.defaultfilters

+     - django.template.defaulttags

+     - django.template.engine

+     - django.template.exceptions

+     - django.template.library

+     - django.template.loader

+     - django.template.loader_tags

+     - django.template.loaders

+     - django.template.loaders.app_directories

+     - django.template.loaders.base

+     - django.template.loaders.cached

+     - django.template.loaders.filesystem

+     - django.template.loaders.locmem

+     - django.template.response

+     - django.template.smartif

+     - django.template.utils

+     - django.templatetags

+     - django.templatetags.cache

+     - django.templatetags.i18n

+     - django.templatetags.l10n

+     - django.templatetags.static

+     - django.templatetags.tz

+     - django.test

+     - django.test.client

+     - django.test.html

+     - django.test.runner

+     - django.test.selenium

+     - django.test.signals

+     - django.test.testcases

+     - django.test.utils

+     - django.urls

+     - django.urls.base

+     - django.urls.conf

+     - django.urls.converters

+     - django.urls.exceptions

+     - django.urls.resolvers

+     - django.urls.utils

+     - django.utils

+     - django.utils.archive

+     - django.utils.asyncio

+     - django.utils.autoreload

+     - django.utils.baseconv

+     - django.utils.cache

+     - django.utils.crypto

+     - django.utils.datastructures

+     - django.utils.dateformat

+     - django.utils.dateparse

+     - django.utils.dates

+     - django.utils.datetime_safe

+     - django.utils.deconstruct

+     - django.utils.decorators

+     - django.utils.deprecation

+     - django.utils.duration

+     - django.utils.encoding

+     - django.utils.feedgenerator

+     - django.utils.formats

+     - django.utils.functional

+     - django.utils.hashable

+     - django.utils.html

+     - django.utils.http

+     - django.utils.inspect

+     - django.utils.ipv6

+     - django.utils.itercompat

+     - django.utils.jslex

+     - django.utils.log

+     - django.utils.lorem_ipsum

+     - django.utils.module_loading

+     - django.utils.numberformat

+     - django.utils.regex_helper

+     - django.utils.safestring

+     - django.utils.termcolors

+     - django.utils.text

+     - django.utils.timesince

+     - django.utils.timezone

+     - django.utils.topological_sort

+     - django.utils.translation

+     - django.utils.translation.reloader

+     - django.utils.translation.template

+     - django.utils.translation.trans_null

+     - django.utils.translation.trans_real

+     - django.utils.tree

+     - django.utils.version

+     - django.utils.xmlutils

+     - django.views

+     - django.views.csrf

+     - django.views.debug

+     - django.views.decorators

+     - django.views.decorators.cache

+     - django.views.decorators.clickjacking

+     - django.views.decorators.csrf

+     - django.views.decorators.debug

+     - django.views.decorators.gzip

+     - django.views.decorators.http

+     - django.views.decorators.vary

+     - django.views.defaults

+     - django.views.generic

+     - django.views.generic.base

+     - django.views.generic.dates

+     - django.views.generic.detail

+     - django.views.generic.edit

+     - django.views.generic.list

+     - django.views.i18n

+     - django.views.static

    printrun:

      metadata:

        dirs:
@@ -7359,6 +8275,51 @@ 

          - /usr/share/pronterface/reset.png

          - /usr/share/pronterface/zoom_in.png

          - /usr/share/pronterface/zoom_out.png

+     module_names:

+       - printrun

+       - printrun.eventhandler

+       - printrun.excluder

+       - printrun.gcodeplater

+       - printrun.gcoder

+       - printrun.gcview

+       - printrun.gl

+       - printrun.gl.libtatlin

+       - printrun.gl.libtatlin.actors

+       - printrun.gl.panel

+       - printrun.gl.trackball

+       - printrun.gui

+       - printrun.gui.bufferedcanvas

+       - printrun.gui.controls

+       - printrun.gui.graph

+       - printrun.gui.log

+       - printrun.gui.toolbar

+       - printrun.gui.utils

+       - printrun.gui.viz

+       - printrun.gui.widgets

+       - printrun.gui.xybuttons

+       - printrun.gui.zbuttons

+       - printrun.gviz

+       - printrun.injectgcode

+       - printrun.objectplater

+       - printrun.packer

+       - printrun.plugins

+       - printrun.plugins.sample

+       - printrun.power

+       - printrun.power.osx

+       - printrun.printcore

+       - printrun.projectlayer

+       - printrun.pronsole

+       - printrun.pronterface

+       - printrun.rpc

+       - printrun.settings

+       - printrun.spoolmanager

+       - printrun.spoolmanager.spoolmanager

+       - printrun.spoolmanager.spoolmanager_gui

+       - printrun.stlplater

+       - printrun.stltool

+       - printrun.stlview

+       - printrun.utils

+       - printrun.zscaper

  

  dumped:

  - - tensorflow
@@ -7755,7 +8716,6 @@ 

      - ipykernel.tests.utils

      - ipykernel.trio_runner

      - ipykernel.zmqshell

-     - ipykernel_launcher

  - - zope

    - zope

    - - '%dir /usr/lib/python3.7/site-packages/zope'

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

  

  from pyproject_preprocess_record import parse_record, read_record, save_parsed_record

  

- from pyproject_save_files import argparser, generate_file_list, BuildrootPath

+ from pyproject_save_files import argparser, generate_file_and_module_list, BuildrootPath

  from pyproject_save_files import main as save_files_main

  from pyproject_save_files import module_names_from_path

  
@@ -124,21 +124,22 @@ 

  

  @pytest.mark.parametrize("include_auto", (True, False))

  @pytest.mark.parametrize("package, glob, expected_files, expected_modules", EXPECTED_FILES)

- def test_generate_file_list(package, glob, expected_files, include_auto, expected_modules):

+ def test_generate_file_and_module_list(package, glob, expected_files, include_auto, expected_modules):

      paths_dict = EXPECTED_DICT[package]

      modules_glob = {glob}

      if not include_auto:

          expected_files = remove_others(expected_files)

-     tested = generate_file_list(paths_dict, modules_glob, include_auto)

+     tested_files, tested_modules = generate_file_and_module_list(paths_dict, modules_glob, include_auto)

  

-     assert tested == expected_files

+     assert tested_files == expected_files

+     assert tested_modules == expected_modules

  

  

- def test_generate_file_list_unused_glob():

+ def test_generate_file_and_module_list_unused_glob():

      paths_dict = EXPECTED_DICT["kerberos"]

      modules_glob = {"kerberos", "unused_glob1", "unused_glob2", "kerb*"}

      with pytest.raises(ValueError) as excinfo:

-         generate_file_list(paths_dict, modules_glob, True)

+         generate_file_and_module_list(paths_dict, modules_glob, True)

  

      assert "unused_glob1, unused_glob2" in str(excinfo.value)

      assert "kerb" not in str(excinfo.value)

file modified
+4
@@ -86,6 +86,10 @@ 

  grep -F %{python3_sitearch}/__pycache__/ldif.cpython-%{python3_version_nodots}.opt-1.pyc %{pyproject_files} && exit 1 || true

  grep -F %{python3_sitearch}/slapdtest %{pyproject_files} && exit 1 || true

  

+ # Internal check: Unmatched modules are not supposed to be listed in %%{_pyproject_modules}

+ grep -F slapdtest %{_pyproject_modules} && exit 1 || true

+ grep -F ldif %{_pyproject_modules} && exit 1 || true

+ 

  # Internal check: Top level __pycache__ is never owned

  grep -E '/site-packages/__pycache__$' %{pyproject_files} && exit 1 || true

  grep -E '/site-packages/__pycache__/$' %{pyproject_files} && exit 1 || true

This reuses generate_file_list to process the globs only once when invoking %pyproject_save_files. For each glob all the matching files are filtered and then all the matching qualified module names too. As a result, generate_file_and_module_list returns tuple - a list of files and a list of module names which is similar to how pyproject_save_files_and_modules operates. The test data had to be extended to actually test the full function, not just a half of it.

This approach gets rid of the need to process the data twice in 2D for loop, mentioned here: https://src.fedoraproject.org/rpms/pyproject-rpm-macros/pull-request/330
For that benefit we decrease the readability of the current (already huge) generate_file_list and increase the complexity of testing even more.

I'm more fond of the #330 solution as it better communicates what we aim to achieve. In my sample of rpm specs there is only a few packages providing 3 globs to %pyproject_save_files and none with 4 ones. Maybe iterating through the globs twice is not that severe.

Build succeeded.

Thanks for looking into the alternate solution. I agree with your findings.

Pull-Request has been closed by churchyard

2 years ago