mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	requires and provides. requires is a sequence of strings, of the form 'packagename-version'. The dependency checking so far merely does an '__import__(packagename)' and checks for packagename.__version__ You can also leave off the version, and any version of the package will be installed. There's a special case for the package 'python' - sys.version_info is used, so requires= ( 'python-2.3', ) just works. Provides is of the same format as requires - but if it's not supplied, a provides is generated by adding the version to each entry in packages, or modules if packages isn't there. Provides is currently only used in the PKG-INFO file. Shortly, PyPI will grow the ability to accept these lines, and register will be updated to send them. There's a new command 'checkdep' command that runs these checks. For this version, only greater-than-or-equal checking is done. We'll add the ability to specify an optional operator later.
		
			
				
	
	
		
			70 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""distutils.command.x
 | 
						|
 | 
						|
Implements the Distutils 'x' command.
 | 
						|
"""
 | 
						|
 | 
						|
# created 2000/mm/dd, John Doe
 | 
						|
 | 
						|
__revision__ = "$Id$"
 | 
						|
 | 
						|
from distutils.core import Command
 | 
						|
 | 
						|
class DependencyFailure(Exception): pass
 | 
						|
 | 
						|
class VersionTooOld(DependencyFailure): pass
 | 
						|
 | 
						|
class VersionNotKnown(DependencyFailure): pass
 | 
						|
 | 
						|
class checkdep (Command):
 | 
						|
 | 
						|
    # Brief (40-50 characters) description of the command
 | 
						|
    description = "check package dependencies"
 | 
						|
 | 
						|
    # List of option tuples: long name, short name (None if no short
 | 
						|
    # name), and help string.
 | 
						|
    # Later on, we might have auto-fetch and the like here. Feel free.
 | 
						|
    user_options = []
 | 
						|
 | 
						|
    def initialize_options (self):
 | 
						|
        self.debug = None
 | 
						|
 | 
						|
    # initialize_options()
 | 
						|
 | 
						|
 | 
						|
    def finalize_options (self):
 | 
						|
        pass
 | 
						|
    # finalize_options()
 | 
						|
 | 
						|
 | 
						|
    def run (self):
 | 
						|
        from distutils.version import LooseVersion
 | 
						|
        failed = []
 | 
						|
        for pkg, ver in self.distribution.metadata.requires:
 | 
						|
            if pkg == 'python':
 | 
						|
                if ver is not None:
 | 
						|
                    # Special case the 'python' package
 | 
						|
                    import sys
 | 
						|
                    thisver = LooseVersion('%d.%d.%d'%sys.version_info[:3])
 | 
						|
                    if thisver < ver:
 | 
						|
                        failed.append(((pkg,ver), VersionTooOld(thisver)))
 | 
						|
                continue
 | 
						|
            # Kinda hacky - we should do more here
 | 
						|
            try:
 | 
						|
                mod = __import__(pkg)
 | 
						|
            except Exception, e:
 | 
						|
                failed.append(((pkg,ver), e))
 | 
						|
                continue
 | 
						|
            if ver is not None:
 | 
						|
                if hasattr(mod, '__version__'):
 | 
						|
                    thisver = LooseVersion(mod.__version__)
 | 
						|
                    if thisver < ver:
 | 
						|
                        failed.append(((pkg,ver), VersionTooOld(thisver)))
 | 
						|
                else:
 | 
						|
                    failed.append(((pkg,ver), VersionNotKnown()))
 | 
						|
 | 
						|
        if failed:
 | 
						|
            raise DependencyFailure, failed
 | 
						|
 | 
						|
    # run()
 | 
						|
 | 
						|
# class x
 |