64 lines
2.5 KiB
Python
64 lines
2.5 KiB
Python
import glob
|
|
import io
|
|
import os
|
|
import sys
|
|
import warnings
|
|
|
|
from .distribution import Distribution
|
|
from ._compat import STRING_TYPES
|
|
|
|
class Installed(Distribution):
|
|
|
|
def __init__(self, package, metadata_version=None):
|
|
if isinstance(package, STRING_TYPES):
|
|
self.package_name = package
|
|
try:
|
|
__import__(package)
|
|
except ImportError:
|
|
package = None
|
|
else:
|
|
package = sys.modules[package]
|
|
else:
|
|
self.package_name = package.__name__
|
|
self.package = package
|
|
self.metadata_version = metadata_version
|
|
self.extractMetadata()
|
|
|
|
def read(self):
|
|
opj = os.path.join
|
|
if self.package is not None:
|
|
package = self.package.__package__
|
|
if package in ('', None):
|
|
package = self.package.__name__
|
|
egg_pattern = '%s*.egg-info' % package
|
|
dist_pattern = '%s*.dist-info' % package
|
|
pkg_file = getattr(self.package, '__file__', None)
|
|
if pkg_file is not None:
|
|
candidates = []
|
|
def _add_candidate(where):
|
|
candidates.extend(glob.glob(where))
|
|
for entry in sys.path:
|
|
if pkg_file.startswith(entry):
|
|
_add_candidate(opj(entry, 'EGG-INFO')) # egg?
|
|
_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, '..', egg_pattern))
|
|
_add_candidate(opj(dir, dist_pattern))
|
|
_add_candidate(opj(dir, '..', dist_pattern))
|
|
for candidate in candidates:
|
|
if os.path.isdir(candidate):
|
|
if candidate.lower().endswith("egg-info"):
|
|
path = opj(candidate, 'PKG-INFO')
|
|
elif candidate.endswith("dist-info"):
|
|
path = opj(candidate, 'METADATA')
|
|
else: # pragma: NO COVER
|
|
continue
|
|
else:
|
|
path = candidate
|
|
if os.path.exists(path):
|
|
with io.open(path, errors='ignore') as f:
|
|
return f.read()
|
|
warnings.warn('No PKG-INFO found for package: %s' % self.package_name)
|