Chromium Code Reviews| Index: scripts/slave/recipe_modules/conda/api.py |
| diff --git a/scripts/slave/recipe_modules/conda/api.py b/scripts/slave/recipe_modules/conda/api.py |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..68db830019e4ad15245edc0e28c79fa6868c4ff6 |
| --- /dev/null |
| +++ b/scripts/slave/recipe_modules/conda/api.py |
| @@ -0,0 +1,107 @@ |
| +# Copyright 2015 The Chromium Authors. All rights reserved. |
| +# Use of this source code is governed by a BSD-style license that can be |
| +# found in the LICENSE file. |
| + |
| +"""Functions to work with Miniconda python environment. |
| + |
| +See http://conda.pydata.org/miniconda.html |
| +""" |
| + |
| +from recipe_engine import recipe_api |
| + |
| + |
| +class CondaEnv(object): |
| + def __init__(self, module_api, version, path): |
| + self._module_api = module_api |
| + self.version = version |
| + self.path = path |
| + |
| + def install(self, pkg): |
| + """Installs a conda package into the environment.""" |
| + return self._call(['install', pkg]) |
| + |
| + def convert_to_cipd_package(self, package_name, output_file): |
| + """Packages Conda environment as CIPD package. |
| + |
| + It also destroys it in the process (by irreversibly mutating it to be |
| + prefix independent, as much as possible). It is not possible to install |
| + new packages into the environment once it has been mutated. |
| + |
| + Args: |
| + package_name: name of the CIPD package, 'infra/conda_python/linux-amd64'. |
| + output_file: path to put *.cipd package to. |
| + """ |
| + self._call(['clean', '--tarballs', '--index-cache', '--packages']) |
| + self._module_api.m.python( |
| + 'make conda env location independent', |
| + self._module_api.resource('butcher_conda.py'), |
| + args=[self.path]) |
| + self._module_api.m.cipd.build( |
| + input_dir=self.path, |
| + output_package=output_file, |
| + package_name=package_name, |
| + install_mode='copy') |
|
iannucci
2015/12/14 20:44:05
wipe afterwards if it's destroyed anyway?
Vadim Sh.
2016/01/09 00:59:45
The environment still can be used to call scripts
|
| + |
| + def wipe(self): |
| + """Wipes the directory with Conda installation.""" |
| + return self._module_api.m.file.rmtree('removing conda', self.path) |
| + |
| + def _call(self, cmd): |
| + if self._module_api.m.platform.is_win: |
| + conda_exe = self.path.join('Scripts', 'conda.exe') |
| + else: |
| + conda_exe = self.path.join('bin', 'conda') |
|
iannucci
2015/12/14 20:44:05
I would make this a @property
Vadim Sh.
2016/01/09 00:59:45
Done.
|
| + return self._module_api.m.step( |
| + ' '.join(['conda'] + cmd), |
| + [conda_exe] + cmd + ['--yes'], |
| + env={'PYTHONPATH': ''}) |
|
iannucci
2015/12/14 20:44:04
I think {"PYTHONPATH": None} will delete it entire
Vadim Sh.
2016/01/09 00:59:45
Done.
|
| + |
| + |
| +class CondaApi(recipe_api.RecipeApi): |
| + def install(self, version, path): |
| + """Downloads Miniconda installer for given version and executes it. |
| + |
| + Args: |
| + version: version of Miniconda to install, e.g. 'Miniconda2-3.18.3'. |
| + path: prefix to install Miniconda into. |
| + |
| + Returns: |
| + Instance of CondaEnv. |
| + """ |
| + # Construct URL to installer. See https://repo.continuum.io/miniconda/. |
|
iannucci
2015/12/14 20:44:05
break out into @property?
Vadim Sh.
2016/01/09 00:59:45
Not worth it. I can't imagine it to be used anywhe
|
| + os = { |
| + 'linux': 'Linux', |
| + 'mac': 'MacOSX', |
| + 'win': 'Windows', |
| + }[self.m.platform.name] |
| + arch = { |
| + 32: 'x86', |
| + 64: 'x86_64', |
| + }[self.m.platform.bits] |
| + ext = '.exe' if self.m.platform.is_win else '.sh' |
| + url = ( |
| + 'https://repo.continuum.io/miniconda/%s-%s-%s%s' % |
| + (version, os, arch, ext)) |
| + |
| + # Fetch installer into temp directory and install Conda to 'path'. |
| + # We acknowledge the license agreement. |
|
iannucci
2015/12/14 20:44:05
what if it changes? Should we archive this to cipd
Vadim Sh.
2016/01/09 00:59:45
License text is inside the conda environment (part
|
| + tmp = self.m.path.mkdtemp('conda') |
| + installer = tmp.join(url[url.rfind('/')+1:]) |
| + try: |
| + self.m.url.fetch_to_file( |
| + url=url, |
| + path=installer, |
| + step_name='fetch miniconda installer', |
| + attempts=5) |
| + # See http://conda.pydata.org/docs/help/silent.html |
| + if self.m.platform.is_win: |
| + install_cmd = [ |
| + installer, '/InstallationType=JustMe', '/AddToPath=0', |
| + '/RegisterPython=0', '/S', '/D=' + str(path), |
| + ] |
| + else: |
| + install_cmd = ['/bin/bash', installer, '-b', '-p', path] |
| + self.m.step('install miniconda', install_cmd, env={'PYTHONPATH': ''}) |
| + return CondaEnv(self, version, path) |
| + finally: |
| + self.m.file.rmtree('remove miniconda installer', tmp) |