Python packages can specify extras dependencies, which are sets of dependencies not
required for core functionality, and which generally correspond to some feature. These can
then be specified by downstream consumers of the package. For example, requests has an
entry in extras called security[1], which currently adds requirements of python packages
pyOpenSSL >= 0.14, cryptography >= 1.3.4, and idna >= 2.0.0. A downstream
consumer that wants to use this would add a dependency on requests[security].
From what I can tell, the current practice in Fedora packaging is to ignore these. This
simplifies packaging Python modules that have extras specified, but ultimately pushes the
specification of those dependencies down into every consumer of the package, whether users
or other packages.
As an example of this, I currently maintain the python-dns-lexicon package, which provides
a common CLI and API for various different DNS providers. Some of the providers have
additional dependencies that are necessary to function, and which are specified as extras.
The Plesk provider, for example, also requires python-xmltodict[2]. In line with what
appears to standard practice, extra dependencies are not currently installed with the
broader python-dns-lexicon package. If, however, a user or dependent package wants to
utilize the Plesk functionality of python-dns-lexicon, they now need to know that
python-xmltodict needs to be installed, and will need to check whenever the package
updates as to whether or not that has changed.
How should we be handling this? Right now, it seems that most packages follow this
behavior of punting on the responsibility to package consumers. Should this continue? If
not, how should we handle things? Should we just include all extras dependencies in the
parent package? Alternatively, should we have dummy/meta subpackages for extras that
require the parent package as well as any extras dependencies (e.g.
python-dns-lexicon-plesk would require python-dns-lexicon and python-xmltodict)?
[1]:
https://github.com/requests/requests/blob/v2.21.0/setup.py#L105
[2]:
https://github.com/AnalogJ/lexicon/blob/v3.0.6/setup.py#L101