Mercurial > hgrepos > Python > libs > ConfigMix
annotate configmix/__init__.py @ 167:d8155c429171 v0.6
+++++ v0.6
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Thu, 14 Mar 2019 09:37:18 +0100 |
| parents | b5ce9a8461bf |
| children | c247a5dc35ed |
| rev | line source |
|---|---|
|
0
53ea2bc254e7
Begin a package to abstract some of the important configuration handling stuff.
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
1 # -*- coding: utf-8 -*- |
|
82
218807d7d883
Remove header markup from the Python files and put them into the doc .rst files
Franz Glasner <hg@dom66.de>
parents:
79
diff
changeset
|
2 """A library for helping with configuration files. |
|
4
f76d85ccc5b9
Switch to the "New BSD License"
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
0
diff
changeset
|
3 |
|
73
6216c561532a
Put a Copyright and License notice into the package's __init__.py
Franz Glasner <hg@dom66.de>
parents:
69
diff
changeset
|
4 :Author: Franz Glasner |
|
156
e2e8d21b4122
Adjust copyright to year 2019
Franz Glasner <fzglas.hg@dom66.de>
parents:
144
diff
changeset
|
5 :Copyright: (c) 2015–2019, Franz Glasner. |
|
73
6216c561532a
Put a Copyright and License notice into the package's __init__.py
Franz Glasner <hg@dom66.de>
parents:
69
diff
changeset
|
6 All rights reserved. |
|
78
3a8f712d27df
Put copyright and license into the README.txt
Franz Glasner <hg@dom66.de>
parents:
73
diff
changeset
|
7 :License: 3-clause BSD License. |
|
73
6216c561532a
Put a Copyright and License notice into the package's __init__.py
Franz Glasner <hg@dom66.de>
parents:
69
diff
changeset
|
8 See LICENSE.txt for details. |
|
6216c561532a
Put a Copyright and License notice into the package's __init__.py
Franz Glasner <hg@dom66.de>
parents:
69
diff
changeset
|
9 :ID: $Header$ |
|
4
f76d85ccc5b9
Switch to the "New BSD License"
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
0
diff
changeset
|
10 |
|
f76d85ccc5b9
Switch to the "New BSD License"
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
0
diff
changeset
|
11 """ |
|
0
53ea2bc254e7
Begin a package to abstract some of the important configuration handling stuff.
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
12 |
|
53ea2bc254e7
Begin a package to abstract some of the important configuration handling stuff.
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
13 from __future__ import division, print_function, absolute_import |
|
53ea2bc254e7
Begin a package to abstract some of the important configuration handling stuff.
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
14 |
|
53ea2bc254e7
Begin a package to abstract some of the important configuration handling stuff.
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
15 |
| 167 | 16 __version__ = "0.6" |
|
0
53ea2bc254e7
Begin a package to abstract some of the important configuration handling stuff.
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
17 |
|
163
ff03cdf36139
The README.txt should be in the most important parts readable without keyword substitutions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
156
diff
changeset
|
18 __revision__ = "|VCSRevision|" |
|
ff03cdf36139
The README.txt should be in the most important parts readable without keyword substitutions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
156
diff
changeset
|
19 __date__ = "|VCSJustDate|" |
|
52
6c7f90dbce98
Adjusted the Copyright and change the RCS keywords in accordance with "kwarchive"
Franz Glasner <hg@dom66.de>
parents:
45
diff
changeset
|
20 |
|
0
53ea2bc254e7
Begin a package to abstract some of the important configuration handling stuff.
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
21 |
|
10
58af59d5af40
A "safe_merge" that makes (shallow) copies instead of directly manipulating given containers
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
9
diff
changeset
|
22 import copy |
|
58af59d5af40
A "safe_merge" that makes (shallow) copies instead of directly manipulating given containers
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
9
diff
changeset
|
23 |
|
166
b5ce9a8461bf
Use the filesystem encoding explicitely where appropriate.
Franz Glasner <fzglas.hg@dom66.de>
parents:
165
diff
changeset
|
24 from .compat import u, u2fs |
|
22
6a91db2c2469
A convenience function to load and merge a list of configuration files with different styles
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
13
diff
changeset
|
25 from .config import Configuration |
|
10
58af59d5af40
A "safe_merge" that makes (shallow) copies instead of directly manipulating given containers
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
9
diff
changeset
|
26 |
|
22
6a91db2c2469
A convenience function to load and merge a list of configuration files with different styles
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
13
diff
changeset
|
27 |
|
139
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
28 __all__ = ["load", "safe_load", |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
29 "set_loader", "default_loaders", |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
30 "Configuration"] |
|
22
6a91db2c2469
A convenience function to load and merge a list of configuration files with different styles
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
13
diff
changeset
|
31 |
|
6a91db2c2469
A convenience function to load and merge a list of configuration files with different styles
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
13
diff
changeset
|
32 |
|
144
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
33 COMMENTS = [u("__comment"), |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
34 u("__doc"), |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
35 ] |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
36 """Prefixes for comment configuration keys that are to be handled as |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
37 comments |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
38 |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
39 """ |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
40 |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
41 |
|
22
6a91db2c2469
A convenience function to load and merge a list of configuration files with different styles
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
13
diff
changeset
|
42 def load(*files): |
|
6a91db2c2469
A convenience function to load and merge a list of configuration files with different styles
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
13
diff
changeset
|
43 """Load the given configuration files, merge them in the given order |
|
108
2196362c0467
Enhance documentation of "configmix.load()"
Franz Glasner <hg@dom66.de>
parents:
107
diff
changeset
|
44 and return the resulting configuration dictionary. |
|
2196362c0467
Enhance documentation of "configmix.load()"
Franz Glasner <hg@dom66.de>
parents:
107
diff
changeset
|
45 |
|
2196362c0467
Enhance documentation of "configmix.load()"
Franz Glasner <hg@dom66.de>
parents:
107
diff
changeset
|
46 :param files: the filenames of the configuration files to read and merge |
|
2196362c0467
Enhance documentation of "configmix.load()"
Franz Glasner <hg@dom66.de>
parents:
107
diff
changeset
|
47 :returns: the configuration |
|
2196362c0467
Enhance documentation of "configmix.load()"
Franz Glasner <hg@dom66.de>
parents:
107
diff
changeset
|
48 :rtype: ~configmix.config.Configuration |
|
22
6a91db2c2469
A convenience function to load and merge a list of configuration files with different styles
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
13
diff
changeset
|
49 |
|
6a91db2c2469
A convenience function to load and merge a list of configuration files with different styles
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
13
diff
changeset
|
50 """ |
|
6a91db2c2469
A convenience function to load and merge a list of configuration files with different styles
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
13
diff
changeset
|
51 if not files: |
|
6a91db2c2469
A convenience function to load and merge a list of configuration files with different styles
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
13
diff
changeset
|
52 return Configuration() |
|
6a91db2c2469
A convenience function to load and merge a list of configuration files with different styles
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
13
diff
changeset
|
53 else: |
|
6a91db2c2469
A convenience function to load and merge a list of configuration files with different styles
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
13
diff
changeset
|
54 ex = merge(None, _load_cfg_from_file(files[0])) |
|
107
2ee042791197
Don't read the first configuration file a second time.
Franz Glasner <hg@dom66.de>
parents:
98
diff
changeset
|
55 for f in files[1:]: |
|
22
6a91db2c2469
A convenience function to load and merge a list of configuration files with different styles
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
13
diff
changeset
|
56 ex = merge(_load_cfg_from_file(f), ex) |
|
6a91db2c2469
A convenience function to load and merge a list of configuration files with different styles
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
13
diff
changeset
|
57 return Configuration(ex) |
|
6a91db2c2469
A convenience function to load and merge a list of configuration files with different styles
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
13
diff
changeset
|
58 |
|
6a91db2c2469
A convenience function to load and merge a list of configuration files with different styles
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
13
diff
changeset
|
59 |
|
112
c50ad93eb5dc
Implemented a "safe_load()" to load with safe merging
Franz Glasner <hg@dom66.de>
parents:
111
diff
changeset
|
60 def safe_load(*files): |
|
c50ad93eb5dc
Implemented a "safe_load()" to load with safe merging
Franz Glasner <hg@dom66.de>
parents:
111
diff
changeset
|
61 """Analogous to :func:`load` but do merging with :func:`safe_merge` |
|
c50ad93eb5dc
Implemented a "safe_load()" to load with safe merging
Franz Glasner <hg@dom66.de>
parents:
111
diff
changeset
|
62 instead of :func:`merge` |
|
c50ad93eb5dc
Implemented a "safe_load()" to load with safe merging
Franz Glasner <hg@dom66.de>
parents:
111
diff
changeset
|
63 |
|
c50ad93eb5dc
Implemented a "safe_load()" to load with safe merging
Franz Glasner <hg@dom66.de>
parents:
111
diff
changeset
|
64 """ |
|
c50ad93eb5dc
Implemented a "safe_load()" to load with safe merging
Franz Glasner <hg@dom66.de>
parents:
111
diff
changeset
|
65 if not files: |
|
c50ad93eb5dc
Implemented a "safe_load()" to load with safe merging
Franz Glasner <hg@dom66.de>
parents:
111
diff
changeset
|
66 return Configuration() |
|
c50ad93eb5dc
Implemented a "safe_load()" to load with safe merging
Franz Glasner <hg@dom66.de>
parents:
111
diff
changeset
|
67 else: |
|
c50ad93eb5dc
Implemented a "safe_load()" to load with safe merging
Franz Glasner <hg@dom66.de>
parents:
111
diff
changeset
|
68 ex = safe_merge(None, _load_cfg_from_file(files[0])) |
|
c50ad93eb5dc
Implemented a "safe_load()" to load with safe merging
Franz Glasner <hg@dom66.de>
parents:
111
diff
changeset
|
69 for f in files[1:]: |
|
c50ad93eb5dc
Implemented a "safe_load()" to load with safe merging
Franz Glasner <hg@dom66.de>
parents:
111
diff
changeset
|
70 ex = safe_merge(_load_cfg_from_file(f), ex) |
|
c50ad93eb5dc
Implemented a "safe_load()" to load with safe merging
Franz Glasner <hg@dom66.de>
parents:
111
diff
changeset
|
71 return Configuration(ex) |
|
c50ad93eb5dc
Implemented a "safe_load()" to load with safe merging
Franz Glasner <hg@dom66.de>
parents:
111
diff
changeset
|
72 |
|
c50ad93eb5dc
Implemented a "safe_load()" to load with safe merging
Franz Glasner <hg@dom66.de>
parents:
111
diff
changeset
|
73 |
|
138
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
74 def _load_yaml(filename): |
|
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
75 from . import yaml |
|
166
b5ce9a8461bf
Use the filesystem encoding explicitely where appropriate.
Franz Glasner <fzglas.hg@dom66.de>
parents:
165
diff
changeset
|
76 with open(u2fs(filename), "rb") as yf: |
|
138
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
77 return yaml.safe_load(yf) |
|
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
78 |
|
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
79 |
|
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
80 def _load_json(filename): |
|
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
81 from . import json |
|
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
82 return json.load(filename) |
|
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
83 |
|
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
84 |
|
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
85 def _load_py(filename): |
|
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
86 from . import py |
|
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
87 return py.load(filename) |
|
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
88 |
|
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
89 |
|
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
90 def _load_ini(filename): |
|
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
91 from . import ini |
|
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
92 return ini.load(filename) |
|
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
93 |
|
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
94 |
|
139
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
95 default_loaders = { |
|
138
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
96 ".yml": _load_yaml, |
|
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
97 ".yaml": _load_yaml, |
|
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
98 ".json": _load_json, |
|
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
99 ".py": _load_py, |
|
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
100 ".ini": _load_ini |
|
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
101 } |
|
139
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
102 """The builtin default associations of extensions with loaders""" |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
103 |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
104 |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
105 DEFAULT_LOADER = object() |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
106 """Marker for the default loader for an extension. |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
107 |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
108 To be used in :func:`set_loader`. |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
109 """ |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
110 |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
111 _loaders = {} |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
112 """All configured loader functions""" |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
113 |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
114 |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
115 def clear_loader(): |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
116 """Remove all configured loader associations. |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
117 |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
118 The :data:`default_loaders` are **not** changed. |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
119 |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
120 """ |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
121 _loaders.clear() |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
122 |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
123 |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
124 def set_loader(extension, loader): |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
125 """Associate a filename trailer `extension` with a callable `loader` that |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
126 will be called when :func:`load` encounters a file argument that ends |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
127 with `extension`. |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
128 |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
129 :param str extension: the extension to associate a loader with |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
130 :param callable loader: a callable that accepts a `filename` argument and |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
131 returns a parsed configuration from a given file |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
132 |
|
141
647782859ae1
An extra hint that filename extension comparisons for loader lookup are case-insensitive
Franz Glasner <hg@dom66.de>
parents:
139
diff
changeset
|
133 `extension` should be all lowercase because lookup in the loader database |
|
647782859ae1
An extra hint that filename extension comparisons for loader lookup are case-insensitive
Franz Glasner <hg@dom66.de>
parents:
139
diff
changeset
|
134 is *case-insensitive*. |
|
647782859ae1
An extra hint that filename extension comparisons for loader lookup are case-insensitive
Franz Glasner <hg@dom66.de>
parents:
139
diff
changeset
|
135 |
|
139
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
136 If `loader` is :data:`DEFAULT_LOADER` then the default association |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
137 from :data:`default_loaders` will be used -- if any. |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
138 |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
139 """ |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
140 if loader is DEFAULT_LOADER: |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
141 try: |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
142 _loaders[extension] = default_loaders[extension] |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
143 except KeyError: |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
144 raise ValueError("no DEFAULT loader for extension: %r" % extension) |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
145 else: |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
146 _loaders[extension] = loader |
|
138
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
147 |
|
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
148 |
|
22
6a91db2c2469
A convenience function to load and merge a list of configuration files with different styles
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
13
diff
changeset
|
149 def _load_cfg_from_file(filename): |
|
6a91db2c2469
A convenience function to load and merge a list of configuration files with different styles
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
13
diff
changeset
|
150 fnl = filename.lower() |
|
138
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
151 extensions = list(_loaders.keys()) |
|
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
152 extensions.sort(key=lambda x: len(x), reverse=True) |
|
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
153 for ext in extensions: |
|
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
154 if fnl.endswith(ext): |
|
b883f4ef1967
Indirectly map extensions to configuration file styles
Franz Glasner <hg@dom66.de>
parents:
122
diff
changeset
|
155 return _loaders[ext](filename) |
|
22
6a91db2c2469
A convenience function to load and merge a list of configuration files with different styles
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
13
diff
changeset
|
156 else: |
|
6a91db2c2469
A convenience function to load and merge a list of configuration files with different styles
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
13
diff
changeset
|
157 raise ValueError("Unknown configuration file type for filename " |
|
6a91db2c2469
A convenience function to load and merge a list of configuration files with different styles
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
13
diff
changeset
|
158 "%r" % filename) |
|
8
7090c295c940
Two differend tree merge function implementations: not yet finished
Franz Glasner <hg@dom66.de>
parents:
5
diff
changeset
|
159 |
|
7090c295c940
Two differend tree merge function implementations: not yet finished
Franz Glasner <hg@dom66.de>
parents:
5
diff
changeset
|
160 |
|
11
aecb36d4025f
Deactivate the "dict_merge()" function from yconfig
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
10
diff
changeset
|
161 if 0: |
|
aecb36d4025f
Deactivate the "dict_merge()" function from yconfig
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
10
diff
changeset
|
162 # |
|
aecb36d4025f
Deactivate the "dict_merge()" function from yconfig
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
10
diff
changeset
|
163 # From: https://github.com/jet9/python-yconfig/blob/master/yconfig.py |
|
aecb36d4025f
Deactivate the "dict_merge()" function from yconfig
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
10
diff
changeset
|
164 # License: BSD License |
|
aecb36d4025f
Deactivate the "dict_merge()" function from yconfig
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
10
diff
changeset
|
165 # |
|
aecb36d4025f
Deactivate the "dict_merge()" function from yconfig
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
10
diff
changeset
|
166 def dict_merge(a, b): |
|
aecb36d4025f
Deactivate the "dict_merge()" function from yconfig
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
10
diff
changeset
|
167 """Recursively merges dict's. not just simple a['key'] = b['key'], if |
|
aecb36d4025f
Deactivate the "dict_merge()" function from yconfig
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
10
diff
changeset
|
168 both a and bhave a key who's value is a dict then dict_merge is called |
|
aecb36d4025f
Deactivate the "dict_merge()" function from yconfig
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
10
diff
changeset
|
169 on both values and the result stored in the returned dictionary.""" |
|
8
7090c295c940
Two differend tree merge function implementations: not yet finished
Franz Glasner <hg@dom66.de>
parents:
5
diff
changeset
|
170 |
|
11
aecb36d4025f
Deactivate the "dict_merge()" function from yconfig
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
10
diff
changeset
|
171 if not isinstance(b, dict): |
|
aecb36d4025f
Deactivate the "dict_merge()" function from yconfig
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
10
diff
changeset
|
172 return b |
|
aecb36d4025f
Deactivate the "dict_merge()" function from yconfig
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
10
diff
changeset
|
173 result = deepcopy(a) |
|
aecb36d4025f
Deactivate the "dict_merge()" function from yconfig
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
10
diff
changeset
|
174 for k, v in b.iteritems(): |
|
aecb36d4025f
Deactivate the "dict_merge()" function from yconfig
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
10
diff
changeset
|
175 if k in result and isinstance(result[k], dict): |
|
aecb36d4025f
Deactivate the "dict_merge()" function from yconfig
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
10
diff
changeset
|
176 result[k] = dict_merge(result[k], v) |
|
aecb36d4025f
Deactivate the "dict_merge()" function from yconfig
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
10
diff
changeset
|
177 else: |
|
aecb36d4025f
Deactivate the "dict_merge()" function from yconfig
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
10
diff
changeset
|
178 result[k] = deepcopy(v) |
|
aecb36d4025f
Deactivate the "dict_merge()" function from yconfig
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
10
diff
changeset
|
179 return result |
|
8
7090c295c940
Two differend tree merge function implementations: not yet finished
Franz Glasner <hg@dom66.de>
parents:
5
diff
changeset
|
180 |
|
7090c295c940
Two differend tree merge function implementations: not yet finished
Franz Glasner <hg@dom66.de>
parents:
5
diff
changeset
|
181 |
|
144
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
182 def merge(user, default, filter_comments=True): |
|
110
29cf359ddf4d
Remove the "_first" parameter from "merge" and "safe_merge" by splitting into two functions
Franz Glasner <hg@dom66.de>
parents:
108
diff
changeset
|
183 """Logically merge the configuration in `user` into `default`. |
|
98
d6ba53ce2091
Better documentation of the core function in "configmix"
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
96
diff
changeset
|
184 |
|
d6ba53ce2091
Better documentation of the core function in "configmix"
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
96
diff
changeset
|
185 :param ~configmix.config.Configuration user: |
|
110
29cf359ddf4d
Remove the "_first" parameter from "merge" and "safe_merge" by splitting into two functions
Franz Glasner <hg@dom66.de>
parents:
108
diff
changeset
|
186 the new configuration that will be logically merged |
|
29cf359ddf4d
Remove the "_first" parameter from "merge" and "safe_merge" by splitting into two functions
Franz Glasner <hg@dom66.de>
parents:
108
diff
changeset
|
187 into `default` |
|
98
d6ba53ce2091
Better documentation of the core function in "configmix"
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
96
diff
changeset
|
188 :param ~configmix.config.Configuration default: |
|
110
29cf359ddf4d
Remove the "_first" parameter from "merge" and "safe_merge" by splitting into two functions
Franz Glasner <hg@dom66.de>
parents:
108
diff
changeset
|
189 the base configuration where `user` is logically merged into |
|
144
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
190 :param bool filter_comments: flag whether to filter comment keys that |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
191 start with any of the items in :data:`COMMENTS` |
|
110
29cf359ddf4d
Remove the "_first" parameter from "merge" and "safe_merge" by splitting into two functions
Franz Glasner <hg@dom66.de>
parents:
108
diff
changeset
|
192 :returns: `user` with the necessary amendments from `default`. |
|
29cf359ddf4d
Remove the "_first" parameter from "merge" and "safe_merge" by splitting into two functions
Franz Glasner <hg@dom66.de>
parents:
108
diff
changeset
|
193 If `user` is ``None`` then `default` is returned. |
|
29cf359ddf4d
Remove the "_first" parameter from "merge" and "safe_merge" by splitting into two functions
Franz Glasner <hg@dom66.de>
parents:
108
diff
changeset
|
194 |
|
144
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
195 .. note:: The configuration in `user` is augmented/changed |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
196 **inplace**. |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
197 |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
198 The configuration in `default` will be changed **inplace** |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
199 when filtering out comments (which is the default). |
|
8
7090c295c940
Two differend tree merge function implementations: not yet finished
Franz Glasner <hg@dom66.de>
parents:
5
diff
changeset
|
200 |
|
7090c295c940
Two differend tree merge function implementations: not yet finished
Franz Glasner <hg@dom66.de>
parents:
5
diff
changeset
|
201 From http://stackoverflow.com/questions/823196/yaml-merge-in-python |
|
7090c295c940
Two differend tree merge function implementations: not yet finished
Franz Glasner <hg@dom66.de>
parents:
5
diff
changeset
|
202 |
|
7090c295c940
Two differend tree merge function implementations: not yet finished
Franz Glasner <hg@dom66.de>
parents:
5
diff
changeset
|
203 """ |
|
110
29cf359ddf4d
Remove the "_first" parameter from "merge" and "safe_merge" by splitting into two functions
Franz Glasner <hg@dom66.de>
parents:
108
diff
changeset
|
204 if user is None: |
|
144
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
205 if filter_comments: |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
206 _filter_comments(default) |
|
13
24ba462b9b4b
Return the `default' argument when the given `user' argument is `None' and when it is the first call on merge
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
11
diff
changeset
|
207 return default |
|
144
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
208 if filter_comments: |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
209 _filter_comments(user) |
|
8
7090c295c940
Two differend tree merge function implementations: not yet finished
Franz Glasner <hg@dom66.de>
parents:
5
diff
changeset
|
210 if isinstance(user, dict) and isinstance(default, dict): |
| 9 | 211 for k, v in default.items(): |
|
144
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
212 if filter_comments and _is_comment(k): |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
213 continue |
|
8
7090c295c940
Two differend tree merge function implementations: not yet finished
Franz Glasner <hg@dom66.de>
parents:
5
diff
changeset
|
214 if k not in user: |
|
7090c295c940
Two differend tree merge function implementations: not yet finished
Franz Glasner <hg@dom66.de>
parents:
5
diff
changeset
|
215 user[k] = v |
|
7090c295c940
Two differend tree merge function implementations: not yet finished
Franz Glasner <hg@dom66.de>
parents:
5
diff
changeset
|
216 else: |
|
144
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
217 user[k] = _merge(user[k], v, filter_comments) |
|
8
7090c295c940
Two differend tree merge function implementations: not yet finished
Franz Glasner <hg@dom66.de>
parents:
5
diff
changeset
|
218 return user |
|
10
58af59d5af40
A "safe_merge" that makes (shallow) copies instead of directly manipulating given containers
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
9
diff
changeset
|
219 |
|
58af59d5af40
A "safe_merge" that makes (shallow) copies instead of directly manipulating given containers
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
9
diff
changeset
|
220 |
|
144
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
221 def _merge(user, default, filter_comments): |
|
110
29cf359ddf4d
Remove the "_first" parameter from "merge" and "safe_merge" by splitting into two functions
Franz Glasner <hg@dom66.de>
parents:
108
diff
changeset
|
222 """Recursion helper for :meth:`merge` |
|
29cf359ddf4d
Remove the "_first" parameter from "merge" and "safe_merge" by splitting into two functions
Franz Glasner <hg@dom66.de>
parents:
108
diff
changeset
|
223 |
|
29cf359ddf4d
Remove the "_first" parameter from "merge" and "safe_merge" by splitting into two functions
Franz Glasner <hg@dom66.de>
parents:
108
diff
changeset
|
224 """ |
|
29cf359ddf4d
Remove the "_first" parameter from "merge" and "safe_merge" by splitting into two functions
Franz Glasner <hg@dom66.de>
parents:
108
diff
changeset
|
225 if isinstance(user, dict) and isinstance(default, dict): |
|
29cf359ddf4d
Remove the "_first" parameter from "merge" and "safe_merge" by splitting into two functions
Franz Glasner <hg@dom66.de>
parents:
108
diff
changeset
|
226 for k, v in default.items(): |
|
144
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
227 if filter_comments and _is_comment(k): |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
228 continue |
|
110
29cf359ddf4d
Remove the "_first" parameter from "merge" and "safe_merge" by splitting into two functions
Franz Glasner <hg@dom66.de>
parents:
108
diff
changeset
|
229 if k not in user: |
|
29cf359ddf4d
Remove the "_first" parameter from "merge" and "safe_merge" by splitting into two functions
Franz Glasner <hg@dom66.de>
parents:
108
diff
changeset
|
230 user[k] = v |
|
29cf359ddf4d
Remove the "_first" parameter from "merge" and "safe_merge" by splitting into two functions
Franz Glasner <hg@dom66.de>
parents:
108
diff
changeset
|
231 else: |
|
144
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
232 user[k] = _merge(user[k], v, filter_comments) |
|
110
29cf359ddf4d
Remove the "_first" parameter from "merge" and "safe_merge" by splitting into two functions
Franz Glasner <hg@dom66.de>
parents:
108
diff
changeset
|
233 return user |
|
29cf359ddf4d
Remove the "_first" parameter from "merge" and "safe_merge" by splitting into two functions
Franz Glasner <hg@dom66.de>
parents:
108
diff
changeset
|
234 |
|
29cf359ddf4d
Remove the "_first" parameter from "merge" and "safe_merge" by splitting into two functions
Franz Glasner <hg@dom66.de>
parents:
108
diff
changeset
|
235 |
|
144
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
236 def safe_merge(user, default, filter_comments=True): |
|
111
d51a18e5b0e3
Reimplement configmix.safe_merge() do to a deepcopy of all source configurations when merging.
Franz Glasner <hg@dom66.de>
parents:
110
diff
changeset
|
237 """A more safe version of :func:`merge` that makes deep copies of |
|
13
24ba462b9b4b
Return the `default' argument when the given `user' argument is `None' and when it is the first call on merge
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
11
diff
changeset
|
238 the returned container objects. |
|
24ba462b9b4b
Return the `default' argument when the given `user' argument is `None' and when it is the first call on merge
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
11
diff
changeset
|
239 |
|
144
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
240 Contrary to :func:`merge` no given argument is ever changed |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
241 inplace. Every object from `default` is decoupled from the result |
| 165 | 242 -- so changing the `default` configuration later does not propagate |
|
144
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
243 into a merged configuration later. |
|
111
d51a18e5b0e3
Reimplement configmix.safe_merge() do to a deepcopy of all source configurations when merging.
Franz Glasner <hg@dom66.de>
parents:
110
diff
changeset
|
244 |
|
10
58af59d5af40
A "safe_merge" that makes (shallow) copies instead of directly manipulating given containers
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
9
diff
changeset
|
245 """ |
|
110
29cf359ddf4d
Remove the "_first" parameter from "merge" and "safe_merge" by splitting into two functions
Franz Glasner <hg@dom66.de>
parents:
108
diff
changeset
|
246 if user is None: |
|
144
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
247 if filter_comments: |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
248 _filter_comments(default) |
|
111
d51a18e5b0e3
Reimplement configmix.safe_merge() do to a deepcopy of all source configurations when merging.
Franz Glasner <hg@dom66.de>
parents:
110
diff
changeset
|
249 return copy.deepcopy(default) |
|
d51a18e5b0e3
Reimplement configmix.safe_merge() do to a deepcopy of all source configurations when merging.
Franz Glasner <hg@dom66.de>
parents:
110
diff
changeset
|
250 user = copy.deepcopy(user) |
|
144
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
251 if filter_comments: |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
252 _filter_comments(user) |
|
10
58af59d5af40
A "safe_merge" that makes (shallow) copies instead of directly manipulating given containers
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
9
diff
changeset
|
253 if isinstance(user, dict) and isinstance(default, dict): |
|
58af59d5af40
A "safe_merge" that makes (shallow) copies instead of directly manipulating given containers
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
9
diff
changeset
|
254 for k, v in default.items(): |
|
144
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
255 if filter_comments and _is_comment(k): |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
256 continue |
|
10
58af59d5af40
A "safe_merge" that makes (shallow) copies instead of directly manipulating given containers
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
9
diff
changeset
|
257 if k not in user: |
|
111
d51a18e5b0e3
Reimplement configmix.safe_merge() do to a deepcopy of all source configurations when merging.
Franz Glasner <hg@dom66.de>
parents:
110
diff
changeset
|
258 user[k] = copy.deepcopy(v) |
|
10
58af59d5af40
A "safe_merge" that makes (shallow) copies instead of directly manipulating given containers
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
9
diff
changeset
|
259 else: |
|
144
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
260 user[k] = _safe_merge(user[k], v, filter_comments) |
|
10
58af59d5af40
A "safe_merge" that makes (shallow) copies instead of directly manipulating given containers
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
9
diff
changeset
|
261 return user |
|
111
d51a18e5b0e3
Reimplement configmix.safe_merge() do to a deepcopy of all source configurations when merging.
Franz Glasner <hg@dom66.de>
parents:
110
diff
changeset
|
262 |
|
d51a18e5b0e3
Reimplement configmix.safe_merge() do to a deepcopy of all source configurations when merging.
Franz Glasner <hg@dom66.de>
parents:
110
diff
changeset
|
263 |
|
144
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
264 def _safe_merge(user, default, filter_comments): |
|
111
d51a18e5b0e3
Reimplement configmix.safe_merge() do to a deepcopy of all source configurations when merging.
Franz Glasner <hg@dom66.de>
parents:
110
diff
changeset
|
265 """Recursion helper for :meth:`safe_merge` |
|
d51a18e5b0e3
Reimplement configmix.safe_merge() do to a deepcopy of all source configurations when merging.
Franz Glasner <hg@dom66.de>
parents:
110
diff
changeset
|
266 |
|
d51a18e5b0e3
Reimplement configmix.safe_merge() do to a deepcopy of all source configurations when merging.
Franz Glasner <hg@dom66.de>
parents:
110
diff
changeset
|
267 """ |
|
d51a18e5b0e3
Reimplement configmix.safe_merge() do to a deepcopy of all source configurations when merging.
Franz Glasner <hg@dom66.de>
parents:
110
diff
changeset
|
268 if isinstance(user, dict) and isinstance(default, dict): |
|
d51a18e5b0e3
Reimplement configmix.safe_merge() do to a deepcopy of all source configurations when merging.
Franz Glasner <hg@dom66.de>
parents:
110
diff
changeset
|
269 for k, v in default.items(): |
|
144
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
270 if filter_comments and _is_comment(k): |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
271 continue |
|
111
d51a18e5b0e3
Reimplement configmix.safe_merge() do to a deepcopy of all source configurations when merging.
Franz Glasner <hg@dom66.de>
parents:
110
diff
changeset
|
272 if k not in user: |
|
d51a18e5b0e3
Reimplement configmix.safe_merge() do to a deepcopy of all source configurations when merging.
Franz Glasner <hg@dom66.de>
parents:
110
diff
changeset
|
273 user[k] = copy.deepcopy(v) |
|
d51a18e5b0e3
Reimplement configmix.safe_merge() do to a deepcopy of all source configurations when merging.
Franz Glasner <hg@dom66.de>
parents:
110
diff
changeset
|
274 else: |
|
144
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
275 user[k] = _safe_merge(user[k], v, filter_comments) |
|
111
d51a18e5b0e3
Reimplement configmix.safe_merge() do to a deepcopy of all source configurations when merging.
Franz Glasner <hg@dom66.de>
parents:
110
diff
changeset
|
276 return user |
|
139
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
277 |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
278 |
|
144
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
279 def _filter_comments(d): |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
280 """Recursively filter comments keys in the dict `d`. |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
281 |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
282 Comment keys are keys that start with any of the items in |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
283 :data:`COMMENTS`. |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
284 |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
285 """ |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
286 if not isinstance(d, dict): |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
287 return |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
288 # use a copy of the keys because we change `d` while iterating |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
289 for k in list(d.keys()): |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
290 if _is_comment(k): |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
291 del d[k] |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
292 else: |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
293 if isinstance(d[k], dict): |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
294 _filter_comments(d[k]) |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
295 |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
296 |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
297 def _is_comment(k): |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
298 for i in COMMENTS: |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
299 if k.startswith(i): |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
300 return True |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
301 return False |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
302 |
|
7e6ec99d5ff5
Allow comments as keys and filter them by default
Franz Glasner <hg@dom66.de>
parents:
141
diff
changeset
|
303 |
|
139
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
304 # |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
305 # Init loader defaults |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
306 # |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
307 for _extension in default_loaders: |
|
c87b0dc54e1d
Allow custom configuration filename extensions and custom loaders that can handle custom configuration file syntax styles
Franz Glasner <hg@dom66.de>
parents:
138
diff
changeset
|
308 set_loader(_extension, DEFAULT_LOADER) |
