# HG changeset patch # User ymh # Date 1377681363 -7200 # Node ID 63c5437a9b7d8ef68f06a8b666347315355845a9 # Parent aaa8629d42c98278d0d38df16097f5f7f636b123 allow usage of requirement files for virtualenv diff -r aaa8629d42c9 -r 63c5437a9b7d virtualenv/res/lib/lib_create_env.py --- a/virtualenv/res/lib/lib_create_env.py Tue Aug 27 22:18:57 2013 +0200 +++ b/virtualenv/res/lib/lib_create_env.py Wed Aug 28 11:16:03 2013 +0200 @@ -39,14 +39,18 @@ class ResourcesEnv(object): - def __init__(self, src_base, urls, normal_installs): + def __init__(self, src_base, run_base, urls, normal_installs): self.src_base = src_base + self.run_base = run_base self.URLS = {} self.__init_url(urls) self.NORMAL_INSTALL = normal_installs def get_src_base_path(self, fpath): return os.path.abspath(os.path.join(self.src_base, fpath)).replace("\\","/") + + def get_run_res_base_path(self, fpath): + return os.path.abspath(os.path.join(self.run_base, 'res', fpath)).replace("\\","/") def __add_package_def(self, key, dict): self.URLS[key] = dict @@ -54,10 +58,14 @@ def __init_url(self, urls): for key, url_dict in urls.items(): url_dict_copy = url_dict.copy() + if url_dict.get('install', {}).get('method','pip') == 'pip-req': + get_base_path = self.get_run_res_base_path + else: + get_base_path = self.get_src_base_path if not url_dict['url'].startswith("http://"): - url_dict_copy['url'] = self.get_src_base_path(url_dict['url']) - url_dict_copy['local'] = self.get_src_base_path(url_dict['local']) - + url_dict_copy['url'] = get_base_path(url_dict['url']) + url_dict_copy['local'] = get_base_path(url_dict['local']) + self.__add_package_def(key, url_dict_copy ) def ensure_dir(dir, logger): @@ -184,13 +192,13 @@ install_zlib = gen_install_comp_lib("zlib", "ZLIB", []) -def lib_generate_install_methods(path_locations, src_base, Logger, call_subprocess, normal_installs, options_to_add=None, urls= None): +def lib_generate_install_methods(path_locations, src_base, run_base, Logger, call_subprocess, normal_installs, options_to_add=None, urls= None): all_urls = URLS.copy() if urls is not None: all_urls.update(urls) - res_env = ResourcesEnv(src_base, all_urls, normal_installs) + res_env = ResourcesEnv(src_base, run_base, all_urls, normal_installs) def filter_python_develop(line): if not line.strip(): @@ -203,13 +211,13 @@ return Logger.NOTIFY - def normal_install(key, method, option_str, extra_env, res_source_key, home_dir, tmp_dir, res_env, logger, call_subprocess): - logger.notify("Install %s from %s with %s" % (key,res_env.URLS[key][res_source_key],method)) + def normal_install(key, res_path, method, option_str, extra_env, res_source_key, home_dir, tmp_dir, res_env, logger, call_subprocess): + logger.notify("Install %s from %s with %s" % (key,res_path,method)) if method == 'pip': if sys.platform == 'win32': - args = [os.path.abspath(os.path.join(home_dir, 'Scripts', 'pip')), 'install', res_env.URLS[key][res_source_key]] + args = [os.path.abspath(os.path.join(home_dir, 'Scripts', 'pip')), 'install', res_path] else: - args = [os.path.abspath(os.path.join(home_dir, 'bin', 'pip')), 'install', res_env.URLS[key][res_source_key]] + args = [os.path.abspath(os.path.join(home_dir, 'bin', 'pip')), 'install', res_path] if option_str : args.append(option_str) if res_source_key == 'local': @@ -219,7 +227,27 @@ args.insert(2, '-f') args.insert(3, res_env.get_src_base_path("")) args.insert(4, '--no-index') - logger.notify("Install %s from %s with %s args %s " % (key,res_env.URLS[key][res_source_key],method, repr(args))) + logger.notify("Install %s from %s with %s args %s " % (key,res_path,method, repr(args))) + call_subprocess(args, + cwd=os.path.abspath(tmp_dir), + filter_stdout=filter_python_develop, + show_stdout=True, + extra_env=extra_env) + if method == 'pip-req': + if sys.platform == 'win32': + args = [os.path.abspath(os.path.join(home_dir, 'Scripts', 'pip')), 'install', '-r', res_path] + else: + args = [os.path.abspath(os.path.join(home_dir, 'bin', 'pip')), 'install', '-r', res_path] + if option_str : + args.append(option_str) + if res_source_key == 'local': + if extra_env is None: + extra_env = {} + extra_env["PIP_DOWNLOAD_CACHE"] = res_env.get_src_base_path("") + args.insert(2, '-f') + args.insert(3, res_env.get_src_base_path("")) + args.insert(4, '--no-index') + logger.notify("Install %s from %s with %s args %s " % (key,res_path,method, repr(args))) call_subprocess(args, cwd=os.path.abspath(tmp_dir), filter_stdout=filter_python_develop, @@ -227,9 +255,9 @@ extra_env=extra_env) else: if sys.platform == 'win32': - args = [os.path.abspath(os.path.join(home_dir, 'Scripts', 'easy_install')), res_env.URLS[key][res_source_key]] + args = [os.path.abspath(os.path.join(home_dir, 'Scripts', 'easy_install')), res_path] else: - args = [os.path.abspath(os.path.join(home_dir, 'bin', 'easy_install')), res_env.URLS[key][res_source_key]] + args = [os.path.abspath(os.path.join(home_dir, 'bin', 'easy_install')), res_path] if option_str : args.insert(1,option_str) call_subprocess(args, @@ -272,9 +300,16 @@ logger.indent += 2 try: for key in res_env.NORMAL_INSTALL: - if key not in res_env.URLS: - logger.notify("%s not found in def : passing" % (key,)) - install_options = res_env.URLS[key].get('install', None) + install_options = None + if isinstance(key, dict): + install_options = key.get('install', default_install_options) + install_options['method'] = 'pip-req' + res_path = res_env.get_run_res_base_path(key['requirement']) + else: + if key not in res_env.URLS: + logger.notify("%s not found in def : passing" % (key,)) + install_options = res_env.URLS[key].get('install', None) + res_path = res_env.URLS[key][res_source_key] if install_options is None: install_options = default_install_options method = install_options.get('method', default_install_options['method']) @@ -293,7 +328,7 @@ elif method in globals() and callable(globals()[method]) and method not in ['pip', 'easy_install']: 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) else: - normal_install(key, method, option_str, extra_env, res_source_key, home_dir, tmp_dir, res_env, logger, call_subprocess) + normal_install(key, res_path, method, option_str, extra_env, res_source_key, home_dir, tmp_dir, res_env, logger, call_subprocess) logger.notify("Clear source dir") shutil.rmtree(src_dir) diff -r aaa8629d42c9 -r 63c5437a9b7d virtualenv/web/create_python_env.py --- a/virtualenv/web/create_python_env.py Tue Aug 27 22:18:57 2013 +0200 +++ b/virtualenv/web/create_python_env.py Wed Aug 28 11:16:03 2013 +0200 @@ -40,7 +40,7 @@ EXTRA_TEXT += "sys.path.append('%s')\n" % (lib_path) EXTRA_TEXT += "sys.path.append('%s')\n" % (os.path.abspath(os.path.join(here,"res")).replace("\\","/")) EXTRA_TEXT += "from res_create_env import generate_install_methods\n" -EXTRA_TEXT += "adjust_options, extend_parser, after_install = generate_install_methods(path_locations, '%s', Logger, call_subprocess)\n" % (src_base) +EXTRA_TEXT += "adjust_options, extend_parser, after_install = generate_install_methods(path_locations, '%s', '%s', Logger, call_subprocess)\n" % (src_base, here) def main(): python_version = ".".join(map(str,sys.version_info[0:2])) diff -r aaa8629d42c9 -r 63c5437a9b7d virtualenv/web/env/.keepme diff -r aaa8629d42c9 -r 63c5437a9b7d virtualenv/web/res/requirement.txt --- a/virtualenv/web/res/requirement.txt Tue Aug 27 22:18:57 2013 +0200 +++ b/virtualenv/web/res/requirement.txt Wed Aug 28 11:16:03 2013 +0200 @@ -8,7 +8,7 @@ django-extensions==1.1.1 django-filter==0.7 djangorestframework==2.3.7 -html5lib==python-1.0b1 +html5lib==1.0b3 isodate==0.4.9 psycopg2==2.5 pyparsing==1.5.7 diff -r aaa8629d42c9 -r 63c5437a9b7d virtualenv/web/res/res_create_env.py --- a/virtualenv/web/res/res_create_env.py Tue Aug 27 22:18:57 2013 +0200 +++ b/virtualenv/web/res/res_create_env.py Wed Aug 28 11:16:03 2013 +0200 @@ -6,24 +6,25 @@ INSTALLS = [ #(key,method, option_str, dict_extra_env) - 'SIX', - 'WSGIREF', - 'REQUESTS', - 'SIMPLEJSON', - 'ISODATE', - 'PYPARSING', - 'HTML5LIB', - 'PSYCOPG2', - 'SOUTH', - 'DJANGO', - 'DJANGO-EXTENSIONS', - 'RDFLIB', - 'SPARQLWRAPPER', - 'DEFUSEDXML', - 'DJANGO-CORS-HEADERS', - 'DJANGO-FILTERS', - 'MARKDOWN', - 'DJANGO-REST-FRAMEWORK', + {'requirement':'requirement.txt', 'install': {'option_str': None, 'dict_extra_env': None}}, +# 'SIX', +# 'WSGIREF', +# 'REQUESTS', +# 'SIMPLEJSON', +# 'ISODATE', +# 'PYPARSING', +# 'HTML5LIB', +# 'PSYCOPG2', +# 'DJANGO', +# 'DJANGO-EXTENSIONS', +# 'SOUTH', +# 'RDFLIB', +# 'SPARQLWRAPPER', +# 'DEFUSEDXML', +# 'DJANGO-CORS-HEADERS', +# 'DJANGO-FILTER', +# 'MARKDOWN', +# 'DJANGO-REST-FRAMEWORK', ] if system_str == "Linux": @@ -33,5 +34,5 @@ if system_str != 'Linux': OPTIONS_TO_ADD.append('use_distribute') -def generate_install_methods(path_locations, src_base, Logger, call_subprocess): - return lib_generate_install_methods(path_locations, src_base, Logger, call_subprocess, INSTALLS, OPTIONS_TO_ADD) +def generate_install_methods(path_locations, src_base, run_base, Logger, call_subprocess): + return lib_generate_install_methods(path_locations, src_base, run_base, Logger, call_subprocess, INSTALLS, OPTIONS_TO_ADD)