14
0
forked from pool/python-pysnmp

- use poetry-core for building

- Update to version 4.4.6
     +  Promote the use of dedicated classes for dealing with OID-value pairs.
        Instances of those classes resemble OBJECT-IDENTITY, OBJECT-TYPE and
     +  Oneliner API reworked to become more generic: its LCD configuration
        shortcuts and and var-bindings processing code split off SNMP apps
        classes to stand-alone objects. The whole API also moved up in package
        naming hierarchy and becomes ‘pysnmp.hlapi.asyncore’ (hlapi is
        apparently an African fish). Old oneliner API remains fully operational
     +  Synchronous oneliner apps redesigned to offer Python generator-based
     +  Twisted API moved entirely into high-level domain to be aligned with
  + Sphinx documentation added to source code and example scripts. Library
  + Execution Observer facility implemented to give app an inside view of SNMP
    (and modifying) various internal states of pysnmp engine. Previously
    introduced non-standard APIs (like getting peer’s transport endpoint which
    +   Responding to SNMP requests from exactly the same IP address the query
  + Internal oneliner apps configuration cache moved from respective apps
    objects to [a singular] snmpEngine “user context” object. That would allow
    for better cache reuse and allow for a single app working with many
  + Oneliner GETBULK Command Generator now strips possible excessive OIDs off
  + Constraints assignment shortcut added to some base rfc1902 types (Integer,
  + Examples on a single Transport Dispatcher use with multiple SnmpEngine
  + AbstractTransportDispatcher’s jobStarted() and jobFinished() methods now
  + Oneliner transport object now supports setLocalAddress() method to force
  + New public DgramSocketTransport.getLocalAddress() returns local endpoint
  + Change to rfc2576.v1tov2() logic: errorStatus = noSuchName is now
    on the platform. It would help handling a really large number (>1024)
    addV3User() functions as well as to their oneliner's wrappers.
    in both Generator and Responder modes and better follow RFC2576
    untagged snmpCommunityTable entries will *not* match tagged

OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-pysnmp?expand=0&rev=51
This commit is contained in:
2024-02-01 08:13:03 +00:00
committed by Git OBS Bridge
parent 1435e5f96b
commit 9093923f20
2 changed files with 52 additions and 47 deletions

View File

@@ -1,3 +1,8 @@
-------------------------------------------------------------------
Thu Feb 1 08:12:53 UTC 2024 - Dirk Müller <dmueller@suse.com>
- use poetry-core for building
------------------------------------------------------------------- -------------------------------------------------------------------
Tue Aug 1 06:20:01 UTC 2023 - Steve Kowalik <steven.kowalik@suse.com> Tue Aug 1 06:20:01 UTC 2023 - Steve Kowalik <steven.kowalik@suse.com>
@@ -46,17 +51,17 @@ Wed Jul 31 20:44:55 UTC 2019 - Martin Hauke <mardnh@gmx.de>
- Update to version 4.4.10 - Update to version 4.4.10
* Reworked VACM access control function. Most important changes include: * Reworked VACM access control function. Most important changes include:
+ Added subtree match negation support (vacmViewTreeFamilyType) + Added subtree match negation support (vacmViewTreeFamilyType)
+ Added subtree family mask support (vacmViewTreeFamilyMask) + Added subtree family mask support (vacmViewTreeFamilyMask)
+ Added prefix content name matching support (vacmAccessContextMatch) + Added prefix content name matching support (vacmAccessContextMatch)
+ Added key VACM tables caching for better `isAccessAllowed` lookup + Added key VACM tables caching for better `isAccessAllowed` lookup
performance performance
One potential incompatibility may be caused by the `addContext()` call One potential incompatibility may be caused by the `addContext()` call
which now needs to be made explicitly during low-level VACM configuration which now needs to be made explicitly during low-level VACM configuration
rather than be a side effect of `addVacmAccess()` call. rather than be a side effect of `addVacmAccess()` call.
* Rebased MIB importing code onto `importlib` because `imp` is long * Rebased MIB importing code onto `importlib` because `imp` is long
deprecated deprecated
* Received MIB objects resolution made more forgiving to errors, added * Received MIB objects resolution made more forgiving to errors, added
@@ -112,7 +117,7 @@ Tue Dec 4 12:52:53 UTC 2018 - Matej Cepl <mcepl@suse.com>
------------------------------------------------------------------- -------------------------------------------------------------------
Thu Nov 27 17:56:55 UTC 2018 - alexander_naumov@opensuse.org Thu Nov 27 17:56:55 UTC 2018 - alexander_naumov@opensuse.org
- Update to version 4.4.6 - Update to version 4.4.6
* Improved package build and dependency tracking * Improved package build and dependency tracking
* Fixed missing LICENSE from the tarball distribution * Fixed missing LICENSE from the tarball distribution
* Fixed CommandGeneratorLcdConfigurator.unconfigure() to fully * Fixed CommandGeneratorLcdConfigurator.unconfigure() to fully
@@ -156,7 +161,7 @@ Fri Jun 29 13:17:52 UTC 2018 - mardnh@gmx.de
* Copyright notice extended to the year 2018 * Copyright notice extended to the year 2018
* Fixed short local key expansion at 3DES key localization * Fixed short local key expansion at 3DES key localization
implementation. implementation.
- Update to 4.4.3: - Update to 4.4.3:
* Migrated references from SourceForge * Migrated references from SourceForge
* Added missing SHA2 support for Blumenthal key localization * Added missing SHA2 support for Blumenthal key localization
@@ -357,28 +362,28 @@ Tue Oct 6 10:05:12 UTC 2015 - hpj@urpla.net
cache cache
+ newly introduced sendVarBinds() method offers a more functional and + newly introduced sendVarBinds() method offers a more functional and
logical signatures. logical signatures.
+ Promote the use of dedicated classes for dealing with OID-value pairs. + Promote the use of dedicated classes for dealing with OID-value pairs.
Instances of those classes resemble OBJECT-IDENTITY, OBJECT-TYPE and Instances of those classes resemble OBJECT-IDENTITY, OBJECT-TYPE and
NOTIFICATION-TYPE MIB structures. NOTIFICATION-TYPE MIB structures.
+ Oneliner API reworked to become more generic: its LCD configuration + Oneliner API reworked to become more generic: its LCD configuration
shortcuts and and var-bindings processing code split off SNMP apps shortcuts and and var-bindings processing code split off SNMP apps
classes to stand-alone objects. The whole API also moved up in package classes to stand-alone objects. The whole API also moved up in package
naming hierarchy and becomes pysnmp.hlapi.asyncore (hlapi is naming hierarchy and becomes pysnmp.hlapi.asyncore (hlapi is
apparently an African fish). Old oneliner API remains fully operational apparently an African fish). Old oneliner API remains fully operational
at its original location. at its original location.
+ Synchronous oneliner apps redesigned to offer Python generator-based + Synchronous oneliner apps redesigned to offer Python generator-based
API along with a more comprehensive set of accepted parameters. API along with a more comprehensive set of accepted parameters.
+ Asyncore-based asynchronous apps reworked to become functions. + Asyncore-based asynchronous apps reworked to become functions.
+ Twisted API moved entirely into high-level domain to be aligned with + Twisted API moved entirely into high-level domain to be aligned with
other high-level APIs. This WILL BREAK backward compatibility for those other high-level APIs. This WILL BREAK backward compatibility for those
apps that use Twisted API. apps that use Twisted API.
+ Keep backward compatibility for all existing major/documented interfaces + Keep backward compatibility for all existing major/documented interfaces
+ Sphinx documentation added to source code and example scripts. Library + Sphinx documentation added to source code and example scripts. Library
documentation converted from .html into RsT markup. documentation converted from .html into RsT markup.
+ Execution Observer facility implemented to give app an inside view of SNMP + Execution Observer facility implemented to give app an inside view of SNMP
engine inner workings. This is thought to be a generic framework for viewing engine inner workings. This is thought to be a generic framework for viewing
(and modifying) various internal states of pysnmp engine. Previously (and modifying) various internal states of pysnmp engine. Previously
introduced non-standard APIs (like getting peers transport endpoint which introduced non-standard APIs (like getting peers transport endpoint which
is not suggested in RFCs) will be gradually migrated to this new framework. is not suggested in RFCs) will be gradually migrated to this new framework.
+ Initial support for the asyncio & Trollius frameworks and coroutines-based + Initial support for the asyncio & Trollius frameworks and coroutines-based
SNMP Applications interfaces added. Both IPv4 and IPv6 datagram transports SNMP Applications interfaces added. Both IPv4 and IPv6 datagram transports
@@ -392,31 +397,31 @@ Tue Oct 6 10:05:12 UTC 2015 - hpj@urpla.net
following features were brought into pysnmp with this update: following features were brought into pysnmp with this update:
+ Sending SNMP packets from a non-local IP address + Sending SNMP packets from a non-local IP address
+ Receiving IP packets for non-local IP addresses + Receiving IP packets for non-local IP addresses
+ Responding to SNMP requests from exactly the same IP address the query + Responding to SNMP requests from exactly the same IP address the query
was sent to. This proves to be useful when listening on both primary and was sent to. This proves to be useful when listening on both primary and
secondary IP interfaces. secondary IP interfaces.
+ Internal oneliner apps configuration cache moved from respective apps + Internal oneliner apps configuration cache moved from respective apps
objects to [a singular] snmpEngine “user context” object. That would allow objects to [a singular] snmpEngine “user context” object. That would allow
for better cache reuse and allow for a single app working with many for better cache reuse and allow for a single app working with many
snmpEngine instances. snmpEngine instances.
+ Oneliner GETBULK Command Generator now strips possible excessive OIDs off + Oneliner GETBULK Command Generator now strips possible excessive OIDs off
the bottom of returned var-binds table. the bottom of returned var-binds table.
+ Constraints assignment shortcut added to some base rfc1902 types (Integer, + Constraints assignment shortcut added to some base rfc1902 types (Integer,
Integer32, OctetString, Bits). That formally constitutes ASN.1 sub-typing. Integer32, OctetString, Bits). That formally constitutes ASN.1 sub-typing.
+ Built-in debugging is now based on Python logging module. + Built-in debugging is now based on Python logging module.
+ Examples on a single Transport Dispatcher use with multiple SnmpEngine + Examples on a single Transport Dispatcher use with multiple SnmpEngine
instances applicatons added. instances applicatons added.
+ Example script on transport timeout & retries manipulation added. + Example script on transport timeout & retries manipulation added.
+ Example script explaining incoming messages communityName re-mapping added. + Example script explaining incoming messages communityName re-mapping added.
+ Broadcast socket option can now be enabled with the .enableBroadcast() call + Broadcast socket option can now be enabled with the .enableBroadcast() call
for any datagram-based transport (namely, UDP and UDP6). for any datagram-based transport (namely, UDP and UDP6).
+ AbstractTransportDispatchers jobStarted() and jobFinished() methods now + AbstractTransportDispatchers jobStarted() and jobFinished() methods now
accept optional count parameter which is a way for an app to indicate how accept optional count parameter which is a way for an app to indicate how
many responses are expected or have been processed in bulk. many responses are expected or have been processed in bulk.
+ Example script on SNMP Agents UDP broadcast-based discovery added. + Example script on SNMP Agents UDP broadcast-based discovery added.
+ Oneliner transport object now supports setLocalAddress() method to force + Oneliner transport object now supports setLocalAddress() method to force
socket binding to specified local interface. socket binding to specified local interface.
+ New public DgramSocketTransport.getLocalAddress() returns local endpoint + New public DgramSocketTransport.getLocalAddress() returns local endpoint
address underlying BSD socket is currently bound to. address underlying BSD socket is currently bound to.
+ Passing request details to access control callback at CommandResponder + Passing request details to access control callback at CommandResponder
reworked towards more robust and simple design with the execution observer reworked towards more robust and simple design with the execution observer
@@ -535,7 +540,7 @@ Sun Nov 24 20:56:12 UTC 2013 - p.drouand@gmail.com
scene. scene.
+ The $PYSNMP_MIB_DIR & $PYSNMP_MIB_DIRS & $PYSNMP_MIB_PKGS path separator + The $PYSNMP_MIB_DIR & $PYSNMP_MIB_DIRS & $PYSNMP_MIB_PKGS path separator
made platform +specific. made platform +specific.
+ Change to rfc2576.v1tov2() logic: errorStatus = noSuchName is now + Change to rfc2576.v1tov2() logic: errorStatus = noSuchName is now
translated into rfc1905.noSuchObject exception value for *all* var +bindings translated into rfc1905.noSuchObject exception value for *all* var +bindings
at once. Although RFC2576 does not suggest error +status +> v2c exception at once. Although RFC2576 does not suggest error +status +> v2c exception
translation, historically pysnmp used to perform it for a long time so we translation, historically pysnmp used to perform it for a long time so we
@@ -552,7 +557,7 @@ Sun Nov 24 20:56:12 UTC 2013 - p.drouand@gmail.com
+ The snmpCommunityTable row selection improved to follow RFC2576, clause + The snmpCommunityTable row selection improved to follow RFC2576, clause
5.2.1. 5.2.1.
+ Asyncore +based dispatcher attempts to use poll() whenever available + Asyncore +based dispatcher attempts to use poll() whenever available
on the platform. It would help handling a really large number (>1024) on the platform. It would help handling a really large number (>1024)
of file descriptors. of file descriptors.
+ AsynCommandGenerator.makeReadVarBinds() generalized into a new + AsynCommandGenerator.makeReadVarBinds() generalized into a new
makeVarBinds() method which replaces somewhat redundant code at setCmd() makeVarBinds() method which replaces somewhat redundant code at setCmd()
@@ -563,7 +568,7 @@ Sun Nov 24 20:56:12 UTC 2013 - p.drouand@gmail.com
specific securityName. specific securityName.
+ SNMP credentials management reworked to separate userName from securityName + SNMP credentials management reworked to separate userName from securityName
in snmpCommunityEntry and usmUserEntry tables. Changes made to addV1System(), in snmpCommunityEntry and usmUserEntry tables. Changes made to addV1System(),
addV3User() functions as well as to their oneliner's wrappers. addV3User() functions as well as to their oneliner's wrappers.
+ The contextEngineId parameter of config.addV3User() and auth.UsmUserData() + The contextEngineId parameter of config.addV3User() and auth.UsmUserData()
renamed into securityEngineId as it's semantically correct renamed into securityEngineId as it's semantically correct
+ Oneliner UsmUserData() and CommunityData() classes now support clone()'ing + Oneliner UsmUserData() and CommunityData() classes now support clone()'ing
@@ -588,9 +593,9 @@ Sun Nov 24 20:56:12 UTC 2013 - p.drouand@gmail.com
+ Fix to usmUserSecurityName table column implementation + + automatic value + Fix to usmUserSecurityName table column implementation + + automatic value
generation from index value removed. generation from index value removed.
+ Fix and significant logic rework of snmpCommunityTable to make it working + Fix and significant logic rework of snmpCommunityTable to make it working
in both Generator and Responder modes and better follow RFC2576 in both Generator and Responder modes and better follow RFC2576
requirements on sequential entries lookup and selection. As a side effect, requirements on sequential entries lookup and selection. As a side effect,
untagged snmpCommunityTable entries will *not* match tagged untagged snmpCommunityTable entries will *not* match tagged
snmpTargetAddrTable entries and vice versa. snmpTargetAddrTable entries and vice versa.
+ Fix to Twisted +based NotificationOriginator to make it serving INFORMs again. + Fix to Twisted +based NotificationOriginator to make it serving INFORMs again.
+ Fix to rfc2576.v1tov2() logic: errorStatus = noSuchName is now translated + Fix to rfc2576.v1tov2() logic: errorStatus = noSuchName is now translated
@@ -660,7 +665,7 @@ Wed Apr 24 05:04:49 UTC 2013 - highwaystar.ru@gmail.com
kinds of Management Instrumentation controllers. kinds of Management Instrumentation controllers.
- Report package version on debugging code initialization. - Report package version on debugging code initialization.
- MibInstrumController.getMibBuilder() added. - MibInstrumController.getMibBuilder() added.
- I/O sockets buffer sizes made configurable, minimum default is now - I/O sockets buffer sizes made configurable, minimum default is now
forced to be no less than 2**17 (to fit two huge datagrams). forced to be no less than 2**17 (to fit two huge datagrams).
- Catch possible exceptions on pyasn1 encoder invocation. - Catch possible exceptions on pyasn1 encoder invocation.
- VACM modules converted from a function into an object to let it keep - VACM modules converted from a function into an object to let it keep
@@ -671,7 +676,7 @@ Wed Apr 24 05:04:49 UTC 2013 - highwaystar.ru@gmail.com
NotificationOriginator.sendNotification() NotificationOriginator.sendNotification()
- Standard SNMPv3 Apps hardened to catch protocol-related exceptions and - Standard SNMPv3 Apps hardened to catch protocol-related exceptions and
report them as errorIndication's. report them as errorIndication's.
- Catch and mute possible failure of getsockname(), that seems to happen - Catch and mute possible failure of getsockname(), that seems to happen
on Windows only so far. on Windows only so far.
- Memory leak fixed at oneliner cache of already configured targets. - Memory leak fixed at oneliner cache of already configured targets.
- Fixes to at AsynNotificationOriginator.sendNotification() to make - Fixes to at AsynNotificationOriginator.sendNotification() to make
@@ -718,12 +723,12 @@ Wed Apr 24 05:04:49 UTC 2013 - highwaystar.ru@gmail.com
MIB lookup for name resolution. This is a new and preferred API which MIB lookup for name resolution. This is a new and preferred API which
obsoletes the tuple-based one (it is still suppored though). obsoletes the tuple-based one (it is still suppored though).
- Oneliner CommandGenerator's class attributes lexicographicMode, maxRows - Oneliner CommandGenerator's class attributes lexicographicMode, maxRows
and ignoreNonIncreasingOid moved to optional keyword args of nextGen() and ignoreNonIncreasingOid moved to optional keyword args of nextGen()
and bulkGen() methods. and bulkGen() methods.
- IPv6/UDP and Local Domain Socket transport interfaces added to the - IPv6/UDP and Local Domain Socket transport interfaces added to the
oneliner API. oneliner API.
- Mib Instrumentation subsystem re-worked to replace excessive - Mib Instrumentation subsystem re-worked to replace excessive
MibNode's smiCreate()/smiWrite()/smiDestroy() methods with MibNode's smiCreate()/smiWrite()/smiDestroy() methods with
MibScalarInstance's getValue()/setValue() MibScalarInstance's getValue()/setValue()
- MibTree.readTest[Get]Next() reworked to be called uniformely so - MibTree.readTest[Get]Next() reworked to be called uniformely so
user could tap on these methods at any level of the MIB tree. user could tap on these methods at any level of the MIB tree.
@@ -735,16 +740,16 @@ Wed Apr 24 05:04:49 UTC 2013 - highwaystar.ru@gmail.com
local hostname not to depend upon local IP availability and performance. local hostname not to depend upon local IP availability and performance.
- Example apps reworked, additional SNMPv3 auth/priv protocols and transports - Example apps reworked, additional SNMPv3 auth/priv protocols and transports
added. added.
- Package version is now available as __init__.__version__ and it is - Package version is now available as __init__.__version__ and it is
in-sync with distutils. in-sync with distutils.
- Package meta-information updated. - Package meta-information updated.
- The __init__.py's made non-empty (rumors are that they may be optimized - The __init__.py's made non-empty (rumors are that they may be optimized
out by package managers). out by package managers).
- Multiple fixes to UNIX domain socket transport to make it fully - Multiple fixes to UNIX domain socket transport to make it fully
operational again. operational again.
- Use sysUpTime value whenever it is included in Notification PDU, otheriwese - Use sysUpTime value whenever it is included in Notification PDU, otheriwese
resort to SNMP engine uptime reading. resort to SNMP engine uptime reading.
- SNMPv2c Message is now defined in rfc1901.py what matches standard - SNMPv2c Message is now defined in rfc1901.py what matches standard
definition. definition.
- Types defined within SNMPv1/v2c data structures (rfc1157.py/rfc1905.py) - Types defined within SNMPv1/v2c data structures (rfc1157.py/rfc1905.py)
moved to module scope to become accessible by wrapper routines moved to module scope to become accessible by wrapper routines
@@ -780,11 +785,11 @@ Wed Apr 24 05:04:49 UTC 2013 - highwaystar.ru@gmail.com
- The notificationType parameter of AsynNotificationOriginator.sendNotification - The notificationType parameter of AsynNotificationOriginator.sendNotification
made defaulted to reflect its optional nature. made defaulted to reflect its optional nature.
- Oneliner UsmUserData, UdpTransportTarget, Udp6TransportTarget instances - Oneliner UsmUserData, UdpTransportTarget, Udp6TransportTarget instances
are not hashable anymore as they are intended to act more like a data are not hashable anymore as they are intended to act more like a data
structure than object. structure than object.
- Built-in debugger now supports negating debugging categories. - Built-in debugger now supports negating debugging categories.
- An async/getgen.py example script added. - An async/getgen.py example script added.
- Fix to MIB data reading routine to make it working with possible - Fix to MIB data reading routine to make it working with possible
Windows end-of-line's. Windows end-of-line's.
- Fix to CommandGenerator's SNMPv3 engine autodiscovery algorithm - Fix to CommandGenerator's SNMPv3 engine autodiscovery algorithm
when retryCount is administratively set to 0. when retryCount is administratively set to 0.
@@ -799,7 +804,7 @@ Wed Apr 24 05:04:49 UTC 2013 - highwaystar.ru@gmail.com
- Fix to v1.PDUAPI.setDefaults() method that used to set wrongly typed - Fix to v1.PDUAPI.setDefaults() method that used to set wrongly typed
time-stamp component. time-stamp component.
- Fix to IPv6 address handling to prevent system from crashing whilst - Fix to IPv6 address handling to prevent system from crashing whilst
running Python3. running Python3.
- Fix to SNMPv2 exception objects translation into SNMPv1 PDU and NEXT - Fix to SNMPv2 exception objects translation into SNMPv1 PDU and NEXT
OIDs calculation. OIDs calculation.
- Fix to MibTree class to properly report noSuchObject & noSuchInstance - Fix to MibTree class to properly report noSuchObject & noSuchInstance
@@ -830,7 +835,7 @@ Wed Apr 24 05:04:49 UTC 2013 - highwaystar.ru@gmail.com
side-effect of this change is that repetitive oneliner call with the same side-effect of this change is that repetitive oneliner call with the same
securityName and different configuration options will only honor securityName and different configuration options will only honor
the first settings. Previous implementation would override older settings. the first settings. Previous implementation would override older settings.
- Transport dispatcher now provides its own time expressed in - Transport dispatcher now provides its own time expressed in
fractions of second. SNMP engine uses this notion of time for fractions of second. SNMP engine uses this notion of time for
handling requests timeout to make packet flow time bound handling requests timeout to make packet flow time bound
to async I/O core operations rather than to real time. to async I/O core operations rather than to real time.
@@ -879,7 +884,7 @@ Wed Apr 24 05:04:49 UTC 2013 - highwaystar.ru@gmail.com
- Fix to error processing at GETNEXT & GETBULK apps response handlers. - Fix to error processing at GETNEXT & GETBULK apps response handlers.
- Fix to libsmi2pysnmp to make it supporting long (256+) list of function - Fix to libsmi2pysnmp to make it supporting long (256+) list of function
params. params.
- Fix to libsmi2pysnmp to support inheritance of MIB types. - Fix to libsmi2pysnmp to support inheritance of MIB types.
------------------------------------------------------------------- -------------------------------------------------------------------
Sun Nov 27 08:35:10 UTC 2011 - jfunk@funktronics.ca Sun Nov 27 08:35:10 UTC 2011 - jfunk@funktronics.ca

View File

@@ -1,7 +1,7 @@
# #
# spec file for package python-pysnmp # spec file for package python-pysnmp
# #
# Copyright (c) 2023 SUSE LLC # Copyright (c) 2024 SUSE LLC
# #
# All modifications and additions to the file contributed by third parties # All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed # remain the property of their copyright owners, unless otherwise agreed
@@ -26,7 +26,7 @@ Source: https://github.com/lextudio/pysnmp/archive/refs/tags/v%{version}
# PATCH-FIX-UPSTREAM ish? Sourced from gh#pyasn1/pyasn1/issues/28 # PATCH-FIX-UPSTREAM ish? Sourced from gh#pyasn1/pyasn1/issues/28
Patch0: support-new-pyasn1.patch Patch0: support-new-pyasn1.patch
BuildRequires: %{python_module pip} BuildRequires: %{python_module pip}
BuildRequires: %{python_module poetry} BuildRequires: %{python_module poetry-core}
BuildRequires: %{python_module pysmi} BuildRequires: %{python_module pysmi}
BuildRequires: %{python_module wheel} BuildRequires: %{python_module wheel}
BuildRequires: fdupes BuildRequires: fdupes