home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_2398 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  66.5 KB  |  2,085 lines

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