#!/usr/bin/env python from json import JSONDecodeError from pathlib import Path from typing import Union from dynaconf.vendor.tomllib import TOMLDecodeError from dynaconf.vendor.ruamel.yaml import YAMLError from.exceptions import BoxError from.box import Box from.box_list import BoxList __all__=['box_from_file'] def _to_json(data): try:return Box.from_json(data) except JSONDecodeError:raise BoxError('File is not JSON as expected') except BoxError:return BoxList.from_json(data) def _to_yaml(data): try:return Box.from_yaml(data) except YAMLError:raise BoxError('File is not YAML as expected') except BoxError:return BoxList.from_yaml(data) def _to_toml(data): try:return Box.from_toml(data) except TOMLDecodeError:raise BoxError('File is not TOML as expected') def box_from_file(file,file_type=None,encoding='utf-8',errors='strict'): C=file_type;A=file if not isinstance(A,Path):A=Path(A) if not A.exists():raise BoxError(f'file "{A}" does not exist') B=A.read_text(encoding=encoding,errors=errors) if C: if C.lower()=='json':return _to_json(B) if C.lower()=='yaml':return _to_yaml(B) if C.lower()=='toml':return _to_toml(B) raise BoxError(f'"{C}" is an unknown type, please use either toml, yaml or json') if A.suffix in('.json','.jsn'):return _to_json(B) if A.suffix in('.yaml','.yml'):return _to_yaml(B) if A.suffix in('.tml','.toml'):return _to_toml(B) raise BoxError(f"Could not determine file type based off extension, please provide file_type")