home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2012 January / maximum-cd-2012-01.iso / DiscContents / digsby_setup.exe / lib / pkg_resources.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2011-10-05  |  58.9 KB  |  2,077 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.6)
  3.  
  4. import sys
  5. import os
  6. import zipimport
  7. import time
  8. import re
  9. import imp
  10. import pkgutil
  11.  
  12. try:
  13.     frozenset
  14. except NameError:
  15.     from sets import ImmutableSet as frozenset
  16.  
  17. from os import utime, rename, unlink, mkdir
  18. from os import open as os_open
  19. from os.path import isdir, split
  20.  
  21. def _bypass_ensure_directory(name, mode = 511):
  22.     (dirname, filename) = split(name)
  23.     if dirname and filename and not isdir(dirname):
  24.         _bypass_ensure_directory(dirname)
  25.         mkdir(dirname, mode)
  26.     
  27.  
  28. _state_vars = { }
  29.  
  30. def _declare_state(vartype, **kw):
  31.     g = globals()
  32.     for name, val in kw.iteritems():
  33.         g[name] = val
  34.         _state_vars[name] = vartype
  35.     
  36.  
  37.  
  38. def __getstate__():
  39.     state = { }
  40.     g = globals()
  41.     for k, v in _state_vars.iteritems():
  42.         state[k] = g['_sget_' + v](g[k])
  43.     
  44.     return state
  45.  
  46.  
  47. def __setstate__(state):
  48.     g = globals()
  49.     for k, v in state.iteritems():
  50.         g['_sset_' + _state_vars[k]](k, g[k], v)
  51.     
  52.     return state
  53.  
  54.  
  55. def _sget_dict(val):
  56.     return val.copy()
  57.  
  58.  
  59. def _sset_dict(key, ob, state):
  60.     ob.clear()
  61.     ob.update(state)
  62.  
  63.  
  64. def _sget_object(val):
  65.     return val.__getstate__()
  66.  
  67.  
  68. def _sset_object(key, ob, state):
  69.     ob.__setstate__(state)
  70.  
  71. _sget_none = _sset_none = (lambda : pass)
  72.  
  73. def get_supported_platform():
  74.     plat = get_build_platform()
  75.     m = macosVersionString.match(plat)
  76.     if m is not None and sys.platform == 'darwin':
  77.         
  78.         try:
  79.             plat = 'macosx-%s-%s' % ('.'.join(_macosx_vers()[:2]), m.group(3))
  80.         except ValueError:
  81.             pass
  82.         except:
  83.             None<EXCEPTION MATCH>ValueError
  84.         
  85.  
  86.     None<EXCEPTION MATCH>ValueError
  87.     return plat
  88.  
  89. __all__ = [
  90.     'require',
  91.     'run_script',
  92.     'get_provider',
  93.     'get_distribution',
  94.     'load_entry_point',
  95.     'get_entry_map',
  96.     'get_entry_info',
  97.     'iter_entry_points',
  98.     'resource_string',
  99.     'resource_stream',
  100.     'resource_filename',
  101.     'resource_listdir',
  102.     'resource_exists',
  103.     'resource_isdir',
  104.     'declare_namespace',
  105.     'working_set',
  106.     'add_activation_listener',
  107.     'find_distributions',
  108.     'set_extraction_path',
  109.     'cleanup_resources',
  110.     'get_default_cache',
  111.     'Environment',
  112.     'WorkingSet',
  113.     'ResourceManager',
  114.     'Distribution',
  115.     'Requirement',
  116.     'EntryPoint',
  117.     'ResolutionError',
  118.     'VersionConflict',
  119.     'DistributionNotFound',
  120.     'UnknownExtra',
  121.     'ExtractionError',
  122.     'parse_requirements',
  123.     'parse_version',
  124.     'safe_name',
  125.     'safe_version',
  126.     'get_platform',
  127.     'compatible_platforms',
  128.     'yield_lines',
  129.     'split_sections',
  130.     'safe_extra',
  131.     'to_filename',
  132.     'ensure_directory',
  133.     'normalize_path',
  134.     'EGG_DIST',
  135.     'BINARY_DIST',
  136.     'SOURCE_DIST',
  137.     'CHECKOUT_DIST',
  138.     'DEVELOP_DIST',
  139.     'IMetadataProvider',
  140.     'IResourceProvider',
  141.     'FileMetadata',
  142.     'PathMetadata',
  143.     'EggMetadata',
  144.     'EmptyProvider',
  145.     'empty_provider',
  146.     'NullProvider',
  147.     'EggProvider',
  148.     'DefaultProvider',
  149.     'ZipProvider',
  150.     'register_finder',
  151.     'register_namespace_handler',
  152.     'register_loader_type',
  153.     'fixup_namespace_packages',
  154.     'get_importer',
  155.     'run_main',
  156.     'AvailableDistributions']
  157.  
  158. class ResolutionError(Exception):
  159.     
  160.     def __repr__(self):
  161.         return self.__class__.__name__ + repr(self.args)
  162.  
  163.  
  164.  
  165. class VersionConflict(ResolutionError):
  166.     pass
  167.  
  168.  
  169. class DistributionNotFound(ResolutionError):
  170.     pass
  171.  
  172.  
  173. class UnknownExtra(ResolutionError):
  174.     pass
  175.  
  176. _provider_factories = { }
  177. PY_MAJOR = sys.version[:3]
  178. EGG_DIST = 3
  179. BINARY_DIST = 2
  180. SOURCE_DIST = 1
  181. CHECKOUT_DIST = 0
  182. DEVELOP_DIST = -1
  183.  
  184. def register_loader_type(loader_type, provider_factory):
  185.     _provider_factories[loader_type] = provider_factory
  186.  
  187.  
  188. def get_provider(moduleOrReq):
  189.     if isinstance(moduleOrReq, Requirement):
  190.         if not working_set.find(moduleOrReq):
  191.             pass
  192.         return require(str(moduleOrReq))[0]
  193.     
  194.     try:
  195.         module = sys.modules[moduleOrReq]
  196.     except KeyError:
  197.         isinstance(moduleOrReq, Requirement)
  198.         isinstance(moduleOrReq, Requirement)
  199.         __import__(moduleOrReq)
  200.         module = sys.modules[moduleOrReq]
  201.     except:
  202.         isinstance(moduleOrReq, Requirement)
  203.  
  204.     loader = getattr(module, '__loader__', None)
  205.     return _find_adapter(_provider_factories, loader)(module)
  206.  
  207.  
  208. def _macosx_vers(_cache = []):
  209.     if not _cache:
  210.         mac_ver = mac_ver
  211.         import platform
  212.         _cache.append(mac_ver()[0].split('.'))
  213.     
  214.     return _cache[0]
  215.  
  216.  
  217. def _macosx_arch(machine):
  218.     return {
  219.         'PowerPC': 'ppc',
  220.         'Power_Macintosh': 'ppc' }.get(machine, machine)
  221.  
  222.  
  223. def get_build_platform():
  224.     get_platform = get_platform
  225.     import distutils.util
  226.     plat = get_platform()
  227.     if sys.platform == 'darwin' and not plat.startswith('macosx-'):
  228.         
  229.         try:
  230.             version = _macosx_vers()
  231.             machine = os.uname()[4].replace(' ', '_')
  232.             return 'macosx-%d.%d-%s' % (int(version[0]), int(version[1]), _macosx_arch(machine))
  233.         except ValueError:
  234.             pass
  235.         except:
  236.             None<EXCEPTION MATCH>ValueError
  237.         
  238.  
  239.     None<EXCEPTION MATCH>ValueError
  240.     return plat
  241.  
  242. macosVersionString = re.compile('macosx-(\\d+)\\.(\\d+)-(.*)')
  243. darwinVersionString = re.compile('darwin-(\\d+)\\.(\\d+)\\.(\\d+)-(.*)')
  244. get_platform = get_build_platform
  245.  
  246. def compatible_platforms(provided, required):
  247.     if provided is None and required is None or provided == required:
  248.         return True
  249.     reqMac = macosVersionString.match(required)
  250.     if reqMac:
  251.         provMac = macosVersionString.match(provided)
  252.         if not provMac:
  253.             provDarwin = darwinVersionString.match(provided)
  254.             return False
  255.         if provMac.group(1) != reqMac.group(1) or provMac.group(3) != reqMac.group(3):
  256.             return False
  257.         if int(provMac.group(2)) > int(reqMac.group(2)):
  258.             return False
  259.         return True
  260.     return False
  261.  
  262.  
  263. def run_script(dist_spec, script_name):
  264.     ns = sys._getframe(1).f_globals
  265.     name = ns['__name__']
  266.     ns.clear()
  267.     ns['__name__'] = name
  268.     require(dist_spec)[0].run_script(script_name, ns)
  269.  
  270. run_main = run_script
  271.  
  272. def get_distribution(dist):
  273.     if isinstance(dist, basestring):
  274.         dist = Requirement.parse(dist)
  275.     
  276.     if isinstance(dist, Requirement):
  277.         dist = get_provider(dist)
  278.     
  279.     if not isinstance(dist, Distribution):
  280.         raise TypeError('Expected string, Requirement, or Distribution', dist)
  281.     isinstance(dist, Distribution)
  282.     return dist
  283.  
  284.  
  285. def load_entry_point(dist, group, name):
  286.     return get_distribution(dist).load_entry_point(group, name)
  287.  
  288.  
  289. def get_entry_map(dist, group = None):
  290.     return get_distribution(dist).get_entry_map(group)
  291.  
  292.  
  293. def get_entry_info(dist, group, name):
  294.     return get_distribution(dist).get_entry_info(group, name)
  295.  
  296.  
  297. try:
  298.     from pkgutil import get_importer
  299. except ImportError:
  300.     import _pkgutil as pkgutil
  301.     get_importer = pkgutil.get_importer
  302.  
  303. import pkgutil
  304.  
  305. class IMetadataProvider:
  306.     
  307.     def has_metadata(name):
  308.         pass
  309.  
  310.     
  311.     def get_metadata(name):
  312.         pass
  313.  
  314.     
  315.     def get_metadata_lines(name):
  316.         pass
  317.  
  318.     
  319.     def metadata_isdir(name):
  320.         pass
  321.  
  322.     
  323.     def metadata_listdir(name):
  324.         pass
  325.  
  326.     
  327.     def run_script(script_name, namespace):
  328.         pass
  329.  
  330.  
  331.  
  332. class IResourceProvider(IMetadataProvider):
  333.     
  334.     def get_resource_filename(manager, resource_name):
  335.         pass
  336.  
  337.     
  338.     def get_resource_stream(manager, resource_name):
  339.         pass
  340.  
  341.     
  342.     def get_resource_string(manager, resource_name):
  343.         pass
  344.  
  345.     
  346.     def has_resource(resource_name):
  347.         pass
  348.  
  349.     
  350.     def resource_isdir(resource_name):
  351.         pass
  352.  
  353.     
  354.     def resource_listdir(resource_name):
  355.         pass
  356.  
  357.  
  358.  
  359. class WorkingSet(object):
  360.     
  361.     def __init__(self, entries = None):
  362.         self.entries = []
  363.         self.entry_keys = { }
  364.         self.by_key = { }
  365.         self.callbacks = []
  366.         if entries is None:
  367.             entries = sys.path
  368.         
  369.         for entry in entries:
  370.             self.add_entry(entry)
  371.         
  372.  
  373.     
  374.     def add_entry(self, entry):
  375.         self.entry_keys.setdefault(entry, [])
  376.         self.entries.append(entry)
  377.         for dist in find_distributions(entry, True):
  378.             self.add(dist, entry, False)
  379.         
  380.  
  381.     
  382.     def __contains__(self, dist):
  383.         return self.by_key.get(dist.key) == dist
  384.  
  385.     
  386.     def find(self, req):
  387.         dist = self.by_key.get(req.key)
  388.         if dist is not None and dist not in req:
  389.             raise VersionConflict(dist, req)
  390.         dist not in req
  391.         return dist
  392.  
  393.     
  394.     def iter_entry_points(self, group, name = None):
  395.         for dist in self:
  396.             entries = dist.get_entry_map(group)
  397.             if name is None:
  398.                 for ep in entries.values():
  399.                     yield ep
  400.                 
  401.             if name in entries:
  402.                 yield entries[name]
  403.                 continue
  404.         
  405.  
  406.     
  407.     def run_script(self, requires, script_name):
  408.         ns = sys._getframe(1).f_globals
  409.         name = ns['__name__']
  410.         ns.clear()
  411.         ns['__name__'] = name
  412.         self.require(requires)[0].run_script(script_name, ns)
  413.  
  414.     
  415.     def __iter__(self):
  416.         seen = { }
  417.         for item in self.entries:
  418.             for key in self.entry_keys[item]:
  419.                 if key not in seen:
  420.                     seen[key] = 1
  421.                     yield self.by_key[key]
  422.                     continue
  423.             
  424.         
  425.  
  426.     
  427.     def add(self, dist, entry = None, insert = True):
  428.         if insert:
  429.             dist.insert_on(self.entries, entry)
  430.         
  431.         if entry is None:
  432.             entry = dist.location
  433.         
  434.         keys = self.entry_keys.setdefault(entry, [])
  435.         keys2 = self.entry_keys.setdefault(dist.location, [])
  436.         if dist.key in self.by_key:
  437.             return None
  438.         self.by_key[dist.key] = dist
  439.         if dist.key not in keys:
  440.             keys.append(dist.key)
  441.         
  442.         if dist.key not in keys2:
  443.             keys2.append(dist.key)
  444.         
  445.         self._added_new(dist)
  446.  
  447.     
  448.     def resolve(self, requirements, env = None, installer = None):
  449.         requirements = list(requirements)[::-1]
  450.         processed = { }
  451.         best = { }
  452.         to_activate = []
  453.         while requirements:
  454.             req = requirements.pop(0)
  455.             if req in processed:
  456.                 continue
  457.             
  458.             dist = best.get(req.key)
  459.             if dist is None:
  460.                 dist = self.by_key.get(req.key)
  461.                 if dist is None:
  462.                     if env is None:
  463.                         env = Environment(self.entries)
  464.                     
  465.                     dist = best[req.key] = env.best_match(req, self, installer)
  466.                     if dist is None:
  467.                         raise DistributionNotFound(req)
  468.                     dist is None
  469.                 
  470.                 to_activate.append(dist)
  471.             
  472.             if dist not in req:
  473.                 raise VersionConflict(dist, req)
  474.             dist not in req
  475.             requirements.extend(dist.requires(req.extras)[::-1])
  476.             processed[req] = True
  477.         return to_activate
  478.  
  479.     
  480.     def find_plugins(self, plugin_env, full_env = None, installer = None, fallback = True):
  481.         plugin_projects = list(plugin_env)
  482.         plugin_projects.sort()
  483.         error_info = { }
  484.         distributions = { }
  485.         if full_env is None:
  486.             env = Environment(self.entries)
  487.             env += plugin_env
  488.         else:
  489.             env = full_env + plugin_env
  490.         shadow_set = self.__class__([])
  491.         map(shadow_set.add, self)
  492.         for project_name in plugin_projects:
  493.             for dist in plugin_env[project_name]:
  494.                 req = [
  495.                     dist.as_requirement()]
  496.                 
  497.                 try:
  498.                     resolvees = shadow_set.resolve(req, env, installer)
  499.                 except ResolutionError:
  500.                     v = None
  501.                     error_info[dist] = v
  502.                     if fallback:
  503.                         continue
  504.                     else:
  505.                         break
  506.                     fallback
  507.  
  508.                 map(shadow_set.add, resolvees)
  509.                 distributions.update(dict.fromkeys(resolvees))
  510.             
  511.         
  512.         distributions = list(distributions)
  513.         distributions.sort()
  514.         return (distributions, error_info)
  515.  
  516.     
  517.     def require(self, *requirements):
  518.         needed = self.resolve(parse_requirements(requirements))
  519.         for dist in needed:
  520.             self.add(dist)
  521.         
  522.         return needed
  523.  
  524.     
  525.     def subscribe(self, callback):
  526.         if callback in self.callbacks:
  527.             return None
  528.         self.callbacks.append(callback)
  529.         for dist in self:
  530.             callback(dist)
  531.         
  532.  
  533.     
  534.     def _added_new(self, dist):
  535.         for callback in self.callbacks:
  536.             callback(dist)
  537.         
  538.  
  539.     
  540.     def __getstate__(self):
  541.         return (self.entries[:], self.entry_keys.copy(), self.by_key.copy(), self.callbacks[:])
  542.  
  543.     
  544.     def __setstate__(self, .1):
  545.         (entries, keys, by_key, callbacks) = .1
  546.         self.entries = entries[:]
  547.         self.entry_keys = keys.copy()
  548.         self.by_key = by_key.copy()
  549.         self.callbacks = callbacks[:]
  550.  
  551.  
  552.  
  553. class Environment(object):
  554.     
  555.     def __init__(self, search_path = None, platform = get_supported_platform(), python = PY_MAJOR):
  556.         self._distmap = { }
  557.         self._cache = { }
  558.         self.platform = platform
  559.         self.python = python
  560.         self.scan(search_path)
  561.  
  562.     
  563.     def can_add(self, dist):
  564.         if self.python is None and dist.py_version is None or dist.py_version == self.python:
  565.             pass
  566.         return compatible_platforms(dist.platform, self.platform)
  567.  
  568.     
  569.     def remove(self, dist):
  570.         self._distmap[dist.key].remove(dist)
  571.  
  572.     
  573.     def scan(self, search_path = None):
  574.         if search_path is None:
  575.             search_path = sys.path
  576.         
  577.         for item in search_path:
  578.             for dist in find_distributions(item):
  579.                 self.add(dist)
  580.             
  581.         
  582.  
  583.     
  584.     def __getitem__(self, project_name):
  585.         
  586.         try:
  587.             return self._cache[project_name]
  588.         except KeyError:
  589.             project_name = project_name.lower()
  590.             if project_name not in self._distmap:
  591.                 return []
  592.         except:
  593.             project_name not in self._distmap
  594.  
  595.         return self._cache[project_name]
  596.  
  597.     
  598.     def add(self, dist):
  599.         if self.can_add(dist) and dist.has_version():
  600.             dists = self._distmap.setdefault(dist.key, [])
  601.             if dist not in dists:
  602.                 dists.append(dist)
  603.                 if dist.key in self._cache:
  604.                     _sort_dists(self._cache[dist.key])
  605.                 
  606.             
  607.         
  608.  
  609.     
  610.     def best_match(self, req, working_set, installer = None):
  611.         dist = working_set.find(req)
  612.         if dist is not None:
  613.             return dist
  614.         for dist in self[req.key]:
  615.             if dist in req:
  616.                 return dist
  617.         
  618.         return self.obtain(req, installer)
  619.  
  620.     
  621.     def obtain(self, requirement, installer = None):
  622.         if installer is not None:
  623.             return installer(requirement)
  624.  
  625.     
  626.     def __iter__(self):
  627.         for key in self._distmap.keys():
  628.             if self[key]:
  629.                 yield key
  630.                 continue
  631.         
  632.  
  633.     
  634.     def __iadd__(self, other):
  635.         if isinstance(other, Distribution):
  636.             self.add(other)
  637.         elif isinstance(other, Environment):
  638.             for project in other:
  639.                 for dist in other[project]:
  640.                     self.add(dist)
  641.                 
  642.             
  643.         else:
  644.             raise TypeError("Can't add %r to environment" % (other,))
  645.         return isinstance(other, Distribution)
  646.  
  647.     
  648.     def __add__(self, other):
  649.         new = self.__class__([], platform = None, python = None)
  650.         for env in (self, other):
  651.             new += env
  652.         
  653.         return new
  654.  
  655.  
  656. AvailableDistributions = Environment
  657.  
  658. class ExtractionError(RuntimeError):
  659.     pass
  660.  
  661.  
  662. class ResourceManager:
  663.     extraction_path = None
  664.     
  665.     def __init__(self):
  666.         self.cached_files = { }
  667.  
  668.     
  669.     def resource_exists(self, package_or_requirement, resource_name):
  670.         return get_provider(package_or_requirement).has_resource(resource_name)
  671.  
  672.     
  673.     def resource_isdir(self, package_or_requirement, resource_name):
  674.         return get_provider(package_or_requirement).resource_isdir(resource_name)
  675.  
  676.     
  677.     def resource_filename(self, package_or_requirement, resource_name):
  678.         return get_provider(package_or_requirement).get_resource_filename(self, resource_name)
  679.  
  680.     
  681.     def resource_stream(self, package_or_requirement, resource_name):
  682.         return get_provider(package_or_requirement).get_resource_stream(self, resource_name)
  683.  
  684.     
  685.     def resource_string(self, package_or_requirement, resource_name):
  686.         return get_provider(package_or_requirement).get_resource_string(self, resource_name)
  687.  
  688.     
  689.     def resource_listdir(self, package_or_requirement, resource_name):
  690.         return get_provider(package_or_requirement).resource_listdir(resource_name)
  691.  
  692.     
  693.     def extraction_error(self):
  694.         old_exc = sys.exc_info()[1]
  695.         if not self.extraction_path:
  696.             pass
  697.         cache_path = get_default_cache()
  698.         err = ExtractionError("Can't extract file(s) to egg cache\n\nThe following error occurred while trying to extract file(s) to the Python egg\ncache:\n\n  %s\n\nThe Python egg cache directory is currently set to:\n\n  %s\n\nPerhaps your account does not have write access to this directory?  You can\nchange the cache directory by setting the PYTHON_EGG_CACHE environment\nvariable to point to an accessible directory.\n" % (old_exc, cache_path))
  699.         err.manager = self
  700.         err.cache_path = cache_path
  701.         err.original_error = old_exc
  702.         raise err
  703.  
  704.     
  705.     def get_cache_path(self, archive_name, names = ()):
  706.         if not self.extraction_path:
  707.             pass
  708.         extract_path = get_default_cache()
  709.         target_path = os.path.join(extract_path, archive_name + '-tmp', *names)
  710.         
  711.         try:
  712.             _bypass_ensure_directory(target_path)
  713.         except:
  714.             self.extraction_error()
  715.  
  716.         self.cached_files[target_path] = 1
  717.         return target_path
  718.  
  719.     
  720.     def postprocess(self, tempname, filename):
  721.         if os.name == 'posix':
  722.             mode = (os.stat(tempname).st_mode | 365) & 4095
  723.             os.chmod(tempname, mode)
  724.         
  725.  
  726.     
  727.     def set_extraction_path(self, path):
  728.         if self.cached_files:
  729.             raise ValueError("Can't change extraction path, files already extracted")
  730.         self.cached_files
  731.         self.extraction_path = path
  732.  
  733.     
  734.     def cleanup_resources(self, force = False):
  735.         pass
  736.  
  737.  
  738.  
  739. def get_default_cache():
  740.     
  741.     try:
  742.         return os.environ['PYTHON_EGG_CACHE']
  743.     except KeyError:
  744.         pass
  745.  
  746.     if os.name != 'nt':
  747.         return os.path.expanduser('~/.python-eggs')
  748.     app_data = 'Application Data'
  749.     app_homes = [
  750.         (('APPDATA',), None),
  751.         (('USERPROFILE',), app_data),
  752.         (('HOMEDRIVE', 'HOMEPATH'), app_data),
  753.         (('HOMEPATH',), app_data),
  754.         (('HOME',), None),
  755.         (('WINDIR',), app_data)]
  756.     for keys, subdir in app_homes:
  757.         dirname = ''
  758.         for key in keys:
  759.             if key in os.environ:
  760.                 dirname = os.path.join(dirname, os.environ[key])
  761.                 continue
  762.             os.name != 'nt'
  763.         elif subdir:
  764.             dirname = os.path.join(dirname, subdir)
  765.         
  766.         return os.path.join(dirname, 'Python-Eggs')
  767.     else:
  768.         raise RuntimeError('Please set the PYTHON_EGG_CACHE enviroment variable')
  769.  
  770.  
  771. def safe_name(name):
  772.     return re.sub('[^A-Za-z0-9.]+', '-', name)
  773.  
  774.  
  775. def safe_version(version):
  776.     version = version.replace(' ', '.')
  777.     return re.sub('[^A-Za-z0-9.]+', '-', version)
  778.  
  779.  
  780. def safe_extra(extra):
  781.     return re.sub('[^A-Za-z0-9.]+', '_', extra).lower()
  782.  
  783.  
  784. def to_filename(name):
  785.     return name.replace('-', '_')
  786.  
  787.  
  788. class NullProvider:
  789.     egg_name = None
  790.     egg_info = None
  791.     loader = None
  792.     
  793.     def __init__(self, module):
  794.         self.loader = getattr(module, '__loader__', None)
  795.         self.module_path = os.path.dirname(getattr(module, '__file__', ''))
  796.  
  797.     
  798.     def get_resource_filename(self, manager, resource_name):
  799.         return self._fn(self.module_path, resource_name)
  800.  
  801.     
  802.     def get_resource_stream(self, manager, resource_name):
  803.         return StringIO(self.get_resource_string(manager, resource_name))
  804.  
  805.     
  806.     def get_resource_string(self, manager, resource_name):
  807.         return self._get(self._fn(self.module_path, resource_name))
  808.  
  809.     
  810.     def has_resource(self, resource_name):
  811.         return self._has(self._fn(self.module_path, resource_name))
  812.  
  813.     
  814.     def has_metadata(self, name):
  815.         if self.egg_info:
  816.             pass
  817.         return self._has(self._fn(self.egg_info, name))
  818.  
  819.     
  820.     def get_metadata(self, name):
  821.         if not self.egg_info:
  822.             return ''
  823.         return self._get(self._fn(self.egg_info, name))
  824.  
  825.     
  826.     def get_metadata_lines(self, name):
  827.         return yield_lines(self.get_metadata(name))
  828.  
  829.     
  830.     def resource_isdir(self, resource_name):
  831.         return self._isdir(self._fn(self.module_path, resource_name))
  832.  
  833.     
  834.     def metadata_isdir(self, name):
  835.         if self.egg_info:
  836.             pass
  837.         return self._isdir(self._fn(self.egg_info, name))
  838.  
  839.     
  840.     def resource_listdir(self, resource_name):
  841.         return self._listdir(self._fn(self.module_path, resource_name))
  842.  
  843.     
  844.     def metadata_listdir(self, name):
  845.         if self.egg_info:
  846.             return self._listdir(self._fn(self.egg_info, name))
  847.         return []
  848.  
  849.     
  850.     def run_script(self, script_name, namespace):
  851.         script = 'scripts/' + script_name
  852.         if not self.has_metadata(script):
  853.             raise ResolutionError('No script named %r' % script_name)
  854.         self.has_metadata(script)
  855.         script_text = self.get_metadata(script).replace('\r\n', '\n')
  856.         script_text = script_text.replace('\r', '\n')
  857.         script_filename = self._fn(self.egg_info, script)
  858.         namespace['__file__'] = script_filename
  859.         if os.path.exists(script_filename):
  860.             execfile(script_filename, namespace, namespace)
  861.         else:
  862.             cache = cache
  863.             import linecache
  864.             cache[script_filename] = (len(script_text), 0, script_text.split('\n'), script_filename)
  865.             script_code = compile(script_text, script_filename, 'exec')
  866.             exec script_code in namespace, namespace
  867.  
  868.     
  869.     def _has(self, path):
  870.         raise NotImplementedError("Can't perform this operation for unregistered loader type")
  871.  
  872.     
  873.     def _isdir(self, path):
  874.         raise NotImplementedError("Can't perform this operation for unregistered loader type")
  875.  
  876.     
  877.     def _listdir(self, path):
  878.         raise NotImplementedError("Can't perform this operation for unregistered loader type")
  879.  
  880.     
  881.     def _fn(self, base, resource_name):
  882.         if resource_name:
  883.             return os.path.join(base, *resource_name.split('/'))
  884.         return base
  885.  
  886.     
  887.     def _get(self, path):
  888.         if hasattr(self.loader, 'get_data'):
  889.             return self.loader.get_data(path)
  890.         raise NotImplementedError("Can't perform this operation for loaders without 'get_data()'")
  891.  
  892.  
  893. register_loader_type(object, NullProvider)
  894.  
  895. class EggProvider(NullProvider):
  896.     
  897.     def __init__(self, module):
  898.         NullProvider.__init__(self, module)
  899.         self._setup_prefix()
  900.  
  901.     
  902.     def _setup_prefix(self):
  903.         path = self.module_path
  904.         old = None
  905.         while path != old:
  906.             if path.lower().endswith('.egg'):
  907.                 self.egg_name = os.path.basename(path)
  908.                 self.egg_info = os.path.join(path, 'EGG-INFO')
  909.                 self.egg_root = path
  910.                 break
  911.             
  912.             old = path
  913.             (path, base) = os.path.split(path)
  914.  
  915.  
  916.  
  917. class DefaultProvider(EggProvider):
  918.     
  919.     def _has(self, path):
  920.         return os.path.exists(path)
  921.  
  922.     
  923.     def _isdir(self, path):
  924.         return os.path.isdir(path)
  925.  
  926.     
  927.     def _listdir(self, path):
  928.         return os.listdir(path)
  929.  
  930.     
  931.     def get_resource_stream(self, manager, resource_name):
  932.         return open(self._fn(self.module_path, resource_name), 'rb')
  933.  
  934.     
  935.     def _get(self, path):
  936.         stream = open(path, 'rb')
  937.         
  938.         try:
  939.             return stream.read()
  940.         finally:
  941.             stream.close()
  942.  
  943.  
  944.  
  945. register_loader_type(type(None), DefaultProvider)
  946.  
  947. class EmptyProvider(NullProvider):
  948.     _isdir = _has = (lambda self, path: False)
  949.     
  950.     _get = lambda self, path: ''
  951.     
  952.     _listdir = lambda self, path: []
  953.     module_path = None
  954.     
  955.     def __init__(self):
  956.         pass
  957.  
  958.  
  959. empty_provider = EmptyProvider()
  960.  
  961. class ZipProvider(EggProvider):
  962.     eagers = None
  963.     
  964.     def __init__(self, module):
  965.         EggProvider.__init__(self, module)
  966.         self.zipinfo = zipimport._zip_directory_cache[self.loader.archive]
  967.         self.zip_pre = self.loader.archive + os.sep
  968.  
  969.     
  970.     def _zipinfo_name(self, fspath):
  971.         if fspath.startswith(self.zip_pre):
  972.             return fspath[len(self.zip_pre):]
  973.         raise AssertionError('%s is not a subpath of %s' % (fspath, self.zip_pre))
  974.  
  975.     
  976.     def _parts(self, zip_path):
  977.         fspath = self.zip_pre + zip_path
  978.         if fspath.startswith(self.egg_root + os.sep):
  979.             return fspath[len(self.egg_root) + 1:].split(os.sep)
  980.         raise AssertionError('%s is not a subpath of %s' % (fspath, self.egg_root))
  981.  
  982.     
  983.     def get_resource_filename(self, manager, resource_name):
  984.         if not self.egg_name:
  985.             raise NotImplementedError('resource_filename() only supported for .egg, not .zip')
  986.         self.egg_name
  987.         zip_path = self._resource_to_zip(resource_name)
  988.         eagers = self._get_eager_resources()
  989.         if '/'.join(self._parts(zip_path)) in eagers:
  990.             for name in eagers:
  991.                 self._extract_resource(manager, self._eager_to_zip(name))
  992.             
  993.         
  994.         return self._extract_resource(manager, zip_path)
  995.  
  996.     
  997.     def _extract_resource(self, manager, zip_path):
  998.         if zip_path in self._index():
  999.             for name in self._index()[zip_path]:
  1000.                 last = self._extract_resource(manager, os.path.join(zip_path, name))
  1001.             
  1002.             return os.path.dirname(last)
  1003.         zip_stat = self.zipinfo[zip_path]
  1004.         t = zip_stat[5]
  1005.         d = zip_stat[6]
  1006.         size = zip_stat[3]
  1007.         date_time = ((d >> 9) + 1980, d >> 5 & 15, d & 31, (t & 65535) >> 11, t >> 5 & 63, (t & 31) * 2, 0, 0, -1)
  1008.         timestamp = time.mktime(date_time)
  1009.         
  1010.         try:
  1011.             real_path = manager.get_cache_path(self.egg_name, self._parts(zip_path))
  1012.             (outf, tmpnam) = _mkstemp('.$extract', dir = os.path.dirname(real_path))
  1013.             os.write(outf, self.loader.get_data(zip_path))
  1014.             os.close(outf)
  1015.             utime(tmpnam, (timestamp, timestamp))
  1016.             manager.postprocess(tmpnam, real_path)
  1017.             
  1018.             try:
  1019.                 rename(tmpnam, real_path)
  1020.             except os.error:
  1021.                 None if os.path.isfile(real_path) else zip_path in self._index()
  1022.                 None if os.path.isfile(real_path) else zip_path in self._index()
  1023.                 raise 
  1024.             except:
  1025.                 None if os.path.isfile(real_path) else stat.st_mtime == timestamp
  1026.  
  1027.         except os.error:
  1028.             zip_path in self._index()
  1029.             zip_path in self._index()
  1030.             manager.extraction_error()
  1031.         except:
  1032.             zip_path in self._index()
  1033.  
  1034.         return real_path
  1035.  
  1036.     
  1037.     def _get_eager_resources(self):
  1038.         if self.eagers is None:
  1039.             eagers = []
  1040.             for name in ('native_libs.txt', 'eager_resources.txt'):
  1041.                 if self.has_metadata(name):
  1042.                     eagers.extend(self.get_metadata_lines(name))
  1043.                     continue
  1044.             
  1045.             self.eagers = eagers
  1046.         
  1047.         return self.eagers
  1048.  
  1049.     
  1050.     def _index(self):
  1051.         
  1052.         try:
  1053.             return self._dirindex
  1054.         except AttributeError:
  1055.             ind = { }
  1056.             for path in self.zipinfo:
  1057.                 parts = path.split(os.sep)
  1058.                 while parts:
  1059.                     parent = os.sep.join(parts[:-1])
  1060.                     if parent in ind:
  1061.                         ind[parent].append(parts[-1])
  1062.                         break
  1063.                         continue
  1064.                     ind[parent] = [
  1065.                         parts.pop()]
  1066.             
  1067.             self._dirindex = ind
  1068.             return ind
  1069.  
  1070.  
  1071.     
  1072.     def _has(self, fspath):
  1073.         zip_path = self._zipinfo_name(fspath)
  1074.         if not zip_path in self.zipinfo:
  1075.             pass
  1076.         return zip_path in self._index()
  1077.  
  1078.     
  1079.     def _isdir(self, fspath):
  1080.         return self._zipinfo_name(fspath) in self._index()
  1081.  
  1082.     
  1083.     def _listdir(self, fspath):
  1084.         return list(self._index().get(self._zipinfo_name(fspath), ()))
  1085.  
  1086.     
  1087.     def _eager_to_zip(self, resource_name):
  1088.         return self._zipinfo_name(self._fn(self.egg_root, resource_name))
  1089.  
  1090.     
  1091.     def _resource_to_zip(self, resource_name):
  1092.         return self._zipinfo_name(self._fn(self.module_path, resource_name))
  1093.  
  1094.  
  1095. register_loader_type(zipimport.zipimporter, ZipProvider)
  1096.  
  1097. class FileMetadata(EmptyProvider):
  1098.     
  1099.     def __init__(self, path):
  1100.         self.path = path
  1101.  
  1102.     
  1103.     def has_metadata(self, name):
  1104.         return name == 'PKG-INFO'
  1105.  
  1106.     
  1107.     def get_metadata(self, name):
  1108.         if name == 'PKG-INFO':
  1109.             return open(self.path, 'rU').read()
  1110.         raise KeyError('No metadata except PKG-INFO is available')
  1111.  
  1112.     
  1113.     def get_metadata_lines(self, name):
  1114.         return yield_lines(self.get_metadata(name))
  1115.  
  1116.  
  1117.  
  1118. class PathMetadata(DefaultProvider):
  1119.     
  1120.     def __init__(self, path, egg_info):
  1121.         self.module_path = path
  1122.         self.egg_info = egg_info
  1123.  
  1124.  
  1125.  
  1126. class EggMetadata(ZipProvider):
  1127.     
  1128.     def __init__(self, importer):
  1129.         self.zipinfo = zipimport._zip_directory_cache[importer.archive]
  1130.         self.zip_pre = importer.archive + os.sep
  1131.         self.loader = importer
  1132.         if importer.prefix:
  1133.             self.module_path = os.path.join(importer.archive, importer.prefix)
  1134.         else:
  1135.             self.module_path = importer.archive
  1136.         self._setup_prefix()
  1137.  
  1138.  
  1139. _declare_state('dict', _distribution_finders = { })
  1140.  
  1141. def register_finder(importer_type, distribution_finder):
  1142.     _distribution_finders[importer_type] = distribution_finder
  1143.  
  1144.  
  1145. def find_distributions(path_item, only = False):
  1146.     importer = get_importer(path_item)
  1147.     finder = _find_adapter(_distribution_finders, importer)
  1148.     return finder(importer, path_item, only)
  1149.  
  1150.  
  1151. def find_in_zip(importer, path_item, only = False):
  1152.     metadata = EggMetadata(importer)
  1153.     if metadata.has_metadata('PKG-INFO'):
  1154.         yield Distribution.from_filename(path_item, metadata = metadata)
  1155.     
  1156.     if only:
  1157.         return None
  1158.     for subitem in metadata.resource_listdir('/'):
  1159.         if subitem.endswith('.egg'):
  1160.             subpath = os.path.join(path_item, subitem)
  1161.             for dist in find_in_zip(zipimport.zipimporter(subpath), subpath):
  1162.                 yield dist
  1163.                 only
  1164.             
  1165.     
  1166.  
  1167. register_finder(zipimport.zipimporter, find_in_zip)
  1168.  
  1169. def StringIO(*args, **kw):
  1170.     global StringIO, StringIO
  1171.     
  1172.     try:
  1173.         StringIO = StringIO
  1174.         import cStringIO
  1175.     except ImportError:
  1176.         StringIO = StringIO
  1177.         import StringIO
  1178.  
  1179.     return StringIO(*args, **kw)
  1180.  
  1181.  
  1182. def find_nothing(importer, path_item, only = False):
  1183.     return ()
  1184.  
  1185. register_finder(object, find_nothing)
  1186.  
  1187. def find_on_path(importer, path_item, only = False):
  1188.     path_item = _normalize_cached(path_item)
  1189.     if os.path.isdir(path_item) and os.access(path_item, os.R_OK):
  1190.         if path_item.lower().endswith('.egg'):
  1191.             yield Distribution.from_filename(path_item, metadata = PathMetadata(path_item, os.path.join(path_item, 'EGG-INFO')))
  1192.         else:
  1193.             for entry in os.listdir(path_item):
  1194.                 lower = entry.lower()
  1195.                 if lower.endswith('.egg-info'):
  1196.                     fullpath = os.path.join(path_item, entry)
  1197.                     if os.path.isdir(fullpath):
  1198.                         metadata = PathMetadata(path_item, fullpath)
  1199.                     else:
  1200.                         metadata = FileMetadata(fullpath)
  1201.                     yield Distribution.from_location(path_item, entry, metadata, precedence = DEVELOP_DIST)
  1202.                     continue
  1203.                 if not only and lower.endswith('.egg'):
  1204.                     for dist in find_distributions(os.path.join(path_item, entry)):
  1205.                         yield dist
  1206.                     
  1207.                 if not only and lower.endswith('.egg-link'):
  1208.                     for line in file(os.path.join(path_item, entry)):
  1209.                         if not line.strip():
  1210.                             continue
  1211.                         
  1212.                         for item in find_distributions(os.path.join(path_item, line.rstrip())):
  1213.                             yield item
  1214.                         
  1215.                     
  1216.             
  1217.     
  1218.  
  1219. register_finder(pkgutil.ImpImporter, find_on_path)
  1220. _declare_state('dict', _namespace_handlers = { })
  1221. _declare_state('dict', _namespace_packages = { })
  1222.  
  1223. def register_namespace_handler(importer_type, namespace_handler):
  1224.     _namespace_handlers[importer_type] = namespace_handler
  1225.  
  1226.  
  1227. def _handle_ns(packageName, path_item):
  1228.     importer = get_importer(path_item)
  1229.     if importer is None:
  1230.         return None
  1231.     loader = importer.find_module(packageName)
  1232.     if loader is None:
  1233.         return None
  1234.     module = sys.modules.get(packageName)
  1235.     if module is None:
  1236.         module.__path__ = []
  1237.         _set_parent_ns(packageName)
  1238.     elif not hasattr(module, '__path__'):
  1239.         raise TypeError('Not a package:', packageName)
  1240.     
  1241.     handler = _find_adapter(_namespace_handlers, importer)
  1242.     subpath = handler(importer, path_item, packageName, module)
  1243.     if subpath is not None:
  1244.         path = module.__path__
  1245.         path.append(subpath)
  1246.         loader.load_module(packageName)
  1247.         module.__path__ = path
  1248.     
  1249.     return subpath
  1250.  
  1251.  
  1252. def declare_namespace(packageName):
  1253.     imp.acquire_lock()
  1254.     
  1255.     try:
  1256.         if packageName in _namespace_packages:
  1257.             return None
  1258.         path = sys.path
  1259.         parent = None
  1260.         if '.' in packageName:
  1261.             parent = '.'.join(packageName.split('.')[:-1])
  1262.             declare_namespace(parent)
  1263.             __import__(parent)
  1264.             
  1265.             try:
  1266.                 path = sys.modules[parent].__path__
  1267.             except AttributeError:
  1268.                 packageName in _namespace_packages
  1269.                 packageName in _namespace_packages
  1270.                 raise TypeError('Not a package:', parent)
  1271.             except:
  1272.                 packageName in _namespace_packages<EXCEPTION MATCH>AttributeError
  1273.             
  1274.  
  1275.         packageName in _namespace_packages
  1276.         _namespace_packages.setdefault(parent, []).append(packageName)
  1277.         _namespace_packages.setdefault(packageName, [])
  1278.         for path_item in path:
  1279.             _handle_ns(packageName, path_item)
  1280.     finally:
  1281.         imp.release_lock()
  1282.  
  1283.  
  1284.  
  1285. def fixup_namespace_packages(path_item, parent = None):
  1286.     imp.acquire_lock()
  1287.     
  1288.     try:
  1289.         for package in _namespace_packages.get(parent, ()):
  1290.             subpath = _handle_ns(package, path_item)
  1291.             if subpath:
  1292.                 fixup_namespace_packages(subpath, package)
  1293.                 continue
  1294.     finally:
  1295.         imp.release_lock()
  1296.  
  1297.  
  1298.  
  1299. def file_ns_handler(importer, path_item, packageName, module):
  1300.     subpath = os.path.join(path_item, packageName.split('.')[-1])
  1301.     normalized = _normalize_cached(subpath)
  1302.     for item in module.__path__:
  1303.         if _normalize_cached(item) == normalized:
  1304.             break
  1305.             continue
  1306.     else:
  1307.         return subpath
  1308.  
  1309. register_namespace_handler(pkgutil.ImpImporter, file_ns_handler)
  1310. register_namespace_handler(zipimport.zipimporter, file_ns_handler)
  1311.  
  1312. def null_ns_handler(importer, path_item, packageName, module):
  1313.     pass
  1314.  
  1315. register_namespace_handler(object, null_ns_handler)
  1316.  
  1317. def normalize_path(filename):
  1318.     return os.path.normcase(os.path.realpath(filename))
  1319.  
  1320.  
  1321. def _normalize_cached(filename, _cache = { }):
  1322.     
  1323.     try:
  1324.         return _cache[filename]
  1325.     except KeyError:
  1326.         _cache[filename] = result = normalize_path(filename)
  1327.         return result
  1328.  
  1329.  
  1330.  
  1331. def _set_parent_ns(packageName):
  1332.     parts = packageName.split('.')
  1333.     name = parts.pop()
  1334.     if parts:
  1335.         parent = '.'.join(parts)
  1336.         setattr(sys.modules[parent], name, sys.modules[packageName])
  1337.     
  1338.  
  1339.  
  1340. def yield_lines(strs):
  1341.     if isinstance(strs, basestring):
  1342.         for s in strs.splitlines():
  1343.             s = s.strip()
  1344.             if s and not s.startswith('#'):
  1345.                 yield s
  1346.                 continue
  1347.         
  1348.     else:
  1349.         for ss in strs:
  1350.             for s in yield_lines(ss):
  1351.                 yield s
  1352.             
  1353.         
  1354.  
  1355. LINE_END = re.compile('\\s*(#.*)?$').match
  1356. CONTINUE = re.compile('\\s*\\\\\\s*(#.*)?$').match
  1357. DISTRO = re.compile('\\s*((\\w|[-.])+)').match
  1358. VERSION = re.compile('\\s*(<=?|>=?|==|!=)\\s*((\\w|[-.])+)').match
  1359. COMMA = re.compile('\\s*,').match
  1360. OBRACKET = re.compile('\\s*\\[').match
  1361. CBRACKET = re.compile('\\s*\\]').match
  1362. MODULE = re.compile('\\w+(\\.\\w+)*$').match
  1363. EGG_NAME = re.compile('(?P<name>[^-]+)( -(?P<ver>[^-]+) (-py(?P<pyver>[^-]+) (-(?P<plat>.+))? )? )?', re.VERBOSE | re.IGNORECASE).match
  1364. component_re = re.compile('(\\d+ | [a-z]+ | \\.| -)', re.VERBOSE)
  1365. replace = {
  1366.     'pre': 'c',
  1367.     'preview': 'c',
  1368.     '-': 'final-',
  1369.     'rc': 'c',
  1370.     'dev': '@' }.get
  1371.  
  1372. def _parse_version_parts(s):
  1373.     for part in component_re.split(s):
  1374.         part = replace(part, part)
  1375.         if not part or part == '.':
  1376.             continue
  1377.         
  1378.         if part[:1] in '0123456789':
  1379.             yield part.zfill(8)
  1380.             continue
  1381.         yield '*' + part
  1382.     
  1383.     yield '*final'
  1384.  
  1385.  
  1386. def parse_version(s):
  1387.     parts = []
  1388.     for part in _parse_version_parts(s.lower()):
  1389.         if part.startswith('*'):
  1390.             if part < '*final':
  1391.                 while parts and parts[-1] == '*final-':
  1392.                     parts.pop()
  1393.             
  1394.             while parts and parts[-1] == '00000000':
  1395.                 parts.pop()
  1396.         
  1397.         parts.append(part)
  1398.     
  1399.     return tuple(parts)
  1400.  
  1401.  
  1402. class EntryPoint(object):
  1403.     
  1404.     def __init__(self, name, module_name, attrs = (), extras = (), dist = None):
  1405.         if not MODULE(module_name):
  1406.             raise ValueError('Invalid module name', module_name)
  1407.         MODULE(module_name)
  1408.         self.name = name
  1409.         self.module_name = module_name
  1410.         self.attrs = tuple(attrs)
  1411.         self.extras = Requirement.parse('x[%s]' % ','.join(extras)).extras
  1412.         self.dist = dist
  1413.  
  1414.     
  1415.     def __str__(self):
  1416.         s = '%s = %s' % (self.name, self.module_name)
  1417.         if self.attrs:
  1418.             s += ':' + '.'.join(self.attrs)
  1419.         
  1420.         if self.extras:
  1421.             s += ' [%s]' % ','.join(self.extras)
  1422.         
  1423.         return s
  1424.  
  1425.     
  1426.     def __repr__(self):
  1427.         return 'EntryPoint.parse(%r)' % str(self)
  1428.  
  1429.     
  1430.     def load(self, require = True, env = None, installer = None):
  1431.         if require:
  1432.             self.require(env, installer)
  1433.         
  1434.         entry = __import__(self.module_name, globals(), globals(), [
  1435.             '__name__'])
  1436.         for attr in self.attrs:
  1437.             
  1438.             try:
  1439.                 entry = getattr(entry, attr)
  1440.             continue
  1441.             except AttributeError:
  1442.                 raise ImportError('%r has no %r attribute' % (entry, attr))
  1443.                 continue
  1444.             
  1445.  
  1446.         
  1447.         return entry
  1448.  
  1449.     
  1450.     def require(self, env = None, installer = None):
  1451.         if self.extras and not (self.dist):
  1452.             raise UnknownExtra("Can't require() without a distribution", self)
  1453.         not (self.dist)
  1454.         map(working_set.add, working_set.resolve(self.dist.requires(self.extras), env, installer))
  1455.  
  1456.     
  1457.     def parse(cls, src, dist = None):
  1458.         
  1459.         try:
  1460.             attrs = extras = ()
  1461.             (name, value) = src.split('=', 1)
  1462.             if '[' in value:
  1463.                 (value, extras) = value.split('[', 1)
  1464.                 req = Requirement.parse('x[' + extras)
  1465.                 if req.specs:
  1466.                     raise ValueError
  1467.                 req.specs
  1468.                 extras = req.extras
  1469.             
  1470.             if ':' in value:
  1471.                 (value, attrs) = value.split(':', 1)
  1472.                 if not MODULE(attrs.rstrip()):
  1473.                     raise ValueError
  1474.                 MODULE(attrs.rstrip())
  1475.                 attrs = attrs.rstrip().split('.')
  1476.         except ValueError:
  1477.             raise ValueError("EntryPoint must be in 'name=module:attrs [extras]' format", src)
  1478.  
  1479.         return cls(name.strip(), value.strip(), attrs, extras, dist)
  1480.  
  1481.     parse = classmethod(parse)
  1482.     
  1483.     def parse_group(cls, group, lines, dist = None):
  1484.         if not MODULE(group):
  1485.             raise ValueError('Invalid group name', group)
  1486.         MODULE(group)
  1487.         this = { }
  1488.         for line in yield_lines(lines):
  1489.             ep = cls.parse(line, dist)
  1490.             if ep.name in this:
  1491.                 raise ValueError('Duplicate entry point', group, ep.name)
  1492.             ep.name in this
  1493.             this[ep.name] = ep
  1494.         
  1495.         return this
  1496.  
  1497.     parse_group = classmethod(parse_group)
  1498.     
  1499.     def parse_map(cls, data, dist = None):
  1500.         if isinstance(data, dict):
  1501.             data = data.items()
  1502.         else:
  1503.             data = split_sections(data)
  1504.         maps = { }
  1505.         for group, lines in data:
  1506.             if group is None:
  1507.                 if not lines:
  1508.                     continue
  1509.                 
  1510.                 raise ValueError('Entry points must be listed in groups')
  1511.             group is None
  1512.             group = group.strip()
  1513.             if group in maps:
  1514.                 raise ValueError('Duplicate group name', group)
  1515.             group in maps
  1516.             maps[group] = cls.parse_group(group, lines, dist)
  1517.         
  1518.         return maps
  1519.  
  1520.     parse_map = classmethod(parse_map)
  1521.  
  1522.  
  1523. class Distribution(object):
  1524.     
  1525.     def __init__(self, location = None, metadata = None, project_name = None, version = None, py_version = PY_MAJOR, platform = None, precedence = EGG_DIST):
  1526.         if not project_name:
  1527.             pass
  1528.         self.project_name = safe_name('Unknown')
  1529.         if version is not None:
  1530.             self._version = safe_version(version)
  1531.         
  1532.         self.py_version = py_version
  1533.         self.platform = platform
  1534.         self.location = location
  1535.         self.precedence = precedence
  1536.         if not metadata:
  1537.             pass
  1538.         self._provider = empty_provider
  1539.  
  1540.     
  1541.     def from_location(cls, location, basename, metadata = None, **kw):
  1542.         (project_name, version, py_version, platform) = [
  1543.             None] * 4
  1544.         (basename, ext) = os.path.splitext(basename)
  1545.         if ext.lower() in ('.egg', '.egg-info'):
  1546.             match = EGG_NAME(basename)
  1547.             if match:
  1548.                 (project_name, version, py_version, platform) = match.group('name', 'ver', 'pyver', 'plat')
  1549.             
  1550.         
  1551.         return cls(location, metadata, project_name = project_name, version = version, py_version = py_version, platform = platform, **kw)
  1552.  
  1553.     from_location = classmethod(from_location)
  1554.     hashcmp = property((lambda self: if not self.location:
  1555. pass(getattr(self, 'parsed_version', ()), self.precedence, self.key, -len(''), self.location, self.py_version, self.platform)))
  1556.     
  1557.     def __cmp__(self, other):
  1558.         return cmp(self.hashcmp, other)
  1559.  
  1560.     
  1561.     def __hash__(self):
  1562.         return hash(self.hashcmp)
  1563.  
  1564.     
  1565.     def key(self):
  1566.         
  1567.         try:
  1568.             return self._key
  1569.         except AttributeError:
  1570.             self._key = key = self.project_name.lower()
  1571.             return key
  1572.  
  1573.  
  1574.     key = property(key)
  1575.     
  1576.     def parsed_version(self):
  1577.         
  1578.         try:
  1579.             return self._parsed_version
  1580.         except AttributeError:
  1581.             self._parsed_version = pv = parse_version(self.version)
  1582.             return pv
  1583.  
  1584.  
  1585.     parsed_version = property(parsed_version)
  1586.     
  1587.     def version(self):
  1588.         
  1589.         try:
  1590.             return self._version
  1591.         except AttributeError:
  1592.             for line in self._get_metadata('PKG-INFO'):
  1593.                 if line.lower().startswith('version:'):
  1594.                     self._version = safe_version(line.split(':', 1)[1].strip())
  1595.                     return self._version
  1596.             else:
  1597.                 raise ValueError("Missing 'Version:' header and/or PKG-INFO file", self)
  1598.             line.lower().startswith('version:')
  1599.  
  1600.  
  1601.     version = property(version)
  1602.     
  1603.     def _dep_map(self):
  1604.         
  1605.         try:
  1606.             return self._Distribution__dep_map
  1607.         except AttributeError:
  1608.             dm = self._Distribution__dep_map = {
  1609.                 None: [] }
  1610.             for name in ('requires.txt', 'depends.txt'):
  1611.                 for extra, reqs in split_sections(self._get_metadata(name)):
  1612.                     if extra:
  1613.                         extra = safe_extra(extra)
  1614.                     
  1615.                     dm.setdefault(extra, []).extend(parse_requirements(reqs))
  1616.                 
  1617.             
  1618.             return dm
  1619.  
  1620.  
  1621.     _dep_map = property(_dep_map)
  1622.     
  1623.     def requires(self, extras = ()):
  1624.         dm = self._dep_map
  1625.         deps = []
  1626.         deps.extend(dm.get(None, ()))
  1627.         for ext in extras:
  1628.             
  1629.             try:
  1630.                 deps.extend(dm[safe_extra(ext)])
  1631.             continue
  1632.             except KeyError:
  1633.                 raise UnknownExtra('%s has no such extra feature %r' % (self, ext))
  1634.                 continue
  1635.             
  1636.  
  1637.         
  1638.         return deps
  1639.  
  1640.     
  1641.     def _get_metadata(self, name):
  1642.         if self.has_metadata(name):
  1643.             for line in self.get_metadata_lines(name):
  1644.                 yield line
  1645.             
  1646.         
  1647.  
  1648.     
  1649.     def activate(self, path = None):
  1650.         if path is None:
  1651.             path = sys.path
  1652.         
  1653.         self.insert_on(path)
  1654.         if path is sys.path:
  1655.             fixup_namespace_packages(self.location)
  1656.             for pkg in self._get_metadata('namespace_packages.txt'):
  1657.                 if pkg in sys.modules:
  1658.                     declare_namespace(pkg)
  1659.                     continue
  1660.             
  1661.         
  1662.  
  1663.     
  1664.     def egg_name(self):
  1665.         if not self.py_version:
  1666.             pass
  1667.         filename = '%s-%s-py%s' % (to_filename(self.project_name), to_filename(self.version), PY_MAJOR)
  1668.         if self.platform:
  1669.             filename += '-' + self.platform
  1670.         
  1671.         return filename
  1672.  
  1673.     
  1674.     def __repr__(self):
  1675.         if self.location:
  1676.             return '%s (%s)' % (self, self.location)
  1677.         return str(self)
  1678.  
  1679.     
  1680.     def __str__(self):
  1681.         
  1682.         try:
  1683.             version = getattr(self, 'version', None)
  1684.         except ValueError:
  1685.             version = None
  1686.  
  1687.         if not version:
  1688.             pass
  1689.         version = '[unknown version]'
  1690.         return '%s %s' % (self.project_name, version)
  1691.  
  1692.     
  1693.     def __getattr__(self, attr):
  1694.         if attr.startswith('_'):
  1695.             raise AttributeError, attr
  1696.         attr.startswith('_')
  1697.         return getattr(self._provider, attr)
  1698.  
  1699.     
  1700.     def from_filename(cls, filename, metadata = None, **kw):
  1701.         return cls.from_location(_normalize_cached(filename), os.path.basename(filename), metadata, **kw)
  1702.  
  1703.     from_filename = classmethod(from_filename)
  1704.     
  1705.     def as_requirement(self):
  1706.         return Requirement.parse('%s==%s' % (self.project_name, self.version))
  1707.  
  1708.     
  1709.     def load_entry_point(self, group, name):
  1710.         ep = self.get_entry_info(group, name)
  1711.         if ep is None:
  1712.             raise ImportError('Entry point %r not found' % ((group, name),))
  1713.         ep is None
  1714.         return ep.load()
  1715.  
  1716.     
  1717.     def get_entry_map(self, group = None):
  1718.         
  1719.         try:
  1720.             ep_map = self._ep_map
  1721.         except AttributeError:
  1722.             ep_map = self._ep_map = EntryPoint.parse_map(self._get_metadata('entry_points.txt'), self)
  1723.  
  1724.         if group is not None:
  1725.             return ep_map.get(group, { })
  1726.         return ep_map
  1727.  
  1728.     
  1729.     def get_entry_info(self, group, name):
  1730.         return self.get_entry_map(group).get(name)
  1731.  
  1732.     
  1733.     def insert_on(self, path, loc = None):
  1734.         if not loc:
  1735.             pass
  1736.         loc = self.location
  1737.         if not loc:
  1738.             return None
  1739.         nloc = _normalize_cached(loc)
  1740.         bdir = os.path.dirname(nloc)
  1741.         npath = [ p for p in path ]
  1742.         bp = None
  1743.         for p, item in enumerate(npath):
  1744.             if item == nloc:
  1745.                 break
  1746.                 continue
  1747.             []
  1748.             if item == bdir and self.precedence == EGG_DIST:
  1749.                 path.insert(p, loc)
  1750.                 npath.insert(p, nloc)
  1751.                 break
  1752.                 continue
  1753.             None if path is sys.path else loc
  1754.         elif path is sys.path:
  1755.             self.check_version_conflict()
  1756.         
  1757.         path.append(loc)
  1758.         return None
  1759.         while None:
  1760.             
  1761.             try:
  1762.                 np = npath.index(nloc, p + 1)
  1763.             except ValueError:
  1764.                 break
  1765.                 continue
  1766.  
  1767.             del npath[np]
  1768.             del path[np]
  1769.             p = np
  1770.             continue
  1771.             return None
  1772.  
  1773.     
  1774.     def check_version_conflict(self):
  1775.         if self.key == 'setuptools':
  1776.             return None
  1777.         nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt'))
  1778.         loc = normalize_path(self.location)
  1779.         for modname in self._get_metadata('top_level.txt'):
  1780.             if modname not in sys.modules and modname in nsp or modname in _namespace_packages:
  1781.                 continue
  1782.             
  1783.             fn = getattr(sys.modules[modname], '__file__', None)
  1784.             if fn:
  1785.                 if normalize_path(fn).startswith(loc) or fn.startswith(loc):
  1786.                     continue
  1787.                 
  1788.             issue_warning('Module %s was already imported from %s, but %s is being added to sys.path' % (modname, fn, self.location))
  1789.         
  1790.  
  1791.     
  1792.     def has_version(self):
  1793.         
  1794.         try:
  1795.             self.version
  1796.         except ValueError:
  1797.             issue_warning('Unbuilt egg for ' + repr(self))
  1798.             return False
  1799.  
  1800.         return True
  1801.  
  1802.     
  1803.     def clone(self, **kw):
  1804.         for attr in ('project_name', 'version', 'py_version', 'platform', 'location', 'precedence'):
  1805.             kw.setdefault(attr, getattr(self, attr, None))
  1806.         
  1807.         kw.setdefault('metadata', self._provider)
  1808.         return self.__class__(**kw)
  1809.  
  1810.     
  1811.     def extras(self):
  1812.         return _[1]
  1813.  
  1814.     extras = property(extras)
  1815.  
  1816.  
  1817. def issue_warning(*args, **kw):
  1818.     level = 1
  1819.     g = globals()
  1820.     
  1821.     try:
  1822.         while sys._getframe(level).f_globals is g:
  1823.             level += 1
  1824.     except ValueError:
  1825.         pass
  1826.  
  1827.     warn = warn
  1828.     import warnings
  1829.     warn(stacklevel = level + 1, *args, **kw)
  1830.  
  1831.  
  1832. def parse_requirements(strs):
  1833.     lines = iter(yield_lines(strs))
  1834.     
  1835.     def scan_list(ITEM, TERMINATOR, line, p, groups, item_name):
  1836.         items = []
  1837.         while not TERMINATOR(line, p):
  1838.             if CONTINUE(line, p):
  1839.                 
  1840.                 try:
  1841.                     line = lines.next()
  1842.                     p = 0
  1843.                 except StopIteration:
  1844.                     raise ValueError('\\ must not appear on the last nonblank line')
  1845.                 except:
  1846.                     None<EXCEPTION MATCH>StopIteration
  1847.                 
  1848.  
  1849.             None<EXCEPTION MATCH>StopIteration
  1850.             match = ITEM(line, p)
  1851.             if not match:
  1852.                 raise ValueError('Expected ' + item_name + ' in', line, 'at', line[p:])
  1853.             match
  1854.             items.append(match.group(*groups))
  1855.             p = match.end()
  1856.             match = COMMA(line, p)
  1857.             if match:
  1858.                 p = match.end()
  1859.                 continue
  1860.             if not TERMINATOR(line, p):
  1861.                 raise ValueError("Expected ',' or end-of-list in", line, 'at', line[p:])
  1862.             TERMINATOR(line, p)
  1863.         match = TERMINATOR(line, p)
  1864.         if match:
  1865.             p = match.end()
  1866.         
  1867.         return (line, p, items)
  1868.  
  1869.     for line in lines:
  1870.         match = DISTRO(line)
  1871.         if not match:
  1872.             raise ValueError('Missing distribution spec', line)
  1873.         match
  1874.         project_name = match.group(1)
  1875.         p = match.end()
  1876.         extras = []
  1877.         match = OBRACKET(line, p)
  1878.         if match:
  1879.             p = match.end()
  1880.             (line, p, extras) = scan_list(DISTRO, CBRACKET, line, p, (1,), "'extra' name")
  1881.         
  1882.         (line, p, specs) = scan_list(VERSION, LINE_END, line, p, (1, 2), 'version spec')
  1883.         specs = [ (op, safe_version(val)) for op, val in specs ]
  1884.         yield Requirement(project_name, specs, extras)
  1885.         []
  1886.     
  1887.  
  1888.  
  1889. def _sort_dists(dists):
  1890.     tmp = [ (dist.hashcmp, dist) for dist in dists ]
  1891.     tmp.sort()
  1892.     dists[::-1] = [ d for hc, d in tmp ]
  1893.  
  1894.  
  1895. class Requirement:
  1896.     
  1897.     def __init__(self, project_name, specs, extras):
  1898.         self.unsafe_name = project_name
  1899.         project_name = safe_name(project_name)
  1900.         self.project_name = project_name
  1901.         self.key = project_name.lower()
  1902.         index = [ (parse_version(v), state_machine[op], op, v) for op, v in specs ]
  1903.         index.sort()
  1904.         self.specs = [ (op, ver) for parsed, trans, op, ver in index ]
  1905.         self.index = index
  1906.         self.extras = tuple(map(safe_extra, extras))
  1907.         self.hashCmp = ([], []([ (op, parsed) for parsed, trans, op, ver in index ]), frozenset(self.extras))
  1908.         self._Requirement__hash = hash(self.hashCmp)
  1909.  
  1910.     
  1911.     def __str__(self):
  1912.         specs = []([ ''.join(s) for s in self.specs ])
  1913.         extras = ','.join(self.extras)
  1914.         return '%s%s%s' % (self.project_name, extras, specs)
  1915.  
  1916.     
  1917.     def __eq__(self, other):
  1918.         if isinstance(other, Requirement):
  1919.             pass
  1920.         return self.hashCmp == other.hashCmp
  1921.  
  1922.     
  1923.     def __contains__(self, item):
  1924.         if isinstance(item, Distribution):
  1925.             if item.key != self.key:
  1926.                 return False
  1927.             if self.index:
  1928.                 item = item.parsed_version
  1929.             
  1930.         elif isinstance(item, basestring):
  1931.             item = parse_version(item)
  1932.         
  1933.         last = None
  1934.         for parsed, trans, op, ver in self.index:
  1935.             action = trans[cmp(item, parsed)]
  1936.             if action == 'F':
  1937.                 return False
  1938.             if action == 'T':
  1939.                 return True
  1940.             if action == '+':
  1941.                 last = True
  1942.                 continue
  1943.             action == 'T'
  1944.             if action == '-' or last is None:
  1945.                 last = False
  1946.                 continue
  1947.             action == 'F'
  1948.         
  1949.         if last is None:
  1950.             last = True
  1951.         
  1952.         return last
  1953.  
  1954.     
  1955.     def __hash__(self):
  1956.         return self._Requirement__hash
  1957.  
  1958.     
  1959.     def __repr__(self):
  1960.         return 'Requirement.parse(%r)' % str(self)
  1961.  
  1962.     
  1963.     def parse(s):
  1964.         reqs = list(parse_requirements(s))
  1965.         if reqs:
  1966.             if len(reqs) == 1:
  1967.                 return reqs[0]
  1968.             raise ValueError('Expected only one requirement', s)
  1969.         reqs
  1970.         raise ValueError('No requirements found', s)
  1971.  
  1972.     parse = staticmethod(parse)
  1973.  
  1974. state_machine = {
  1975.     '<': '--T',
  1976.     '<=': 'T-T',
  1977.     '>': 'F+F',
  1978.     '>=': 'T+F',
  1979.     '==': 'T..',
  1980.     '!=': 'F++' }
  1981.  
  1982. def _get_mro(cls):
  1983.     if not isinstance(cls, type):
  1984.         
  1985.         class cls(cls, object):
  1986.             pass
  1987.  
  1988.         return cls.__mro__[1:]
  1989.     return cls.__mro__
  1990.  
  1991.  
  1992. def _find_adapter(registry, ob):
  1993.     for t in _get_mro(getattr(ob, '__class__', type(ob))):
  1994.         if t in registry:
  1995.             return registry[t]
  1996.     
  1997.  
  1998.  
  1999. def ensure_directory(path):
  2000.     dirname = os.path.dirname(path)
  2001.     if not os.path.isdir(dirname):
  2002.         os.makedirs(dirname)
  2003.     
  2004.  
  2005.  
  2006. def split_sections(s):
  2007.     section = None
  2008.     content = []
  2009.     for line in yield_lines(s):
  2010.         if line.startswith('['):
  2011.             if line.endswith(']'):
  2012.                 if section or content:
  2013.                     yield (section, content)
  2014.                 
  2015.                 section = line[1:-1].strip()
  2016.                 content = []
  2017.             else:
  2018.                 raise ValueError('Invalid section heading', line)
  2019.         line.endswith(']')
  2020.         content.append(line)
  2021.     
  2022.     yield (section, content)
  2023.  
  2024.  
  2025. def _mkstemp(*args, **kw):
  2026.     mkstemp = mkstemp
  2027.     import tempfile
  2028.     old_open = os.open
  2029.     
  2030.     try:
  2031.         os.open = os_open
  2032.         return mkstemp(*args, **kw)
  2033.     finally:
  2034.         os.open = old_open
  2035.  
  2036.  
  2037. _manager = ResourceManager()
  2038.  
  2039. def _initialize(g):
  2040.     for name in dir(_manager):
  2041.         if not name.startswith('_'):
  2042.             g[name] = getattr(_manager, name)
  2043.             continue
  2044.     
  2045.  
  2046. _initialize(globals())
  2047. _declare_state('object', working_set = WorkingSet())
  2048.  
  2049. try:
  2050.     from __main__ import __requires__
  2051. except ImportError:
  2052.     pass
  2053.  
  2054.  
  2055. try:
  2056.     working_set.require(__requires__)
  2057. except VersionConflict:
  2058.     working_set = WorkingSet([])
  2059.     for dist in working_set.resolve(parse_requirements(__requires__), Environment()):
  2060.         working_set.add(dist)
  2061.     
  2062.     for entry in sys.path:
  2063.         if entry not in working_set.entries:
  2064.             working_set.add_entry(entry)
  2065.         
  2066.     
  2067.     sys.path[:] = working_set.entries
  2068.  
  2069. require = working_set.require
  2070. iter_entry_points = working_set.iter_entry_points
  2071. add_activation_listener = working_set.subscribe
  2072. run_script = working_set.run_script
  2073. run_main = run_script
  2074. add_activation_listener((lambda dist: dist.activate()))
  2075. working_set.entries = []
  2076. map(working_set.add_entry, sys.path)
  2077.