summaryrefslogtreecommitdiff
path: root/pkg_resources.py
diff options
context:
space:
mode:
authorPJ Eby <distutils-sig@python.org>2005-12-06 01:02:27 +0000
committerPJ Eby <distutils-sig@python.org>2005-12-06 01:02:27 +0000
commit6402ec9ba9bde14fa1c87047b62d56861c629cff (patch)
treeb267d6d8ab690cd88397c543cf7961f8f628514b /pkg_resources.py
parent969bfb31eb9417ae67d5e78467aeef401dd9bb62 (diff)
downloadpython-setuptools-git-6402ec9ba9bde14fa1c87047b62d56861c629cff.tar.gz
Added support for ``.egg-info`` files or directories with version/platform
information embedded in the filename, so that system packagers have the option of including ``PKG-INFO`` files to indicate the presence of a system-installed egg, without needing to use ``.egg`` directories, zipfiles, or ``.pth`` manipulation. --HG-- branch : setuptools extra : convert_revision : svn%3A6015fed2-1504-0410-9fe1-9d1591cc4771/sandbox/trunk/setuptools%4041615
Diffstat (limited to 'pkg_resources.py')
-rw-r--r--pkg_resources.py58
1 files changed, 29 insertions, 29 deletions
diff --git a/pkg_resources.py b/pkg_resources.py
index 371ef20d..a2147d6d 100644
--- a/pkg_resources.py
+++ b/pkg_resources.py
@@ -70,7 +70,7 @@ __all__ = [
'EGG_DIST', 'BINARY_DIST', 'SOURCE_DIST', 'CHECKOUT_DIST',
# "Provider" interfaces, implementations, and registration/lookup APIs
- 'IMetadataProvider', 'IResourceProvider',
+ 'IMetadataProvider', 'IResourceProvider', 'FileMetadata',
'PathMetadata', 'EggMetadata', 'EmptyProvider', 'empty_provider',
'NullProvider', 'EggProvider', 'DefaultProvider', 'ZipProvider',
'register_finder', 'register_namespace_handler', 'register_loader_type',
@@ -1155,31 +1155,31 @@ class ZipProvider(EggProvider):
register_loader_type(zipimport.zipimporter, ZipProvider)
+class FileMetadata(EmptyProvider):
+ """Metadata handler for standalone PKG-INFO files
+ Usage::
+ metadata = FileMetadata("/path/to/PKG-INFO")
+ This provider rejects all data and metadata requests except for PKG-INFO,
+ which is treated as existing, and will be the contents of the file at
+ the provided location.
+ """
+ def __init__(self,path):
+ self.path = path
+ def has_metadata(self,name):
+ return name=='PKG-INFO'
+ def get_metadata(self,name):
+ if name=='PKG-INFO':
+ return open(self.path,'rU').read()
+ raise KeyError("No metadata except PKG-INFO is available")
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ def get_metadata_lines(self,name):
+ return yield_lines(self.get_metadata(name))
@@ -1373,13 +1373,14 @@ def find_on_path(importer, path_item, only=False):
lower = entry.lower()
if lower.endswith('.egg-info'):
fullpath = os.path.join(path_item, entry)
- if os.path.isdir(fullpath):
- # development egg
+ metadata = None
+ if os.path.isdir(fullpath):
+ # egg-info directory, allow getting metadata
metadata = PathMetadata(path_item, fullpath)
- dist_name = os.path.splitext(entry)[0]
- yield Distribution(
- path_item, metadata, project_name=dist_name
- )
+ else:
+ metadata = FileMetadata(fullpath)
+ yield Distribution.from_location(path_item,entry,metadata)
+
elif not only and lower.endswith('.egg'):
for dist in find_distributions(os.path.join(path_item, entry)):
yield dist
@@ -1391,7 +1392,6 @@ def find_on_path(importer, path_item, only=False):
register_finder(ImpWrapper,find_on_path)
-
_namespace_handlers = {}
_namespace_packages = {}
@@ -1739,7 +1739,7 @@ class Distribution(object):
def from_location(cls,location,basename,metadata=None):
project_name, version, py_version, platform = [None]*4
basename, ext = os.path.splitext(basename)
- if ext.lower()==".egg":
+ if ext.lower() in (".egg",".egg-info"):
match = EGG_NAME(basename)
if match:
project_name, version, py_version, platform = match.group(
@@ -1754,13 +1754,13 @@ class Distribution(object):
hashcmp = property(
lambda self: (
getattr(self,'parsed_version',()), self.precedence, self.key,
- -len(self.location), self.location, self.py_version, self.platform
+ -len(self.location or ''), self.location, self.py_version,
+ self.platform
)
)
def __cmp__(self, other): return cmp(self.hashcmp, other)
def __hash__(self): return hash(self.hashcmp)
-
# These properties have to be lazy so that we don't have to load any
# metadata until/unless it's actually needed. (i.e., some distributions
# may not know their name or version without loading PKG-INFO)