def get_optional_dir(self, name, exists=False): if not ProjectOptions.get("platformio.%s_dir" % name): raise ValueError("Unknown optional directory -> " + name) if name == "core": result = self._get_core_dir(exists) else: result = self.get("platformio", name + "_dir") if result is None: return None project_dir = os.getcwd() # patterns if "$PROJECT_HASH" in result: result = result.replace( "$PROJECT_HASH", "%s-%s" % ( os.path.basename(project_dir), sha1(hashlib_encode_data(project_dir)).hexdigest()[:10], ), ) if "$PROJECT_DIR" in result: result = result.replace("$PROJECT_DIR", project_dir) if "$PROJECT_CORE_DIR" in result: result = result.replace("$PROJECT_CORE_DIR", self.get_optional_dir("core")) if "$PROJECT_WORKSPACE_DIR" in result: result = result.replace("$PROJECT_WORKSPACE_DIR", self.get_optional_dir("workspace")) if result.startswith("~"): result = fs.expanduser(result) result = os.path.realpath(result) if exists and not os.path.isdir(result): os.makedirs(result) return result
def get(self, section, option, default=None): # pylint: disable=too-many-branches value = None try: value = self.getraw(section, option) except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): pass # handle value from system environment except ConfigParser.Error as e: raise exception.InvalidProjectConf(self.path, str(e)) option_meta = ProjectOptions.get("%s.%s" % (section.split(":", 1)[0], option)) if not option_meta: return value or default if option_meta.multiple: value = self.parse_multi_values(value) if option_meta.sysenvvar: envvar_value = os.getenv(option_meta.sysenvvar) if not envvar_value and option_meta.oldnames: for oldoption in option_meta.oldnames: envvar_value = os.getenv("PLATFORMIO_" + oldoption.upper()) if envvar_value: break if envvar_value and option_meta.multiple: value = value or [] value.extend(self.parse_multi_values(envvar_value)) elif envvar_value and not value: value = envvar_value # option is not specified by user if value is None or (option_meta.multiple and value == [] and option_meta.default): return default if default is not None else option_meta.default try: return self.cast_to(value, option_meta.type) except click.BadParameter as e: if not self.expand_interpolations: return value raise exception.ProjectOptionValueError(e.format_message(), option, section)
def getraw( # pylint: disable=too-many-branches self, section, option, default=MISSING): if not self.expand_interpolations: return self._parser.get(section, option) value = MISSING for sec, opt in self.walk_options(section): if opt == option: value = self._parser.get(sec, option) break option_meta = ProjectOptions.get("%s.%s" % (section.split(":", 1)[0], option)) if not option_meta: if value == MISSING: value = (default if default != MISSING else self._parser.get( section, option)) return self._expand_interpolations(value) if option_meta.sysenvvar: envvar_value = os.getenv(option_meta.sysenvvar) if not envvar_value and option_meta.oldnames: for oldoption in option_meta.oldnames: envvar_value = os.getenv("PLATFORMIO_" + oldoption.upper()) if envvar_value: break if envvar_value and option_meta.multiple: if value == MISSING: value = "" value += ("\n" if value else "") + envvar_value elif envvar_value and value == MISSING: value = envvar_value if value == MISSING: value = default if default != MISSING else option_meta.default if value == MISSING: return None return self._expand_interpolations(value)
def get(self, section, option, default=MISSING): value = None try: value = self.getraw(section, option, default) except ConfigParser.Error as e: raise exception.InvalidProjectConfError(self.path, str(e)) option_meta = ProjectOptions.get("%s.%s" % (section.split(":", 1)[0], option)) if not option_meta: return value if option_meta.multiple: value = self.parse_multi_values(value or []) try: return self.cast_to(value, option_meta.type) except click.BadParameter as e: if not self.expand_interpolations: return value raise exception.ProjectOptionValueError(e.format_message(), option, section)