From 346579b93c16448eb50e24be2e49374c870d0f82 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 30 May 2019 17:34:44 +0300 Subject: [PATCH] Improve type converting for config options --- platformio/project/config.py | 28 +++++++++++++++------------- platformio/project/options.py | 3 +-- tests/test_projectconf.py | 2 +- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/platformio/project/config.py b/platformio/project/config.py index decbab72..181a6944 100644 --- a/platformio/project/config.py +++ b/platformio/project/config.py @@ -185,7 +185,7 @@ class ProjectConfig(object): option_meta = ProjectOptions.get( "%s.%s" % (section.split(":", 1)[0], option)) if not option_meta: - return default + return value or default if value and option_meta.multiple: value = self.parse_multi_values(value) @@ -207,19 +207,21 @@ class ProjectConfig(object): if value is None: return default - # cast types - if not isinstance(value, (list, tuple)): - value = [value] - for i, v in enumerate(value): - if option_meta.type == bool: - value[i] = v in ("1", "true", "yes") - elif option_meta.type == int: - value[i] = int(v) - elif option_meta.type == float: - value[i] = float(v) - value = value if option_meta.multiple else value[0] + return self._covert_value(value, option_meta.type) - return value + @staticmethod + def _covert_value(value, to_type): + items = value + if not isinstance(value, (list, tuple)): + items = [value] + for i, v in enumerate(items): + if to_type == bool: + items[i] = v in ("1", "true", "yes", "y") + elif to_type == int: + items[i] = int(v) + elif to_type == float: + items[i] = float(v) + return items if isinstance(value, (list, tuple)) else items[0] def envs(self): return [s[4:] for s in self._parser.sections() if s.startswith("env:")] diff --git a/platformio/project/options.py b/platformio/project/options.py index a5dd5615..b4bd705a 100644 --- a/platformio/project/options.py +++ b/platformio/project/options.py @@ -150,8 +150,7 @@ ProjectOptions = OrderedDict([ # Monitor ConfigEnvOption(name="monitor_port"), - ConfigEnvOption( - name="monitor_speed", oldnames=["monitor_baud"]), + ConfigEnvOption(name="monitor_speed", oldnames=["monitor_baud"]), ConfigEnvOption(name="monitor_rts"), ConfigEnvOption(name="monitor_dtr"), ConfigEnvOption(name="monitor_flags", multiple=True), diff --git a/tests/test_projectconf.py b/tests/test_projectconf.py index 5f10b305..69b6308b 100644 --- a/tests/test_projectconf.py +++ b/tests/test_projectconf.py @@ -102,7 +102,7 @@ def test_real_config(tmpdir): assert not config.has_option("custom", "monitor_speed") # sysenv - assert config.get("custom", "extra_flags") == "" + assert config.get("custom", "extra_flags") is None assert config.get("env:base", "build_flags") == ["-D DEBUG=1"] assert config.get("env:base", "upload_port") is None assert config.get("env:extra_2", "upload_port") == "/dev/extra_2/port"