Commit a9387815 by Arun Babu Neelicattu

config: add support for installer.parallel

This change allows users to disable parallel execution while using the
new installer.

Resolves: #3087
parent 68d6939f
...@@ -103,6 +103,15 @@ Defaults to one of the following directories: ...@@ -103,6 +103,15 @@ Defaults to one of the following directories:
- Windows: `C:\Users\<username>\AppData\Local\pypoetry\Cache` - Windows: `C:\Users\<username>\AppData\Local\pypoetry\Cache`
- Unix: `~/.cache/pypoetry` - Unix: `~/.cache/pypoetry`
### `installer.parallel`: boolean
Use parallel execution when using the new (`>=1.1.0`) installer.
Defaults to `true`.
!!!note:
This configuration will be ignored, and parallel execution disabled when running
Python 2.7 under Windows.
### `virtualenvs.create`: boolean ### `virtualenvs.create`: boolean
Create a new virtual environment if one doesn't already exist. Create a new virtual environment if one doesn't already exist.
......
...@@ -39,6 +39,7 @@ class Config(object): ...@@ -39,6 +39,7 @@ class Config(object):
"options": {"always-copy": False}, "options": {"always-copy": False},
}, },
"experimental": {"new-installer": True}, "experimental": {"new-installer": True},
"installer": {"parallel": True},
} }
def __init__( def __init__(
...@@ -140,6 +141,7 @@ class Config(object): ...@@ -140,6 +141,7 @@ class Config(object):
"virtualenvs.create", "virtualenvs.create",
"virtualenvs.in-project", "virtualenvs.in-project",
"virtualenvs.options.always-copy", "virtualenvs.options.always-copy",
"installer.parallel",
}: }:
return boolean_validator return boolean_validator
...@@ -151,6 +153,7 @@ class Config(object): ...@@ -151,6 +153,7 @@ class Config(object):
"virtualenvs.create", "virtualenvs.create",
"virtualenvs.in-project", "virtualenvs.in-project",
"virtualenvs.options.always-copy", "virtualenvs.options.always-copy",
"installer.parallel",
}: }:
return boolean_normalizer return boolean_normalizer
......
...@@ -69,6 +69,7 @@ To remove a repository (repo is a short alias for repositories): ...@@ -69,6 +69,7 @@ To remove a repository (repo is a short alias for repositories):
boolean_normalizer, boolean_normalizer,
False, False,
), ),
"installer.parallel": (boolean_validator, boolean_normalizer, True,),
} }
return unique_config_values return unique_config_values
......
...@@ -32,7 +32,7 @@ from .operations.update import Update ...@@ -32,7 +32,7 @@ from .operations.update import Update
class Executor(object): class Executor(object):
def __init__(self, env, pool, config, io, parallel=True): def __init__(self, env, pool, config, io, parallel=None):
self._env = env self._env = env
self._io = io self._io = io
self._dry_run = False self._dry_run = False
...@@ -42,6 +42,9 @@ class Executor(object): ...@@ -42,6 +42,9 @@ class Executor(object):
self._chef = Chef(config, self._env) self._chef = Chef(config, self._env)
self._chooser = Chooser(pool, self._env) self._chooser = Chooser(pool, self._env)
if parallel is None:
parallel = config.get("installer.parallel", True)
if parallel and not (PY2 and WINDOWS): if parallel and not (PY2 and WINDOWS):
# This should be directly handled by ThreadPoolExecutor # This should be directly handled by ThreadPoolExecutor
# however, on some systems the number of CPUs cannot be determined # however, on some systems the number of CPUs cannot be determined
......
import os import os
import pytest
def test_config_get_default_value(config):
assert config.get("virtualenvs.create") is True @pytest.mark.parametrize(
("name", "value"), [("installer.parallel", True), ("virtualenvs.create", True)]
)
def test_config_get_default_value(config, name, value):
assert config.get(name) is value
def test_config_get_processes_depended_on_values(config): def test_config_get_processes_depended_on_values(config):
assert os.path.join("/foo", "virtualenvs") == config.get("virtualenvs.path") assert os.path.join("/foo", "virtualenvs") == config.get("virtualenvs.path")
def test_config_get_from_environment_variable(config, environ): @pytest.mark.parametrize(
assert config.get("virtualenvs.create") ("name", "env_value", "value"),
[
os.environ["POETRY_VIRTUALENVS_CREATE"] = "false" ("installer.parallel", "true", True),
assert not config.get("virtualenvs.create") ("installer.parallel", "false", False),
("virtualenvs.create", "true", True),
("virtualenvs.create", "false", False),
],
)
def test_config_get_from_environment_variable(config, environ, name, env_value, value):
env_var = "POETRY_{}".format("_".join(k.upper() for k in name.split(".")))
os.environ[env_var] = env_value
assert config.get(name) is value
...@@ -6,6 +6,8 @@ import pytest ...@@ -6,6 +6,8 @@ import pytest
from poetry.config.config_source import ConfigSource from poetry.config.config_source import ConfigSource
from poetry.core.pyproject import PyProjectException from poetry.core.pyproject import PyProjectException
from poetry.factory import Factory from poetry.factory import Factory
from poetry.utils._compat import PY2
from poetry.utils._compat import WINDOWS
@pytest.fixture() @pytest.fixture()
...@@ -28,6 +30,7 @@ def test_list_displays_default_value_if_not_set(tester, config): ...@@ -28,6 +30,7 @@ def test_list_displays_default_value_if_not_set(tester, config):
expected = """cache-dir = "/foo" expected = """cache-dir = "/foo"
experimental.new-installer = true experimental.new-installer = true
installer.parallel = true
virtualenvs.create = true virtualenvs.create = true
virtualenvs.in-project = null virtualenvs.in-project = null
virtualenvs.options.always-copy = false virtualenvs.options.always-copy = false
...@@ -46,6 +49,7 @@ def test_list_displays_set_get_setting(tester, config): ...@@ -46,6 +49,7 @@ def test_list_displays_set_get_setting(tester, config):
expected = """cache-dir = "/foo" expected = """cache-dir = "/foo"
experimental.new-installer = true experimental.new-installer = true
installer.parallel = true
virtualenvs.create = false virtualenvs.create = false
virtualenvs.in-project = null virtualenvs.in-project = null
virtualenvs.options.always-copy = false virtualenvs.options.always-copy = false
...@@ -86,6 +90,7 @@ def test_list_displays_set_get_local_setting(tester, config): ...@@ -86,6 +90,7 @@ def test_list_displays_set_get_local_setting(tester, config):
expected = """cache-dir = "/foo" expected = """cache-dir = "/foo"
experimental.new-installer = true experimental.new-installer = true
installer.parallel = true
virtualenvs.create = false virtualenvs.create = false
virtualenvs.in-project = null virtualenvs.in-project = null
virtualenvs.options.always-copy = false virtualenvs.options.always-copy = false
...@@ -122,3 +127,25 @@ def test_set_cert(tester, auth_config_source, mocker): ...@@ -122,3 +127,25 @@ def test_set_cert(tester, auth_config_source, mocker):
tester.execute("certificates.foo.cert path/to/ca.pem") tester.execute("certificates.foo.cert path/to/ca.pem")
assert "path/to/ca.pem" == auth_config_source.config["certificates"]["foo"]["cert"] assert "path/to/ca.pem" == auth_config_source.config["certificates"]["foo"]["cert"]
def test_config_installer_parallel(tester, command_tester_factory):
serial_enforced = PY2 and WINDOWS
tester.execute("--local installer.parallel")
assert tester.io.fetch_output().strip() == "true"
workers = command_tester_factory(
"install"
)._command._installer._executor._max_workers
assert workers > 1 or (serial_enforced and workers == 1)
tester.io.clear_output()
tester.execute("--local installer.parallel false")
tester.execute("--local installer.parallel")
assert tester.io.fetch_output().strip() == "false"
workers = command_tester_factory(
"install"
)._command._installer._executor._max_workers
assert workers == 1
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment