The fundamental abstraction provided by this pacakge is the Distribution base class. Implementations exist for specific cases: source distributions, binary distributions, installed pakcages, and development checkouts.
>>> from pkginfo import Distribution
>>> from pkginfo import SDist
>>> assert issubclass(SDist, Distribution)
>>> from pkginfo import UnpackedSDist
>>> assert issubclass(UnpackedSDist, SDist)
>>> from pkginfo import BDist
>>> assert issubclass(BDist, Distribution)
>>> from pkginfo import Wheel
>>> assert issubclass(Wheel, Distribution)
>>> from pkginfo import Installed
>>> assert issubclass(Installed, Distribution)
>>> from pkginfo import Develop
>>> assert issubclass(Develop, Distribution)
SDist objects are created from a filesystem path to the corresponding archive, which should have been created via the sdist command from distutils:
>>> mypackage = SDist('docs/examples/mypackage-0.1.tar.gz')
After creation, the SDist instance will have attributes corrsponding the the fields defined in the PEP corresponding to the metadata version, lower-cased and transliterated into valid Python identifiers by mapping hyphens to underscores. E.g.:
>>> print mypackage.metadata_version
1.0
>>> print mypackage.name
mypackage
>>> print mypackage.version
0.1
Fields which are optional under the PEP, and which have no value set in their PKG-INFO, will map to the value None:
>>> print mypackage.keywords
None
Fields which are marked “multiple use” under the PEP map onto sequences; their names are pluralized to indicate the sequence. “Multiple use” fields with no occurences in the PKG-INFO file will map onto an empty sequence:
>>> print list(mypackage.supported_platforms)
[]
See Metadata Versions for an example with a non-empty, “multiple-use” field.
You can also introspect a previously-unpacked package with UnpackedSDist either by passing it the path to the unpacked package, or by passing it the setup.py at the top level:
>>> mypackage = UnpackedSDist('docs/examples/mypackage-0.1')
>>> print mypackage.name
mypackage
>>> myotherpackage = UnpackedSDist('docs/examples/mypackage-0.1/setup.py')
>>> print myotherpackage.name
mypackage
UnpackedSDist objects are most useful in conjuction with distutils to produce sdists that want complex behavior for determining what metadata to use; these sdists normally break when installed with pip, because metadata in an sdist is regenerated when pip installed. You can achieve this in your setup.py as follows:
>>> from setuptools import dist, setup
>>> dist.Distribution(dict(setup_requires='pkginfo'))
>>> from pkginfo import UnpackedSDist
>>> try:
... d = UnpackedSDist(__file__)
... VERSION = d.version
... except ValueError:
... VERSION = (version_from_source_control() or
... os.getenv('VERSION', '1.0'))
>>> setup(name='mypackage', version=VERSION)
BDist objects are created from the filename, which should have been generated via setup.py bdist_egg.
>>> mypackage = BDist('docs/examples/mypackage-0.1-py2.6.egg')
After that, they have the same metadata as other Distribution objects,
Wheel objects are created from the filename, which should have been generated via setup.py bdist_wheel.
>>> mypackage = Wheel('docs/examples/mypackage-0.1-cp26-none-linux_x86_64.whl')
After that, they have the same metadata as other Distribution objects,
Installed objects are created from either a module object or its dotted name. Note that this feature only works in Python 2.6 or later: earlier Python versions did not record PKG-INFO for installed packages.
>>> import sys
>>> if sys.version_info >= (2,6):
... dotted = Installed('pkginfo')
... import pkginfo
... direct = Installed(pkginfo)
After that, they have the same metadata as other Distribution objects, assuming that the package on which they were based has a discoverable ‘.egg-info’ file / directory. To be discoverable, the ‘.egg-info’ must either be located inside the package (e.g., created via setup.py develop under setuptools), or adjacent to the package (e.g., created via setup.py instlall).
Develop objects are created from a path to a checkout containing a PKG-iNFO file, e.g., created by running setup.py develop under setuptools.
>>> develop = Develop('.')
After that, they have the same metadata as other Distribution objects.