Improve type converting for config options

This commit is contained in:
Ivan Kravets
2019-05-30 17:34:44 +03:00
parent 0ce2343836
commit 346579b93c
3 changed files with 17 additions and 16 deletions

View File

@@ -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:")]

View File

@@ -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),

View File

@@ -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"