mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	 05f842bae2
			
		
	
	
		05f842bae2
		
	
	
	
	
		
			
			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
 |