Migrating to Version 1.x¶
Version 1 of Configcrunch was fully rewritten and is in some crucial aspects incompatible with older versions.
__init__
is no longer called¶
The __init__
method on classes subclassing YamlConfigDocument
is no longer called
due to various issues with integration related to it in the Rust codebase. As an alternative,
the method _initialize_data_before_merge
might be useful.
$name is added to all documents in dicts¶
Configcrunch adds an entry with the key $name
to all sub-documents that are contained
in dicts. The value is the key in the dictionary they are in. Be sure to update your schemas
to allow this.
Removed and moved functions¶
If you previously loaded in functions or classes from anywhere but the main configcrunch
module, this will now no longer work. load_multiple_yml
has also been moved to configcrunch
.
Additionally the function load_subdocument
is no longer available, see below.
New sub-documents logic¶
The way sub-documents are defined and processed has been simplified. Instead of manually having
to manually load them in _load_subdocuments
you now have to define the classmethod subdocuments
,
which returns a list of tuples that define the locations sub-documents are expected at. See the manual page
on sub-documents for more information.
# Old method:
def _load_subdocuments(self, lookup_paths):
# direct entry processing
if self["direct"] != REMOVE:
self["direct"] = load_subdocument(self["direct"], self, Example, lookup_paths)
# map entry processing
if self["map"] != REMOVE:
for key, doc in self["map"].items():
if doc != REMOVE:
self["map"][key] = load_subdocument(doc, self, Example, lookup_paths)
return self
# New method:
@classmethod
def subdocuments(cls):
return [
# direct entry processing
("direct", Example),
# dict entry processing (also works for lists)
("map[]", Example),
# If you have more complex documents, you can reference sub fields, by specifying
# the path to it, seperated by /.
# ("level0/level1", Example),
# or ("level0/level1[]", Example),
]
Variable processing¶
Variable and template processing has been replaced with Minijinja, which is for the most part compatible with Jinja2. See the manual page on variables for more information.
Freezing documents and internal_* methods¶
Documents can no longer be accessed like a dict, and the .doc
property is no longer available, unless
the document is frozen using the freeze()
method first. Instead you can use the internal_*
methods.
See the manual page on accessing data for more information.