move some methods of FormattingConfig to general Config type

This commit is contained in:
Maximilian Keßler 2022-02-07 17:28:09 +01:00
parent 225cd19788
commit 2f335e39fa
2 changed files with 73 additions and 51 deletions

View file

@ -1,7 +1,35 @@
from typing import List, Optional, Dict, Tuple from typing import List, Optional, Dict, Tuple, Union
import json
import yaml
from pathlib import Path from pathlib import Path
def clean_dict(dictionary: Dict) -> Optional[Dict]:
aux = {
k: clean_dict(v) for k, v in dictionary.items() if type(v) == dict
} | {
k: v for k, v in dictionary.items() if type(v) != dict
}
aux2 = {
k: v for k, v in aux.items() if v is not None
}
return aux2 if aux2 != {} else None
def recursive_merge_dictionaries(dict1: Dict, dict2: Dict) -> Dict:
aux1 = {
k: v for k, v in dict1.items() if type(v) == dict
}
aux2 = {
k: v for k, v in dict2.items() if type(v) == dict
}
merged = {
k: recursive_merge_dictionaries(v, aux2[k]) for k, v in aux1.items() if k in aux2.keys()
}
return dict1 | dict2 | merged
class Config: class Config:
def merge_with(self, other, strict: bool = False): def merge_with(self, other, strict: bool = False):
""" """
@ -18,6 +46,49 @@ class Config:
raise NotImplementedError raise NotImplementedError
return self return self
@classmethod
def from_json(cls, content: Union[Path, Dict]):
if isinstance(content, Path):
with open(content, 'r') as config:
content: Dict = json.load(config)
config = cls()
config.set_from_json(content)
return config
@classmethod
def from_yaml(cls, path: Path):
with open(path, 'r') as config:
path: Dict = yaml.safe_load(config)
return cls.from_json(path)
def set_from_json(self, content: Dict):
raise NotImplementedError
def to_json(self) -> Dict:
raise NotImplementedError
def dump_as_yaml(self, filename: Path, clean_none_entries: bool = True):
with filename.open('w') as file:
if clean_none_entries:
simple_dict = clean_dict(self.to_json())
else:
simple_dict = self.to_json()
if simple_dict is not None:
yaml.dump(simple_dict, file)
else:
pass # TODO
def dump_as_json(self, filename: Path, clean_none_entries: bool = True):
with open(filename, 'w') as config:
if clean_none_entries:
simple_dict = clean_dict(self.to_json())
else:
simple_dict = self.to_json()
if simple_dict is not None:
json.dump(simple_dict, config)
else:
pass # TODO
class FormatterIF: class FormatterIF:
""" """

View file

@ -4,7 +4,7 @@ import yaml
import json import json
from .enums import NamingScheme from .enums import NamingScheme
from .generic_text import GenericText from .generic_text import GenericText
from .formatterif import Config from .formatterif import Config, recursive_merge_dictionaries
from .git_version_info import GitVersionInfo from .git_version_info import GitVersionInfo
from .constants import * from .constants import *
from .enums import TeXType, TeXFlavour from .enums import TeXType, TeXFlavour
@ -30,32 +30,6 @@ class VersionInfo:
return self._repo_version return self._repo_version
def clean_dict(dictionary: Dict) -> Optional[Dict]:
aux = {
k: clean_dict(v) for k, v in dictionary.items() if type(v) == dict
} | {
k: v for k, v in dictionary.items() if type(v) != dict
}
aux2 = {
k: v for k, v in aux.items() if v is not None
}
return aux2 if aux2 != {} else None
def recursive_merge_dictionaries(dict1: Dict, dict2: Dict) -> Dict:
aux1 = {
k: v for k, v in dict1.items() if type(v) == dict
}
aux2 = {
k: v for k, v in dict2.items() if type(v) == dict
}
merged = {
k: recursive_merge_dictionaries(v, aux2[k]) for k, v in aux1.items() if k in aux2.keys()
}
return dict1 | dict2 | merged
class FormattingConfig(Config): class FormattingConfig(Config):
def __init__(self): def __init__(self):
self._naming_scheme: Optional[Union[NamingScheme, str]] = None self._naming_scheme: Optional[Union[NamingScheme, str]] = None
@ -133,29 +107,6 @@ class FormattingConfig(Config):
self._include_ins = docstrip[YAML_INCLUDE_INS] self._include_ins = docstrip[YAML_INCLUDE_INS]
self._docstrip_guards = docstrip[YAML_DOCSTRIP_GUARDS] self._docstrip_guards = docstrip[YAML_DOCSTRIP_GUARDS]
@classmethod
def from_yaml(cls, content: Path):
with open(content, 'r') as config:
content: Dict = yaml.safe_load(config)
return cls.from_json(content)
@classmethod
def from_json(cls, content: Union[Path, Dict]):
if isinstance(content, Path):
with open(content, 'r') as config:
content: Dict = json.load(config)
config = FormattingConfig()
config.set_from_json(content)
return config
def dump_as_yaml(self, filename: Path):
with filename.open('w') as file:
simple_dict = clean_dict(self.to_json())
if simple_dict is not None:
yaml.dump(simple_dict, file)
else:
pass # TODO
def to_json(self) -> Dict: def to_json(self) -> Dict:
return { return {
YAML_INFO: { YAML_INFO: {