Repository files navigation

Configue

CIcodecov

A YAML parser with advanced functionalities to ease your application configuration.

Who is this library for ?

This library is meant to be used in medium to large-scale applications, that have a lot of parameters to configure.

Modular applications especially can greatly benefit from using configue to easily inject new modules.

Installation

Run pip install configue to install from PyPI.

Run pip install . to install from sources.

This project follows the (Semantic Versioning Specification)[https://semver.org/]. All breaking changes are described in the Changelog.

Usage

Basic usage

This library uses PyYAML to parse the YAML files and return the file content.

importconfigueconfig=configue.load("/path/to/yaml/file.yml")

Loading a sub path

If you are not interested in loading the whole file, you can only load a subpath:

# config.ymlsome_key:
some_list:
- first_item
- second_item:
item_key: item_valuenot_loaded_key: not_loaded_value
importconfigueconfig=configue.load("config.yml", "some_key.some_list.1.item_key")
assertconfig=="item_value"

Instantiating classes

Use () in your YAML files to instantiate classes:

# config.yml(): "my_project.MyAwesomeClass"my_argument: "my_value"my_other_argument:
(): "my_project.my_module.MyOtherClass"
importconfiguefrommy_projectimportMyAwesomeClassfrommy_project.my_moduleimportMyOtherClassmy_instance=configue.load("config.yml")
assertisinstance(my_instance, MyAwesomeClass)
assertmy_instance.my_argument=="my_value"assertisinstance(my_instance.my_other_argument, MyOtherClass)

This syntax also works to call functions:

# config.yml(): "my_project.my_function"my_argument: "world"
importconfiguedefmy_function(my_argument: str) ->str:
return"Hello "+my_argumentmy_value=configue.load("config.yml")
assertmy_value=="Hello world"

Loading external variables

# config.ymlmy_argument: !ext my_project.my_module.my_variablemy_argument: !ext my_project.my_module.my_instance.my_attribute

When using the !ext tag, the value will be imported from the corresponding python module.

Loading internal variables

# config.ymlmy_object:
my_instance:
(): my_project.MyClassmy_instance_shortcut: !cfg my_object.my_instancemy_attribute_shortcut: !cfg my_object.my_instance.my_attribute

When using the !cfg tag, the value will be loaded from the same configuration file (useful for a DRY configuration).

Environment variables

If you want to load an environment variable in your YAML config file, you can use this syntax:

# config.ymlmy_key: ${VAR_NAME}

This will resolve as "my_value" if the environment variable VAR_NAME is set to this value.

If you need a default value in case the environment variable is not set:

# config.ymlmy_key: ${VAR_NAME-default}

You can insert this syntax in the middle of a string:

# config.ymlmy_key: prefix${VAR_NAME-default}suffix

This will resolve as "prefixmy_value_suffix" if the value is set, "prefixdefaultsuffix" if it is not.

If your environment variable resolves to a yaml value, it will be cast (unless you are using quotes):

# config.ymlmy_key: ${VAR_NAME}my_quoted_key: "${VAR_NAME}"

This will resolve as True if the value is set to true, yes or y, None if the value is set to ~ or null.

Relative paths

If you want to expand a relative path in your YAML config file:

# config.ymlmy_path: !path my_folder/my_file.txt 

Assuming your file structure looks like this:

root/
├── config.yml
└── my_folder
└── my_file.txt

The path is resolved starting from the folder containing the parent yml file, this example will resolve to /root/my_folder/my_file.txt

Do not start the path with / as it will be treated as an absolute path instead.

You can use environment variables in your file path.

Importing other files

You can import another file directly in your YAML config file:

# config.ymlmy_import: !import my_folder/my_other_config.yml
# my_other_config.ymlsome_key:
- var_1
- var_2

By default, the path is resolved starting from the folder containing the parent yml file, this example will resolve to "my_import": {"some_key": [var_1, var_2]}

If you want to import only a section of the file, use the path in the tag suffix !import:some_key.0

Do not start the import path with / as it will be treated as an absolute path instead.

You can use environment variables in your import path.

Logging configuration

You can load the logging configuration for your application by using the logging_config_path parameter:

# config.ymllogging_config:
version: 1handlers:
console:
class : logging.StreamHandlerstream : ext://sys.stdoutcustom_handler:
\(): my_app.CustomHandlersome_param: some_valuelevel: ERRORroot:
level: INFOhandlers:
- consoleapp_config:
some_key: some_valuenot_loaded_key: not_loaded_value
importloggingimportconfigueapp_config=configue.load("config.yml", "app_config", logging_config_path="logging_config")
assertapp_config== {"some_key": "some_value"}
logger=logging.getLogger(__name__)
logger.info("Hello world!") # Uses the console handler

The logging configuration should follow the format of logging.config.dictConfig (check the documentation for more details). Make sure to escape the constructors with \() instead of () for handlers, formatters and filters.

Testing

Install the development dependencies with pip install -r dev.requirements.txt.

Run python -m unitttest discover to run the tests.

Run pylint configue to check the files linting.

About

A YAML parser with advanced functionalities to ease your application configuration

Topics

Resources

Contributing

Stars

41 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Configue

CIcodecov

A YAML parser with advanced functionalities to ease your application configuration.

Who is this library for ?

This library is meant to be used in medium to large-scale applications, that have a lot of parameters to configure.

Modular applications especially can greatly benefit from using configue to easily inject new modules.

Installation

Run pip install configue to install from PyPI.

Run pip install . to install from sources.

This project follows the (Semantic Versioning Specification)[https://semver.org/]. All breaking changes are described in the Changelog.

Usage

Basic usage

This library uses PyYAML to parse the YAML files and return the file content.

importconfigueconfig=configue.load("/path/to/yaml/file.yml")

Loading a sub path

If you are not interested in loading the whole file, you can only load a subpath:

# config.ymlsome_key:
some_list:
- first_item
- second_item:
item_key: item_valuenot_loaded_key: not_loaded_value
importconfigueconfig=configue.load("config.yml", "some_key.some_list.1.item_key")
assertconfig=="item_value"

Instantiating classes

Use () in your YAML files to instantiate classes:

# config.yml(): "my_project.MyAwesomeClass"my_argument: "my_value"my_other_argument:
(): "my_project.my_module.MyOtherClass"
importconfiguefrommy_projectimportMyAwesomeClassfrommy_project.my_moduleimportMyOtherClassmy_instance=configue.load("config.yml")
assertisinstance(my_instance, MyAwesomeClass)
assertmy_instance.my_argument=="my_value"assertisinstance(my_instance.my_other_argument, MyOtherClass)

This syntax also works to call functions:

# config.yml(): "my_project.my_function"my_argument: "world"
importconfiguedefmy_function(my_argument: str) ->str:
return"Hello "+my_argumentmy_value=configue.load("config.yml")
assertmy_value=="Hello world"

Loading external variables

# config.ymlmy_argument: !ext my_project.my_module.my_variablemy_argument: !ext my_project.my_module.my_instance.my_attribute

When using the !ext tag, the value will be imported from the corresponding python module.

Loading internal variables

# config.ymlmy_object:
my_instance:
(): my_project.MyClassmy_instance_shortcut: !cfg my_object.my_instancemy_attribute_shortcut: !cfg my_object.my_instance.my_attribute

When using the !cfg tag, the value will be loaded from the same configuration file (useful for a DRY configuration).

Environment variables

If you want to load an environment variable in your YAML config file, you can use this syntax:

# config.ymlmy_key: ${VAR_NAME}

This will resolve as "my_value" if the environment variable VAR_NAME is set to this value.

If you need a default value in case the environment variable is not set:

# config.ymlmy_key: ${VAR_NAME-default}

You can insert this syntax in the middle of a string:

# config.ymlmy_key: prefix${VAR_NAME-default}suffix

This will resolve as "prefixmy_value_suffix" if the value is set, "prefixdefaultsuffix" if it is not.

If your environment variable resolves to a yaml value, it will be cast (unless you are using quotes):

# config.ymlmy_key: ${VAR_NAME}my_quoted_key: "${VAR_NAME}"

This will resolve as True if the value is set to true, yes or y, None if the value is set to ~ or null.

Relative paths

If you want to expand a relative path in your YAML config file:

# config.ymlmy_path: !path my_folder/my_file.txt 

Assuming your file structure looks like this:

root/
├── config.yml
└── my_folder
└── my_file.txt

The path is resolved starting from the folder containing the parent yml file, this example will resolve to /root/my_folder/my_file.txt

Do not start the path with / as it will be treated as an absolute path instead.

You can use environment variables in your file path.

Importing other files

You can import another file directly in your YAML config file:

# config.ymlmy_import: !import my_folder/my_other_config.yml
# my_other_config.ymlsome_key:
- var_1
- var_2

By default, the path is resolved starting from the folder containing the parent yml file, this example will resolve to "my_import": {"some_key": [var_1, var_2]}

If you want to import only a section of the file, use the path in the tag suffix !import:some_key.0

Do not start the import path with / as it will be treated as an absolute path instead.

You can use environment variables in your import path.

Logging configuration

You can load the logging configuration for your application by using the logging_config_path parameter:

# config.ymllogging_config:
version: 1handlers:
console:
class : logging.StreamHandlerstream : ext://sys.stdoutcustom_handler:
\(): my_app.CustomHandlersome_param: some_valuelevel: ERRORroot:
level: INFOhandlers:
- consoleapp_config:
some_key: some_valuenot_loaded_key: not_loaded_value
importloggingimportconfigueapp_config=configue.load("config.yml", "app_config", logging_config_path="logging_config")
assertapp_config== {"some_key": "some_value"}
logger=logging.getLogger(__name__)
logger.info("Hello world!") # Uses the console handler

The logging configuration should follow the format of logging.config.dictConfig (check the documentation for more details). Make sure to escape the constructors with \() instead of () for handlers, formatters and filters.

Testing

Install the development dependencies with pip install -r dev.requirements.txt.

Run python -m unitttest discover to run the tests.

Run pylint configue to check the files linting.

About

A YAML parser with advanced functionalities to ease your application configuration

Topics

Resources

Contributing

Stars

41 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Configue

CIcodecov

A YAML parser with advanced functionalities to ease your application configuration.

Who is this library for ?

This library is meant to be used in medium to large-scale applications, that have a lot of parameters to configure.

Modular applications especially can greatly benefit from using configue to easily inject new modules.

Installation

Run pip install configue to install from PyPI.

Run pip install . to install from sources.

This project follows the (Semantic Versioning Specification)[https://semver.org/]. All breaking changes are described in the Changelog.

Usage

Basic usage

This library uses PyYAML to parse the YAML files and return the file content.

importconfigueconfig=configue.load("/path/to/yaml/file.yml")

Loading a sub path

If you are not interested in loading the whole file, you can only load a subpath:

# config.ymlsome_key:
some_list:
- first_item
- second_item:
item_key: item_valuenot_loaded_key: not_loaded_value
importconfigueconfig=configue.load("config.yml", "some_key.some_list.1.item_key")
assertconfig=="item_value"

Instantiating classes

Use () in your YAML files to instantiate classes:

# config.yml(): "my_project.MyAwesomeClass"my_argument: "my_value"my_other_argument:
(): "my_project.my_module.MyOtherClass"
importconfiguefrommy_projectimportMyAwesomeClassfrommy_project.my_moduleimportMyOtherClassmy_instance=configue.load("config.yml")
assertisinstance(my_instance, MyAwesomeClass)
assertmy_instance.my_argument=="my_value"assertisinstance(my_instance.my_other_argument, MyOtherClass)

This syntax also works to call functions:

# config.yml(): "my_project.my_function"my_argument: "world"
importconfiguedefmy_function(my_argument: str) ->str:
return"Hello "+my_argumentmy_value=configue.load("config.yml")
assertmy_value=="Hello world"

Loading external variables

# config.ymlmy_argument: !ext my_project.my_module.my_variablemy_argument: !ext my_project.my_module.my_instance.my_attribute

When using the !ext tag, the value will be imported from the corresponding python module.

Loading internal variables

# config.ymlmy_object:
my_instance:
(): my_project.MyClassmy_instance_shortcut: !cfg my_object.my_instancemy_attribute_shortcut: !cfg my_object.my_instance.my_attribute

When using the !cfg tag, the value will be loaded from the same configuration file (useful for a DRY configuration).

Environment variables

If you want to load an environment variable in your YAML config file, you can use this syntax:

# config.ymlmy_key: ${VAR_NAME}

This will resolve as "my_value" if the environment variable VAR_NAME is set to this value.

If you need a default value in case the environment variable is not set:

# config.ymlmy_key: ${VAR_NAME-default}

You can insert this syntax in the middle of a string:

# config.ymlmy_key: prefix${VAR_NAME-default}suffix

This will resolve as "prefixmy_value_suffix" if the value is set, "prefixdefaultsuffix" if it is not.

If your environment variable resolves to a yaml value, it will be cast (unless you are using quotes):

# config.ymlmy_key: ${VAR_NAME}my_quoted_key: "${VAR_NAME}"

This will resolve as True if the value is set to true, yes or y, None if the value is set to ~ or null.

Relative paths

If you want to expand a relative path in your YAML config file:

# config.ymlmy_path: !path my_folder/my_file.txt 

Assuming your file structure looks like this:

root/
├── config.yml
└── my_folder
└── my_file.txt

The path is resolved starting from the folder containing the parent yml file, this example will resolve to /root/my_folder/my_file.txt

Do not start the path with / as it will be treated as an absolute path instead.

You can use environment variables in your file path.

Importing other files

You can import another file directly in your YAML config file:

# config.ymlmy_import: !import my_folder/my_other_config.yml
# my_other_config.ymlsome_key:
- var_1
- var_2

By default, the path is resolved starting from the folder containing the parent yml file, this example will resolve to "my_import": {"some_key": [var_1, var_2]}

If you want to import only a section of the file, use the path in the tag suffix !import:some_key.0

Do not start the import path with / as it will be treated as an absolute path instead.

You can use environment variables in your import path.

Logging configuration

You can load the logging configuration for your application by using the logging_config_path parameter:

# config.ymllogging_config:
version: 1handlers:
console:
class : logging.StreamHandlerstream : ext://sys.stdoutcustom_handler:
\(): my_app.CustomHandlersome_param: some_valuelevel: ERRORroot:
level: INFOhandlers:
- consoleapp_config:
some_key: some_valuenot_loaded_key: not_loaded_value
importloggingimportconfigueapp_config=configue.load("config.yml", "app_config", logging_config_path="logging_config")
assertapp_config== {"some_key": "some_value"}
logger=logging.getLogger(__name__)
logger.info("Hello world!") # Uses the console handler

The logging configuration should follow the format of logging.config.dictConfig (check the documentation for more details). Make sure to escape the constructors with \() instead of () for handlers, formatters and filters.

Testing

Install the development dependencies with pip install -r dev.requirements.txt.

Run python -m unitttest discover to run the tests.

Run pylint configue to check the files linting.

About

A YAML parser with advanced functionalities to ease your application configuration

Topics

Resources

Contributing

Stars

41 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Configue

CIcodecov

A YAML parser with advanced functionalities to ease your application configuration.

Who is this library for ?

This library is meant to be used in medium to large-scale applications, that have a lot of parameters to configure.

Modular applications especially can greatly benefit from using configue to easily inject new modules.

Installation

Run pip install configue to install from PyPI.

Run pip install . to install from sources.

This project follows the (Semantic Versioning Specification)[https://semver.org/]. All breaking changes are described in the Changelog.

Usage

Basic usage

This library uses PyYAML to parse the YAML files and return the file content.

importconfigueconfig=configue.load("/path/to/yaml/file.yml")

Loading a sub path

If you are not interested in loading the whole file, you can only load a subpath:

# config.ymlsome_key:
some_list:
- first_item
- second_item:
item_key: item_valuenot_loaded_key: not_loaded_value
importconfigueconfig=configue.load("config.yml", "some_key.some_list.1.item_key")
assertconfig=="item_value"

Instantiating classes

Use () in your YAML files to instantiate classes:

# config.yml(): "my_project.MyAwesomeClass"my_argument: "my_value"my_other_argument:
(): "my_project.my_module.MyOtherClass"
importconfiguefrommy_projectimportMyAwesomeClassfrommy_project.my_moduleimportMyOtherClassmy_instance=configue.load("config.yml")
assertisinstance(my_instance, MyAwesomeClass)
assertmy_instance.my_argument=="my_value"assertisinstance(my_instance.my_other_argument, MyOtherClass)

This syntax also works to call functions:

# config.yml(): "my_project.my_function"my_argument: "world"
importconfiguedefmy_function(my_argument: str) ->str:
return"Hello "+my_argumentmy_value=configue.load("config.yml")
assertmy_value=="Hello world"

Loading external variables

# config.ymlmy_argument: !ext my_project.my_module.my_variablemy_argument: !ext my_project.my_module.my_instance.my_attribute

When using the !ext tag, the value will be imported from the corresponding python module.

Loading internal variables

# config.ymlmy_object:
my_instance:
(): my_project.MyClassmy_instance_shortcut: !cfg my_object.my_instancemy_attribute_shortcut: !cfg my_object.my_instance.my_attribute

When using the !cfg tag, the value will be loaded from the same configuration file (useful for a DRY configuration).

Environment variables

If you want to load an environment variable in your YAML config file, you can use this syntax:

# config.ymlmy_key: ${VAR_NAME}

This will resolve as "my_value" if the environment variable VAR_NAME is set to this value.

If you need a default value in case the environment variable is not set:

# config.ymlmy_key: ${VAR_NAME-default}

You can insert this syntax in the middle of a string:

# config.ymlmy_key: prefix${VAR_NAME-default}suffix

This will resolve as "prefixmy_value_suffix" if the value is set, "prefixdefaultsuffix" if it is not.

If your environment variable resolves to a yaml value, it will be cast (unless you are using quotes):

# config.ymlmy_key: ${VAR_NAME}my_quoted_key: "${VAR_NAME}"

This will resolve as True if the value is set to true, yes or y, None if the value is set to ~ or null.

Relative paths

If you want to expand a relative path in your YAML config file:

# config.ymlmy_path: !path my_folder/my_file.txt 

Assuming your file structure looks like this:

root/
├── config.yml
└── my_folder
└── my_file.txt

The path is resolved starting from the folder containing the parent yml file, this example will resolve to /root/my_folder/my_file.txt

Do not start the path with / as it will be treated as an absolute path instead.

You can use environment variables in your file path.

Importing other files

You can import another file directly in your YAML config file:

# config.ymlmy_import: !import my_folder/my_other_config.yml
# my_other_config.ymlsome_key:
- var_1
- var_2

By default, the path is resolved starting from the folder containing the parent yml file, this example will resolve to "my_import": {"some_key": [var_1, var_2]}

If you want to import only a section of the file, use the path in the tag suffix !import:some_key.0

Do not start the import path with / as it will be treated as an absolute path instead.

You can use environment variables in your import path.

Logging configuration

You can load the logging configuration for your application by using the logging_config_path parameter:

# config.ymllogging_config:
version: 1handlers:
console:
class : logging.StreamHandlerstream : ext://sys.stdoutcustom_handler:
\(): my_app.CustomHandlersome_param: some_valuelevel: ERRORroot:
level: INFOhandlers:
- consoleapp_config:
some_key: some_valuenot_loaded_key: not_loaded_value
importloggingimportconfigueapp_config=configue.load("config.yml", "app_config", logging_config_path="logging_config")
assertapp_config== {"some_key": "some_value"}
logger=logging.getLogger(__name__)
logger.info("Hello world!") # Uses the console handler

The logging configuration should follow the format of logging.config.dictConfig (check the documentation for more details). Make sure to escape the constructors with \() instead of () for handlers, formatters and filters.

Testing

Install the development dependencies with pip install -r dev.requirements.txt.

Run python -m unitttest discover to run the tests.

Run pylint configue to check the files linting.

About

A YAML parser with advanced functionalities to ease your application configuration

Topics

Resources

Contributing

Stars

41 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Configue

CIcodecov

A YAML parser with advanced functionalities to ease your application configuration.

Who is this library for ?

This library is meant to be used in medium to large-scale applications, that have a lot of parameters to configure.

Modular applications especially can greatly benefit from using configue to easily inject new modules.

Installation

Run pip install configue to install from PyPI.

Run pip install . to install from sources.

This project follows the (Semantic Versioning Specification)[https://semver.org/]. All breaking changes are described in the Changelog.

Usage

Basic usage

This library uses PyYAML to parse the YAML files and return the file content.

importconfigueconfig=configue.load("/path/to/yaml/file.yml")

Loading a sub path

If you are not interested in loading the whole file, you can only load a subpath:

# config.ymlsome_key:
some_list:
- first_item
- second_item:
item_key: item_valuenot_loaded_key: not_loaded_value
importconfigueconfig=configue.load("config.yml", "some_key.some_list.1.item_key")
assertconfig=="item_value"

Instantiating classes

Use () in your YAML files to instantiate classes:

# config.yml(): "my_project.MyAwesomeClass"my_argument: "my_value"my_other_argument:
(): "my_project.my_module.MyOtherClass"
importconfiguefrommy_projectimportMyAwesomeClassfrommy_project.my_moduleimportMyOtherClassmy_instance=configue.load("config.yml")
assertisinstance(my_instance, MyAwesomeClass)
assertmy_instance.my_argument=="my_value"assertisinstance(my_instance.my_other_argument, MyOtherClass)

This syntax also works to call functions:

# config.yml(): "my_project.my_function"my_argument: "world"
importconfiguedefmy_function(my_argument: str) ->str:
return"Hello "+my_argumentmy_value=configue.load("config.yml")
assertmy_value=="Hello world"

Loading external variables

# config.ymlmy_argument: !ext my_project.my_module.my_variablemy_argument: !ext my_project.my_module.my_instance.my_attribute

When using the !ext tag, the value will be imported from the corresponding python module.

Loading internal variables

# config.ymlmy_object:
my_instance:
(): my_project.MyClassmy_instance_shortcut: !cfg my_object.my_instancemy_attribute_shortcut: !cfg my_object.my_instance.my_attribute

When using the !cfg tag, the value will be loaded from the same configuration file (useful for a DRY configuration).

Environment variables

If you want to load an environment variable in your YAML config file, you can use this syntax:

# config.ymlmy_key: ${VAR_NAME}

This will resolve as "my_value" if the environment variable VAR_NAME is set to this value.

If you need a default value in case the environment variable is not set:

# config.ymlmy_key: ${VAR_NAME-default}

You can insert this syntax in the middle of a string:

# config.ymlmy_key: prefix${VAR_NAME-default}suffix

This will resolve as "prefixmy_value_suffix" if the value is set, "prefixdefaultsuffix" if it is not.

If your environment variable resolves to a yaml value, it will be cast (unless you are using quotes):

# config.ymlmy_key: ${VAR_NAME}my_quoted_key: "${VAR_NAME}"

This will resolve as True if the value is set to true, yes or y, None if the value is set to ~ or null.

Relative paths

If you want to expand a relative path in your YAML config file:

# config.ymlmy_path: !path my_folder/my_file.txt 

Assuming your file structure looks like this:

root/
├── config.yml
└── my_folder
└── my_file.txt

The path is resolved starting from the folder containing the parent yml file, this example will resolve to /root/my_folder/my_file.txt

Do not start the path with / as it will be treated as an absolute path instead.

You can use environment variables in your file path.

Importing other files

You can import another file directly in your YAML config file:

# config.ymlmy_import: !import my_folder/my_other_config.yml
# my_other_config.ymlsome_key:
- var_1
- var_2

By default, the path is resolved starting from the folder containing the parent yml file, this example will resolve to "my_import": {"some_key": [var_1, var_2]}

If you want to import only a section of the file, use the path in the tag suffix !import:some_key.0

Do not start the import path with / as it will be treated as an absolute path instead.

You can use environment variables in your import path.

Logging configuration

You can load the logging configuration for your application by using the logging_config_path parameter:

# config.ymllogging_config:
version: 1handlers:
console:
class : logging.StreamHandlerstream : ext://sys.stdoutcustom_handler:
\(): my_app.CustomHandlersome_param: some_valuelevel: ERRORroot:
level: INFOhandlers:
- consoleapp_config:
some_key: some_valuenot_loaded_key: not_loaded_value
importloggingimportconfigueapp_config=configue.load("config.yml", "app_config", logging_config_path="logging_config")
assertapp_config== {"some_key": "some_value"}
logger=logging.getLogger(__name__)
logger.info("Hello world!") # Uses the console handler

The logging configuration should follow the format of logging.config.dictConfig (check the documentation for more details). Make sure to escape the constructors with \() instead of () for handlers, formatters and filters.

Testing

Install the development dependencies with pip install -r dev.requirements.txt.

Run python -m unitttest discover to run the tests.

Run pylint configue to check the files linting.

About

A YAML parser with advanced functionalities to ease your application configuration

Topics

Resources

Contributing

Stars

41 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Configue

CIcodecov

A YAML parser with advanced functionalities to ease your application configuration.

Who is this library for ?

This library is meant to be used in medium to large-scale applications, that have a lot of parameters to configure.

Modular applications especially can greatly benefit from using configue to easily inject new modules.

Installation

Run pip install configue to install from PyPI.

Run pip install . to install from sources.

This project follows the (Semantic Versioning Specification)[https://semver.org/]. All breaking changes are described in the Changelog.

Usage

Basic usage

This library uses PyYAML to parse the YAML files and return the file content.

importconfigueconfig=configue.load("/path/to/yaml/file.yml")

Loading a sub path

If you are not interested in loading the whole file, you can only load a subpath:

# config.ymlsome_key:
some_list:
- first_item
- second_item:
item_key: item_valuenot_loaded_key: not_loaded_value
importconfigueconfig=configue.load("config.yml", "some_key.some_list.1.item_key")
assertconfig=="item_value"

Instantiating classes

Use () in your YAML files to instantiate classes:

# config.yml(): "my_project.MyAwesomeClass"my_argument: "my_value"my_other_argument:
(): "my_project.my_module.MyOtherClass"
importconfiguefrommy_projectimportMyAwesomeClassfrommy_project.my_moduleimportMyOtherClassmy_instance=configue.load("config.yml")
assertisinstance(my_instance, MyAwesomeClass)
assertmy_instance.my_argument=="my_value"assertisinstance(my_instance.my_other_argument, MyOtherClass)

This syntax also works to call functions:

# config.yml(): "my_project.my_function"my_argument: "world"
importconfiguedefmy_function(my_argument: str) ->str:
return"Hello "+my_argumentmy_value=configue.load("config.yml")
assertmy_value=="Hello world"

Loading external variables

# config.ymlmy_argument: !ext my_project.my_module.my_variablemy_argument: !ext my_project.my_module.my_instance.my_attribute

When using the !ext tag, the value will be imported from the corresponding python module.

Loading internal variables

# config.ymlmy_object:
my_instance:
(): my_project.MyClassmy_instance_shortcut: !cfg my_object.my_instancemy_attribute_shortcut: !cfg my_object.my_instance.my_attribute

When using the !cfg tag, the value will be loaded from the same configuration file (useful for a DRY configuration).

Environment variables

If you want to load an environment variable in your YAML config file, you can use this syntax:

# config.ymlmy_key: ${VAR_NAME}

This will resolve as "my_value" if the environment variable VAR_NAME is set to this value.

If you need a default value in case the environment variable is not set:

# config.ymlmy_key: ${VAR_NAME-default}

You can insert this syntax in the middle of a string:

# config.ymlmy_key: prefix${VAR_NAME-default}suffix

This will resolve as "prefixmy_value_suffix" if the value is set, "prefixdefaultsuffix" if it is not.

If your environment variable resolves to a yaml value, it will be cast (unless you are using quotes):

# config.ymlmy_key: ${VAR_NAME}my_quoted_key: "${VAR_NAME}"

This will resolve as True if the value is set to true, yes or y, None if the value is set to ~ or null.

Relative paths

If you want to expand a relative path in your YAML config file:

# config.ymlmy_path: !path my_folder/my_file.txt 

Assuming your file structure looks like this:

root/
├── config.yml
└── my_folder
└── my_file.txt

The path is resolved starting from the folder containing the parent yml file, this example will resolve to /root/my_folder/my_file.txt

Do not start the path with / as it will be treated as an absolute path instead.

You can use environment variables in your file path.

Importing other files

You can import another file directly in your YAML config file:

# config.ymlmy_import: !import my_folder/my_other_config.yml
# my_other_config.ymlsome_key:
- var_1
- var_2

By default, the path is resolved starting from the folder containing the parent yml file, this example will resolve to "my_import": {"some_key": [var_1, var_2]}

If you want to import only a section of the file, use the path in the tag suffix !import:some_key.0

Do not start the import path with / as it will be treated as an absolute path instead.

You can use environment variables in your import path.

Logging configuration

You can load the logging configuration for your application by using the logging_config_path parameter:

# config.ymllogging_config:
version: 1handlers:
console:
class : logging.StreamHandlerstream : ext://sys.stdoutcustom_handler:
\(): my_app.CustomHandlersome_param: some_valuelevel: ERRORroot:
level: INFOhandlers:
- consoleapp_config:
some_key: some_valuenot_loaded_key: not_loaded_value
importloggingimportconfigueapp_config=configue.load("config.yml", "app_config", logging_config_path="logging_config")
assertapp_config== {"some_key": "some_value"}
logger=logging.getLogger(__name__)
logger.info("Hello world!") # Uses the console handler

The logging configuration should follow the format of logging.config.dictConfig (check the documentation for more details). Make sure to escape the constructors with \() instead of () for handlers, formatters and filters.

Testing

Install the development dependencies with pip install -r dev.requirements.txt.

Run python -m unitttest discover to run the tests.

Run pylint configue to check the files linting.

About

A YAML parser with advanced functionalities to ease your application configuration

Topics

Resources

Contributing

Stars

41 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Configue

CIcodecov

A YAML parser with advanced functionalities to ease your application configuration.

Who is this library for ?

This library is meant to be used in medium to large-scale applications, that have a lot of parameters to configure.

Modular applications especially can greatly benefit from using configue to easily inject new modules.

Installation

Run pip install configue to install from PyPI.

Run pip install . to install from sources.

This project follows the (Semantic Versioning Specification)[https://semver.org/]. All breaking changes are described in the Changelog.

Usage

Basic usage

This library uses PyYAML to parse the YAML files and return the file content.

importconfigueconfig=configue.load("/path/to/yaml/file.yml")

Loading a sub path

If you are not interested in loading the whole file, you can only load a subpath:

# config.ymlsome_key:
some_list:
- first_item
- second_item:
item_key: item_valuenot_loaded_key: not_loaded_value
importconfigueconfig=configue.load("config.yml", "some_key.some_list.1.item_key")
assertconfig=="item_value"

Instantiating classes

Use () in your YAML files to instantiate classes:

# config.yml(): "my_project.MyAwesomeClass"my_argument: "my_value"my_other_argument:
(): "my_project.my_module.MyOtherClass"
importconfiguefrommy_projectimportMyAwesomeClassfrommy_project.my_moduleimportMyOtherClassmy_instance=configue.load("config.yml")
assertisinstance(my_instance, MyAwesomeClass)
assertmy_instance.my_argument=="my_value"assertisinstance(my_instance.my_other_argument, MyOtherClass)

This syntax also works to call functions:

# config.yml(): "my_project.my_function"my_argument: "world"
importconfiguedefmy_function(my_argument: str) ->str:
return"Hello "+my_argumentmy_value=configue.load("config.yml")
assertmy_value=="Hello world"

Loading external variables

# config.ymlmy_argument: !ext my_project.my_module.my_variablemy_argument: !ext my_project.my_module.my_instance.my_attribute

When using the !ext tag, the value will be imported from the corresponding python module.

Loading internal variables

# config.ymlmy_object:
my_instance:
(): my_project.MyClassmy_instance_shortcut: !cfg my_object.my_instancemy_attribute_shortcut: !cfg my_object.my_instance.my_attribute

When using the !cfg tag, the value will be loaded from the same configuration file (useful for a DRY configuration).

Environment variables

If you want to load an environment variable in your YAML config file, you can use this syntax:

# config.ymlmy_key: ${VAR_NAME}

This will resolve as "my_value" if the environment variable VAR_NAME is set to this value.

If you need a default value in case the environment variable is not set:

# config.ymlmy_key: ${VAR_NAME-default}

You can insert this syntax in the middle of a string:

# config.ymlmy_key: prefix${VAR_NAME-default}suffix

This will resolve as "prefixmy_value_suffix" if the value is set, "prefixdefaultsuffix" if it is not.

If your environment variable resolves to a yaml value, it will be cast (unless you are using quotes):

# config.ymlmy_key: ${VAR_NAME}my_quoted_key: "${VAR_NAME}"

This will resolve as True if the value is set to true, yes or y, None if the value is set to ~ or null.

Relative paths

If you want to expand a relative path in your YAML config file:

# config.ymlmy_path: !path my_folder/my_file.txt 

Assuming your file structure looks like this:

root/
├── config.yml
└── my_folder
└── my_file.txt

The path is resolved starting from the folder containing the parent yml file, this example will resolve to /root/my_folder/my_file.txt

Do not start the path with / as it will be treated as an absolute path instead.

You can use environment variables in your file path.

Importing other files

You can import another file directly in your YAML config file:

# config.ymlmy_import: !import my_folder/my_other_config.yml
# my_other_config.ymlsome_key:
- var_1
- var_2

By default, the path is resolved starting from the folder containing the parent yml file, this example will resolve to "my_import": {"some_key": [var_1, var_2]}

If you want to import only a section of the file, use the path in the tag suffix !import:some_key.0

Do not start the import path with / as it will be treated as an absolute path instead.

You can use environment variables in your import path.

Logging configuration

You can load the logging configuration for your application by using the logging_config_path parameter:

# config.ymllogging_config:
version: 1handlers:
console:
class : logging.StreamHandlerstream : ext://sys.stdoutcustom_handler:
\(): my_app.CustomHandlersome_param: some_valuelevel: ERRORroot:
level: INFOhandlers:
- consoleapp_config:
some_key: some_valuenot_loaded_key: not_loaded_value
importloggingimportconfigueapp_config=configue.load("config.yml", "app_config", logging_config_path="logging_config")
assertapp_config== {"some_key": "some_value"}
logger=logging.getLogger(__name__)
logger.info("Hello world!") # Uses the console handler

The logging configuration should follow the format of logging.config.dictConfig (check the documentation for more details). Make sure to escape the constructors with \() instead of () for handlers, formatters and filters.

Testing

Install the development dependencies with pip install -r dev.requirements.txt.

Run python -m unitttest discover to run the tests.

Run pylint configue to check the files linting.

About

A YAML parser with advanced functionalities to ease your application configuration

Topics

Resources

Contributing

Stars

41 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Configue

CIcodecov

A YAML parser with advanced functionalities to ease your application configuration.

Who is this library for ?

This library is meant to be used in medium to large-scale applications, that have a lot of parameters to configure.

Modular applications especially can greatly benefit from using configue to easily inject new modules.

Installation

Run pip install configue to install from PyPI.

Run pip install . to install from sources.

This project follows the (Semantic Versioning Specification)[https://semver.org/]. All breaking changes are described in the Changelog.

Usage

Basic usage

This library uses PyYAML to parse the YAML files and return the file content.

importconfigueconfig=configue.load("/path/to/yaml/file.yml")

Loading a sub path

If you are not interested in loading the whole file, you can only load a subpath:

# config.ymlsome_key:
some_list:
- first_item
- second_item:
item_key: item_valuenot_loaded_key: not_loaded_value
importconfigueconfig=configue.load("config.yml", "some_key.some_list.1.item_key")
assertconfig=="item_value"

Instantiating classes

Use () in your YAML files to instantiate classes:

# config.yml(): "my_project.MyAwesomeClass"my_argument: "my_value"my_other_argument:
(): "my_project.my_module.MyOtherClass"
importconfiguefrommy_projectimportMyAwesomeClassfrommy_project.my_moduleimportMyOtherClassmy_instance=configue.load("config.yml")
assertisinstance(my_instance, MyAwesomeClass)
assertmy_instance.my_argument=="my_value"assertisinstance(my_instance.my_other_argument, MyOtherClass)

This syntax also works to call functions:

# config.yml(): "my_project.my_function"my_argument: "world"
importconfiguedefmy_function(my_argument: str) ->str:
return"Hello "+my_argumentmy_value=configue.load("config.yml")
assertmy_value=="Hello world"

Loading external variables

# config.ymlmy_argument: !ext my_project.my_module.my_variablemy_argument: !ext my_project.my_module.my_instance.my_attribute

When using the !ext tag, the value will be imported from the corresponding python module.

Loading internal variables

# config.ymlmy_object:
my_instance:
(): my_project.MyClassmy_instance_shortcut: !cfg my_object.my_instancemy_attribute_shortcut: !cfg my_object.my_instance.my_attribute

When using the !cfg tag, the value will be loaded from the same configuration file (useful for a DRY configuration).

Environment variables

If you want to load an environment variable in your YAML config file, you can use this syntax:

# config.ymlmy_key: ${VAR_NAME}

This will resolve as "my_value" if the environment variable VAR_NAME is set to this value.

If you need a default value in case the environment variable is not set:

# config.ymlmy_key: ${VAR_NAME-default}

You can insert this syntax in the middle of a string:

# config.ymlmy_key: prefix${VAR_NAME-default}suffix

This will resolve as "prefixmy_value_suffix" if the value is set, "prefixdefaultsuffix" if it is not.

If your environment variable resolves to a yaml value, it will be cast (unless you are using quotes):

# config.ymlmy_key: ${VAR_NAME}my_quoted_key: "${VAR_NAME}"

This will resolve as True if the value is set to true, yes or y, None if the value is set to ~ or null.

Relative paths

If you want to expand a relative path in your YAML config file:

# config.ymlmy_path: !path my_folder/my_file.txt 

Assuming your file structure looks like this:

root/
├── config.yml
└── my_folder
└── my_file.txt

The path is resolved starting from the folder containing the parent yml file, this example will resolve to /root/my_folder/my_file.txt

Do not start the path with / as it will be treated as an absolute path instead.

You can use environment variables in your file path.

Importing other files

You can import another file directly in your YAML config file:

# config.ymlmy_import: !import my_folder/my_other_config.yml
# my_other_config.ymlsome_key:
- var_1
- var_2

By default, the path is resolved starting from the folder containing the parent yml file, this example will resolve to "my_import": {"some_key": [var_1, var_2]}

If you want to import only a section of the file, use the path in the tag suffix !import:some_key.0

Do not start the import path with / as it will be treated as an absolute path instead.

You can use environment variables in your import path.

Logging configuration

You can load the logging configuration for your application by using the logging_config_path parameter:

# config.ymllogging_config:
version: 1handlers:
console:
class : logging.StreamHandlerstream : ext://sys.stdoutcustom_handler:
\(): my_app.CustomHandlersome_param: some_valuelevel: ERRORroot:
level: INFOhandlers:
- consoleapp_config:
some_key: some_valuenot_loaded_key: not_loaded_value
importloggingimportconfigueapp_config=configue.load("config.yml", "app_config", logging_config_path="logging_config")
assertapp_config== {"some_key": "some_value"}
logger=logging.getLogger(__name__)
logger.info("Hello world!") # Uses the console handler

The logging configuration should follow the format of logging.config.dictConfig (check the documentation for more details). Make sure to escape the constructors with \() instead of () for handlers, formatters and filters.

Testing

Install the development dependencies with pip install -r dev.requirements.txt.

Run python -m unitttest discover to run the tests.

Run pylint configue to check the files linting.

About

A YAML parser with advanced functionalities to ease your application configuration

Topics

Resources

Contributing

Stars

41 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages