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.
Files changed (161) hide show
  1. {omegaconf-2.4.0.dev4/omegaconf.egg-info → omegaconf-2.4.0.dev10}/PKG-INFO +13 -35
  2. omegaconf-2.4.0.dev10/README.md +32 -0
  3. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/build_helpers/build_helpers.py +1 -1
  4. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/_utils.py +62 -13
  5. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/base.py +36 -7
  6. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/basecontainer.py +24 -4
  7. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/omegaconf.py +2 -4
  8. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/typing.py +1 -6
  9. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/version.py +3 -3
  10. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10/omegaconf.egg-info}/PKG-INFO +13 -35
  11. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf.egg-info/SOURCES.txt +0 -4
  12. omegaconf-2.4.0.dev10/omegaconf.egg-info/requires.txt +1 -0
  13. omegaconf-2.4.0.dev10/omegaconf.egg-info/top_level.txt +1 -0
  14. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/pyproject.toml +44 -0
  15. omegaconf-2.4.0.dev10/requirements/base.txt +1 -0
  16. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/setup.cfg +7 -2
  17. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/setup.py +4 -16
  18. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/__init__.py +2 -1
  19. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/interpolation/built_in_resolvers/test_oc_deprecated.py +1 -1
  20. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/interpolation/test_custom_resolvers.py +2 -2
  21. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/interpolation/test_interpolation.py +4 -8
  22. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/structured_conf/data/attr_classes.py +3 -3
  23. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/structured_conf/data/dataclasses.py +3 -3
  24. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/structured_conf/data/dataclasses_pre_311.py +10 -8
  25. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/structured_conf/test_structured_config.py +10 -10
  26. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_basic_ops_dict.py +1 -1
  27. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_basic_ops_list.py +15 -12
  28. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_compare_dictconfig_vs_dict.py +2 -2
  29. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_create.py +71 -24
  30. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_errors.py +3 -5
  31. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_grammar.py +1 -1
  32. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_merge.py +9 -21
  33. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_select.py +4 -4
  34. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_to_container.py +65 -0
  35. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_to_yaml.py +2 -4
  36. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_utils.py +7 -7
  37. omegaconf-2.4.0.dev4/README.md +0 -51
  38. omegaconf-2.4.0.dev4/omegaconf.egg-info/requires.txt +0 -7
  39. omegaconf-2.4.0.dev4/omegaconf.egg-info/top_level.txt +0 -2
  40. omegaconf-2.4.0.dev4/pydevd_plugins/__init__.py +0 -3
  41. omegaconf-2.4.0.dev4/pydevd_plugins/extensions/__init__.py +0 -3
  42. omegaconf-2.4.0.dev4/pydevd_plugins/extensions/pydevd_plugin_omegaconf.py +0 -126
  43. omegaconf-2.4.0.dev4/requirements/base.txt +0 -5
  44. omegaconf-2.4.0.dev4/tests/test_pydev_resolver_plugin.py +0 -278
  45. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/LICENSE +0 -0
  46. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/MANIFEST.in +0 -0
  47. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/build_helpers/__init__.py +0 -0
  48. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/build_helpers/bin/antlr-4.11.1-complete.jar +0 -0
  49. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/build_helpers/get_vendored.py +0 -0
  50. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/build_helpers/test_helpers.py +0 -0
  51. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/__init__.py +0 -0
  52. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/_impl.py +0 -0
  53. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/dictconfig.py +0 -0
  54. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/errors.py +0 -0
  55. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/grammar/OmegaConfGrammarLexer.g4 +0 -0
  56. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/grammar/OmegaConfGrammarParser.g4 +0 -0
  57. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/grammar/__init__.py +0 -0
  58. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/grammar/gen/OmegaConfGrammarLexer.py +0 -0
  59. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/grammar/gen/OmegaConfGrammarParser.py +0 -0
  60. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/grammar/gen/OmegaConfGrammarParserListener.py +0 -0
  61. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/grammar/gen/OmegaConfGrammarParserVisitor.py +0 -0
  62. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/grammar/gen/__init__.py +0 -0
  63. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/grammar_parser.py +0 -0
  64. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/grammar_visitor.py +0 -0
  65. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/listconfig.py +0 -0
  66. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/nodes.py +0 -0
  67. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/py.typed +0 -0
  68. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/resolvers/__init__.py +0 -0
  69. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/resolvers/oc/__init__.py +0 -0
  70. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/resolvers/oc/dict.py +0 -0
  71. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/__init__.py +0 -0
  72. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/BufferedTokenStream.py +0 -0
  73. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/CommonTokenFactory.py +0 -0
  74. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/CommonTokenStream.py +0 -0
  75. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/FileStream.py +0 -0
  76. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/InputStream.py +0 -0
  77. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/IntervalSet.py +0 -0
  78. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/LL1Analyzer.py +0 -0
  79. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/Lexer.py +0 -0
  80. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/ListTokenSource.py +0 -0
  81. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/Parser.py +0 -0
  82. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/ParserInterpreter.py +0 -0
  83. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/ParserRuleContext.py +0 -0
  84. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/PredictionContext.py +0 -0
  85. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/Recognizer.py +0 -0
  86. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/RuleContext.py +0 -0
  87. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/StdinStream.py +0 -0
  88. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/Token.py +0 -0
  89. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/TokenStreamRewriter.py +0 -0
  90. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/Utils.py +0 -0
  91. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/__init__.py +0 -0
  92. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/_pygrun.py +0 -0
  93. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/ATN.py +0 -0
  94. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/ATNConfig.py +0 -0
  95. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/ATNConfigSet.py +0 -0
  96. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/ATNDeserializationOptions.py +0 -0
  97. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/ATNDeserializer.py +0 -0
  98. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/ATNSimulator.py +0 -0
  99. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/ATNState.py +0 -0
  100. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/ATNType.py +0 -0
  101. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/LexerATNSimulator.py +0 -0
  102. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/LexerAction.py +0 -0
  103. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/LexerActionExecutor.py +0 -0
  104. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/ParserATNSimulator.py +0 -0
  105. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/PredictionMode.py +0 -0
  106. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/SemanticContext.py +0 -0
  107. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/Transition.py +0 -0
  108. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/atn/__init__.py +0 -0
  109. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/dfa/DFA.py +0 -0
  110. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/dfa/DFASerializer.py +0 -0
  111. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/dfa/DFAState.py +0 -0
  112. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/dfa/__init__.py +0 -0
  113. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/error/DiagnosticErrorListener.py +0 -0
  114. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/error/ErrorListener.py +0 -0
  115. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/error/ErrorStrategy.py +0 -0
  116. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/error/Errors.py +0 -0
  117. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/error/__init__.py +0 -0
  118. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/tree/Chunk.py +0 -0
  119. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/tree/ParseTreeMatch.py +0 -0
  120. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/tree/ParseTreePattern.py +0 -0
  121. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/tree/ParseTreePatternMatcher.py +0 -0
  122. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/tree/RuleTagToken.py +0 -0
  123. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/tree/TokenTagToken.py +0 -0
  124. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/tree/Tree.py +0 -0
  125. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/tree/Trees.py +0 -0
  126. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/tree/__init__.py +0 -0
  127. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/xpath/XPath.py +0 -0
  128. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/xpath/XPathLexer.py +0 -0
  129. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf/vendor/antlr4/xpath/__init__.py +0 -0
  130. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/omegaconf.egg-info/dependency_links.txt +0 -0
  131. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/conftest.py +0 -0
  132. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/data/2.0.6.pickle +0 -0
  133. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/data/2.1.0.rc1.pickle +0 -0
  134. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/data/load.py +0 -0
  135. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/data/save.py +0 -0
  136. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/examples/__init__.py +0 -0
  137. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/examples/dataclass_postponed_annotations.py +0 -0
  138. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/examples/test_dataclass_example.py +0 -0
  139. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/examples/test_postponed_annotations.py +0 -0
  140. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/interpolation/__init__.py +0 -0
  141. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/interpolation/built_in_resolvers/__init__.py +0 -0
  142. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/interpolation/built_in_resolvers/test_oc_create.py +0 -0
  143. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/interpolation/built_in_resolvers/test_oc_decode.py +0 -0
  144. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/interpolation/built_in_resolvers/test_oc_dict.py +0 -0
  145. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/interpolation/built_in_resolvers/test_oc_env.py +0 -0
  146. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/interpolation/built_in_resolvers/test_oc_select.py +0 -0
  147. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/structured_conf/__init__.py +0 -0
  148. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/structured_conf/data/__init__.py +0 -0
  149. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/structured_conf/test_structured_basic.py +0 -0
  150. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_base_config.py +0 -0
  151. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_config_eq.py +0 -0
  152. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_get_full_key.py +0 -0
  153. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_matrix.py +0 -0
  154. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_nested_containers.py +0 -0
  155. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_nodes.py +0 -0
  156. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_omegaconf.py +0 -0
  157. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_readonly.py +0 -0
  158. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_serialization.py +0 -0
  159. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_struct.py +0 -0
  160. {omegaconf-2.4.0.dev4 → omegaconf-2.4.0.dev10}/tests/test_unions.py +0 -0
  161. {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.dev4
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.9
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 | [![PyPI version](https://badge.fury.io/py/omegaconf.svg)](https://badge.fury.io/py/omegaconf)[![Downloads](https://pepy.tech/badge/omegaconf/month)](https://pepy.tech/project/omegaconf?versions=1.4.*&versions=2.0.*&versions=2.1.*)![PyPI - Python Version](https://img.shields.io/pypi/pyversions/omegaconf.svg) |
39
- | Code quality| [![CircleCI](https://img.shields.io/circleci/build/github/omry/omegaconf?logo=s&token=5de2f8dc2a0dd78438520575431aa533150806e3)](https://circleci.com/gh/omry/omegaconf)[![Coverage Status](https://coveralls.io/repos/github/omry/omegaconf/badge.svg)](https://coveralls.io/github/omry/omegaconf)[![Total alerts](https://img.shields.io/lgtm/alerts/g/omry/omegaconf.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/omry/omegaconf/alerts/)[![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/omry/omegaconf.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/omry/omegaconf/context:python)|
35
+ | Project | [![PyPI version](https://badge.fury.io/py/omegaconf.svg)](https://badge.fury.io/py/omegaconf)[![Downloads](https://pepy.tech/badge/omegaconf/month)](https://pepy.tech/project/omegaconf)![Python](https://img.shields.io/badge/python-3.10%20%7C%203.11%20%7C%203.12%20%7C%203.13%20%7C%203.14-blue) |
36
+ | Code quality| [![CircleCI](https://img.shields.io/circleci/build/github/omry/omegaconf?logo=s&token=5de2f8dc2a0dd78438520575431aa533150806e3)](https://circleci.com/gh/omry/omegaconf)[![Coverage Status](https://coveralls.io/repos/github/omry/omegaconf/badge.svg)](https://coveralls.io/github/omry/omegaconf)|
40
37
  | Docs and support |[![Documentation Status](https://readthedocs.org/projects/omegaconf/badge/?version=2.0_branch)](https://omegaconf.readthedocs.io/en/2.1_branch/)[![Binder](https://mybinder.org/badge_logo.svg)](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: [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/omry/omegaconf/master?filepath=docs%2Fnotebook%2FTutorial.ipynb)
@@ -0,0 +1,32 @@
1
+ # OmegaConf
2
+ | | Description |
3
+ | --- | --- |
4
+ | Project | [![PyPI version](https://badge.fury.io/py/omegaconf.svg)](https://badge.fury.io/py/omegaconf)[![Downloads](https://pepy.tech/badge/omegaconf/month)](https://pepy.tech/project/omegaconf)![Python](https://img.shields.io/badge/python-3.10%20%7C%203.11%20%7C%203.12%20%7C%203.13%20%7C%203.14-blue) |
5
+ | Code quality| [![CircleCI](https://img.shields.io/circleci/build/github/omry/omegaconf?logo=s&token=5de2f8dc2a0dd78438520575431aa533150806e3)](https://circleci.com/gh/omry/omegaconf)[![Coverage Status](https://coveralls.io/repos/github/omry/omegaconf/badge.svg)](https://coveralls.io/github/omry/omegaconf)|
6
+ | Docs and support |[![Documentation Status](https://readthedocs.org/projects/omegaconf/badge/?version=2.0_branch)](https://omegaconf.readthedocs.io/en/2.1_branch/)[![Binder](https://mybinder.org/badge_logo.svg)](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: [![Binder](https://mybinder.org/badge_logo.svg)](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 construct_mapping(self, node: yaml.Node, deep: bool = False) -> Any:
183
- keys = set()
184
- for key_node, value_node in node.value:
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 keys:
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
- keys.add(key_node.value)
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
- vid = id(value)
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(vid)
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(vid)
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, node=value, key=key, memo=memo
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, inter_key: str, memo: Optional[Set[int]]
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(inter_key=inter_key, memo=memo)
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
- try:
235
- node = node._dereference_node()
236
- except InterpolationResolutionError as e:
237
- conf._format_and_raise(key=key, value=None, cause=e)
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,9 +1,4 @@
1
- import sys
2
-
3
- if sys.version_info >= (3, 10):
4
- from typing import TypeAlias
5
- else:
6
- from typing_extensions import TypeAlias
1
+ from typing import TypeAlias
7
2
 
8
3
  from .vendor.antlr4.ParserRuleContext import ParserRuleContext
9
4
 
@@ -1,10 +1,10 @@
1
1
  import sys # pragma: no cover
2
2
 
3
- __version__ = "2.4.0.dev4"
3
+ __version__ = "2.4.0.dev10"
4
4
 
5
- msg = """OmegaConf 2.4 and above is compatible with Python 3.9 and newer.
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.9 or newer.
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.dev4
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.9
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 | [![PyPI version](https://badge.fury.io/py/omegaconf.svg)](https://badge.fury.io/py/omegaconf)[![Downloads](https://pepy.tech/badge/omegaconf/month)](https://pepy.tech/project/omegaconf?versions=1.4.*&versions=2.0.*&versions=2.1.*)![PyPI - Python Version](https://img.shields.io/pypi/pyversions/omegaconf.svg) |
39
- | Code quality| [![CircleCI](https://img.shields.io/circleci/build/github/omry/omegaconf?logo=s&token=5de2f8dc2a0dd78438520575431aa533150806e3)](https://circleci.com/gh/omry/omegaconf)[![Coverage Status](https://coveralls.io/repos/github/omry/omegaconf/badge.svg)](https://coveralls.io/github/omry/omegaconf)[![Total alerts](https://img.shields.io/lgtm/alerts/g/omry/omegaconf.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/omry/omegaconf/alerts/)[![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/omry/omegaconf.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/omry/omegaconf/context:python)|
35
+ | Project | [![PyPI version](https://badge.fury.io/py/omegaconf.svg)](https://badge.fury.io/py/omegaconf)[![Downloads](https://pepy.tech/badge/omegaconf/month)](https://pepy.tech/project/omegaconf)![Python](https://img.shields.io/badge/python-3.10%20%7C%203.11%20%7C%203.12%20%7C%203.13%20%7C%203.14-blue) |
36
+ | Code quality| [![CircleCI](https://img.shields.io/circleci/build/github/omry/omegaconf?logo=s&token=5de2f8dc2a0dd78438520575431aa533150806e3)](https://circleci.com/gh/omry/omegaconf)[![Coverage Status](https://coveralls.io/repos/github/omry/omegaconf/badge.svg)](https://coveralls.io/github/omry/omegaconf)|
40
37
  | Docs and support |[![Documentation Status](https://readthedocs.org/projects/omegaconf/badge/?version=2.0_branch)](https://omegaconf.readthedocs.io/en/2.1_branch/)[![Binder](https://mybinder.org/badge_logo.svg)](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: [![Binder](https://mybinder.org/badge_logo.svg)](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"