allow usage of requirement files for virtualenv
authorymh <ymh.work@gmail.com>
Wed, 28 Aug 2013 11:16:03 +0200
changeset 3 63c5437a9b7d
parent 2 aaa8629d42c9
child 4 047675624f45
allow usage of requirement files for virtualenv
virtualenv/res/lib/lib_create_env.py
virtualenv/web/create_python_env.py
virtualenv/web/env/.keepme
virtualenv/web/res/requirement.txt
virtualenv/web/res/res_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)
--- 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]))
--- 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
--- 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)