commit: 2d7ed7a1fdac828dc5f6b26ec279b2d1e4ee83da
Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
AuthorDate: Wed Aug 16 23:23:09 2017 +0000
Commit: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
CommitDate: Wed Aug 16 23:25:27 2017 +0000
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=2d7ed7a1
repoman: config.py: Fix whitespace
repoman/pym/repoman/config.py | 245 +++++++++++++++++++++---------------------
1 file changed, 124 insertions(+), 121 deletions(-)
diff --git a/repoman/pym/repoman/config.py b/repoman/pym/repoman/config.py
index 2825aee04..f41945c13 100644
--- a/repoman/pym/repoman/config.py
+++ b/repoman/pym/repoman/config.py
@@ -11,133 +11,136 @@ import yaml
class ConfigError(Exception):
- """Raised when a config file fails to load"""
- pass
+ """Raised when a config file fails to load"""
+ pass
def merge_config(base, head):
- """
- Merge two JSON or YAML documents into a single object. Arrays are
- merged by extension. If dissimilar types are encountered, then the
- head value overwrites the base value.
- """
-
- if isinstance(head, dict):
- if not isinstance(base, dict):
- return copy.deepcopy(head)
-
- result = {}
- for k in itertools.chain(head, base):
- try:
- result[k] = merge_config(base[k], head[k])
- except KeyError:
- try:
- result[k] = copy.deepcopy(head[k])
- except KeyError:
- result[k] = copy.deepcopy(base[k])
-
- elif isinstance(head, list):
- result = []
- if not isinstance(base, list):
- result.extend(copy.deepcopy(x) for x in head)
- else:
- if any(isinstance(x, (dict, list)) for x in itertools.chain(head,
base)):
- # merge items with identical indexes
- for x, y in zip(base, head):
- if isinstance(x, (dict, list)):
- result.append(merge_config(x, y))
- else:
- # head overwrites base (preserving index)
- result.append(copy.deepcopy(y))
- # copy remaining items from the longer list
- if len(base) != len(head):
- if len(base) > len(head):
- result.extend(copy.deepcopy(x) for x in
base[len(head):])
- else:
- result.extend(copy.deepcopy(x) for x in
head[len(base):])
- else:
- result.extend(copy.deepcopy(x) for x in base)
- result.extend(copy.deepcopy(x) for x in head)
-
- else:
- result = copy.deepcopy(head)
-
- return result
+ """
+ Merge two JSON or YAML documents into a single object. Arrays are
+ merged by extension. If dissimilar types are encountered, then the
+ head value overwrites the base value.
+ """
+
+ if isinstance(head, dict):
+ if not isinstance(base, dict):
+ return copy.deepcopy(head)
+
+ result = {}
+ for k in itertools.chain(head, base):
+ try:
+ result[k] = merge_config(base[k], head[k])
+ except KeyError:
+ try:
+ result[k] = copy.deepcopy(head[k])
+ except KeyError:
+ result[k] = copy.deepcopy(base[k])
+
+ elif isinstance(head, list):
+ result = []
+ if not isinstance(base, list):
+ result.extend(copy.deepcopy(x) for x in head)
+ else:
+ if any(isinstance(x, (dict, list)) for x in
itertools.chain(head, base)):
+ # merge items with identical indexes
+ for x, y in zip(base, head):
+ if isinstance(x, (dict, list)):
+ result.append(merge_config(x,
y))
+ else:
+ # head overwrites base
(preserving index)
+ result.append(copy.deepcopy(y))
+ # copy remaining items from the longer list
+ if len(base) != len(head):
+ if len(base) > len(head):
+ result.extend(copy.deepcopy(x)
for x in base[len(head):])
+ else:
+ result.extend(copy.deepcopy(x)
for x in head[len(base):])
+ else:
+ result.extend(copy.deepcopy(x) for x in base)
+ result.extend(copy.deepcopy(x) for x in head)
+
+ else:
+ result = copy.deepcopy(head)
+
+ return result
def _yaml_load(filename):
- """
- Load filename as YAML and return a dict. Raise ConfigError if
- it fails to load.
- """
- with open(filename, 'rt') as f:
- try:
- return yaml.safe_load(f)
- except yaml.parser.ParserError as e:
- raise ConfigError("{}: {}".format(filename, e))
+ """
+ Load filename as YAML and return a dict. Raise ConfigError if
+ it fails to load.
+ """
+ with open(filename, 'rt') as f:
+ try:
+ return yaml.safe_load(f)
+ except yaml.parser.ParserError as e:
+ raise ConfigError("{}: {}".format(filename, e))
def _json_load(filename):
- """
- Load filename as JSON and return a dict. Raise ConfigError if
- it fails to load.
- """
- with open(filename, 'rt') as f:
- try:
- return json.load(f) #nosec
- except ValueError as e:
- raise ConfigError("{}: {}".format(filename, e))
+ """
+ Load filename as JSON and return a dict. Raise ConfigError if
+ it fails to load.
+ """
+ with open(filename, 'rt') as f:
+ try:
+ return json.load(f) #nosec
+ except ValueError as e:
+ raise ConfigError("{}: {}".format(filename, e))
def iter_files(files_dirs):
- """
- Iterate over nested file paths in lexical order.
- """
- stack = list(reversed(files_dirs))
- while stack:
- location = stack.pop()
- try:
- st = os.stat(location)
- except FileNotFoundError:
- continue
-
- if stat.S_ISDIR(st.st_mode):
- stack.extend(os.path.join(location, x)
- for x in sorted(os.listdir(location), reverse=True))
-
- elif stat.S_ISREG(st.st_mode):
- yield location
-
-def load_config(conf_dirs, file_extensions=None):
- """
- Load JSON and/or YAML files from a directories, and merge them together
- into a single object.
- """
-
- result = {}
- for filename in iter_files(conf_dirs):
- if file_extensions is not None and not
filename.endswith(file_extensions):
- continue
-
- loaders = []
- if filename.endswith('.json'):
- loaders.append(_json_load)
- elif filename.endswith('.yaml'):
- loaders.append(_yaml_load)
- else:
- loaders.append(_yaml_load)
- loaders.append(_json_load)
-
- config = None
- for loader in loaders:
- try:
- config = loader(filename) or {}
- except ConfigError as e:
- exception = e
- else:
- break
-
- if config is None:
- raise exception
-
- if config:
- result = merge_config(result, config)
-
- return result
+ """
+ Iterate over nested file paths in lexical order.
+ """
+ stack = list(reversed(files_dirs))
+ while stack:
+ location = stack.pop()
+ try:
+ st = os.stat(location)
+ except FileNotFoundError:
+ continue
+
+ if stat.S_ISDIR(st.st_mode):
+ stack.extend(os.path.join(location, x)
+ for x in sorted(os.listdir(location),
reverse=True))
+
+ elif stat.S_ISREG(st.st_mode):
+ yield location
+
+def load_config(conf_dirs, file_extensions=None, valid_versions=None):
+ """
+ Load JSON and/or YAML files from a directories, and merge them together
+ into a single object.
+ """
+
+ result = {}
+ for filename in iter_files(conf_dirs):
+ if file_extensions is not None and not
filename.endswith(file_extensions):
+ continue
+
+ loaders = []
+ if filename.endswith('.json'):
+ loaders.append(_json_load)
+ elif filename.endswith('.yaml'):
+ loaders.append(_yaml_load)
+ else:
+ loaders.append(_yaml_load)
+ loaders.append(_json_load)
+
+ config = None
+ for loader in loaders:
+ try:
+ config = loader(filename) or {}
+ except ConfigError as e:
+ exception = e
+ else:
+ break
+
+ if config is None:
+ raise exception
+
+ if config:
+ if config['version'] not in valid_versions:
+ raise ConfigError("Invalid file version: %s in:
%s\nPlease upgrade repoman: current valid versions: %s"
+ % (config['version'], filename,
valid_versions))
+ result = merge_config(result, config)
+
+ return result