omegaconf 2.4.0.dev4__tar.gz → 2.4.0.dev10__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {omegaconf-2.4.0.dev4/omegaconf.egg-info → omegaconf-2.4.0.dev10}/PKG-INFO +13 -35
- omegaconf-2.4.0.dev10/README.md +32 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/build_helpers/build_helpers.py +1 -1
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/_utils.py +62 -13
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/base.py +36 -7
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/basecontainer.py +24 -4
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/omegaconf.py +2 -4
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/typing.py +1 -6
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/version.py +3 -3
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10/omegaconf.egg-info}/PKG-INFO +13 -35
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf.egg-info/SOURCES.txt +0 -4
- omegaconf-2.4.0.dev10/omegaconf.egg-info/requires.txt +1 -0
- omegaconf-2.4.0.dev10/omegaconf.egg-info/top_level.txt +1 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/pyproject.toml +44 -0
- omegaconf-2.4.0.dev10/requirements/base.txt +1 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/setup.cfg +7 -2
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/setup.py +4 -16
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/__init__.py +2 -1
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/interpolation/built_in_resolvers/test_oc_deprecated.py +1 -1
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/interpolation/test_custom_resolvers.py +2 -2
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/interpolation/test_interpolation.py +4 -8
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/structured_conf/data/attr_classes.py +3 -3
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/structured_conf/data/dataclasses.py +3 -3
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/structured_conf/data/dataclasses_pre_311.py +10 -8
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/structured_conf/test_structured_config.py +10 -10
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_basic_ops_dict.py +1 -1
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_basic_ops_list.py +15 -12
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_compare_dictconfig_vs_dict.py +2 -2
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_create.py +71 -24
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_errors.py +3 -5
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_grammar.py +1 -1
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_merge.py +9 -21
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_select.py +4 -4
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_to_container.py +65 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_to_yaml.py +2 -4
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_utils.py +7 -7
- omegaconf-2.4.0.dev4/README.md +0 -51
- omegaconf-2.4.0.dev4/omegaconf.egg-info/requires.txt +0 -7
- omegaconf-2.4.0.dev4/omegaconf.egg-info/top_level.txt +0 -2
- omegaconf-2.4.0.dev4/pydevd_plugins/__init__.py +0 -3
- omegaconf-2.4.0.dev4/pydevd_plugins/extensions/__init__.py +0 -3
- omegaconf-2.4.0.dev4/pydevd_plugins/extensions/pydevd_plugin_omegaconf.py +0 -126
- omegaconf-2.4.0.dev4/requirements/base.txt +0 -5
- omegaconf-2.4.0.dev4/tests/test_pydev_resolver_plugin.py +0 -278
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/LICENSE +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/MANIFEST.in +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/build_helpers/__init__.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/build_helpers/bin/antlr-4.11.1-complete.jar +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/build_helpers/get_vendored.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/build_helpers/test_helpers.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/__init__.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/_impl.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/dictconfig.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/errors.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/grammar/OmegaConfGrammarLexer.g4 +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/grammar/OmegaConfGrammarParser.g4 +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/grammar/__init__.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/grammar/gen/OmegaConfGrammarLexer.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/grammar/gen/OmegaConfGrammarParser.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/grammar/gen/OmegaConfGrammarParserListener.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/grammar/gen/OmegaConfGrammarParserVisitor.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/grammar/gen/__init__.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/grammar_parser.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/grammar_visitor.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/listconfig.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/nodes.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/py.typed +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/resolvers/__init__.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/resolvers/oc/__init__.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/resolvers/oc/dict.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/__init__.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/BufferedTokenStream.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/CommonTokenFactory.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/CommonTokenStream.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/FileStream.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/InputStream.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/IntervalSet.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/LL1Analyzer.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/Lexer.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/ListTokenSource.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/Parser.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/ParserInterpreter.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/ParserRuleContext.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/PredictionContext.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/Recognizer.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/RuleContext.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/StdinStream.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/Token.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/TokenStreamRewriter.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/Utils.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/__init__.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/_pygrun.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/ATN.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/ATNConfig.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/ATNConfigSet.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/ATNDeserializationOptions.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/ATNDeserializer.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/ATNSimulator.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/ATNState.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/ATNType.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/LexerATNSimulator.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/LexerAction.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/LexerActionExecutor.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/ParserATNSimulator.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/PredictionMode.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/SemanticContext.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/Transition.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/__init__.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/dfa/DFA.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/dfa/DFASerializer.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/dfa/DFAState.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/dfa/__init__.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/error/DiagnosticErrorListener.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/error/ErrorListener.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/error/ErrorStrategy.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/error/Errors.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/error/__init__.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/tree/Chunk.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/tree/ParseTreeMatch.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/tree/ParseTreePattern.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/tree/ParseTreePatternMatcher.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/tree/RuleTagToken.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/tree/TokenTagToken.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/tree/Tree.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/tree/Trees.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/tree/__init__.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/xpath/XPath.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/xpath/XPathLexer.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/xpath/__init__.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf.egg-info/dependency_links.txt +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/conftest.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/data/2.0.6.pickle +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/data/2.1.0.rc1.pickle +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/data/load.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/data/save.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/examples/__init__.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/examples/dataclass_postponed_annotations.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/examples/test_dataclass_example.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/examples/test_postponed_annotations.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/interpolation/__init__.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/interpolation/built_in_resolvers/__init__.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/interpolation/built_in_resolvers/test_oc_create.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/interpolation/built_in_resolvers/test_oc_decode.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/interpolation/built_in_resolvers/test_oc_dict.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/interpolation/built_in_resolvers/test_oc_env.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/interpolation/built_in_resolvers/test_oc_select.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/structured_conf/__init__.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/structured_conf/data/__init__.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/structured_conf/test_structured_basic.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_base_config.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_config_eq.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_get_full_key.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_matrix.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_nested_containers.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_nodes.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_omegaconf.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_readonly.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_serialization.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_struct.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_unions.py +0 -0
- {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_update.py +0 -0
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: omegaconf
|
|
3
|
-
Version: 2.4.0.
|
|
3
|
+
Version: 2.4.0.dev10
|
|
4
4
|
Summary: A flexible configuration library
|
|
5
5
|
Home-page: https://github.com/omry/omegaconf
|
|
6
6
|
Author: Omry Yadan
|
|
7
7
|
Author-email: omry@yadan.net
|
|
8
8
|
Keywords: yaml configuration config
|
|
9
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
10
9
|
Classifier: Programming Language :: Python :: 3.10
|
|
11
10
|
Classifier: Programming Language :: Python :: 3.11
|
|
12
11
|
Classifier: Programming Language :: Python :: 3.12
|
|
@@ -14,12 +13,10 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
14
13
|
Classifier: Programming Language :: Python :: 3.14
|
|
15
14
|
Classifier: License :: OSI Approved :: BSD License
|
|
16
15
|
Classifier: Operating System :: OS Independent
|
|
17
|
-
Requires-Python: >=3.
|
|
16
|
+
Requires-Python: >=3.10
|
|
18
17
|
Description-Content-Type: text/markdown
|
|
19
18
|
License-File: LICENSE
|
|
20
19
|
Requires-Dist: PyYAML>=5.1.0
|
|
21
|
-
Requires-Dist: dataclasses; python_version == "3.6"
|
|
22
|
-
Requires-Dist: typing-extensions; python_version <= "3.9"
|
|
23
20
|
Dynamic: author
|
|
24
21
|
Dynamic: author-email
|
|
25
22
|
Dynamic: classifier
|
|
@@ -35,16 +32,25 @@ Dynamic: summary
|
|
|
35
32
|
# OmegaConf
|
|
36
33
|
| | Description |
|
|
37
34
|
| --- | --- |
|
|
38
|
-
| Project | [](https://badge.fury.io/py/omegaconf)[](https://pepy.tech/project/omegaconf
|
|
39
|
-
| Code quality| [](https://circleci.com/gh/omry/omegaconf)[](https://coveralls.io/github/omry/omegaconf)
|
|
35
|
+
| Project | [](https://badge.fury.io/py/omegaconf)[](https://pepy.tech/project/omegaconf) |
|
|
36
|
+
| Code quality| [](https://circleci.com/gh/omry/omegaconf)[](https://coveralls.io/github/omry/omegaconf)|
|
|
40
37
|
| Docs and support |[](https://omegaconf.readthedocs.io/en/2.1_branch/)[](https://mybinder.org/v2/gh/omry/omegaconf/master?filepath=docs%2Fnotebook%2FTutorial.ipynb)|
|
|
41
38
|
|
|
42
39
|
|
|
43
40
|
OmegaConf is a hierarchical configuration system, with support for merging configurations from multiple sources (YAML config files, dataclasses/objects and CLI arguments)
|
|
44
41
|
providing a consistent API regardless of how the configuration was created.
|
|
45
42
|
|
|
43
|
+
## Optional subprojects
|
|
44
|
+
|
|
45
|
+
- [`omegaconf-pydevd`](./subprojects/omegaconf-pydevd/README.md): optional `pydevd` debugger plugin for inspecting OmegaConf objects in supported debuggers.
|
|
46
|
+
|
|
46
47
|
## Releases
|
|
47
48
|
|
|
49
|
+
### Upcoming (2.4.0.dev)
|
|
50
|
+
OmegaConf 2.4.0.dev is the upcoming development version.
|
|
51
|
+
* [Documentation](https://omegaconf.readthedocs.io/en/latest/)
|
|
52
|
+
* [Source code](https://github.com/omry/omegaconf/tree/master)
|
|
53
|
+
|
|
48
54
|
### Stable (2.3)
|
|
49
55
|
OmegaConf 2.3 is the current stable version.
|
|
50
56
|
* [What's new](https://github.com/omry/omegaconf/releases/tag/v2.3.0)
|
|
@@ -53,33 +59,5 @@ OmegaConf 2.3 is the current stable version.
|
|
|
53
59
|
|
|
54
60
|
Install with `pip install --upgrade omegaconf`
|
|
55
61
|
|
|
56
|
-
### Previous release (2.2)
|
|
57
|
-
|
|
58
|
-
* [What's new](https://github.com/omry/omegaconf/releases/tag/v2.1.1)
|
|
59
|
-
* [Documentation](https://omegaconf.readthedocs.io/en/2.1_branch/)
|
|
60
|
-
* [Slides](https://docs.google.com/presentation/d/e/2PACX-1vT_UIV7hCnquIbLUm4NnkUpXvPEh33IKiUEvPRF850WKA8opOlZOszjKdZ3tPmf8u7hGNP6HpqS-NT5/pub?start=false&loop=false&delayms=3000)
|
|
61
|
-
* [Source code](https://github.com/omry/omegaconf/tree/2.1_branch)
|
|
62
|
-
|
|
63
|
-
Install with `pip install omegaconf==2.1`
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
### Previous release (2.1)
|
|
67
|
-
|
|
68
|
-
* [What's new](https://github.com/omry/omegaconf/releases/tag/v2.1.1)
|
|
69
|
-
* [Documentation](https://omegaconf.readthedocs.io/en/2.1_branch/)
|
|
70
|
-
* [Slides](https://docs.google.com/presentation/d/e/2PACX-1vT_UIV7hCnquIbLUm4NnkUpXvPEh33IKiUEvPRF850WKA8opOlZOszjKdZ3tPmf8u7hGNP6HpqS-NT5/pub?start=false&loop=false&delayms=3000)
|
|
71
|
-
* [Source code](https://github.com/omry/omegaconf/tree/2.1_branch)
|
|
72
|
-
|
|
73
|
-
Install with `pip install omegaconf==2.1`
|
|
74
|
-
|
|
75
|
-
### Previous release (2.0)
|
|
76
|
-
|
|
77
|
-
* [What's new](https://github.com/omry/omegaconf/releases/tag/v2.0.0)
|
|
78
|
-
* [Documentation](https://omegaconf.readthedocs.io/en/2.0_branch/)
|
|
79
|
-
* [Slides](https://docs.google.com/presentation/d/e/2PACX-1vT_UIV7hCnquIbLUm4NnkUpXvPEh33IKiUEvPRF850WKA8opOlZOszjKdZ3tPmf8u7hGNP6HpqS-NT5/pub?start=false&loop=false&delayms=3000)
|
|
80
|
-
* [Source code](https://github.com/omry/omegaconf/tree/2.0_branch)
|
|
81
|
-
|
|
82
|
-
Install with `pip install omegaconf==2.0.6`
|
|
83
|
-
|
|
84
62
|
## Live tutorial
|
|
85
63
|
Run the live tutorial: [](https://mybinder.org/v2/gh/omry/omegaconf/master?filepath=docs%2Fnotebook%2FTutorial.ipynb)
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# OmegaConf
|
|
2
|
+
| | Description |
|
|
3
|
+
| --- | --- |
|
|
4
|
+
| Project | [](https://badge.fury.io/py/omegaconf)[](https://pepy.tech/project/omegaconf) |
|
|
5
|
+
| Code quality| [](https://circleci.com/gh/omry/omegaconf)[](https://coveralls.io/github/omry/omegaconf)|
|
|
6
|
+
| Docs and support |[](https://omegaconf.readthedocs.io/en/2.1_branch/)[](https://mybinder.org/v2/gh/omry/omegaconf/master?filepath=docs%2Fnotebook%2FTutorial.ipynb)|
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
OmegaConf is a hierarchical configuration system, with support for merging configurations from multiple sources (YAML config files, dataclasses/objects and CLI arguments)
|
|
10
|
+
providing a consistent API regardless of how the configuration was created.
|
|
11
|
+
|
|
12
|
+
## Optional subprojects
|
|
13
|
+
|
|
14
|
+
- [`omegaconf-pydevd`](./subprojects/omegaconf-pydevd/README.md): optional `pydevd` debugger plugin for inspecting OmegaConf objects in supported debuggers.
|
|
15
|
+
|
|
16
|
+
## Releases
|
|
17
|
+
|
|
18
|
+
### Upcoming (2.4.0.dev)
|
|
19
|
+
OmegaConf 2.4.0.dev is the upcoming development version.
|
|
20
|
+
* [Documentation](https://omegaconf.readthedocs.io/en/latest/)
|
|
21
|
+
* [Source code](https://github.com/omry/omegaconf/tree/master)
|
|
22
|
+
|
|
23
|
+
### Stable (2.3)
|
|
24
|
+
OmegaConf 2.3 is the current stable version.
|
|
25
|
+
* [What's new](https://github.com/omry/omegaconf/releases/tag/v2.3.0)
|
|
26
|
+
* [Documentation](https://omegaconf.readthedocs.io/en/2.3_branch/)
|
|
27
|
+
* [Source code](https://github.com/omry/omegaconf/tree/2.3_branch)
|
|
28
|
+
|
|
29
|
+
Install with `pip install --upgrade omegaconf`
|
|
30
|
+
|
|
31
|
+
## Live tutorial
|
|
32
|
+
Run the live tutorial: [](https://mybinder.org/v2/gh/omry/omegaconf/master?filepath=docs%2Fnotebook%2FTutorial.ipynb)
|
|
@@ -147,7 +147,7 @@ class DevelopCommand(develop.develop): # pragma: no cover
|
|
|
147
147
|
|
|
148
148
|
class SDistCommand(sdist.sdist): # pragma: no cover
|
|
149
149
|
def run(self) -> None:
|
|
150
|
-
if not self.dry_run:
|
|
150
|
+
if not self.dry_run: # type: ignore[attr-defined]
|
|
151
151
|
self.run_command("clean")
|
|
152
152
|
run_antlr(self)
|
|
153
153
|
sdist.sdist.run(self)
|
|
@@ -179,19 +179,72 @@ def yaml_is_bool(b: str) -> bool:
|
|
|
179
179
|
|
|
180
180
|
def get_yaml_loader() -> Any:
|
|
181
181
|
class OmegaConfLoader(BaseLoader): # type: ignore
|
|
182
|
-
def
|
|
183
|
-
|
|
184
|
-
|
|
182
|
+
def flatten_mapping(self, node: yaml.Node) -> Any:
|
|
183
|
+
merge_tag = "tag:yaml.org,2002:merge"
|
|
184
|
+
explicit_keys = set()
|
|
185
|
+
for key_node, _ in node.value:
|
|
186
|
+
if key_node.tag == merge_tag:
|
|
187
|
+
continue
|
|
185
188
|
if key_node.tag != yaml.resolver.BaseResolver.DEFAULT_SCALAR_TAG:
|
|
186
189
|
continue
|
|
187
|
-
if key_node.value in
|
|
190
|
+
if key_node.value in explicit_keys:
|
|
188
191
|
raise yaml.constructor.ConstructorError(
|
|
189
192
|
"while constructing a mapping",
|
|
190
193
|
node.start_mark,
|
|
191
194
|
f"found duplicate key {key_node.value}",
|
|
192
195
|
key_node.start_mark,
|
|
193
196
|
)
|
|
194
|
-
|
|
197
|
+
explicit_keys.add(key_node.value)
|
|
198
|
+
|
|
199
|
+
merge = []
|
|
200
|
+
index = 0
|
|
201
|
+
while index < len(node.value):
|
|
202
|
+
key_node, value_node = node.value[index]
|
|
203
|
+
if key_node.tag == merge_tag:
|
|
204
|
+
del node.value[index]
|
|
205
|
+
if isinstance(value_node, yaml.MappingNode):
|
|
206
|
+
self.flatten_mapping(value_node)
|
|
207
|
+
merge.extend(value_node.value)
|
|
208
|
+
elif isinstance(value_node, yaml.SequenceNode):
|
|
209
|
+
submerge = []
|
|
210
|
+
for subnode in value_node.value:
|
|
211
|
+
if not isinstance(subnode, yaml.MappingNode):
|
|
212
|
+
raise yaml.constructor.ConstructorError(
|
|
213
|
+
"while constructing a mapping",
|
|
214
|
+
node.start_mark,
|
|
215
|
+
"expected a mapping for merging, but found "
|
|
216
|
+
f"{subnode.id}",
|
|
217
|
+
subnode.start_mark,
|
|
218
|
+
)
|
|
219
|
+
self.flatten_mapping(subnode)
|
|
220
|
+
submerge.append(subnode.value)
|
|
221
|
+
submerge.reverse()
|
|
222
|
+
for value in submerge:
|
|
223
|
+
merge.extend(value)
|
|
224
|
+
else:
|
|
225
|
+
raise yaml.constructor.ConstructorError(
|
|
226
|
+
"while constructing a mapping",
|
|
227
|
+
node.start_mark,
|
|
228
|
+
"expected a mapping or list of mappings for merging, "
|
|
229
|
+
f"but found {value_node.id}",
|
|
230
|
+
value_node.start_mark,
|
|
231
|
+
)
|
|
232
|
+
elif key_node.tag == "tag:yaml.org,2002:value":
|
|
233
|
+
key_node.tag = yaml.resolver.BaseResolver.DEFAULT_SCALAR_TAG
|
|
234
|
+
index += 1
|
|
235
|
+
else:
|
|
236
|
+
index += 1
|
|
237
|
+
|
|
238
|
+
if merge:
|
|
239
|
+
merge = [
|
|
240
|
+
(key_node, value_node)
|
|
241
|
+
for key_node, value_node in merge
|
|
242
|
+
if key_node.tag != yaml.resolver.BaseResolver.DEFAULT_SCALAR_TAG
|
|
243
|
+
or key_node.value not in explicit_keys
|
|
244
|
+
]
|
|
245
|
+
node.value = merge + node.value
|
|
246
|
+
|
|
247
|
+
def construct_mapping(self, node: yaml.Node, deep: bool = False) -> Any:
|
|
195
248
|
return super().construct_mapping(node, deep=deep)
|
|
196
249
|
|
|
197
250
|
loader = OmegaConfLoader
|
|
@@ -919,20 +972,16 @@ def format_and_raise(
|
|
|
919
972
|
)
|
|
920
973
|
|
|
921
974
|
if ref_type not in (None, Any):
|
|
922
|
-
template = dedent(
|
|
923
|
-
"""\
|
|
975
|
+
template = dedent("""\
|
|
924
976
|
$MSG
|
|
925
977
|
full_key: $FULL_KEY
|
|
926
978
|
reference_type=$REF_TYPE
|
|
927
|
-
object_type=$OBJECT_TYPE"""
|
|
928
|
-
)
|
|
979
|
+
object_type=$OBJECT_TYPE""")
|
|
929
980
|
else:
|
|
930
|
-
template = dedent(
|
|
931
|
-
"""\
|
|
981
|
+
template = dedent("""\
|
|
932
982
|
$MSG
|
|
933
983
|
full_key: $FULL_KEY
|
|
934
|
-
object_type=$OBJECT_TYPE"""
|
|
935
|
-
)
|
|
984
|
+
object_type=$OBJECT_TYPE""")
|
|
936
985
|
s = string.Template(template=template)
|
|
937
986
|
|
|
938
987
|
message = s.substitute(
|
|
@@ -248,16 +248,19 @@ class Node(ABC):
|
|
|
248
248
|
self,
|
|
249
249
|
throw_on_resolution_failure: bool = False,
|
|
250
250
|
memo: Optional[Set[int]] = None,
|
|
251
|
+
resolved_node_cache: Optional[Dict[int, "Node"]] = None,
|
|
251
252
|
) -> Optional["Node"]:
|
|
252
253
|
return self._dereference_node_impl(
|
|
253
254
|
throw_on_resolution_failure=throw_on_resolution_failure,
|
|
254
255
|
memo=memo,
|
|
256
|
+
resolved_node_cache=resolved_node_cache,
|
|
255
257
|
)
|
|
256
258
|
|
|
257
259
|
def _dereference_node_impl(
|
|
258
260
|
self,
|
|
259
261
|
throw_on_resolution_failure: bool,
|
|
260
262
|
memo: Optional[Set[int]] = None,
|
|
263
|
+
resolved_node_cache: Optional[Dict[int, "Node"]] = None,
|
|
261
264
|
) -> Optional["Node"]:
|
|
262
265
|
if not self._is_interpolation():
|
|
263
266
|
return self
|
|
@@ -278,6 +281,7 @@ class Node(ABC):
|
|
|
278
281
|
parse_tree=parse(_get_value(self)),
|
|
279
282
|
throw_on_resolution_failure=throw_on_resolution_failure,
|
|
280
283
|
memo=memo,
|
|
284
|
+
resolved_node_cache=resolved_node_cache,
|
|
281
285
|
)
|
|
282
286
|
|
|
283
287
|
def _get_root(self) -> "Container":
|
|
@@ -456,6 +460,7 @@ class Container(Box):
|
|
|
456
460
|
throw_on_missing: bool,
|
|
457
461
|
throw_on_resolution_failure: bool,
|
|
458
462
|
memo: Optional[Set[int]] = None,
|
|
463
|
+
resolved_node_cache: Optional[Dict[int, "Node"]] = None,
|
|
459
464
|
) -> Tuple[Optional["Container"], Optional[str], Optional[Node]]:
|
|
460
465
|
"""
|
|
461
466
|
Select a value using dot separated key sequence
|
|
@@ -482,6 +487,7 @@ class Container(Box):
|
|
|
482
487
|
ret = ret._maybe_dereference_node(
|
|
483
488
|
throw_on_resolution_failure=throw_on_resolution_failure,
|
|
484
489
|
memo=memo,
|
|
490
|
+
resolved_node_cache=resolved_node_cache,
|
|
485
491
|
)
|
|
486
492
|
|
|
487
493
|
if ret is not None and not isinstance(ret, Container):
|
|
@@ -506,12 +512,15 @@ class Container(Box):
|
|
|
506
512
|
if value is None:
|
|
507
513
|
return root, last_key, None
|
|
508
514
|
|
|
515
|
+
value_id = id(value)
|
|
516
|
+
if resolved_node_cache is not None and value_id in resolved_node_cache:
|
|
517
|
+
return root, last_key, resolved_node_cache[value_id]
|
|
518
|
+
|
|
509
519
|
if memo is not None:
|
|
510
|
-
|
|
511
|
-
if vid in memo:
|
|
520
|
+
if value_id in memo:
|
|
512
521
|
raise InterpolationResolutionError("Recursive interpolation detected")
|
|
513
522
|
# push to memo "stack"
|
|
514
|
-
memo.add(
|
|
523
|
+
memo.add(value_id)
|
|
515
524
|
|
|
516
525
|
try:
|
|
517
526
|
value = root._maybe_resolve_interpolation(
|
|
@@ -520,11 +529,15 @@ class Container(Box):
|
|
|
520
529
|
value=value,
|
|
521
530
|
throw_on_resolution_failure=throw_on_resolution_failure,
|
|
522
531
|
memo=memo,
|
|
532
|
+
resolved_node_cache=resolved_node_cache,
|
|
523
533
|
)
|
|
524
534
|
finally:
|
|
525
535
|
if memo is not None:
|
|
526
536
|
# pop from memo "stack"
|
|
527
|
-
memo.remove(
|
|
537
|
+
memo.remove(value_id)
|
|
538
|
+
|
|
539
|
+
if resolved_node_cache is not None and value is not None:
|
|
540
|
+
resolved_node_cache[value_id] = value
|
|
528
541
|
|
|
529
542
|
return root, last_key, value
|
|
530
543
|
|
|
@@ -536,6 +549,7 @@ class Container(Box):
|
|
|
536
549
|
parse_tree: OmegaConfGrammarParser.ConfigValueContext,
|
|
537
550
|
throw_on_resolution_failure: bool,
|
|
538
551
|
memo: Optional[Set[int]],
|
|
552
|
+
resolved_node_cache: Optional[Dict[int, "Node"]] = None,
|
|
539
553
|
) -> Optional["Node"]:
|
|
540
554
|
"""
|
|
541
555
|
Resolve an interpolation.
|
|
@@ -568,7 +582,11 @@ class Container(Box):
|
|
|
568
582
|
|
|
569
583
|
try:
|
|
570
584
|
resolved = self.resolve_parse_tree(
|
|
571
|
-
parse_tree=parse_tree,
|
|
585
|
+
parse_tree=parse_tree,
|
|
586
|
+
node=value,
|
|
587
|
+
key=key,
|
|
588
|
+
memo=memo,
|
|
589
|
+
resolved_node_cache=resolved_node_cache,
|
|
572
590
|
)
|
|
573
591
|
except InterpolationResolutionError:
|
|
574
592
|
if throw_on_resolution_failure:
|
|
@@ -636,7 +654,10 @@ class Container(Box):
|
|
|
636
654
|
parent = parent._get_parent()
|
|
637
655
|
|
|
638
656
|
def _resolve_node_interpolation(
|
|
639
|
-
self,
|
|
657
|
+
self,
|
|
658
|
+
inter_key: str,
|
|
659
|
+
memo: Optional[Set[int]],
|
|
660
|
+
resolved_node_cache: Optional[Dict[int, "Node"]] = None,
|
|
640
661
|
) -> "Node":
|
|
641
662
|
"""A node interpolation is of the form `${foo.bar}`"""
|
|
642
663
|
try:
|
|
@@ -652,6 +673,7 @@ class Container(Box):
|
|
|
652
673
|
throw_on_missing=True,
|
|
653
674
|
throw_on_resolution_failure=True,
|
|
654
675
|
memo=memo,
|
|
676
|
+
resolved_node_cache=resolved_node_cache,
|
|
655
677
|
)
|
|
656
678
|
except MissingMandatoryValue as exc:
|
|
657
679
|
raise InterpolationToMissingValueError(
|
|
@@ -696,6 +718,7 @@ class Container(Box):
|
|
|
696
718
|
value: Node,
|
|
697
719
|
throw_on_resolution_failure: bool,
|
|
698
720
|
memo: Optional[Set[int]] = None,
|
|
721
|
+
resolved_node_cache: Optional[Dict[int, "Node"]] = None,
|
|
699
722
|
) -> Optional[Node]:
|
|
700
723
|
value_kind = get_value_kind(value)
|
|
701
724
|
if value_kind != ValueKind.INTERPOLATION:
|
|
@@ -709,6 +732,7 @@ class Container(Box):
|
|
|
709
732
|
parse_tree=parse_tree,
|
|
710
733
|
throw_on_resolution_failure=throw_on_resolution_failure,
|
|
711
734
|
memo=memo if memo is not None else set(),
|
|
735
|
+
resolved_node_cache=resolved_node_cache,
|
|
712
736
|
)
|
|
713
737
|
|
|
714
738
|
def resolve_parse_tree(
|
|
@@ -717,6 +741,7 @@ class Container(Box):
|
|
|
717
741
|
node: Node,
|
|
718
742
|
memo: Optional[Set[int]] = None,
|
|
719
743
|
key: Optional[Any] = None,
|
|
744
|
+
resolved_node_cache: Optional[Dict[int, "Node"]] = None,
|
|
720
745
|
) -> Any:
|
|
721
746
|
"""
|
|
722
747
|
Resolve a given parse tree into its value.
|
|
@@ -728,7 +753,11 @@ class Container(Box):
|
|
|
728
753
|
def node_interpolation_callback(
|
|
729
754
|
inter_key: str, memo: Optional[Set[int]]
|
|
730
755
|
) -> Optional["Node"]:
|
|
731
|
-
return self._resolve_node_interpolation(
|
|
756
|
+
return self._resolve_node_interpolation(
|
|
757
|
+
inter_key=inter_key,
|
|
758
|
+
memo=memo,
|
|
759
|
+
resolved_node_cache=resolved_node_cache,
|
|
760
|
+
)
|
|
732
761
|
|
|
733
762
|
def resolver_interpolation_callback(
|
|
734
763
|
name: str, args: Tuple[Any, ...], args_str: Tuple[str, ...]
|
|
@@ -214,9 +214,13 @@ class BaseContainer(Container, ABC):
|
|
|
214
214
|
throw_on_missing: bool,
|
|
215
215
|
enum_to_str: bool = False,
|
|
216
216
|
structured_config_mode: SCMode = SCMode.DICT,
|
|
217
|
+
resolved_node_cache: Optional[Dict[int, Node]] = None,
|
|
217
218
|
) -> Union[None, Any, str, Dict[DictKeyType, Any], List[Any]]:
|
|
218
219
|
from omegaconf import MISSING, DictConfig, ListConfig
|
|
219
220
|
|
|
221
|
+
if resolve and resolved_node_cache is None:
|
|
222
|
+
resolved_node_cache = {}
|
|
223
|
+
|
|
220
224
|
def convert(val: Node) -> Any:
|
|
221
225
|
value = val._value()
|
|
222
226
|
if enum_to_str and isinstance(value, Enum):
|
|
@@ -230,11 +234,26 @@ class BaseContainer(Container, ABC):
|
|
|
230
234
|
except MissingMandatoryValue as e:
|
|
231
235
|
conf._format_and_raise(key=key, value=None, cause=e)
|
|
232
236
|
assert isinstance(node, Node)
|
|
237
|
+
node_id = id(node)
|
|
233
238
|
if resolve:
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
239
|
+
cached = (
|
|
240
|
+
resolved_node_cache.get(node_id)
|
|
241
|
+
if resolved_node_cache is not None
|
|
242
|
+
else None
|
|
243
|
+
)
|
|
244
|
+
if cached is not None:
|
|
245
|
+
node = cached
|
|
246
|
+
else:
|
|
247
|
+
try:
|
|
248
|
+
node = node._maybe_dereference_node(
|
|
249
|
+
throw_on_resolution_failure=True,
|
|
250
|
+
resolved_node_cache=resolved_node_cache,
|
|
251
|
+
)
|
|
252
|
+
except InterpolationResolutionError as e:
|
|
253
|
+
conf._format_and_raise(key=key, value=None, cause=e)
|
|
254
|
+
assert node is not None
|
|
255
|
+
if resolved_node_cache is not None:
|
|
256
|
+
resolved_node_cache[node_id] = node
|
|
238
257
|
|
|
239
258
|
if isinstance(node, Container):
|
|
240
259
|
value = BaseContainer._to_content(
|
|
@@ -243,6 +262,7 @@ class BaseContainer(Container, ABC):
|
|
|
243
262
|
throw_on_missing=throw_on_missing,
|
|
244
263
|
enum_to_str=enum_to_str,
|
|
245
264
|
structured_config_mode=structured_config_mode,
|
|
265
|
+
resolved_node_cache=resolved_node_cache,
|
|
246
266
|
)
|
|
247
267
|
else:
|
|
248
268
|
value = convert(node)
|
|
@@ -329,12 +329,10 @@ class OmegaConf:
|
|
|
329
329
|
@staticmethod
|
|
330
330
|
def register_resolver(name: str, resolver: Resolver) -> None:
|
|
331
331
|
warnings.warn(
|
|
332
|
-
dedent(
|
|
333
|
-
"""\
|
|
332
|
+
dedent("""\
|
|
334
333
|
register_resolver() is deprecated.
|
|
335
334
|
See https://github.com/omry/omegaconf/issues/426 for migration instructions.
|
|
336
|
-
"""
|
|
337
|
-
),
|
|
335
|
+
"""),
|
|
338
336
|
stacklevel=2,
|
|
339
337
|
)
|
|
340
338
|
return OmegaConf.legacy_register_resolver(name, resolver)
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import sys # pragma: no cover
|
|
2
2
|
|
|
3
|
-
__version__ = "2.4.0.
|
|
3
|
+
__version__ = "2.4.0.dev10"
|
|
4
4
|
|
|
5
|
-
msg = """OmegaConf 2.4 and above is compatible with Python 3.
|
|
5
|
+
msg = """OmegaConf 2.4 and above is compatible with Python 3.10 and newer.
|
|
6
6
|
You have the following options:
|
|
7
|
-
1. Upgrade to Python 3.
|
|
7
|
+
1. Upgrade to Python 3.10 or newer.
|
|
8
8
|
This is highly recommended. new features will not be added to OmegaConf 2.3.
|
|
9
9
|
2. Continue using OmegaConf 2.3:
|
|
10
10
|
You can pip install 'OmegaConf<2.4' to do that.
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: omegaconf
|
|
3
|
-
Version: 2.4.0.
|
|
3
|
+
Version: 2.4.0.dev10
|
|
4
4
|
Summary: A flexible configuration library
|
|
5
5
|
Home-page: https://github.com/omry/omegaconf
|
|
6
6
|
Author: Omry Yadan
|
|
7
7
|
Author-email: omry@yadan.net
|
|
8
8
|
Keywords: yaml configuration config
|
|
9
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
10
9
|
Classifier: Programming Language :: Python :: 3.10
|
|
11
10
|
Classifier: Programming Language :: Python :: 3.11
|
|
12
11
|
Classifier: Programming Language :: Python :: 3.12
|
|
@@ -14,12 +13,10 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
14
13
|
Classifier: Programming Language :: Python :: 3.14
|
|
15
14
|
Classifier: License :: OSI Approved :: BSD License
|
|
16
15
|
Classifier: Operating System :: OS Independent
|
|
17
|
-
Requires-Python: >=3.
|
|
16
|
+
Requires-Python: >=3.10
|
|
18
17
|
Description-Content-Type: text/markdown
|
|
19
18
|
License-File: LICENSE
|
|
20
19
|
Requires-Dist: PyYAML>=5.1.0
|
|
21
|
-
Requires-Dist: dataclasses; python_version == "3.6"
|
|
22
|
-
Requires-Dist: typing-extensions; python_version <= "3.9"
|
|
23
20
|
Dynamic: author
|
|
24
21
|
Dynamic: author-email
|
|
25
22
|
Dynamic: classifier
|
|
@@ -35,16 +32,25 @@ Dynamic: summary
|
|
|
35
32
|
# OmegaConf
|
|
36
33
|
| | Description |
|
|
37
34
|
| --- | --- |
|
|
38
|
-
| Project | [](https://badge.fury.io/py/omegaconf)[](https://pepy.tech/project/omegaconf
|
|
39
|
-
| Code quality| [](https://circleci.com/gh/omry/omegaconf)[](https://coveralls.io/github/omry/omegaconf)
|
|
35
|
+
| Project | [](https://badge.fury.io/py/omegaconf)[](https://pepy.tech/project/omegaconf) |
|
|
36
|
+
| Code quality| [](https://circleci.com/gh/omry/omegaconf)[](https://coveralls.io/github/omry/omegaconf)|
|
|
40
37
|
| Docs and support |[](https://omegaconf.readthedocs.io/en/2.1_branch/)[](https://mybinder.org/v2/gh/omry/omegaconf/master?filepath=docs%2Fnotebook%2FTutorial.ipynb)|
|
|
41
38
|
|
|
42
39
|
|
|
43
40
|
OmegaConf is a hierarchical configuration system, with support for merging configurations from multiple sources (YAML config files, dataclasses/objects and CLI arguments)
|
|
44
41
|
providing a consistent API regardless of how the configuration was created.
|
|
45
42
|
|
|
43
|
+
## Optional subprojects
|
|
44
|
+
|
|
45
|
+
- [`omegaconf-pydevd`](./subprojects/omegaconf-pydevd/README.md): optional `pydevd` debugger plugin for inspecting OmegaConf objects in supported debuggers.
|
|
46
|
+
|
|
46
47
|
## Releases
|
|
47
48
|
|
|
49
|
+
### Upcoming (2.4.0.dev)
|
|
50
|
+
OmegaConf 2.4.0.dev is the upcoming development version.
|
|
51
|
+
* [Documentation](https://omegaconf.readthedocs.io/en/latest/)
|
|
52
|
+
* [Source code](https://github.com/omry/omegaconf/tree/master)
|
|
53
|
+
|
|
48
54
|
### Stable (2.3)
|
|
49
55
|
OmegaConf 2.3 is the current stable version.
|
|
50
56
|
* [What's new](https://github.com/omry/omegaconf/releases/tag/v2.3.0)
|
|
@@ -53,33 +59,5 @@ OmegaConf 2.3 is the current stable version.
|
|
|
53
59
|
|
|
54
60
|
Install with `pip install --upgrade omegaconf`
|
|
55
61
|
|
|
56
|
-
### Previous release (2.2)
|
|
57
|
-
|
|
58
|
-
* [What's new](https://github.com/omry/omegaconf/releases/tag/v2.1.1)
|
|
59
|
-
* [Documentation](https://omegaconf.readthedocs.io/en/2.1_branch/)
|
|
60
|
-
* [Slides](https://docs.google.com/presentation/d/e/2PACX-1vT_UIV7hCnquIbLUm4NnkUpXvPEh33IKiUEvPRF850WKA8opOlZOszjKdZ3tPmf8u7hGNP6HpqS-NT5/pub?start=false&loop=false&delayms=3000)
|
|
61
|
-
* [Source code](https://github.com/omry/omegaconf/tree/2.1_branch)
|
|
62
|
-
|
|
63
|
-
Install with `pip install omegaconf==2.1`
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
### Previous release (2.1)
|
|
67
|
-
|
|
68
|
-
* [What's new](https://github.com/omry/omegaconf/releases/tag/v2.1.1)
|
|
69
|
-
* [Documentation](https://omegaconf.readthedocs.io/en/2.1_branch/)
|
|
70
|
-
* [Slides](https://docs.google.com/presentation/d/e/2PACX-1vT_UIV7hCnquIbLUm4NnkUpXvPEh33IKiUEvPRF850WKA8opOlZOszjKdZ3tPmf8u7hGNP6HpqS-NT5/pub?start=false&loop=false&delayms=3000)
|
|
71
|
-
* [Source code](https://github.com/omry/omegaconf/tree/2.1_branch)
|
|
72
|
-
|
|
73
|
-
Install with `pip install omegaconf==2.1`
|
|
74
|
-
|
|
75
|
-
### Previous release (2.0)
|
|
76
|
-
|
|
77
|
-
* [What's new](https://github.com/omry/omegaconf/releases/tag/v2.0.0)
|
|
78
|
-
* [Documentation](https://omegaconf.readthedocs.io/en/2.0_branch/)
|
|
79
|
-
* [Slides](https://docs.google.com/presentation/d/e/2PACX-1vT_UIV7hCnquIbLUm4NnkUpXvPEh33IKiUEvPRF850WKA8opOlZOszjKdZ3tPmf8u7hGNP6HpqS-NT5/pub?start=false&loop=false&delayms=3000)
|
|
80
|
-
* [Source code](https://github.com/omry/omegaconf/tree/2.0_branch)
|
|
81
|
-
|
|
82
|
-
Install with `pip install omegaconf==2.0.6`
|
|
83
|
-
|
|
84
62
|
## Live tutorial
|
|
85
63
|
Run the live tutorial: [](https://mybinder.org/v2/gh/omry/omegaconf/master?filepath=docs%2Fnotebook%2FTutorial.ipynb)
|
|
@@ -99,9 +99,6 @@ omegaconf/vendor/antlr4/tree/__init__.py
|
|
|
99
99
|
omegaconf/vendor/antlr4/xpath/XPath.py
|
|
100
100
|
omegaconf/vendor/antlr4/xpath/XPathLexer.py
|
|
101
101
|
omegaconf/vendor/antlr4/xpath/__init__.py
|
|
102
|
-
pydevd_plugins/__init__.py
|
|
103
|
-
pydevd_plugins/extensions/__init__.py
|
|
104
|
-
pydevd_plugins/extensions/pydevd_plugin_omegaconf.py
|
|
105
102
|
requirements/base.txt
|
|
106
103
|
tests/__init__.py
|
|
107
104
|
tests/conftest.py
|
|
@@ -119,7 +116,6 @@ tests/test_merge.py
|
|
|
119
116
|
tests/test_nested_containers.py
|
|
120
117
|
tests/test_nodes.py
|
|
121
118
|
tests/test_omegaconf.py
|
|
122
|
-
tests/test_pydev_resolver_plugin.py
|
|
123
119
|
tests/test_readonly.py
|
|
124
120
|
tests/test_select.py
|
|
125
121
|
tests/test_serialization.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
PyYAML>=5.1.0
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
omegaconf
|
|
@@ -6,16 +6,60 @@ exclude = '''
|
|
|
6
6
|
| \.git # root of the project
|
|
7
7
|
| \.mypy_cache
|
|
8
8
|
| omegaconf/grammar/gen
|
|
9
|
+
| omegaconf/vendor
|
|
9
10
|
| \.nox
|
|
10
11
|
| build
|
|
12
|
+
| subprojects
|
|
13
|
+
| temp
|
|
11
14
|
| vendor
|
|
12
15
|
)
|
|
13
16
|
)
|
|
14
17
|
'''
|
|
15
18
|
|
|
19
|
+
[tool.isort]
|
|
20
|
+
skip_glob = ["temp/*", "omegaconf/vendor/*", "subprojects/*"]
|
|
21
|
+
|
|
16
22
|
[tool.pytest.ini_options]
|
|
17
23
|
addopts = "--import-mode=append -Werror"
|
|
18
24
|
pythonpath = ["."]
|
|
25
|
+
norecursedirs = ["subprojects"]
|
|
26
|
+
|
|
27
|
+
[tool.bumpversion]
|
|
28
|
+
current_version = "2.4.0.dev10"
|
|
29
|
+
parse = '''(?x)
|
|
30
|
+
(?P<major>\d+)
|
|
31
|
+
\.(?P<minor>\d+)
|
|
32
|
+
\.(?P<patch>\d+)
|
|
33
|
+
(?:
|
|
34
|
+
\.(?P<pre_l>dev)
|
|
35
|
+
(?P<pre_n>\d+)
|
|
36
|
+
)?
|
|
37
|
+
'''
|
|
38
|
+
serialize = [
|
|
39
|
+
"{major}.{minor}.{patch}.{pre_l}{pre_n}",
|
|
40
|
+
"{major}.{minor}.{patch}",
|
|
41
|
+
]
|
|
42
|
+
search = '{current_version}'
|
|
43
|
+
replace = '{new_version}'
|
|
44
|
+
regex = false
|
|
45
|
+
ignore_missing_version = false
|
|
46
|
+
tag = false
|
|
47
|
+
sign_tags = false
|
|
48
|
+
allow_dirty = false
|
|
49
|
+
commit = false
|
|
50
|
+
|
|
51
|
+
[tool.bumpversion.parts.pre_l]
|
|
52
|
+
values = ["final", "dev"]
|
|
53
|
+
optional_value = "final"
|
|
54
|
+
|
|
55
|
+
[tool.bumpversion.parts.pre_n]
|
|
56
|
+
first_value = "0"
|
|
57
|
+
|
|
58
|
+
[[tool.bumpversion.files]]
|
|
59
|
+
filename = "omegaconf/version.py"
|
|
60
|
+
|
|
61
|
+
[[tool.bumpversion.files]]
|
|
62
|
+
filename = "subprojects/omegaconf-pydevd/version.py"
|
|
19
63
|
|
|
20
64
|
[tool.towncrier]
|
|
21
65
|
package = "omegaconf"
|