From cdebbe693e7ec43461a761daac8105ed64f29082 Mon Sep 17 00:00:00 2001 From: Sylvain MOUQUET Date: Thu, 31 Aug 2017 02:16:34 +0200 Subject: [PATCH 1/2] Add support for types of environment variable An environment variable like ${FOO:-1} is replaced to 1 (int) and not '1' (string) Signed-off-by: Sylvain Mouquet --- compose/config/interpolation.py | 15 ++++++++++++++- tests/unit/config/interpolation_test.py | 12 ++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/compose/config/interpolation.py b/compose/config/interpolation.py index b13ac591aad..8ffeb7ef72d 100644 --- a/compose/config/interpolation.py +++ b/compose/config/interpolation.py @@ -8,6 +8,7 @@ from .errors import ConfigurationError from compose.const import COMPOSEFILE_V2_0 as V2_0 +from ast import literal_eval log = logging.getLogger(__name__) @@ -21,10 +22,22 @@ def __init__(self, templater, mapping): def interpolate(self, string): try: - return self.templater(string).substitute(self.mapping) + str=self.templater(string).substitute(self.mapping) + try: + return literal_eval(str) + except: + return str + except ValueError: raise InvalidInterpolation(string) +def interpolate_parse_int(s): + try: + res = int(eval(str(s))) + if type(res) == int: + return res + except: + return def interpolate_environment_variables(version, config, section, environment): if version <= V2_0: diff --git a/tests/unit/config/interpolation_test.py b/tests/unit/config/interpolation_test.py index 018a5621a4c..f383f152155 100644 --- a/tests/unit/config/interpolation_test.py +++ b/tests/unit/config/interpolation_test.py @@ -146,3 +146,15 @@ def test_interpolate_missing_with_default(defaults_interpolator): def test_interpolate_with_empty_and_default_value(defaults_interpolator): assert defaults_interpolator("ok ${BAR:-def}") == "ok def" assert defaults_interpolator("ok ${BAR-def}") == "ok " + +def test_interpolate_types(defaults_interpolator): + assert defaults_interpolator("${BAR:-1}") == 1 + assert defaults_interpolator("${BAR:--1}") == -1 + assert defaults_interpolator("${BAR:-1.2}") == 1.2 + assert defaults_interpolator("${BAR:-True}") == True + assert defaults_interpolator("${BAR:-False}") == False + assert defaults_interpolator("${BAR:-\"True\"}") == "True" + assert defaults_interpolator("${BAR:-\"False\"}") == "False" + assert defaults_interpolator("${BAR:-\"1\"}") == "1" + assert defaults_interpolator("${BAR:-\"1.2\"}") == "1.2" + assert defaults_interpolator("${BAR:-\"foo\"}") == "foo" From 26a04eae9e66866af29026f5cacb9e71deb33ec1 Mon Sep 17 00:00:00 2001 From: Sylvain MOUQUET Date: Thu, 31 Aug 2017 09:17:12 +0200 Subject: [PATCH 2/2] Remove unused function Signed-off-by: Sylvain Mouquet --- compose/config/interpolation.py | 8 -------- script/test/all | 5 ----- 2 files changed, 13 deletions(-) diff --git a/compose/config/interpolation.py b/compose/config/interpolation.py index 8ffeb7ef72d..df8537cd46f 100644 --- a/compose/config/interpolation.py +++ b/compose/config/interpolation.py @@ -31,14 +31,6 @@ def interpolate(self, string): except ValueError: raise InvalidInterpolation(string) -def interpolate_parse_int(s): - try: - res = int(eval(str(s))) - if type(res) == int: - return res - except: - return - def interpolate_environment_variables(version, config, section, environment): if version <= V2_0: interpolator = Interpolator(Template, environment) diff --git a/script/test/all b/script/test/all index 1200c496e27..affb735e510 100755 --- a/script/test/all +++ b/script/test/all @@ -5,11 +5,6 @@ set -e >&2 echo "Running lint checks" -docker run --rm \ - --tty \ - ${GIT_VOLUME} \ - --entrypoint="tox" \ - "$TAG" -e pre-commit get_versions="docker run --rm --entrypoint=/code/.tox/py27/bin/python