Skip to content

Commit

Permalink
Subclass pkginfo's Installed class to find metadata
Browse files Browse the repository at this point in the history
When a package is installed as a wheel, pkginfo cannot properly find its
metadata. To resolve this, a patch has been posted to
https://bugs.launchpad.net/pkginfo/+bug/1437570 and those fixes have been
included here.

This silences UserWarnings from pkginfo about not being able to find
PKG-INFO for a package and allows twine to accurately report pkginfo's
version once installed.

Closes pypa#114
  • Loading branch information
sigmavirus24 committed Sep 13, 2015
1 parent d6dfdd4 commit 24bf8f0
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 1 deletion.
58 changes: 58 additions & 0 deletions twine/_installed.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# Copyright 2013 Tres Seaver
# Copyright 2015 Ian Cordasco
# This code was originally licensed under the Python Software Foudation
# License by Tres Seaver. In order to facilitate finding the metadata of
# installed packages, part of the most current implementation of the
# pkginfo.Installed class is reproduced here with bug fixes from
# https://bugs.launchpad.net/pkginfo/+bug/1437570.
import glob
import os
import sys
import warnings

import pkginfo


class Installed(pkginfo.Installed):

def read(self):
opj = os.path.join
if self.package is not None:
package = self.package.__package__
if package is None:
package = self.package.__name__
egg_pattern = '%s*.egg-info' % package
dist_pattern = '%s*.dist-info' % package
file = getattr(self.package, '__file__', None)
if file is not None:
candidates = []

def _add_candidate(where):
candidates.extend(glob.glob(where))

for entry in sys.path:
if file.startswith(entry):
_add_candidate(opj(entry, 'METADATA')) # egg?
_add_candidate(opj(entry, 'EGG-INFO')) # egg?
# dist-installed?
_add_candidate(opj(entry, egg_pattern))
_add_candidate(opj(entry, dist_pattern))
dir, name = os.path.split(self.package.__file__)
_add_candidate(opj(dir, egg_pattern))
_add_candidate(opj(dir, dist_pattern))
_add_candidate(opj(dir, '..', egg_pattern))
_add_candidate(opj(dir, '..', dist_pattern))

for candidate in candidates:
if os.path.isdir(candidate):
path = opj(candidate, 'PKG-INFO')
if not os.path.exists(path):
path = opj(candidate, 'METADATA')
else:
path = candidate
if os.path.exists(path):
with open(path) as f:
return f.read()

warnings.warn('No PKG-INFO or METADATA found for package: %s' %
self.package_name)
3 changes: 2 additions & 1 deletion twine/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import pkginfo

import twine
from twine._installed import Installed


def _registered_commands(group='twine.registered_commands'):
Expand All @@ -31,7 +32,7 @@ def _registered_commands(group='twine.registered_commands'):

def dep_versions():
return 'pkginfo: {0}, requests: {1}, setuptools: {2}'.format(
pkginfo.Installed(pkginfo).version,
Installed(pkginfo).version,
# __version__ is always defined but requests does not always have
# PKG-INFO to read from
requests.__version__,
Expand Down

0 comments on commit 24bf8f0

Please sign in to comment.