virtualenv/res/lib/lib_create_env.py
changeset 3 63c5437a9b7d
parent 2 aaa8629d42c9
child 89 49fda47ceb16
equal deleted inserted replaced
2:aaa8629d42c9 3:63c5437a9b7d
    37     'WSGIREF': {'setup': 'wsgiref','url': 'https://pypi.python.org/packages/source/w/wsgiref/wsgiref-0.1.2.zip', 'local':"wsgiref-0.1.2.zip", 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}},
    37     'WSGIREF': {'setup': 'wsgiref','url': 'https://pypi.python.org/packages/source/w/wsgiref/wsgiref-0.1.2.zip', 'local':"wsgiref-0.1.2.zip", 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}},
    38 }
    38 }
    39 
    39 
    40 class ResourcesEnv(object):
    40 class ResourcesEnv(object):
    41 
    41 
    42     def __init__(self, src_base, urls, normal_installs):
    42     def __init__(self, src_base, run_base, urls, normal_installs):
    43         self.src_base = src_base
    43         self.src_base = src_base
       
    44         self.run_base = run_base
    44         self.URLS = {}
    45         self.URLS = {}
    45         self.__init_url(urls)
    46         self.__init_url(urls)
    46         self.NORMAL_INSTALL = normal_installs
    47         self.NORMAL_INSTALL = normal_installs
    47 
    48 
    48     def get_src_base_path(self, fpath):
    49     def get_src_base_path(self, fpath):
    49         return os.path.abspath(os.path.join(self.src_base, fpath)).replace("\\","/")
    50         return os.path.abspath(os.path.join(self.src_base, fpath)).replace("\\","/")
       
    51 
       
    52     def get_run_res_base_path(self, fpath):
       
    53         return os.path.abspath(os.path.join(self.run_base, 'res', fpath)).replace("\\","/")    
    50     
    54     
    51     def __add_package_def(self, key, dict):
    55     def __add_package_def(self, key, dict):
    52         self.URLS[key] = dict
    56         self.URLS[key] = dict
    53         
    57         
    54     def __init_url(self, urls):
    58     def __init_url(self, urls):
    55         for key, url_dict in urls.items():
    59         for key, url_dict in urls.items():
    56             url_dict_copy = url_dict.copy()
    60             url_dict_copy = url_dict.copy()
       
    61             if url_dict.get('install', {}).get('method','pip') == 'pip-req':
       
    62                 get_base_path = self.get_run_res_base_path
       
    63             else:
       
    64                 get_base_path = self.get_src_base_path                                
    57             if not url_dict['url'].startswith("http://"):
    65             if not url_dict['url'].startswith("http://"):
    58                 url_dict_copy['url'] = self.get_src_base_path(url_dict['url'])
    66                 url_dict_copy['url'] = get_base_path(url_dict['url'])
    59             url_dict_copy['local'] = self.get_src_base_path(url_dict['local'])            
    67             url_dict_copy['local'] = get_base_path(url_dict['local'])
    60             
    68 
    61             self.__add_package_def(key, url_dict_copy )
    69             self.__add_package_def(key, url_dict_copy )
    62 
    70 
    63 def ensure_dir(dir, logger):
    71 def ensure_dir(dir, logger):
    64     logger.notify('Check directory %s' % dir)
    72     logger.notify('Check directory %s' % dir)
    65     if not os.path.exists(dir):
    73     if not os.path.exists(dir):
   182 
   190 
   183 install_libjpeg = gen_install_comp_lib("libjpeg", "LIBJPEG", ['--enable-shared'])
   191 install_libjpeg = gen_install_comp_lib("libjpeg", "LIBJPEG", ['--enable-shared'])
   184 install_zlib = gen_install_comp_lib("zlib", "ZLIB", [])
   192 install_zlib = gen_install_comp_lib("zlib", "ZLIB", [])
   185     
   193     
   186 
   194 
   187 def lib_generate_install_methods(path_locations, src_base, Logger, call_subprocess, normal_installs, options_to_add=None, urls= None):
   195 def lib_generate_install_methods(path_locations, src_base, run_base, Logger, call_subprocess, normal_installs, options_to_add=None, urls= None):
   188     
   196     
   189     all_urls = URLS.copy()
   197     all_urls = URLS.copy()
   190     if urls is not None:
   198     if urls is not None:
   191         all_urls.update(urls)
   199         all_urls.update(urls)
   192         
   200         
   193     res_env = ResourcesEnv(src_base, all_urls, normal_installs)
   201     res_env = ResourcesEnv(src_base, run_base, all_urls, normal_installs)
   194 
   202 
   195     def filter_python_develop(line):
   203     def filter_python_develop(line):
   196         if not line.strip():
   204         if not line.strip():
   197             return Logger.DEBUG
   205             return Logger.DEBUG
   198         for prefix in ['Searching for', 'Reading ', 'Best match: ', 'Processing ',
   206         for prefix in ['Searching for', 'Reading ', 'Best match: ', 'Processing ',
   201             if line.startswith(prefix):
   209             if line.startswith(prefix):
   202                 return Logger.DEBUG
   210                 return Logger.DEBUG
   203         return Logger.NOTIFY
   211         return Logger.NOTIFY
   204     
   212     
   205     
   213     
   206     def normal_install(key, method, option_str, extra_env, res_source_key, home_dir, tmp_dir, res_env, logger, call_subprocess):
   214     def normal_install(key, res_path, method, option_str, extra_env, res_source_key, home_dir, tmp_dir, res_env, logger, call_subprocess):
   207         logger.notify("Install %s from %s with %s" % (key,res_env.URLS[key][res_source_key],method))
   215         logger.notify("Install %s from %s with %s" % (key,res_path,method))
   208         if method == 'pip':
   216         if method == 'pip':
   209             if sys.platform == 'win32':
   217             if sys.platform == 'win32':
   210                 args = [os.path.abspath(os.path.join(home_dir, 'Scripts', 'pip')), 'install', res_env.URLS[key][res_source_key]]
   218                 args = [os.path.abspath(os.path.join(home_dir, 'Scripts', 'pip')), 'install', res_path]
   211             else:
   219             else:
   212                 args = [os.path.abspath(os.path.join(home_dir, 'bin', 'pip')), 'install', res_env.URLS[key][res_source_key]]
   220                 args = [os.path.abspath(os.path.join(home_dir, 'bin', 'pip')), 'install', res_path]
   213             if option_str :
   221             if option_str :
   214                 args.append(option_str)
   222                 args.append(option_str)
   215             if res_source_key == 'local':
   223             if res_source_key == 'local':
   216                 if extra_env is None:
   224                 if extra_env is None:
   217                     extra_env = {}
   225                     extra_env = {}
   218                 extra_env["PIP_DOWNLOAD_CACHE"] = res_env.get_src_base_path("")
   226                 extra_env["PIP_DOWNLOAD_CACHE"] = res_env.get_src_base_path("")
   219                 args.insert(2, '-f')
   227                 args.insert(2, '-f')
   220                 args.insert(3, res_env.get_src_base_path(""))
   228                 args.insert(3, res_env.get_src_base_path(""))
   221                 args.insert(4, '--no-index')
   229                 args.insert(4, '--no-index')
   222             logger.notify("Install %s from %s with %s args %s " % (key,res_env.URLS[key][res_source_key],method, repr(args)))
   230             logger.notify("Install %s from %s with %s args %s " % (key,res_path,method, repr(args)))
       
   231             call_subprocess(args,
       
   232                     cwd=os.path.abspath(tmp_dir),
       
   233                     filter_stdout=filter_python_develop,
       
   234                     show_stdout=True,
       
   235                     extra_env=extra_env)
       
   236         if method == 'pip-req':
       
   237             if sys.platform == 'win32':
       
   238                 args = [os.path.abspath(os.path.join(home_dir, 'Scripts', 'pip')), 'install', '-r', res_path]
       
   239             else:
       
   240                 args = [os.path.abspath(os.path.join(home_dir, 'bin', 'pip')), 'install', '-r', res_path]
       
   241             if option_str :
       
   242                 args.append(option_str)
       
   243             if res_source_key == 'local':
       
   244                 if extra_env is None:
       
   245                     extra_env = {}
       
   246                 extra_env["PIP_DOWNLOAD_CACHE"] = res_env.get_src_base_path("")
       
   247                 args.insert(2, '-f')
       
   248                 args.insert(3, res_env.get_src_base_path(""))
       
   249                 args.insert(4, '--no-index')
       
   250             logger.notify("Install %s from %s with %s args %s " % (key,res_path,method, repr(args)))
   223             call_subprocess(args,
   251             call_subprocess(args,
   224                     cwd=os.path.abspath(tmp_dir),
   252                     cwd=os.path.abspath(tmp_dir),
   225                     filter_stdout=filter_python_develop,
   253                     filter_stdout=filter_python_develop,
   226                     show_stdout=True,
   254                     show_stdout=True,
   227                     extra_env=extra_env)
   255                     extra_env=extra_env)
   228         else:
   256         else:
   229             if sys.platform == 'win32':
   257             if sys.platform == 'win32':
   230                 args = [os.path.abspath(os.path.join(home_dir, 'Scripts', 'easy_install')), res_env.URLS[key][res_source_key]]
   258                 args = [os.path.abspath(os.path.join(home_dir, 'Scripts', 'easy_install')), res_path]
   231             else:
   259             else:
   232                 args = [os.path.abspath(os.path.join(home_dir, 'bin', 'easy_install')), res_env.URLS[key][res_source_key]]
   260                 args = [os.path.abspath(os.path.join(home_dir, 'bin', 'easy_install')), res_path]
   233             if option_str :
   261             if option_str :
   234                 args.insert(1,option_str)
   262                 args.insert(1,option_str)
   235             call_subprocess(args,
   263             call_subprocess(args,
   236                     cwd=os.path.abspath(tmp_dir),
   264                     cwd=os.path.abspath(tmp_dir),
   237                     filter_stdout=filter_python_develop,
   265                     filter_stdout=filter_python_develop,
   270             ignore_packages = options.ignore_packages.split(",")
   298             ignore_packages = options.ignore_packages.split(",")
   271         
   299         
   272         logger.indent += 2
   300         logger.indent += 2
   273         try:    
   301         try:    
   274             for key in res_env.NORMAL_INSTALL:
   302             for key in res_env.NORMAL_INSTALL:
   275                 if key not in res_env.URLS:
   303                 install_options = None
   276                     logger.notify("%s not found in def : passing" % (key,))
   304                 if isinstance(key, dict):
   277                 install_options = res_env.URLS[key].get('install', None)
   305                     install_options = key.get('install', default_install_options)
       
   306                     install_options['method'] = 'pip-req'
       
   307                     res_path = res_env.get_run_res_base_path(key['requirement'])
       
   308                 else:
       
   309                     if key not in res_env.URLS:
       
   310                         logger.notify("%s not found in def : passing" % (key,))
       
   311                     install_options = res_env.URLS[key].get('install', None)
       
   312                     res_path = res_env.URLS[key][res_source_key]
   278                 if install_options is None:
   313                 if install_options is None:
   279                     install_options = default_install_options
   314                     install_options = default_install_options
   280                 method = install_options.get('method', default_install_options['method'])
   315                 method = install_options.get('method', default_install_options['method'])
   281                 option_str = install_options.get('option_str', default_install_options['option_str'])
   316                 option_str = install_options.get('option_str', default_install_options['option_str'])
   282                 extra_env = install_options.get('dict_extra_env', default_install_options['dict_extra_env'])
   317                 extra_env = install_options.get('dict_extra_env', default_install_options['dict_extra_env'])
   291                     if callable(method):
   326                     if callable(method):
   292                         method(option_str, extra_env, res_source_key, home_dir, lib_dir, tmp_dir, src_dir, res_env, logger, call_subprocess, filter_python_develop)
   327                         method(option_str, extra_env, res_source_key, home_dir, lib_dir, tmp_dir, src_dir, res_env, logger, call_subprocess, filter_python_develop)
   293                     elif method in globals() and callable(globals()[method]) and method not in ['pip', 'easy_install']:  
   328                     elif method in globals() and callable(globals()[method]) and method not in ['pip', 'easy_install']:  
   294                         globals()[method](option_str, extra_env, res_source_key, home_dir, lib_dir, tmp_dir, src_dir, res_env, logger, call_subprocess, filter_python_develop)
   329                         globals()[method](option_str, extra_env, res_source_key, home_dir, lib_dir, tmp_dir, src_dir, res_env, logger, call_subprocess, filter_python_develop)
   295                     else:
   330                     else:
   296                         normal_install(key, method, option_str, extra_env, res_source_key, home_dir, tmp_dir, res_env, logger, call_subprocess)
   331                         normal_install(key, res_path, method, option_str, extra_env, res_source_key, home_dir, tmp_dir, res_env, logger, call_subprocess)
   297                             
   332                             
   298             logger.notify("Clear source dir")
   333             logger.notify("Clear source dir")
   299             shutil.rmtree(src_dir)
   334             shutil.rmtree(src_dir)
   300     
   335     
   301         finally:
   336         finally: