def _process_base_package(config: dict) -> dict: repo_dir = git.clone_or_update( url=config[CONF_URL], ref=config.get(CONF_REF), refresh=config[CONF_REFRESH], domain=DOMAIN, username=config.get(CONF_USERNAME), password=config.get(CONF_PASSWORD), ) files: str = config[CONF_FILES] packages = {} for file in files: yaml_file: Path = repo_dir / file if not yaml_file.is_file(): raise cv.Invalid(f"{file} does not exist in repository", path=[CONF_FILES]) try: packages[file] = yaml_util.load_yaml(yaml_file) except EsphomeError as e: raise cv.Invalid( f"{file} is not a valid YAML file. Please check the file contents." ) from e return {"packages": packages}
def test_include_with_vars(fixture_path): yaml_file = fixture_path / "yaml_util" / "includetest.yaml" actual = yaml_util.load_yaml(yaml_file) substitutions.do_substitution_pass(actual, None) assert actual["esphome"]["name"] == "original" assert actual["esphome"]["libraries"][0] == "Wire" assert actual["esphome"]["board"] == "nodemcu" assert actual["wifi"]["ssid"] == "my_custom_ssid"
def _load_config(command_line_substitutions): try: config = yaml_util.load_yaml(CORE.config_path) except EsphomeError as e: raise InvalidYAMLError(e) from e try: result = validate_config(config, command_line_substitutions) except EsphomeError: raise except Exception: _LOGGER.error("Unexpected exception while reading configuration:") raise return result
def _load_config(): try: config = yaml_util.load_yaml(CORE.config_path) except EsphomeError as e: raise InvalidYAMLError(e) CORE.raw_config = config try: result = validate_config(config) except EsphomeError: raise except Exception: _LOGGER.error(u"Unexpected exception while reading configuration:") raise return result
def get(self): filename = None for secret_filename in const.SECRETS_FILES: relative_filename = settings.rel_path(secret_filename) if os.path.isfile(relative_filename): filename = relative_filename break if filename is None: self.send_error(404) return secret_keys = list(yaml_util.load_yaml(filename, clear_secrets=False)) self.set_header("content-type", "application/json") self.write(json.dumps(secret_keys))
def load_config(): try: config = yaml_util.load_yaml(CORE.config_path) except OSError: raise EsphomeError(u"Invalid YAML at {}".format(CORE.config_path)) CORE.raw_config = config config = substitutions.do_substitution_pass(config) core_config.preload_core_config(config) try: result = validate_config(config) except EsphomeError: raise except Exception: _LOGGER.error(u"Unexpected exception while reading configuration:") raise return result
def _dump_config(): return dump(strip_default_ids(load_yaml(CORE.config_path)))
def command_rename(args, config): for c in args.name: if c not in ALLOWED_NAME_CHARS: print( color( Fore.BOLD_RED, f"'{c}' is an invalid character for names. Valid characters are: " f"{ALLOWED_NAME_CHARS} (lowercase, no spaces)", )) return 1 # Load existing yaml file with open(CORE.config_path, mode="r+", encoding="utf-8") as raw_file: raw_contents = raw_file.read() yaml = yaml_util.load_yaml(CORE.config_path) if CONF_ESPHOME not in yaml or CONF_NAME not in yaml[CONF_ESPHOME]: print( color(Fore.BOLD_RED, "Complex YAML files cannot be automatically renamed.")) return 1 old_name = yaml[CONF_ESPHOME][CONF_NAME] match = re.match(r"^\$\{?([a-zA-Z0-9_]+)\}?$", old_name) if match is None: new_raw = re.sub( rf"name:\s+[\"']?{old_name}[\"']?", f'name: "{args.name}"', raw_contents, ) else: old_name = yaml[CONF_SUBSTITUTIONS][match.group(1)] if (len( re.findall( rf"^\s+{match.group(1)}:\s+[\"']?{old_name}[\"']?", raw_contents, flags=re.MULTILINE, )) > 1): print( color(Fore.BOLD_RED, "Too many matches in YAML to safely rename")) return 1 new_raw = re.sub( rf"^(\s+{match.group(1)}):\s+[\"']?{old_name}[\"']?", f'\\1: "{args.name}"', raw_contents, flags=re.MULTILINE, ) new_path = os.path.join(CORE.config_dir, args.name + ".yaml") print( f"Updating {color(Fore.CYAN, CORE.config_path)} to {color(Fore.CYAN, new_path)}" ) print() with open(new_path, mode="w", encoding="utf-8") as new_file: new_file.write(new_raw) rc = run_external_process("esphome", "config", new_path) if rc != 0: print(color(Fore.BOLD_RED, "Rename failed. Reverting changes.")) os.remove(new_path) return 1 cli_args = [ "run", new_path, "--no-logs", "--device", CORE.address, ] if args.dashboard: cli_args.insert(0, "--dashboard") try: rc = run_external_process("esphome", *cli_args) except KeyboardInterrupt: rc = 1 if rc != 0: os.remove(new_path) return 1 os.remove(CORE.config_path) print(color(Fore.BOLD_GREEN, "SUCCESS")) print() return 0